summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2022-12-26 03:03:16 +0000
committerNorbert Preining <norbert@preining.info>2022-12-26 03:03:16 +0000
commit200df2fd74322d3c7b4bb2a69e711a40265ead1b (patch)
tree9a545919fa0f041b8bac6341e8afb7b7b555ff8e
parent90ef58ebc56f69220f860d466e1e21ed68ce9a55 (diff)
CTAN sync 202212260303
-rw-r--r--FILES.byname329
-rw-r--r--FILES.byname.gzbin2488892 -> 2489003 bytes
-rw-r--r--FILES.last07days236
-rw-r--r--biblio/citation-style-language/CHANGELOG.md23
-rw-r--r--biblio/citation-style-language/citation-style-language-doc.pdfbin227617 -> 228973 bytes
-rw-r--r--biblio/citation-style-language/citation-style-language-doc.tex65
-rw-r--r--biblio/citation-style-language/citation-style-language.sty354
-rw-r--r--biblio/citation-style-language/citeproc-bibtex-data.lua1552
-rw-r--r--biblio/citation-style-language/citeproc-cli.lua8
-rw-r--r--biblio/citation-style-language/citeproc-context.lua2
-rw-r--r--biblio/citation-style-language/citeproc-element.lua31
-rw-r--r--biblio/citation-style-language/citeproc-engine.lua1385
-rw-r--r--biblio/citation-style-language/citeproc-ir-node.lua29
-rw-r--r--biblio/citation-style-language/citeproc-latex-core.lua66
-rw-r--r--biblio/citation-style-language/citeproc-latex-parser.lua259
-rw-r--r--biblio/citation-style-language/citeproc-latex.lua7
-rw-r--r--biblio/citation-style-language/citeproc-node-bibliography.lua307
-rw-r--r--biblio/citation-style-language/citeproc-node-citation.lua1417
-rw-r--r--biblio/citation-style-language/citeproc-node-date.lua6
-rw-r--r--biblio/citation-style-language/citeproc-node-label.lua4
-rw-r--r--biblio/citation-style-language/citeproc-node-locale.lua4
-rw-r--r--biblio/citation-style-language/citeproc-node-names.lua14
-rw-r--r--biblio/citation-style-language/citeproc-node-style.lua365
-rw-r--r--biblio/citation-style-language/citeproc-node-text.lua25
-rw-r--r--biblio/citation-style-language/citeproc-nodes.lua8
-rw-r--r--biblio/citation-style-language/citeproc-output.lua224
-rw-r--r--biblio/citation-style-language/citeproc-util.lua53
-rw-r--r--biblio/citation-style-language/citeproc.lua2
-rw-r--r--biblio/ctan-bibdata/ctan.bib27
-rw-r--r--biblio/ctan-bibdata/ctan.pdfbin3630316 -> 3632951 bytes
-rw-r--r--fonts/cabin/README2
-rw-r--r--fonts/cabin/doc/cabin-samples.pdfbin227226 -> 227228 bytes
-rw-r--r--fonts/cabin/latex/cabin.sty20
-rw-r--r--graphics/pgf/contrib/tikz-mirror-lens/README.md42
-rw-r--r--graphics/pgf/contrib/tikz-mirror-lens/doc/tikz-mirror-lens-PT.pdfbin0 -> 1374037 bytes
-rw-r--r--graphics/pgf/contrib/tikz-mirror-lens/doc/tikz-mirror-lens-PT.tex581
-rw-r--r--graphics/pgf/contrib/tikz-mirror-lens/doc/tikz-mirror-lens.pdfbin0 -> 1361649 bytes
-rw-r--r--graphics/pgf/contrib/tikz-mirror-lens/doc/tikz-mirror-lens.tex570
-rw-r--r--graphics/pgf/contrib/tikz-mirror-lens/tex/tikz-mirror-lens.cwl34
-rw-r--r--graphics/pgf/contrib/tikz-mirror-lens/tex/tikz-mirror-lens.sty524
-rw-r--r--info/biblio/typeset.bib55
-rw-r--r--info/biblio/typeset.ltx12
-rw-r--r--macros/latex/contrib/frenchmath/README.md2
-rw-r--r--macros/latex/contrib/frenchmath/frenchmath.dtx401
-rw-r--r--macros/latex/contrib/frenchmath/frenchmath.ins2
-rw-r--r--macros/latex/contrib/frenchmath/frenchmath.pdfbin243227 -> 261083 bytes
-rw-r--r--macros/latex/contrib/mismath/mismath.dtx353
-rw-r--r--macros/latex/contrib/mismath/mismath.pdfbin247979 -> 257797 bytes
-rw-r--r--support/TeX4ht/source/ChangeLog10
-rw-r--r--support/TeX4ht/source/tex4ht-4ht.tex16
-rw-r--r--support/TeX4ht/source/tex4ht-html4.tex4
-rw-r--r--systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl1
-rw-r--r--systems/texlive/tlnet/tlpkg/texlive.tlpdb127
-rw-r--r--systems/texlive/tlnet/tlpkg/texlive.tlpdb.md52
-rw-r--r--systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha5122
-rw-r--r--systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc14
-rw-r--r--systems/texlive/tlnet/tlpkg/texlive.tlpdb.xzbin2439292 -> 2439740 bytes
-rw-r--r--timestamp2
58 files changed, 7122 insertions, 2456 deletions
diff --git a/FILES.byname b/FILES.byname
index d23941d012..ad21cde438 100644
--- a/FILES.byname
+++ b/FILES.byname
@@ -1933,114 +1933,117 @@
1995/06/20 | 49681 | biblio/bibtex/vms/bibtex.vms-changes
1995/04/14 | 620 | biblio/bibtex/vms/link_bibtex.com
1995/04/14 | 1316 | biblio/bibtex/vms/make_bibtex.com
-2022/09/23 | 10019 | biblio/citation-style-language/american-chemical-society.csl
-2022/09/23 | 11034 | biblio/citation-style-language/american-medical-association.csl
-2022/09/23 | 8052 | biblio/citation-style-language/american-political-science-association.csl
-2022/09/23 | 11060 | biblio/citation-style-language/american-sociological-association.csl
-2022/09/23 | 69907 | biblio/citation-style-language/apa.csl
-2022/09/23 | 2781 | biblio/citation-style-language/CHANGELOG.md
-2022/09/23 | 23079 | biblio/citation-style-language/chicago-author-date.csl
-2022/09/23 | 47520 | biblio/citation-style-language/chicago-fullnote-bibliography.csl
-2022/09/23 | 45970 | biblio/citation-style-language/chicago-note-bibliography.csl
-2022/09/23 | 227617 | biblio/citation-style-language/citation-style-language-doc.pdf
-2022/09/23 | 14556 | biblio/citation-style-language/citation-style-language-doc.tex
-2022/09/23 | 32558 | biblio/citation-style-language/citation-style-language.sty
-2022/09/23 | 46907 | biblio/citation-style-language/citeproc-bibtex-data.lua
-2022/09/23 | 21225 | biblio/citation-style-language/citeproc-bibtex.lua
-2022/09/23 | 5029 | biblio/citation-style-language/citeproc-cli.lua
-2022/09/23 | 8425 | biblio/citation-style-language/citeproc-context.lua
-2022/09/23 | 14833 | biblio/citation-style-language/citeproc-element.lua
-2022/09/23 | 61818 | biblio/citation-style-language/citeproc-engine.lua
-2022/09/23 | 2993 | biblio/citation-style-language/citeproc-ir-node.lua
-2022/09/23 | 8123 | biblio/citation-style-language/citeproc-latex-core.lua
-2022/09/23 | 3980 | biblio/citation-style-language/citeproc-latex.lua
-2022/09/23 | 344 | biblio/citation-style-language/citeproc.lua
-2022/09/23 | 617 | biblio/citation-style-language/citeproc-lua.1
-2022/09/23 | 240 | biblio/citation-style-language/citeproc-lua.lua
-2022/09/23 | 7308 | biblio/citation-style-language/citeproc-node-choose.lua
-2022/09/23 | 13585 | biblio/citation-style-language/citeproc-node-date.lua
-2022/09/23 | 904 | biblio/citation-style-language/citeproc-node-group.lua
-2022/09/23 | 2655 | biblio/citation-style-language/citeproc-node-label.lua
-2022/09/23 | 1702 | biblio/citation-style-language/citeproc-node-layout.lua
-2022/09/23 | 6100 | biblio/citation-style-language/citeproc-node-locale.lua
-2022/09/23 | 33702 | biblio/citation-style-language/citeproc-node-names.lua
-2022/09/23 | 1675 | biblio/citation-style-language/citeproc-node-number.lua
-2022/09/23 | 1476 | biblio/citation-style-language/citeproc-nodes.lua
-2022/09/23 | 6283 | biblio/citation-style-language/citeproc-node-sort.lua
-2022/09/23 | 15617 | biblio/citation-style-language/citeproc-node-style.lua
-2022/09/23 | 5498 | biblio/citation-style-language/citeproc-node-text.lua
-2022/09/23 | 44606 | biblio/citation-style-language/citeproc-output.lua
-2022/09/23 | 21990 | biblio/citation-style-language/citeproc-util.lua
-2022/09/23 | 21433 | biblio/citation-style-language/csl-locales-af-ZA.xml
-2022/09/23 | 19817 | biblio/citation-style-language/csl-locales-ar.xml
-2022/09/23 | 24466 | biblio/citation-style-language/csl-locales-bg-BG.xml
-2022/09/23 | 21302 | biblio/citation-style-language/csl-locales-ca-AD.xml
-2022/09/23 | 21579 | biblio/citation-style-language/csl-locales-cs-CZ.xml
-2022/09/23 | 21576 | biblio/citation-style-language/csl-locales-cy-GB.xml
-2022/09/23 | 21470 | biblio/citation-style-language/csl-locales-da-DK.xml
-2022/09/23 | 22218 | biblio/citation-style-language/csl-locales-de-AT.xml
-2022/09/23 | 21681 | biblio/citation-style-language/csl-locales-de-CH.xml
-2022/09/23 | 22143 | biblio/citation-style-language/csl-locales-de-DE.xml
-2022/09/23 | 23024 | biblio/citation-style-language/csl-locales-el-GR.xml
-2022/09/23 | 22472 | biblio/citation-style-language/csl-locales-en-GB.xml
-2022/09/23 | 22627 | biblio/citation-style-language/csl-locales-en-US.xml
-2022/09/23 | 21406 | biblio/citation-style-language/csl-locales-es-CL.xml
-2022/09/23 | 21327 | biblio/citation-style-language/csl-locales-es-ES.xml
-2022/09/23 | 22434 | biblio/citation-style-language/csl-locales-es-MX.xml
-2022/09/23 | 21261 | biblio/citation-style-language/csl-locales-et-EE.xml
-2022/09/23 | 21512 | biblio/citation-style-language/csl-locales-eu.xml
-2022/09/23 | 22337 | biblio/citation-style-language/csl-locales-fa-IR.xml
-2022/09/23 | 21623 | biblio/citation-style-language/csl-locales-fi-FI.xml
-2022/09/23 | 22098 | biblio/citation-style-language/csl-locales-fr-CA.xml
-2022/09/23 | 22356 | biblio/citation-style-language/csl-locales-fr-FR.xml
-2022/09/23 | 21822 | biblio/citation-style-language/csl-locales-he-IL.xml
-2022/09/23 | 24345 | biblio/citation-style-language/csl-locales-hi-IN.xml
-2022/09/23 | 21363 | biblio/citation-style-language/csl-locales-hr-HR.xml
-2022/09/23 | 21466 | biblio/citation-style-language/csl-locales-hu-HU.xml
-2022/09/23 | 21654 | biblio/citation-style-language/csl-locales-id-ID.xml
-2022/09/23 | 21469 | biblio/citation-style-language/csl-locales-is-IS.xml
-2022/09/23 | 23360 | biblio/citation-style-language/csl-locales-it-IT.xml
-2022/09/23 | 21482 | biblio/citation-style-language/csl-locales-ja-JP.xml
-2022/09/23 | 21966 | biblio/citation-style-language/csl-locales-km-KH.xml
-2022/09/23 | 21414 | biblio/citation-style-language/csl-locales-ko-KR.xml
-2022/09/23 | 21302 | biblio/citation-style-language/csl-locales-la.xml
-2022/09/23 | 22752 | biblio/citation-style-language/csl-locales-lt-LT.xml
-2022/09/23 | 23553 | biblio/citation-style-language/csl-locales-lv-LV.xml
-2022/09/23 | 21941 | biblio/citation-style-language/csl-locales-mn-MN.xml
-2022/09/23 | 21323 | biblio/citation-style-language/csl-locales-nb-NO.xml
-2022/09/23 | 22358 | biblio/citation-style-language/csl-locales-nl-NL.xml
-2022/09/23 | 21301 | biblio/citation-style-language/csl-locales-nn-NO.xml
-2022/09/23 | 21446 | biblio/citation-style-language/csl-locales-pl-PL.xml
-2022/09/23 | 22542 | biblio/citation-style-language/csl-locales-pt-BR.xml
-2022/09/23 | 22454 | biblio/citation-style-language/csl-locales-pt-PT.xml
-2022/09/23 | 21462 | biblio/citation-style-language/csl-locales-ro-RO.xml
-2022/09/23 | 25715 | biblio/citation-style-language/csl-locales-ru-RU.xml
-2022/09/23 | 21574 | biblio/citation-style-language/csl-locales-sk-SK.xml
-2022/09/23 | 21330 | biblio/citation-style-language/csl-locales-sl-SI.xml
-2022/09/23 | 22122 | biblio/citation-style-language/csl-locales-sr-RS.xml
-2022/09/23 | 21715 | biblio/citation-style-language/csl-locales-sv-SE.xml
-2022/09/23 | 23467 | biblio/citation-style-language/csl-locales-th-TH.xml
-2022/09/23 | 21635 | biblio/citation-style-language/csl-locales-tr-TR.xml
-2022/09/23 | 20747 | biblio/citation-style-language/csl-locales-uk-UA.xml
-2022/09/23 | 21812 | biblio/citation-style-language/csl-locales-vi-VN.xml
-2022/09/23 | 19056 | biblio/citation-style-language/csl-locales-zh-CN.xml
-2022/09/23 | 19423 | biblio/citation-style-language/csl-locales-zh-TW.xml
-2022/09/23 | 231 | biblio/citation-style-language/DEPENDS.txt
-2022/09/23 | 8128 | biblio/citation-style-language/elsevier-harvard.csl
-2022/09/23 | 10723 | biblio/citation-style-language/harvard-cite-them-right.csl
-2022/09/23 | 15413 | biblio/citation-style-language/ieee.csl
-2022/09/23 | 16054 | biblio/citation-style-language/modern-humanities-research-association.csl
-2022/09/23 | 11209 | biblio/citation-style-language/modern-language-association.csl
-2022/09/23 | 5288 | biblio/citation-style-language/nature.csl
-2022/09/23 | 1673 | biblio/citation-style-language/README.md
-2022/09/23 | 11958 | biblio/citation-style-language/vancouver.csl
-2022/09/23 | 591448 | biblio/citation-style-language.zip
-2022/12/24 | 1678 | biblio/ctan-bibdata/biblatex-ctan/ctan.bbx
+2022/12/25 | 10019 | biblio/citation-style-language/american-chemical-society.csl
+2022/12/25 | 11034 | biblio/citation-style-language/american-medical-association.csl
+2022/12/25 | 8052 | biblio/citation-style-language/american-political-science-association.csl
+2022/12/25 | 11060 | biblio/citation-style-language/american-sociological-association.csl
+2022/12/25 | 69907 | biblio/citation-style-language/apa.csl
+2022/12/25 | 3855 | biblio/citation-style-language/CHANGELOG.md
+2022/12/25 | 23079 | biblio/citation-style-language/chicago-author-date.csl
+2022/12/25 | 47520 | biblio/citation-style-language/chicago-fullnote-bibliography.csl
+2022/12/25 | 45970 | biblio/citation-style-language/chicago-note-bibliography.csl
+2022/12/25 | 228973 | biblio/citation-style-language/citation-style-language-doc.pdf
+2022/12/25 | 15691 | biblio/citation-style-language/citation-style-language-doc.tex
+2022/12/25 | 37016 | biblio/citation-style-language/citation-style-language.sty
+2022/12/25 | 72823 | biblio/citation-style-language/citeproc-bibtex-data.lua
+2022/12/25 | 21225 | biblio/citation-style-language/citeproc-bibtex.lua
+2022/12/25 | 5144 | biblio/citation-style-language/citeproc-cli.lua
+2022/12/25 | 8428 | biblio/citation-style-language/citeproc-context.lua
+2022/12/25 | 15895 | biblio/citation-style-language/citeproc-element.lua
+2022/12/25 | 26012 | biblio/citation-style-language/citeproc-engine.lua
+2022/12/25 | 3694 | biblio/citation-style-language/citeproc-ir-node.lua
+2022/12/25 | 8995 | biblio/citation-style-language/citeproc-latex-core.lua
+2022/12/25 | 4061 | biblio/citation-style-language/citeproc-latex.lua
+2022/12/25 | 7846 | biblio/citation-style-language/citeproc-latex-parser.lua
+2022/12/25 | 344 | biblio/citation-style-language/citeproc.lua
+2022/12/25 | 617 | biblio/citation-style-language/citeproc-lua.1
+2022/12/25 | 240 | biblio/citation-style-language/citeproc-lua.lua
+2022/12/25 | 10117 | biblio/citation-style-language/citeproc-node-bibliography.lua
+2022/12/25 | 7308 | biblio/citation-style-language/citeproc-node-choose.lua
+2022/12/25 | 45284 | biblio/citation-style-language/citeproc-node-citation.lua
+2022/12/25 | 13594 | biblio/citation-style-language/citeproc-node-date.lua
+2022/12/25 | 904 | biblio/citation-style-language/citeproc-node-group.lua
+2022/12/25 | 2766 | biblio/citation-style-language/citeproc-node-label.lua
+2022/12/25 | 1702 | biblio/citation-style-language/citeproc-node-layout.lua
+2022/12/25 | 6123 | biblio/citation-style-language/citeproc-node-locale.lua
+2022/12/25 | 33819 | biblio/citation-style-language/citeproc-node-names.lua
+2022/12/25 | 1675 | biblio/citation-style-language/citeproc-node-number.lua
+2022/12/25 | 1688 | biblio/citation-style-language/citeproc-nodes.lua
+2022/12/25 | 6283 | biblio/citation-style-language/citeproc-node-sort.lua
+2022/12/25 | 4760 | biblio/citation-style-language/citeproc-node-style.lua
+2022/12/25 | 5684 | biblio/citation-style-language/citeproc-node-text.lua
+2022/12/25 | 50109 | biblio/citation-style-language/citeproc-output.lua
+2022/12/25 | 22353 | biblio/citation-style-language/citeproc-util.lua
+2022/12/25 | 21433 | biblio/citation-style-language/csl-locales-af-ZA.xml
+2022/12/25 | 19817 | biblio/citation-style-language/csl-locales-ar.xml
+2022/12/25 | 24466 | biblio/citation-style-language/csl-locales-bg-BG.xml
+2022/12/25 | 21302 | biblio/citation-style-language/csl-locales-ca-AD.xml
+2022/12/25 | 21579 | biblio/citation-style-language/csl-locales-cs-CZ.xml
+2022/12/25 | 21576 | biblio/citation-style-language/csl-locales-cy-GB.xml
+2022/12/25 | 21470 | biblio/citation-style-language/csl-locales-da-DK.xml
+2022/12/25 | 22218 | biblio/citation-style-language/csl-locales-de-AT.xml
+2022/12/25 | 21681 | biblio/citation-style-language/csl-locales-de-CH.xml
+2022/12/25 | 22143 | biblio/citation-style-language/csl-locales-de-DE.xml
+2022/12/25 | 23024 | biblio/citation-style-language/csl-locales-el-GR.xml
+2022/12/25 | 22472 | biblio/citation-style-language/csl-locales-en-GB.xml
+2022/12/25 | 22627 | biblio/citation-style-language/csl-locales-en-US.xml
+2022/12/25 | 21406 | biblio/citation-style-language/csl-locales-es-CL.xml
+2022/12/25 | 21327 | biblio/citation-style-language/csl-locales-es-ES.xml
+2022/12/25 | 22434 | biblio/citation-style-language/csl-locales-es-MX.xml
+2022/12/25 | 21261 | biblio/citation-style-language/csl-locales-et-EE.xml
+2022/12/25 | 21512 | biblio/citation-style-language/csl-locales-eu.xml
+2022/12/25 | 22337 | biblio/citation-style-language/csl-locales-fa-IR.xml
+2022/12/25 | 21623 | biblio/citation-style-language/csl-locales-fi-FI.xml
+2022/12/25 | 22098 | biblio/citation-style-language/csl-locales-fr-CA.xml
+2022/12/25 | 22356 | biblio/citation-style-language/csl-locales-fr-FR.xml
+2022/12/25 | 21822 | biblio/citation-style-language/csl-locales-he-IL.xml
+2022/12/25 | 24345 | biblio/citation-style-language/csl-locales-hi-IN.xml
+2022/12/25 | 21363 | biblio/citation-style-language/csl-locales-hr-HR.xml
+2022/12/25 | 21466 | biblio/citation-style-language/csl-locales-hu-HU.xml
+2022/12/25 | 21654 | biblio/citation-style-language/csl-locales-id-ID.xml
+2022/12/25 | 21469 | biblio/citation-style-language/csl-locales-is-IS.xml
+2022/12/25 | 23360 | biblio/citation-style-language/csl-locales-it-IT.xml
+2022/12/25 | 21482 | biblio/citation-style-language/csl-locales-ja-JP.xml
+2022/12/25 | 21966 | biblio/citation-style-language/csl-locales-km-KH.xml
+2022/12/25 | 21414 | biblio/citation-style-language/csl-locales-ko-KR.xml
+2022/12/25 | 21302 | biblio/citation-style-language/csl-locales-la.xml
+2022/12/25 | 22752 | biblio/citation-style-language/csl-locales-lt-LT.xml
+2022/12/25 | 23553 | biblio/citation-style-language/csl-locales-lv-LV.xml
+2022/12/25 | 21941 | biblio/citation-style-language/csl-locales-mn-MN.xml
+2022/12/25 | 21323 | biblio/citation-style-language/csl-locales-nb-NO.xml
+2022/12/25 | 22358 | biblio/citation-style-language/csl-locales-nl-NL.xml
+2022/12/25 | 21301 | biblio/citation-style-language/csl-locales-nn-NO.xml
+2022/12/25 | 21446 | biblio/citation-style-language/csl-locales-pl-PL.xml
+2022/12/25 | 22542 | biblio/citation-style-language/csl-locales-pt-BR.xml
+2022/12/25 | 22454 | biblio/citation-style-language/csl-locales-pt-PT.xml
+2022/12/25 | 21462 | biblio/citation-style-language/csl-locales-ro-RO.xml
+2022/12/25 | 25715 | biblio/citation-style-language/csl-locales-ru-RU.xml
+2022/12/25 | 21574 | biblio/citation-style-language/csl-locales-sk-SK.xml
+2022/12/25 | 21330 | biblio/citation-style-language/csl-locales-sl-SI.xml
+2022/12/25 | 22122 | biblio/citation-style-language/csl-locales-sr-RS.xml
+2022/12/25 | 21715 | biblio/citation-style-language/csl-locales-sv-SE.xml
+2022/12/25 | 23467 | biblio/citation-style-language/csl-locales-th-TH.xml
+2022/12/25 | 21635 | biblio/citation-style-language/csl-locales-tr-TR.xml
+2022/12/25 | 20747 | biblio/citation-style-language/csl-locales-uk-UA.xml
+2022/12/25 | 21812 | biblio/citation-style-language/csl-locales-vi-VN.xml
+2022/12/25 | 19056 | biblio/citation-style-language/csl-locales-zh-CN.xml
+2022/12/25 | 19423 | biblio/citation-style-language/csl-locales-zh-TW.xml
+2022/12/25 | 231 | biblio/citation-style-language/DEPENDS.txt
+2022/12/25 | 8128 | biblio/citation-style-language/elsevier-harvard.csl
+2022/12/25 | 10723 | biblio/citation-style-language/harvard-cite-them-right.csl
+2022/12/25 | 15413 | biblio/citation-style-language/ieee.csl
+2022/12/25 | 16054 | biblio/citation-style-language/modern-humanities-research-association.csl
+2022/12/25 | 11209 | biblio/citation-style-language/modern-language-association.csl
+2022/12/25 | 5288 | biblio/citation-style-language/nature.csl
+2022/12/25 | 1673 | biblio/citation-style-language/README.md
+2022/12/25 | 11958 | biblio/citation-style-language/vancouver.csl
+2022/12/25 | 604004 | biblio/citation-style-language.zip
+2022/12/25 | 1678 | biblio/ctan-bibdata/biblatex-ctan/ctan.bbx
2022/10/08 | 127 | biblio/ctan-bibdata/biblatex-ctan/ctan.cbx
-2022/12/24 | 2752404 | biblio/ctan-bibdata/ctan.bib
-2022/12/24 | 3632513 | biblio/ctan-bibdata/ctan.pdf
+2022/12/25 | 2752774 | biblio/ctan-bibdata/ctan.bib
+2022/12/25 | 3630316 | biblio/ctan-bibdata/ctan.pdf
2022/10/08 | 1415 | biblio/ctan-bibdata/README
-2022/12/24 | 4025166 | biblio/ctan-bibdata.zip
+2022/12/25 | 4023122 | biblio/ctan-bibdata.zip
2022/02/06 | 3110 | biblio/pbibtex/pbibtex-base/cpp.awk
2022/02/06 | 1009 | biblio/pbibtex/pbibtex-base/generate.sh
2022/02/06 | 22422 | biblio/pbibtex/pbibtex-base/jabbrv.bst
@@ -5414,7 +5417,7 @@
1990/10/02 | 5440 | dviware/vutex/vaxvms.hlp
1990/10/02 | 812 | dviware/vutex/vaxvms.ins
1990/10/02 | 127576 | dviware/vutex/vutex.web
-2022/12/24 | 48435 | FILES.last07days
+2022/12/25 | 41406 | FILES.last07days
2021/07/24 | 1139410 | fonts/aboensis/Aboensis.glyphs
2021/07/24 | 18907382 | fonts/aboensis/aboensis.pdf
2021/07/24 | 137860 | fonts/aboensis/Aboensis-Regular.otf
@@ -16128,12 +16131,12 @@
2005/08/16 | 180 | fonts/byzfonts/XAP_xpo/x067_MEC.mf
2005/10/01 | 586314 | fonts/byzfonts.zip
2020/07/22 | 371 | fonts/cabin/doc/AUTHORS.txt
-2022/01/08 | 227226 | fonts/cabin/doc/cabin-samples.pdf
+2022/12/24 | 227228 | fonts/cabin/doc/cabin-samples.pdf
2022/01/08 | 827 | fonts/cabin/doc/cabin-samples.tex
2020/07/22 | 669 | fonts/cabin/doc/CONTRIBUTORS.txt
2020/07/22 | 843 | fonts/cabin/doc/DESCRIPTION.en_us.html
2020/07/22 | 2332 | fonts/cabin/doc/FONTLOG.txt
-2020/07/22 | 4384 | fonts/cabin/doc/OFL.txt
+2022/09/15 | 4384 | fonts/cabin/doc/OFL.txt
2020/07/22 | 66 | fonts/cabin/doc/requirements.txt
2020/07/22 | 87 | fonts/cabin/doc/TRADEMARKS.md
2020/07/15 | 2786 | fonts/cabin/enc/cbn_5xld5w.enc
@@ -16147,7 +16150,7 @@
2020/07/15 | 2858 | fonts/cabin/enc/cbn_vqpkf5.enc
2020/07/15 | 2988 | fonts/cabin/enc/cbn_yhiurv.enc
2020/07/15 | 3159 | fonts/cabin/enc/cbn_yhzmyq.enc
-2022/09/13 | 4045 | fonts/cabin/latex/cabin.sty
+2022/12/25 | 4052 | fonts/cabin/latex/cabin.sty
2020/07/15 | 5439 | fonts/cabin/latex/LY1Cabin-Sup.fd
2020/07/15 | 7685 | fonts/cabin/latex/LY1Cabin-TLF.fd
2020/07/15 | 5439 | fonts/cabin/latex/OT1Cabin-Sup.fd
@@ -16172,7 +16175,7 @@
2020/07/15 | 102744 | fonts/cabin/opentype/Cabin-Regular.otf
2020/07/15 | 102712 | fonts/cabin/opentype/Cabin-SemiBoldItalic.otf
2020/07/15 | 105928 | fonts/cabin/opentype/Cabin-SemiBold.otf
-2022/09/13 | 2314 | fonts/cabin/README
+2022/12/25 | 2314 | fonts/cabin/README
2020/07/15 | 1996 | fonts/cabin/tfm/Cabin-BoldItalic-sup-ly1--base.tfm
2020/07/15 | 2000 | fonts/cabin/tfm/Cabin-BoldItalic-sup-ly1.tfm
2020/07/15 | 1464 | fonts/cabin/tfm/Cabin-BoldItalic-sup-ot1.tfm
@@ -16533,7 +16536,7 @@
2020/07/15 | 1696 | fonts/cabin/vf/Cabin-SemiBold-tlf-sc-t1.vf
2020/07/15 | 1692 | fonts/cabin/vf/Cabin-SemiBold-tlf-t1.vf
2020/07/15 | 544 | fonts/cabin/vf/Cabin-SemiBold-tlf-ts1.vf
-2022/09/13 | 4223357 | fonts/cabin.zip
+2022/12/25 | 4223364 | fonts/cabin.zip
2017/06/10 | 83294 | fonts/caladea/doc/Caladea-Regular.pdf
2017/06/10 | 11358 | fonts/caladea/doc/LICENSE-2.0
2017/06/10 | 21046 | fonts/caladea/doc/samples.pdf
@@ -160612,6 +160615,14 @@
2018/11/08 | 11641 | graphics/pgf/contrib/tikzmarmots/tikzmarmots-doc.tex
2018/11/09 | 6585 | graphics/pgf/contrib/tikzmarmots/tikzmarmots.sty
2018/11/09 | 232999 | graphics/pgf/contrib/tikzmarmots.zip
+2022/12/24 | 1361649 | graphics/pgf/contrib/tikz-mirror-lens/doc/tikz-mirror-lens.pdf
+2022/12/24 | 1374037 | graphics/pgf/contrib/tikz-mirror-lens/doc/tikz-mirror-lens-PT.pdf
+2022/12/24 | 24239 | graphics/pgf/contrib/tikz-mirror-lens/doc/tikz-mirror-lens-PT.tex
+2022/12/24 | 23476 | graphics/pgf/contrib/tikz-mirror-lens/doc/tikz-mirror-lens.tex
+2022/12/24 | 1759 | graphics/pgf/contrib/tikz-mirror-lens/README.md
+2022/12/24 | 1279 | graphics/pgf/contrib/tikz-mirror-lens/tex/tikz-mirror-lens.cwl
+2022/12/24 | 16589 | graphics/pgf/contrib/tikz-mirror-lens/tex/tikz-mirror-lens.sty
+2022/12/25 | 2052188 | graphics/pgf/contrib/tikz-mirror-lens.zip
2017/04/19 | 463 | graphics/pgf/contrib/tikz-nef/example-net.tex
2017/04/19 | 1068 | graphics/pgf/contrib/tikz-nef/LICENSE
2017/04/19 | 740 | graphics/pgf/contrib/tikz-nef/nef.bib
@@ -166869,8 +166880,8 @@
2022/10/24 | 3582 | info/biblio/tugboat.ltx
2014/08/12 | 20186 | info/biblio/type.bib
2019/12/12 | 2025 | info/biblio/type.ltx
-2022/12/08 | 1193104 | info/biblio/typeset.bib
-2022/12/08 | 2852 | info/biblio/typeset.ltx
+2022/12/24 | 1195294 | info/biblio/typeset.bib
+2022/12/24 | 2852 | info/biblio/typeset.ltx
1996/03/21 | 590 | info/biblio/widebib.sty
1994/09/24 | 2480 | info/biblio/xcite.sty
2019/10/22 | 2296480 | info/biblio.zip
@@ -190067,7 +190078,7 @@
2022/06/20 | 140748 | info/yet-another-guide-latex2e/Yet-Another-Guide-LaTeX2e_v1.tex
2022/06/20 | 899385 | info/yet-another-guide-latex2e.zip
2021/02/04 | 4944311 | install/biblio/bibtex/contrib/gost.tds.zip
-2022/09/23 | 594403 | install/biblio/citation-style-language.tds.zip
+2022/12/25 | 606921 | install/biblio/citation-style-language.tds.zip
2022/10/28 | 795249 | install/fonts/accanthis.tds.zip
2009/05/23 | 246025 | install/fonts/ae.tds.zip
2022/09/14 | 38525814 | install/fonts/alegreya.tds.zip
@@ -190082,7 +190093,7 @@
2012/04/28 | 198542 | install/fonts/bickham.tds.zip
2022/09/28 | 295109 | install/fonts/bitter.tds.zip
2017/02/25 | 332326 | install/fonts/boondox.tds.zip
-2022/09/13 | 4260117 | install/fonts/cabin.tds.zip
+2022/12/25 | 4260124 | install/fonts/cabin.tds.zip
2022/09/29 | 542083 | install/fonts/caladea.tds.zip
2019/06/24 | 2863898 | install/fonts/cantarell.tds.zip
2022/10/05 | 4053092 | install/fonts/carlito.tds.zip
@@ -218477,11 +218488,11 @@
2012/08/05 | 2301 | macros/latex/contrib/frege/INSTALL
2012/08/05 | 7184 | macros/latex/contrib/frege/README
2012/08/15 | 149608 | macros/latex/contrib/frege.zip
-2022/11/15 | 37351 | macros/latex/contrib/frenchmath/frenchmath.dtx
-2022/10/16 | 1996 | macros/latex/contrib/frenchmath/frenchmath.ins
-2022/11/15 | 243227 | macros/latex/contrib/frenchmath/frenchmath.pdf
-2022/10/25 | 1043 | macros/latex/contrib/frenchmath/README.md
-2022/11/15 | 225898 | macros/latex/contrib/frenchmath.zip
+2022/12/25 | 40270 | macros/latex/contrib/frenchmath/frenchmath.dtx
+2022/12/24 | 1993 | macros/latex/contrib/frenchmath/frenchmath.ins
+2022/12/25 | 261083 | macros/latex/contrib/frenchmath/frenchmath.pdf
+2022/12/25 | 1067 | macros/latex/contrib/frenchmath/README.md
+2022/12/25 | 244255 | macros/latex/contrib/frenchmath.zip
1998/01/06 | 5837 | macros/latex/contrib/fribrief/fribrief.cls
1998/01/06 | 11455 | macros/latex/contrib/fribrief/fribrief.ger
1998/01/06 | 3653 | macros/latex/contrib/fribrief/k_fribri.cls
@@ -225163,11 +225174,11 @@
1995/01/30 | 12825 | macros/latex/contrib/misc/verbasef.sty
1994/06/30 | 2847 | macros/latex/contrib/misc/vrbexin.sty
2012/12/16 | 29550 | macros/latex/contrib/misc.zip
-2022/11/10 | 48223 | macros/latex/contrib/mismath/mismath.dtx
+2022/12/25 | 50514 | macros/latex/contrib/mismath/mismath.dtx
2022/10/17 | 1987 | macros/latex/contrib/mismath/mismath.ins
-2022/11/10 | 247979 | macros/latex/contrib/mismath/mismath.pdf
+2022/12/25 | 257797 | macros/latex/contrib/mismath/mismath.pdf
2019/05/07 | 894 | macros/latex/contrib/mismath/README.md
-2022/11/11 | 234288 | macros/latex/contrib/mismath.zip
+2022/12/25 | 244619 | macros/latex/contrib/mismath.zip
2019/01/06 | 223143 | macros/latex/contrib/mi-solns/docs/mi-solnsman.pdf
2019/01/06 | 18167 | macros/latex/contrib/mi-solns/docs/mi-solnsman.tex
2019/01/09 | 276191 | macros/latex/contrib/mi-solns/docs/mi-solns.pdf
@@ -280192,7 +280203,7 @@
2021/05/03 | 629 | support/TeX4ht/doc/README
2020/08/24 | 358454 | support/TeX4ht/doc/TeX4ht-doc.tex
2021/05/11 | 262 | support/TeX4ht/README
-2022/12/23 | 213252 | support/TeX4ht/source/ChangeLog
+2022/12/24 | 213565 | support/TeX4ht/source/ChangeLog
2021/05/03 | 1375 | support/TeX4ht/source/checklog.lua
2021/05/03 | 1189 | support/TeX4ht/source/common-code.tex
2021/05/03 | 2727 | support/TeX4ht/source/common-info.tex
@@ -280204,7 +280215,7 @@
2021/05/03 | 1121 | support/TeX4ht/source/README
2021/05/03 | 1744 | support/TeX4ht/source/t1fontmake.lua
2021/05/03 | 297 | support/TeX4ht/source/t1fontsample.tex
-2022/12/16 | 1151141 | support/TeX4ht/source/tex4ht-4ht.tex
+2022/12/24 | 1151196 | support/TeX4ht/source/tex4ht-4ht.tex
2021/05/03 | 7127 | support/TeX4ht/source/tex4ht-auto-script.tex
2021/05/16 | 1539 | support/TeX4ht/source/tex4ht-bibtex2.tex
2022/06/05 | 21307 | support/TeX4ht/source/tex4ht-cond4ht.tex
@@ -280231,7 +280242,7 @@
2021/05/03 | 14218 | support/TeX4ht/source/tex4ht-htcmd.tex
2021/05/03 | 70683 | support/TeX4ht/source/tex4ht-html0.tex
2021/05/03 | 164748 | support/TeX4ht/source/tex4ht-html32.tex
-2022/12/23 | 622202 | support/TeX4ht/source/tex4ht-html4.tex
+2022/12/24 | 622207 | support/TeX4ht/source/tex4ht-html4.tex
2022/08/11 | 11077 | support/TeX4ht/source/tex4ht-html5.tex
2021/06/17 | 648233 | support/TeX4ht/source/tex4ht-html-speech.tex
2021/05/03 | 59483 | support/TeX4ht/source/tex4ht-html-speech-xtpipes.tex
@@ -286376,10 +286387,10 @@
2020/03/04 | 408 | systems/texlive/tlnet/archive/collection-langpolish.r54074.tar.xz
2020/03/04 | 392 | systems/texlive/tlnet/archive/collection-langportuguese.r54074.tar.xz
2020/03/07 | 380 | systems/texlive/tlnet/archive/collection-langspanish.r54141.tar.xz
-2022/12/24 | 6804 | systems/texlive/tlnet/archive/collection-latexextra.r65343.tar.xz
+2022/12/25 | 6812 | systems/texlive/tlnet/archive/collection-latexextra.r65353.tar.xz
2022/06/10 | 700 | systems/texlive/tlnet/archive/collection-latex.r63515.tar.xz
2022/06/12 | 736 | systems/texlive/tlnet/archive/collection-latexrecommended.r63547.tar.xz
-2022/12/23 | 936 | systems/texlive/tlnet/archive/collection-luatex.r65333.tar.xz
+2022/12/25 | 944 | systems/texlive/tlnet/archive/collection-luatex.r65354.tar.xz
2022/12/20 | 1644 | systems/texlive/tlnet/archive/collection-mathscience.r65312.tar.xz
2022/11/01 | 556 | systems/texlive/tlnet/archive/collection-metapost.r64878.tar.xz
2022/11/08 | 484 | systems/texlive/tlnet/archive/collection-music.r64966.tar.xz
@@ -288454,9 +288465,9 @@
2022/09/05 | 117208 | systems/texlive/tlnet/archive/fduthesis.source.r64288.tar.xz
2019/02/28 | 17968016 | systems/texlive/tlnet/archive/featpost.doc.r35346.tar.xz
2019/02/28 | 31996 | systems/texlive/tlnet/archive/featpost.r35346.tar.xz
-2021/06/15 | 492852 | systems/texlive/tlnet/archive/fei.doc.r59589.tar.xz
-2021/06/15 | 8028 | systems/texlive/tlnet/archive/fei.r59589.tar.xz
-2021/06/15 | 31436 | systems/texlive/tlnet/archive/fei.source.r59589.tar.xz
+2022/12/25 | 441996 | systems/texlive/tlnet/archive/fei.doc.r65352.tar.xz
+2022/12/25 | 8108 | systems/texlive/tlnet/archive/fei.r65352.tar.xz
+2022/12/25 | 31128 | systems/texlive/tlnet/archive/fei.source.r65352.tar.xz
2019/02/28 | 532 | systems/texlive/tlnet/archive/fenixpar.doc.r24730.tar.xz
2019/02/28 | 3840 | systems/texlive/tlnet/archive/fenixpar.r24730.tar.xz
2019/02/28 | 237312 | systems/texlive/tlnet/archive/fetamont.doc.r43812.tar.xz
@@ -289238,6 +289249,8 @@
2019/02/28 | 235196 | systems/texlive/tlnet/archive/gradientframe.doc.r21387.tar.xz
2019/02/28 | 1368 | systems/texlive/tlnet/archive/gradientframe.r21387.tar.xz
2019/02/28 | 4360 | systems/texlive/tlnet/archive/gradientframe.source.r21387.tar.xz
+2022/12/25 | 85364 | systems/texlive/tlnet/archive/gradient-text.doc.r65353.tar.xz
+2022/12/25 | 920 | systems/texlive/tlnet/archive/gradient-text.r65353.tar.xz
2022/03/08 | 769280 | systems/texlive/tlnet/archive/grading-scheme.doc.r62505.tar.xz
2022/03/08 | 5004 | systems/texlive/tlnet/archive/grading-scheme.r62505.tar.xz
2022/03/08 | 15320 | systems/texlive/tlnet/archive/grading-scheme.source.r62505.tar.xz
@@ -291315,6 +291328,8 @@
2022/05/05 | 5704 | systems/texlive/tlnet/archive/luamathalign.source.r63226.tar.xz
2022/07/12 | 251676 | systems/texlive/tlnet/archive/luamesh.doc.r63875.tar.xz
2022/07/12 | 12872 | systems/texlive/tlnet/archive/luamesh.r63875.tar.xz
+2022/12/25 | 269380 | systems/texlive/tlnet/archive/luamodulartables.doc.r65354.tar.xz
+2022/12/25 | 1040 | systems/texlive/tlnet/archive/luamodulartables.r65354.tar.xz
2022/01/13 | 156860 | systems/texlive/tlnet/archive/luamplib.doc.r61587.tar.xz
2022/01/13 | 12060 | systems/texlive/tlnet/archive/luamplib.r61587.tar.xz
2022/01/13 | 27400 | systems/texlive/tlnet/archive/luamplib.source.r61587.tar.xz
@@ -294239,8 +294254,8 @@
2021/08/05 | 864 | systems/texlive/tlnet/archive/python.doc.r60162.tar.xz
2019/02/28 | 1444 | systems/texlive/tlnet/archive/pythonhighlight.doc.r43191.tar.xz
2019/02/28 | 2180 | systems/texlive/tlnet/archive/pythonhighlight.r43191.tar.xz
-2022/12/24 | 408940 | systems/texlive/tlnet/archive/pythonimmediate.doc.r65343.tar.xz
-2022/12/24 | 20184 | systems/texlive/tlnet/archive/pythonimmediate.r65343.tar.xz
+2022/12/25 | 408944 | systems/texlive/tlnet/archive/pythonimmediate.doc.r65349.tar.xz
+2022/12/25 | 20184 | systems/texlive/tlnet/archive/pythonimmediate.r65349.tar.xz
2021/08/05 | 2012 | systems/texlive/tlnet/archive/python.r60162.tar.xz
2019/02/28 | 364 | systems/texlive/tlnet/archive/pythontex.aarch64-linux.r46208.tar.xz
2019/02/28 | 364 | systems/texlive/tlnet/archive/pythontex.amd64-freebsd.r31638.tar.xz
@@ -295594,14 +295609,14 @@
2022/02/27 | 108804 | systems/texlive/tlnet/archive/tex4ht.amd64-freebsd.r62206.tar.xz
2022/02/27 | 87364 | systems/texlive/tlnet/archive/tex4ht.amd64-netbsd.r62220.tar.xz
2022/04/21 | 69948 | systems/texlive/tlnet/archive/tex4ht.armhf-linux.r63092.tar.xz
-2022/12/24 | 136384 | systems/texlive/tlnet/archive/tex4ht.doc.r65344.tar.xz
+2022/12/25 | 136384 | systems/texlive/tlnet/archive/tex4ht.doc.r65350.tar.xz
2022/03/01 | 58328 | systems/texlive/tlnet/archive/tex4ht.i386-cygwin.r62282.tar.xz
2022/02/27 | 93760 | systems/texlive/tlnet/archive/tex4ht.i386-freebsd.r62206.tar.xz
2022/02/27 | 91280 | systems/texlive/tlnet/archive/tex4ht.i386-linux.r62210.tar.xz
2022/02/27 | 76200 | systems/texlive/tlnet/archive/tex4ht.i386-netbsd.r62220.tar.xz
2022/02/27 | 83964 | systems/texlive/tlnet/archive/tex4ht.i386-solaris.r62206.tar.xz
-2022/12/24 | 976412 | systems/texlive/tlnet/archive/tex4ht.r65344.tar.xz
-2022/12/24 | 1290316 | systems/texlive/tlnet/archive/tex4ht.source.r65344.tar.xz
+2022/12/25 | 976568 | systems/texlive/tlnet/archive/tex4ht.r65350.tar.xz
+2022/12/25 | 1294848 | systems/texlive/tlnet/archive/tex4ht.source.r65350.tar.xz
2022/02/28 | 184748 | systems/texlive/tlnet/archive/tex4ht.universal-darwin.r62258.tar.xz
2022/02/27 | 57768 | systems/texlive/tlnet/archive/tex4ht.win32.r62199.tar.xz
2022/03/01 | 58016 | systems/texlive/tlnet/archive/tex4ht.x86_64-cygwin.r62279.tar.xz
@@ -295855,7 +295870,7 @@
2022/09/13 | 600 | systems/texlive/tlnet/archive/texlive-scripts.amd64-freebsd.r64356.tar.xz
2022/09/13 | 596 | systems/texlive/tlnet/archive/texlive-scripts.amd64-netbsd.r64356.tar.xz
2022/09/13 | 596 | systems/texlive/tlnet/archive/texlive-scripts.armhf-linux.r64356.tar.xz
-2022/12/24 | 423764 | systems/texlive/tlnet/archive/texlive-scripts.doc.r65337.tar.xz
+2022/12/25 | 423988 | systems/texlive/tlnet/archive/texlive-scripts.doc.r65348.tar.xz
2020/01/27 | 916 | systems/texlive/tlnet/archive/texlive-scripts-extra.aarch64-linux.r53577.tar.xz
2020/01/27 | 924 | systems/texlive/tlnet/archive/texlive-scripts-extra.amd64-freebsd.r53577.tar.xz
2020/01/27 | 916 | systems/texlive/tlnet/archive/texlive-scripts-extra.amd64-netbsd.r53577.tar.xz
@@ -295879,7 +295894,7 @@
2022/09/13 | 592 | systems/texlive/tlnet/archive/texlive-scripts.i386-linux.r64356.tar.xz
2022/09/13 | 596 | systems/texlive/tlnet/archive/texlive-scripts.i386-netbsd.r64356.tar.xz
2022/09/13 | 596 | systems/texlive/tlnet/archive/texlive-scripts.i386-solaris.r64356.tar.xz
-2022/12/24 | 113724 | systems/texlive/tlnet/archive/texlive-scripts.r65337.tar.xz
+2022/12/25 | 113712 | systems/texlive/tlnet/archive/texlive-scripts.r65348.tar.xz
2022/09/13 | 580 | systems/texlive/tlnet/archive/texlive-scripts.universal-darwin.r64356.tar.xz
2022/11/29 | 36264 | systems/texlive/tlnet/archive/texlive-scripts.win32.r65128.tar.xz
2022/09/13 | 596 | systems/texlive/tlnet/archive/texlive-scripts.x86_64-cygwin.r64356.tar.xz
@@ -297684,8 +297699,8 @@
2019/02/28 | 340 | systems/texlive/tlnet/archive/yplan.x86_64-linuxmusl.r46840.tar.xz
2019/02/28 | 336 | systems/texlive/tlnet/archive/yplan.x86_64-linux.r34398.tar.xz
2019/02/28 | 336 | systems/texlive/tlnet/archive/yplan.x86_64-solaris.r34398.tar.xz
-2022/05/08 | 825320 | systems/texlive/tlnet/archive/yquant.doc.r63255.tar.xz
-2022/05/08 | 56756 | systems/texlive/tlnet/archive/yquant.r63255.tar.xz
+2022/12/25 | 827288 | systems/texlive/tlnet/archive/yquant.doc.r65351.tar.xz
+2022/12/25 | 56860 | systems/texlive/tlnet/archive/yquant.r65351.tar.xz
2021/06/14 | 378896 | systems/texlive/tlnet/archive/ytableau.doc.r59580.tar.xz
2021/06/14 | 3068 | systems/texlive/tlnet/archive/ytableau.r59580.tar.xz
2021/06/14 | 16032 | systems/texlive/tlnet/archive/ytableau.source.r59580.tar.xz
@@ -297748,16 +297763,16 @@
2020/07/18 | 47816 | systems/texlive/tlnet/archive/zztex.doc.r55862.tar.xz
2020/07/18 | 101724 | systems/texlive/tlnet/archive/zztex.r55862.tar.xz
2022/07/17 | 124404 | systems/texlive/tlnet/install-tl
-2022/12/24 | 5834693 | systems/texlive/tlnet/install-tl-unx.tar.gz
-2022/12/24 | 152 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512
-2022/12/24 | 455 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512.asc
+2022/12/25 | 5834826 | systems/texlive/tlnet/install-tl-unx.tar.gz
+2022/12/25 | 152 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512
+2022/12/25 | 455 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512.asc
2021/04/11 | 4945 | systems/texlive/tlnet/install-tl-windows.bat
-2022/12/24 | 20433966 | systems/texlive/tlnet/install-tl-windows.exe
-2022/12/24 | 153 | systems/texlive/tlnet/install-tl-windows.exe.sha512
-2022/12/24 | 455 | systems/texlive/tlnet/install-tl-windows.exe.sha512.asc
-2022/12/24 | 25518558 | systems/texlive/tlnet/install-tl.zip
-2022/12/24 | 145 | systems/texlive/tlnet/install-tl.zip.sha512
-2022/12/24 | 455 | systems/texlive/tlnet/install-tl.zip.sha512.asc
+2022/12/25 | 20435761 | systems/texlive/tlnet/install-tl-windows.exe
+2022/12/25 | 153 | systems/texlive/tlnet/install-tl-windows.exe.sha512
+2022/12/25 | 455 | systems/texlive/tlnet/install-tl-windows.exe.sha512.asc
+2022/12/25 | 25518553 | systems/texlive/tlnet/install-tl.zip
+2022/12/25 | 145 | systems/texlive/tlnet/install-tl.zip.sha512
+2022/12/25 | 455 | systems/texlive/tlnet/install-tl.zip.sha512.asc
2022/04/03 | 1229 | systems/texlive/tlnet/README.md
2022/04/03 | 0 | systems/texlive/tlnet/TEXLIVE_2022
2022/02/28 | 7791 | systems/texlive/tlnet/tlpkg/gpg/pubring.gpg
@@ -297767,7 +297782,7 @@
2022/02/28 | 1280 | systems/texlive/tlnet/tlpkg/gpg/trustdb.gpg
2022/10/09 | 49938 | systems/texlive/tlnet/tlpkg/installer/config.guess
2010/11/11 | 11651 | systems/texlive/tlnet/tlpkg/installer/COPYING.MinGW-runtime.txt
-2022/12/23 | 7465 | systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl
+2022/12/24 | 7416 | systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl
2022/10/13 | 225403 | systems/texlive/tlnet/tlpkg/installer/curl/curl-ca-bundle.crt
2020/04/15 | 2606592 | systems/texlive/tlnet/tlpkg/installer/curl/curl.exe
2017/04/16 | 2629 | systems/texlive/tlnet/tlpkg/installer/installer-options.txt
@@ -297810,12 +297825,12 @@
2021/05/16 | 20371 | systems/texlive/tlnet/tlpkg/TeXLive/TLCrypto.pm
2021/12/21 | 5429 | systems/texlive/tlnet/tlpkg/TeXLive/TLDownload.pm
2021/12/21 | 27582 | systems/texlive/tlnet/tlpkg/TeXLive/TLPaper.pm
-2022/12/24 | 17912007 | systems/texlive/tlnet/tlpkg/texlive.tlpdb
-2022/12/24 | 48 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5
+2022/12/25 | 17914035 | systems/texlive/tlnet/tlpkg/texlive.tlpdb
+2022/12/25 | 48 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5
2022/04/18 | 86658 | systems/texlive/tlnet/tlpkg/TeXLive/TLPDB.pm
-2022/12/24 | 144 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512
-2022/12/24 | 455 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc
-2022/12/24 | 2439292 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz
+2022/12/25 | 144 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512
+2022/12/25 | 455 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc
+2022/12/25 | 2439740 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz
2022/09/14 | 58922 | systems/texlive/tlnet/tlpkg/TeXLive/TLPOBJ.pm
2022/10/04 | 42404 | systems/texlive/tlnet/tlpkg/TeXLive/TLPSRC.pm
2021/12/21 | 16130 | systems/texlive/tlnet/tlpkg/TeXLive/TLTREE.pm
@@ -307982,7 +307997,7 @@
2014/07/05 | 611 | systems/win32/yandy/README
2014/07/05 | 1004628 | systems/win32/yandy/yandy-src.tar.xz
2014/07/05 | 1012416 | systems/win32/yandy.zip
-2022/12/25 | 186 | timestamp
+2022/12/26 | 186 | timestamp
2002/08/26 | 61898 | usergrps/dante/antrag.pdf
2002/08/26 | 118217 | usergrps/dante/antrag.ps
2021/11/11 | 917 | usergrps/dante/dtk/doc/beispiel.bib
diff --git a/FILES.byname.gz b/FILES.byname.gz
index 03bdffdd48..508c1782ac 100644
--- a/FILES.byname.gz
+++ b/FILES.byname.gz
Binary files differ
diff --git a/FILES.last07days b/FILES.last07days
index f3a324d7c2..b24c47e269 100644
--- a/FILES.last07days
+++ b/FILES.last07days
@@ -1,66 +1,209 @@
-2022/12/24 | 976412 | systems/texlive/tlnet/archive/tex4ht.r65344.tar.xz
+2022/12/25 | 976568 | systems/texlive/tlnet/archive/tex4ht.r65350.tar.xz
+2022/12/25 | 944 | systems/texlive/tlnet/archive/collection-luatex.r65354.tar.xz
+2022/12/25 | 920 | systems/texlive/tlnet/archive/gradient-text.r65353.tar.xz
+2022/12/25 | 904 | biblio/citation-style-language/citeproc-node-group.lua
+2022/12/25 | 8995 | biblio/citation-style-language/citeproc-latex-core.lua
+2022/12/25 | 85364 | systems/texlive/tlnet/archive/gradient-text.doc.r65353.tar.xz
+2022/12/25 | 8428 | biblio/citation-style-language/citeproc-context.lua
+2022/12/25 | 827288 | systems/texlive/tlnet/archive/yquant.doc.r65351.tar.xz
+2022/12/25 | 8128 | biblio/citation-style-language/elsevier-harvard.csl
+2022/12/25 | 8108 | systems/texlive/tlnet/archive/fei.r65352.tar.xz
+2022/12/25 | 8052 | biblio/citation-style-language/american-political-science-association.csl
+2022/12/25 | 7846 | biblio/citation-style-language/citeproc-latex-parser.lua
+2022/12/25 | 7308 | biblio/citation-style-language/citeproc-node-choose.lua
+2022/12/25 | 72823 | biblio/citation-style-language/citeproc-bibtex-data.lua
+2022/12/25 | 69907 | biblio/citation-style-language/apa.csl
+2022/12/25 | 6812 | systems/texlive/tlnet/archive/collection-latexextra.r65353.tar.xz
+2022/12/25 | 6283 | biblio/citation-style-language/citeproc-node-sort.lua
+2022/12/25 | 617 | biblio/citation-style-language/citeproc-lua.1
+2022/12/25 | 6123 | biblio/citation-style-language/citeproc-node-locale.lua
+2022/12/25 | 606921 | install/biblio/citation-style-language.tds.zip
+2022/12/25 | 604004 | biblio/citation-style-language.zip
+2022/12/25 | 5834826 | systems/texlive/tlnet/install-tl-unx.tar.gz
+2022/12/25 | 56860 | systems/texlive/tlnet/archive/yquant.r65351.tar.xz
+2022/12/25 | 5684 | biblio/citation-style-language/citeproc-node-text.lua
+2022/12/25 | 5288 | biblio/citation-style-language/nature.csl
+2022/12/25 | 5144 | biblio/citation-style-language/citeproc-cli.lua
+2022/12/25 | 50514 | macros/latex/contrib/mismath/mismath.dtx
+2022/12/25 | 50109 | biblio/citation-style-language/citeproc-output.lua
+2022/12/25 | 48 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5
+2022/12/25 | 4760 | biblio/citation-style-language/citeproc-node-style.lua
+2022/12/25 | 47520 | biblio/citation-style-language/chicago-fullnote-bibliography.csl
+2022/12/25 | 45970 | biblio/citation-style-language/chicago-note-bibliography.csl
+2022/12/25 | 455 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc
+2022/12/25 | 455 | systems/texlive/tlnet/install-tl.zip.sha512.asc
+2022/12/25 | 455 | systems/texlive/tlnet/install-tl-windows.exe.sha512.asc
+2022/12/25 | 455 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512.asc
+2022/12/25 | 45284 | biblio/citation-style-language/citeproc-node-citation.lua
+2022/12/25 | 441996 | systems/texlive/tlnet/archive/fei.doc.r65352.tar.xz
+2022/12/25 | 4260124 | install/fonts/cabin.tds.zip
+2022/12/25 | 423988 | systems/texlive/tlnet/archive/texlive-scripts.doc.r65348.tar.xz
+2022/12/25 | 4223364 | fonts/cabin.zip
+2022/12/25 | 408944 | systems/texlive/tlnet/archive/pythonimmediate.doc.r65349.tar.xz
+2022/12/25 | 4061 | biblio/citation-style-language/citeproc-latex.lua
+2022/12/25 | 4052 | fonts/cabin/latex/cabin.sty
+2022/12/25 | 40270 | macros/latex/contrib/frenchmath/frenchmath.dtx
+2022/12/25 | 4023122 | biblio/ctan-bibdata.zip
+2022/12/25 | 3855 | biblio/citation-style-language/CHANGELOG.md
+2022/12/25 | 37016 | biblio/citation-style-language/citation-style-language.sty
+2022/12/25 | 3694 | biblio/citation-style-language/citeproc-ir-node.lua
+2022/12/25 | 3630316 | biblio/ctan-bibdata/ctan.pdf
+2022/12/25 | 344 | biblio/citation-style-language/citeproc.lua
+2022/12/25 | 33819 | biblio/citation-style-language/citeproc-node-names.lua
+2022/12/25 | 31128 | systems/texlive/tlnet/archive/fei.source.r65352.tar.xz
+2022/12/25 | 2766 | biblio/citation-style-language/citeproc-node-label.lua
+2022/12/25 | 2752774 | biblio/ctan-bibdata/ctan.bib
+2022/12/25 | 269380 | systems/texlive/tlnet/archive/luamodulartables.doc.r65354.tar.xz
+2022/12/25 | 261083 | macros/latex/contrib/frenchmath/frenchmath.pdf
+2022/12/25 | 26012 | biblio/citation-style-language/citeproc-engine.lua
+2022/12/25 | 257797 | macros/latex/contrib/mismath/mismath.pdf
+2022/12/25 | 25715 | biblio/citation-style-language/csl-locales-ru-RU.xml
+2022/12/25 | 25518553 | systems/texlive/tlnet/install-tl.zip
+2022/12/25 | 24466 | biblio/citation-style-language/csl-locales-bg-BG.xml
+2022/12/25 | 244619 | macros/latex/contrib/mismath.zip
+2022/12/25 | 244255 | macros/latex/contrib/frenchmath.zip
+2022/12/25 | 2439740 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz
+2022/12/25 | 24345 | biblio/citation-style-language/csl-locales-hi-IN.xml
+2022/12/25 | 240 | biblio/citation-style-language/citeproc-lua.lua
+2022/12/25 | 23553 | biblio/citation-style-language/csl-locales-lv-LV.xml
+2022/12/25 | 23467 | biblio/citation-style-language/csl-locales-th-TH.xml
+2022/12/25 | 23360 | biblio/citation-style-language/csl-locales-it-IT.xml
+2022/12/25 | 231 | biblio/citation-style-language/DEPENDS.txt
+2022/12/25 | 2314 | fonts/cabin/README
+2022/12/25 | 23079 | biblio/citation-style-language/chicago-author-date.csl
+2022/12/25 | 23024 | biblio/citation-style-language/csl-locales-el-GR.xml
+2022/12/25 | 228973 | biblio/citation-style-language/citation-style-language-doc.pdf
+2022/12/25 | 22752 | biblio/citation-style-language/csl-locales-lt-LT.xml
+2022/12/25 | 22627 | biblio/citation-style-language/csl-locales-en-US.xml
+2022/12/25 | 22542 | biblio/citation-style-language/csl-locales-pt-BR.xml
+2022/12/25 | 22472 | biblio/citation-style-language/csl-locales-en-GB.xml
+2022/12/25 | 22454 | biblio/citation-style-language/csl-locales-pt-PT.xml
+2022/12/25 | 22434 | biblio/citation-style-language/csl-locales-es-MX.xml
+2022/12/25 | 22358 | biblio/citation-style-language/csl-locales-nl-NL.xml
+2022/12/25 | 22356 | biblio/citation-style-language/csl-locales-fr-FR.xml
+2022/12/25 | 22353 | biblio/citation-style-language/citeproc-util.lua
+2022/12/25 | 22337 | biblio/citation-style-language/csl-locales-fa-IR.xml
+2022/12/25 | 22218 | biblio/citation-style-language/csl-locales-de-AT.xml
+2022/12/25 | 22143 | biblio/citation-style-language/csl-locales-de-DE.xml
+2022/12/25 | 22122 | biblio/citation-style-language/csl-locales-sr-RS.xml
+2022/12/25 | 22098 | biblio/citation-style-language/csl-locales-fr-CA.xml
+2022/12/25 | 21966 | biblio/citation-style-language/csl-locales-km-KH.xml
+2022/12/25 | 21941 | biblio/citation-style-language/csl-locales-mn-MN.xml
+2022/12/25 | 21822 | biblio/citation-style-language/csl-locales-he-IL.xml
+2022/12/25 | 21812 | biblio/citation-style-language/csl-locales-vi-VN.xml
+2022/12/25 | 21715 | biblio/citation-style-language/csl-locales-sv-SE.xml
+2022/12/25 | 21681 | biblio/citation-style-language/csl-locales-de-CH.xml
+2022/12/25 | 21654 | biblio/citation-style-language/csl-locales-id-ID.xml
+2022/12/25 | 21635 | biblio/citation-style-language/csl-locales-tr-TR.xml
+2022/12/25 | 21623 | biblio/citation-style-language/csl-locales-fi-FI.xml
+2022/12/25 | 21579 | biblio/citation-style-language/csl-locales-cs-CZ.xml
+2022/12/25 | 21576 | biblio/citation-style-language/csl-locales-cy-GB.xml
+2022/12/25 | 21574 | biblio/citation-style-language/csl-locales-sk-SK.xml
+2022/12/25 | 21512 | biblio/citation-style-language/csl-locales-eu.xml
+2022/12/25 | 21482 | biblio/citation-style-language/csl-locales-ja-JP.xml
+2022/12/25 | 21470 | biblio/citation-style-language/csl-locales-da-DK.xml
+2022/12/25 | 21469 | biblio/citation-style-language/csl-locales-is-IS.xml
+2022/12/25 | 21466 | biblio/citation-style-language/csl-locales-hu-HU.xml
+2022/12/25 | 21462 | biblio/citation-style-language/csl-locales-ro-RO.xml
+2022/12/25 | 21446 | biblio/citation-style-language/csl-locales-pl-PL.xml
+2022/12/25 | 21433 | biblio/citation-style-language/csl-locales-af-ZA.xml
+2022/12/25 | 21414 | biblio/citation-style-language/csl-locales-ko-KR.xml
+2022/12/25 | 21406 | biblio/citation-style-language/csl-locales-es-CL.xml
+2022/12/25 | 21363 | biblio/citation-style-language/csl-locales-hr-HR.xml
+2022/12/25 | 21330 | biblio/citation-style-language/csl-locales-sl-SI.xml
+2022/12/25 | 21327 | biblio/citation-style-language/csl-locales-es-ES.xml
+2022/12/25 | 21323 | biblio/citation-style-language/csl-locales-nb-NO.xml
+2022/12/25 | 21302 | biblio/citation-style-language/csl-locales-la.xml
+2022/12/25 | 21302 | biblio/citation-style-language/csl-locales-ca-AD.xml
+2022/12/25 | 21301 | biblio/citation-style-language/csl-locales-nn-NO.xml
+2022/12/25 | 21261 | biblio/citation-style-language/csl-locales-et-EE.xml
+2022/12/25 | 21225 | biblio/citation-style-language/citeproc-bibtex.lua
+2022/12/25 | 20747 | biblio/citation-style-language/csl-locales-uk-UA.xml
+2022/12/25 | 2052188 | graphics/pgf/contrib/tikz-mirror-lens.zip
+2022/12/25 | 20435761 | systems/texlive/tlnet/install-tl-windows.exe
+2022/12/25 | 20184 | systems/texlive/tlnet/archive/pythonimmediate.r65349.tar.xz
+2022/12/25 | 19817 | biblio/citation-style-language/csl-locales-ar.xml
+2022/12/25 | 19423 | biblio/citation-style-language/csl-locales-zh-TW.xml
+2022/12/25 | 19056 | biblio/citation-style-language/csl-locales-zh-CN.xml
+2022/12/25 | 17914035 | systems/texlive/tlnet/tlpkg/texlive.tlpdb
+2022/12/25 | 1702 | biblio/citation-style-language/citeproc-node-layout.lua
+2022/12/25 | 1688 | biblio/citation-style-language/citeproc-nodes.lua
+2022/12/25 | 1678 | biblio/ctan-bibdata/biblatex-ctan/ctan.bbx
+2022/12/25 | 1675 | biblio/citation-style-language/citeproc-node-number.lua
+2022/12/25 | 1673 | biblio/citation-style-language/README.md
+2022/12/25 | 16054 | biblio/citation-style-language/modern-humanities-research-association.csl
+2022/12/25 | 15895 | biblio/citation-style-language/citeproc-element.lua
+2022/12/25 | 15691 | biblio/citation-style-language/citation-style-language-doc.tex
+2022/12/25 | 15413 | biblio/citation-style-language/ieee.csl
+2022/12/25 | 153 | systems/texlive/tlnet/install-tl-windows.exe.sha512
+2022/12/25 | 152 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512
+2022/12/25 | 145 | systems/texlive/tlnet/install-tl.zip.sha512
+2022/12/25 | 144 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512
+2022/12/25 | 136384 | systems/texlive/tlnet/archive/tex4ht.doc.r65350.tar.xz
+2022/12/25 | 13594 | biblio/citation-style-language/citeproc-node-date.lua
+2022/12/25 | 1294848 | systems/texlive/tlnet/archive/tex4ht.source.r65350.tar.xz
+2022/12/25 | 11958 | biblio/citation-style-language/vancouver.csl
+2022/12/25 | 113712 | systems/texlive/tlnet/archive/texlive-scripts.r65348.tar.xz
+2022/12/25 | 11209 | biblio/citation-style-language/modern-language-association.csl
+2022/12/25 | 11060 | biblio/citation-style-language/american-sociological-association.csl
+2022/12/25 | 11034 | biblio/citation-style-language/american-medical-association.csl
+2022/12/25 | 10723 | biblio/citation-style-language/harvard-cite-them-right.csl
+2022/12/25 | 1067 | macros/latex/contrib/frenchmath/README.md
+2022/12/25 | 1040 | systems/texlive/tlnet/archive/luamodulartables.r65354.tar.xz
+2022/12/25 | 10117 | biblio/citation-style-language/citeproc-node-bibliography.lua
+2022/12/25 | 10019 | biblio/citation-style-language/american-chemical-society.csl
2022/12/24 | 940941 | graphics/pgf/contrib/yquant.zip
2022/12/24 | 8984 | macros/latex/contrib/fei/referencias.bib
2022/12/24 | 87888 | systems/texlive/tlnet/archive/pstricks.r65346.tar.xz
2022/12/24 | 85540 | macros/latex/contrib/gradient-text.zip
2022/12/24 | 84781 | macros/latex/contrib/gradient-text/gradient-text.pdf
+2022/12/24 | 7416 | systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl
2022/12/24 | 708 | systems/texlive/tlnet/archive/namedtensor.r65346.tar.xz
-2022/12/24 | 6804 | systems/texlive/tlnet/archive/collection-latexextra.r65343.tar.xz
+2022/12/24 | 622207 | support/TeX4ht/source/tex4ht-html4.tex
2022/12/24 | 59628 | systems/texlive/tlnet/archive/tagpdf.source.r65346.tar.xz
-2022/12/24 | 5834693 | systems/texlive/tlnet/install-tl-unx.tar.gz
2022/12/24 | 52412 | graphics/pgf/contrib/yquant/tex/yquant-shapes.tex
2022/12/24 | 49656 | systems/texlive/tlnet/archive/markdown.r65346.tar.xz
-2022/12/24 | 48 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5
2022/12/24 | 478318 | macros/latex/contrib/fei.zip
-2022/12/24 | 455 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc
-2022/12/24 | 455 | systems/texlive/tlnet/install-tl.zip.sha512.asc
-2022/12/24 | 455 | systems/texlive/tlnet/install-tl-windows.exe.sha512.asc
-2022/12/24 | 455 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512.asc
2022/12/24 | 440506 | macros/latex/contrib/fei/fei.pdf
-2022/12/24 | 423764 | systems/texlive/tlnet/archive/texlive-scripts.doc.r65337.tar.xz
2022/12/24 | 409372 | systems/texlive/tlnet/archive/luakeys.doc.r65346.tar.xz
-2022/12/24 | 408940 | systems/texlive/tlnet/archive/pythonimmediate.doc.r65343.tar.xz
-2022/12/24 | 4025166 | biblio/ctan-bibdata.zip
2022/12/24 | 399688 | systems/texlive/tlnet/archive/saveenv.doc.r65346.tar.xz
2022/12/24 | 378165 | macros/luatex/latex/luamodulartables.zip
-2022/12/24 | 3632513 | biblio/ctan-bibdata/ctan.pdf
2022/12/24 | 321494 | macros/luatex/latex/luamodulartables/luamodulartables.pdf
2022/12/24 | 32028 | systems/texlive/tlnet/archive/sdaps.r65345.tar.xz
2022/12/24 | 313049 | graphics/pgf/contrib/yquant/doc/yquant-doc.tex
2022/12/24 | 30384 | systems/texlive/tlnet/archive/tagpdf.r65346.tar.xz
2022/12/24 | 29416 | systems/texlive/tlnet/archive/sdaps.source.r65345.tar.xz
+2022/12/24 | 2852 | info/biblio/typeset.ltx
2022/12/24 | 2840 | macros/latex/contrib/gradient-text/gradient-text.tex
2022/12/24 | 277328 | systems/texlive/tlnet/archive/sdaps.doc.r65345.tar.xz
-2022/12/24 | 2752404 | biblio/ctan-bibdata/ctan.bib
2022/12/24 | 2672 | macros/luatex/latex/luamodulartables/luamodulartables.sty
-2022/12/24 | 25518558 | systems/texlive/tlnet/install-tl.zip
-2022/12/24 | 2439292 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz
+2022/12/24 | 24239 | graphics/pgf/contrib/tikz-mirror-lens/doc/tikz-mirror-lens-PT.tex
+2022/12/24 | 23476 | graphics/pgf/contrib/tikz-mirror-lens/doc/tikz-mirror-lens.tex
2022/12/24 | 23428 | macros/luatex/latex/luamodulartables/luamodulartables.tex
2022/12/24 | 23114 | macros/latex/contrib/fei/fei-template-sublist.tex
2022/12/24 | 22827 | graphics/pgf/contrib/yquant/tex/yquant-config.tex
2022/12/24 | 22724 | systems/texlive/tlnet/archive/pst-plot.r65346.tar.xz
+2022/12/24 | 227228 | fonts/cabin/doc/cabin-samples.pdf
2022/12/24 | 2196 | systems/texlive/tlnet/archive/saveenv.r65346.tar.xz
2022/12/24 | 21943 | macros/latex/contrib/fei/fei-template.tex
2022/12/24 | 2176 | graphics/pgf/contrib/yquant/tex/yquant.sty
-2022/12/24 | 20433966 | systems/texlive/tlnet/install-tl-windows.exe
-2022/12/24 | 20184 | systems/texlive/tlnet/archive/pythonimmediate.r65343.tar.xz
+2022/12/24 | 213565 | support/TeX4ht/source/ChangeLog
+2022/12/24 | 1993 | macros/latex/contrib/frenchmath/frenchmath.ins
2022/12/24 | 1969284 | systems/texlive/tlnet/archive/tagpdf.doc.r65346.tar.xz
2022/12/24 | 1863 | macros/latex/contrib/fei/README
-2022/12/24 | 17912007 | systems/texlive/tlnet/tlpkg/texlive.tlpdb
-2022/12/24 | 1678 | biblio/ctan-bibdata/biblatex-ctan/ctan.bbx
+2022/12/24 | 1759 | graphics/pgf/contrib/tikz-mirror-lens/README.md
+2022/12/24 | 16589 | graphics/pgf/contrib/tikz-mirror-lens/tex/tikz-mirror-lens.sty
2022/12/24 | 1608 | systems/texlive/tlnet/archive/namedtensor.doc.r65346.tar.xz
-2022/12/24 | 153 | systems/texlive/tlnet/install-tl-windows.exe.sha512
-2022/12/24 | 152 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512
-2022/12/24 | 145 | systems/texlive/tlnet/install-tl.zip.sha512
-2022/12/24 | 144 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512
2022/12/24 | 1408 | macros/luatex/latex/luamodulartables/luamodular.bib
2022/12/24 | 1387 | macros/latex/contrib/gradient-text/README.md
-2022/12/24 | 136384 | systems/texlive/tlnet/archive/tex4ht.doc.r65344.tar.xz
+2022/12/24 | 1374037 | graphics/pgf/contrib/tikz-mirror-lens/doc/tikz-mirror-lens-PT.pdf
+2022/12/24 | 1361649 | graphics/pgf/contrib/tikz-mirror-lens/doc/tikz-mirror-lens.pdf
2022/12/24 | 1346672 | systems/texlive/tlnet/archive/pst-plot.doc.r65346.tar.xz
-2022/12/24 | 1290316 | systems/texlive/tlnet/archive/tex4ht.source.r65344.tar.xz
2022/12/24 | 1282 | macros/luatex/latex/luamodulartables/README.txt
+2022/12/24 | 1279 | graphics/pgf/contrib/tikz-mirror-lens/tex/tikz-mirror-lens.cwl
2022/12/24 | 120632 | macros/latex/contrib/fei/fei.dtx
-2022/12/24 | 113724 | systems/texlive/tlnet/archive/texlive-scripts.r65337.tar.xz
+2022/12/24 | 1195294 | info/biblio/typeset.bib
+2022/12/24 | 1151196 | support/TeX4ht/source/tex4ht-4ht.tex
2022/12/24 | 11085932 | systems/texlive/tlnet/archive/pstricks.doc.r65346.tar.xz
2022/12/24 | 1098 | macros/latex/contrib/gradient-text/gradient-text.sty
2022/12/24 | 1093476 | systems/texlive/tlnet/archive/markdown.doc.r65346.tar.xz
@@ -69,7 +212,6 @@
2022/12/24 | 10136 | systems/texlive/tlnet/archive/luakeys.r65346.tar.xz
2022/12/23 | 9 | macros/latex/contrib/saveenv/DEPENDS.txt
2022/12/23 | 957 | systems/win32/miktex/tm/packages/pr.ini
-2022/12/23 | 936 | systems/texlive/tlnet/archive/collection-luatex.r65333.tar.xz
2022/12/23 | 929724 | macros/generic/markdown/markdown.pdf
2022/12/23 | 88428 | systems/win32/miktex/tm/packages/next/miktex-png-bin-x64-2.9.tar.lzma
2022/12/23 | 8827 | systems/win32/miktex/tm/packages/next/miktex-md5-bin-x64-2.9.tar.lzma
@@ -95,7 +237,6 @@
2022/12/23 | 759352 | systems/win32/miktex/tm/packages/next/miktex-ptex-bin-x64.tar.lzma
2022/12/23 | 751958 | systems/win32/miktex/tm/packages/files.csv.lzma
2022/12/23 | 751921 | systems/win32/miktex/tm/packages/next/files.csv.lzma
-2022/12/23 | 7465 | systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl
2022/12/23 | 74355 | systems/win32/miktex/tm/packages/next/miktex-web-bin-x64-2.9.tar.lzma
2022/12/23 | 73971 | systems/win32/miktex/tm/packages/next/miktex-lzma-bin-x64-2.9.tar.lzma
2022/12/23 | 738728 | macros/latex/contrib/tagpdf/tagpdf.pdf
@@ -118,7 +259,6 @@
2022/12/23 | 637422 | systems/win32/miktex/tm/packages/next/miktex-yap-bin-x64-2.9.tar.lzma
2022/12/23 | 6343 | systems/win32/miktex/tm/packages/unimath-plain-xetex__source.tar.lzma
2022/12/23 | 62787 | systems/win32/miktex/tm/packages/next/miktex-fmt-bin-x64-2.9.tar.lzma
-2022/12/23 | 622202 | support/TeX4ht/source/tex4ht-html4.tex
2022/12/23 | 61772 | systems/win32/miktex/tm/packages/next/miktex-ttf2pk2-bin-x64-2.9.tar.lzma
2022/12/23 | 61066 | macros/luatex/generic/luakeys/luakeys-doc.tex
2022/12/23 | 602730 | systems/win32/miktex/tm/packages/next/miktex-libressl-bin-x64-2.9.tar.lzma
@@ -216,7 +356,6 @@
2022/12/23 | 2150 | macros/latex/contrib/tagpdf/ex-mc-manual-para-split-obsolete.tex
2022/12/23 | 2144330 | macros/latex/contrib/tagpdf.zip
2022/12/23 | 213714 | systems/win32/miktex/tm/packages/next/miktex-omegaware-bin-x64-2.9.tar.lzma
-2022/12/23 | 213252 | support/TeX4ht/source/ChangeLog
2022/12/23 | 21103 | macros/xetex/plain/unimath-plain-xetex/tex/unimath-plain-xetex.tex
2022/12/23 | 21067 | macros/latex/contrib/tagpdf/ex-patch-sectioning-memoir.pdf
2022/12/23 | 209199 | systems/win32/miktex/tm/packages/next/miktex-metafont-bin-x64-2.9.tar.lzma
@@ -481,40 +620,3 @@
2022/12/19 | 1061956 | systems/texlive/tlnet/archive/kpathsea.doc.r65309.tar.xz
2022/12/19 | 1047736 | macros/unicodetex/latex/bithesis/bithesis.pdf
2022/12/19 | 1028 | macros/latex/contrib/xput/doc/1x1.pdf
-2022/12/18 | 958 | macros/latex/contrib/bibcop/bibcop.1
-2022/12/18 | 8400 | graphics/pstricks/contrib/pst-flags/doc/amm-pst-doc.cls
-2022/12/18 | 777388 | systems/texlive/tlnet/archive/uplatex.doc.r65305.tar.xz
-2022/12/18 | 6136 | systems/texlive/tlnet/archive/bibcop.r65306.tar.xz
-2022/12/18 | 598724 | systems/texlive/tlnet/archive/l3kernel.source.r65299.tar.xz
-2022/12/18 | 5416 | systems/texlive/tlnet/archive/bibcop.source.r65306.tar.xz
-2022/12/18 | 5100 | macros/latex/contrib/bibcop/bibcop-logo.pdf
-2022/12/18 | 50748 | systems/texlive/tlnet/archive/uplatex.source.r65305.tar.xz
-2022/12/18 | 45724 | systems/texlive/tlnet/archive/l3packages.source.r65300.tar.xz
-2022/12/18 | 42 | macros/latex/contrib/bibcop/DEPENDS.txt
-2022/12/18 | 41988 | systems/texlive/tlnet/archive/platex.r65305.tar.xz
-2022/12/18 | 3844 | systems/texlive/tlnet/archive/nodetree.source.r65298.tar.xz
-2022/12/18 | 358591 | macros/latex/contrib/bibcop.zip
-2022/12/18 | 353928 | systems/texlive/tlnet/archive/bibcop.doc.r65306.tar.xz
-2022/12/18 | 3445 | graphics/pstricks/contrib/pst-flags/README.md
-2022/12/18 | 342237 | macros/latex/contrib/bibcop/bibcop.pdf
-2022/12/18 | 3288070 | graphics/pstricks/contrib/pst-flags.zip
-2022/12/18 | 273576 | systems/texlive/tlnet/archive/nodetree.doc.r65298.tar.xz
-2022/12/18 | 2618 | macros/latex/contrib/bibcop/bibcop.ins
-2022/12/18 | 2536 | macros/latex/contrib/bibcop/README.md
-2022/12/18 | 237934 | graphics/pstricks/contrib/pst-flags/tex/pst-flags.sty
-2022/12/18 | 21924 | systems/texlive/tlnet/archive/l3packages.r65300.tar.xz
-2022/12/18 | 1983 | macros/latex/contrib/ibrackets/ibrackets.ins
-2022/12/18 | 1974544 | systems/texlive/tlnet/archive/platex.doc.r65305.tar.xz
-2022/12/18 | 1832216 | systems/texlive/tlnet/archive/l3packages.doc.r65300.tar.xz
-2022/12/18 | 18258 | macros/latex/contrib/bibcop/bibcop.pl
-2022/12/18 | 174484 | systems/texlive/tlnet/archive/l3kernel.r65299.tar.xz
-2022/12/18 | 16646 | graphics/pstricks/contrib/pst-flags/tex/pst-flags-colors-html.sty
-2022/12/18 | 14836 | systems/texlive/tlnet/archive/uplatex.r65305.tar.xz
-2022/12/18 | 1416644 | graphics/pstricks/contrib/pst-flags/doc/pst-flags-doc.pdf
-2022/12/18 | 139604 | systems/texlive/tlnet/archive/platex.source.r65305.tar.xz
-2022/12/18 | 13549 | graphics/pstricks/contrib/pst-flags/doc/pst-flags-examples.tex
-2022/12/18 | 13414 | macros/latex/contrib/bibcop/bibcop.dtx
-2022/12/18 | 12880 | systems/texlive/tlnet/archive/nodetree.r65298.tar.xz
-2022/12/18 | 11938520 | systems/texlive/tlnet/archive/l3kernel.doc.r65299.tar.xz
-2022/12/18 | 11387 | graphics/pstricks/contrib/pst-flags/doc/pst-flags-doc.tex
-2022/12/18 | 1078 | macros/latex/contrib/bibcop/LICENSE.txt
diff --git a/biblio/citation-style-language/CHANGELOG.md b/biblio/citation-style-language/CHANGELOG.md
index 1f5bc98a69..3e7cfa0243 100644
--- a/biblio/citation-style-language/CHANGELOG.md
+++ b/biblio/citation-style-language/CHANGELOG.md
@@ -7,6 +7,26 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [Unreleased]
+## [v0.3.0] - 2022-12-25
+
+### Added
+
+- Add author only command `\citeauthor`.
+- Add narrative citation commands `\textcite` and `\citet` ([#17](https://github.com/zepinglee/citeproc-lua/issues/17)).
+- Add parenthetical citation commands `\parencite` and `\citep` for compatibility.
+
+### Changed
+
+- The "-locator" suffixes are removed from the `article-locator` and `title-locator` options.
+- The LaTeX markups in citation prefix is now correctly precessed ([#33](https://github.com/zepinglee/citeproc-lua/issues/33)).
+
+### Fixed
+
+- Fix an error in checking the plurity of `number-of-pages` ([#27](https://github.com/zepinglee/citeproc-lua/issues/27)).
+- Fix an error in converting value `"2nd"` to its ordinal form ([#27](https://github.com/zepinglee/citeproc-lua/issues/27)).
+- Fix missing DOI prefix when used with `hyperref` ([#28](https://github.com/zepinglee/citeproc-lua/issues/28)).
+- Fix special characters (`#` and `%`) in URL ([#30](https://github.com/zepinglee/citeproc-lua/issues/30)).
+
## [v0.2.2] - 2022-09-23
### Fixed
@@ -63,7 +83,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Initial CTAN release.
-[Unreleased]: https://github.com/zepinglee/citeproc-lua/compare/v0.2.2...HEAD
+[Unreleased]: https://github.com/zepinglee/citeproc-lua/compare/v0.3.0...HEAD
+[v0.3.0]: https://github.com/zepinglee/citeproc-lua/compare/v0.2.2...0.3.0
[v0.2.2]: https://github.com/zepinglee/citeproc-lua/compare/v0.2.1...0.2.2
[v0.2.1]: https://github.com/zepinglee/citeproc-lua/compare/v0.2.0...0.2.1
[v0.2.0]: https://github.com/zepinglee/citeproc-lua/compare/v0.1.1...0.2.0
diff --git a/biblio/citation-style-language/citation-style-language-doc.pdf b/biblio/citation-style-language/citation-style-language-doc.pdf
index f94a5152e5..c0bae30d9e 100644
--- a/biblio/citation-style-language/citation-style-language-doc.pdf
+++ b/biblio/citation-style-language/citation-style-language-doc.pdf
Binary files differ
diff --git a/biblio/citation-style-language/citation-style-language-doc.tex b/biblio/citation-style-language/citation-style-language-doc.tex
index 2b5bc99058..83557185c4 100644
--- a/biblio/citation-style-language/citation-style-language-doc.tex
+++ b/biblio/citation-style-language/citation-style-language-doc.tex
@@ -49,7 +49,7 @@
}%
}
-\date{2022-09-23 v0.2.2}
+\date{2022-12-25 v0.3.0}
\maketitle
@@ -290,16 +290,16 @@ An example is as follows.
\label{tab:locators}
\begin{tabular}{lll}
\toprule
- \opt{act} & \opt{folio} & \opt{section} \\
- \opt{appendix} & \opt{issue} & \opt{sub-verbo} \\
- \opt{article-locator} & \opt{line} & \opt{supplement} \\
- \opt{book} & \opt{note} & \opt{table} \\
- \opt{canon} & \opt{opus} & \opt{timestamp} \\
- \opt{chapter} & \opt{page} & \opt{title-locator} \\
- \opt{column} & \opt{paragraph} & \opt{verse} \\
- \opt{elocation} & \opt{part} & \opt{version} \\
- \opt{equation} & \opt{rule} & \opt{volume} \\
- \opt{figure} & \opt{scene} & \\
+ \opt{act} & \opt{folio} & \opt{section} \\
+ \opt{appendix} & \opt{issue} & \opt{sub-verbo} \\
+ \opt{article} & \opt{line} & \opt{supplement} \\
+ \opt{book} & \opt{note} & \opt{table} \\
+ \opt{canon} & \opt{opus} & \opt{timestamp} \\
+ \opt{chapter} & \opt{page} & \opt{title} \\
+ \opt{column} & \opt{paragraph} & \opt{verse} \\
+ \opt{elocation} & \opt{part} & \opt{version} \\
+ \opt{equation} & \opt{rule} & \opt{volume} \\
+ \opt{figure} & \opt{scene} & \\
\bottomrule
\end{tabular}
\end{table}
@@ -310,11 +310,32 @@ recommended.
If only one optional argument is provided, it is treated as \meta{postnote}.
The \meta{postnote} is used as a page locator if it consists of only digits.
-For author-date styles, there are also narrative in-text citations where the
-author names appear in running text and only dates are enclosed in parentheses
-(\cs{citet} in \pkg{natbib} pacakge or \cs{textcite} in \pkg{biblatex}).
-However such cite command in this pakcage is not available at the momment and
-it will be implemented in the next release.
+\begin{function}{\parencite,\citep}
+ \begin{syntax}
+ \cs{parencite}\oarg{options}\marg{keys}
+ \end{syntax}
+\end{function}
+
+The \cs{parencite} and \cs{citep} command are aliases of \cs{cite}.
+They are added for compatibility with \pkg{biblatex} and \pkg{natbib} packages.
+If the citation format defined in the CSL style does not have affixes,
+these commands in \pkg{citation-style-language} do not enclose the output with
+brackets, which is different from other packages.
+
+\begin{function}{\textcite,\citet}
+ \begin{syntax}
+ \cs{textcite}\oarg{options}\marg{keys}
+ \end{syntax}
+\end{function}
+
+\DescribeOption{infix}
+These commands proceduce narrative in-text citation where the author name is
+part of the running text followed by the year in parentheses.
+These commands only work with author-date styles.
+An extra option \opt{infix} can be given to specify the text inserted between
+then author and year parts. For example, “Kesey’s early work (1962)” can be
+produced by |\textcite[infix={'s early work}]{ITEM-1}|.
+By default the infix is a space.
\begin{function}{\cites}
\begin{syntax}
@@ -332,6 +353,18 @@ scanning process. The following example illustrates its usage.
\cites[prefix = {See }, page = 6]{key1}[section = 2.3]{key2}\relax [Text]
\end{LaTeXdemo}
+\begin{function}{\citeauthor}
+ \begin{syntax}
+ \cs{citeauthor}\marg{key}
+ \end{syntax}
+\end{function}
+
+This command prints the author name.
+If the orginal citation does not contain the author name (e.g., a numeric
+style), an optional |<intext>| element can be suppplied as a sibling to the
+|<citation>| and |<bibliography>| elements in the CSL style (see
+\href{https://citeproc-js.readthedocs.io/en/latest/running.html#citation-flags-with-processcitationcluster}{citeproc-js's documentation} for details).
+
\begin{function}{\nocite}
\begin{syntax}
\cs{nocite}\marg{keys}
diff --git a/biblio/citation-style-language/citation-style-language.sty b/biblio/citation-style-language/citation-style-language.sty
index 30aaefdf42..7d0daab99e 100644
--- a/biblio/citation-style-language/citation-style-language.sty
+++ b/biblio/citation-style-language/citation-style-language.sty
@@ -9,7 +9,7 @@
\RequirePackage{expl3}
\RequirePackage{xparse}
-\ProvidesExplPackage {citation-style-language} {2022-09-23} {v0.2.2}
+\ProvidesExplPackage {citation-style-language} {2022-12-25} {v0.3.0}
{Citation Style Language for LaTeX}
\RequirePackage { l3keys2e }
@@ -34,6 +34,15 @@
}
\__csl_load_check:n
+
+% Check l3build regression-test
+\bool_new:N \l__csl_regression_test_bool
+% \if_meaning:w \ASSERT \@undefined
+% \else
+% \bool_set_true:N \l__csl_regression_test_bool
+% \fi
+
+
\sys_if_engine_luatex:T
{ \lua_now:n { csl = require("citeproc-latex") } }
@@ -47,58 +56,109 @@
\DeclareDocumentCommand \cite { o o m }
{ \__csl_cite:nnn {#1} {#2} {#3} }
+\NewDocumentCommand \parencite { o o m }
+ { \__csl_cite:nnn {#1} {#2} {#3} }
+
+\NewDocumentCommand \citep { o o m }
+ { \__csl_cite:nnn {#1} {#2} {#3} }
+
+\NewDocumentCommand \textcite { o o m }
+ { \__csl_text_cite:nnn {#1} {#2} {#3} }
+
+\NewDocumentCommand \citet { o o m }
+ { \__csl_text_cite:nnn {#1} {#2} {#3} }
+
% \cites[⟨prenote⟩][⟨postnote⟩]{⟨key⟩}...[⟨prenote⟩][⟨postnote⟩]{⟨key⟩}
\NewDocumentCommand \cites { }
{ \__csl_cites: }
+\NewDocumentCommand \citeauthor { o o m }
+ { \__csl_cite_author:nnn {#1} {#2} {#3} }
+
\seq_new:N \l__csl_cite_keys_seq
-\seq_new:N \l__csl_cite_items_seq
+\seq_new:N \l__csl_citation_items_seq
+\prop_new:N \l__csl_citation_properties_prop
+\prop_new:N \l__csl_citation_info_prop
\cs_new:Npn \__csl_cite:nnn #1#2#3
{
\seq_clear:N \l__csl_cite_keys_seq
- \seq_clear:N \l__csl_cite_items_seq
- \__csl_process_cite_items:nnn {#1} {#2} {#3}
- \__csl_make_citation:NN \l__csl_cite_keys_seq \l__csl_cite_items_seq
+ \seq_clear:N \l__csl_citation_items_seq
+ \prop_clear:N \l__csl_citation_properties_prop
+ \__csl_process_cite_input:nnn {#1} {#2} {#3}
+ \__csl_process_citation_info:NN \l__csl_cite_keys_seq \l__csl_citation_items_seq
+ \__csl_make_citation:N \l__csl_citation_info_prop
+ }
+
+
+\cs_new:Npn \__csl_text_cite:nnn #1#2#3
+ {
+ \seq_clear:N \l__csl_cite_keys_seq
+ \seq_clear:N \l__csl_citation_items_seq
+ \prop_clear:N \l__csl_citation_properties_prop
+ \__csl_process_cite_input:nnn {#1} {#2} {#3}
+ \__csl_process_citation_info:NN \l__csl_cite_keys_seq \l__csl_citation_items_seq
+ \prop_put:Nnn \l__csl_citation_properties_prop { noteIndex } { 0 }
+ \prop_put:Nnn \l__csl_citation_properties_prop { mode } { composite }
+ % \bool_set_false:N \l__csl_note_bool
+ \__csl_make_citation:N \l__csl_citation_info_prop
}
\cs_new:Npn \__csl_cites:
{
\seq_clear:N \l__csl_cite_keys_seq
- \seq_clear:N \l__csl_cite_items_seq
+ \seq_clear:N \l__csl_citation_items_seq
+ \prop_clear:N \l__csl_citation_properties_prop
\__csl_next_cites:nnn
}
\NewDocumentCommand \__csl_next_cites:nnn { o o g }
{
\tl_if_novalue:nTF {#3}
- { \__csl_make_citation:NN \l__csl_cite_keys_seq \l__csl_cite_items_seq }
{
- \__csl_process_cite_items:nnn {#1} {#2} {#3}
+ \__csl_process_citation_info:NN \l__csl_cite_keys_seq \l__csl_citation_items_seq
+ \__csl_make_citation:N \l__csl_citation_info_prop
+ }
+ {
+ \__csl_process_cite_input:nnn {#1} {#2} {#3}
\__csl_next_cites:nnn
}
}
+\cs_new:Npn \__csl_cite_author:nnn #1#2#3
+ {
+ \seq_clear:N \l__csl_cite_keys_seq
+ \seq_clear:N \l__csl_citation_items_seq
+ \prop_clear:N \l__csl_citation_properties_prop
+ \__csl_process_cite_input:nnn {#1} {#2} {#3}
+ \__csl_process_citation_info:NN \l__csl_cite_keys_seq \l__csl_citation_items_seq
+ \prop_put:Nnn \l__csl_citation_properties_prop { noteIndex } { 0 }
+ \prop_put:Nnn \l__csl_citation_properties_prop { mode } { author-only }
+ \bool_set_false:N \l__csl_note_bool
+ \__csl_make_citation:N \l__csl_citation_info_prop
+ }
+
+
% Appends the cite key into \l__csl_cite_keys_seq and cite-items into
-% \l__csl_cite_items_seq
+% \l__csl_citation_items_seq
% #1, #2: prenote/postnote
% #3: keys
-\cs_new:Npn \__csl_process_cite_items:nnn #1#2#3
+\cs_new:Npn \__csl_process_cite_input:nnn #1#2#3
{
\tl_if_novalue:nTF {#2}
{
\tl_if_novalue:nTF {#1}
- { \__csl_process_cite_items_aux:nnn { } { } {#3} }
- { \__csl_process_cite_items_aux:nnn { } {#1} {#3} }
+ { \__csl_process_cite_input_aux:nnn { } { } {#3} }
+ { \__csl_process_cite_input_aux:nnn { } {#1} {#3} }
}
- { \__csl_process_cite_items_aux:nnn {#1} {#2} {#3} }
+ { \__csl_process_cite_input_aux:nnn {#1} {#2} {#3} }
}
-\cs_new:Npn \__csl_process_cite_items_aux:nnn #1#2#3
+\cs_new:Npn \__csl_process_cite_input_aux:nnn #1#2#3
% #1: prenote, #2: postnote, #3: keys
% Return: "{id={ITEM-1},{locator=6},...}, {id={ITEM-2},...}, ..."
{
@@ -120,7 +180,7 @@
\cs_new:Npn \__csl_process_cite_item:nnn #1#2#3
% #1: prenote, #2: postnote, #3: key
- % Save "{id={ITEM},locator={42},label={page}}" into \l__csl_cite_items_seq
+ % Save "{id={ITEM},locator={42},label={page}}" into \l__csl_citation_items_seq
{
\prop_clear:N \l__csl_cite_item_prop
\prop_put:Nnn \l__csl_cite_item_prop { id } {#3}
@@ -148,11 +208,10 @@
}
}
}
- \seq_clear:N \l_tmpa_seq
- \prop_map_inline:Nn \l__csl_cite_item_prop
- { \seq_put_right:Nn \l_tmpa_seq { ##1 = {##2} } }
- \seq_put_right:Nx \l__csl_cite_items_seq
- { { \seq_use:Nn \l_tmpa_seq { , } } }
+ \__csl_serialize_prop:NN \l__csl_cite_item_prop \l_tmpa_tl
+ \tl_put_left:NV \l_tmpa_tl { \c_left_brace_str }
+ \tl_put_right:NV \l_tmpa_tl { \c_right_brace_str }
+ \seq_put_right:NV \l__csl_citation_items_seq \l_tmpa_tl
}
\cs_new:Npn \__csl_set_locator:nn #1#2
@@ -170,9 +229,10 @@
suppress-author .prop_put:N = \l__csl_cite_item_prop,
author-only .prop_put:N = \l__csl_cite_item_prop,
uris .prop_put:N = \l__csl_cite_item_prop,
+ % Locators.
act .code:n = { \__csl_set_locator:nn { act } {#1} } ,
appendix .code:n = { \__csl_set_locator:nn { appendix } {#1} } ,
- article-locator .code:n = { \__csl_set_locator:nn { article-locator } {#1} } ,
+ article .code:n = { \__csl_set_locator:nn { article-locator } {#1} } ,
book .code:n = { \__csl_set_locator:nn { book } {#1} } ,
canon .code:n = { \__csl_set_locator:nn { canon } {#1} } ,
chapter .code:n = { \__csl_set_locator:nn { chapter } {#1} } ,
@@ -195,50 +255,74 @@
supplement .code:n = { \__csl_set_locator:nn { supplement } {#1} } ,
table .code:n = { \__csl_set_locator:nn { table } {#1} } ,
timestamp .code:n = { \__csl_set_locator:nn { timestamp } {#1} } ,
- title-locator .code:n = { \__csl_set_locator:nn { title-locator } {#1} } ,
+ title .code:n = { \__csl_set_locator:nn { title-locator } {#1} } ,
verse .code:n = { \__csl_set_locator:nn { verse } {#1} } ,
version .code:n = { \__csl_set_locator:nn { version } {#1} } ,
volume .code:n = { \__csl_set_locator:nn { volume } {#1} } ,
+ % Citation properties
+ infix .prop_put:N = \l__csl_citation_properties_prop,
}
\tl_new:N \l__csl_citation_id_tl
\tl_new:N \l__csl_cite_items_tl
\tl_new:N \l__csl_note_index_tl
+
+% Load the cite keys and prepare:
+% - \l__csl_citation_id_tl
+% - \l__csl_citation_properties_prop
+%
+% #1: \l__csl_cite_keys_seq
+% #2: \l__csl_citation_items_seq
+\cs_new:Npn \__csl_process_citation_info:NN #1#2
+ {
+ \__csl_process_citation_id:NN \l__csl_citation_id_tl #1
+ \__csl_get_note_index:N \l__csl_note_index_tl
+ \prop_put:NnV \l__csl_citation_properties_prop { noteIndex } \l__csl_note_index_tl
+ }
+
+
\tl_new:N \l__csl_citation_info_tl
\tl_new:N \l__csl_citation_tl
\prop_new:N \g__csl_citations_prop
-\prop_clear:N \l__csl_citation_prop
-\cs_new:Npn \__csl_make_citation:NN #1#2
- % #1: \l__csl_cite_keys_seq
- % #2: \l__csl_cite_items_seq
+\tl_new:N \l__csl_citation_properties_tl
+
+% Write citation info to aux and print the citation contents.
+% #1: \l__csl_citation_info_prop
+\cs_new:Npn \__csl_make_citation:N #1
{
- \prop_clear:N \l__csl_citation_prop
- \__csl_process_citation_id:NN \l__csl_citation_id_tl #1
- \prop_put:NnV \l__csl_citation_prop { citationID } \l__csl_citation_id_tl
- \tl_set:Nx \l__csl_cite_items_tl
- { \seq_use:Nn #2 { , } }
- \prop_put:NnV \l__csl_citation_prop { citationItems } \l__csl_cite_items_tl
- \__csl_get_note_index:N \l__csl_note_index_tl
- \prop_put:Nnx \l__csl_citation_prop { properties } { noteIndex = { \l__csl_note_index_tl } }
- \tl_clear:N \l__csl_citation_info_tl
- \prop_map_inline:Nn \l__csl_citation_prop
- {
- \tl_if_empty:NF \l__csl_citation_info_tl
- { \tl_put_right:Nn \l__csl_citation_info_tl { , } }
- \tl_put_right:Nn \l__csl_citation_info_tl { ##1 = { ##2 } }
- }
+ \prop_clear:N \l__csl_citation_info_prop
+ % citationID
+ \prop_put:NnV \l__csl_citation_info_prop { citationID } \l__csl_citation_id_tl
+ % citationItems
+ \__csl_serialize_seq:NN \l__csl_citation_items_seq \l__csl_cite_items_tl
+ \prop_put:NnV \l__csl_citation_info_prop { citationItems } \l__csl_cite_items_tl
+ % properties
+ \__csl_serialize_prop:NN \l__csl_citation_properties_prop \l__csl_citation_properties_tl
+ \prop_put:NnV \l__csl_citation_info_prop { properties } \l__csl_citation_properties_tl
+ \__csl_serialize_prop:NN \l__csl_citation_info_prop \l__csl_citation_info_tl
+ % Write to .aux file
+ % \tl_show:N \l__csl_citation_info_tl
\exp_args:NV \__csl_write_aux_citation:n \l__csl_citation_info_tl
+ \bool_if:NT \l__csl_regression_test_bool
+ { \tl_show:N \l__csl_citation_info_tl }
+ % Print the citation string
\prop_get:NVNTF \g__csl_citations_prop \l__csl_citation_id_tl
\l__csl_citation_tl
- { \exp_args:NV \__csl_print_citation:n \l__csl_citation_tl }
+ { \__csl_print_citation:N \l__csl_citation_tl }
{
\bool_if:NTF \l__csl_engine_initialized_bool
{
- \tl_set:Nf \l__csl_citation_tl
- { \lua_now:e { csl.cite("\l__csl_citation_info_tl") } }
- \exp_args:NV \__csl_print_citation:n \l__csl_citation_tl
+ % \tl_show:N \l__csl_citation_info_tl
+ % \tl_set:Nf \l__csl_citation_tl
+ % { \exp_args:NV \__csl_cite_aux:n \l__csl_citation_info_tl }
+ \group_begin:
+ \char_set_catcode_other:N \%
+ \char_set_catcode_other:N \#
+ \exp_args:NV \__csl_cite_aux:n \l__csl_citation_info_tl
+ \__csl_print_citation:N \l__csl_citation_tl
+ \group_end:
}
{
\exp_args:Nx \__csl_print_undefined_citation:n
@@ -247,6 +331,34 @@
}
}
+\cs_new:Npn \__csl_cite_aux:n #1
+ { \lua_now:e { csl.cite("\lua_escape:n {#1}") } }
+
+% #1: seq
+% #2: tl
+\cs_new:Npn \__csl_serialize_seq:NN #1#2
+ {
+ \tl_clear:N #2
+ \seq_map_inline:Nn #1
+ {
+ \tl_if_empty:NF #2
+ { \tl_put_right:Nn #2 { , } }
+ \tl_put_right:Nn #2 { ##1 }
+ }
+ }
+
+% #1: prop
+% #2: tl
+\cs_new:Npn \__csl_serialize_prop:NN #1#2
+ {
+ \tl_clear:N #2
+ \prop_map_inline:Nn #1
+ {
+ \tl_if_empty:NF #2
+ { \tl_put_right:Nn #2 { , } }
+ \tl_put_right:Nn #2 { ##1 = { ##2 } }
+ }
+ }
\tl_new:N \l__csl_cite_keys_tl
\tl_new:N \l__csl_citation_count_tl
@@ -260,6 +372,8 @@
{
\tl_set:Nx \l__csl_cite_keys_tl
{ \seq_use:Nn #2 { , } }
+ % \prop_show:N \g__csl_citations_count_prop
+ % \tl_show:N \l__csl_cite_keys_tl
\prop_get:NVNTF \g__csl_citations_count_prop \l__csl_cite_keys_tl
\l__csl_citation_count_tl
{
@@ -274,18 +388,31 @@
}
+\int_new:N \g__csl_pseudo_note_index_int
+\int_gset:Nn \g__csl_pseudo_note_index_int { 0 }
+
% Save the note number to \l__csl_note_index_tl
% TODO: multiple citations in a note
\cs_new:Npn \__csl_get_note_index:N #1
% #1: \l__csl_note_index_tl
{
- \bool_if:NTF \l__csl_note_style_bool
+ \bool_if:NTF \l__csl_note_bool
{
\int_set_eq:Nc \l_tmpa_int { c@ \@mpfn }
\int_incr:N \l_tmpa_int
\tl_set:Nx #1 { \int_use:N \l_tmpa_int }
}
- { \tl_set:Nn #1 { 0 } }
+ {
+ \tl_if_empty:NTF \l__csl_class_tl
+ {
+ % The style class (in-text/note) is undetermined.
+ \int_set_eq:Nc \l_tmpa_int { c@ \@mpfn }
+ \int_gincr:N \g__csl_pseudo_note_index_int
+ \int_add:Nn \l_tmpa_int { \g__csl_pseudo_note_index_int }
+ \tl_set:Nx #1 { \int_use:N \l_tmpa_int }
+ }
+ { \tl_set:Nx #1 { 0 } }
+ }
}
@@ -293,43 +420,30 @@
% #1: citation info "{<citationID>}{{id=ITEM-1},{id=ITEM-2}}{<noteIndex>}"
{
\if@filesw
- \iow_now:Nx \@auxout
- { \token_to_str:N \citation { #1 } }
+ \iow_now:Nn \@auxout { \citation {#1} }
\fi
}
-% \cs_new:Npn \__csl_print_citation:n #1
-% % #1: citation text
-% {
-% \bool_if:NTF \l__csl_note_style_bool
-% {
-% \footnote {#1}
-% }
-% {#1}
-% }
-
-\cs_new:Npn \__csl_print_citation:n #1
- % #1: "{<type>}{<citation text>}"
- { \__csl_print_citation_aux:nn #1 }
-
-\cs_new:Npn \__csl_print_citation_aux:nn #1#2
- % #1: citation type, "in-text" or "note"
- % #2: citation text
+% #1: \l__csl_citation_tl
+\cs_new:Npn \__csl_print_citation:N #1
{
- \tl_set:Nn \l__csl_citation_tl {#2}
- \tl_if_eq:nnTF {#1} { note }
- { \footnote {#2} }
- {#2}
+ \bool_if:NT \l__csl_regression_test_bool
+ { \tl_show:N #1 }
+ \bool_if:NTF \l__csl_note_bool
+ { \footnote {#1} }
+ {#1}
}
\cs_new:Npn \__csl_print_undefined_citation:n #1
% #1: keys
{
- \tl_set:Nn \l__csl_citation_tl { [ \textbf {#1} ] }
\G@refundefinedtrue
\msg_warning:nnn { citation-style-language } { citation / undefined } {#1}
+ \tl_set:Nn \l__csl_citation_tl { [ \textbf {#1} ] }
+ \bool_if:NT \l__csl_regression_test_bool
+ { \tl_show:N \l__csl_citation_tl }
\group_begin:
\reset@font [ \textbf {#1} ]
\group_end:
@@ -346,19 +460,24 @@
\cs_new:Npn \__csl_no_cite:n #1
{
\seq_clear:N \l__csl_cite_keys_seq
- \seq_clear:N \l__csl_cite_items_seq
- \__csl_process_cite_items:nnn { } { } {#1}
+ \seq_clear:N \l__csl_citation_items_seq
+ \__csl_process_cite_input:nnn { } { } {#1}
\tl_set:Nx \l__csl_cite_items_tl
- { \seq_use:Nn \l__csl_cite_items_seq { , } }
+ { \seq_use:Nn \l__csl_citation_items_seq { , } }
\tl_set:Nx \l__csl_citation_info_tl
{
citationID = { @nocite } ,
citationItems = { \l__csl_cite_items_tl } ,
properties = { noteIndex = { 0 } }
}
+ \bool_if:NT \l__csl_regression_test_bool
+ { \tl_show:N \l__csl_citation_info_tl }
\exp_args:NV \__csl_no_cite_write_aux:n \l__csl_citation_info_tl
\sys_if_engine_luatex:T
{ \lua_now:n { csl.nocite("#1") } }
+ \tl_clear:N \l__csl_citation_tl
+ \bool_if:NT \l__csl_regression_test_bool
+ { \tl_show:N \l__csl_citation_tl }
}
@@ -369,9 +488,7 @@
\AtBeginDocument
{ \exp_args:Nx \__csl_write_aux_citation:n { #1 } }
}
- {
- \exp_args:Nx \__csl_write_aux_citation:n { #1 }
- }
+ { \exp_args:Nx \__csl_write_aux_citation:n { #1 } }
}
@@ -396,10 +513,10 @@
\cs_new:Npn \cslcite #1#2
{
- \bibcite {#1} {#2}
% \if@filesw
- % \iow_now:Nx \@auxout { \token_to_str:N \bibcite {#1} {#2} }
+ % \iow_now:Nn \@auxout { \bibcite {#1} {#2} }
% \fi
+ \bibcite {#1} {#2}
}
@@ -411,22 +528,22 @@
\NewDocumentCommand \printbibliography { O { } }
{
- \sys_if_engine_luatex:TF
+ \sys_if_engine_luatex:T
{
- \bool_if:NTF \l__csl_engine_initialized_bool
+ \bool_if:NT \l__csl_engine_initialized_bool
{
\__csl_collect_bibliography:n { \lua_now:n { csl.bibliography() } }
- % \tl_show:N \g__csl_bibliography_tl
- \tl_use:N \g__csl_bibliography_tl
}
- { \msg_warning:nnn { citation-style-language } { bibliography / empty } }
}
+ \tl_if_empty:NTF \g__csl_bibliography_tl
+ { \msg_warning:nn { citation-style-language } { bibliography / empty } }
{
- \tl_if_empty:NTF \g__csl_bibliography_tl
- { \msg_warning:nnn { citation-style-language } { bibliography / empty } }
+ \bool_if:NT \l__csl_regression_test_bool
{
- \tl_use:N \g__csl_bibliography_tl
+ \seq_set_split:NnV \l__csl_bibliography_seq { \par } \g__csl_bibliography_tl
+ \seq_show:N \l__csl_bibliography_seq
}
+ \tl_use:N \g__csl_bibliography_tl
}
}
@@ -435,6 +552,8 @@
\tl_new:N \l__csl_style_tl
+\tl_new:N \l__csl_class_tl
+\bool_new:N \l__csl_note_bool
\clist_new:N \l__csl_bib_resources_clist
\tl_new:N \l__csl_prefix_separator_tl
\tl_new:N \l__csl_suffix_separator_tl
@@ -449,7 +568,14 @@
\keys_define:nn { csl }
{
+ regression-test .bool_set:N = \l__csl_regression_test_bool ,
style .tl_set:N = \l__csl_style_tl ,
+ class .code:n =
+ {
+ \tl_set:Nn \l__csl_class_tl {#1}
+ \tl_if_eq:NnT \l__csl_class_tl { note }
+ { \bool_set_true:N \l__csl_note_bool }
+ } ,
prefix-separator .tl_set:N = \l__csl_prefix_separator_tl ,
suffix-separator .tl_set:N = \l__csl_suffix_separator_tl ,
locale .tl_set:N = \l__csl_locale_tl ,
@@ -593,6 +719,7 @@
\tl_new:N \g__csl_bibliography_tl
\tl_new:N \g__csl_bibliography_setup_tl
+\seq_new:N \l__csl_bibliography_seq
\AtBeginDocument { \__csl_at_begin_document_hook: }
@@ -602,12 +729,8 @@
{
\__csl_write_aux_info:
\sys_if_engine_luatex:TF
- {
- \__csl_initialize_lua_module:
- }
- {
- \__csl_load_bbl:
- }
+ { \__csl_initialize_lua_module: }
+ { \__csl_load_bbl: }
}
@@ -652,16 +775,16 @@
}
-\str_new:N \l__csl_style_class_str
+% \str_new:N \l__csl_style_class_str
% In-text (including numeric or author-date) or note style
-\bool_new:N \l__csl_note_style_bool
+% \bool_new:N \l__csl_note_style_bool
\cs_new:Npn \__csl_get_style_class: {
\bool_if:NT \l__csl_engine_initialized_bool
{
- \str_set:Nx \l__csl_style_class_str { \lua_now:n { csl.get_style_class() } }
- \str_if_eq:VnT \l__csl_style_class_str { note }
- { \bool_set_true:N \l__csl_note_style_bool }
+ \tl_set:Nx \l__csl_class_tl { \lua_now:n { csl.get_style_class() } }
+ \tl_if_eq:NnT \l__csl_class_tl { note }
+ { \bool_set_true:N \l__csl_note_bool }
}
}
@@ -692,16 +815,18 @@
% write to aux file
\prop_if_empty:NF \l__csl_options_clist
{
- \if@filesw
- \iow_now:Nx \@auxout
- {
- \token_to_str:N \csloptions
- { \clist_use:Nn \l__csl_options_clist { , } }
- }
- \fi
+ \exp_args:Nx \__csl_write_aux_options:n
+ { \clist_use:Nn \l__csl_options_clist { , } }
}
}
+\cs_new:Npn \__csl_write_aux_options:n #1
+ {
+ \if@filesw
+ \iow_now:Nn \@auxout { \csloptions {#1} }
+ \fi
+ }
+
% Load .bbl at the beginning of document to save one pass of latex.
% In this procedure, the \cslcite command is processed and the contents
@@ -711,16 +836,19 @@
% The \@input@ prints "No file ....bbl" in the .log file from which
% the latexmk decides to run $bibtex or not.
\__csl_collect_bibliography:n { \@input@ { \jobname .bbl } }
- % \file_if_exist_input:nF { \jobname .bbl }
- % {
- % \msg_warning:nnx { citation-style-language } { file / non-exist} { \jobname .bbl }
- % }
+ % Execute the \cslsetup part to set the style class.
+ % \tl_show:N \g__csl_bibliography_setup_tl
+ \tl_use:N \g__csl_bibliography_setup_tl
+ % \bool_show:N \l__csl_note_bool
}
% Collection the bibliography (as well as \cslsetup) into \g__csl_bibliography_setup_tl
\cs_new:Npn \__csl_collect_bibliography:n #1
{
\group_begin:
+ % URLs may contain "%" and "#" characters.
+ \char_set_catcode_other:N \%
+ \char_set_catcode_other:N \#
\RenewDocumentCommand \cslsetup { m }
{ \tl_gset:Nn \g__csl_bibliography_setup_tl { \cslsetup { ##1 } } }
\RenewDocumentEnvironment { thebibliography } { m +b }
@@ -780,6 +908,7 @@
\cs_new:Npn \__csl_write_aux_bibdata:n #1
{
\if@filesw
+ % Full expansion for files like \jobname.bib
\iow_now:Nx \@auxout { \token_to_str:N \csl@data {#1} }
\fi
}
@@ -1043,7 +1172,7 @@
{
\l__csl_bib_postamble_tl
\tl_set:Nn \@noitemerr
- { \msg_warning:nnn { citation-style-language } { bibliography / empty } }
+ { \msg_warning:nn { citation-style-language } { bibliography / empty } }
\endlist
\__csl_reset_bib_format:
}
@@ -1077,9 +1206,8 @@
{
\BlockquoteDisable
{
- \cs_set_eq:NN \__csl_make_citation:NN \use_none:nn
- % \sys_if_engine_luatex:T
- % { \lua_now:n { csl.preview_mode = true } }
+ \cs_set_eq:NN \__csl_process_citation_info:NN \use_none:nn
+ \cs_set_eq:NN \__csl_make_citation:N \use_none:n
}
}
diff --git a/biblio/citation-style-language/citeproc-bibtex-data.lua b/biblio/citation-style-language/citeproc-bibtex-data.lua
index c7b2ff1306..e5b4aa5a78 100644
--- a/biblio/citation-style-language/citeproc-bibtex-data.lua
+++ b/biblio/citation-style-language/citeproc-bibtex-data.lua
@@ -3,6 +3,12 @@
return {
description = "BibTeX CSL mapping",
types = {
+ abstract = {
+ csl = nil,
+ },
+ ancienttext = {
+ csl = "classic",
+ },
archival = {
csl = "collection",
},
@@ -12,6 +18,15 @@ return {
article = {
csl = "article-journal",
},
+ ["article-journal"] = {
+ csl = "article-journal",
+ },
+ ["article-magazine"] = {
+ csl = "article-magazine",
+ },
+ ["article-newspaper"] = {
+ csl = "article-newspaper",
+ },
artifactdataset = {
csl = "dataset",
},
@@ -33,21 +48,81 @@ return {
bibnote = {
csl = nil,
},
+ bill = {
+ csl = "bill",
+ },
book = {
csl = "book",
},
+ bookinarticle = {
+ csl = nil,
+ },
bookinbook = {
csl = "chapter",
},
+ bookincollection = {
+ csl = nil,
+ },
+ bookininarticle = {
+ csl = nil,
+ },
+ bookininbook = {
+ csl = nil,
+ },
+ bookinincollection = {
+ csl = nil,
+ },
+ bookininproceedings = {
+ csl = nil,
+ },
+ bookininreference = {
+ csl = nil,
+ },
+ bookinjournal = {
+ csl = nil,
+ },
+ bookinmathesis = {
+ csl = nil,
+ },
+ bookinphdthesis = {
+ csl = nil,
+ },
+ bookinproceedings = {
+ csl = nil,
+ },
+ bookinreference = {
+ csl = nil,
+ },
+ bookinthesis = {
+ csl = nil,
+ },
booklet = {
csl = "pamphlet",
},
+ broadcast = {
+ csl = "broadcast",
+ },
brochure = {
csl = "pamphlet",
},
- cconference = {
+ catalog = {
csl = nil,
},
+ cconference = {
+ csl = "paper-conference",
+ },
+ chapter = {
+ csl = "chapter",
+ },
+ classic = {
+ csl = "classic",
+ },
+ classictext = {
+ csl = "classic",
+ },
+ codefragment = {
+ csl = "software",
+ },
collection = {
csl = "book",
},
@@ -60,9 +135,18 @@ return {
commented = {
csl = nil,
},
+ committee = {
+ csl = nil,
+ },
conference = {
csl = "paper-conference",
},
+ conferencepaper = {
+ csl = "paper-conference",
+ },
+ constitution = {
+ csl = "legislation",
+ },
ctan = {
csl = "software",
},
@@ -84,54 +168,138 @@ return {
customf = {
csl = nil,
},
+ data = {
+ csl = nil,
+ },
database = {
csl = "dataset",
},
dataset = {
csl = "dataset",
},
+ degree = {
+ csl = nil,
+ },
dictionary = {
csl = "book",
},
docthesis = {
csl = "thesis",
},
+ document = {
+ csl = "document",
+ },
electronic = {
csl = "webpage",
},
+ entry = {
+ csl = "entry",
+ },
+ ["entry-dictionary"] = {
+ csl = "entry-dictionary",
+ },
+ ["entry-encyclopedia"] = {
+ csl = "entry-encyclopedia",
+ },
eulegislation = {
csl = "legislation",
},
+ event = {
+ csl = "event",
+ },
+ exhibcatalog = {
+ csl = nil,
+ },
+ figure = {
+ csl = "figure",
+ },
footnote = {
csl = nil,
},
+ funding = {
+ csl = nil,
+ },
game = {
csl = "software",
},
+ gitcommit = {
+ csl = nil,
+ },
govpub = {
csl = "regulation",
},
+ graphic = {
+ csl = "graphic",
+ },
habthesis = {
csl = "thesis",
},
heading = {
csl = nil,
},
+ hearing = {
+ csl = "hearing",
+ },
hidden = {
csl = nil,
},
image = {
csl = "graphic",
},
+ inarticle = {
+ csl = nil,
+ },
+ inaudio = {
+ csl = nil,
+ },
inbook = {
csl = "chapter",
},
+ incatalog = {
+ csl = nil,
+ },
incollection = {
csl = "chapter",
},
+ incommentary = {
+ csl = nil,
+ },
+ inexhibcatalog = {
+ csl = nil,
+ },
+ ininarticle = {
+ csl = nil,
+ },
+ ininbook = {
+ csl = nil,
+ },
+ inincollection = {
+ csl = nil,
+ },
+ ininproceedings = {
+ csl = nil,
+ },
+ ininreference = {
+ csl = nil,
+ },
+ inlexicon = {
+ csl = nil,
+ },
inloosecollection = {
csl = "chapter",
},
+ inmathesis = {
+ csl = nil,
+ },
+ inmovie = {
+ csl = nil,
+ },
+ inmusic = {
+ csl = nil,
+ },
+ inphdthesis = {
+ csl = nil,
+ },
inpress = {
csl = "article",
},
@@ -147,6 +315,15 @@ return {
internet = {
csl = "webpage",
},
+ interview = {
+ csl = "interview",
+ },
+ inthesis = {
+ csl = nil,
+ },
+ invideo = {
+ csl = nil,
+ },
journalpart = {
csl = nil,
},
@@ -154,20 +331,32 @@ return {
csl = "periodical",
},
jurisdiction = {
- csl = nil,
+ csl = "legal_case",
},
jurthesis = {
csl = "thesis",
},
+ legadminmaterial = {
+ csl = "regulation",
+ },
legal = {
csl = "treaty",
},
+ legal_case = {
+ csl = "legal_case",
+ },
legislation = {
csl = "legislation",
},
+ legmaterial = {
+ csl = "legislation",
+ },
letter = {
csl = "personal_communication",
},
+ letters = {
+ csl = "personal_communication",
+ },
lexicon = {
csl = "book",
},
@@ -177,6 +366,9 @@ return {
manual = {
csl = "report",
},
+ manuscript = {
+ csl = "manuscript",
+ },
map = {
csl = "map",
},
@@ -192,33 +384,54 @@ return {
misc = {
csl = "document",
},
+ mlasource = {
+ csl = nil,
+ },
monograph = {
csl = "book",
},
monography = {
csl = "book",
},
+ motion_picture = {
+ csl = "motion_picture",
+ },
movie = {
csl = "motion_picture",
},
music = {
csl = "song",
},
+ musical_score = {
+ csl = "musical_score",
+ },
mvbook = {
csl = "book",
},
mvcollection = {
csl = "book",
},
+ mvcommentary = {
+ csl = nil,
+ },
+ mvlexicon = {
+ csl = nil,
+ },
mvproceedings = {
csl = "book",
},
mvreference = {
csl = "book",
},
+ nameonly = {
+ csl = nil,
+ },
news = {
csl = "article-newspaper",
},
+ newsarticle = {
+ csl = "article-newspaper",
+ },
newspaper = {
csl = "article-newspaper",
},
@@ -228,6 +441,12 @@ return {
other = {
csl = nil,
},
+ pamphlet = {
+ csl = "pamphlet",
+ },
+ ["paper-conference"] = {
+ csl = "paper-conference",
+ },
patent = {
csl = "patent",
},
@@ -237,9 +456,18 @@ return {
periodical = {
csl = "periodical",
},
+ personal_communication = {
+ csl = "personal_communication",
+ },
phdthesis = {
csl = "thesis",
},
+ post = {
+ csl = "post",
+ },
+ ["post-weblog"] = {
+ csl = "post-weblog",
+ },
preamble = {
csl = nil,
},
@@ -258,6 +486,9 @@ return {
reference = {
csl = "book",
},
+ regulation = {
+ csl = "regulation",
+ },
report = {
csl = "report",
},
@@ -267,6 +498,15 @@ return {
review = {
csl = "review",
},
+ ["review-book"] = {
+ csl = "review-book",
+ },
+ school = {
+ csl = nil,
+ },
+ seminarpaper = {
+ csl = nil,
+ },
set = {
csl = nil,
},
@@ -276,12 +516,27 @@ return {
software = {
csl = "software",
},
+ softwaremodule = {
+ csl = "software",
+ },
+ softwareversion = {
+ csl = nil,
+ },
+ song = {
+ csl = "song",
+ },
+ speech = {
+ csl = "speech",
+ },
standard = {
csl = "standard",
},
string = {
csl = nil,
},
+ student = {
+ csl = nil,
+ },
suppbook = {
csl = "chapter",
},
@@ -291,6 +546,12 @@ return {
suppperiodical = {
csl = "article",
},
+ talk = {
+ csl = "speech",
+ },
+ teaching = {
+ csl = nil,
+ },
techreport = {
csl = "report",
},
@@ -300,6 +561,9 @@ return {
thesis = {
csl = "thesis",
},
+ treaty = {
+ csl = "treaty",
+ },
uklegislation = {
csl = "legislation",
},
@@ -313,7 +577,7 @@ return {
csl = "webpage",
},
website = {
- csl = nil,
+ csl = "webpage",
},
www = {
csl = "webpage",
@@ -327,11 +591,27 @@ return {
csl = "abstract",
type = "literal",
},
+ abstractloc = {
+ csl = nil,
+ type = "literal",
+ },
+ abstracturl = {
+ csl = nil,
+ type = "verbatim",
+ },
+ accessed = {
+ csl = "accessed",
+ },
account = {
csl = nil,
},
acronym = {
csl = nil,
+ type = "literal",
+ },
+ actor = {
+ csl = "performer",
+ type = "name",
},
add = {
csl = nil,
@@ -352,11 +632,28 @@ return {
},
advisor = {
csl = nil,
+ type = "name",
},
afterword = {
csl = nil,
type = "name",
},
+ alternatetitle = {
+ csl = nil,
+ type = "literal",
+ },
+ alternatetitlescript = {
+ csl = nil,
+ type = "literal",
+ },
+ amendment = {
+ csl = nil,
+ type = "literal",
+ },
+ amount = {
+ csl = nil,
+ type = "integer",
+ },
annotate = {
csl = "note",
},
@@ -375,12 +672,33 @@ return {
annotelanguage = {
csl = nil,
},
+ anonstring = {
+ csl = nil,
+ type = "name",
+ },
+ appentry = {
+ csl = nil,
+ type = "literal",
+ },
applicant = {
csl = nil,
},
+ arachne = {
+ csl = nil,
+ type = "verbatim",
+ },
archive = {
csl = "archive",
},
+ ["archive-place"] = {
+ csl = "archive-place",
+ },
+ archive_collection = {
+ csl = "archive_collection",
+ },
+ archive_location = {
+ csl = "archive_location",
+ },
archiveprefix = {
csl = "archive",
type = "literal",
@@ -388,8 +706,21 @@ return {
archname = {
csl = "archive",
},
+ arthist = {
+ csl = nil,
+ type = "integer",
+ },
+ arthistdate = {
+ csl = nil,
+ type = "date",
+ },
+ article = {
+ csl = nil,
+ type = "literal",
+ },
articleno = {
csl = nil,
+ type = "literal",
},
arxiv = {
csl = nil,
@@ -401,16 +732,27 @@ return {
csl = "author",
type = "name",
},
+ authoraddon = {
+ csl = nil,
+ type = "name",
+ },
authorcountry = {
csl = nil,
+ type = "literal",
},
authorfa = {
csl = nil,
},
+ authority = {
+ csl = "authority",
+ },
authortype = {
csl = nil,
type = "key",
},
+ ["available-date"] = {
+ csl = "available-date",
+ },
bibsource = {
csl = nil,
},
@@ -426,16 +768,92 @@ return {
birthyear = {
csl = nil,
},
+ blogsubtitle = {
+ csl = nil,
+ type = "literal",
+ },
+ blogtitle = {
+ csl = "title",
+ type = "literal",
+ },
+ blogtitleaddon = {
+ csl = nil,
+ type = "literal",
+ },
+ book = {
+ csl = nil,
+ type = "range",
+ },
bookaddress = {
+ csl = "publisher-place",
+ },
+ bookafterword = {
csl = nil,
+ type = "name",
+ },
+ bookannotator = {
+ csl = nil,
+ type = "name",
},
bookauthor = {
csl = "container-author",
type = "name",
},
+ bookauthortype = {
+ csl = nil,
+ type = "literal",
+ },
+ bookbooksubtitle = {
+ csl = nil,
+ type = "literal",
+ },
+ bookbooktitle = {
+ csl = nil,
+ type = "literal",
+ },
+ bookbooktitleaddon = {
+ csl = nil,
+ type = "literal",
+ },
+ bookbooktitlekey = {
+ csl = nil,
+ type = "key",
+ },
+ bookbookvolume = {
+ csl = nil,
+ type = "literal",
+ },
+ bookcommentator = {
+ csl = nil,
+ type = "name",
+ },
+ bookcredits = {
+ csl = nil,
+ type = "literal",
+ },
+ bookeditor = {
+ csl = "editor",
+ type = "name",
+ },
+ bookforeword = {
+ csl = nil,
+ type = "name",
+ },
+ bookineditor = {
+ csl = nil,
+ type = "name",
+ },
+ bookintroduction = {
+ csl = nil,
+ type = "name",
+ },
booklanguage = {
csl = nil,
},
+ bookoriglanguage = {
+ csl = nil,
+ type = "key",
+ },
bookpages = {
csl = nil,
},
@@ -443,6 +861,10 @@ return {
csl = nil,
type = "key",
},
+ books = {
+ csl = nil,
+ type = "literal",
+ },
booksubtitle = {
csl = nil,
type = "literal",
@@ -455,6 +877,29 @@ return {
csl = nil,
type = "literal",
},
+ booktitlekey = {
+ csl = nil,
+ type = "key",
+ },
+ booktitlenote = {
+ csl = nil,
+ type = "literal",
+ },
+ booktranslator = {
+ csl = "translator",
+ type = "name",
+ },
+ bookvolume = {
+ csl = nil,
+ type = "literal",
+ },
+ bookyear = {
+ csl = nil,
+ type = "literal",
+ },
+ ["call-number"] = {
+ csl = "call-number",
+ },
caption = {
csl = nil,
},
@@ -467,6 +912,10 @@ return {
casenumber = {
csl = nil,
},
+ catalog = {
+ csl = nil,
+ type = "literal",
+ },
category = {
csl = nil,
},
@@ -474,18 +923,37 @@ return {
csl = nil,
},
chair = {
- csl = nil,
+ csl = "chair",
},
chapter = {
csl = "chapter-number",
type = "literal",
},
+ ["chapter-number"] = {
+ csl = "chapter-number",
+ },
+ citation = {
+ csl = nil,
+ type = "literal",
+ },
citedate = {
csl = nil,
},
city = {
csl = nil,
},
+ classes = {
+ csl = nil,
+ type = "entrykey",
+ },
+ claves = {
+ csl = nil,
+ type = "literal",
+ },
+ claves_definition = {
+ csl = nil,
+ type = "literal",
+ },
code = {
csl = nil,
},
@@ -494,10 +962,28 @@ return {
},
collaboration = {
csl = nil,
+ type = "literal",
},
collator = {
csl = nil,
},
+ collection = {
+ csl = nil,
+ type = "literal",
+ },
+ ["collection-editor"] = {
+ csl = "collection-editor",
+ },
+ ["collection-number"] = {
+ csl = "collection-number",
+ },
+ ["collection-title"] = {
+ csl = "collection-title",
+ },
+ columns = {
+ csl = nil,
+ type = "literal",
+ },
commentator = {
csl = nil,
type = "name",
@@ -505,8 +991,23 @@ return {
commit = {
csl = nil,
},
+ commithash = {
+ csl = nil,
+ type = "literal",
+ },
+ committee = {
+ csl = nil,
+ type = "name",
+ },
compiler = {
+ csl = "compiler",
+ },
+ composer = {
+ csl = "composer",
+ },
+ concentration = {
csl = nil,
+ type = "literal",
},
condition = {
csl = nil,
@@ -520,49 +1021,88 @@ return {
["conference-year"] = {
csl = nil,
},
+ ["container-author"] = {
+ csl = "container-author",
+ },
+ ["container-title"] = {
+ csl = "container-title",
+ },
+ ["container-title-short"] = {
+ csl = "container-title-short",
+ },
+ contents = {
+ csl = nil,
+ type = "literal",
+ },
+ contributor = {
+ csl = "contributor",
+ },
+ contributora = {
+ csl = nil,
+ type = "literal",
+ },
+ contributorb = {
+ csl = nil,
+ type = "literal",
+ },
+ copublisher = {
+ csl = nil,
+ type = "literal",
+ },
copy = {
csl = nil,
},
country = {
- csl = nil,
+ csl = "jurisdiction",
},
credits = {
csl = nil,
+ type = "literal",
},
crossref = {
csl = nil,
type = "entrykey",
},
- ["ctrl-article-title"] = {
- csl = nil,
+ curator = {
+ csl = "curator",
},
- ["ctrl-chapter-title"] = {
+ currency = {
csl = nil,
+ type = "literal",
},
- ["ctrl-doi"] = {
- csl = nil,
+ custom = {
+ csl = "custom",
},
- ["ctrl-etal-firstonly"] = {
+ dataset = {
csl = nil,
},
- ["ctrl-etal-number"] = {
+ date = {
+ csl = "issued",
+ type = "date",
+ },
+ ["date+an"] = {
csl = nil,
+ type = "literal",
},
- ["ctrl-link-doi"] = {
+ datea = {
csl = nil,
+ type = "literal",
},
- ["ctrl-use-doi-all"] = {
+ dateaddon = {
csl = nil,
+ type = "literal",
},
- ["ctrl-use-title"] = {
+ dateb = {
csl = nil,
+ type = "literal",
},
- dataset = {
+ datetype = {
csl = nil,
+ type = "literal",
},
- date = {
- csl = "issued",
- type = "date",
+ dating = {
+ csl = nil,
+ type = "literal",
},
day = {
csl = nil,
@@ -570,11 +1110,28 @@ return {
dayfiled = {
csl = nil,
},
+ decision = {
+ csl = nil,
+ type = "literal",
+ },
+ decisionname = {
+ csl = nil,
+ type = "literal",
+ },
definition = {
csl = nil,
},
+ degree = {
+ csl = nil,
+ type = "literal",
+ },
+ degreelist = {
+ csl = nil,
+ type = "entrykey",
+ },
department = {
csl = nil,
+ type = "literal",
},
description = {
csl = nil,
@@ -583,11 +1140,22 @@ return {
csl = nil,
},
dimensions = {
- csl = nil,
+ csl = "dimensions",
+ },
+ director = {
+ csl = "director",
+ type = "name",
},
dissyear = {
csl = nil,
},
+ distinctURL = {
+ csl = nil,
+ type = "literal",
+ },
+ division = {
+ csl = "division",
+ },
doi = {
csl = "DOI",
type = "verbatim",
@@ -598,10 +1166,22 @@ return {
dummy = {
csl = nil,
},
+ duration = {
+ csl = nil,
+ type = "literal",
+ },
+ durationtype = {
+ csl = nil,
+ type = "literal",
+ },
edition = {
csl = "edition",
type = "literal",
},
+ editioncredits = {
+ csl = nil,
+ type = "literal",
+ },
editor = {
csl = "editor",
type = "name",
@@ -610,6 +1190,14 @@ return {
csl = nil,
type = "name",
},
+ editoraaddon = {
+ csl = nil,
+ type = "literal",
+ },
+ editoraddon = {
+ csl = nil,
+ type = "name",
+ },
editoratype = {
csl = nil,
type = "key",
@@ -630,6 +1218,9 @@ return {
csl = nil,
type = "key",
},
+ ["editorial-director"] = {
+ csl = "editorial-director",
+ },
editortype = {
csl = nil,
type = "key",
@@ -641,6 +1232,10 @@ return {
email = {
csl = nil,
},
+ endbookyear = {
+ csl = nil,
+ type = "literal",
+ },
endnumber = {
csl = nil,
},
@@ -650,6 +1245,10 @@ return {
endyear = {
csl = nil,
},
+ englishabstract = {
+ csl = nil,
+ type = "literal",
+ },
englishtitle = {
csl = nil,
},
@@ -672,6 +1271,18 @@ return {
csl = nil,
type = "literal",
},
+ eprintdate = {
+ csl = nil,
+ type = "date",
+ },
+ eprintday = {
+ csl = nil,
+ type = "datepart",
+ },
+ eprintmonth = {
+ csl = nil,
+ type = "datepart",
+ },
eprints = {
csl = nil,
},
@@ -679,6 +1290,10 @@ return {
csl = "archive",
type = "literal",
},
+ eprintyear = {
+ csl = nil,
+ type = "datepart",
+ },
erratumeid = {
csl = nil,
},
@@ -697,10 +1312,34 @@ return {
erratumyear = {
csl = nil,
},
+ event = {
+ csl = "event-title",
+ },
+ ["event-date"] = {
+ csl = "event-date",
+ },
+ ["event-place"] = {
+ csl = "event-place",
+ },
+ ["event-title"] = {
+ csl = "event-title",
+ },
eventdate = {
csl = "event-date",
type = "date",
},
+ eventdatelanguage = {
+ csl = nil,
+ type = "verbatim",
+ },
+ eventnumber = {
+ csl = nil,
+ type = "integer",
+ },
+ eventsubtitle = {
+ csl = nil,
+ type = "literal",
+ },
eventtitle = {
csl = "event-title",
type = "literal",
@@ -709,13 +1348,64 @@ return {
csl = nil,
type = "literal",
},
+ eventtype = {
+ csl = nil,
+ type = "literal",
+ },
eventyear = {
csl = nil,
},
+ execdirector = {
+ csl = "director",
+ type = "name",
+ },
+ execproducer = {
+ csl = "executive-producer",
+ type = "name",
+ },
execute = {
csl = nil,
type = "code",
},
+ ["executive-producer"] = {
+ csl = "executive-producer",
+ },
+ exhibfirstdate = {
+ csl = "event-date",
+ type = "date",
+ },
+ exhibfirstlocation = {
+ csl = "event-place",
+ type = "literal",
+ },
+ exhibfirstmuseum = {
+ csl = nil,
+ type = "literal",
+ },
+ exhibseconddate = {
+ csl = nil,
+ type = "date",
+ },
+ exhibsecondlocation = {
+ csl = nil,
+ type = "literal",
+ },
+ exhibsecondmuseum = {
+ csl = nil,
+ type = "literal",
+ },
+ exhibthirddate = {
+ csl = nil,
+ type = "date",
+ },
+ exhibthirdlocation = {
+ csl = nil,
+ type = "literal",
+ },
+ exhibthirdmuseum = {
+ csl = nil,
+ type = "literal",
+ },
faddress = {
csl = nil,
},
@@ -725,6 +1415,14 @@ return {
fax = {
csl = nil,
},
+ festschrift = {
+ csl = nil,
+ type = "name",
+ },
+ festschriftaddon = {
+ csl = nil,
+ type = "literal",
+ },
file = {
csl = nil,
type = "verbatim",
@@ -751,9 +1449,21 @@ return {
fpublisher = {
csl = nil,
},
+ frenchabstract = {
+ csl = nil,
+ type = "literal",
+ },
ftitle = {
csl = nil,
},
+ fulleventdate = {
+ csl = nil,
+ type = "date",
+ },
+ funder = {
+ csl = nil,
+ type = "literal",
+ },
furtherresp = {
csl = nil,
},
@@ -764,14 +1474,37 @@ return {
csl = nil,
type = "literal",
},
+ genre = {
+ csl = "genre",
+ },
germanpages = {
csl = nil,
},
+ gpa = {
+ csl = nil,
+ type = "literal",
+ },
group = {
csl = nil,
},
+ guest = {
+ csl = "guest",
+ },
+ hal_id = {
+ csl = nil,
+ type = "verbatim",
+ },
+ hal_version = {
+ csl = "version",
+ type = "verbatim",
+ },
+ handle = {
+ csl = nil,
+ type = "literal",
+ },
heading = {
csl = nil,
+ type = "literal",
},
hereafter = {
csl = nil,
@@ -780,6 +1513,13 @@ return {
csl = nil,
type = "name",
},
+ honors = {
+ csl = nil,
+ type = "literal",
+ },
+ host = {
+ csl = "host",
+ },
howcited = {
csl = nil,
},
@@ -802,7 +1542,23 @@ return {
csl = nil,
},
illustrator = {
+ csl = "illustrator",
+ },
+ impactfactor = {
csl = nil,
+ type = "literal",
+ },
+ inafterword = {
+ csl = nil,
+ type = "name",
+ },
+ inannotator = {
+ csl = nil,
+ type = "name",
+ },
+ incommentator = {
+ csl = nil,
+ type = "name",
},
indexsorttitle = {
csl = nil,
@@ -812,10 +1568,37 @@ return {
csl = nil,
type = "literal",
},
+ ineditor = {
+ csl = nil,
+ type = "name",
+ },
+ inforeword = {
+ csl = nil,
+ type = "name",
+ },
+ inintroduction = {
+ csl = nil,
+ type = "name",
+ },
institution = {
csl = "publisher",
type = "literal",
},
+ interviewee = {
+ csl = nil,
+ type = "name",
+ },
+ interviewer = {
+ csl = "interviewer",
+ },
+ intranslator = {
+ csl = nil,
+ type = "name",
+ },
+ introducedin = {
+ csl = nil,
+ type = "literal",
+ },
introduction = {
csl = nil,
type = "name",
@@ -824,10 +1607,11 @@ return {
csl = nil,
},
inventor = {
- csl = nil,
+ csl = "author",
},
ipc = {
csl = nil,
+ type = "literal",
},
isan = {
csl = nil,
@@ -862,6 +1646,13 @@ return {
csl = "issue",
type = "literal",
},
+ issued = {
+ csl = "issued",
+ },
+ issues = {
+ csl = nil,
+ type = "literal",
+ },
issuesubtitle = {
csl = nil,
type = "literal",
@@ -881,10 +1672,21 @@ return {
jfmnumber = {
csl = nil,
},
+ jointauthor = {
+ csl = nil,
+ type = "name",
+ },
+ jointauthortype = {
+ csl = nil,
+ type = "literal",
+ },
journal = {
csl = "container-title",
type = "literal",
},
+ journalabbreviation = {
+ csl = "container-title-short",
+ },
journalsubtitle = {
csl = nil,
type = "literal",
@@ -900,16 +1702,30 @@ return {
csl = nil,
type = "literal",
},
+ journalyear = {
+ csl = nil,
+ type = "literal",
+ },
+ jstor = {
+ csl = nil,
+ type = "verbatim",
+ },
juraauthor = {
csl = nil,
},
juratitle = {
csl = nil,
},
+ jurisdiction = {
+ csl = "jurisdiction",
+ },
key = {
csl = nil,
type = "literal",
},
+ keyword = {
+ csl = "keyword",
+ },
keywords = {
csl = nil,
type = "keyword",
@@ -935,10 +1751,15 @@ return {
},
lastaccessed = {
csl = "accessed",
+ type = "literal",
},
lastchecked = {
csl = "accessed",
},
+ layer = {
+ csl = nil,
+ type = "literal",
+ },
lccn = {
csl = nil,
},
@@ -946,6 +1767,14 @@ return {
csl = nil,
type = "literal",
},
+ librarylocation = {
+ csl = "archive-place",
+ type = "literal",
+ },
+ license = {
+ csl = "license",
+ type = "literal",
+ },
lista = {
csl = nil,
type = "literal",
@@ -977,6 +1806,14 @@ return {
csl = "publisher-place",
type = "literal",
},
+ locationa = {
+ csl = nil,
+ type = "literal",
+ },
+ locationb = {
+ csl = nil,
+ type = "literal",
+ },
madadurltest = {
csl = nil,
},
@@ -986,10 +1823,22 @@ return {
main1 = {
csl = nil,
},
+ mainauthor = {
+ csl = nil,
+ type = "name",
+ },
+ maineditor = {
+ csl = nil,
+ type = "name",
+ },
mainsubtitle = {
csl = nil,
type = "literal",
},
+ maintainer = {
+ csl = nil,
+ type = "name",
+ },
maintitle = {
csl = nil,
type = "literal",
@@ -998,6 +1847,18 @@ return {
csl = nil,
type = "literal",
},
+ maintitlenote = {
+ csl = nil,
+ type = "literal",
+ },
+ maintranslator = {
+ csl = nil,
+ type = "name",
+ },
+ major = {
+ csl = nil,
+ type = "literal",
+ },
majorcode = {
csl = nil,
},
@@ -1015,6 +1876,7 @@ return {
},
media = {
csl = "medium",
+ type = "key",
},
medium = {
csl = "medium",
@@ -1022,6 +1884,10 @@ return {
meeting = {
csl = nil,
},
+ minor = {
+ csl = nil,
+ type = "literal",
+ },
misctitle = {
csl = nil,
},
@@ -1044,8 +1910,17 @@ return {
mrnumber = {
csl = nil,
},
+ multieventdate = {
+ csl = nil,
+ type = "literal",
+ },
+ multivenue = {
+ csl = nil,
+ type = "literal",
+ },
name = {
csl = nil,
+ type = "name",
},
namea = {
csl = nil,
@@ -1075,6 +1950,10 @@ return {
csl = nil,
type = "key",
},
+ narrator = {
+ csl = "narrator",
+ type = "name",
+ },
nationality = {
csl = nil,
},
@@ -1084,8 +1963,13 @@ return {
newpage = {
csl = nil,
},
+ newsdate = {
+ csl = nil,
+ type = "date",
+ },
newspaper = {
csl = "container-title",
+ type = "literal",
},
nickname = {
csl = nil,
@@ -1119,18 +2003,57 @@ return {
csl = "number",
type = "literal",
},
+ ["number-of-pages"] = {
+ csl = "number-of-pages",
+ },
+ ["number-of-volumes"] = {
+ csl = "number-of-volumes",
+ },
+ numbera = {
+ csl = nil,
+ type = "literal",
+ },
+ numberb = {
+ csl = nil,
+ type = "literal",
+ },
+ numcites = {
+ csl = nil,
+ type = "integer",
+ },
+ numlectures = {
+ csl = nil,
+ type = "integer",
+ },
numpages = {
+ csl = "number-of-pages",
+ type = "literal",
+ },
+ numstudents = {
csl = nil,
+ type = "integer",
},
oaddress = {
+ csl = "original-publisher-place",
+ },
+ officialpages = {
csl = nil,
+ type = "literal",
+ },
+ officialvolume = {
+ csl = nil,
+ type = "literal",
+ },
+ openaccess = {
+ csl = nil,
+ type = "literal",
},
options = {
csl = nil,
type = "option",
},
opublisher = {
- csl = nil,
+ csl = "original-publisher",
},
["org-short"] = {
csl = nil,
@@ -1139,10 +2062,40 @@ return {
csl = "publisher",
type = "literal",
},
+ organizer = {
+ csl = "organizer",
+ },
origdate = {
csl = "original-date",
type = "date",
},
+ ["origdate+an"] = {
+ csl = nil,
+ type = "literal",
+ },
+ origdatetype = {
+ csl = nil,
+ type = "literal",
+ },
+ origin = {
+ csl = nil,
+ type = "literal",
+ },
+ ["original-author"] = {
+ csl = "original-author",
+ },
+ ["original-date"] = {
+ csl = "original-date",
+ },
+ ["original-publisher"] = {
+ csl = "original-publisher",
+ },
+ ["original-publisher-place"] = {
+ csl = "original-publisher-place",
+ },
+ ["original-title"] = {
+ csl = "original-title",
+ },
originaladdress = {
csl = "original-publisher-place",
},
@@ -1185,13 +2138,24 @@ return {
csl = "original-publisher",
type = "literal",
},
+ origrealdate = {
+ csl = nil,
+ type = "date",
+ },
origtitle = {
csl = "original-title",
type = "literal",
},
+ owner = {
+ csl = nil,
+ type = "name",
+ },
oyear = {
csl = nil,
},
+ page = {
+ csl = "page",
+ },
pagename = {
csl = nil,
},
@@ -1210,10 +2174,41 @@ return {
paper = {
csl = nil,
},
+ pardate = {
+ csl = nil,
+ type = "date",
+ },
+ parpages = {
+ csl = nil,
+ type = "range",
+ },
+ parreporter = {
+ csl = nil,
+ type = "literal",
+ },
+ parseries = {
+ csl = nil,
+ type = "literal",
+ },
part = {
csl = "part",
type = "literal",
},
+ ["part-title"] = {
+ csl = "part-title",
+ },
+ parts = {
+ csl = nil,
+ type = "literal",
+ },
+ parttitle = {
+ csl = nil,
+ type = "literal",
+ },
+ parvolume = {
+ csl = nil,
+ type = "integer",
+ },
patentid = {
csl = nil,
},
@@ -1221,6 +2216,13 @@ return {
csl = nil,
type = "verbatim",
},
+ peerreview = {
+ csl = nil,
+ type = "literal",
+ },
+ performer = {
+ csl = "performer",
+ },
phone = {
csl = nil,
},
@@ -1230,18 +2232,36 @@ return {
pii = {
csl = nil,
},
+ pmc = {
+ csl = nil,
+ type = "literal",
+ },
pmcid = {
csl = "PMCID",
+ type = "literal",
+ },
+ pmid = {
+ csl = "PMID",
+ type = "literal",
},
prebibitem = {
csl = nil,
},
preface = {
csl = nil,
+ type = "name",
},
preprint = {
csl = nil,
},
+ presentationtype = {
+ csl = nil,
+ type = "literal",
+ },
+ presenter = {
+ csl = nil,
+ type = "name",
+ },
presort = {
csl = nil,
type = "literal",
@@ -1256,35 +2276,92 @@ return {
printing = {
csl = nil,
},
+ ["printing-number"] = {
+ csl = "printing-number",
+ },
prioritycountry = {
csl = nil,
+ type = "literal",
},
prioritydate = {
csl = nil,
+ type = "date",
},
prioritynumber = {
csl = nil,
+ type = "literal",
+ },
+ producer = {
+ csl = "producer",
+ type = "name",
+ },
+ production = {
+ csl = nil,
+ type = "literal",
+ },
+ protocollessurl = {
+ csl = nil,
+ type = "uri",
},
pseudonym = {
csl = nil,
},
publication = {
csl = nil,
+ type = "literal",
},
publicationdate = {
csl = nil,
+ type = "date",
+ },
+ publicprice = {
+ csl = nil,
+ type = "literal",
},
publisher = {
csl = "publisher",
type = "literal",
},
+ ["publisher-place"] = {
+ csl = "publisher-place",
+ },
+ publishera = {
+ csl = nil,
+ type = "literal",
+ },
+ publisherb = {
+ csl = nil,
+ type = "literal",
+ },
pubmed = {
csl = "PMID",
},
pubstate = {
- csl = nil,
+ csl = "status",
type = "key",
},
+ rawauthor = {
+ csl = nil,
+ type = "literal",
+ },
+ realauthor = {
+ csl = nil,
+ type = "name",
+ },
+ realdate = {
+ csl = nil,
+ type = "date",
+ },
+ realeditor = {
+ csl = nil,
+ type = "name",
+ },
+ recipient = {
+ csl = "recipient",
+ },
+ references = {
+ csl = "references",
+ },
related = {
csl = nil,
type = "entrykey",
@@ -1301,6 +2378,14 @@ return {
csl = nil,
type = "literal",
},
+ reportnumber = {
+ csl = nil,
+ type = "literal",
+ },
+ repository = {
+ csl = nil,
+ type = "uri",
+ },
["reprinted-from"] = {
csl = nil,
},
@@ -1316,33 +2401,129 @@ return {
},
requestnumber = {
csl = nil,
+ type = "literal",
},
responsible = {
csl = nil,
},
+ revdauthor = {
+ csl = nil,
+ type = "name",
+ },
+ revdeditor = {
+ csl = nil,
+ type = "name",
+ },
+ revdshorttitle = {
+ csl = nil,
+ type = "literal",
+ },
+ revdsubtitle = {
+ csl = nil,
+ type = "literal",
+ },
+ revdtitle = {
+ csl = nil,
+ type = "literal",
+ },
+ revdtitleaddon = {
+ csl = nil,
+ type = "literal",
+ },
review = {
csl = nil,
},
+ ["reviewed-author"] = {
+ csl = "reviewed-author",
+ },
+ ["reviewed-genre"] = {
+ csl = "reviewed-genre",
+ },
+ ["reviewed-title"] = {
+ csl = "reviewed-title",
+ },
+ reviewer = {
+ csl = nil,
+ type = "name",
+ },
+ reviewerinstitution = {
+ csl = nil,
+ type = "literal",
+ },
revision = {
csl = nil,
},
+ role = {
+ csl = nil,
+ type = "key",
+ },
+ scale = {
+ csl = "scale",
+ },
school = {
csl = "publisher",
type = "literal",
},
+ science = {
+ csl = nil,
+ type = "literal",
+ },
score = {
csl = nil,
},
+ scribe = {
+ csl = nil,
+ type = "name",
+ },
+ script = {
+ csl = nil,
+ type = "literal",
+ },
+ ["script-writer"] = {
+ csl = "script-writer",
+ },
+ scriptwriter = {
+ csl = nil,
+ type = "name",
+ },
section = {
+ csl = "section",
+ type = "literal",
+ },
+ semesters = {
csl = nil,
+ type = "entrykey",
},
series = {
csl = "collection-title",
type = "literal",
},
+ ["series-creator"] = {
+ csl = "series-creator",
+ },
+ seriesaddon = {
+ csl = nil,
+ type = "literal",
+ },
seriesedition = {
csl = nil,
},
+ serieseditor = {
+ csl = nil,
+ type = "name",
+ },
+ seriesseries = {
+ csl = nil,
+ type = "literal",
+ },
+ setlabel = {
+ csl = nil,
+ type = "literal",
+ },
+ shelfmark = {
+ csl = nil,
+ type = "literal",
+ },
short = {
csl = nil,
},
@@ -1353,10 +2534,30 @@ return {
csl = nil,
type = "name",
},
+ shortblog = {
+ csl = nil,
+ type = "literal",
+ },
+ shortbookauthor = {
+ csl = nil,
+ type = "name",
+ },
+ shortbooktitle = {
+ csl = nil,
+ type = "literal",
+ },
+ shortcollection = {
+ csl = nil,
+ type = "literal",
+ },
shorteditor = {
csl = nil,
type = "name",
},
+ shortform = {
+ csl = nil,
+ type = "literal",
+ },
shorthand = {
csl = nil,
type = "literal",
@@ -1365,10 +2566,34 @@ return {
csl = nil,
type = "literal",
},
+ shortissuetitle = {
+ csl = nil,
+ type = "literal",
+ },
shortjournal = {
csl = "container-title-short",
type = "literal",
},
+ shortlabeltitle = {
+ csl = nil,
+ type = "literal",
+ },
+ shortlibrary = {
+ csl = nil,
+ type = "literal",
+ },
+ shortmaintitle = {
+ csl = nil,
+ type = "literal",
+ },
+ shortorganization = {
+ csl = nil,
+ type = "literal",
+ },
+ shortserie = {
+ csl = nil,
+ type = "literal",
+ },
shortseries = {
csl = nil,
type = "literal",
@@ -1376,10 +2601,22 @@ return {
shortsubarchive = {
csl = nil,
},
+ shortsubseries = {
+ csl = nil,
+ type = "literal",
+ },
+ shortsubsubseries = {
+ csl = nil,
+ type = "literal",
+ },
shorttitle = {
csl = "title-short",
type = "literal",
},
+ shorttranslator = {
+ csl = nil,
+ type = "name",
+ },
shorturl = {
csl = nil,
},
@@ -1395,12 +2632,20 @@ return {
sig4 = {
csl = nil,
},
+ sign = {
+ csl = nil,
+ type = "literal",
+ },
size = {
csl = nil,
},
slaccitation = {
csl = nil,
},
+ smfprice = {
+ csl = nil,
+ type = "literal",
+ },
["sort-short"] = {
csl = nil,
},
@@ -1418,6 +2663,10 @@ return {
csl = nil,
type = "name",
},
+ sortshelfmark = {
+ csl = nil,
+ type = "literal",
+ },
sortshorthand = {
csl = nil,
type = "literal",
@@ -1426,6 +2675,10 @@ return {
csl = nil,
type = "literal",
},
+ sortvolume = {
+ csl = nil,
+ type = "literal",
+ },
sortyear = {
csl = nil,
type = "integer",
@@ -1433,8 +2686,17 @@ return {
source1 = {
csl = nil,
},
+ specdata = {
+ csl = nil,
+ type = "literal",
+ },
+ speciality = {
+ csl = nil,
+ type = "literal",
+ },
specialitycode = {
csl = nil,
+ type = "literal",
},
ssedition = {
csl = nil,
@@ -1455,10 +2717,11 @@ return {
csl = nil,
},
status = {
- csl = nil,
+ csl = "status",
+ type = "key",
},
stdcode = {
- csl = nil,
+ csl = "number",
},
stitle = {
csl = nil,
@@ -1469,16 +2732,86 @@ return {
subarchive = {
csl = nil,
},
+ submitted = {
+ csl = "submitted",
+ },
+ subnumber = {
+ csl = nil,
+ type = "integer",
+ },
+ subseries = {
+ csl = nil,
+ type = "literal",
+ },
+ subsubnumber = {
+ csl = nil,
+ type = "literal",
+ },
+ subsubseries = {
+ csl = nil,
+ type = "literal",
+ },
subtitle = {
csl = nil,
type = "literal",
},
+ summarytitle = {
+ csl = nil,
+ type = "literal",
+ },
+ supervisor = {
+ csl = nil,
+ type = "name",
+ },
+ supplement = {
+ csl = "supplement",
+ },
+ supplemental = {
+ csl = nil,
+ type = "literal",
+ },
+ supplementala = {
+ csl = nil,
+ type = "literal",
+ },
+ supplementalb = {
+ csl = nil,
+ type = "literal",
+ },
+ support = {
+ csl = nil,
+ type = "literal",
+ },
+ swhid = {
+ csl = nil,
+ type = "verbatim",
+ },
+ swhidcore = {
+ csl = nil,
+ type = "verbatim",
+ },
symposium = {
csl = nil,
},
+ systemreq = {
+ csl = nil,
+ type = "literal",
+ },
text = {
csl = nil,
},
+ thesisdate = {
+ csl = nil,
+ type = "date",
+ },
+ thesistype = {
+ csl = nil,
+ type = "verbatim",
+ },
+ thumbnail = {
+ csl = nil,
+ type = "verbatim",
+ },
timestamp = {
csl = nil,
},
@@ -1486,12 +2819,36 @@ return {
csl = "title",
type = "literal",
},
+ ["title-short"] = {
+ csl = "title-short",
+ },
+ titlea = {
+ csl = nil,
+ type = "literal",
+ },
titleaddon = {
csl = nil,
type = "literal",
},
+ titleb = {
+ csl = nil,
+ type = "literal",
+ },
+ titleisdescription = {
+ csl = nil,
+ type = "literal",
+ },
+ titlekey = {
+ csl = nil,
+ type = "key",
+ },
titlenote = {
csl = nil,
+ type = "literal",
+ },
+ titletype = {
+ csl = nil,
+ type = "literal",
},
totalpages = {
csl = nil,
@@ -1509,6 +2866,26 @@ return {
csl = "translator",
type = "name",
},
+ translatora = {
+ csl = nil,
+ type = "name",
+ },
+ translatoratype = {
+ csl = nil,
+ type = "key",
+ },
+ translatorb = {
+ csl = nil,
+ type = "name",
+ },
+ translatorbtype = {
+ csl = nil,
+ type = "key",
+ },
+ translatortype = {
+ csl = nil,
+ type = "key",
+ },
transnumber = {
csl = nil,
},
@@ -1528,12 +2905,20 @@ return {
csl = "genre",
type = "key",
},
+ typeaddon = {
+ csl = nil,
+ type = "literal",
+ },
typeoflit = {
csl = nil,
},
umfnumber = {
csl = nil,
},
+ update = {
+ csl = nil,
+ type = "date",
+ },
updated = {
csl = nil,
},
@@ -1548,17 +2933,26 @@ return {
csl = "accessed",
type = "date",
},
+ urldescription = {
+ csl = nil,
+ type = "literal",
+ },
urlnewline = {
csl = nil,
},
+ urls = {
+ csl = nil,
+ type = "uri",
+ },
urltype = {
csl = nil,
},
urlyear = {
- csl = nil,
+ csl = "accessed",
},
urn = {
csl = nil,
+ type = "verbatim",
},
usera = {
csl = nil,
@@ -1584,6 +2978,10 @@ return {
csl = nil,
type = "literal",
},
+ usualtitle = {
+ csl = nil,
+ type = "literal",
+ },
value = {
csl = nil,
},
@@ -1607,26 +3005,124 @@ return {
csl = "version",
type = "literal",
},
+ versiona = {
+ csl = nil,
+ type = "literal",
+ },
+ versionb = {
+ csl = nil,
+ type = "literal",
+ },
versiontype = {
csl = nil,
},
volformat = {
csl = nil,
},
+ volsorder = {
+ csl = nil,
+ type = "literal",
+ },
volume = {
csl = "volume",
type = "integer",
},
+ ["volume-title"] = {
+ csl = "volume-title",
+ },
+ ["volume-title-short"] = {
+ csl = "volume-title-short",
+ },
volumes = {
csl = "number-of-volumes",
type = "integer",
},
volumetitle = {
+ csl = "volume-title",
+ },
+ with = {
+ csl = nil,
+ type = "name",
+ },
+ withauthor = {
+ csl = nil,
+ type = "name",
+ },
+ withauthortype = {
+ csl = nil,
+ type = "literal",
+ },
+ withbookauthor = {
+ csl = nil,
+ type = "name",
+ },
+ withbookauthortype = {
+ csl = nil,
+ type = "literal",
+ },
+ withbookeditor = {
+ csl = nil,
+ type = "name",
+ },
+ withbookeditortype = {
+ csl = nil,
+ type = "literal",
+ },
+ withbooktranslator = {
+ csl = nil,
+ type = "name",
+ },
+ withbooktranslatortype = {
+ csl = nil,
+ type = "literal",
+ },
+ witheditor = {
+ csl = nil,
+ type = "name",
+ },
+ witheditortype = {
+ csl = nil,
+ type = "literal",
+ },
+ withmainauthor = {
csl = nil,
+ type = "name",
+ },
+ withmainauthortype = {
+ csl = nil,
+ type = "literal",
+ },
+ withmaineditor = {
+ csl = nil,
+ type = "name",
+ },
+ withmaineditortype = {
+ csl = nil,
+ type = "literal",
+ },
+ withmaintranslator = {
+ csl = nil,
+ type = "name",
+ },
+ withmaintranslatortype = {
+ csl = nil,
+ type = "literal",
+ },
+ withtranslator = {
+ csl = nil,
+ type = "name",
+ },
+ withtranslatortype = {
+ csl = nil,
+ type = "literal",
},
word = {
csl = nil,
},
+ writer = {
+ csl = nil,
+ type = "name",
+ },
xdata = {
csl = nil,
type = "entrykey",
@@ -1654,6 +3150,10 @@ return {
zblnumber = {
csl = nil,
},
+ zenon = {
+ csl = nil,
+ type = "verbatim",
+ },
zip = {
csl = nil,
},
diff --git a/biblio/citation-style-language/citeproc-cli.lua b/biblio/citation-style-language/citeproc-cli.lua
index 9023728473..4938267d3a 100644
--- a/biblio/citation-style-language/citeproc-cli.lua
+++ b/biblio/citation-style-language/citeproc-cli.lua
@@ -143,6 +143,12 @@ local function process_aux_file(aux_file)
end
local style_class = engine:get_style_class()
+ if style_class == "in-text" then
+ for _, citation in ipairs(citations) do
+ citation.properties.noteIndex = 0
+ end
+ end
+
local citation_strings = core.process_citations(engine, citations)
-- util.debug(citation_strings)
@@ -153,7 +159,7 @@ local function process_aux_file(aux_file)
local citation_id = citation.citationID
if citation_id ~= "@nocite" then
local citation_str = citation_strings[citation_id]
- output_string = output_string .. string.format("\\cslcite{%s}{{%s}{%s}}\n", citation_id, style_class, citation_str)
+ output_string = output_string .. string.format("\\cslcite{%s}{%s}\n", citation_id, citation_str)
end
end
diff --git a/biblio/citation-style-language/citeproc-context.lua b/biblio/citation-style-language/citeproc-context.lua
index 08be158bcf..f0c42e64fc 100644
--- a/biblio/citation-style-language/citeproc-context.lua
+++ b/biblio/citation-style-language/citeproc-context.lua
@@ -265,7 +265,7 @@ function Context:get_macro(name)
end
function Context:get_simple_term(name, form, plural)
- assert(self.locale)
+ -- assert(self.locale)
return self.locale:get_simple_term(name, form, plural)
end
diff --git a/biblio/citation-style-language/citeproc-element.lua b/biblio/citation-style-language/citeproc-element.lua
index 197616cb08..4ef2b7c420 100644
--- a/biblio/citation-style-language/citeproc-element.lua
+++ b/biblio/citation-style-language/citeproc-element.lua
@@ -95,6 +95,34 @@ function Element:process_children_nodes(node)
end
+function Element.make_name_inheritance(name, node)
+ name:set_attribute(node, "and")
+ name:set_attribute(node, "delimiter-precedes-et-al")
+ name:set_attribute(node, "delimiter-precedes-last")
+ name:set_number_attribute(node, "et-al-min")
+ name:set_number_attribute(node, "et-al-use-first")
+ name:set_number_attribute(node, "et-al-subsequent-min")
+ name:set_number_attribute(node, "et-al-subsequent-use-first")
+ name:set_bool_attribute(node, "et-al-use-last")
+ name:set_bool_attribute(node, "initialize")
+ name:set_attribute(node, "initialize-with")
+ name:set_attribute(node, "name-as-sort-order")
+ name:set_attribute(node, "sort-separator")
+ local delimiter = node:get_attribute("name-delimiter")
+ if delimiter then
+ name.delimiter = delimiter
+ end
+ local form = node:get_attribute("name-form")
+ if form then
+ name.form = form
+ end
+ local names_delimiter = node:get_attribute("names-delimiter")
+ if names_delimiter then
+ name.names_delimiter = names_delimiter
+ end
+end
+
+
function Element:build_ir(engine, state, context)
return self:build_children_ir(engine, state, context)
end
@@ -430,7 +458,8 @@ end
function Element:format_ordinal_number_parts(number_parts, form, gender, context)
for i = 1, 2 do
local part = number_parts[i]
- if string.match(part, "%d+") then
+ -- Values like "2nd" are kept the in the original form.
+ if string.match(part, "^%d+$") then
local number = tonumber(part)
if form == "long-ordinal" and number >= 1 and number <= 10 then
number_parts[i] = context:get_simple_term(string.format("long-ordinal-%02d", number))
diff --git a/biblio/citation-style-language/citeproc-engine.lua b/biblio/citation-style-language/citeproc-engine.lua
index d59c3bb4ea..e8a77450eb 100644
--- a/biblio/citation-style-language/citeproc-engine.lua
+++ b/biblio/citation-style-language/citeproc-engine.lua
@@ -9,21 +9,16 @@ local engine = {}
local dom = require("luaxml-domobject")
local nodes = require("citeproc-nodes")
+local Element = require("citeproc-element").Element
local Style = require("citeproc-node-style").Style
local Locale = require("citeproc-node-locale").Locale
local Context = require("citeproc-context").Context
local IrState = require("citeproc-context").IrState
-local Rendered = require("citeproc-ir-node").Rendered
-local YearSuffix = require("citeproc-ir-node").YearSuffix
+local InlineElement = require("citeproc-output").InlineElement
-- local OutputFormat = require("citeproc-output").OutputFormat
local LatexWriter = require("citeproc-output").LatexWriter
local HtmlWriter = require("citeproc-output").HtmlWriter
local SortStringFormat = require("citeproc-output").SortStringFormat
-local DisamStringFormat = require("citeproc-output").DisamStringFormat
-local InlineElement = require("citeproc-output").InlineElement
-local Micro = require("citeproc-output").Micro
-local Formatted = require("citeproc-output").Formatted
-local PlainText = require("citeproc-output").PlainText
local util = require("citeproc-util")
@@ -56,8 +51,7 @@ function CiteProc.new(sys, style, lang, force_lang)
o.opt = {
-- Similar to citeproc-js's development_extensions.wrap_url_and_doi
- url_link = false,
- doi_link = false, -- also applied to PMID and PMCID
+ wrap_url_and_doi = false,
title_link = false,
}
@@ -173,16 +167,10 @@ function CiteProc:updateUncitedItems(uncited_ids)
self.note_citations_map = {}
end
+
function CiteProc:processCitationCluster(citation, citationsPre, citationsPost)
-- util.debug(citation)
- -- util.debug(citationsPre)
- -- Fix missing noteIndex: sort_CitationNumberPrimaryAscendingViaMacroCitation.txt
- if not citation.properties then
- citation.properties = {}
- end
- if not citation.properties.noteIndex then
- citation.properties.noteIndex = 0
- end
+ citation = self:normalize_citation_input(citation)
-- Registor citation
self.registry.citations_by_id[citation.citationID] = citation
@@ -228,6 +216,7 @@ function CiteProc:processCitationCluster(citation, citationsPre, citationsPost)
local output = {}
local tainted_citation_ids = self:get_tainted_citaion_ids(citation_note_pairs)
+ tainted_citation_ids[citation.citationID] = true
-- util.debug(tainted_citation_ids)
-- params.bibchange = #tainted_citation_ids > 0
@@ -235,19 +224,37 @@ function CiteProc:processCitationCluster(citation, citationsPre, citationsPost)
local citation_ = self.registry.citations_by_id[citation_id]
local citation_index = citation_.citation_index
- local citation_str = self:build_citation_str(citation_)
+
+ local mode = citation_.properties.mode
+ if mode == "suppress-author" and self.style.class == "note" then
+ mode = nil
+ end
+ local citation_elemement = self.style.citation
+ if mode == "author-only" and self.style.intext then
+ citation_elemement = self.style.intext
+ end
+
+ local citation_str = citation_elemement:build_citation_str(citation_, self)
table.insert(output, {citation_index, citation_str, citation_id})
end
- -- util.debug(output)
return {params, output}
end
--- A variant of processCitationCluster() for easy use with LaTeX.
--- It should be run after refreshing the registry (updateItems()) with all items
-function CiteProc:process_citation(citation)
- -- util.debug(citation)
- -- util.debug(citationsPre)
+function CiteProc:normalize_citation_input(citation)
+ citation = util.deep_copy(citation)
+
+ if not citation.citationID then
+ citation.citationID = "CITATION-" .. tostring(#self.registry.citation_list)
+ end
+
+ if not citation.citationItems then
+ citation.citationItems = {}
+ end
+ for i, cite_item in ipairs(citation.citationItems) do
+ citation.citationItems[i] = self:normalize_cite_item(cite_item)
+ end
+
-- Fix missing noteIndex: sort_CitationNumberPrimaryAscendingViaMacroCitation.txt
if not citation.properties then
citation.properties = {}
@@ -256,6 +263,48 @@ function CiteProc:process_citation(citation)
citation.properties.noteIndex = 0
end
+ return citation
+end
+
+function CiteProc:normalize_cite_item(cite_item)
+ -- Shallow copy
+ cite_item = util.clone(cite_item)
+ cite_item.id = tostring(cite_item.id)
+
+ -- Use "page" as locator label if missing
+ -- label_PluralWithAmpersand.txt
+ if cite_item.locator and not cite_item.label then
+ cite_item.label = "page"
+ end
+
+ if cite_item.prefix then
+ -- Assert CSL rich-text or HTML-like tagged string
+ if cite_item.prefix == "" then
+ cite_item.prefix = nil
+ else
+ cite_item.prefix = InlineElement:parse(cite_item.prefix)
+ end
+ end
+ if cite_item.suffix then
+ if cite_item.suffix == "" then
+ cite_item.suffix = nil
+ else
+ cite_item.suffix = InlineElement:parse(cite_item.suffix)
+ end
+ end
+
+ return cite_item
+end
+
+-- A variant of processCitationCluster() for easy use with LaTeX.
+-- It should be run after refreshing the registry (updateItems()) with all items
+function CiteProc:process_citation(citation)
+ -- util.debug(citation)
+ -- util.debug(citationsPre)
+ -- Fix missing noteIndex: sort_CitationNumberPrimaryAscendingViaMacroCitation.txt
+
+ citation = self:normalize_citation_input(citation)
+
-- Registor citation
self.registry.citations_by_id[citation.citationID] = citation
@@ -276,12 +325,21 @@ function CiteProc:process_citation(citation)
-- self:updateItems(item_ids)
for i, cite_item in ipairs(citation.citationItems) do
- cite_item.id = tostring(cite_item.id)
self:get_item(cite_item.id)
end
local tainted_citation_ids = self:get_tainted_citaion_ids(citation_note_pairs)
- local citation_str = self:build_citation_str(citation)
+
+ local mode = citation.properties.mode
+ if mode == "suppress-author" and self.style.class == "note" then
+ mode = nil
+ end
+ local citation_elemement = self.style.citation
+ if mode == "author-only" and self.style.intext then
+ citation_elemement = self.style.intext
+ end
+
+ local citation_str = citation_elemement:build_citation_str(citation, self)
return citation_str
end
@@ -310,9 +368,14 @@ function CiteProc:get_tainted_citaion_ids(citation_note_pairs)
local previous_cite
for _, cite_item in ipairs(citation.citationItems) do
- tainted = self:set_cite_item_position(cite_item, note_number, previous_cite, previous_citation)
- self.cite_last_note_numbers[cite_item.id] = note_number
- previous_cite = cite_item
+ tainted = self:set_cite_item_position(cite_item, note_number, previous_cite, previous_citation, citation)
+
+ -- https://citeproc-js.readthedocs.io/en/latest/csl-json/markup.html#citations
+ -- Citations within the main text of the document have a noteIndex of zero.
+ if (self.style.class == "note" and note_number > 0) or citation.properties.mode ~= "author-only" then
+ self.cite_last_note_numbers[cite_item.id] = note_number
+ previous_cite = cite_item
+ end
end
if tainted then
@@ -323,7 +386,9 @@ function CiteProc:get_tainted_citaion_ids(citation_note_pairs)
self.note_citations_map[note_number] = {}
end
table.insert(self.note_citations_map[note_number], citation.citationID)
- previous_citation = citation
+ if citation.properties.mode ~= "author-only" then
+ previous_citation = citation
+ end
end
-- Update tainted citation ids because of citation-number's change
@@ -339,9 +404,20 @@ function CiteProc:get_tainted_citaion_ids(citation_note_pairs)
return tainted_citation_ids
end
-function CiteProc:set_cite_item_position(cite_item, note_number, previous_cite, previous_citation)
+function CiteProc:set_cite_item_position(cite_item, note_number, previous_cite, previous_citation, citation)
local position = util.position_map["first"]
+ -- https://citeproc-js.readthedocs.io/en/latest/csl-json/markup.html#citations
+ -- Citations within the main text of the document have a noteIndex of zero.
+ if self.style.class == "note" and note_number == 0 then
+ cite_item.position_level = position
+ return false
+ elseif citation.properties.mode == "author-only" then
+ -- discretionary_IbidInAuthorDateStyleWithoutIntext.txt
+ cite_item.position_level = position
+ return false
+ end
+
local first_reference_note_number = self.cite_first_note_numbers[cite_item.id]
if first_reference_note_number then
position = util.position_map["subsequent"]
@@ -429,1163 +505,24 @@ function CiteProc:_get_cite_position(item, preceding_cite)
end
end
-function CiteProc:build_citation_str(citation)
- -- util.debug(citation.citationID)
- local items = {}
- for i, cite_item in ipairs(citation.citationItems) do
- cite_item.id = tostring(cite_item.id)
- -- util.debug(cite_item.id)
-
- -- Use "page" as locator label if missing
- -- label_PluralWithAmpersand.txt
- if cite_item.locator and not cite_item.label then
- cite_item.label = "page"
- end
-
- table.insert(items, cite_item)
- end
-
- if self.registry.requires_sorting then
- self:sort_bibliography()
- end
-
- local citation_str = self:build_cluster(items)
- return citation_str
-end
-
-function CiteProc:build_cluster(citation_items)
- local output_format = self.output_format
- local irs = {}
- citation_items = self:sorted_citation_items(citation_items)
- for _, cite_item in ipairs(citation_items) do
- local ir = self:build_fully_disambiguated_ir(cite_item, output_format)
- table.insert(irs, ir)
- end
-
- if self.style.citation.cite_grouping then
- irs = self:group_cites(irs)
- else
- local citation_collapse = self.style.citation.collapse
- if citation_collapse == "year" or citation_collapse == "year-suffix" or
- citation_collapse == "year-suffix-ranged" then
- irs = self:group_cites(irs)
- end
- end
-
- if self.style.citation.collapse then
- self:collapse_cites(irs)
- end
-
- -- Capitalize first
- for i, ir in ipairs(irs) do
- -- local layout_prefix
- -- local layout_affixes = self.style.citation.layout.affixes
- -- if layout_affixes then
- -- layout_prefix = layout_affixes.prefix
- -- end
- local prefix = citation_items[i].prefix
- if prefix then
- if prefix and string.match(prefix, "[.!?]%s*$") and #util.split(util.strip(prefix)) > 1 then
- ir:capitalize_first_term()
- end
- else
- local delimiter = self.style.citation.layout.delimiter
- if i == 1 or not delimiter or string.match(delimiter, "[.!?]%s*$") then
- ir:capitalize_first_term()
- end
- end
- end
-
- -- util.debug(irs)
-
- local citation_delimiter = self.style.citation.layout.delimiter
- local citation_stream = {}
-
- local context = Context:new()
- context.engine = self
- context.style = self.style
- context.area = self.style.citation
- context.in_bibliography = false
- context.locale = self:get_locale(self.lang)
- context.name_inheritance = self.style.citation.name_inheritance
- context.format = output_format
-
- local previous_ir
- for i, ir in ipairs(irs) do
- local cite_prefix = citation_items[i].prefix
- local cite_suffix = citation_items[i].suffix
- if not ir.collapse_suppressed then
- local ir_inlines = ir:flatten(output_format)
- if #ir_inlines > 0 then
- -- Make sure ir_inlines has outputs contents.
- -- collapse_AuthorCollapseNoDateSorted.txt
- if previous_ir then
- if previous_ir.own_delimiter then
- table.insert(citation_stream, PlainText:new(previous_ir.own_delimiter))
- elseif citation_delimiter and not (cite_prefix and util.startswith(cite_prefix, ",")) then
- table.insert(citation_stream, PlainText:new(citation_delimiter))
- end
- end
-
- if cite_prefix then
- table.insert(citation_stream, Micro:new(InlineElement:parse(cite_prefix, context)))
- end
-
- -- util.debug(ir)
- util.extend(citation_stream, ir_inlines)
- previous_ir = ir
-
- if cite_suffix then
- table.insert(citation_stream, Micro:new(InlineElement:parse(cite_suffix, context)))
- end
- end
- end
- end
- -- util.debug(citation_stream)
-
- if context.area.layout.affixes then
- local affixes = context.area.layout.affixes
- if affixes.prefix then
- table.insert(citation_stream, 1, PlainText:new(affixes.prefix))
- end
- if affixes.suffix then
- table.insert(citation_stream, PlainText:new(affixes.suffix))
- end
- end
- -- util.debug(citation_stream)
-
- if #citation_stream > 0 and context.area.layout.formatting then
- citation_stream = {Formatted:new(citation_stream, context.area.layout.formatting)}
- end
-
- if #citation_stream == 0 then
- citation_stream = {PlainText:new("[CSL STYLE ERROR: reference with no printed form.]")}
- end
-
- -- util.debug(citation_stream)
- local str = output_format:output(citation_stream, context)
- str = util.strip(str)
-
- return str
-end
-
-function CiteProc:sorted_citation_items(items)
- local citation_sort = self.style.citation.sort
- if not citation_sort then
- return items
- end
-
- local state = IrState:new()
- local context = Context:new()
- context.engine = self
- context.style = self.style
- context.area = self.style.citation
- context.in_bibliography = false
- context.locale = self:get_locale(self.lang)
- context.name_inheritance = self.style.citation.name_inheritance
- context.format = SortStringFormat:new()
- -- context.id = id
- context.cite = nil
- -- context.reference = self:get_item(id)
-
- items = citation_sort:sort(items, state, context)
- return items
-end
-
-function CiteProc:build_fully_disambiguated_ir(cite_item, output_format)
- local cite_ir = self:build_ambiguous_ir(cite_item, output_format)
- -- util.debug(cite_ir)
- cite_ir = self:disambiguate_add_givenname(cite_ir)
- cite_ir = self:disambiguate_add_names(cite_ir)
- cite_ir = self:disambiguate_conditionals(cite_ir)
- cite_ir = self:disambiguate_add_year_suffix(cite_ir)
- return cite_ir
-end
-
-function CiteProc:build_ambiguous_ir(cite_item, output_format)
- local state = IrState:new(self.style)
- cite_item.id = tostring(cite_item.id)
- local context = Context:new()
- context.engine = self
- context.style = self.style
- context.area = self.style.citation
- context.locale = self:get_locale(self.lang)
- context.name_inheritance = self.style.citation.name_inheritance
- context.format = output_format
- context.id = cite_item.id
- context.cite = cite_item
- -- context.reference = self:get_item(cite_item.id)
- context.reference = self.registry.registry[cite_item.id]
-
- local ir
- if context.reference then
- ir = self.style.citation:build_ir(self, state, context)
- else
- ir = Rendered:new({Formatted:new({PlainText:new(cite_item.id)}, {["font-weight"] = "bold"})}, self)
- end
-
- ir.cite_item = cite_item
- ir.reference = context.reference
- ir.ir_index = #self.disam_irs + 1
- table.insert(self.disam_irs, ir)
- ir.is_ambiguous = false
- ir.disam_level = 0
-
- -- Formattings like font-style are ignored for disambiguation.
- local disam_format = DisamStringFormat:new()
- local inlines = ir:flatten(disam_format)
- local disam_str = disam_format:output(inlines, context)
- ir.disam_str = disam_str
-
- if not self.cite_irs_by_output[disam_str] then
- self.cite_irs_by_output[disam_str] = {}
- end
-
- for ir_index, ir_ in pairs(self.cite_irs_by_output[disam_str]) do
- if ir_.cite_item.id ~= cite_item.id then
- ir.is_ambiguous = true
- break
- end
- end
- self.cite_irs_by_output[disam_str][ir.ir_index] = ir
-
- return ir
-end
-
-function CiteProc:disambiguate_add_givenname(cite_ir)
- if self.style.citation.disambiguate_add_givenname then
- -- util.debug("disambiguate_add_givenname: " .. cite_ir.cite_item.id)
-
- local gn_disam_rule = self.style.citation.givenname_disambiguation_rule
- if gn_disam_rule == "all-names" or gn_disam_rule == "all-names-with-initials" then
- cite_ir = self:disambiguate_add_givenname_all_names(cite_ir)
- elseif gn_disam_rule == "primary-name" or gn_disam_rule == "primary-name-with-initials" then
- cite_ir = self:disambiguate_add_givenname_primary_name(cite_ir)
- elseif gn_disam_rule == "by-cite" then
- cite_ir = self:disambiguate_add_givenname_by_cite(cite_ir)
- end
- end
- return cite_ir
-end
-
--- TODO: reorganize this code
-function CiteProc:disambiguate_add_givenname_all_names(cite_ir)
- -- util.debug("disambiguate_add_givenname_all_names: " .. cite_ir.cite_item.id)
- if not cite_ir.person_name_irs or #cite_ir.person_name_irs == 0 then
- return cite_ir
- end
-
- -- util.debug(cite_ir.disam_str)
-
- for _, person_name_ir in ipairs(cite_ir.person_name_irs) do
- local name_output = person_name_ir.name_output
- -- util.debug(name_output)
-
- if not person_name_ir.person_name_index then
- person_name_ir.person_name_index = #self.person_names + 1
- table.insert(self.person_names, person_name_ir)
- end
-
- if not self.person_names_by_output[name_output] then
- self.person_names_by_output[name_output] = {}
- end
- self.person_names_by_output[name_output][person_name_ir.person_name_index] = person_name_ir
-
- local ambiguous_name_irs = {}
- local ambiguous_same_output_irs = {}
-
- for _, pn_ir in pairs(self.person_names_by_output[person_name_ir.name_output]) do
- if pn_ir.full_name ~= person_name_ir.full_name then
- table.insert(ambiguous_name_irs, pn_ir)
- end
- if pn_ir.name_output == person_name_ir.name_output then
- table.insert(ambiguous_same_output_irs, pn_ir)
- end
- end
-
- -- util.debug(person_name_ir.name_output)
- -- util.debug(person_name_ir.full_name)
- -- util.debug(#ambiguous_name_irs)
- -- util.debug(person_name_ir.disam_variants_index)
- -- util.debug(person_name_ir.disam_variants)
-
- while person_name_ir.disam_variants_index < #person_name_ir.disam_variants do
- if #ambiguous_name_irs == 0 then
- break
- end
-
- for _, pn_ir in ipairs(ambiguous_same_output_irs) do
- -- expand one name
- if pn_ir.disam_variants_index < #pn_ir.disam_variants then
- pn_ir.disam_variants_index = pn_ir.disam_variants_index + 1
- pn_ir.name_output = pn_ir.disam_variants[pn_ir.disam_variants_index]
- pn_ir.inlines = pn_ir.disam_inlines[pn_ir.name_output]
-
- if not self.person_names_by_output[pn_ir.name_output] then
- self.person_names_by_output[pn_ir.name_output] = {}
- end
- self.person_names_by_output[pn_ir.name_output][pn_ir.person_name_index] = pn_ir
- end
- end
-
- -- util.debug(person_name_ir.name_output)
-
- -- update ambiguous_name_irs and ambiguous_same_output_irs
- ambiguous_name_irs = {}
- ambiguous_same_output_irs = {}
- for _, pn_ir in pairs(self.person_names_by_output[person_name_ir.name_output]) do
- if pn_ir.full_name ~= person_name_ir.full_name then
- -- util.debug(pn_ir.full_name .. ": " .. pn_ir.name_output)
- table.insert(ambiguous_name_irs, pn_ir)
- end
- if pn_ir.name_output == person_name_ir.name_output then
- table.insert(ambiguous_same_output_irs, pn_ir)
- end
- end
-
- end
- end
-
- -- update cite_ir output
- local disam_format = DisamStringFormat:new()
- local inlines = cite_ir:flatten(disam_format)
- local disam_str = disam_format:output(inlines, context)
- cite_ir.disam_str = disam_str
- if not self.cite_irs_by_output[disam_str] then
- self.cite_irs_by_output[disam_str] = {}
- end
- self.cite_irs_by_output[disam_str][cite_ir.ir_index] = cite_ir
-
- -- update ambiguous_cite_irs and ambiguous_same_output_irs
- local ambiguous_cite_irs = {}
- for ir_index, ir_ in pairs(self.cite_irs_by_output[cite_ir.disam_str]) do
- -- util.debug(ir_.cite_item.id)
- if ir_.cite_item.id ~= cite_ir.cite_item.id then
- table.insert(ambiguous_cite_irs, ir_)
- end
- end
- if #ambiguous_cite_irs == 0 then
- cite_ir.is_ambiguous = false
- end
-
- return cite_ir
-end
-
-function CiteProc:disambiguate_add_givenname_primary_name(cite_ir)
- if not cite_ir.person_name_irs or #cite_ir.person_name_irs == 0 then
- return cite_ir
- end
- local person_name_ir = cite_ir.person_name_irs[1]
- local name_output = person_name_ir.name_output
- -- util.debug(name_output)
-
- if not person_name_ir.person_name_index then
- person_name_ir.person_name_index = #self.person_names + 1
- table.insert(self.person_names, person_name_ir)
- end
- if not self.person_names_by_output[name_output] then
- self.person_names_by_output[name_output] = {}
- end
- self.person_names_by_output[name_output][person_name_ir.person_name_index] = person_name_ir
-
- local ambiguous_name_irs = {}
- local ambiguous_same_output_irs = {}
-
- for _, pn_ir in pairs(self.person_names_by_output[person_name_ir.name_output]) do
- if pn_ir.full_name ~= person_name_ir.full_name then
- table.insert(ambiguous_name_irs, pn_ir)
- end
- if pn_ir.name_output == person_name_ir.name_output then
- table.insert(ambiguous_same_output_irs, pn_ir)
- end
- end
-
- for _, name_variant in ipairs(person_name_ir.disam_variants) do
- if #ambiguous_name_irs == 0 then
- break
- end
-
- for _, pn_ir in ipairs(ambiguous_same_output_irs) do
- -- expand one name
- if pn_ir.disam_variants_index < #pn_ir.disam_variants then
- pn_ir.disam_variants_index = pn_ir.disam_variants_index + 1
- pn_ir.name_output = pn_ir.disam_variants[pn_ir.disam_variants_index]
- pn_ir.inlines = pn_ir.disam_inlines[pn_ir.name_output]
-
- if not self.person_names_by_output[pn_ir.name_output] then
- self.person_names_by_output[pn_ir.name_output] = {}
- end
- self.person_names_by_output[pn_ir.name_output][person_name_ir.person_name_index] = person_name_ir
- end
- end
-
- -- update ambiguous_name_irs and ambiguous_same_output_irs
- ambiguous_name_irs = {}
- ambiguous_same_output_irs = {}
- for _, pn_ir in pairs(self.person_names_by_output[person_name_ir.name_output]) do
- if pn_ir.full_name ~= person_name_ir.full_name then
- table.insert(ambiguous_name_irs, pn_ir)
- end
- if pn_ir.name_output == person_name_ir.name_output then
- table.insert(ambiguous_same_output_irs, pn_ir)
- end
- end
- end
-
- return cite_ir
-end
-
-function CiteProc:disambiguate_add_givenname_by_cite(cite_ir)
- if not cite_ir.is_ambiguous then
- return cite_ir
- end
- if not cite_ir.person_name_irs or #cite_ir.person_name_irs == 0 then
- return cite_ir
- end
-
- for _, ir_ in ipairs(self.disam_irs) do
- -- util.debug(ir_.cite_item.id)
- -- util.debug(ir_.disam_str)
- end
-
- local disam_format = DisamStringFormat:new()
-
- local ambiguous_cite_irs = {}
- local ambiguous_same_output_irs = {}
-
- for ir_index, ir_ in pairs(self.cite_irs_by_output[cite_ir.disam_str]) do
- if ir_.cite_item.id ~= cite_ir.cite_item.id then
- table.insert(ambiguous_cite_irs, ir_)
- end
- if ir_.disam_str == cite_ir.disam_str then
- table.insert(ambiguous_same_output_irs, ir_)
- end
- end
-
- for i, person_name_ir in ipairs(cite_ir.person_name_irs) do
- -- util.debug(person_name_ir.name_output)
- -- util.debug(person_name_ir.disam_variants)
- if #ambiguous_cite_irs == 0 then
- cite_ir.is_ambiguous = false
- break
- end
-
- -- util.debug(person_name_ir.disam_variants)
- while person_name_ir.disam_variants_index < #person_name_ir.disam_variants do
- -- util.debug(person_name_ir.name_output)
-
- local is_different_name = false
- for _, ir_ in ipairs(ambiguous_cite_irs) do
- if ir_.person_name_irs[i] then
- if ir_.person_name_irs[i].full_name ~= person_name_ir.full_name then
- -- util.debug(ir_.cite_item.id)
- is_different_name = true
- break
- end
- end
- end
- -- util.debug(is_different_name)
- if not is_different_name then
- break
- end
-
- for _, ir_ in ipairs(ambiguous_same_output_irs) do
- -- util.debug(ir_.cite_item.id)
- local person_name_ir_ = ir_.person_name_irs[i]
- if person_name_ir_ then
- if person_name_ir_.disam_variants_index < #person_name_ir_.disam_variants then
- person_name_ir_.disam_variants_index = person_name_ir_.disam_variants_index + 1
- local disam_variant = person_name_ir_.disam_variants[person_name_ir_.disam_variants_index]
- person_name_ir_.name_output = disam_variant
- -- util.debug(disam_variant)
- person_name_ir_.inlines = person_name_ir_.disam_inlines[disam_variant]
- -- Update cite ir output
- local inlines = ir_:flatten(disam_format)
- local disam_str = disam_format:output(inlines, context)
- ir_.disam_str = disam_str
- if not self.cite_irs_by_output[disam_str] then
- self.cite_irs_by_output[disam_str] = {}
- end
- self.cite_irs_by_output[disam_str][ir_.ir_index] = ir_
- end
- end
- end
-
- -- update ambiguous_cite_irs and ambiguous_same_output_irs
- ambiguous_cite_irs = {}
- ambiguous_same_output_irs = {}
- for ir_index, ir_ in pairs(self.cite_irs_by_output[cite_ir.disam_str]) do
- -- util.debug(ir_.cite_item.id)
- if ir_.cite_item.id ~= cite_ir.cite_item.id then
- table.insert(ambiguous_cite_irs, ir_)
- end
- if ir_.disam_str == cite_ir.disam_str then
- table.insert(ambiguous_same_output_irs, ir_)
- end
- end
-
- -- util.debug(#ambiguous_cite_irs)
-
- if #ambiguous_cite_irs == 0 then
- cite_ir.is_ambiguous = false
- return cite_ir
- end
-
- end
- end
-
- return cite_ir
-end
-
-local function find_first_name_ir(ir)
- if ir._type == "NameIr" then
- return ir
- end
- if ir.children then
- for _, child in ipairs(ir.children) do
- local name_ir = find_first_name_ir(child)
- if name_ir then
- return name_ir
- end
- end
- end
- return nil
-end
-
-function CiteProc:disambiguate_add_names(cite_ir)
- if not self.style.citation.disambiguate_add_names then
- return cite_ir
- end
-
- if not cite_ir.name_ir then
- cite_ir.name_ir = find_first_name_ir(cite_ir)
- end
- local name_ir = cite_ir.name_ir
-
- if not cite_ir.is_ambiguous then
- return cite_ir
- end
-
- if not name_ir or not name_ir.et_al_abbreviation then
- return cite_ir
- end
-
- -- util.debug("disambiguate_add_names: " .. cite_ir.cite_item.id)
-
- if name_ir then
- -- util.debug(cite_ir.disam_str)
- -- util.debug(cite_ir.name_ir.full_name_str)
- -- util.debug(cite_ir.is_ambiguous)
- end
-
- local disam_format = DisamStringFormat:new()
-
- while cite_ir.is_ambiguous do
- if #cite_ir.name_ir.hidden_name_irs == 0 then
- break
- end
-
- local ambiguous_cite_irs = {}
- local ambiguous_same_output_irs = {}
- for _, ir_ in pairs(self.cite_irs_by_output[cite_ir.disam_str]) do
- if ir_.cite_item.id ~= cite_ir.cite_item.id then
- table.insert(ambiguous_cite_irs, ir_)
- end
- if ir_.disam_str == cite_ir.disam_str then
- table.insert(ambiguous_same_output_irs, ir_)
- end
- end
-
- -- util.debug(#ambiguous_same_output_irs)
- if #ambiguous_cite_irs == 0 then
- cite_ir.is_ambiguous = false
- break
- end
-
- -- check if the cite can be (fully) disambiguated by adding names
- local can_be_disambuguated = false
- for _, ir_ in ipairs(ambiguous_cite_irs) do
- if ir_.name_ir.full_name_str ~= cite_ir.name_ir.full_name_str then
- can_be_disambuguated = true
- break
- end
- end
- -- util.debug(can_be_disambuguated)
- if not can_be_disambuguated then
- break
- end
-
- for _, ir_ in ipairs(ambiguous_same_output_irs) do
- local added_person_name_ir = ir_.name_ir.name_inheritance:expand_one_name(ir_.name_ir)
- if added_person_name_ir then
- -- util.debug("Updated: " .. ir_.cite_item.id)
- table.insert(ir_.person_name_irs, added_person_name_ir)
-
- if not added_person_name_ir.person_name_index then
- added_person_name_ir.person_name_index = #self.person_names + 1
- table.insert(self.person_names, added_person_name_ir)
- end
- local name_output = added_person_name_ir.name_output
- if not self.person_names_by_output[name_output] then
- self.person_names_by_output[name_output] = {}
- end
- self.person_names_by_output[name_output][added_person_name_ir.person_name_index] = added_person_name_ir
-
- -- Update ir output
- local inlines = ir_:flatten(disam_format)
- local disam_str = disam_format:output(inlines, context)
- -- util.debug(disam_str)
- ir_.disam_str = disam_str
- if not self.cite_irs_by_output[disam_str] then
- self.cite_irs_by_output[disam_str] = {}
- end
- self.cite_irs_by_output[disam_str][ir_.ir_index] = ir_
- end
- end
-
- -- util.debug("disambiguate_add_givenname")
-
- if self.style.citation.disambiguate_add_givenname then
- local gn_disam_rule = self.style.citation.givenname_disambiguation_rule
- if gn_disam_rule == "all-names" or gn_disam_rule == "all-names-with-initials" then
- cite_ir = self:disambiguate_add_givenname_all_names(cite_ir)
- elseif gn_disam_rule == "by-cite" then
- cite_ir = self:disambiguate_add_givenname_by_cite(cite_ir)
- end
- end
-
- cite_ir.is_ambiguous = self:check_ambiguity(cite_ir)
-
- for _, ir_ in ipairs(self.disam_irs) do
- -- util.debug(ir_.cite_item.id .. ": " .. ir_.disam_str)
- end
-
- end
-
-
- return cite_ir
-end
-
-function CiteProc:collect_irs_with_disambiguate_branch(ir)
- local irs_with_disambiguate_branch = {}
- if ir.children then
- for i, child_ir in ipairs(ir.children) do
- if child_ir.disambiguate_branch_ir then
- table.insert(irs_with_disambiguate_branch, child_ir)
- elseif child_ir.children then
- util.extend(irs_with_disambiguate_branch,
- self:collect_irs_with_disambiguate_branch(child_ir))
- end
- end
- end
- return irs_with_disambiguate_branch
-end
-
-function CiteProc:disambiguate_conditionals(cite_ir)
- -- util.debug(cite_ir)
-
- cite_ir.irs_with_disambiguate_branch = self:collect_irs_with_disambiguate_branch(cite_ir)
-
- local disam_format = DisamStringFormat:new()
-
- while cite_ir.is_ambiguous do
- if #cite_ir.irs_with_disambiguate_branch == 0 then
- break
- end
-
- -- util.debug(cite_ir.cite_item.id)
- -- util.debug(cite_ir.disam_str)
-
- -- update ambiguous_same_output_irs
- local ambiguous_same_output_irs = {}
- for _, ir_ in pairs(self.cite_irs_by_output[cite_ir.disam_str]) do
- if ir_.disam_str == cite_ir.disam_str then
- table.insert(ambiguous_same_output_irs, ir_)
- end
- end
-
- for _, ir_ in ipairs(ambiguous_same_output_irs) do
- if #ir_.irs_with_disambiguate_branch > 0 then
- -- Disambiguation is incremental
- -- disambiguate_IncrementalExtraText.txt
- local condition_ir = ir_.irs_with_disambiguate_branch[1]
- condition_ir.children[1] = condition_ir.disambiguate_branch_ir
- condition_ir.group_var = condition_ir.disambiguate_branch_ir.group_var
- table.remove(ir_.irs_with_disambiguate_branch, 1)
- -- disambiguate_DisambiguateTrueReflectedInBibliography.txt
- ir_.reference.disambiguate = true
-
- -- Update ir output
- local inlines = ir_:flatten(disam_format)
- local disam_str = disam_format:output(inlines, context)
- -- util.debug("update: " .. ir_.cite_item.id .. ": " .. disam_str)
- ir_.disam_str = disam_str
- if not self.cite_irs_by_output[disam_str] then
- self.cite_irs_by_output[disam_str] = {}
- end
- self.cite_irs_by_output[disam_str][ir_.ir_index] = ir_
- end
- end
-
- cite_ir.is_ambiguous = self:check_ambiguity(cite_ir)
- -- util.debug(cite_ir.is_ambiguous)
- for _, ir_ in ipairs(self.disam_irs) do
- -- util.debug(ir_.cite_item.id .. ": " .. ir_.disam_str)
- end
-
- end
- return cite_ir
-end
-
-function CiteProc:check_ambiguity(cite_ir)
- for _, ir_ in pairs(self.cite_irs_by_output[cite_ir.disam_str]) do
- if ir_.cite_item.id ~= cite_ir.cite_item.id then
- return true
- end
- end
- return false
-end
-
-function CiteProc:get_same_output_irs(cite_ir)
- local ambiguous_same_output_irs = {}
- for _, ir_ in pairs(self.cite_irs_by_output[cite_ir.disam_str]) do
- if ir_.disam_str == cite_ir.disam_str then
- table.insert(ambiguous_same_output_irs, ir_)
- end
- end
- return ambiguous_same_output_irs
-end
-
-function CiteProc:disambiguate_add_year_suffix(cite_ir)
- if not cite_ir.is_ambiguous or not self.style.citation.disambiguate_add_year_suffix then
- return cite_ir
- end
-
- local same_output_irs = self:get_same_output_irs(cite_ir)
-
- table.sort(same_output_irs, function (a, b)
- -- return a.ir_index < b.ir_index
- return a.reference["citation-number"] < b.reference["citation-number"]
- end)
-
- local year_suffix_number = 0
- -- util.debug(cite_ir)
-
- local disam_format = DisamStringFormat:new()
-
- for _, ir_ in ipairs(same_output_irs) do
- ir_.reference.year_suffix_number = nil
- end
-
- for _, ir_ in ipairs(same_output_irs) do
- -- print(ir_.cite_item.id)
- -- print(ir_.reference)
- if not ir_.reference.year_suffix_number then
- year_suffix_number = year_suffix_number + 1
- ir_.reference.year_suffix_number = year_suffix_number
- ir_.reference["year-suffix"] = self:render_year_suffix(year_suffix_number)
- end
-
- if not ir_.year_suffix_irs then
- ir_.year_suffix_irs = self:collect_year_suffix_irs(ir_)
- if #ir_.year_suffix_irs == 0 then
- -- By default, the year-suffix is appended the first year rendered through cs:date
- local year_ir = self:find_first_year_ir(ir_)
- -- util.debug(year_ir)
- if year_ir then
- local year_suffix_ir = YearSuffix:new({}, self.style.citation)
- table.insert(year_ir.children, year_suffix_ir)
- table.insert(ir_.year_suffix_irs, year_suffix_ir)
- end
- end
- end
-
- for _, year_suffix_ir in ipairs(ir_.year_suffix_irs) do
- year_suffix_ir.inlines = {PlainText:new(ir_.reference["year-suffix"])}
- year_suffix_ir.year_suffix_number = ir_.reference.year_suffix_number
- year_suffix_ir.group_var = "important"
- end
-
- local inlines = ir_:flatten(disam_format)
- local disam_str = disam_format:output(inlines, context)
- -- util.debug("update: " .. ir_.cite_item.id .. ": " .. disam_str)
- ir_.disam_str = disam_str
- if not self.cite_irs_by_output[disam_str] then
- self.cite_irs_by_output[disam_str] = {}
- end
- self.cite_irs_by_output[disam_str][ir_.ir_index] = ir_
-
- end
-
- cite_ir.is_ambiguous = false
-
- return cite_ir
-end
-
-function CiteProc:collect_year_suffix_irs(ir)
- local year_suffix_irs = {}
- if ir.children then
- for i, child_ir in ipairs(ir.children) do
- if child_ir._type == "YearSuffix" then
- table.insert(year_suffix_irs, child_ir)
- elseif child_ir.children then
- util.extend(year_suffix_irs,
- self:collect_year_suffix_irs(child_ir))
- end
- end
- end
- return year_suffix_irs
-end
-
-function CiteProc:find_first_year_ir(ir)
- if ir.is_year then
- return ir
- end
- if ir.children then
- for _, child_ir in ipairs(ir.children) do
- local year_ir = self:find_first_year_ir(child_ir)
- if year_ir then
- return year_ir
- end
- end
- end
- return nil
-end
-
-function CiteProc:render_year_suffix(year_suffix_number)
- if year_suffix_number <= 0 then
- return nil
- end
- local year_suffix = ""
- while year_suffix_number > 0 do
- local i = (year_suffix_number - 1) % 26
- year_suffix = string.char(i + 97) .. year_suffix
- year_suffix_number = (year_suffix_number - 1) // 26
- end
- -- util.debug(year_suffix)
- return year_suffix
-end
-
-local function find_first(ir, check)
- if check(ir) then
- return ir
- end
- if ir.children then
- for _, child in ipairs(ir.children) do
- local target_ir = find_first(child, check)
- if target_ir then
- return target_ir
- end
- end
- end
- return nil
-end
-
-function CiteProc:group_cites(irs)
- local disam_format = DisamStringFormat:new()
- for _, ir in ipairs(irs) do
- local first_names_ir = ir.first_names_ir
- if not first_names_ir then
- first_names_ir = find_first(ir, function (ir_)
- return ir_._element == "names"
- end)
- if first_names_ir then
- local inlines = first_names_ir:flatten(disam_format)
- first_names_ir.disam_str = disam_format:output(inlines, context)
- end
- ir.first_names_ir = first_names_ir
- end
- end
-
- local irs_by_name = {}
- local name_list = {}
-
- for _, ir in ipairs(irs) do
- local name_str = ""
- if ir.first_names_ir then
- name_str = ir.first_names_ir.disam_str
- end
- if not irs_by_name[name_str] then
- irs_by_name[name_str] = {}
- table.insert(name_list, name_str)
- end
- table.insert(irs_by_name[name_str], ir)
- end
-
- local grouped = {}
- for _, name_str in ipairs(name_list) do
- local irs_with_same_name = irs_by_name[name_str]
- for i, ir in ipairs(irs_with_same_name) do
- if i < #irs_with_same_name then
- ir.own_delimiter = self.style.citation.cite_group_delimiter
- end
- table.insert(grouped, ir)
- end
- end
- return grouped
-end
-
-function CiteProc:collapse_cites(irs)
- if self.style.citation.collapse == "citation-number" then
- self:collapse_cites_by_citation_number(irs)
- elseif self.style.citation.collapse == "year" then
- self:collapse_cites_by_year(irs)
- elseif self.style.citation.collapse == "year-suffix" then
- self:collapse_cites_by_year_suffix(irs)
- elseif self.style.citation.collapse == "year-suffix-ranged" then
- self:collapse_cites_by_year_suffix_ranged(irs)
- end
-end
-
-function CiteProc:collapse_cites_by_citation_number(irs)
- local cite_groups = {}
- local current_group = {}
- local previous_citation_number
- for i, ir in ipairs(irs) do
- local citation_number
- local only_citation_number_ir = self:get_only_citation_number(ir)
- if only_citation_number_ir then
- -- Other irs like locators are not rendered.
- -- collapse_CitationNumberRangesWithAffixesGrouped.txt
- citation_number = only_citation_number_ir.citation_number
- end
- if i == 1 then
- table.insert(current_group, ir)
- elseif citation_number and previous_citation_number and
- previous_citation_number + 1 == citation_number then
- table.insert(current_group, ir)
- else
- table.insert(cite_groups, current_group)
- current_group = {ir}
- end
- previous_citation_number = citation_number
- end
- table.insert(cite_groups, current_group)
-
- for _, cite_group in ipairs(cite_groups) do
- if #cite_group >= 3 then
- cite_group[1].own_delimiter = util.unicode["en dash"]
- for i = 2, #cite_group - 1 do
- cite_group[i].collapse_suppressed = true
- end
- cite_group[#cite_group].own_delimiter = self.style.citation.after_collapse_delimiter
- end
- end
-end
-
-function CiteProc:get_only_citation_number(ir)
- if ir.citation_number then
- return ir
- end
- if not ir.children then
- return nil
- end
- local only_citation_number_ir
- for _, child in ipairs(ir.children) do
- if child.group_var ~= "missing" then
- local citation_number_ir = self:get_only_citation_number(child)
- if citation_number_ir then
- if only_citation_number_ir then
- return nil
- else
- only_citation_number_ir = citation_number_ir
- end
- else
- return false
- end
- end
- end
- return only_citation_number_ir
-end
-
-function CiteProc:collapse_cites_by_year(irs)
- local cite_groups = {{}}
- local previous_name_str
- for i, ir in ipairs(irs) do
- local name_str
- if ir.first_names_ir then
- name_str = ir.first_names_ir.disam_str
- end
- if i == 1 then
- table.insert(cite_groups[#cite_groups], ir)
- elseif name_str and name_str == previous_name_str then
- -- ir.fist_names_ir was set in the cite grouping stage
- -- TODO: and not previous cite suffix
- table.insert(cite_groups[#cite_groups], ir)
- else
- table.insert(cite_groups, {ir})
- end
- previous_name_str = name_str
- end
-
- for _, cite_group in ipairs(cite_groups) do
- if #cite_group > 1 then
- for i, cite_ir in ipairs(cite_group) do
- if i > 1 and cite_ir.first_names_ir then
- cite_ir.first_names_ir.collapse_suppressed = true
- end
- if i == #cite_group then
- cite_ir.own_delimiter = self.style.citation.after_collapse_delimiter
- elseif i < #cite_group then
- -- The delimiter depends on the citation > sort.
- -- https://github.com/citation-style-language/test-suite/issues/39#issuecomment-687901688
- if cite_ir.cite_item.locator then
- -- Special hack for
- cite_ir.own_delimiter = self.style.citation.after_collapse_delimiter
- elseif self.style.citation.cite_grouping then
- if self.style.citation.sort then
- cite_ir.own_delimiter = self.style.citation.cite_group_delimiter
- else
- cite_ir.own_delimiter = self.style.citation.layout.delimiter
- end
- else
- if self.style.citation.sort then
- cite_ir.own_delimiter = self.style.citation.cite_group_delimiter
- else
- -- disambiguate_YearCollapseWithInstitution.txt
- -- disambiguate_InitializeWithButNoDisambiguation.txt ?
- cite_ir.own_delimiter = self.style.citation.layout.delimiter
- end
- end
- end
- end
- end
- end
-end
-
-local function find_rendered_year_suffix(ir)
- if ir._type == "YearSuffix" then
- return ir
- end
- if ir.children then
- for _, child in ipairs(ir.children) do
- if child.group_var ~= "missing" then
- local year_suffix = find_rendered_year_suffix(child)
- if year_suffix then
- return year_suffix
- end
- end
- end
- end
- return nil
-end
-
-function CiteProc:collapse_cites_by_year_suffix(irs)
- self:collapse_cites_by_year(irs)
- -- Group by disam_str
- -- The year-suffix is ommitted in DisamStringFormat
- local cite_groups = {{}}
- local previous_ir
- local previous_year_suffix
- for i, ir in ipairs(irs) do
- local year_suffix = find_rendered_year_suffix(ir)
- ir.rendered_year_suffix_ir = year_suffix
- if i == 1 then
- table.insert(cite_groups[#cite_groups], ir)
- elseif year_suffix and previous_ir.disam_str == ir.disam_str and previous_year_suffix then
- -- TODO: and not previous cite suffix
- table.insert(cite_groups[#cite_groups], ir)
- else
- table.insert(cite_groups, {ir})
- end
- previous_ir = ir
- previous_year_suffix = year_suffix
- end
-
- for _, cite_group in ipairs(cite_groups) do
- if #cite_group > 1 then
- for i, cite_ir in ipairs(cite_group) do
- if i > 1 then
- -- cite_ir.children = {cite_ir.rendered_year_suffix_ir}
- -- Set the collapse_suppressed flag rather than removing the child irs.
- -- This leaves the disamb ir structure unchanged.
- self:suppress_ir_except_child(cite_ir, cite_ir.rendered_year_suffix_ir)
- end
- if i < #cite_group then
- if self.style.citation.cite_grouping then
- -- In the current citeproc-js impplementation, explicitly set
- -- cite-group-delimiter takes precedence over year-suffix-delimiter.
- -- May be changed in the future.
- -- https://github.com/citation-style-language/test-suite/issues/50
- cite_ir.own_delimiter = self.style.citation.cite_group_delimiter
- else
- cite_ir.own_delimiter = self.style.citation.year_suffix_delimiter
- end
- elseif i == #cite_group then
- cite_ir.own_delimiter = self.style.citation.after_collapse_delimiter
- end
- end
- end
- end
-end
-
-function CiteProc:suppress_ir_except_child(ir, target)
- if ir == target then
- ir.collapse_suppressed = false
- return false
- end
- ir.collapse_suppressed = true
- if ir.children then
- for _, child in ipairs(ir.children) do
- if child.group_var ~= "missing" and not child.collapse_suppressed then
- if not self:suppress_ir_except_child(child, target) then
- ir.collapse_suppressed = false
- end
- end
- end
- end
- return ir.collapse_suppressed
-end
-
-function CiteProc:collapse_cites_by_year_suffix_ranged(irs)
- self:collapse_cites_by_year_suffix(irs)
- -- Group by disam_str
- local cite_groups = {{}}
- local previous_ir
- local previous_year_suffix
- for i, ir in ipairs(irs) do
- local year_suffix_ir = find_rendered_year_suffix(ir)
- ir.rendered_year_suffix_ir = year_suffix_ir
- if i == 1 then
- table.insert(cite_groups[#cite_groups], ir)
- elseif year_suffix_ir and previous_ir.disam_str == ir.disam_str and previous_year_suffix and
- year_suffix_ir.year_suffix_number == previous_year_suffix.year_suffix_number + 1 then
- -- TODO: and not previous cite suffix
- table.insert(cite_groups[#cite_groups], ir)
- else
- table.insert(cite_groups, {ir})
- end
- previous_ir = ir
- previous_year_suffix = year_suffix_ir
- end
-
- for _, cite_group in ipairs(cite_groups) do
- if #cite_group > 2 then
- for i, cite_ir in ipairs(cite_group) do
- if i == 1 then
- cite_ir.own_delimiter = util.unicode["en dash"]
- elseif i < #cite_group then
- cite_ir.collapse_suppressed = true
- end
- end
- end
- end
-end
-
function CiteProc:makeCitationCluster(citation_items)
+ local special_form = nil
local items = {}
+
for i, cite_item in ipairs(citation_items) do
- cite_item.id = tostring(cite_item.id)
+ cite_item = self:normalize_cite_item(cite_item)
local item_data = self:get_item(cite_item.id)
-- Create a wrapper of the orignal item from registry so that
-- it may hold different `locator` or `position` values for cites.
local item = setmetatable(cite_item, {__index = item_data})
- -- Use "page" as locator label if missing
- -- label_PluralWithAmpersand.txt
- if item.locator and not item.label then
- item.label = "page"
+ if not special_form then
+ for _, form in ipairs({"author-only", "suppress-author", "coposite"}) do
+ if cite_item[form] then
+ special_form = form
+ end
+ end
end
item.position_level = util.position_map["first"]
@@ -1618,7 +555,12 @@ function CiteProc:makeCitationCluster(citation_items)
self:sort_bibliography()
end
- local res = self:build_cluster(items)
+ local citation_element = self.style.citation
+ if special_form == "author-only" and self.style.intext then
+ citation_element = self.style.intext
+ end
+
+ local res = citation_element:build_cluster(items, self)
-- local context = {
-- build = {},
@@ -1641,42 +583,14 @@ function CiteProc:makeBibliography()
return {{}, {}}
end
- local output_format = self.output_format
-
local res = {}
self.registry.longest_label = ""
self.registry.maxoffset = 0
for _, id in ipairs(self:get_sorted_refs()) do
- local ref = self.registry.registry[id]
-
- local state = IrState:new()
- local context = Context:new()
- context.engine = self
- context.style = self.style
- context.area = self.style.bibliography
- context.in_bibliography = true
- context.locale = self:get_locale(self.lang)
- context.name_inheritance = self.style.bibliography.name_inheritance
- context.format = output_format
- context.id = id
- context.cite = nil
- context.reference = self:get_item(id)
-
- local ir = self.style.bibliography:build_ir(self, state, context)
- -- util.debug(ir)
- ir.reference = context.reference
-
- -- Add year-suffix
- self:add_bibliography_year_suffix(ir)
-
- -- The layout output may be empty: sort_OmittedBibRefNonNumericStyle.txt
- if ir then
- local flat = ir:flatten(output_format)
- local str = output_format:output_bibliography_entry(flat, context)
- table.insert(res, str)
- end
+ local str = self.style.bibliography:build_bibliography_str(id, self)
+ table.insert(res, str)
end
local bib_start = self.output_format.markups["bibstart"]
@@ -1709,34 +623,6 @@ function CiteProc:get_sorted_refs()
return self.registry.reflist
end
-function CiteProc:add_bibliography_year_suffix(ir)
- if not ir.reference.year_suffix_number then
- return
- end
-
- local year_suffix_number = ir.reference.year_suffix_number
-
- if not ir.year_suffix_irs then
- ir.year_suffix_irs = self:collect_year_suffix_irs(ir)
- if #ir.year_suffix_irs == 0 then
- local year_ir = self:find_first_year_ir(ir)
- -- util.debug(year_ir)
- if year_ir then
- local year_suffix_ir = YearSuffix:new({}, self.style.citation)
- table.insert(year_ir.children, year_suffix_ir)
- table.insert(ir.year_suffix_irs, year_suffix_ir)
- end
- end
- end
-
- for _, year_suffix_ir in ipairs(ir.year_suffix_irs) do
- year_suffix_ir.inlines = {PlainText:new(ir.reference["year-suffix"])}
- year_suffix_ir.group_var = "important"
- end
-
-
-end
-
function CiteProc:set_output_format(format)
if format == "latex" then
self.output_format = LatexWriter:new()
@@ -1746,13 +632,11 @@ function CiteProc:set_output_format(format)
end
function CiteProc:enable_linking()
- self.opt.url_link = true
- self.opt.doi_link = true
+ self.opt.wrap_url_and_doi = true
end
function CiteProc:disable_linking()
- self.opt.url_link = false
- self.opt.doi_link = false
+ self.opt.wrap_url_and_doi = false
end
function CiteProc.create_element_tree(node)
@@ -1806,6 +690,7 @@ function CiteProc:_retrieve_item(id)
return nil
end
+ -- TODO: normalize data input
item.id = tostring(item.id)
for key, value in pairs(item) do
@@ -1985,6 +870,22 @@ function CiteProc:get_style_class()
end
+local Macro = Element:derive("macro")
+
+function Macro:from_node(node)
+ local o = Macro:new()
+ o.children = {}
+ o:set_attribute(node, "name")
+ o:process_children_nodes(node)
+ return o
+end
+
+function Macro:build_ir(engine, state, context)
+ local ir = self:build_group_ir(engine, state, context)
+ return ir
+end
+
+
engine.CiteProc = CiteProc
return engine
diff --git a/biblio/citation-style-language/citeproc-ir-node.lua b/biblio/citation-style-language/citeproc-ir-node.lua
index 01cca4abf6..50fe34b059 100644
--- a/biblio/citation-style-language/citeproc-ir-node.lua
+++ b/biblio/citation-style-language/citeproc-ir-node.lua
@@ -74,6 +74,35 @@ function IrNode:capitalize_first_term()
end
end
+function IrNode:collect_year_suffix_irs()
+ local year_suffix_irs = {}
+ if self.children then
+ for i, child_ir in ipairs(self.children) do
+ if child_ir._type == "YearSuffix" then
+ table.insert(year_suffix_irs, child_ir)
+ elseif child_ir.children then
+ util.extend(year_suffix_irs,
+ child_ir:collect_year_suffix_irs())
+ end
+ end
+ end
+ return year_suffix_irs
+end
+
+function IrNode:find_first_year_ir()
+ if self.is_year then
+ return self
+ end
+ if self.children then
+ for _, child_ir in ipairs(self.children) do
+ local year_ir = child_ir:find_first_year_ir()
+ if year_ir then
+ return year_ir
+ end
+ end
+ end
+ return nil
+end
local Rendered = IrNode:derive("Rendered")
diff --git a/biblio/citation-style-language/citeproc-latex-core.lua b/biblio/citation-style-language/citeproc-latex-core.lua
index 325217862b..0fa0b40ca3 100644
--- a/biblio/citation-style-language/citeproc-latex-core.lua
+++ b/biblio/citation-style-language/citeproc-latex-core.lua
@@ -10,6 +10,7 @@ local citeproc = require("citeproc")
local bibtex -- = require("citeproc-bibtex") -- load on demand
local util = citeproc.util
require("lualibs")
+local latex_parser = require("citeproc-latex-parser")
core.locale_file_format = "csl-locales-%s.xml"
@@ -74,7 +75,13 @@ local function read_data_file(data_file)
local csl_items = nil
if extension == ".json" then
- csl_items = utilities.json.tolua(contents)
+ local status, res = pcall(utilities.json.tolua, contents)
+ if status and res then
+ csl_items = res
+ else
+ util.error(string.format('JSON decoding error in file "%s"', data_file))
+ csl_items = {}
+ end
elseif extension == ".bib" then
bibtex = bibtex or require("citeproc-bibtex")
csl_items = bibtex.parse(contents)
@@ -169,14 +176,21 @@ end
function core.make_citation(citation_info)
-- `citation_info`: "citationID={ITEM-1@2},citationItems={{id={ITEM-1},label={page},locator={6}}},properties={noteIndex={3}}"
local citation = parse_latex_prop(citation_info)
- assert(citation.citationID)
- assert(citation.citationItems)
- assert(citation.properties)
+ -- assert(citation.citationID)
+ -- assert(citation.citationItems)
+ -- assert(citation.properties)
- citation.citationItems = parse_latex_seq(citation.citationItems)
+ citation.citationItems = parse_latex_seq(citation.citationItems)
for i, item in ipairs(citation.citationItems) do
- citation.citationItems[i] = parse_latex_prop(item)
+ local citation_item = parse_latex_prop(item)
+ if citation_item.prefix then
+ citation_item.prefix = latex_parser.convert_latex_to_rich_text(citation_item.prefix)
+ end
+ if citation_item.suffix then
+ citation_item.suffix = latex_parser.convert_latex_to_rich_text(citation_item.suffix)
+ end
+ citation.citationItems[i] = citation_item
end
citation.properties = parse_latex_prop(citation.properties)
@@ -269,21 +283,37 @@ function core.make_bibliography(engine)
local res = ""
- local bib_options = ""
- if params["hangingindent"] then
- bib_options = bib_options .. "\n hanging-indent = true,"
- end
- if params["linespacing"] then
- bib_options = bib_options .. string.format("\n line-spacing = %d,", params["linespacing"])
- end
- if params["entryspacing"] then
- bib_options = bib_options .. string.format("\n entry-spacing = %d,", params["entryspacing"])
+ local bib_options = {}
+ bib_options["class"] = engine:get_style_class()
+ local bib_option_list = {"class"}
+
+ local bib_option_map = {
+ ["entry-spacing"] = "entryspacing",
+ ["line-spacing"] = "linespacing",
+ ["hanging-indent"] = "hangingindent",
+ }
+ local bib_option_order = {
+ "class",
+ "hanging-indent",
+ "line-spacing",
+ "entry-spacing",
+ }
+
+ for option, param in pairs(bib_option_map) do
+ if params[param] then
+ bib_options[option] = params[param]
+ end
end
- if bib_options ~= "" then
- bib_options = "\\cslsetup{" .. bib_options .. "\n}\n\n"
- res = res .. bib_options
+ local bib_options_str = "\\cslsetup{\n"
+ for _, option in ipairs(bib_option_order) do
+ local value = bib_options[option]
+ if value then
+ bib_options_str = bib_options_str .. string.format(" %s = %s,\n", option, tostring(value))
+ end
end
+ bib_options_str = bib_options_str .. "}\n"
+ res = res .. bib_options_str .. "\n"
-- util.debug(params.bibstart)
if params.bibstart then
diff --git a/biblio/citation-style-language/citeproc-latex-parser.lua b/biblio/citation-style-language/citeproc-latex-parser.lua
new file mode 100644
index 0000000000..1dcc2d4c77
--- /dev/null
+++ b/biblio/citation-style-language/citeproc-latex-parser.lua
@@ -0,0 +1,259 @@
+--
+-- Copyright (c) 2021-2022 Zeping Lee
+-- Released under the MIT license.
+-- Repository: https://github.com/zepinglee/citeproc-lua
+--
+
+local latex_parser = {}
+
+local lpeg = require("lpeg")
+local unicode = require("unicode")
+local bibtex_data = require("citeproc-bibtex-data")
+local util = require("citeproc-util")
+
+
+function latex_parser.get_latex_grammar()
+ local P = lpeg.P
+ local R = lpeg.R
+ local S = lpeg.S
+ local C = lpeg.C
+ local Cc = lpeg.Cc
+ local Cf = lpeg.Cf
+ local Cg = lpeg.Cg
+ local Cmt = lpeg.Cmt
+ local Cp = lpeg.Cp
+ local Ct = lpeg.Ct
+ local V = lpeg.V
+
+ local space = S(" \t\r\n")^0
+ local specials = P"\\$" / "$"
+ + P"\\%" / "%"
+ + P"\\&" / "&"
+ + P"\\#" / "#"
+ + P"\\_" / "_"
+ + P"\\{" / "{"
+ + P"\\}" / "}"
+ + P"~" / util.unicode["no-break space"]
+ local control_sequence = C(P"\\" * (R("AZ", "az")^1 + 1) * space) / function (cs)
+ return {
+ type = "control_sequence",
+ name = util.rstrip(cs),
+ raw = cs,
+ }
+ end
+ local math = P"$" * C((P"\\$" + 1 - S"$")^0) * P"$" / function (math_text)
+ return {
+ type = "math",
+ contents = math_text,
+ }
+ end
+ local ligatures = P"``" / util.unicode["left double quotation mark"]
+ + P"`" / util.unicode["left single quotation mark"]
+ + P"''" / util.unicode["right double quotation mark"]
+ + P"'" / util.unicode["right single quotation mark"]
+ + P"---" / util.unicode["em dash"]
+ + P"--" / util.unicode["en dash"]
+ local plain_text = C(1 - S"{}$\\")
+ local latex_grammar = P{
+ "latex_text";
+ latex_text = Ct((specials + control_sequence + math + ligatures + specials + V"group" + plain_text)^0),
+ group = P"{" * V"latex_text" * P"}" / function (group_contents)
+ return {
+ type = "group",
+ contents = group_contents,
+ }
+ end,
+ }
+ return latex_grammar
+end
+
+
+latex_parser.latex_grammar = latex_parser.get_latex_grammar()
+
+
+function latex_parser.convert_latex_to_rich_text(str)
+ local ast = latex_parser.latex_grammar:match(str)
+ latex_parser.convert_accents_to_unicode(ast)
+ local res = latex_parser.convert_ast_to_rich_text(ast)
+ return res
+end
+
+
+local format_commands_with_argment = {
+ ["\\textbf"] = "bold",
+ ["\\textit"] = "italic",
+ ["\\textsl"] = "italic",
+ ["\\emph"] = "italic",
+ ["\\enquote"] = "quote",
+ ["\\textsc"] = "sc",
+ ["\\sout"] = "strike", -- from ulem package
+ ["\\st"] = "strike", -- from soul package
+ ["\\textsuperscript"] = "sup",
+ ["\\textsubscript"] = "sub",
+}
+
+local format_commands_without_argment = {
+ ["\\bf"] = "bold",
+ ["\\bfseries"] = "bold",
+ ["\\it"] = "italic",
+ ["\\itshape"] = "italic",
+ ["\\sl"] = "italic",
+ ["\\slshape"] = "italic",
+ ["\\em"] = "italic",
+ ["\\scshape"] = "sc",
+ ["\\sc"] = "sc",
+}
+
+
+function latex_parser.convert_accents_to_unicode(tokens)
+ local res = ""
+ local i = 1
+ while i <= #tokens do
+ if type(token) == "table" and token.type == "control_sequence" then
+ local cs = token
+ local code_point = bibtex_data.unicode_commands[cs.name]
+ if code_point then
+ local unicode_char
+ if type(code_point) == "string" then
+ unicode_char = utf8.char(tonumber(code_point, 16))
+ tokens[i] = unicode_char
+
+ elseif type(code_point) == "table" then
+ -- The command takes an argument (\"{o})
+ local arg
+ if i < #tokens then
+ local next_token = tokens[i + 1]
+ if type(next_token) == "string" then
+ arg = next_token
+ elseif type(next_token) == "table" then
+ if next_token.type == "control_sequence" then
+ arg = next_token.name
+ elseif next_token.type == "group" then
+ if #next_token.contents == 0 then
+ arg = "{}"
+ elseif #next_token.contents == 1 then
+ next_token = next_token.contents[1]
+ if type(next_token) == "string" then
+ arg = next_token
+ elseif type(next_token) == "table" then
+ arg = next_token.name
+ end
+ end
+ end
+ end
+ end
+ if arg and code_point[arg] then
+ unicode_char = utf8.char(tonumber(code_point[arg], 16))
+ tokens[i] = unicode_char
+ table.remove(tokens, i + 1)
+ end
+ end
+ end
+ end
+ i = i + 1
+ end
+ return res
+end
+
+
+
+function latex_parser.convert_ast_to_rich_text(tokens)
+ local res = {}
+
+ local tmp_str = ""
+ local i = 1
+ while i <= #tokens do
+ local token = tokens[i]
+ if type(token) == "string" then
+ tmp_str = tmp_str .. token
+ elseif type(token) == "table" then
+ if tmp_str ~= "" then
+ table.insert(res, tmp_str)
+ tmp_str = ""
+ end
+ if token.type == "control_sequence" then
+ local format_with_argment = format_commands_with_argment[token.name]
+ local format_without_argment = format_commands_without_argment[token.name]
+ if format_with_argment then
+ if i < #tokens then
+ local next_token = tokens[i + 1]
+ local rich_text
+ if type(next_token) == "string" then
+ rich_text = {[format_with_argment] = next_token}
+ elseif type(next_token) == "table" then
+ if next_token.type == "control_sequence" then
+ local content = {code = next_token.raw}
+ rich_text = {[format_with_argment] = {content}}
+ elseif next_token.type == "group" then
+ rich_text = {[format_with_argment] = latex_parser.convert_ast_to_rich_text(next_token.contents)}
+ elseif next_token.type == "math" then
+ local content = latex_parser.convert_ast_to_rich_text(next_token.contents)
+ rich_text = {[format_with_argment] = {{["math-tex"] = content}}}
+ end
+ end
+ if rich_text then
+ table.insert(res, rich_text)
+ i = i + 1
+ end
+ else
+ table.insert(res, {code = token.raw})
+ end
+
+ elseif format_without_argment then
+ local rest_tokens = {}
+ for j = i + 1, #tokens do
+ table.insert(rest_tokens, tokens[j])
+ end
+ local rich_text = {[format_without_argment] = latex_parser.convert_ast_to_rich_text(rest_tokens)}
+ table.insert(res, rich_text)
+ i = #tokens
+
+ else
+ local rich_text = {code = token.raw}
+ table.insert(res, rich_text)
+
+ end
+
+ elseif token.type == "group" then
+ table.insert(res, {code = "{"})
+ for _, rich_text in ipairs(latex_parser.convert_ast_to_rich_text(token.contents)) do
+ table.insert(res, rich_text)
+ end
+ table.insert(res, {code = "}"})
+
+ elseif token.type == "math" then
+ table.insert(res, {["math-tex"] = token.contents})
+ end
+
+ end
+ i = i + 1
+ end
+
+ if tmp_str ~= "" then
+ table.insert(res, tmp_str)
+ end
+
+ -- Merge tokens
+ for i = #res - 1, 1, -1 do
+ local token = res[i]
+ local next_token = res[i + 1]
+ local token_type = type(token)
+ local next_token_type = type(next_token)
+ if token_type == "string" and next_token_type == "string" then
+ res[i] = token .. next_token
+ table.remove(res, i + 1)
+ elseif token_type == "table" and token.code and
+ next_token_type == "table" and next_token.code then
+ token.code = token.code .. next_token.code
+ table.remove(res, i + 1)
+ end
+ end
+
+ if #res == 1 and type(res[1]) == "string" then
+ res = res[1]
+ end
+
+ return res
+end
+
+return latex_parser
diff --git a/biblio/citation-style-language/citeproc-latex.lua b/biblio/citation-style-language/citeproc-latex.lua
index 4b05f0bdd6..4b17ce35ef 100644
--- a/biblio/citation-style-language/citeproc-latex.lua
+++ b/biblio/citation-style-language/citeproc-latex.lua
@@ -87,11 +87,11 @@ end
function csl.cite(citation_info)
-- "citationID={ITEM-UNAVAILABLE@1},citationItems={{id={ITEM-UNAVAILABLE}}},properties={noteIndex={1}}"
- -- util.debug(citation_info)
if not csl.engine then
csl.error("CSL engine is not initialized.")
end
+ -- util.debub(citation_info)
local citation = core.make_citation(citation_info)
local citation_str
@@ -103,8 +103,11 @@ function csl.cite(citation_info)
citation_str = csl.engine:process_citation(citation)
end
- tex.sprint(string.format("{%s}{%s}", csl.style_class, citation_str))
+ -- util.debug(citation_str)
-- tex.sprint(citation_str)
+ -- tex.setcatcode(35, 12) -- #
+ -- tex.setcatcode(37, 12) -- %
+ token.set_macro("l__csl_citation_tl", citation_str)
table.insert(csl.citations_pre, {citation.citationID, citation.properties.noteIndex})
end
diff --git a/biblio/citation-style-language/citeproc-node-bibliography.lua b/biblio/citation-style-language/citeproc-node-bibliography.lua
new file mode 100644
index 0000000000..c6e1575a51
--- /dev/null
+++ b/biblio/citation-style-language/citeproc-node-bibliography.lua
@@ -0,0 +1,307 @@
+--
+-- Copyright (c) 2021-2022 Zeping Lee
+-- Released under the MIT license.
+-- Repository: https://github.com/zepinglee/citeproc-lua
+--
+
+local bibliography_module = {}
+
+local dom = require("luaxml-domobject")
+
+local Context = require("citeproc-context").Context
+local IrState = require("citeproc-context").IrState
+local Element = require("citeproc-element").Element
+local IrNode = require("citeproc-ir-node").IrNode
+local Rendered = require("citeproc-ir-node").Rendered
+local SeqIr = require("citeproc-ir-node").SeqIr
+local PlainText = require("citeproc-output").PlainText
+local DisamStringFormat = require("citeproc-output").DisamStringFormat
+local YearSuffix = require("citeproc-ir-node").YearSuffix
+local util = require("citeproc-util")
+
+
+local Bibliography = Element:derive("bibliography", {
+ hanging_indent = false,
+ line_spacing = 1,
+ entry_spacing = 1,
+ subsequent_author_substitute_rule = "complete-all"
+})
+
+function Bibliography:from_node(node, style)
+ local o = Bibliography:new()
+ o.children = {}
+
+ o:process_children_nodes(node)
+
+ -- o.layouts = nil -- CSL-M extension
+
+ for _, child in ipairs(o.children) do
+ local element_name = child.element_name
+ if element_name == "layout" then
+ o.layout = child
+ elseif element_name == "sort" then
+ o.sort = child
+ end
+ end
+
+ -- Whitespace
+ o:set_bool_attribute(node, "hanging-indent")
+ o:set_attribute(node, "second-field-align")
+ o:set_number_attribute(node, "line-spacing")
+ o:set_number_attribute(node, "entry-spacing")
+
+ -- Reference Grouping
+ o:set_attribute(node, "subsequent-author-substitute")
+ o:set_attribute(node, "subsequent-author-substitute-rule")
+
+ local name_inheritance = require("citeproc-node-names").Name:new()
+ for key, value in pairs(style.name_inheritance) do
+ if value ~= nil then
+ name_inheritance[key] = value
+ end
+ end
+ Element.make_name_inheritance(name_inheritance, node)
+ o.name_inheritance = name_inheritance
+
+ return o
+end
+
+function Bibliography:build_bibliography_str(id, engine)
+ local output_format = engine.output_format
+
+ local state = IrState:new()
+ local context = Context:new()
+ context.engine = engine
+ context.style = engine.style
+ context.area = self
+ context.in_bibliography = true
+ context.locale = engine:get_locale(engine.lang)
+ context.name_inheritance = self.name_inheritance
+ context.format = output_format
+ context.id = id
+ context.cite = nil
+ context.reference = engine:get_item(id)
+
+ local ir = self:build_ir(engine, state, context)
+ -- util.debug(ir)
+ ir.reference = context.reference
+
+ -- Add year-suffix
+ self:add_bibliography_year_suffix(ir, engine)
+
+ -- The layout output may be empty: sort_OmittedBibRefNonNumericStyle.txt
+ if not ir then
+ return nil
+ end
+
+ local flat = ir:flatten(output_format)
+ local str = output_format:output_bibliography_entry(flat, context)
+ return str
+end
+
+function Bibliography:build_ir(engine, state, context)
+ if not self.layout then
+ util.error("Missing bibliography layout.")
+ end
+ local ir = self.layout:build_ir(engine, state, context)
+ -- util.debug(ir)
+ if self.second_field_align == "flush" and #ir.children >= 2 then
+ ir.children[1].display = "left-margin"
+ local right_inline_ir = SeqIr:new(util.slice(ir.children, 2), self)
+ right_inline_ir.display = "right-inline"
+ if ir.affixes then
+ right_inline_ir.affixes = ir.affixes
+ right_inline_ir.formatting = ir.formatting
+ ir.affixes = nil
+ ir.formatting = nil
+ end
+ ir.children = {ir.children[1], right_inline_ir}
+ end
+
+ if self.subsequent_author_substitute then
+ self:substitute_subsequent_authors(engine, ir)
+ end
+
+ if not ir then
+ ir = Rendered:new({PlainText:new("[CSL STYLE ERROR: reference with no printed form.]")}, self)
+ end
+ return ir
+end
+
+function Bibliography:substitute_subsequent_authors(engine, ir)
+ ir.first_name_ir = self:find_first_name_ir(ir) -- should be a SeqIr wiht _element = "names"
+ if not ir.first_name_ir then
+ engine.previous_bib_names_ir = nil
+ return
+ end
+ if self.subsequent_author_substitute_rule == "complete-all" then
+ self:substitute_subsequent_authors_complete_all(engine, ir)
+ elseif self.subsequent_author_substitute_rule == "complete-each" then
+ self:substitute_subsequent_authors_complete_each(engine, ir)
+ elseif self.subsequent_author_substitute_rule == "partial-each" then
+ self:substitute_subsequent_authors_partial_each(engine, ir)
+ elseif self.subsequent_author_substitute_rule == "partial-first" then
+ self:substitute_subsequent_authors_partial_first(engine, ir)
+ end
+ engine.previous_bib_names_ir = ir.first_name_ir
+end
+
+function Bibliography:find_first_name_ir(ir)
+ if ir._type == "NameIr" then
+ return ir
+ elseif ir.children then
+ for _, child_ir in ipairs(ir.children) do
+ local first_name_ir = self:find_first_name_ir(child_ir)
+ if first_name_ir then
+ return first_name_ir
+ end
+ end
+ end
+ return nil
+end
+
+function Bibliography:substitute_subsequent_authors_complete_all(engine, ir)
+ local bib_names_str = ""
+
+ if #ir.first_name_ir.person_name_irs > 0 then
+ for _, person_name_ir in ipairs(ir.first_name_ir.person_name_irs) do
+ if bib_names_str ~= "" then
+ bib_names_str = bib_names_str .. " "
+ end
+ local name_variants = person_name_ir.disam_variants
+ bib_names_str = bib_names_str .. name_variants[#name_variants]
+ end
+ else
+ -- In case of a <text variable="title"/> in <substitute>
+ local disam_format = DisamStringFormat:new()
+ local inlines = ir.first_name_ir:flatten(disam_format)
+ bib_names_str = disam_format:output(inlines)
+ end
+ ir.first_name_ir.bib_names_str = bib_names_str
+
+ if engine.previous_bib_names_ir and
+ engine.previous_bib_names_ir.bib_names_str == bib_names_str then
+ local text = self.subsequent_author_substitute
+ if text == "" then
+ ir.first_name_ir.children = {}
+ ir.first_name_ir.group_var = "missing"
+ else
+ -- the output of label is not substituted
+ -- util.debug(ir.first_name_ir)
+ ir.first_name_ir.children = {Rendered:new({PlainText:new(text)}, self)}
+ end
+ end
+end
+
+function Bibliography:substitute_subsequent_authors_complete_each(engine, ir)
+ local bib_names_str = ""
+
+ if #ir.first_name_ir.person_name_irs > 0 then
+ for _, person_name_ir in ipairs(ir.first_name_ir.person_name_irs) do
+ if bib_names_str ~= "" then
+ bib_names_str = bib_names_str .. " "
+ end
+ local name_variants = person_name_ir.disam_variants
+ bib_names_str = bib_names_str .. name_variants[#name_variants]
+ end
+ else
+ -- In case of a <text variable="title"/> in <substitute>
+ local disam_format = DisamStringFormat:new()
+ local inlines = ir.first_name_ir:flatten(disam_format)
+ bib_names_str = disam_format:output(inlines)
+ end
+ ir.first_name_ir.bib_names_str = bib_names_str
+
+ if engine.previous_bib_names_ir and
+ engine.previous_bib_names_ir.bib_names_str == bib_names_str then
+ local text = self.subsequent_author_substitute
+ if #ir.first_name_ir.person_name_irs > 0 then
+ for _, person_name_ir in ipairs(ir.first_name_ir.person_name_irs) do
+ person_name_ir.inlines = {PlainText:new(text)}
+ end
+ else
+ -- In case of a <text variable="title"/> in <substitute>
+ if text == "" then
+ ir.first_name_ir.children = {}
+ ir.first_name_ir.group_var = "missing"
+ else
+ ir.first_name_ir.children = {Rendered:new({PlainText:new(text)}, self)}
+ end
+ end
+ end
+end
+
+function Bibliography:substitute_subsequent_authors_partial_each(engine, ir)
+ local bib_names_str = ""
+
+ if #ir.first_name_ir.person_name_irs > 0 then
+ if engine.previous_bib_names_ir then
+ for i, person_name_ir in ipairs(ir.first_name_ir.person_name_irs) do
+ local prev_name_ir = engine.previous_bib_names_ir.person_names[i]
+ if prev_name_ir then
+ local prev_name_variants = prev_name_ir.disam_variants
+ local prev_full_name_str = prev_name_variants[#prev_name_variants]
+ local name_variants = person_name_ir.disam_variants
+ local full_name_str = name_variants[#name_variants]
+ if prev_full_name_str == full_name_str then
+ local text = self.subsequent_author_substitute
+ person_name_ir.inlines = {PlainText:new(text)}
+ else
+ break
+ end
+ end
+ end
+ end
+ else
+ -- In case of a <text variable="title"/> in <substitute>
+ local disam_format = DisamStringFormat:new()
+ local inlines = ir.first_name_ir:flatten(disam_format)
+ bib_names_str = disam_format:output(inlines)
+ ir.first_name_ir.bib_names_str = bib_names_str
+ if engine.previous_bib_names_ir and
+ engine.previous_bib_names_ir.bib_names_str == bib_names_str then
+ local text = self.subsequent_author_substitute
+ if text == "" then
+ ir.first_name_ir.children = {}
+ ir.first_name_ir.group_var = "missing"
+ else
+ ir.first_name_ir.children = {Rendered:new({PlainText:new(text)}, self)}
+ end
+ end
+ end
+end
+
+function Bibliography:substitute_subsequent_authors_partial_first(engine, ir)
+end
+
+function Bibliography:add_bibliography_year_suffix(ir, engine)
+ if not ir.reference.year_suffix_number then
+ return
+ end
+
+ local year_suffix_number = ir.reference.year_suffix_number
+
+ if not ir.year_suffix_irs then
+ ir.year_suffix_irs = ir:collect_year_suffix_irs()
+ if #ir.year_suffix_irs == 0 then
+ local year_ir = ir:find_first_year_ir()
+ -- util.debug(year_ir)
+ if year_ir then
+ local year_suffix_ir = YearSuffix:new({}, engine.style.citation)
+ table.insert(year_ir.children, year_suffix_ir)
+ table.insert(ir.year_suffix_irs, year_suffix_ir)
+ end
+ end
+ end
+
+ for _, year_suffix_ir in ipairs(ir.year_suffix_irs) do
+ year_suffix_ir.inlines = {PlainText:new(ir.reference["year-suffix"])}
+ year_suffix_ir.group_var = "important"
+ end
+end
+
+
+bibliography_module.Bibliography = Bibliography
+
+
+return bibliography_module
diff --git a/biblio/citation-style-language/citeproc-node-citation.lua b/biblio/citation-style-language/citeproc-node-citation.lua
new file mode 100644
index 0000000000..6c7f082746
--- /dev/null
+++ b/biblio/citation-style-language/citeproc-node-citation.lua
@@ -0,0 +1,1417 @@
+
+--
+-- Copyright (c) 2021-2022 Zeping Lee
+-- Released under the MIT license.
+-- Repository: https://github.com/zepinglee/citeproc-lua
+--
+
+local citation_module = {}
+
+local dom = require("luaxml-domobject")
+
+local Context = require("citeproc-context").Context
+local IrState = require("citeproc-context").IrState
+local Element = require("citeproc-element").Element
+local IrNode = require("citeproc-ir-node").IrNode
+local Rendered = require("citeproc-ir-node").Rendered
+local SeqIr = require("citeproc-ir-node").SeqIr
+local YearSuffix = require("citeproc-ir-node").YearSuffix
+local Micro = require("citeproc-output").Micro
+local Formatted = require("citeproc-output").Formatted
+local PlainText = require("citeproc-output").PlainText
+local InlineElement = require("citeproc-output").InlineElement
+local DisamStringFormat = require("citeproc-output").DisamStringFormat
+local SortStringFormat = require("citeproc-output").SortStringFormat
+local util = require("citeproc-util")
+
+
+local Citation = Element:derive("citation", {
+ givenname_disambiguation_rule = "by-cite",
+ -- https://github.com/citation-style-language/schema/issues/338
+ -- The cite_group_delimiter may be changed to inherit the delimiter in citaion > layout.
+ cite_group_delimiter = ", ",
+ near_note_distance = 5,
+})
+
+function Citation:from_node(node, style)
+
+ local o = self:new()
+ o.children = {}
+
+ o:process_children_nodes(node)
+
+ -- o.layouts = nil -- CSL-M extension
+
+ for _, child in ipairs(o.children) do
+ local element_name = child.element_name
+ if element_name == "layout" then
+ o.layout = child
+ elseif element_name == "sort" then
+ o.sort = child
+ end
+ end
+
+ -- Disambiguation
+ o:set_bool_attribute(node, "disambiguate-add-givenname")
+ o:set_attribute(node, "givenname-disambiguation-rule")
+ o:set_bool_attribute(node, "disambiguate-add-names")
+ o:set_bool_attribute(node, "disambiguate-add-year-suffix")
+
+ -- Cite Grouping
+ o:set_attribute(node, "cite-group-delimiter")
+ -- In the current citeproc-js implementation and test suite,
+ -- cite grouping is activated by setting the cite-group-delimiter
+ -- attribute or the collapse attributes on cs:citation.
+ -- It may be changed to an independent procedure.
+ -- https://github.com/citation-style-language/schema/issues/338
+ if node:get_attribute("cite-group-delimiter") then
+ o.cite_grouping = true
+ else
+ o.cite_grouping = false
+ end
+
+
+ -- Cite Collapsing
+ o:set_attribute(node, "collapse")
+ o:set_attribute(node, "year-suffix-delimiter")
+ if not o.year_suffix_delimiter then
+ o.year_suffix_delimiter = o.layout.delimiter
+ end
+ o:set_attribute(node, "after-collapse-delimiter")
+ if not o.after_collapse_delimiter then
+ o.after_collapse_delimiter = o.layout.delimiter
+ end
+
+ -- Note Distance
+ o:set_number_attribute(node, "near-note-distance")
+
+ local name_inheritance = require("citeproc-node-names").Name:new()
+ for key, value in pairs(style.name_inheritance) do
+ if value ~= nil then
+ name_inheritance[key] = value
+ end
+ end
+ Element.make_name_inheritance(name_inheritance, node)
+ o.name_inheritance = name_inheritance
+
+ -- update_mode = "plain" or "numeric" or "position" (or "both"?)
+
+ return o
+end
+
+function Citation:build_citation_str(citation, engine)
+ if engine.registry.requires_sorting then
+ engine:sort_bibliography()
+ end
+
+ local citation_str = self:build_cluster(citation.citationItems, engine, citation.properties)
+ return citation_str
+end
+
+-- Formatting is stripped from the author-only and composite renderings
+-- of the author name
+local function remove_name_formatting(ir)
+ if ir._element == "name" then
+ ir.formatting = nil
+ end
+ if ir.children then
+ for _, child in ipairs(ir.children) do
+ remove_name_formatting(child)
+ end
+ end
+end
+
+function Citation:build_cluster(citation_items, engine, properties)
+ properties = properties or {}
+ local output_format = engine.output_format
+ local irs = {}
+ citation_items = self:sorted_citation_items(citation_items, engine)
+ for _, cite_item in ipairs(citation_items) do
+ local ir = self:build_fully_disambiguated_ir(cite_item, output_format, engine, properties)
+ table.insert(irs, ir)
+ end
+
+ -- Special citation forms
+ -- https://citeproc-js.readthedocs.io/en/latest/running.html#special-citation-forms
+ self:_apply_special_citation_form(irs, properties, output_format, engine)
+
+ if self.cite_grouping then
+ irs = self:group_cites(irs)
+ else
+ local citation_collapse = self.collapse
+ if citation_collapse == "year" or citation_collapse == "year-suffix" or
+ citation_collapse == "year-suffix-ranged" then
+ irs = self:group_cites(irs)
+ end
+ end
+
+ if self.collapse then
+ self:collapse_cites(irs)
+ end
+
+ -- Capitalize first
+ for i, ir in ipairs(irs) do
+ -- local layout_prefix
+ -- local layout_affixes = self.layout.affixes
+ -- if layout_affixes then
+ -- layout_prefix = layout_affixes.prefix
+ -- end
+ local prefix = citation_items[i].prefix
+ if prefix then
+ -- Prefix is inlines
+ local right_most_str = prefix[#prefix]:get_right_most_string()
+ if string.match(right_most_str, "[.!?]%s*$") and InlineElement.has_space(prefix) then
+ ir:capitalize_first_term()
+ end
+ else
+ local delimiter = self.layout.delimiter
+ if i == 1 or not delimiter or string.match(delimiter, "[.!?]%s*$") then
+ ir:capitalize_first_term()
+ end
+ end
+ end
+
+ -- util.debug(irs)
+
+ local citation_delimiter = self.layout.delimiter
+ local citation_stream = {}
+
+ local context = Context:new()
+ context.engine = engine
+ context.style = engine.style
+ context.area = self
+ context.in_bibliography = false
+ context.locale = engine:get_locale(engine.lang)
+ context.name_inheritance = self.name_inheritance
+ context.format = output_format
+
+ local previous_ir
+ for i, ir in ipairs(irs) do
+ local cite_prefix = citation_items[i].prefix
+ local cite_suffix = citation_items[i].suffix
+ if not ir.collapse_suppressed then
+ local ir_inlines = ir:flatten(output_format)
+ if #ir_inlines > 0 then
+ -- Make sure ir_inlines has outputs contents.
+ -- collapse_AuthorCollapseNoDateSorted.txt
+ if previous_ir then
+ if previous_ir.own_delimiter then
+ table.insert(citation_stream, PlainText:new(previous_ir.own_delimiter))
+ else
+ local left_most_str
+ if cite_prefix then
+ left_most_str = cite_prefix[1]:get_left_most_string()
+ end
+ if citation_delimiter and not (cite_prefix and util.startswith(left_most_str, ",")) then
+ table.insert(citation_stream, PlainText:new(citation_delimiter))
+ end
+ end
+ end
+
+ if cite_prefix then
+ table.insert(citation_stream, Micro:new(cite_prefix))
+ end
+
+ -- util.debug(ir)
+ util.extend(citation_stream, ir_inlines)
+ previous_ir = ir
+
+ if cite_suffix then
+ table.insert(citation_stream, Micro:new(cite_suffix))
+ end
+ end
+ end
+ end
+
+ local has_printed_form = true
+ if #citation_items == 0 then
+ -- bugreports_AuthorOnlyFail.txt
+ citation_stream = {PlainText:new("[NO_PRINTED_FORM]")}
+ has_printed_form = false
+ elseif #citation_stream == 0 then
+ -- date_DateNoDateNoTest.txt
+ has_printed_form = false
+ citation_stream = {PlainText:new("[CSL STYLE ERROR: reference with no printed form.]")}
+ elseif #citation_stream == 1 and citation_stream[1].value == "[NO_PRINTED_FORM]" then
+ has_printed_form = false
+ end
+
+ local author_only_mode = (properties.mode == "author-only" or
+ (#citation_items >= 1 and citation_items[1]["author-only"]))
+ if has_printed_form and context.area.layout.affixes and not author_only_mode then
+ local affixes = context.area.layout.affixes
+ if affixes.prefix then
+ table.insert(citation_stream, 1, PlainText:new(affixes.prefix))
+ end
+ if affixes.suffix then
+ table.insert(citation_stream, PlainText:new(affixes.suffix))
+ end
+ end
+
+ if has_printed_form and context.area.layout.formatting then
+ citation_stream = {Formatted:new(citation_stream, context.area.layout.formatting)}
+ end
+
+ if properties.mode == "composite" then
+ local author_ir
+ if irs[1] then
+ author_ir = irs[1].author_ir
+ end
+ if author_ir then
+ local infix = properties.infix
+ if infix then
+ if string.match(infix, "^%w") then
+ -- discretionary_SingleNarrativeCitation.txt
+ infix = " " .. infix
+ end
+ if string.match(infix, "%w$") then
+ infix = infix .. " "
+ end
+ if infix == "" then
+ -- discretionary_AuthorOnlySuppressLocator.txt
+ infix = " "
+ end
+ for i, inline in ipairs(InlineElement:parse(infix, context)) do
+ table.insert(citation_stream, i, inline)
+ end
+ else
+ table.insert(citation_stream, 1, PlainText:new(" "))
+ end
+
+ local author_inlines = author_ir:flatten(output_format)
+ for i, inline in ipairs(author_inlines) do
+ table.insert(citation_stream, i, inline)
+ end
+ end
+ end
+
+ local str = output_format:output(citation_stream, context)
+ str = util.strip(str)
+
+ return str
+end
+
+function Citation:sorted_citation_items(items, engine)
+ local citation_sort = self.sort
+ if not citation_sort then
+ return items
+ end
+
+ local state = IrState:new()
+ local context = Context:new()
+ context.engine = engine
+ context.style = engine.style
+ context.area = self
+ context.in_bibliography = false
+ context.locale = engine:get_locale(engine.lang)
+ context.name_inheritance = self.name_inheritance
+ context.format = SortStringFormat:new()
+ -- context.id = id
+ context.cite = nil
+ -- context.reference = self:get_item(id)
+
+ items = citation_sort:sort(items, state, context)
+ return items
+end
+
+function Citation:build_fully_disambiguated_ir(cite_item, output_format, engine, properties)
+ local cite_ir = self:build_ambiguous_ir(cite_item, output_format, engine)
+ -- util.debug(cite_ir)
+ cite_ir = self:apply_disambiguate_add_givenname(cite_ir, engine)
+ cite_ir = self:apply_disambiguate_add_names(cite_ir, engine)
+ cite_ir = self:apply_disambiguate_conditionals(cite_ir, engine)
+ cite_ir = self:apply_disambiguate_add_year_suffix(cite_ir, engine)
+
+ return cite_ir
+end
+
+function Citation:build_ambiguous_ir(cite_item, output_format, engine)
+ local state = IrState:new(engine.style)
+ local context = Context:new()
+ context.engine = engine
+ context.style = engine.style
+ context.area = self
+ context.locale = engine:get_locale(engine.lang)
+ context.name_inheritance = self.name_inheritance
+ context.format = output_format
+ context.id = cite_item.id
+ context.cite = cite_item
+ -- context.reference = self:get_item(cite_item.id)
+ context.reference = engine.registry.registry[cite_item.id]
+
+ local ir
+ if context.reference then
+ ir = self:build_ir(engine, state, context)
+ else
+ ir = Rendered:new({Formatted:new({PlainText:new(cite_item.id)}, {["font-weight"] = "bold"})}, self)
+ end
+
+ ir.cite_item = cite_item
+ ir.reference = context.reference
+ ir.ir_index = #engine.disam_irs + 1
+ table.insert(engine.disam_irs, ir)
+ ir.is_ambiguous = false
+ ir.disam_level = 0
+
+ -- Formattings like font-style are ignored for disambiguation.
+ local disam_format = DisamStringFormat:new()
+ local inlines = ir:flatten(disam_format)
+ local disam_str = disam_format:output(inlines, context)
+ ir.disam_str = disam_str
+
+ if not engine.cite_irs_by_output[disam_str] then
+ engine.cite_irs_by_output[disam_str] = {}
+ end
+
+ for ir_index, ir_ in pairs(engine.cite_irs_by_output[disam_str]) do
+ if ir_.cite_item.id ~= cite_item.id then
+ ir.is_ambiguous = true
+ break
+ end
+ end
+ engine.cite_irs_by_output[disam_str][ir.ir_index] = ir
+
+ return ir
+end
+
+function Citation:build_ir(engine, state, context)
+ if not self.layout then
+ util.error("Missing citation layout.")
+ end
+ return self.layout:build_ir(engine, state, context)
+end
+
+function Citation:apply_disambiguate_add_givenname(cite_ir, engine)
+ if self.disambiguate_add_givenname then
+ -- util.debug("disambiguate_add_givenname: " .. cite_ir.cite_item.id)
+
+ local gn_disam_rule = self.givenname_disambiguation_rule
+ if gn_disam_rule == "all-names" or gn_disam_rule == "all-names-with-initials" then
+ cite_ir = self:apply_disambiguate_add_givenname_all_names(cite_ir, engine)
+ elseif gn_disam_rule == "primary-name" or gn_disam_rule == "primary-name-with-initials" then
+ cite_ir = self:apply_disambiguate_add_givenname_primary_name(cite_ir, engine)
+ elseif gn_disam_rule == "by-cite" then
+ cite_ir = self:apply_disambiguate_add_givenname_by_cite(cite_ir, engine)
+ end
+ end
+ return cite_ir
+end
+
+-- TODO: reorganize this code
+function Citation:apply_disambiguate_add_givenname_all_names(cite_ir, engine)
+ -- util.debug("disambiguate_add_givenname_all_names: " .. cite_ir.cite_item.id)
+ if not cite_ir.person_name_irs or #cite_ir.person_name_irs == 0 then
+ return cite_ir
+ end
+
+ -- util.debug(cite_ir.disam_str)
+
+ for _, person_name_ir in ipairs(cite_ir.person_name_irs) do
+ local name_output = person_name_ir.name_output
+ -- util.debug(name_output)
+
+ if not person_name_ir.person_name_index then
+ person_name_ir.person_name_index = #engine.person_names + 1
+ table.insert(engine.person_names, person_name_ir)
+ end
+
+ if not engine.person_names_by_output[name_output] then
+ engine.person_names_by_output[name_output] = {}
+ end
+ engine.person_names_by_output[name_output][person_name_ir.person_name_index] = person_name_ir
+
+ local ambiguous_name_irs = {}
+ local ambiguous_same_output_irs = {}
+
+ for _, pn_ir in pairs(engine.person_names_by_output[person_name_ir.name_output]) do
+ if pn_ir.full_name ~= person_name_ir.full_name then
+ table.insert(ambiguous_name_irs, pn_ir)
+ end
+ if pn_ir.name_output == person_name_ir.name_output then
+ table.insert(ambiguous_same_output_irs, pn_ir)
+ end
+ end
+
+ -- util.debug(person_name_ir.name_output)
+ -- util.debug(person_name_ir.full_name)
+ -- util.debug(#ambiguous_name_irs)
+ -- util.debug(person_name_ir.disam_variants_index)
+ -- util.debug(person_name_ir.disam_variants)
+
+ while person_name_ir.disam_variants_index < #person_name_ir.disam_variants do
+ if #ambiguous_name_irs == 0 then
+ break
+ end
+
+ for _, pn_ir in ipairs(ambiguous_same_output_irs) do
+ -- expand one name
+ if pn_ir.disam_variants_index < #pn_ir.disam_variants then
+ pn_ir.disam_variants_index = pn_ir.disam_variants_index + 1
+ pn_ir.name_output = pn_ir.disam_variants[pn_ir.disam_variants_index]
+ pn_ir.inlines = pn_ir.disam_inlines[pn_ir.name_output]
+
+ if not engine.person_names_by_output[pn_ir.name_output] then
+ engine.person_names_by_output[pn_ir.name_output] = {}
+ end
+ engine.person_names_by_output[pn_ir.name_output][pn_ir.person_name_index] = pn_ir
+ end
+ end
+
+ -- util.debug(person_name_ir.name_output)
+
+ -- update ambiguous_name_irs and ambiguous_same_output_irs
+ ambiguous_name_irs = {}
+ ambiguous_same_output_irs = {}
+ for _, pn_ir in pairs(engine.person_names_by_output[person_name_ir.name_output]) do
+ if pn_ir.full_name ~= person_name_ir.full_name then
+ -- util.debug(pn_ir.full_name .. ": " .. pn_ir.name_output)
+ table.insert(ambiguous_name_irs, pn_ir)
+ end
+ if pn_ir.name_output == person_name_ir.name_output then
+ table.insert(ambiguous_same_output_irs, pn_ir)
+ end
+ end
+
+ end
+ end
+
+ -- update cite_ir output
+ local disam_format = DisamStringFormat:new()
+ local inlines = cite_ir:flatten(disam_format)
+ local disam_str = disam_format:output(inlines, nil)
+ cite_ir.disam_str = disam_str
+ if not engine.cite_irs_by_output[disam_str] then
+ engine.cite_irs_by_output[disam_str] = {}
+ end
+ engine.cite_irs_by_output[disam_str][cite_ir.ir_index] = cite_ir
+
+ -- update ambiguous_cite_irs and ambiguous_same_output_irs
+ local ambiguous_cite_irs = {}
+ for ir_index, ir_ in pairs(engine.cite_irs_by_output[cite_ir.disam_str]) do
+ -- util.debug(ir_.cite_item.id)
+ if ir_.cite_item.id ~= cite_ir.cite_item.id then
+ table.insert(ambiguous_cite_irs, ir_)
+ end
+ end
+ if #ambiguous_cite_irs == 0 then
+ cite_ir.is_ambiguous = false
+ end
+
+ return cite_ir
+end
+
+function Citation:apply_disambiguate_add_givenname_primary_name(cite_ir, engine)
+ if not cite_ir.person_name_irs or #cite_ir.person_name_irs == 0 then
+ return cite_ir
+ end
+ local person_name_ir = cite_ir.person_name_irs[1]
+ local name_output = person_name_ir.name_output
+ -- util.debug(name_output)
+
+ if not person_name_ir.person_name_index then
+ person_name_ir.person_name_index = #engine.person_names + 1
+ table.insert(engine.person_names, person_name_ir)
+ end
+ if not engine.person_names_by_output[name_output] then
+ engine.person_names_by_output[name_output] = {}
+ end
+ engine.person_names_by_output[name_output][person_name_ir.person_name_index] = person_name_ir
+
+ local ambiguous_name_irs = {}
+ local ambiguous_same_output_irs = {}
+
+ for _, pn_ir in pairs(engine.person_names_by_output[person_name_ir.name_output]) do
+ if pn_ir.full_name ~= person_name_ir.full_name then
+ table.insert(ambiguous_name_irs, pn_ir)
+ end
+ if pn_ir.name_output == person_name_ir.name_output then
+ table.insert(ambiguous_same_output_irs, pn_ir)
+ end
+ end
+
+ for _, name_variant in ipairs(person_name_ir.disam_variants) do
+ if #ambiguous_name_irs == 0 then
+ break
+ end
+
+ for _, pn_ir in ipairs(ambiguous_same_output_irs) do
+ -- expand one name
+ if pn_ir.disam_variants_index < #pn_ir.disam_variants then
+ pn_ir.disam_variants_index = pn_ir.disam_variants_index + 1
+ pn_ir.name_output = pn_ir.disam_variants[pn_ir.disam_variants_index]
+ pn_ir.inlines = pn_ir.disam_inlines[pn_ir.name_output]
+
+ if not engine.person_names_by_output[pn_ir.name_output] then
+ engine.person_names_by_output[pn_ir.name_output] = {}
+ end
+ engine.person_names_by_output[pn_ir.name_output][person_name_ir.person_name_index] = person_name_ir
+ end
+ end
+
+ -- update ambiguous_name_irs and ambiguous_same_output_irs
+ ambiguous_name_irs = {}
+ ambiguous_same_output_irs = {}
+ for _, pn_ir in pairs(engine.person_names_by_output[person_name_ir.name_output]) do
+ if pn_ir.full_name ~= person_name_ir.full_name then
+ table.insert(ambiguous_name_irs, pn_ir)
+ end
+ if pn_ir.name_output == person_name_ir.name_output then
+ table.insert(ambiguous_same_output_irs, pn_ir)
+ end
+ end
+ end
+
+ return cite_ir
+end
+
+function Citation:apply_disambiguate_add_givenname_by_cite(cite_ir, engine)
+ if not cite_ir.is_ambiguous then
+ return cite_ir
+ end
+ if not cite_ir.person_name_irs or #cite_ir.person_name_irs == 0 then
+ return cite_ir
+ end
+
+ -- for _, ir_ in ipairs(engine.disam_irs) do
+ -- util.debug(ir_.cite_item.id)
+ -- util.debug(ir_.disam_str)
+ -- end
+
+ local disam_format = DisamStringFormat:new()
+
+ local ambiguous_cite_irs = {}
+ local ambiguous_same_output_irs = {}
+
+ for ir_index, ir_ in pairs(engine.cite_irs_by_output[cite_ir.disam_str]) do
+ if ir_.cite_item.id ~= cite_ir.cite_item.id then
+ table.insert(ambiguous_cite_irs, ir_)
+ end
+ if ir_.disam_str == cite_ir.disam_str then
+ table.insert(ambiguous_same_output_irs, ir_)
+ end
+ end
+
+ for i, person_name_ir in ipairs(cite_ir.person_name_irs) do
+ -- util.debug(person_name_ir.name_output)
+ -- util.debug(person_name_ir.disam_variants)
+ if #ambiguous_cite_irs == 0 then
+ cite_ir.is_ambiguous = false
+ break
+ end
+
+ -- util.debug(person_name_ir.disam_variants)
+ while person_name_ir.disam_variants_index < #person_name_ir.disam_variants do
+ -- util.debug(person_name_ir.name_output)
+
+ local is_different_name = false
+ for _, ir_ in ipairs(ambiguous_cite_irs) do
+ if ir_.person_name_irs[i] then
+ if ir_.person_name_irs[i].full_name ~= person_name_ir.full_name then
+ -- util.debug(ir_.cite_item.id)
+ is_different_name = true
+ break
+ end
+ end
+ end
+ -- util.debug(is_different_name)
+ if not is_different_name then
+ break
+ end
+
+ for _, ir_ in ipairs(ambiguous_same_output_irs) do
+ -- util.debug(ir_.cite_item.id)
+ local person_name_ir_ = ir_.person_name_irs[i]
+ if person_name_ir_ then
+ if person_name_ir_.disam_variants_index < #person_name_ir_.disam_variants then
+ person_name_ir_.disam_variants_index = person_name_ir_.disam_variants_index + 1
+ local disam_variant = person_name_ir_.disam_variants[person_name_ir_.disam_variants_index]
+ person_name_ir_.name_output = disam_variant
+ -- util.debug(disam_variant)
+ person_name_ir_.inlines = person_name_ir_.disam_inlines[disam_variant]
+ -- Update cite ir output
+ local inlines = ir_:flatten(disam_format)
+ local disam_str = disam_format:output(inlines, nil)
+ ir_.disam_str = disam_str
+ if not engine.cite_irs_by_output[disam_str] then
+ engine.cite_irs_by_output[disam_str] = {}
+ end
+ engine.cite_irs_by_output[disam_str][ir_.ir_index] = ir_
+ end
+ end
+ end
+
+ -- update ambiguous_cite_irs and ambiguous_same_output_irs
+ ambiguous_cite_irs = {}
+ ambiguous_same_output_irs = {}
+ for ir_index, ir_ in pairs(engine.cite_irs_by_output[cite_ir.disam_str]) do
+ -- util.debug(ir_.cite_item.id)
+ if ir_.cite_item.id ~= cite_ir.cite_item.id then
+ table.insert(ambiguous_cite_irs, ir_)
+ end
+ if ir_.disam_str == cite_ir.disam_str then
+ table.insert(ambiguous_same_output_irs, ir_)
+ end
+ end
+
+ -- util.debug(#ambiguous_cite_irs)
+
+ if #ambiguous_cite_irs == 0 then
+ cite_ir.is_ambiguous = false
+ return cite_ir
+ end
+
+ end
+ end
+
+ return cite_ir
+end
+
+local function find_first_name_ir(ir)
+ if ir._type == "NameIr" then
+ return ir
+ end
+ if ir.children then
+ for _, child in ipairs(ir.children) do
+ local name_ir = find_first_name_ir(child)
+ if name_ir then
+ return name_ir
+ end
+ end
+ end
+ return nil
+end
+
+function Citation:apply_disambiguate_add_names(cite_ir, engine)
+ if not self.disambiguate_add_names then
+ return cite_ir
+ end
+
+ if not cite_ir.name_ir then
+ cite_ir.name_ir = find_first_name_ir(cite_ir)
+ end
+ local name_ir = cite_ir.name_ir
+
+ if not cite_ir.is_ambiguous then
+ return cite_ir
+ end
+
+ if not name_ir or not name_ir.et_al_abbreviation then
+ return cite_ir
+ end
+
+ -- util.debug("disambiguate_add_names: " .. cite_ir.cite_item.id)
+
+ if name_ir then
+ -- util.debug(cite_ir.disam_str)
+ -- util.debug(cite_ir.name_ir.full_name_str)
+ -- util.debug(cite_ir.is_ambiguous)
+ end
+
+ local disam_format = DisamStringFormat:new()
+
+ while cite_ir.is_ambiguous do
+ if #cite_ir.name_ir.hidden_name_irs == 0 then
+ break
+ end
+
+ local ambiguous_cite_irs = {}
+ local ambiguous_same_output_irs = {}
+ for _, ir_ in pairs(engine.cite_irs_by_output[cite_ir.disam_str]) do
+ if ir_.cite_item.id ~= cite_ir.cite_item.id then
+ table.insert(ambiguous_cite_irs, ir_)
+ end
+ if ir_.disam_str == cite_ir.disam_str then
+ table.insert(ambiguous_same_output_irs, ir_)
+ end
+ end
+
+ -- util.debug(#ambiguous_same_output_irs)
+ if #ambiguous_cite_irs == 0 then
+ cite_ir.is_ambiguous = false
+ break
+ end
+
+ -- check if the cite can be (fully) disambiguated by adding names
+ local can_be_disambuguated = false
+ for _, ir_ in ipairs(ambiguous_cite_irs) do
+ if ir_.name_ir.full_name_str ~= cite_ir.name_ir.full_name_str then
+ can_be_disambuguated = true
+ break
+ end
+ end
+ -- util.debug(can_be_disambuguated)
+ if not can_be_disambuguated then
+ break
+ end
+
+ for _, ir_ in ipairs(ambiguous_same_output_irs) do
+ local added_person_name_ir = ir_.name_ir.name_inheritance:expand_one_name(ir_.name_ir)
+ if added_person_name_ir then
+ -- util.debug("Updated: " .. ir_.cite_item.id)
+ table.insert(ir_.person_name_irs, added_person_name_ir)
+
+ if not added_person_name_ir.person_name_index then
+ added_person_name_ir.person_name_index = #engine.person_names + 1
+ table.insert(engine.person_names, added_person_name_ir)
+ end
+ local name_output = added_person_name_ir.name_output
+ if not engine.person_names_by_output[name_output] then
+ engine.person_names_by_output[name_output] = {}
+ end
+ engine.person_names_by_output[name_output][added_person_name_ir.person_name_index] = added_person_name_ir
+
+ -- Update ir output
+ local inlines = ir_:flatten(disam_format)
+ local disam_str = disam_format:output(inlines, nil)
+ -- util.debug(disam_str)
+ ir_.disam_str = disam_str
+ if not engine.cite_irs_by_output[disam_str] then
+ engine.cite_irs_by_output[disam_str] = {}
+ end
+ engine.cite_irs_by_output[disam_str][ir_.ir_index] = ir_
+ end
+ end
+
+ -- util.debug("disambiguate_add_givenname")
+
+ if self.disambiguate_add_givenname then
+ local gn_disam_rule = self.givenname_disambiguation_rule
+ if gn_disam_rule == "all-names" or gn_disam_rule == "all-names-with-initials" then
+ cite_ir = self:apply_disambiguate_add_givenname_all_names(cite_ir, engine)
+ elseif gn_disam_rule == "by-cite" then
+ cite_ir = self:apply_disambiguate_add_givenname_by_cite(cite_ir, engine)
+ end
+ end
+
+ cite_ir.is_ambiguous = self:check_ambiguity(cite_ir, engine)
+
+ -- for _, ir_ in ipairs(engine.disam_irs) do
+ -- util.debug(ir_.cite_item.id .. ": " .. ir_.disam_str)
+ -- end
+
+ end
+
+
+ return cite_ir
+end
+
+function Citation:collect_irs_with_disambiguate_branch(ir)
+ local irs_with_disambiguate_branch = {}
+ if ir.children then
+ for i, child_ir in ipairs(ir.children) do
+ if child_ir.disambiguate_branch_ir then
+ table.insert(irs_with_disambiguate_branch, child_ir)
+ elseif child_ir.children then
+ util.extend(irs_with_disambiguate_branch,
+ self:collect_irs_with_disambiguate_branch(child_ir))
+ end
+ end
+ end
+ return irs_with_disambiguate_branch
+end
+
+function Citation:apply_disambiguate_conditionals(cite_ir, engine)
+ -- util.debug(cite_ir)
+
+ cite_ir.irs_with_disambiguate_branch = self:collect_irs_with_disambiguate_branch(cite_ir)
+
+ local disam_format = DisamStringFormat:new()
+
+ while cite_ir.is_ambiguous do
+ if #cite_ir.irs_with_disambiguate_branch == 0 then
+ break
+ end
+
+ -- util.debug(cite_ir.cite_item.id)
+ -- util.debug(cite_ir.disam_str)
+
+ -- update ambiguous_same_output_irs
+ local ambiguous_same_output_irs = {}
+ for _, ir_ in pairs(engine.cite_irs_by_output[cite_ir.disam_str]) do
+ if ir_.disam_str == cite_ir.disam_str then
+ table.insert(ambiguous_same_output_irs, ir_)
+ end
+ end
+
+ for _, ir_ in ipairs(ambiguous_same_output_irs) do
+ if #ir_.irs_with_disambiguate_branch > 0 then
+ -- Disambiguation is incremental
+ -- disambiguate_IncrementalExtraText.txt
+ local condition_ir = ir_.irs_with_disambiguate_branch[1]
+ condition_ir.children[1] = condition_ir.disambiguate_branch_ir
+ condition_ir.group_var = condition_ir.disambiguate_branch_ir.group_var
+ table.remove(ir_.irs_with_disambiguate_branch, 1)
+ -- disambiguate_DisambiguateTrueReflectedInBibliography.txt
+ ir_.reference.disambiguate = true
+
+ -- Update ir output
+ local inlines = ir_:flatten(disam_format)
+ local disam_str = disam_format:output(inlines, nil)
+ -- util.debug("update: " .. ir_.cite_item.id .. ": " .. disam_str)
+ ir_.disam_str = disam_str
+ if not engine.cite_irs_by_output[disam_str] then
+ engine.cite_irs_by_output[disam_str] = {}
+ end
+ engine.cite_irs_by_output[disam_str][ir_.ir_index] = ir_
+ end
+ end
+
+ cite_ir.is_ambiguous = self:check_ambiguity(cite_ir, engine)
+ -- util.debug(cite_ir.is_ambiguous)
+ -- for _, ir_ in ipairs(engine.disam_irs) do
+ -- util.debug(ir_.cite_item.id .. ": " .. ir_.disam_str)
+ -- end
+
+ end
+ return cite_ir
+end
+
+function Citation:check_ambiguity(cite_ir, engine)
+ for _, ir_ in pairs(engine.cite_irs_by_output[cite_ir.disam_str]) do
+ if ir_.cite_item.id ~= cite_ir.cite_item.id then
+ return true
+ end
+ end
+ return false
+end
+
+function Citation:get_same_output_irs(cite_ir, engine)
+ local ambiguous_same_output_irs = {}
+ for _, ir_ in pairs(engine.cite_irs_by_output[cite_ir.disam_str]) do
+ if ir_.disam_str == cite_ir.disam_str then
+ table.insert(ambiguous_same_output_irs, ir_)
+ end
+ end
+ return ambiguous_same_output_irs
+end
+
+function Citation:apply_disambiguate_add_year_suffix(cite_ir, engine)
+ if not cite_ir.is_ambiguous or not self.disambiguate_add_year_suffix then
+ return cite_ir
+ end
+
+ local same_output_irs = self:get_same_output_irs(cite_ir, engine)
+
+ table.sort(same_output_irs, function (a, b)
+ -- return a.ir_index < b.ir_index
+ return a.reference["citation-number"] < b.reference["citation-number"]
+ end)
+
+ local year_suffix_number = 0
+ -- util.debug(cite_ir)
+
+ local disam_format = DisamStringFormat:new()
+
+ for _, ir_ in ipairs(same_output_irs) do
+ ir_.reference.year_suffix_number = nil
+ end
+
+ for _, ir_ in ipairs(same_output_irs) do
+ -- print(ir_.cite_item.id)
+ -- print(ir_.reference)
+ if not ir_.reference.year_suffix_number then
+ year_suffix_number = year_suffix_number + 1
+ ir_.reference.year_suffix_number = year_suffix_number
+ ir_.reference["year-suffix"] = self:render_year_suffix(year_suffix_number)
+ end
+
+ if not ir_.year_suffix_irs then
+ ir_.year_suffix_irs = ir_:collect_year_suffix_irs()
+ if #ir_.year_suffix_irs == 0 then
+ -- By default, the year-suffix is appended the first year rendered through cs:date
+ local year_ir = ir_:find_first_year_ir()
+ -- util.debug(year_ir)
+ if year_ir then
+ local year_suffix_ir = YearSuffix:new({}, self)
+ table.insert(year_ir.children, year_suffix_ir)
+ table.insert(ir_.year_suffix_irs, year_suffix_ir)
+ end
+ end
+ end
+
+ for _, year_suffix_ir in ipairs(ir_.year_suffix_irs) do
+ year_suffix_ir.inlines = {PlainText:new(ir_.reference["year-suffix"])}
+ year_suffix_ir.year_suffix_number = ir_.reference.year_suffix_number
+ year_suffix_ir.group_var = "important"
+ end
+
+ local inlines = ir_:flatten(disam_format)
+ local disam_str = disam_format:output(inlines, nil)
+ -- util.debug("update: " .. ir_.cite_item.id .. ": " .. disam_str)
+ ir_.disam_str = disam_str
+ if not engine.cite_irs_by_output[disam_str] then
+ engine.cite_irs_by_output[disam_str] = {}
+ end
+ engine.cite_irs_by_output[disam_str][ir_.ir_index] = ir_
+
+ end
+
+ cite_ir.is_ambiguous = false
+
+ return cite_ir
+end
+
+function Citation:render_year_suffix(year_suffix_number)
+ if year_suffix_number <= 0 then
+ return nil
+ end
+ local year_suffix = ""
+ while year_suffix_number > 0 do
+ local i = (year_suffix_number - 1) % 26
+ year_suffix = string.char(i + 97) .. year_suffix
+ year_suffix_number = (year_suffix_number - 1) // 26
+ end
+ -- util.debug(year_suffix)
+ return year_suffix
+end
+
+local function find_first(ir, check)
+ if check(ir) then
+ return ir
+ end
+ if ir.children then
+ for _, child in ipairs(ir.children) do
+ local target_ir = find_first(child, check)
+ if target_ir then
+ return target_ir
+ end
+ end
+ end
+ return nil
+end
+
+-- Find the first rendering element and it should be produced by and names element
+local function find_first_names_ir(ir)
+ if ir.first_names_ir then
+ return ir.first_names_ir
+ end
+
+ local first_rendering_ir = find_first(ir, function (ir_)
+ return (ir_._element == "text"
+ or ir_._element == "date"
+ or ir_._element == "number"
+ or ir_._element == "names"
+ or ir_._element == "label")
+ and ir_.group_var ~= "missing"
+ end)
+ local first_names_ir
+ if first_rendering_ir and first_rendering_ir._element == "names" then
+ first_names_ir = first_rendering_ir
+ end
+ if first_names_ir then
+ local disam_format = DisamStringFormat:new()
+ local inlines = first_names_ir:flatten(disam_format)
+ first_names_ir.disam_str = disam_format:output(inlines, nil)
+ end
+ ir.first_names_ir = first_names_ir
+ return first_names_ir
+
+end
+
+function Citation:_apply_special_citation_form(irs, properties, output_format, engine)
+ if properties.mode then
+ if properties.mode == "author-only" then
+ for _, ir in ipairs(irs) do
+ self:_apply_citation_mode_author_only(ir)
+ end
+ elseif properties.mode == "suppress-author" then
+ -- suppress-author mode does not work in note style
+ -- discretionary_FirstReferenceNumberWithIntext.txt
+ if engine.style.class ~= "note" then
+ for _, ir in ipairs(irs) do
+ self:_apply_suppress_author(ir)
+ end
+ end
+
+ elseif properties.mode == "composite" then
+ self:_apply_composite(irs[1], output_format, engine)
+
+ end
+
+ else
+ for _, ir in ipairs(irs) do
+ if ir.cite_item["author-only"] then
+ self:_apply_cite_author_only(ir)
+ elseif ir.cite_item["suppress-author"] then
+ self:_apply_suppress_author(ir)
+ end
+ end
+ end
+end
+
+function Citation:_apply_citation_mode_author_only(ir)
+ -- Used in pr
+ local author_ir = find_first_names_ir(ir)
+
+ if author_ir then
+ remove_name_formatting(author_ir)
+ ir.children = {author_ir}
+ else
+ ir.children = {Rendered:new({PlainText:new("[NO_PRINTED_FORM]")}, self)}
+ end
+ return ir
+end
+
+-- Citation flags with makeCitationCluster
+-- In contrast to Citation flags with processCitationCluster, this funciton
+-- looks for the first rendering element instead of names element.
+-- See discretionary_AuthorOnly.txt
+function Citation:_apply_cite_author_only(ir)
+ local author_ir = find_first(ir, function (ir_)
+ return (ir_._element == "text"
+ or ir_._element == "date"
+ or ir_._element == "number"
+ or ir_._element == "names"
+ or ir_._element == "label")
+ and ir_.group_var ~= "missing"
+ end)
+
+ if author_ir then
+ remove_name_formatting(author_ir)
+ ir.children = {author_ir}
+ else
+ ir.children = {Rendered:new({PlainText:new("[NO_PRINTED_FORM]")}, self)}
+ end
+ return ir
+end
+
+function Citation:_apply_suppress_author(ir)
+ local author_ir = find_first_names_ir(ir)
+ if author_ir then
+ -- util.debug(author_ir)
+ author_ir.collapse_suppressed = true
+ end
+ return ir
+end
+
+function Citation:_apply_composite(ir, output_format, engine)
+ -- local first_names_ir = find_first_names_ir(ir)
+
+ local first_names_ir = find_first_names_ir(ir)
+ if first_names_ir then
+ -- util.debug(first_names_ir)
+ first_names_ir.collapse_suppressed = true
+ end
+
+ local author_ir
+ if engine.style.intext then
+ local properties = {mode = "author-only"}
+ author_ir = engine.style.intext:build_fully_disambiguated_ir(ir.cite_item, output_format, engine, properties)
+ elseif first_names_ir then
+ author_ir = first_names_ir
+ end
+
+ if author_ir then
+ remove_name_formatting(author_ir)
+ ir.author_ir = author_ir
+ else
+ ir.author_ir = Rendered:new({PlainText:new("[NO_PRINTED_FORM]")}, self)
+ end
+
+ return ir
+end
+
+function Citation:group_cites(irs)
+ local disam_format = DisamStringFormat:new()
+ for _, ir in ipairs(irs) do
+ local first_names_ir = ir.first_names_ir
+ if not first_names_ir then
+ first_names_ir = find_first(ir, function (ir_)
+ return ir_._element == "names" and ir_.group_var ~= "missing"
+ end)
+ if first_names_ir then
+ local inlines = first_names_ir:flatten(disam_format)
+ first_names_ir.disam_str = disam_format:output(inlines, nil)
+ end
+ ir.first_names_ir = first_names_ir
+ end
+ end
+
+ local irs_by_name = {}
+ local name_list = {}
+
+ for _, ir in ipairs(irs) do
+ local name_str = ""
+ if ir.first_names_ir then
+ name_str = ir.first_names_ir.disam_str
+ end
+ if not irs_by_name[name_str] then
+ irs_by_name[name_str] = {}
+ table.insert(name_list, name_str)
+ end
+ table.insert(irs_by_name[name_str], ir)
+ end
+
+ local grouped = {}
+ for _, name_str in ipairs(name_list) do
+ local irs_with_same_name = irs_by_name[name_str]
+ for i, ir in ipairs(irs_with_same_name) do
+ if i < #irs_with_same_name then
+ ir.own_delimiter = self.cite_group_delimiter
+ end
+ table.insert(grouped, ir)
+ end
+ end
+ return grouped
+end
+
+function Citation:collapse_cites(irs)
+ if self.collapse == "citation-number" then
+ self:collapse_cites_by_citation_number(irs)
+ elseif self.collapse == "year" then
+ self:collapse_cites_by_year(irs)
+ elseif self.collapse == "year-suffix" then
+ self:collapse_cites_by_year_suffix(irs)
+ elseif self.collapse == "year-suffix-ranged" then
+ self:collapse_cites_by_year_suffix_ranged(irs)
+ end
+end
+
+function Citation:collapse_cites_by_citation_number(irs)
+ local cite_groups = {}
+ local current_group = {}
+ local previous_citation_number
+ for i, ir in ipairs(irs) do
+ local citation_number
+ local only_citation_number_ir = self:get_only_citation_number(ir)
+ if only_citation_number_ir then
+ -- Other irs like locators are not rendered.
+ -- collapse_CitationNumberRangesWithAffixesGrouped.txt
+ citation_number = only_citation_number_ir.citation_number
+ end
+ if i == 1 then
+ table.insert(current_group, ir)
+ elseif citation_number and previous_citation_number and
+ previous_citation_number + 1 == citation_number then
+ table.insert(current_group, ir)
+ else
+ table.insert(cite_groups, current_group)
+ current_group = {ir}
+ end
+ previous_citation_number = citation_number
+ end
+ table.insert(cite_groups, current_group)
+
+ for _, cite_group in ipairs(cite_groups) do
+ if #cite_group >= 3 then
+ cite_group[1].own_delimiter = util.unicode["en dash"]
+ for i = 2, #cite_group - 1 do
+ cite_group[i].collapse_suppressed = true
+ end
+ cite_group[#cite_group].own_delimiter = self.after_collapse_delimiter
+ end
+ end
+end
+
+function Citation:get_only_citation_number(ir)
+ if ir.citation_number then
+ return ir
+ end
+ if not ir.children then
+ return nil
+ end
+ local only_citation_number_ir
+ for _, child in ipairs(ir.children) do
+ if child.group_var ~= "missing" then
+ local citation_number_ir = self:get_only_citation_number(child)
+ if citation_number_ir then
+ if only_citation_number_ir then
+ return nil
+ else
+ only_citation_number_ir = citation_number_ir
+ end
+ else
+ return false
+ end
+ end
+ end
+ return only_citation_number_ir
+end
+
+function Citation:collapse_cites_by_year(irs)
+ local cite_groups = {{}}
+ local previous_name_str
+ for i, ir in ipairs(irs) do
+ local name_str
+ if ir.first_names_ir then
+ name_str = ir.first_names_ir.disam_str
+ end
+ if i == 1 then
+ table.insert(cite_groups[#cite_groups], ir)
+ elseif name_str and name_str == previous_name_str then
+ -- ir.first_names_ir was set in the cite grouping stage
+ -- TODO: and not previous cite suffix
+ table.insert(cite_groups[#cite_groups], ir)
+ else
+ table.insert(cite_groups, {ir})
+ end
+ previous_name_str = name_str
+ end
+
+ for _, cite_group in ipairs(cite_groups) do
+ if #cite_group > 1 then
+ for i, cite_ir in ipairs(cite_group) do
+ if i > 1 and cite_ir.first_names_ir then
+ cite_ir.first_names_ir.collapse_suppressed = true
+ end
+ if i == #cite_group then
+ cite_ir.own_delimiter = self.after_collapse_delimiter
+ elseif i < #cite_group then
+ -- The delimiter depends on the citation > sort.
+ -- https://github.com/citation-style-language/test-suite/issues/39#issuecomment-687901688
+ if cite_ir.cite_item.locator then
+ -- Special hack for
+ cite_ir.own_delimiter = self.after_collapse_delimiter
+ elseif self.cite_grouping then
+ if self.sort then
+ cite_ir.own_delimiter = self.cite_group_delimiter
+ else
+ cite_ir.own_delimiter = self.layout.delimiter
+ end
+ else
+ if self.sort then
+ cite_ir.own_delimiter = self.cite_group_delimiter
+ else
+ -- disambiguate_YearCollapseWithInstitution.txt
+ -- disambiguate_InitializeWithButNoDisambiguation.txt ?
+ cite_ir.own_delimiter = self.layout.delimiter
+ end
+ end
+ end
+ end
+ end
+ end
+end
+
+local function find_rendered_year_suffix(ir)
+ if ir._type == "YearSuffix" then
+ return ir
+ end
+ if ir.children then
+ for _, child in ipairs(ir.children) do
+ if child.group_var ~= "missing" then
+ local year_suffix = find_rendered_year_suffix(child)
+ if year_suffix then
+ return year_suffix
+ end
+ end
+ end
+ end
+ return nil
+end
+
+function Citation:collapse_cites_by_year_suffix(irs)
+ self:collapse_cites_by_year(irs)
+ -- Group by disam_str
+ -- The year-suffix is ommitted in DisamStringFormat
+ local cite_groups = {{}}
+ local previous_ir
+ local previous_year_suffix
+ for i, ir in ipairs(irs) do
+ local year_suffix = find_rendered_year_suffix(ir)
+ ir.rendered_year_suffix_ir = year_suffix
+ if i == 1 then
+ table.insert(cite_groups[#cite_groups], ir)
+ elseif year_suffix and previous_ir.disam_str == ir.disam_str and previous_year_suffix then
+ -- TODO: and not previous cite suffix
+ table.insert(cite_groups[#cite_groups], ir)
+ else
+ table.insert(cite_groups, {ir})
+ end
+ previous_ir = ir
+ previous_year_suffix = year_suffix
+ end
+
+ for _, cite_group in ipairs(cite_groups) do
+ if #cite_group > 1 then
+ for i, cite_ir in ipairs(cite_group) do
+ if i > 1 then
+ -- cite_ir.children = {cite_ir.rendered_year_suffix_ir}
+ -- Set the collapse_suppressed flag rather than removing the child irs.
+ -- This leaves the disamb ir structure unchanged.
+ self:suppress_ir_except_child(cite_ir, cite_ir.rendered_year_suffix_ir)
+ end
+ if i < #cite_group then
+ if self.cite_grouping then
+ -- In the current citeproc-js impplementation, explicitly set
+ -- cite-group-delimiter takes precedence over year-suffix-delimiter.
+ -- May be changed in the future.
+ -- https://github.com/citation-style-language/test-suite/issues/50
+ cite_ir.own_delimiter = self.cite_group_delimiter
+ else
+ cite_ir.own_delimiter = self.year_suffix_delimiter
+ end
+ elseif i == #cite_group then
+ cite_ir.own_delimiter = self.after_collapse_delimiter
+ end
+ end
+ end
+ end
+end
+
+function Citation:suppress_ir_except_child(ir, target)
+ if ir == target then
+ ir.collapse_suppressed = false
+ return false
+ end
+ ir.collapse_suppressed = true
+ if ir.children then
+ for _, child in ipairs(ir.children) do
+ if child.group_var ~= "missing" and not child.collapse_suppressed then
+ if not self:suppress_ir_except_child(child, target) then
+ ir.collapse_suppressed = false
+ end
+ end
+ end
+ end
+ return ir.collapse_suppressed
+end
+
+function Citation:collapse_cites_by_year_suffix_ranged(irs)
+ self:collapse_cites_by_year_suffix(irs)
+ -- Group by disam_str
+ local cite_groups = {{}}
+ local previous_ir
+ local previous_year_suffix
+ for i, ir in ipairs(irs) do
+ local year_suffix_ir = find_rendered_year_suffix(ir)
+ ir.rendered_year_suffix_ir = year_suffix_ir
+ if i == 1 then
+ table.insert(cite_groups[#cite_groups], ir)
+ elseif year_suffix_ir and previous_ir.disam_str == ir.disam_str and previous_year_suffix and
+ year_suffix_ir.year_suffix_number == previous_year_suffix.year_suffix_number + 1 then
+ -- TODO: and not previous cite suffix
+ table.insert(cite_groups[#cite_groups], ir)
+ else
+ table.insert(cite_groups, {ir})
+ end
+ previous_ir = ir
+ previous_year_suffix = year_suffix_ir
+ end
+
+ for _, cite_group in ipairs(cite_groups) do
+ if #cite_group > 2 then
+ for i, cite_ir in ipairs(cite_group) do
+ if i == 1 then
+ cite_ir.own_delimiter = util.unicode["en dash"]
+ elseif i < #cite_group then
+ cite_ir.collapse_suppressed = true
+ end
+ end
+ end
+ end
+end
+
+
+local InText = Citation:derive("intext", {
+ givenname_disambiguation_rule = "by-cite",
+ cite_group_delimiter = ", ",
+ near_note_distance = 5,
+})
+
+
+citation_module.Citation = Citation
+citation_module.InText = InText
+
+
+return citation_module
diff --git a/biblio/citation-style-language/citeproc-node-date.lua b/biblio/citation-style-language/citeproc-node-date.lua
index 7ec1f439b8..f95be07607 100644
--- a/biblio/citation-style-language/citeproc-node-date.lua
+++ b/biblio/citation-style-language/citeproc-node-date.lua
@@ -354,9 +354,9 @@ function DatePart:build_ir(single_date, engine, state, context, suppressed_affix
local inlines = {PlainText:new(text)}
local output_format = context.format
- if not context.is_english then
- print(debug.traceback())
- end
+ -- if not context.is_english then
+ -- print(debug.traceback())
+ -- end
local is_english = context:is_english()
output_format:apply_text_case(inlines, self.text_case, is_english)
inlines = output_format:with_format(inlines, self.formatting)
diff --git a/biblio/citation-style-language/citeproc-node-label.lua b/biblio/citation-style-language/citeproc-node-label.lua
index 27cafa2f18..8dc64f3c94 100644
--- a/biblio/citation-style-language/citeproc-node-label.lua
+++ b/biblio/citation-style-language/citeproc-node-label.lua
@@ -70,7 +70,9 @@ function Label:_is_variable_plural(variable, context)
return #variable > 1
elseif variable_type == "number" then
if util.startswith(variable, "number-of-") then
- return tonumber(value) > 1
+ -- Issue #27: "number-of-pages": "91–129"
+ value = string.match(tostring(value), "%d+")
+ return value and tonumber(value) > 1
else
value = tostring(value)
-- label_CollapsedPageNumberPluralDetection.txt
diff --git a/biblio/citation-style-language/citeproc-node-locale.lua b/biblio/citation-style-language/citeproc-node-locale.lua
index 0e8cdd0787..c9d9ed4259 100644
--- a/biblio/citation-style-language/citeproc-node-locale.lua
+++ b/biblio/citation-style-language/citeproc-node-locale.lua
@@ -96,7 +96,9 @@ function Locale:get_simple_term(name, form, plural)
for _, fallback_form in ipairs(self.form_fallbacks[form]) do
local key = name
if form ~= "long" then
- if not key then print(debug.traceback()) end
+ -- if not key then
+ -- print(debug.traceback())
+ -- end
key = key .. "/form-" .. fallback_form
end
local term = self.terms[key]
diff --git a/biblio/citation-style-language/citeproc-node-names.lua b/biblio/citation-style-language/citeproc-node-names.lua
index 749f571bd2..f0eb95b1e2 100644
--- a/biblio/citation-style-language/citeproc-node-names.lua
+++ b/biblio/citation-style-language/citeproc-node-names.lua
@@ -441,9 +441,6 @@ function Name:build_ir(variable, et_al, label, engine, state, context)
ir.group_var = "important"
end
- ir.formatting = self.formatting
- ir.affixes = self.affixes
-
irs = {ir}
if label then
@@ -478,6 +475,10 @@ function Name:build_person_name_ir(name, is_first, context)
local inlines = self:render_person_name(name, is_first, is_latin, is_inverted, context)
local person_name_ir = PersonNameIr:new(inlines, self)
+ -- discretionary_ExampleSeveralAuthorsWithIntext.txt
+ person_name_ir.formatting = self.formatting
+ person_name_ir.affixes = self.affixes
+
person_name_ir.is_inverted = is_inverted
local output_format = SortStringFormat:new()
@@ -1041,9 +1042,10 @@ function NamePart:format_text_case(text, context)
local output_format = context.format
local inlines = InlineElement:parse(text, context)
local is_english = context:is_english()
- if not output_format then
- print(debug.traceback())
- end
+ -- if not output_format then
+ -- print(debug.traceback())
+ -- assert(output_format)
+ -- end
output_format:apply_text_case(inlines, self.text_case, is_english)
inlines = output_format:with_format(inlines, self.formatting)
diff --git a/biblio/citation-style-language/citeproc-node-style.lua b/biblio/citation-style-language/citeproc-node-style.lua
index 5c387bd6c8..f963ed4e81 100644
--- a/biblio/citation-style-language/citeproc-node-style.lua
+++ b/biblio/citation-style-language/citeproc-node-style.lua
@@ -33,9 +33,17 @@ function Style:new()
end
function Style:parse(xml_str)
- local csl_xml = dom.parse(xml_str)
- if not csl_xml then
- error("Failed to parse CSL style.")
+ -- The parsing error is not caught by busted in some situcations and thus it's processed here.
+ -- discretionary_CitationNumberAuthorOnlyThenSuppressAuthor.txt
+ local status, csl_xml = pcall(function () return dom.parse(xml_str) end)
+ if not status or not csl_xml then
+ if csl_xml then
+ local error_message = string.match(csl_xml, "^.-: (.*)$")
+ util.error("CSL parsing error: " .. util.rstrip(error_message))
+ else
+ util.error("CSL parsing error")
+ end
+ return nil
end
local style_node = csl_xml:get_path("style")[1]
if not csl_xml then
@@ -44,33 +52,6 @@ function Style:parse(xml_str)
return Style:from_node(style_node)
end
-local function make_name_inheritance(name, node)
- name:set_attribute(node, "and")
- name:set_attribute(node, "delimiter-precedes-et-al")
- name:set_attribute(node, "delimiter-precedes-last")
- name:set_number_attribute(node, "et-al-min")
- name:set_number_attribute(node, "et-al-use-first")
- name:set_number_attribute(node, "et-al-subsequent-min")
- name:set_number_attribute(node, "et-al-subsequent-use-first")
- name:set_bool_attribute(node, "et-al-use-last")
- name:set_bool_attribute(node, "initialize")
- name:set_attribute(node, "initialize-with")
- name:set_attribute(node, "name-as-sort-order")
- name:set_attribute(node, "sort-separator")
- local delimiter = node:get_attribute("name-delimiter")
- if delimiter then
- name.delimiter = delimiter
- end
- local form = node:get_attribute("name-form")
- if form then
- name.form = form
- end
- local names_delimiter = node:get_attribute("names-delimiter")
- if names_delimiter then
- name.names_delimiter = names_delimiter
- end
-end
-
function Style:from_node(node)
local o = Style:new()
@@ -87,7 +68,7 @@ function Style:from_node(node)
-- Inheritable Name Options
-- https://docs.citationstyles.org/en/stable/specification.html#inheritable-name-options
o.name_inheritance = require("citeproc-node-names").Name:new()
- make_name_inheritance(o.name_inheritance, node)
+ Element.make_name_inheritance(o.name_inheritance, node)
if o.page_range_format == "chicago" then
if o.version < "1.1" then
@@ -111,6 +92,8 @@ function Style:from_node(node)
o.citation = child
elseif element_name == "bibliography" then
o.bibliography = child
+ elseif element_name == "intext" then
+ o.intext = child
elseif element_name == "macro" then
o.macros[child.name] = child
elseif element_name == "locale" then
@@ -197,328 +180,8 @@ function Info:from_node(node)
end
-local Citation = Element:derive("citation", {
- givenname_disambiguation_rule = "by-cite",
- -- https://github.com/citation-style-language/schema/issues/338
- -- The cite_group_delimiter may be changed to inherit the delimiter in citaion > layout.
- cite_group_delimiter = ", ",
- near_note_distance = 5,
-})
-
-function Citation:from_node(node, style)
-
- local o = Citation:new()
- o.children = {}
-
- o:process_children_nodes(node)
-
- -- o.layouts = nil -- CSL-M extension
-
- for _, child in ipairs(o.children) do
- local element_name = child.element_name
- if element_name == "layout" then
- o.layout = child
- elseif element_name == "sort" then
- o.sort = child
- end
- end
-
- -- Disambiguation
- o:set_bool_attribute(node, "disambiguate-add-givenname")
- o:set_attribute(node, "givenname-disambiguation-rule")
- o:set_bool_attribute(node, "disambiguate-add-names")
- o:set_bool_attribute(node, "disambiguate-add-year-suffix")
-
- -- Cite Grouping
- o:set_attribute(node, "cite-group-delimiter")
- -- In the current citeproc-js implementation and test suite,
- -- cite grouping is activated by setting the cite-group-delimiter
- -- attribute or the collapse attributes on cs:citation.
- -- It may be changed to an independent procedure.
- -- https://github.com/citation-style-language/schema/issues/338
- if node:get_attribute("cite-group-delimiter") then
- o.cite_grouping = true
- else
- o.cite_grouping = false
- end
-
-
- -- Cite Collapsing
- o:set_attribute(node, "collapse")
- o:set_attribute(node, "year-suffix-delimiter")
- if not o.year_suffix_delimiter then
- o.year_suffix_delimiter = o.layout.delimiter
- end
- o:set_attribute(node, "after-collapse-delimiter")
- if not o.after_collapse_delimiter then
- o.after_collapse_delimiter = o.layout.delimiter
- end
-
- -- Note Distance
- o:set_number_attribute(node, "near-note-distance")
-
- local name_inheritance = require("citeproc-node-names").Name:new()
- for key, value in pairs(style.name_inheritance) do
- if value ~= nil then
- name_inheritance[key] = value
- end
- end
- make_name_inheritance(name_inheritance, node)
- o.name_inheritance = name_inheritance
-
- -- update_mode = "plain" or "numeric" or "position" (or "both"?)
-
- return o
-end
-
-function Citation:build_ir(engine, state, context)
- if not self.layout then
- util.error("Missing citation layout.")
- end
- return self.layout:build_ir(engine, state, context)
-end
-
-
-local Bibliography = Element:derive("bibliography", {
- hanging_indent = false,
- line_spacing = 1,
- entry_spacing = 1,
- subsequent_author_substitute_rule = "complete-all"
-})
-
-function Bibliography:from_node(node, style)
- local o = Bibliography:new()
- o.children = {}
-
- o:process_children_nodes(node)
-
- -- o.layouts = nil -- CSL-M extension
-
- for _, child in ipairs(o.children) do
- local element_name = child.element_name
- if element_name == "layout" then
- o.layout = child
- elseif element_name == "sort" then
- o.sort = child
- end
- end
-
- -- Whitespace
- o:set_bool_attribute(node, "hanging-indent")
- o:set_attribute(node, "second-field-align")
- o:set_number_attribute(node, "line-spacing")
- o:set_number_attribute(node, "entry-spacing")
-
- -- Reference Grouping
- o:set_attribute(node, "subsequent-author-substitute")
- o:set_attribute(node, "subsequent-author-substitute-rule")
-
- local name_inheritance = require("citeproc-node-names").Name:new()
- for key, value in pairs(style.name_inheritance) do
- if value ~= nil then
- name_inheritance[key] = value
- end
- end
- make_name_inheritance(name_inheritance, node)
- o.name_inheritance = name_inheritance
-
- return o
-end
-
-function Bibliography:build_ir(engine, state, context)
- if not self.layout then
- util.error("Missing bibliography layout.")
- end
- local ir = self.layout:build_ir(engine, state, context)
- -- util.debug(ir)
- if self.second_field_align == "flush" and #ir.children >= 2 then
- ir.children[1].display = "left-margin"
- local right_inline_ir = SeqIr:new(util.slice(ir.children, 2), self)
- right_inline_ir.display = "right-inline"
- if ir.affixes then
- right_inline_ir.affixes = ir.affixes
- right_inline_ir.formatting = ir.formatting
- ir.affixes = nil
- ir.formatting = nil
- end
- ir.children = {ir.children[1], right_inline_ir}
- end
-
- if self.subsequent_author_substitute then
- self:substitute_subsequent_authors(engine, ir)
- end
-
- if not ir then
- ir = Rendered:new(PlainText:new("[CSL STYLE ERROR: reference with no printed form.]"), self)
- end
- return ir
-end
-
-function Bibliography:substitute_subsequent_authors(engine, ir)
- ir.first_name_ir = self:find_first_name_ir(ir) -- should be a SeqIr wiht _element = "names"
- if not ir.first_name_ir then
- engine.previous_bib_names_ir = nil
- return
- end
- if self.subsequent_author_substitute_rule == "complete-all" then
- self:substitute_subsequent_authors_complete_all(engine, ir)
- elseif self.subsequent_author_substitute_rule == "complete-each" then
- self:substitute_subsequent_authors_complete_each(engine, ir)
- elseif self.subsequent_author_substitute_rule == "partial-each" then
- self:substitute_subsequent_authors_partial_each(engine, ir)
- elseif self.subsequent_author_substitute_rule == "partial-first" then
- self:substitute_subsequent_authors_partial_first(engine, ir)
- end
- engine.previous_bib_names_ir = ir.first_name_ir
-end
-
-function Bibliography:find_first_name_ir(ir)
- if ir._type == "NameIr" then
- return ir
- elseif ir.children then
- for _, child_ir in ipairs(ir.children) do
- local first_name_ir = self:find_first_name_ir(child_ir)
- if first_name_ir then
- return first_name_ir
- end
- end
- end
- return nil
-end
-
-function Bibliography:substitute_subsequent_authors_complete_all(engine, ir)
- local bib_names_str = ""
-
- if #ir.first_name_ir.person_name_irs > 0 then
- for _, person_name_ir in ipairs(ir.first_name_ir.person_name_irs) do
- if bib_names_str ~= "" then
- bib_names_str = bib_names_str .. " "
- end
- local name_variants = person_name_ir.disam_variants
- bib_names_str = bib_names_str .. name_variants[#name_variants]
- end
- else
- -- In case of a <text variable="title"/> in <substitute>
- local disam_format = DisamStringFormat:new()
- local inlines = ir.first_name_ir:flatten(disam_format)
- bib_names_str = disam_format:output(inlines)
- end
- ir.first_name_ir.bib_names_str = bib_names_str
-
- if engine.previous_bib_names_ir and
- engine.previous_bib_names_ir.bib_names_str == bib_names_str then
- local text = self.subsequent_author_substitute
- if text == "" then
- ir.first_name_ir.children = {}
- ir.first_name_ir.group_var = "missing"
- else
- -- the output of label is not substituted
- -- util.debug(ir.first_name_ir)
- ir.first_name_ir.children = {Rendered:new({PlainText:new(text)}, self)}
- end
- end
-end
-
-function Bibliography:substitute_subsequent_authors_complete_each(engine, ir)
- local bib_names_str = ""
-
- if #ir.first_name_ir.person_name_irs > 0 then
- for _, person_name_ir in ipairs(ir.first_name_ir.person_name_irs) do
- if bib_names_str ~= "" then
- bib_names_str = bib_names_str .. " "
- end
- local name_variants = person_name_ir.disam_variants
- bib_names_str = bib_names_str .. name_variants[#name_variants]
- end
- else
- -- In case of a <text variable="title"/> in <substitute>
- local disam_format = DisamStringFormat:new()
- local inlines = ir.first_name_ir:flatten(disam_format)
- bib_names_str = disam_format:output(inlines)
- end
- ir.first_name_ir.bib_names_str = bib_names_str
-
- if engine.previous_bib_names_ir and
- engine.previous_bib_names_ir.bib_names_str == bib_names_str then
- local text = self.subsequent_author_substitute
- if #ir.first_name_ir.person_name_irs > 0 then
- for _, person_name_ir in ipairs(ir.first_name_ir.person_name_irs) do
- person_name_ir.inlines = {PlainText:new(text)}
- end
- else
- -- In case of a <text variable="title"/> in <substitute>
- if text == "" then
- ir.first_name_ir.children = {}
- ir.first_name_ir.group_var = "missing"
- else
- ir.first_name_ir.children = {Rendered:new({PlainText:new(text)}, self)}
- end
- end
- end
-end
-
-function Bibliography:substitute_subsequent_authors_partial_each(engine, ir)
- local bib_names_str = ""
-
- if #ir.first_name_ir.person_name_irs > 0 then
- if engine.previous_bib_names_ir then
- for i, person_name_ir in ipairs(ir.first_name_ir.person_name_irs) do
- local prev_name_ir = engine.previous_bib_names_ir.person_names[i]
- if prev_name_ir then
- local prev_name_variants = prev_name_ir.disam_variants
- local prev_full_name_str = prev_name_variants[#prev_name_variants]
- local name_variants = person_name_ir.disam_variants
- local full_name_str = name_variants[#name_variants]
- if prev_full_name_str == full_name_str then
- local text = self.subsequent_author_substitute
- person_name_ir.inlines = {PlainText:new(text)}
- else
- break
- end
- end
- end
- end
- else
- -- In case of a <text variable="title"/> in <substitute>
- local disam_format = DisamStringFormat:new()
- local inlines = ir.first_name_ir:flatten(disam_format)
- bib_names_str = disam_format:output(inlines)
- ir.first_name_ir.bib_names_str = bib_names_str
- if engine.previous_bib_names_ir and
- engine.previous_bib_names_ir.bib_names_str == bib_names_str then
- local text = self.subsequent_author_substitute
- if text == "" then
- ir.first_name_ir.children = {}
- ir.first_name_ir.group_var = "missing"
- else
- ir.first_name_ir.children = {Rendered:new({PlainText:new(text)}, self)}
- end
- end
- end
-end
-
-function Bibliography:substitute_subsequent_authors_partial_first(engine, ir)
-end
-
-local Macro = Element:derive("macro")
-
-function Macro:from_node(node)
- local o = Macro:new()
- o.children = {}
- o:set_attribute(node, "name")
- o:process_children_nodes(node)
- return o
-end
-
-function Macro:build_ir(engine, state, context)
- local ir = self:build_group_ir(engine, state, context)
- return ir
-end
-
style_module.Style = Style
-style_module.Citation = Citation
-style_module.Bibliography = Bibliography
return style_module
diff --git a/biblio/citation-style-language/citeproc-node-text.lua b/biblio/citation-style-language/citeproc-node-text.lua
index fae3535013..c7275b39be 100644
--- a/biblio/citation-style-language/citeproc-node-text.lua
+++ b/biblio/citation-style-language/citeproc-node-text.lua
@@ -90,10 +90,12 @@ function Text:build_variable_ir(engine, state, context)
end
local inlines
- if (variable == "URL" and engine.opt.url_link) or
- (variable == "DOI" and engine.opt.doi_link) or
- (variable == "PMID" and engine.opt.doi_link) or
- (variable == "PMID" and engine.opt.doi_link) then
+ -- if not engine.opt then
+ -- print(debug.traceback())
+ -- end
+ -- if engine.opt.wrap_url_and_doi and (variable == "URL" or variable == "DOI" or
+ -- variable == "PMID" or variable == "PMID") then
+ if variable == "URL" or variable == "DOI" or variable == "PMID" or variable == "PMID" then
inlines = self:render_linked(engine, state, context, variable, text)
else
inlines = self:render_text_inlines(text, context)
@@ -116,14 +118,13 @@ end
function Text:render_linked(engine, state, context, variable, text)
local href
+ local url_prefix = false -- The prefix is used as part of the URL.
if variable == "URL" then
href = text
- elseif self.affixes and self.affixes.prefix then
- if string.match(self.affixes.prefix, "https?://") then
- text = self.affixes.prefix .. text
- self.affixes.prefix = nil
- href = text
- end
+ elseif self.affixes and self.affixes.prefix and string.match(self.affixes.prefix, "https?://") then
+ text = self.affixes.prefix .. text
+ href = text
+ url_prefix = true
elseif variable == "DOI" then
href = "https://doi.org/" .. text
elseif variable == "PMID" then
@@ -131,6 +132,7 @@ function Text:render_linked(engine, state, context, variable, text)
elseif variable == "PMCID" then
href = "https://www.ncbi.nlm.nih.gov/pmc/articles/" .. text
end
+
local inlines = {Linked:new(text, href)}
local output_format = context.format
local localized_quotes = nil
@@ -139,6 +141,9 @@ function Text:render_linked(engine, state, context, variable, text)
end
inlines = output_format:with_format(inlines, self.formatting)
inlines = output_format:affixed_quoted(inlines, self.affixes, localized_quotes)
+ if url_prefix then
+ table.remove(inlines, 1)
+ end
return output_format:with_display(inlines, self.display)
end
diff --git a/biblio/citation-style-language/citeproc-nodes.lua b/biblio/citation-style-language/citeproc-nodes.lua
index 69e87739b4..de01cc09d8 100644
--- a/biblio/citation-style-language/citeproc-nodes.lua
+++ b/biblio/citation-style-language/citeproc-nodes.lua
@@ -5,6 +5,9 @@
--
local style = require("citeproc-node-style")
+local citation = require("citeproc-node-citation")
+local citation = require("citeproc-node-citation")
+local bibliography = require("citeproc-node-bibliography")
local locale = require("citeproc-node-locale")
local layout = require("citeproc-node-layout")
local text = require("citeproc-node-text")
@@ -18,8 +21,9 @@ local sort = require("citeproc-node-sort")
local nodes = {
["style"] = style.Style,
- ["citation"] = style.Citation,
- ["bibliography"] = style.Bibliography,
+ ["citation"] = citation.Citation,
+ ["intext"] = citation.Intext,
+ ["bibliography"] = bibliography.Bibliography,
["locale"] = locale.Locale,
["term"] = locale.Term,
["layout"] = layout.Layout,
diff --git a/biblio/citation-style-language/citeproc-output.lua b/biblio/citation-style-language/citeproc-output.lua
index 97cc53fc4a..d3ef1d5ede 100644
--- a/biblio/citation-style-language/citeproc-output.lua
+++ b/biblio/citation-style-language/citeproc-output.lua
@@ -110,6 +110,36 @@ function Quoted:new(inlines, localized_quotes)
end
+local Code = InlineElement:derive("Code")
+
+function Code:new(value)
+ local o = InlineElement.new(self)
+ o.value = value
+ setmetatable(o, self)
+ return o
+end
+
+
+local MathML = InlineElement:derive("MathML")
+
+function MathML:new(value)
+ local o = InlineElement.new(self)
+ o.value = value
+ setmetatable(o, self)
+ return o
+end
+
+
+local MathTeX = InlineElement:derive("MathTeX")
+
+function MathTeX:new(value)
+ local o = InlineElement.new(self)
+ o.value = value
+ setmetatable(o, self)
+ return o
+end
+
+
local NoCase = InlineElement:derive("NoCase")
function NoCase:new(inlines)
@@ -152,11 +182,95 @@ function Div:new(inlines, display)
end
-function InlineElement:parse(str, context)
- -- Return a list of inlines
- if type(str) ~= "string" then
- print(debug.traceback())
+function InlineElement:parse(text, context)
+ local text_type = type(text)
+ local inlines
+ if text_type == "table" then
+ -- CSL rich text
+ inlines = self:parse_csl_rich_text(text)
+ elseif text_type == "string" then
+ -- String with HTML-like formatting tags
+ inlines = self:parse_html_tags(text, context)
+ elseif text_type == "number" then
+ inlines = {PlainText:new(tostring(text))}
+ else
+ util.error("Invalid text type")
+ end
+ return inlines
+end
+
+function InlineElement:parse_csl_rich_text(text)
+ -- Example: [
+ -- "A title with a",
+ -- {
+ -- "quote": "quoted string."
+ -- }
+ -- ]
+ local inlines = {}
+
+ local text_type = type(text)
+ if text_type == "string" then
+ table.insert(inlines, PlainText:new(text))
+ elseif text_type == "table" then
+ for _, subtext in ipairs(text) do
+ local subtext_type = type(subtext)
+ local inline
+ if subtext_type == "string" then
+ inline = PlainText:new(subtext)
+ elseif subtext_type == "table" then
+ local format
+ local content
+ for format_, content_ in pairs(subtext) do
+ format = format_
+ content = content_
+ end
+ if format == "bold" then
+ inline = Formatted:new(self:parse_csl_rich_text(content), {["font-weight"] = "bold"})
+ elseif format == "code" then
+ if type(content) ~= "string" then
+ util.error("Invalid rich text content.")
+ end
+ inline = Code:new(content)
+ elseif format == "italic" then
+ inline = Formatted:new(self:parse_csl_rich_text(content), {["font-style"] = "italic"})
+ elseif format == "math-ml" then
+ if type(content) ~= "string" then
+ util.error("Invalid rich text content.")
+ end
+ inline = Code:new(content)
+ elseif format == "math-tex" then
+ if type(content) ~= "string" then
+ util.error("Invalid rich text content.")
+ end
+ inline = Code:new(content)
+ elseif format == "preserve" then
+ inline = NoCase:new(self:parse_csl_rich_text(content))
+ elseif format == "quote" then
+ inline = Quoted:new(self:parse_csl_rich_text(content))
+ elseif format == "sc" then
+ inline = Formatted:new(self:parse_csl_rich_text(content), {["font-variant"] = "small-caps"})
+ elseif format == "strike" then
+ inline = Formatted:new(self:parse_csl_rich_text(content), {["strike-through"] = true})
+ elseif format == "sub" then
+ inline = Formatted:new(self:parse_csl_rich_text(content), {["font-variant"] = "small-caps"})
+ elseif format == "sup" then
+ inline = Formatted:new(self:parse_csl_rich_text(content), {["font-variant"] = "small-caps"})
+ end
+ end
+ table.insert(inlines, inline)
+ end
+ else
+ util.error("Invalid text type")
end
+
+ return inlines
+end
+
+function InlineElement:parse_html_tags(str, context)
+ -- Return a list of inlines
+ -- if type(str) ~= "string" then
+ -- print(debug.traceback())
+ -- end
local html_str = "<div>" .. str .. "</div>"
local ok, html = pcall(dom.parse, html_str)
local inlines
@@ -219,7 +333,12 @@ function InlineElement:parse_quotes(inlines, context)
local quote_stack = {}
local text_stack = {{}}
- local localized_quotes = context:get_localized_quotes()
+ local localized_quotes
+ if context then
+ localized_quotes = context:get_localized_quotes()
+ else
+ localized_quotes = LocalizedQuotes:new()
+ end
for _, fragment in ipairs(quote_fragments) do
local top_text_list = text_stack[#text_stack]
@@ -287,7 +406,7 @@ function InlineElement:parse_quotes(inlines, context)
local elements = text_stack[1]
if #text_stack > 1 then
- assert(#text_stack == #quote_stack + 1)
+ -- assert(#text_stack == #quote_stack + 1)
for i, quote in ipairs(quote_stack) do
if quote == "'" then
quote = util.unicode["apostrophe"]
@@ -428,8 +547,10 @@ function InlineElement:capitalize_first_term()
-- util.debug(self)
if self._type == "PlainText" then
self.value = util.capitalize(self.value)
- elseif self.inlines[1] then
+ elseif self._type ~= "Code" and self._type ~= "MathML" and self._type ~= "MathTeX" then
+ if self.inlines[1] then
self.inlines[1]:capitalize_first_term()
+ end
end
end
@@ -461,9 +582,9 @@ function OutputFormat:flatten_ir(ir)
end
function OutputFormat:flatten_seq_ir(ir)
- if not ir.children then
- print(debug.traceback())
- end
+ -- if not ir.children then
+ -- print(debug.traceback())
+ -- end
if #ir.children == 0 then
return {}
end
@@ -563,6 +684,9 @@ function OutputFormat:apply_text_case_inner(inlines, text_case, seen_one, is_upp
seen_one = seen_one or string_contains_word(inline.value)
elseif inline._type == "NoCase" or
inline._type == "NoDecor" or
+ inline._type == "Code" or
+ inline._type == "MathML" or
+ inline._type == "MathTeX" or
(inline._type == "Formatted" and inline.formatting["font-variant"] == "small-caps") or
(inline._type == "Formatted" and inline.formatting["vertical-align"] == "sup") or
(inline._type == "Formatted" and inline.formatting["vertical-align"] == "sub") then
@@ -813,6 +937,11 @@ function OutputFormat:flip_flop(inlines, state)
end
end
+ elseif inline._type == "Code" or
+ inline._type == "MathML" or
+ inline._type == "MathTeX" then
+ return
+
elseif inline.inlines then -- Div, ...
self:flip_flop(inline.inlines, state)
end
@@ -869,6 +998,11 @@ function OutputFormat:flip_flop_micro_inlines(inlines, state)
end
end
+ elseif inline._type == "Code" or
+ inline._type == "MathML" or
+ inline._type == "MathTeX" then
+ return
+
elseif inline.inlines then -- Div, ...
self:flip_flop_micro_inlines(inline.inlines, state)
end
@@ -876,14 +1010,11 @@ function OutputFormat:flip_flop_micro_inlines(inlines, state)
end
local function find_left(inline)
- if not inline then
- print(debug.traceback())
- end
if inline._type == "PlainText" then
return inline
-- elseif inline._type == "Micro" then
-- return nil
- elseif inline.inlines and inline._type~="Quoted" then
+ elseif inline.inlines and #inline.inlines > 0 and inline._type~="Quoted" then
return find_left(inline.inlines[1])
else
return nil
@@ -1158,6 +1289,15 @@ function Markup:write_inline(inline, context)
elseif inline._type == "Linked" then
return self:write_link(inline, context)
+ elseif inline._type == "Code" then
+ return self:write_code(inline.inlines)
+
+ elseif inline._type == "MathML" then
+ return self:write_mathml(inline.inlines)
+
+ elseif inline._type == "MathTeX" then
+ return self:write_math_tex(inline.inlines)
+
elseif inline._type == "NoCase" or inline._type == "NoDecor" then
return self:write_inlines(inline.inlines)
@@ -1286,12 +1426,28 @@ end
function LatexWriter:write_link(inline, context)
if inline.href == inline.value then
+ -- URL
return string.format("\\url{%s}", inline.value)
+ elseif context.engine.opt.wrap_url_and_doi then
+ return string.format("\\href{%s}{%s}", inline.href, self:write_escaped(inline.value, context))
else
- return string.format("\\href{%s}{%s}", inline.href, inline.value)
+ return self:write_escaped(inline.value, context)
end
end
+function LatexWriter:write_code(inline, context)
+ return inline.value
+end
+
+function LatexWriter:write_mathml(inline, context)
+ util.error("MathML is not supported in LaTeX output.")
+ return ""
+end
+
+function LatexWriter:write_math_tex(inline, context)
+ return string.format("$%s$", inline.value)
+end
+
local HtmlWriter = Markup:new()
@@ -1371,7 +1527,25 @@ function HtmlWriter:write_display(inline, context)
end
function HtmlWriter:write_link(inline, context)
- return string.format('<a href="%s">%s</a>', inline.href, inline.value)
+ local content = self:write_escaped(inline.value, context)
+ if context.engine.opt.wrap_url_and_doi then
+ local href = self:write_escaped(inline.href, context)
+ return string.format('<a href="%s">%s</a>', href, content)
+ else
+ return content
+ end
+end
+
+function HtmlWriter:write_code(inline, context)
+ return string.format("<code>%s</code>", inline.value)
+end
+
+function HtmlWriter:write_mathml(inline, context)
+ return string.format('<math xmlns="http://www.w3.org/1998/Math/MathML">%s</math>', inline.value)
+end
+
+function HtmlWriter:write_math_tex(inline, context)
+ return string.format("<code>$%s$</code>", self:write_escaped(inline.value, context))
end
@@ -1432,9 +1606,9 @@ function DisamStringFormat:flatten_ir(ir)
end
function DisamStringFormat:flatten_seq_ir(ir)
- if not ir.children then
- print(debug.traceback())
- end
+ -- if not ir.children then
+ -- print(debug.traceback())
+ -- end
if #ir.children == 0 then
return {}
end
@@ -1455,6 +1629,18 @@ function DisamStringFormat:flatten_seq_ir(ir)
end
+function InlineElement.has_space(inlines)
+ local str = DisamStringFormat:output(inlines)
+ if not str then
+ return false
+ end
+ if string.match(util.strip(str), "%s") then
+ return true
+ else
+ return false
+ end
+end
+
output_module.move_in_puncts = {
["."] = true,
["!"] = true,
diff --git a/biblio/citation-style-language/citeproc-util.lua b/biblio/citation-style-language/citeproc-util.lua
index 71221e6bec..1602511d8e 100644
--- a/biblio/citation-style-language/citeproc-util.lua
+++ b/biblio/citation-style-language/citeproc-util.lua
@@ -11,6 +11,21 @@ local inspect -- only load it when debugging
local util = {}
+-- Deep copy
+function util.deep_copy(obj)
+ local res
+ if type(obj) == "table" then
+ res = {}
+ for key, value in pairs(obj) do
+ res[key] = util.deep_copy(value)
+ end
+ else
+ res = obj
+ end
+ return res
+end
+
+-- Shallow copy
function util.clone(obj)
if type(obj) == "table" then
local res = {}
@@ -56,7 +71,7 @@ function util.to_list(str)
end
function util.to_ordinal (n)
- assert(type(n) == "number")
+ -- assert(type(n) == "number")
local last_digit = n % 10
if last_digit == 1 and n ~= 11
then return tostring(n) .. "st"
@@ -237,9 +252,9 @@ end
-- Python list.extend()
function util.extend(first, second)
- if not second then
- print(debug.traceback())
- end
+ -- if not second then
+ -- print(debug.traceback())
+ -- end
local l = #first
for i, element in ipairs(second) do
first[l + i] = element
@@ -262,17 +277,17 @@ end
function util.lstrip (str)
if not str then
- return nil
+ error("Invalid input")
end
- local res = string.gsub(str, "^%s+", "")
+ local res = string.gsub(str, "^%s*", "")
return res
end
function util.rstrip (str)
if not str then
- return nil
+ error("Invalid input")
end
- local res = string.gsub(str, "%s+$", "")
+ local res = string.gsub(str, "%s*$", "")
return res
end
@@ -280,16 +295,16 @@ function util.strip (str)
return util.lstrip(util.rstrip(str))
end
-function util.startswith (str, prefix)
- if not str then
- return false
+function util.startswith(str, prefix)
+ if not str or type(str) ~= "string" then
+ print(debug.traceback())
end
return string.sub(str, 1, #prefix) == prefix
end
-function util.endswith (str, suffix)
- if not str then
- return false
+function util.endswith(str, suffix)
+ if not str or type(str) ~= "string" then
+ print(debug.traceback())
end
return string.sub(str, -#suffix) == suffix
end
@@ -307,7 +322,7 @@ function util.is_numeric (str)
if not string.match(w, "^%a*%d+%a*$") and
not string.match(w, "^[MDCLXVI]+$") and
not string.match(w, "^[mdclxvi]+$") then
- -- Roman number withou validation
+ -- Roman number without validation
return false
end
end
@@ -828,7 +843,7 @@ function util.has_cjk_char(s)
end
function util.convert_roman (number)
- assert(type(number) == "number")
+ -- assert(type(number) == "number")
local output = {}
for _, tuple in ipairs(util.roman_numerals) do
local letter, value = table.unpack(tuple)
@@ -979,9 +994,9 @@ util.superscripts = {
-- File IO
function util.read_file(path)
- if not path then
- print(debug.traceback())
- end
+ -- if not path then
+ -- print(debug.traceback())
+ -- end
local file = io.open(path, "r")
if not file then
-- util.error(string.format('Cannot read file "%s".', path))
diff --git a/biblio/citation-style-language/citeproc.lua b/biblio/citation-style-language/citeproc.lua
index a4b0424530..b67b5b6477 100644
--- a/biblio/citation-style-language/citeproc.lua
+++ b/biblio/citation-style-language/citeproc.lua
@@ -9,7 +9,7 @@ local citeproc = {}
local engine = require("citeproc-engine")
local util = require("citeproc-util")
-citeproc.__VERSION__ = "0.2.2"
+citeproc.__VERSION__ = "0.3.0"
citeproc.new = engine.CiteProc.new
citeproc.util = util
diff --git a/biblio/ctan-bibdata/ctan.bib b/biblio/ctan-bibdata/ctan.bib
index cf793d1c76..19dec096c9 100644
--- a/biblio/ctan-bibdata/ctan.bib
+++ b/biblio/ctan-bibdata/ctan.bib
@@ -1,7 +1,7 @@
%% bib file of all CTAN packages
%% (C) Herbert Voß
%%
-%% created at 25-12-2022, 02:01:49
+%% created at 26-12-2022, 02:00:15
%%
%% This file is provided under the terms of the LPPL v1.3 or
@@ -10248,7 +10248,7 @@
title = {The \texttt{cabin} package},
subtitle = {A humanist Sans Serif font, with \LaTeX{} support},
author = {Bob Tennent},
- date = {2022-09-13},
+ date = {2022-12-25},
version = {},
license = {ofl,lppl},
mirror = {https://mirror.ctan.org/fonts/cabin},
@@ -12482,8 +12482,8 @@
title = {The \texttt{citation-style-language} package},
subtitle = {Bibliography formatting with Citation Style Language},
author = {Zeping Lee},
- date = {2022-09-23},
- version = {0.2.2},
+ date = {2022-12-25},
+ version = {0.3.0},
license = {mit,cc-by-sa-3},
mirror = {https://mirror.ctan.org/biblio/citation-style-language},
url = {https://ctan.org/pkg/citation-style-language},
@@ -26939,8 +26939,8 @@
title = {The \texttt{frenchmath} package},
subtitle = {Typesetting mathematics according to French rules},
author = {Antoine Missier},
- date = {2022-11-15},
- version = {2.2},
+ date = {2022-12-25},
+ version = {2.3},
license = {lppl1.3},
mirror = {https://mirror.ctan.org/macros/latex/contrib/frenchmath},
url = {https://ctan.org/pkg/frenchmath},
@@ -44759,8 +44759,8 @@
title = {The \texttt{mismath} package},
subtitle = {Miscellaneous mathematical macros},
author = {Antoine Missier},
- date = {2022-11-11},
- version = {2.0},
+ date = {2022-12-25},
+ version = {2.1},
license = {lppl1.3},
mirror = {https://mirror.ctan.org/macros/latex/contrib/mismath},
url = {https://ctan.org/pkg/mismath},
@@ -68392,6 +68392,17 @@
url = {https://ctan.org/pkg/tikz-layers},
}
+@manual{ctan-tikz-mirror-lens,
+ title = {The \texttt{tikz-mirror-lens} package},
+ subtitle = {Spherical mirrors and lenses in TikZ},
+ author = {Fernando H. G. Zucatelli},
+ date = {2022-12-25},
+ version = {1.0.0},
+ license = {lppl1.3c},
+ mirror = {https://mirror.ctan.org/graphics/pgf/contrib/tikz-mirror-lens},
+ url = {https://ctan.org/pkg/tikz-mirror-lens},
+}
+
@manual{ctan-tikz-nef,
title = {The \texttt{tikz-nef} package},
subtitle = {Create diagrams for neural networks constructed with the methods of the Neural Engineering Framework (NEF)},
diff --git a/biblio/ctan-bibdata/ctan.pdf b/biblio/ctan-bibdata/ctan.pdf
index 7ed1b84975..ec45b68d0d 100644
--- a/biblio/ctan-bibdata/ctan.pdf
+++ b/biblio/ctan-bibdata/ctan.pdf
Binary files differ
diff --git a/fonts/cabin/README b/fonts/cabin/README
index f3f9e2ba54..cc4a6f0579 100644
--- a/fonts/cabin/README
+++ b/fonts/cabin/README
@@ -1,4 +1,4 @@
-This is the README for the cabin package, version 2022-09-13.
+This is the README for the cabin package, version 2022-12-24.
This package provides LaTeX, pdfLaTeX, XeLaTeX and LuaLaTeX support for
the Cabin and Cabin Condensed families of sans serif fonts, designed by
diff --git a/fonts/cabin/doc/cabin-samples.pdf b/fonts/cabin/doc/cabin-samples.pdf
index 0430145104..c0536475f7 100644
--- a/fonts/cabin/doc/cabin-samples.pdf
+++ b/fonts/cabin/doc/cabin-samples.pdf
Binary files differ
diff --git a/fonts/cabin/latex/cabin.sty b/fonts/cabin/latex/cabin.sty
index e702fa1929..209f5b8f63 100644
--- a/fonts/cabin/latex/cabin.sty
+++ b/fonts/cabin/latex/cabin.sty
@@ -1,9 +1,10 @@
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{cabin}
- [2022/09/13 (Bob Tennent) Supports Cabin fonts for all LaTeX engines.]
+ [2022/12/24 (Bob Tennent) Supports Cabin fonts for all LaTeX engines.]
\RequirePackage{ifxetex,ifluatex,xkeyval,textcomp}
+
\newif\ifcabin@otf
\ifxetex
\cabin@otftrue
@@ -13,6 +14,12 @@
\cabin@otffalse
\fi\fi
+\ifcabin@otf
+ \RequirePackage{fontspec}
+\else
+ \RequirePackage{fontenc,fontaxes,mweights}
+\fi
+
\newif\ifcabin@default \cabin@defaultfalse
\newif\ifcabin@lining \cabin@liningfalse
\newif\ifcabin@tabular \cabin@tabularfalse
@@ -59,11 +66,7 @@
\fi
\fi
-\ifcabin@otf
- \RequirePackage{fontspec}
-\else
- \RequirePackage{fontenc,fontaxes,mweights}
-\fi
+
\ifcabin@otf
\defaultfontfeatures{
@@ -112,8 +115,9 @@
\ifcabin@medium\def\mdseries@sf{mediumcondensed}\fi
\mdseries
}
- \def\sfdefault{\cabinfamily}
- \ifcabin@default\edef\familydefault{\sfdefault}\edef\seriesdefault{\mdseries@sf}\fi
+ \edef\sfdefault{\cabinfamily}
+ \ifcabin@default\edef\familydefault{\cabinfamily}\edef\seriesdefault{\mdseries@sf}\fi
+
\fi
\ifcabin@otf
diff --git a/graphics/pgf/contrib/tikz-mirror-lens/README.md b/graphics/pgf/contrib/tikz-mirror-lens/README.md
new file mode 100644
index 0000000000..c71332863c
--- /dev/null
+++ b/graphics/pgf/contrib/tikz-mirror-lens/README.md
@@ -0,0 +1,42 @@
+%% The LaTeX package tikz-mirror-lens - version 1.0.0 (2022-12-24)
+%%
+%% -------------------------------------------------------------------------------------------
+%% Copyright (c) 2022 by FHZ
+%% -------------------------------------------------------------------------------------------
+%%
+%% This work may be distributed and/or modified under the
+%% conditions of the LaTeX Project Public License, either version 1.3c
+%% of this license or (at your option) any later version.
+%% The latest version of this license is in
+%% http://www.latex-project.org/lppl.txt
+%% and version 1.3c or later is part of all distributions of LaTeX
+%% version 2005/12/01 or later.
+%%
+%% This work has the LPPL maintenance status `author-maintained'.
+%%
+%% This work consists of all files listed in README
+%%
+
+This is the tikz-mirror-lens package documentation. This package creates draws in TikZ environment
+of the light rays reflected in mirror or through lenses.
+
+Contents of the package
+=======================
+ 'README' this file
+ 'tikz-mirror-lens.cwl' Completion Word List for some editors
+ 'tikz-mirror-lens.pdf' Documentation for tikz-mirror-lens
+ 'tikz-mirror-lens-PT.pdf' Documentation for tikz-mirror-lens in Portuguese
+ 'tikz-mirror-lens.sty' LaTeX package file (style file)
+ 'tikz-mirror-lens.tex' Source code of the documentation (main file)
+ 'tikz-mirror-lens-PT.tex' Source code of the documentation (main file) in Portuguese
+
+Installation
+============
+Copy the contents of the 'tikz-mirror-lens.zip' from CTAN to your local TeX file tree.
+
+No .ins/.dtx preinstalation is required.
+
+Version
+============
+1.0.0 (2022-12-24): Publication of the package.
+
diff --git a/graphics/pgf/contrib/tikz-mirror-lens/doc/tikz-mirror-lens-PT.pdf b/graphics/pgf/contrib/tikz-mirror-lens/doc/tikz-mirror-lens-PT.pdf
new file mode 100644
index 0000000000..7a10685d4d
--- /dev/null
+++ b/graphics/pgf/contrib/tikz-mirror-lens/doc/tikz-mirror-lens-PT.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/tikz-mirror-lens/doc/tikz-mirror-lens-PT.tex b/graphics/pgf/contrib/tikz-mirror-lens/doc/tikz-mirror-lens-PT.tex
new file mode 100644
index 0000000000..9d977fd7be
--- /dev/null
+++ b/graphics/pgf/contrib/tikz-mirror-lens/doc/tikz-mirror-lens-PT.tex
@@ -0,0 +1,581 @@
+% !TeX spellcheck = pt_BR
+% !TeX encoding = UTF-8
+% =============================
+
+\documentclass[a4paper,10pt]{article}
+\usepackage[brazil]{babel}
+\input{input_pacotes}
+
+% ========== Dados capa folha rosto ========== Sempre crie uma cópia local
+\newcommand{\textoVersao}{Versão}
+\newcommand{\Titulo}{\textbf{Espelhos e lentes esféricas em {\TikZ} -- Português}}
+\newcommand{\Pais}{\textbf{Brasil} -- \textbf{{\today} -- \textoVersao: \versao}}
+% ==========
+
+\begin{document}
+
+% ========== Capas
+{\FHZCapaArticleCabecalho}
+% ==========
+
+\begin{abstract}
+ \begin{FHZmirroLensTcolorbox}
+ Esta é a documentação do pacote \texttt{tikz-mirror-lens}. Este pacote permite o desenho automático da imagem de objetos em espelhos e lentes esféricos a partir dos dados do foco, da posição do objeto e de sua altura, calculando a posição e a altura da imagem, e apresentando os raios notáveis.
+ \end{FHZmirroLensTcolorbox}
+\end{abstract}
+
+\begin{FHZmirroLensTcolorbox}
+ {\small \tableofcontents}
+\end{FHZmirroLensTcolorbox}
+
+\section{Início rápido, definições e comandos}
+
+As variáveis utilizadas são:
+\begin{itemize}
+ \item \texttt{f}: foco do espelho ou da lente;
+ \item \texttt{p}: posição do objeto ao longo do eixo $x$;
+ \item \texttt{pp}: posição da imagem ao longo do eixo $x$;
+ \item \texttt{o}: altura do objeto;
+ \item \texttt{i}: altura da imagem;
+ \item \texttt{epsilon}: distância absoluta entre $p$ and $f$;
+ \item \texttt{yM}: altura do espelho;
+ \item \texttt{xL}: extensão do eixo $x$ à esquerda;
+ \item \texttt{xR}: extensão do eixo $x$ à direita;
+ \item \texttt{(xC,yC)}: Coordenadas da localização dos dados apresentados;
+ \item \texttt{setas}: argumento opcional para alterar a densidade de setas.
+\end{itemize}
+
+Os principais comandos que criam os diagramas do espelho ou da lente a partir do foco $f$, da posição $p$ e da altura $o$ do objeto, além de outros parâmetros de ajustes, são:
+\begin{itemize}
+ \item Espelhos
+ \begin{itemize}
+ \item \verb|\mirrorSphGauss[setas]{f}{p}{o}{epsilon}|;
+ \item \verb|\mirrorSphGaussCoord[setas]{f}{p}{o}{epsilon}|;
+ \item \verb|\mirrorSphGaussFixed[setas]{f}{p}{o}{epsilon}{yM}{xL}{xR}|;
+ \item \verb|\mirrorSphGaussFixedCoord[setas]{f}{p}{o}{epsilon}{yM}{xL}{xR}{(x_C,y_C)}|;
+ \end{itemize}
+ \item Lentes
+ \begin{itemize}
+ \item \verb|\lensSphGauss[setas]{f}{p}{o}{epsilon}|;
+ \item \verb|\lensSphGaussCoord[setas]{f}{p}{o}{epsilon}|;
+ \item \verb|\lensSphGaussFixed[setas]{f}{p}{o}{epsilon}{yM}{xL}{xR}|;
+ \item \verb|\lensSphGaussFixedCoord[setas]{f}{p}{o}{epsilon}{yM}{xL}{xR}{(x_C,y_C)}|;
+ \end{itemize}
+ \item Lentes com objeto à esquerda
+ \begin{itemize}
+ \item Para cada lente do bloco anterior, troque \enquote{\texttt{Gauss}} por \enquote{\texttt{GaussL}}.
+ \end{itemize}
+\end{itemize}
+
+\section{Modelo de espelho esférico de Gauss}
+
+\subsection{Modelagem}
+
+As equações da posição $p^{\prime}$ e da altura $i$ da imagem a partir do foco $f$ do espelho e da posição $p$ e altura $o$ do objeto são:
+\begin{equation}
+ \begin{split}
+ \dfrac{1}{f} & = \dfrac{1}{p} + \dfrac{1}{p^{\prime}} \Rightarrow p^{\prime} = \dfrac{f p}{p - f}, \quad p \neq f, \\
+ i & = - \dfrac{p^{\prime}}{p} o.
+ \end{split}
+\end{equation}
+
+As definições do tipo de espelho são feitas com base no sinal do foco:
+\begin{equation}
+ \begin{split}
+ f > 0: & \; \textrm{côncavo}, \\
+ f < 0: & \; \textrm{convexo}.
+ \end{split}
+\end{equation}
+
+A \autoref{fig:def_coordenadas_espelho} apresenta a definição do sistema de coordenadas do espelho, na qual $p > 0$ é a posição do objeto ao longo do eixo $x$ e $p^{\prime} < 0$ é a posição da imagem ao longo do eixo $x$. O vértice $V$ do espelho é a origem do sistemas de coordenadas.
+
+\begin{figure}[!ht]
+ \centering
+ \captionbox{Convenção de sinais para espelhos esféricos\label{fig:def_coordenadas_espelho}}[\linewidth]{
+ \begin{tikzpicture}[
+ extended line/.style={shorten >=-#1,shorten <=-#1},
+ extended line/.default=1cm]
+ \mirrorBase{2}{2}{-2}{4.5}
+ \mirrorPts{0}{2}{4}
+ \mirrorLensObjIma{1}{-2}{1}{2}
+ \draw[red] (0,0) node[above left] {(0,0)};
+ \draw[-latex] (0,-1) -- ++(1,0) node[midway, above]{$p > 0$};
+ \draw[thin] (1,-1.2) -- ++(0,1);
+ \draw[-latex] (0,-1) -- ++(-2,0) node[midway, above]{$p^{\prime} < 0$};
+ \draw[thin] (-2,-1.2) -- ++(0,1);
+ \begin{scope}[purple]
+ \draw (4.5,0) node[above] {$x+$};
+ \draw (0,2) node[right] {$y+$};
+ \draw (-2.5,0) node[above] {$x-$};
+ \draw (0,-2) node[right] {$y-$};
+ \end{scope}
+ \end{tikzpicture}
+ }
+\end{figure}
+
+\subsection{Configurações prontas de espelhos}
+
+A \autoref{tab:tab_configuracoes_espelhos} apresenta todas as configurações de espelhos prontas fornecidas pelo pacote. A notação é:
+\begin{itemize}
+ \item \texttt{seta}: distância entre setas desenhadas, em caso de omissão, o padrão é 60 (pt).
+ \item \texttt{epsilon}: distância entre objeto e o foco na qual a imagem não é calculada nem desenhada por ser muito grande e/ou estar muito longe do vértice;
+ \item \texttt{yM}: altura do espelho, seja um dado ou um cálculo;
+ \item \texttt{xL}: limite negativo do eixo $x$;
+ \item \texttt{xR}: limite positivo do eixo $x$;
+ \item \texttt{Co}: o par ordenado $(x_C,y_C)$ do bloco de equações que apresentam o foco e as coordenadas do objeto e da imagem.
+\end{itemize}
+
+\begin{table}[!ht]
+ \centering
+ \captionbox{Todas as configurações de espelhos prontas\label{tab:tab_configuracoes_espelhos}}[\linewidth]{
+ \input{input_tab_configuracoes_espelhos}
+ }
+\end{table}
+
+\subsection{Comandos constituintes}
+
+O comando que calcula a posição $p^{\prime}$ e a altura $i$ da imagem é:
+\begin{itemize}
+ \item \verb|\mirrorMath{f}{p}{o}{epsilon}{yM}|.
+\end{itemize}
+
+Os seguintes comandos desenham as principais componentes do diagrama,
+\begin{itemize}
+ \item desenho do espelho: \verb|\mirrorBase{f}{yM}{xL}{xR}|;
+ \item desenho dos pontos notáveis: \verb|\mirrorPts{v}{f}{c}}|;
+ \item desenho dos raios notáveis: \verb|\mirrorRays{p}{pp}{o}{i}|.
+\end{itemize}
+
+Os seguintes comandos são os mesmos para os espelhos e para as lentes, e são responsáveis por,
+\begin{itemize}
+ \item desenho do objeto e da imagem: \verb|\mirrorLensObjIma{p}{pp}{o}{i}|;
+ \item descrição dos valores numéricos das coordenadas: \verb|\mirrorLensCoord{p}{pp}{o}{i}{f}{Co}|.
+\end{itemize}
+
+\subsection{Exemplos de cada caso possível dos espelhos}
+
+\subsubsection{Côncavo}
+
+As figuras de \ref{fig:conc01} a \ref{fig:conc05} apresentam os 5 casos possíveis de posicionamento de um objeto diante de um espelho côncavo.
+
+% \autoref{fig:conc02} ... \autoref{fig:conc03} ... \autoref{fig:conc04} ... \autoref{fig:conc05} ...
+
+
+\begin{figure}[!ht]
+ \centering
+ {\scriptsize \verb|\mirrorSphGaussFixedCoord{2}{4.5}{2.5}{0.4}{3}{1.5}{4}{(4,-1)}|}
+ \captionbox{Caso 1, objeto longe do espelho, além do centro de
+ curvatura\label{fig:conc01}}[\linewidth]{
+ \adjustbox{height=4cm}{\mirrorSphGaussFixedCoord{2}{4.5}{2}{0.4}{3}{1.5}{4}{(4.8,1)}
+ }
+ }
+\end{figure}
+
+\begin{figure}[!ht]
+ \centering
+ {\scriptsize \verb|\mirrorSphGaussFixedCoord{2}{4}{2}{0.4}{3}{1.5}{4}{(4.5,1)}|}
+ \captionbox{Caso 2, objeto localizado sobre o centro de curvatura\label{fig:conc02}}[\linewidth]{
+ \adjustbox{height=4cm}{\mirrorSphGaussFixedCoord{2}{4}{2}{0.4}{3}{1.5}{4}{(4.5,1)}}
+ }
+\end{figure}
+
+\begin{figure}[!ht]
+ \centering
+ {\scriptsize \verb|\mirrorSphGaussFixedCoord{2}{3.6}{2}{0.4}{3}{1.5}{4}{(4,1)}|}
+ \captionbox{Caso 3, objeto localizado entre o centro de curvatura e o foco do espelho\label{fig:conc03}}[\linewidth]{
+ \adjustbox{height=4cm}{\mirrorSphGaussFixedCoord{2}{3.6}{2}{0.4}{3}{1.5}{4}{(4,1)}}
+ }
+\end{figure}
+
+\begin{figure}[!ht]
+ \centering
+ {\scriptsize \verb|\mirrorSphGaussFixedCoord{2}{2}{2}{0.4}{3}{1.5}{4}{(2.5,1)}|}
+ \captionbox{Caso 4, objeto localizado sobre o foco do espelho (ou a menos de uma distância $\varepsilon \to 0$)\label{fig:conc04}}[\linewidth]{
+ \adjustbox{height=4cm}{\mirrorSphGaussFixedCoord{2}{2}{2}{0.4}{3}{1.5}{4}{(2.5,1)}}
+ }
+\end{figure}
+
+\begin{figure}[!ht]
+ \centering
+ {\scriptsize \verb|\mirrorSphGaussFixedCoord{2}{0.45}{1.5}{0.4}{2.5}{1}{4}{(2,-1)}|}
+ \captionbox{Caso 5, objeto localizado entre o foco e o vértice
+ do espelho\label{fig:conc05}}[\linewidth]{
+ \adjustbox{height=4cm}{\mirrorSphGaussFixedCoord{2}{0.45}{1.5}{0.4}{2.5}{1}{4}{(2,-1)}}
+ }
+\end{figure}
+
+\subsubsection{Convexo}
+
+A \autoref{fig:covx} apresenta duas posições distintas do único caso de posicionamento de um objeto diante de um espelho convexo.
+
+\begin{figure}[!ht]
+ \centering
+ \begin{minipage}[c]{0.45\linewidth}
+ \centering{\tiny \verb|\mirrorSphGaussFixedCoord{-2}{1.5}{1.5}{0.4}{2}{-3}{2}{(2,-1)}|}
+ \end{minipage} %
+ \begin{minipage}[c]{0.45\linewidth}
+ \centering{\tiny \verb|\mirrorSphGaussFixedCoord{-2}{4}{1.5}{0.4}{2}{-3}{4.2}{(2,-1)}|}
+ \end{minipage}
+ \captionbox{Caso único, objeto localizado à frente do espelho, a qualquer distância dele\label{fig:covx}}[\linewidth]{
+ \subcaptionbox{Objeto próximo do vértice}{
+ \adjustbox{width=0.45\linewidth}{\mirrorSphGaussFixedCoord{-2}{1.5}{1.5}{0.4}{2.5}{-3}{2}{(2,-1)}}
+ }\hfill
+ \subcaptionbox{Objeto distante do vértice}{
+ \adjustbox{width=0.45\linewidth}{\mirrorSphGaussFixedCoord{-2}{4}{1.5}{0.4}{2.5}{-3}{4.2}{(2,-1)}}
+ }
+ }
+\end{figure}
+
+% Exercício: Prova que toda a imagem no espelho convexo está entre o vértice $V$ e o foco $f$. Ou seja, é impossível que $p^{\prime}$ seja menor que $f$ e maior que $V$.
+
+% Exercício: Prova que toda a imagem no espelho convexo é menor que a altura do objeto.
+
+\subsection{Animação}
+
+\subsubsection{Côncavo}
+
+A \autoref{fig:anim_mirror_conc} apresenta uma animação contendo o movimento de um objeto próximo de um espelho côncavo.
+
+\begin{figure}[ht]
+ \centering
+ \captionbox{Animação de objeto se aproximando de um espelho côncavo\label{fig:anim_mirror_conc}}[\linewidth]{
+ \adjustbox{height=6cm}{
+ \begin{animateinline}[poster=first, controls, palindrome, bb=-5 -5 50 50]{10}
+ \multiframe{100}{rx=0.5+0.05}{
+ \mirrorSphGaussFixed[50]{2}{6-\rx}{2}{0.4}{11}{-8.5}{12}
+ }
+ \end{animateinline}
+ }
+ }
+\end{figure}
+
+\subsubsection{Convexo}
+
+A \autoref{fig:anim_mirror_covx} apresenta uma animação contendo o movimento de um objeto próximo de um espelho convexo.
+
+\begin{figure}[ht]
+ \centering
+ \captionbox{Animação de objeto se aproximando de um espelho convexo\label{fig:anim_mirror_covx}}[\linewidth]{
+ \adjustbox{height=6cm}{
+ \begin{animateinline}[poster=first, controls, palindrome, bb=-5 -5 50 50]{10}
+ \multiframe{100}{rx=0.5+0.05}{
+ \mirrorSphGaussFixed[50]{-2}{6-\rx}{2}{0.4}{2.5}{-4.5}{6}
+ }
+ \end{animateinline}
+ }
+ }
+\end{figure}
+
+\section{Modelo de lente esférica de Gauss}
+
+\subsection{Modelagem}
+
+A \autoref{fig:def_coordenadas_lente} apresenta a definição do sistema de coordenadas da lente em dois casos, o com o objeto do lado positivo na \autoref{subfig:def_coordenadas_lente-a} e com o objeto do lado negativo \autoref{subfig:def_coordenadas_lente-b}.
+
+\begin{figure}[!ht]
+ \centering
+ \captionbox{Convenção de sinais para lentes esféricas\label{fig:def_coordenadas_lente}}[\linewidth]{
+ \subcaptionbox[0.4\linewidth]{Objeto na referência à direita\label{subfig:def_coordenadas_lente-a}}{
+ \adjustbox{width=0.45\linewidth}{
+ \begin{tikzpicture}[
+ extended line/.style={shorten >=-#1,shorten <=-#1},
+ extended line/.default=1cm]
+ \lensBase{2}{2}{-4.5}{6}
+ \lensPts{0}{2}{4}
+ \mirrorLensObjIma{6}{-3}{1.5}{-0.75}
+ \draw[red] (0,0) node[above left] {(0,0)};
+ \draw[-latex] (0,-1) -- ++(6,0) node[midway, above]{$p > 0$};
+ \draw[thin] (6,-1.2) -- ++(0,1);
+ \draw[-latex] (0,-1.5) -- ++(-3,0) node[midway, above]{$p^{\prime} < 0$};
+ \draw[thin] (-3,-1.5) -- ++(0,0.7);
+ \begin{scope}[purple]
+ \draw (6,0) node[below right] {$x+$};
+ \draw (0,1.5) node[right] {$y+$};
+ \draw (-4,0) node[above left] {$x-$};
+ \draw (0,-1.5) node[right] {$y-$};
+ \end{scope}
+ \end{tikzpicture}
+ }
+ }\hfill
+ \subcaptionbox[0.4\linewidth]{Objeto na referência à esquerda\label{subfig:def_coordenadas_lente-b}}{
+ \adjustbox{width=0.45\linewidth}{
+ \begin{tikzpicture}[
+ extended line/.style={shorten >=-#1,shorten <=-#1},
+ extended line/.default=1cm]
+ \lensBase{2}{2}{-6}{4.5}
+ \lensPts{0}{-2}{-4}
+ \mirrorLensObjIma{-6}{3}{1.5}{-0.75}
+ \draw[red] (0,0) node[above left] {(0,0)};
+ \draw[-latex] (0,-1.4) -- ++(3,0) node[midway, above]{$p^{\prime} > 0$};
+ \draw[thin] (3,-1.6) -- ++(0,0.8);
+ \draw[-latex] (0,-1) -- ++(-6,0) node[midway, above]{$p < 0$};
+ \draw[thin] (-6,-1.2) -- ++(0,1);
+ \begin{scope}[purple]
+ \draw (4.5,0) node[above] {$x+$};
+ \draw (0,1.5) node[right] {$y+$};
+ \draw (-6.5,0) node[above] {$x-$};
+ \draw (0,-1.5) node[left] {$y-$};
+ \end{scope}
+ \end{tikzpicture}
+ }
+ }
+ }
+\end{figure}
+
+As definições do tipo de lente são feitas com base no sinal do foco:
+\begin{equation}
+ \begin{split}
+ f > 0: & \quad \textrm{convergente}, \\
+ f < 0: & \quad \textrm{divergente}.
+ \end{split}
+\end{equation}
+
+\subsubsection{Objeto à direita}
+
+Para o objeto à direita, a forma mais fácil de corrigir o modelo de um espelho esférico para uma lente esférica é com troca do sinal de $p^{\prime}$.
+
+As equações da posição $p^{\prime}$ e da altura $i$ da imagem a partir do foco $f$ do espelho, e da posição $p$ e altura $o$ do objeto são:
+\begin{equation}
+ \begin{split}
+ \dfrac{1}{f} & = \dfrac{1}{p} - \dfrac{1}{p^{\prime}} \Rightarrow p^{\prime} = \dfrac{f p}{f - p}, \quad p \neq f, \\
+ i & = \dfrac{p^{\prime}}{p} o.
+ \end{split}
+\end{equation}
+
+\subsubsection{Objeto à esquerda}
+
+Para o objeto à esquerda, a expressão de $p^{\prime}$ e $i$ são dadas por:
+\begin{equation}
+ \begin{split}
+ \dfrac{1}{p^{\prime}} & = \dfrac{1}{p} + \dfrac{1}{f} \Rightarrow p^{\prime} = \dfrac{f p}{f + p}, \quad p \neq -f, \\
+ i & = \dfrac{p^{\prime}}{p} o.
+ \end{split}
+\end{equation}
+
+\subsection{Configurações prontas de lentes}
+
+A \autoref{tab:tab_configuracoes_lentes} apresenta todas as configurações de lentes prontas fornecidas pelo pacote.
+
+\begin{table}[ht]
+ \centering
+ \captionbox{Todas as configurações de lentes prontas\label{tab:tab_configuracoes_lentes}}[\linewidth]{
+ \input{input_tab_configuracoes_lentes}
+ }
+\end{table}
+
+\subsection{Configurações prontas de lentes -- à esquerda}
+
+A \autoref{tab:tab_configuracoes_lentesL} apresenta todas as configurações de lentes prontas fornecidas pelo pacote.
+
+\begin{table}[ht]
+ \centering
+ \captionbox{Todas as configurações de lentes prontas com objeto à esquerda\label{tab:tab_configuracoes_lentesL}}[\linewidth]{
+ \input{input_tab_configuracoes_lentesL}
+ }
+\end{table}
+
+\subsection{Comandos constituintes}
+
+% TODO: Convenção gaussiana?
+O comando que calcula a posição $p^{\prime}$ e a altura $i$ da imagem com objeto à direita é:
+\begin{itemize}
+ \item \verb|\lensMath{f}{p}{o}{epsilon}{yM}|.
+\end{itemize}
+
+% TODO: Convenção cartesiana?
+Por sua vez, o comando que calcula as coordenadas da imagem com o objeto à esquerda é:
+\begin{itemize}
+ \item \verb|\lensMathL{f}{p}{o}{epsilon}{yM}|,
+\end{itemize}
+por sua vez, a alteração na nomenclatura dos comandos que desenha as lentes é apenas a adição da letra $L$ após a palavra \enquote{Gauss}.
+
+Os seguintes comandos desenham as principais componentes do diagrama,
+\begin{itemize}
+ \item desenho da lente: \verb|\lensBase{f}{yM}{xL}{xR}|;
+ \item desenho dos pontos notáveis: \verb|\lensPts{v}{f}{a}|;
+ \item desenho dos raios notáveis: \verb|\lensRays{p}{pp}{o}{i}|.
+\end{itemize}
+
+\subsection{Exemplos de cada caso possível das lentes}
+
+\subsubsection{Convergente}
+
+As figuras de \ref{fig:conv01} a \ref{fig:conv05} apresentam os 5 casos possíveis de posicionamento de um objeto diante de uma lente convergente.
+
+% \autoref{fig:conv02} ... \autoref{fig:conv03} ... \autoref{fig:conv04} ... \autoref{fig:conv05} ...
+
+\begin{figure}[!ht]
+ \centering
+ {\scriptsize \verb|\lensSphGaussFixedCoord{2}{5}{1.5}{0.4}{2}{-4}{4}{(2,-1.5)}|}
+ \captionbox{Caso 1, objeto longe do espelho, além do centro de curvatura\label{fig:conv01}}[\linewidth]{
+ \adjustbox{height=3cm}{\lensSphGaussFixedCoord{2}{5}{1.5}{0.4}{2}{-4}{4}{(2,-1.5)}}
+ }
+\end{figure}
+
+\begin{figure}[!ht]
+ \centering
+ {\scriptsize \verb|\lensSphGaussFixedCoord{2}{4}{1.5}{0.4}{2}{-4}{4}{(2,-1.5)}|}
+ \captionbox{Caso 2, objeto sobre o antiprincipal objeto\label{fig:conv02}}[\linewidth]{
+ \adjustbox{height=3cm}{\lensSphGaussFixedCoord{2}{4}{1.5}{0.4}{2}{-4}{4}{(2,-1.5)}}
+ }
+\end{figure}
+
+\begin{figure}[!ht]
+ \centering
+ {\scriptsize \verb|\lensSphGaussFixedCoord{2}{3.5}{1.5}{0.4}{2.5}{-4}{4}{(2,-1.5)}|}
+ \captionbox{Caso 3, objeto entre o antiprincipal objeto e o foco objeto\label{fig:conv03}}[\linewidth]{
+ \adjustbox{height=3cm}{\lensSphGaussFixedCoord{2}{3.5}{1.5}{0.4}{2.5}{-4}{4}{(2,-1.5)}}
+ }
+\end{figure}
+
+\begin{figure}[!ht]
+ \centering
+ {\scriptsize \verb|\lensSphGaussFixedCoord{2}{2}{1.5}{0.4}{2}{-5}{5}{(2,-1)}|}
+ \captionbox{Caso 4, objeto sobre o foco objeto (ou a menos de uma distância $\varepsilon \to 0$)\label{fig:conv04}}[\linewidth]{
+ \adjustbox{height=3cm}{\lensSphGaussFixedCoord{2}{2}{1.5}{0.4}{2}{-5}{5}{(2,-1)}}
+ }
+\end{figure}
+
+\begin{figure}[!ht]
+ \centering
+ {\scriptsize \verb|\lensSphGaussFixedCoord{2}{1.2}{1}{0.4}{3}{-4}{4}{(1.5,-1.5)}|}
+ \captionbox{Caso 5, objeto entre o foco objeto e o centro óptico da lente\label{fig:conv05}}[\linewidth]{
+ \adjustbox{height=3cm}{\lensSphGaussFixedCoord{2}{1.2}{1}{0.4}{3}{-4}{4}{(1.5,-1.5)}}
+ }
+\end{figure}
+
+\subsubsection{Divergente}
+
+A \autoref{fig:dive} apresenta duas posições distintas do único caso de posicionamento de um objeto diante de uma lente divergente.
+
+\begin{figure}[!ht]
+ \centering
+ \begin{minipage}[c]{0.45\linewidth}
+ \centering{\tiny \verb|\lensSphGaussFixed[50]{-2}{2}{2}{0.4}{2.5}{-4}{4}|}
+ \end{minipage} %
+ \begin{minipage}[c]{0.45\linewidth}
+ \centering{\tiny \verb|\lensSphGaussFixed[50]{-2}{4}{2}{0.4}{2.5}{-4}{4}|}
+ \end{minipage}
+ \captionbox{Caso único, objeto localizado à frente da lente, a qualquer distância dele\label{fig:dive}}[\linewidth]{
+ \subcaptionbox{Entre foco e vértice}{
+ \adjustbox{height=3cm}{\lensSphGaussFixed[50]{-2}{2}{1.5}{0.4}{2.5}{-3}{3}}
+ }\quad\quad\quad
+ \subcaptionbox{Além do centro de curvatura}{
+ \adjustbox{height=3cm}{\lensSphGaussFixed[50]{-2}{4}{1.5}{0.4}{2.5}{-3}{3}}
+ }
+ }
+\end{figure}
+
+\subsection{Equivalência entre comandos para lentes com objeto à direita e à esquerda}
+
+A \autoref{fig:equiv_conv} apresenta a equivalência entre os comandos que calculam e desenho a imagem por meio do uso lentes convergentes em função da localização do objeto.
+
+\begin{figure}[!ht]
+ \centering
+ \begin{minipage}[c]{0.45\linewidth}
+ \centering{\tiny \verb|\lensSphGaussFixedCoord{2}{6}{1.5}{0.4}{2}{-4.2}{4.2}{(2,-1.5)}|}
+ \end{minipage} %
+ \begin{minipage}[c]{0.45\linewidth}
+ \centering{\tiny \verb|\lensSphGaussLFixedCoord{2}{-6}{1.5}{0.4}{2}{-4.2}{4.2}{(-4,-1.5)}|}
+ \end{minipage}
+ \captionbox{Equivalência entre comandos para lentes convergentes\label{fig:equiv_conv}}[\linewidth]{
+ \subcaptionbox{Comando para objeto à direita}{
+ \adjustbox{height=2.8cm}{\lensSphGaussFixedCoord{2}{6}{1.2}{0.4}{2}{-3}{4.2}{(2,-1.5)}}
+ }\hfill
+ \subcaptionbox{Comando para objeto à esquerda}{
+ \adjustbox{height=2.8cm}{\lensSphGaussLFixedCoord{2}{-6}{1.2}{0.4}{2}{-4.2}{3}{(-5,-1.5)}}
+ }
+ }
+\end{figure}
+
+A \autoref{fig:equiv_dive} apresenta a equivalência entre os comandos que calculam e desenho a imagem por meio do uso lentes divergentes em função da localização do objeto.
+
+\begin{figure}[!ht]
+ \centering
+ \begin{minipage}[c]{0.45\linewidth}
+ \centering{\tiny \verb|\lensSphGaussFixedCoord{2}{6}{1.5}{0.4}{2}{-4.2}{4.2}{(2,-1.5)}|}
+ \end{minipage}%
+ \begin{minipage}[c]{0.45\linewidth}
+ \centering{\tiny \verb|\lensSphGaussLFixedCoord{2}{-6}{1.5}{0.4}{2}{-4.2}{4.2}{(-4,-1.5)}|}
+ \end{minipage}
+ \captionbox{Equivalência entre comandos para lentes divergentes\label{fig:equiv_dive}}[\linewidth]{
+ \subcaptionbox{Comando para objeto à direita}{
+ \adjustbox{height=2.8cm}{\lensSphGaussFixedCoord{-2}{4}{1.2}{0.4}{2}{-2.5}{2.5}{(1,-1.5)}}
+ }\hfill
+ \subcaptionbox{Comando para objeto à esquerda}{
+ \adjustbox{height=2.8cm}{\lensSphGaussLFixedCoord{-2}{-4}{1.2}{0.4}{2}{-2.5}{2.5}{(-5,-1.5)}}
+ }
+ }
+\end{figure}
+
+\subsection{Animação}
+
+\subsubsection{Convergente}
+
+A \autoref{fig:anim_len_conv} apresenta uma animação contendo o movimento de um objeto próximo de uma lente convergente.
+
+\begin{figure}[!ht]
+ \centering
+ \captionbox{Animação de objeto se aproximando de uma lente convergente\label{fig:anim_len_conv}}[\linewidth]{
+ \adjustbox{width=0.6\linewidth}{
+ \begin{animateinline}[poster=first, controls, palindrome, bb=-5 -5 50 50]{10}
+ \multiframe{100}{rx=0.5+0.05}{
+ \lensSphGaussFixed[50]{2}{6-\rx}{2}{0.4}{11}{-12.5}{8.5}
+ }
+ \end{animateinline}
+ }
+ }
+\end{figure}
+
+\subsubsection{Divergente}
+
+A \autoref{fig:anim_len_dive} apresenta uma animação contendo o movimento de um objeto próximo de uma lente divergente.
+
+\begin{figure}[!ht]
+ \centering
+ \captionbox{Animação de objeto se aproximando de uma lente divergente\label{fig:anim_len_dive}}[\linewidth]{
+ \adjustbox{width=0.6\linewidth}{
+ \begin{animateinline}[poster=first, controls, palindrome, bb=-5 -5 50 50]{10}
+ \multiframe{100}{rx=0.5+0.05}{
+ \lensSphGaussFixed[50]{-2}{6-\rx}{2}{0.4}{2.5}{-4.5}{6}
+ }
+ \end{animateinline}
+ }
+ }
+\end{figure}
+
+\section{Outros pacotes interessantes}
+
+A seguir, encontram-se \textit{links} interessantes para outros pacotes com implementações de ótica, e também fontes para as equações e modelagens utilizadas.
+
+\begin{FHZmirroLensTcolorbox}
+ \begin{enumerate}
+ \item \href{https://tex.stackexchange.com/q/33460/140133}{\textbf{TeX StackExchange} -- TikZ library for optics?}
+ \item \href{https://tex.stackexchange.com/q/623201/140133}{\textbf{TeX StackExchange} -- Geometrical optics}
+ \item \href{https://ctan.org/pkg/tikz-optics}{{\textbf{CTAN}} -- tikz-optics}
+ \item \href{https://ctan.org/pkg/pst-mirror}{\textbf{CTAN} -- pst-mirror}
+ \item \href{https://ctan.org/pkg/simpleoptics}{\textbf{CTAN} -- simpleoptics}
+
+ \item \href{https://youtu.be/efPZ5uSDeuI}{{\YouTube} -- The Organic Chemistry Tutor -- Spherical Mirrors \& The Mirror Equation - Geometric Optics}
+ \item \href{http://hyperphysics.phy-astr.gsu.edu/hbase/geoopt/mireq.html}{hyperphysics -- Spherical Mirror Equation}
+
+
+ \item \href{http://hyperphysics.phy-astr.gsu.edu/hbase/geoopt/lenseq.html}{hyperphysics -- lenseq}
+ \item \href{https://www.plymouth.ac.uk/uploads/production/document/path/3/3754/PlymouthUniversity_MathsandStats_outreach_lenses.pdf}{plymouth -- lenses}
+ \item \href{https://www.khanacademy.org/science/in-in-class10th-physics/in-in-10th-physics-light-reflection-refraction/in-in-lens-formula-magnification/v/lens-formula}{khanacademy -- lens formula}
+ % https://brasilescola.uol.com.br/fisica/espelhos-esfericos.htm
+ % https://mundoeducacao.uol.com.br/fisica/lentes-esfericas.htm
+ % https://www.todamateria.com.br/lentes-esfericas/
+ % https://pt.wikipedia.org/wiki/Lente
+ \end{enumerate}
+\end{FHZmirroLensTcolorbox}
+
+\section{Histórico e versões}
+
+\begin{FHZmirroLensTcolorbox}
+ \begin{enumerate}[leftmargin=3.5cm]
+ \item[1.0.0 (2022-12-24):] Criação do pacote.
+ \end{enumerate}
+\end{FHZmirroLensTcolorbox}
+
+\end{document} \ No newline at end of file
diff --git a/graphics/pgf/contrib/tikz-mirror-lens/doc/tikz-mirror-lens.pdf b/graphics/pgf/contrib/tikz-mirror-lens/doc/tikz-mirror-lens.pdf
new file mode 100644
index 0000000000..bf794f1b8f
--- /dev/null
+++ b/graphics/pgf/contrib/tikz-mirror-lens/doc/tikz-mirror-lens.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/tikz-mirror-lens/doc/tikz-mirror-lens.tex b/graphics/pgf/contrib/tikz-mirror-lens/doc/tikz-mirror-lens.tex
new file mode 100644
index 0000000000..13e39dc610
--- /dev/null
+++ b/graphics/pgf/contrib/tikz-mirror-lens/doc/tikz-mirror-lens.tex
@@ -0,0 +1,570 @@
+% !TeX spellcheck = en_US
+% !TeX encoding = UTF-8
+% =============================
+
+\documentclass[a4paper,10pt]{article}
+\input{input_pacotes}
+
+% ========== Dados capa folha rosto ========== Sempre crie uma cópia local
+\newcommand{\textoVersao}{Version}
+\newcommand{\Titulo}{\textbf{Spherical mirrors and lenses in {\TikZ} -- English}}
+\newcommand{\Pais}{\textbf{Brazil} -- \textbf{{\today} -- \textoVersao: \versao}}
+% ==========
+
+\begin{document}
+
+% ========== Capas
+{\FHZCapaArticleCabecalho}
+% ==========
+
+\begin{abstract}
+ \begin{FHZmirroLensTcolorbox}
+ This is the documentation for the \texttt{tikz-mirror-lens} package. This package allows the automatic drawing of the image of objects in spherical mirrors and lenses from the data of the focus, from the position and height of the object, calculating the position and height of the image, and presenting the notable rays.
+ \end{FHZmirroLensTcolorbox}
+\end{abstract}
+
+\begin{FHZmirroLensTcolorbox}
+ {\small \tableofcontents}
+\end{FHZmirroLensTcolorbox}
+
+\section{Quick start, settings and commands}
+
+The variables used are:
+\begin{itemize}
+ \item \texttt{f}: mirror or lens focus;
+ \item \texttt{p}: position of the object along the $x$ axis;
+ \item \texttt{pp}: position of the image along the $x$ axis;
+ \item \texttt{o}: height of the object;
+ \item \texttt{i}: image height;
+ \item \texttt{epsilon}: absolute distance between $p$ and $f$;
+ \item \texttt{yM}: mirror height;
+ \item \texttt{xL}: axis extension $x$ to the left;
+ \item \texttt{xR}: axis extension $x$ to the right;
+ \item \texttt{(xC,yC)}: Coordinates of the location of the presented data;
+ \item \texttt{arrows}: optional argument to change the density of arrows.
+\end{itemize}
+
+The main commands that create the mirror or lens diagrams based on the object's focus $f$, position $p$ and height $o$, in addition to other adjustment parameters, are:
+\begin{itemize}
+ \item Mirrors
+ \begin{itemize}
+ \item \verb|\mirrorSphGauss[setas]{f}{p}{o}{epsilon}|;
+ \item \verb|\mirrorSphGaussCoord[setas]{f}{p}{o}{epsilon}|;
+ \item \verb|\mirrorSphGaussFixed[setas]{f}{p}{o}{epsilon}{yM}{xL}{xR}|;
+ \item \verb|\mirrorSphGaussFixedCoord[setas]{f}{p}{o}{epsilon}{yM}{xL}{xR}{(x_C,y_C)}|;
+ \end{itemize}
+ \item Lenses
+ \begin{itemize}
+ \item \verb|\lensSphGauss[setas]{f}{p}{o}{epsilon}|;
+ \item \verb|\lensSphGaussCoord[setas]{f}{p}{o}{epsilon}|;
+ \item \verb|\lensSphGaussFixed[setas]{f}{p}{o}{epsilon}{yM}{xL}{xR}|;
+ \item \verb|\lensSphGaussFixedCoord[setas]{f}{p}{o}{epsilon}{yM}{xL}{xR}{(x_C,y_C)}|;
+ \end{itemize}
+ \item Lenses with object on the left
+ \begin{itemize}
+ \item For each lens in the previous block, change \enquote{\texttt{Gauss}} to \enquote{\texttt{GaussL}}.
+ \end{itemize}
+\end{itemize}
+
+\section{Gaussian spherical mirror model}
+
+\subsection{Modeling}
+
+The equations for the position $p^{\prime}$ and the height $i$ of the image from the focus $f$ of the mirror and the position $p$ and height $o$ of the object are:
+\begin{equation}
+ \begin{split}
+ \dfrac{1}{f} & = \dfrac{1}{p} + \dfrac{1}{p^{\prime}} \Rightarrow p^{\prime} = \dfrac{f p}{p - f}, \quad p \neq f, \\
+ i & = - \dfrac{p^{\prime}}{p} o.
+ \end{split}
+\end{equation}
+
+Mirror type definitions are made based on the focus' signal:
+\begin{equation}
+ \begin{split}
+ f > 0: & \; \textrm{concave}, \\
+ f < 0: & \; \textrm{convex}.
+ \end{split}
+\end{equation}
+
+\autoref{fig:def_coordenadas_espelho} presents the definition of the mirror coordinate system, in which $p > 0$ is the position of the object along the $x$ axis and $p^{\prime} < 0$ is the image position along the $x$ axis. The vertex $V$ of the mirror is the origin of the coordinate system.
+
+\begin{figure}[!ht]
+ \centering
+ \captionbox{Sign convention for spherical mirrors\label{fig:def_coordenadas_espelho}}[\linewidth]{
+ \begin{tikzpicture}[
+ extended line/.style={shorten >=-#1,shorten <=-#1},
+ extended line/.default=1cm]
+ \mirrorBase{2}{2}{-2}{4.5}
+ \mirrorPts{0}{2}{4}
+ \mirrorLensObjIma{1}{-2}{1}{2}
+ \draw[red] (0,0) node[above left] {(0,0)};
+ \draw[-latex] (0,-1) -- ++(1,0) node[midway, above]{$p > 0$};
+ \draw[thin] (1,-1.2) -- ++(0,1);
+ \draw[-latex] (0,-1) -- ++(-2,0) node[midway, above]{$p^{\prime} < 0$};
+ \draw[thin] (-2,-1.2) -- ++(0,1);
+ \begin{scope}[purple]
+ \draw (4.5,0) node[above] {$x+$};
+ \draw (0,2) node[right] {$y+$};
+ \draw (-2.5,0) node[above] {$x-$};
+ \draw (0,-2) node[right] {$y-$};
+ \end{scope}
+ \end{tikzpicture}
+ }
+\end{figure}
+
+\subsection{Ready-made mirror setups}
+
+\autoref{tab:tab_configuracoes_espelhos} presents all ready-made mirror configurations provided by the package. The notation is:
+\begin{itemize}
+ \item \texttt{arrow}: distance between drawn arrows, in case of omission, the default is 60 (pt).
+ \item \texttt{epsilon}: distance between object and focus at which the image is not calculated or drawn because it is too big and/or too far from the vertex;
+ \item \texttt{yM}: mirror height, either data or calculation;
+ \item \texttt{xL}: negative limit of the $x$ axis;
+ \item \texttt{xR}: positive limit of the $x$ axis;
+ \item \texttt{Co}: the ordered pair $(x_C,y_C)$ of the block of equations that show the focus and coordinates of the object and the image.
+\end{itemize}
+
+\begin{table}[!ht]
+ \centering
+ \captionbox{All mirror settings ready\label{tab:tab_configuracoes_espelhos}}[\linewidth]{
+ \input{input_tab_configuracoes_espelhos}
+ }
+\end{table}
+
+\subsection{Constituent commands}
+
+The command that calculates the position $p^{\prime}$ and the height $i$ of the image is:
+\begin{itemize}
+ \item \verb|\mirrorMath{f}{p}{o}{epsilon}{yM}|.
+\end{itemize}
+
+The following commands draw the main components of the diagram,
+\begin{itemize}
+ \item mirror drawing: \verb|\mirrorBase{f}{yM}{xL}{xR}|;
+ \item notable points drawing: \verb|\mirrorPts{v}{f}{c}}|;
+ \item notable rays drawing: \verb|\mirrorRays{p}{pp}{o}{i}|.
+\end{itemize}
+
+The following commands are the same for mirrors and lenses, and are responsible for,
+\begin{itemize}
+ \item object and image drawing item: \verb|\mirrorLensObjIma{p}{pp}{o}{i}|;
+ \item description of numerical coordinate values: \verb|\mirrorLensCoord{p}{pp}{o}{i}{f}{Co}|.
+\end{itemize}
+
+\subsection{Examples of each possible mirror case}
+
+\subsubsection{Concave}
+
+Figures from \ref{fig:conc01} to \ref{fig:conc05} present the 5 possible cases of positioning an object in front of a concave mirror.
+
+% \autoref{fig:conc02} ... \autoref{fig:conc03} ... \autoref{fig:conc04} ... \autoref{fig:conc05} ...
+
+\begin{figure}[!ht]
+ \centering
+ {\scriptsize \verb|\mirrorSphGaussFixedCoord{2}{4.5}{2.5}{0.4}{3}{1.5}{4}{(4,-1)}|}
+ \captionbox{Case 1, object far from the mirror, beyond the center of curvature\label{fig:conc01}}[\linewidth]{
+ \adjustbox{height=4cm}{\mirrorSphGaussFixedCoord{2}{4.5}{2}{0.4}{3}{1.5}{4}{(4.8,1)}
+ }
+ }
+\end{figure}
+
+\begin{figure}[!ht]
+ \centering
+ {\scriptsize \verb|\mirrorSphGaussFixedCoord{2}{4}{2}{0.4}{3}{1.5}{4}{(4.5,1)}|}
+ \captionbox{Case 2, object located on the center of curvature\label{fig:conc02}}[\linewidth]{
+ \adjustbox{height=4cm}{\mirrorSphGaussFixedCoord{2}{4}{2}{0.4}{3}{1.5}{4}{(4.5,1)}}
+ }
+\end{figure}
+
+\begin{figure}[!ht]
+ \centering
+ {\scriptsize \verb|\mirrorSphGaussFixedCoord{2}{3.6}{2}{0.4}{3}{1.5}{4}{(4,1)}|}
+ \captionbox{Case 3, object located between the center of curvature and the focus of the mirror\label{fig:conc03}}[\linewidth]{
+ \adjustbox{height=4cm}{\mirrorSphGaussFixedCoord{2}{3.6}{2}{0.4}{3}{1.5}{4}{(4,1)}}
+ }
+\end{figure}
+
+\begin{figure}[!ht]
+ \centering
+ {\scriptsize \verb|\mirrorSphGaussFixedCoord{2}{2}{2}{0.4}{3}{1.5}{4}{(2.5,1)}|}
+ \captionbox{Case 4, object located on the focus of the mirror (or less than a distance $\varepsilon \to 0$)\label{fig:conc04}}[\linewidth]{
+ \adjustbox{height=4cm}{\mirrorSphGaussFixedCoord{2}{2}{2}{0.4}{3}{1.5}{4}{(2.5,1)}}
+ }
+\end{figure}
+
+\begin{figure}[!ht]
+ \centering
+ {\scriptsize \verb|\mirrorSphGaussFixedCoord{2}{0.45}{1.5}{0.4}{2.5}{1}{4}{(2,-1)}|}
+ \captionbox{Case 5, object located between focus and mirror vertex\label{fig:conc05}}[\linewidth]{
+ \adjustbox{height=4cm}{\mirrorSphGaussFixedCoord{2}{0.45}{1.5}{0.4}{2.5}{1}{4}{(2,-1)}}
+ }
+\end{figure}
+
+\subsubsection{Convex}
+
+\autoref{fig:covx} presents two different positions of the single case of positioning an object in front of a convex mirror.
+
+\begin{figure}[!ht]
+ \centering
+ \begin{minipage}[c]{0.45\linewidth}
+ \centering{\tiny \verb|\mirrorSphGaussFixedCoord{-2}{1.5}{1.5}{0.4}{2}{-3}{2}{(2,-1)}|}
+ \end{minipage} %
+ \begin{minipage}[c]{0.45\linewidth}
+ \centering{\tiny \verb|\mirrorSphGaussFixedCoord{-2}{4}{1.5}{0.4}{2}{-3}{4.2}{(2,-1)}|}
+ \end{minipage}
+ \captionbox{Single case, object located in front of the mirror, at any distance from it\label{fig:covx}}[\linewidth]{
+ \subcaptionbox{Object close to vertex}{
+ \adjustbox{width=0.45\linewidth}{\mirrorSphGaussFixedCoord{-2}{1.5}{1.5}{0.4}{2.5}{-3}{2}{(2,-1)}}
+ }\hfill
+ \subcaptionbox{Object far from vertex}{
+ \adjustbox{width=0.45\linewidth}{\mirrorSphGaussFixedCoord{-2}{4}{1.5}{0.4}{2.5}{-3}{4.2}{(2,-1)}}
+ }
+ }
+\end{figure}
+
+% Exercício: Prova que toda a imagem no espelho convexo está entre o vértice $V$ e o foco $f$. Ou seja, é impossível que $p^{\prime}$ seja menor que $f$ e maior que $V$.
+
+% Exercício: Prova que toda a imagem no espelho convexo é menor que a altura do objeto.
+
+\subsection{Animation}
+
+\subsubsection{Concave}
+
+\autoref{fig:anim_mirror_conc} presents an animation containing the movement of an object close to a concave mirror.
+
+\begin{figure}[ht]
+ \centering
+ \captionbox{Animation of object approaching a concave mirror\label{fig:anim_mirror_conc}}[\linewidth]{
+ \adjustbox{height=6cm}{
+ \begin{animateinline}[poster=first, controls, palindrome, bb=-5 -5 50 50]{10}
+ \multiframe{100}{rx=0.5+0.05}{
+ \mirrorSphGaussFixed[50]{2}{6-\rx}{2}{0.4}{11}{-8.5}{12}
+ }
+ \end{animateinline}
+ }
+ }
+\end{figure}
+
+\subsubsection{Convex}
+
+\autoref{fig:anim_mirror_covx} presents an animation containing the movement of an object close to a convex mirror.
+
+\begin{figure}[ht]
+ \centering
+ \captionbox{Animation of object approaching a convex mirror\label{fig:anim_mirror_covx}}[\linewidth]{
+ \adjustbox{height=6cm}{
+ \begin{animateinline}[poster=first, controls, palindrome, bb=-5 -5 50 50]{10}
+ \multiframe{100}{rx=0.5+0.05}{
+ \mirrorSphGaussFixed[50]{-2}{6-\rx}{2}{0.4}{2.5}{-4.5}{6}
+ }
+ \end{animateinline}
+ }
+ }
+\end{figure}
+
+\section{Gaussian spherical lens model}
+
+\subsection{Modeling}
+
+\autoref{fig:def_coordenadas_lente} presents the definition of the lens coordinate system in two cases, the one with the object on the positive side in \autoref{subfig:def_coordenadas_lente-a} and with the object on the negative side \autoref{subfig:def_coordenadas_lente-b}.
+
+\begin{figure}[!ht]
+ \centering
+ \captionbox{Sign convention for spherical lenses\label{fig:def_coordenadas_lente}}[\linewidth]{
+ \subcaptionbox[0.4\linewidth]{Object in right reference\label{subfig:def_coordenadas_lente-a}}{
+ \adjustbox{width=0.45\linewidth}{
+ \begin{tikzpicture}[
+ extended line/.style={shorten >=-#1,shorten <=-#1},
+ extended line/.default=1cm]
+ \lensBase{2}{2}{-4.5}{6}
+ \lensPts{0}{2}{4}
+ \mirrorLensObjIma{6}{-3}{1.5}{-0.75}
+ \draw[red] (0,0) node[above left] {(0,0)};
+ \draw[-latex] (0,-1) -- ++(6,0) node[midway, above]{$p > 0$};
+ \draw[thin] (6,-1.2) -- ++(0,1);
+ \draw[-latex] (0,-1.5) -- ++(-3,0) node[midway, above]{$p^{\prime} < 0$};
+ \draw[thin] (-3,-1.5) -- ++(0,0.7);
+ \begin{scope}[purple]
+ \draw (6,0) node[below right] {$x+$};
+ \draw (0,1.5) node[right] {$y+$};
+ \draw (-4,0) node[above left] {$x-$};
+ \draw (0,-1.5) node[right] {$y-$};
+ \end{scope}
+ \end{tikzpicture}
+ }
+ }\hfill
+ \subcaptionbox[0.4\linewidth]{Object in left reference\label{subfig:def_coordenadas_lente-b}}{
+ \adjustbox{width=0.45\linewidth}{
+ \begin{tikzpicture}[
+ extended line/.style={shorten >=-#1,shorten <=-#1},
+ extended line/.default=1cm]
+ \lensBase{2}{2}{-6}{4.5}
+ \lensPts{0}{-2}{-4}
+ \mirrorLensObjIma{-6}{3}{1.5}{-0.75}
+ \draw[red] (0,0) node[above left] {(0,0)};
+ \draw[-latex] (0,-1.4) -- ++(3,0) node[midway, above]{$p^{\prime} > 0$};
+ \draw[thin] (3,-1.6) -- ++(0,0.8);
+ \draw[-latex] (0,-1) -- ++(-6,0) node[midway, above]{$p < 0$};
+ \draw[thin] (-6,-1.2) -- ++(0,1);
+ \begin{scope}[purple]
+ \draw (4.5,0) node[above] {$x+$};
+ \draw (0,1.5) node[right] {$y+$};
+ \draw (-6.5,0) node[above] {$x-$};
+ \draw (0,-1.5) node[left] {$y-$};
+ \end{scope}
+ \end{tikzpicture}
+ }
+ }
+ }
+\end{figure}
+
+Lens type definitions are made based on the focus signal:
+\begin{equation}
+ \begin{split}
+ f > 0: & \quad \textrm{convergent}, \\
+ f < 0: & \quad \textrm{divergent}.
+ \end{split}
+\end{equation}
+
+\subsubsection{Object on the right}
+
+For the object on the right, the easiest way to correct the model from a spherical mirror to a spherical lens is to change the sign of $p^{\prime}$.
+
+The equations for the position $p^{\prime}$ and the height $i$ of the image from the focus $f$ of the mirror, and the position $p$ and height $o$ of the object are:
+\begin{equation}
+ \begin{split}
+ \dfrac{1}{f} & = \dfrac{1}{p} - \dfrac{1}{p^{\prime}} \Rightarrow p^{\prime} = \dfrac{f p}{f - p}, \quad p \neq f, \\
+ i & = \dfrac{p^{\prime}}{p} o.
+ \end{split}
+\end{equation}
+
+\subsubsection{Objeto à esquerda}
+
+Para o objeto à esquerda, a expressão de $p^{\prime}$ e $i$ são dadas por:
+\begin{equation}
+ \begin{split}
+ \dfrac{1}{p^{\prime}} & = \dfrac{1}{p} + \dfrac{1}{f} \Rightarrow p^{\prime} = \dfrac{f p}{f + p}, \quad p \neq -f, \\
+ i & = \dfrac{p^{\prime}}{p} o.
+ \end{split}
+\end{equation}
+
+\subsection{Ready lens settings}
+
+The \autoref{tab:tab_configuracoes_lentes} presents all the ready-made lens configurations provided by the package.
+
+\begin{table}[ht]
+ \centering
+ \captionbox{All lens settings ready\label{tab:tab_configuracoes_lentes}}[\linewidth]{
+ \input{input_tab_configuracoes_lentes}
+ }
+\end{table}
+
+\subsection{Ready lens settings -- left}
+
+The \autoref{tab:tab_configuracoes_lentesL} presents all the ready-made lens settings provided by the package.
+
+\begin{table}[ht]
+ \centering
+ \captionbox{All lens settings ready with object on left\label{tab:tab_configuracoes_lentesL}}[\linewidth]{
+ \input{input_tab_configuracoes_lentesL}
+ }
+\end{table}
+
+\subsection{Constituent commands}
+
+The command that calculates the position $p^{\prime}$ and height $i$ of the image with object on the right is:
+\begin{itemize}
+ \item \verb|\lensMath{f}{p}{o}{epsilon}{yM}|.
+\end{itemize}
+
+In turn, the command that calculates the coordinates of the image with the object on the left is:
+\begin{itemize}
+ \item \verb|\lensMathL{f}{p}{o}{epsilon}{yM}|,
+\end{itemize}
+nonetheless, the change in the nomenclature of the commands that draw the lenses is just the addition of the letter $L$ after the word \enquote{Gauss}.
+
+The following commands draw the main components of the diagram,
+\begin{itemize}
+ \item lens design: \verb|\lensBase{f}{yM}{xL}{xR}|;
+ \item notable points drawing: \verb|\lensPts{v}{f}{a}|;
+ \item notable ray drawing: \verb|\lensRays{p}{pp}{o}{i}|.
+\end{itemize}
+
+\subsection{Examples of each possible lens case}
+
+\subsubsection{Convergent}
+
+Figures from \ref{fig:conv01} to \ref{fig:conv05} present the 5 possible cases of positioning an object in front of a converging lens.
+
+% \autoref{fig:conv02} ... \autoref{fig:conv03} ... \autoref{fig:conv04} ... \autoref{fig:conv05} ...
+
+\begin{figure}[!ht]
+ \centering
+ {\scriptsize \verb|\lensSphGaussFixedCoord{2}{5}{1.5}{0.4}{2}{-4}{4}{(2,-1.5)}|}
+ \captionbox{Case 1, object far from mirror, beyond center of curvature\label{fig:conv01}}[\linewidth]{
+ \adjustbox{height=3cm}{\lensSphGaussFixedCoord{2}{5}{1.5}{0.4}{2}{-4}{4}{(2,-1.5)}}
+ }
+\end{figure}
+
+\begin{figure}[!ht]
+ \centering
+ {\scriptsize \verb|\lensSphGaussFixedCoord{2}{4}{1.5}{0.4}{2}{-4}{4}{(2,-1.5)}|}
+ \captionbox{Case 2, object over anti-main object\label{fig:conv02}}[\linewidth]{
+ \adjustbox{height=3cm}{\lensSphGaussFixedCoord{2}{4}{1.5}{0.4}{2}{-4}{4}{(2,-1.5)}}
+ }
+\end{figure}
+
+\begin{figure}[!ht]
+ \centering
+ {\scriptsize \verb|\lensSphGaussFixedCoord{2}{3.5}{1.5}{0.4}{2.5}{-4}{4}{(2,-1.5)}|}
+ \captionbox{Case 3, object between anti-main object and focus object\label{fig:conv03}}[\linewidth]{
+ \adjustbox{height=3cm}{\lensSphGaussFixedCoord{2}{3.5}{1.5}{0.4}{2.5}{-4}{4}{(2,-1.5)}}
+ }
+\end{figure}
+
+\begin{figure}[!ht]
+ \centering
+ {\scriptsize \verb|\lensSphGaussFixedCoord{2}{2}{1.5}{0.4}{2}{-5}{5}{(2,-1)}|}
+ \captionbox{Case 4, object over object focus (or less than a distance $\varepsilon \to 0$)\label{fig:conv04}}[\linewidth]{
+ \adjustbox{height=3cm}{\lensSphGaussFixedCoord{2}{2}{1.5}{0.4}{2}{-5}{5}{(2,-1)}}
+ }
+\end{figure}
+
+\begin{figure}[!ht]
+ \centering
+ {\scriptsize \verb|\lensSphGaussFixedCoord{2}{1.2}{1}{0.4}{3}{-4}{4}{(1.5,-1.5)}|}
+ \captionbox{Case 5, object between focus object and optical center of lens\label{fig:conv05}}[\linewidth]{
+ \adjustbox{height=3cm}{\lensSphGaussFixedCoord{2}{1.2}{1}{0.4}{3}{-4}{4}{(1.5,-1.5)}}
+ }
+\end{figure}
+
+\subsubsection{Divergent}
+
+\autoref{fig:dive} presents two different positions of the single case of positioning an object in front of a diverging lens.
+
+\begin{figure}[!ht]
+ \centering
+ \begin{minipage}[c]{0.45\linewidth}
+ \centering{\tiny \verb|\lensSphGaussFixed[50]{-2}{2}{2}{0.4}{2.5}{-4}{4}|}
+ \end{minipage} %
+ \begin{minipage}[c]{0.45\linewidth}
+ \centering{\tiny \verb|\lensSphGaussFixed[50]{-2}{4}{2}{0.4}{2.5}{-4}{4}|}
+ \end{minipage}
+ \captionbox{Single case, object located in front of the lens, at any distance from it\label{fig:dive}}[\linewidth]{
+ \subcaptionbox{Between focus and vertex}{
+ \adjustbox{height=3cm}{\lensSphGaussFixed[50]{-2}{2}{1.5}{0.4}{2.5}{-3}{3}}
+ }\quad\quad\quad
+ \subcaptionbox{Beyond the center of curvature}{
+ \adjustbox{height=3cm}{\lensSphGaussFixed[50]{-2}{4}{1.5}{0.4}{2.5}{-3}{3}}
+ }
+ }
+\end{figure}
+
+\subsection{Equivalence between commands for lenses with objects on the right and on the left}
+
+\autoref{fig:equiv_conv} presents the equivalence between the commands that calculate and draw the image using converging lenses depending on the location of the object.
+
+\begin{figure}[!ht]
+ \centering
+ \begin{minipage}[c]{0.45\linewidth}
+ \centering{\tiny \verb|\lensSphGaussFixedCoord{2}{6}{1.5}{0.4}{2}{-4.2}{4.2}{(2,-1.5)}|}
+ \end{minipage} %
+ \begin{minipage}[c]{0.45\linewidth}
+ \centering{\tiny \verb|\lensSphGaussLFixedCoord{2}{-6}{1.5}{0.4}{2}{-4.2}{4.2}{(-4,-1.5)}|}
+ \end{minipage}
+ \captionbox{Equivalence between commands for converging lenses\label{fig:equiv_conv}}[\linewidth]{
+ \subcaptionbox{Command for object on the right}{
+ \adjustbox{height=2.8cm}{\lensSphGaussFixedCoord{2}{6}{1.2}{0.4}{2}{-3}{4.2}{(2,-1.5)}}
+ }\hfill
+ \subcaptionbox{Command for object on the left}{
+ \adjustbox{height=2.8cm}{\lensSphGaussLFixedCoord{2}{-6}{1.2}{0.4}{2}{-4.2}{3}{(-5,-1.5)}}
+ }
+ }
+\end{figure}
+
+\autoref{fig:equiv_dive} presents the equivalence between the commands that calculate and draw the image using diverging lenses depending on the location of the object.
+
+\begin{figure}[!ht]
+ \centering
+ \begin{minipage}[c]{0.45\linewidth}
+ \centering{\tiny \verb|\lensSphGaussFixedCoord{2}{6}{1.5}{0.4}{2}{-4.2}{4.2}{(2,-1.5)}|}
+ \end{minipage}%
+ \begin{minipage}[c]{0.45\linewidth}
+ \centering{\tiny \verb|\lensSphGaussLFixedCoord{2}{-6}{1.5}{0.4}{2}{-4.2}{4.2}{(-4,-1.5)}|}
+ \end{minipage}
+ \captionbox{Equivalence between commands for diverging lenses\label{fig:equiv_dive}}[\linewidth]{
+ \subcaptionbox{Command for object on the right}{
+ \adjustbox{height=2.8cm}{\lensSphGaussFixedCoord{-2}{4}{1.2}{0.4}{2}{-2.5}{2.5}{(1,-1.5)}}
+ }\hfill
+ \subcaptionbox{Command for object on the left}{
+ \adjustbox{height=2.8cm}{\lensSphGaussLFixedCoord{-2}{-4}{1.2}{0.4}{2}{-2.5}{2.5}{(-5,-1.5)}}
+ }
+ }
+\end{figure}
+
+\subsection{Animation}
+
+\subsubsection{Convergent}
+
+\autoref{fig:anim_len_conv} presents an animation containing the movement of an object close to a converging lens.
+
+\begin{figure}[!ht]
+ \centering
+ \captionbox{Animation of object approaching a converging lens\label{fig:anim_len_conv}}[\linewidth]{
+ \adjustbox{width=0.6\linewidth}{
+ \begin{animateinline}[poster=first, controls, palindrome, bb=-5 -5 50 50]{10}
+ \multiframe{100}{rx=0.5+0.05}{
+ \lensSphGaussFixed[50]{2}{6-\rx}{2}{0.4}{11}{-12.5}{8.5}
+ }
+ \end{animateinline}
+ }
+ }
+\end{figure}
+
+\subsubsection{Divergent}
+
+\autoref{fig:anim_len_dive} presents an animation containing the movement of an object close to a diverging lens.
+
+\begin{figure}[!ht]
+ \centering
+ \captionbox{Animation of object approaching a diverging lens\label{fig:anim_len_dive}}[\linewidth]{
+ \adjustbox{width=0.6\linewidth}{
+ \begin{animateinline}[poster=first, controls, palindrome, bb=-5 -5 50 50]{10}
+ \multiframe{100}{rx=0.5+0.05}{
+ \lensSphGaussFixed[50]{-2}{6-\rx}{2}{0.4}{2.5}{-4.5}{6}
+ }
+ \end{animateinline}
+ }
+ }
+\end{figure}
+
+\section{Other interesting packages}
+
+Below are interesting \textit{links} to other packages with optics implementations, as well as sources for the equations and modeling used.
+
+\begin{FHZmirroLensTcolorbox}
+ \begin{enumerate}
+ \item \href{https://tex.stackexchange.com/q/33460/140133}{\textbf{TeX StackExchange} -- TikZ library for optics?}
+ \item \href{https://tex.stackexchange.com/q/623201/140133}{\textbf{TeX StackExchange} -- Geometrical optics}
+ \item \href{https://ctan.org/pkg/tikz-optics}{{\textbf{CTAN}} -- tikz-optics}
+ \item \href{https://ctan.org/pkg/pst-mirror}{\textbf{CTAN} -- pst-mirror}
+ \item \href{https://ctan.org/pkg/simpleoptics}{\textbf{CTAN} -- simpleoptics}
+
+ \item \href{https://youtu.be/efPZ5uSDeuI}{{\YouTube} -- The Organic Chemistry Tutor -- Spherical Mirrors \& The Mirror Equation - Geometric Optics}
+ \item \href{http://hyperphysics.phy-astr.gsu.edu/hbase/geoopt/mireq.html}{hyperphysics -- Spherical Mirror Equation}
+
+ \item \href{http://hyperphysics.phy-astr.gsu.edu/hbase/geoopt/lenseq.html}{hyperphysics -- lenseq}
+ \item \href{https://www.plymouth.ac.uk/uploads/production/document/path/3/3754/PlymouthUniversity_MathsandStats_outreach_lenses.pdf}{plymouth -- lenses}
+ \item \href{https://www.khanacademy.org/science/in-in-class10th-physics/in-in-10th-physics-light-reflection-refraction/in-in-lens-formula-magnification/v/lens-formula}{khanacademy -- lens formula}
+ \end{enumerate}
+\end{FHZmirroLensTcolorbox}
+
+\section{History and versions}
+
+\begin{FHZmirroLensTcolorbox}
+ \begin{enumerate}[leftmargin=3.5cm]
+ \item[1.0.0 (2022-12-24):] Package creation.
+ \end{enumerate}
+\end{FHZmirroLensTcolorbox}
+
+\end{document} \ No newline at end of file
diff --git a/graphics/pgf/contrib/tikz-mirror-lens/tex/tikz-mirror-lens.cwl b/graphics/pgf/contrib/tikz-mirror-lens/tex/tikz-mirror-lens.cwl
new file mode 100644
index 0000000000..7aa1a6831c
--- /dev/null
+++ b/graphics/pgf/contrib/tikz-mirror-lens/tex/tikz-mirror-lens.cwl
@@ -0,0 +1,34 @@
+
+% ======================
+% Developed by FHZ -- Brasil
+% ======================
+#include:tikz
+
+% =======================================================
+% Summary of commands
+% -- Mirrors
+\mirrorSphGauss[arrows]{f}{p}{o}{epsilon}#n
+\mirrorSphGaussCoord[arrows]{f}{p}{o}{epsilon}#n
+\mirrorSphGaussFixed[arrows]{f}{p}{o}{epsilon}{yM}{xL}{xR}#n
+\mirrorSphGaussFixedCoord[arrows]{f}{p}{o}{epsilon}{yM}{xL}{xR}{Co}#n
+% -- Lens
+\lensSphGauss[arrows]{f}{p}{o}{epsilon}#n
+\lensSphGaussCoord[arrows]{f}{p}{o}{epsilon}#n
+\lensSphGaussFixed[arrows]{f}{p}{o}{epsilon}{yM}{xL}{xR}#n
+\lensSphGaussFixedCoord[arrows]{f}{p}{o}{epsilon}{yM}{xL}{xR}{Co}#n
+% =======================================================
+\mirrorLensObjIma{p}{pp}{o}{i}#n
+\mirrorLensCoord{p}{pp}{o}{i}{f}{Co}#n
+% =======================================================
+\mirrorBase{f}{yM}{minXaxis}{maxXaxis}#n
+\mirrorPts{v}{f}{c}#n
+\mirrorRays{p}{pp}{o}{i}#n
+% =======================================================
+\lensBase{f}{yM}{minXaxis}{maxXaxis}#n
+\lensPts{v}{f}{c}#n
+\lensRays{p}{pp}{o}{i}#n
+% =======================================================
+\mirrorMath{f}{p}{o}{epsilon}{yM}#n
+\lensMath{f}{p}{o}{epsilon}{yM}#n
+\lensMathL{f}{p}{o}{epsilon}{yM}#n
+% =======================================================
diff --git a/graphics/pgf/contrib/tikz-mirror-lens/tex/tikz-mirror-lens.sty b/graphics/pgf/contrib/tikz-mirror-lens/tex/tikz-mirror-lens.sty
new file mode 100644
index 0000000000..cac1f21c2d
--- /dev/null
+++ b/graphics/pgf/contrib/tikz-mirror-lens/tex/tikz-mirror-lens.sty
@@ -0,0 +1,524 @@
+% !TeX spellcheck = en_US
+% !TeX encoding = UTF-8
+% =============================
+
+\NeedsTeXFormat{LaTeX2e}[1994/06/01]
+\ProvidesPackage{tikz-mirror-lens}[2022-12-25 Custom Package for drawing spherical mirrors and lens -- FHZ -- Version 1.0.0]
+
+\RequirePackage{tikz}
+\usetikzlibrary{calc}
+\usetikzlibrary{math}
+\usetikzlibrary{decorations}
+\usetikzlibrary{decorations.markings}
+
+% =======================================================
+% Variables
+% f: focus of the mirror or lens
+% p: position along x axis of the object
+% pp: position along x axis of the object
+% o: object height
+% i: image height
+% ymirror: mirror height
+% epsilon: absolute distance between p and f
+% yM: height of the mirror
+% xL: Left extension of X axis
+% xR: Right extension of X axis
+% (x_C,y_C): Coordinates of the localization of displayed data
+% arrows: optional argument to change arrows density
+% =======================================================
+
+
+% =======================================================
+% Summary of main commands
+% -- Mirrors
+%\mirrorSphGauss[arrows]{f}{p}{o}{epsilon}
+%\mirrorSphGaussCoord[arrows]{f}{p}{o}{epsilon}
+%\mirrorSphGaussFixed[arrows]{f}{p}{o}{epsilon}{yM}{xL}{xR}
+%\mirrorSphGaussFixedCoord[arrows]{f}{p}{o}{epsilon}{yM}{xL}{xR}{(x_C,y_C)}
+% -- Lens
+%\lensSphGauss[arrows]{f}{p}{o}{epsilon}
+%\lensSphGaussCoord[arrows]{f}{p}{o}{epsilon}
+%\lensSphGaussFixed[arrows]{f}{p}{o}{epsilon}{yM}{xL}{xR}
+%\lensSphGaussFixedCoord[arrows]{f}{p}{o}{epsilon}{yM}{xL}{xR}{(x_C,y_C)}
+% =======================================================
+
+% =======================================================
+% Mirrors and Lens -- Math
+% =======================================================
+% Summary of commands
+% \mirrorMath{f}{p}{o}{epsilon}{ymirror}
+% \lensMath{f}{p}{o}{epsilon}{ymirror}
+% \lensMathL{f}{p}{o}{epsilon}{ymirror}
+
+% =======================================================
+\newcommand{\mirrorMath}[5]{
+ % Define mirror and object
+ \tikzmath{\f = #1; \v = 0; \c = 2*\f;}
+ \tikzmath{\p = #2; \o = #3;}
+ % Calculate image
+ \tikzmath{
+ if (abs(\p - \f) >= #4) then {
+ \pp = \p*\f/(\p-\f);
+ \i = -(\pp/\p)*\o;
+ } else {
+ \pp = 0;
+ \i = 0;
+ };
+ };
+ % Mirror size, math as parameter
+ \tikzmath{\ymirror = #5;};
+}
+\newcommand{\lensMath}[5]{
+ % f > 0 convergente, f < 0 divergente
+ % Define lens and object
+ \tikzmath{\f = #1; \v = 0; \a = 2*\f;}
+ \tikzmath{\p = #2; \o = #3;}
+ % Calculate image
+ \tikzmath{
+ if (abs(\p - \f) >= #4) then {
+ \pp = \p*(\f)/(\f-(\p));
+ \i = (\pp/\p)*\o;
+ } else {
+ \pp = 0;
+ \i = 0;
+ };
+ };
+ % Lens size, math as parameter
+ \tikzmath{\ymirror = #5;};
+}
+\newcommand{\lensMathL}[5]{
+ % f > 0 convergente, f < 0 divergente
+ % Define lens and object
+ \tikzmath{\f = #1; \v = 0; \a = 2*\f;}
+ \tikzmath{\p = #2; \o = #3;}
+ % Calculate image
+ \tikzmath{
+ if (abs(\p + \f) >= #4) then {
+ \pp = \p*\f/(\p+\f);
+ \i = (\pp/\p)*\o;
+ } else {
+ \pp = 0;
+ \i = 0;
+ };
+ };
+ % Lens size, math as parameter
+ \tikzmath{\ymirror = #5;};
+}
+% *******************************************************
+
+% =======================================================
+% Mirrors and Lens -- base
+% =======================================================
+% Summary of commands
+% \mirrorLensObjIma{p}{pp}{o}{i}
+% \mirrorLensCoord{p}{pp}{o}{i}{f}{x}
+% =======================================================
+\newcommand{\mirrorLensObjIma}[4]{
+ \begin{scope}[-stealth]
+ \draw[green!50!black] (#1,0) node[above right]{$p$} -- ++(0,#3) node[above left]{$o$} coordinate(O);
+ \tikzmath{
+ if (#2 != 0) then {
+ {
+ \draw[green] (#2,0) node[below left]{$p^{\prime}$} -- ++(0,#4) node[below left]{$i$};
+ };
+ };
+ };
+ \end{scope}
+}
+\newcommand{\mirrorLensCoord}[6]{
+ \begin{scope}
+ \node[right] at #6 {
+ $\begin{aligned}
+ f & = #5 \\
+ (p,o) & = (#1,#3) \\
+ (p^{\prime},i) & = (#2,#4)
+ \end{aligned}$
+ };
+ \end{scope}
+}
+% *******************************************************
+
+% =======================================================
+% Mirrors -- base
+% =======================================================
+% Summary of commands
+% \mirrorBase{f}{ymirror}{minEixoX}{maxEixoX}
+% \mirrorPts{v}{f}{c}
+% \mirrorRays{p}{pp}{o}{i}
+% =======================================================
+\newcommand{\mirrorBase}[4]{
+ \begin{scope}
+ \draw[dashed, extended line=15pt] (#3,0) -- (#4,0);
+ \foreach \ys in {1,-1}{
+ \begin{scope}[yscale=\ys]
+ \draw[blue] (0,0) -- ++(0,#2) arc (0:-sign(#1)*90:{-sign(#1)*0.5});
+ \foreach \x/\y in {0/0.05,0.05/0.20,0.15/0.35,0.45/0.5}{
+ \draw[blue] ({sign(#1)*\x},#2+\y) -- ++({-0.5},0);
+ }
+ \end{scope}
+ }
+ \end{scope}
+}
+\newcommand{\mirrorPts}[3]{
+ \begin{scope}[red]
+ \fill (#1,0) coordinate(V) circle(0.05) node[below left]{$V$};
+ \fill (#2,0) coordinate(F) circle(0.05) node[below]{$f$};
+ \fill (#3,0) coordinate(C) circle(0.05) node[below]{$c$};
+ \end{scope}
+}
+\newcommand{\mirrorRays}[4]{
+ \begin{scope}[thick,extended line=25pt]
+ \tikzmath{
+ if (#2 != 0) then {
+ {
+ \draw[arrDec={#1},cyan] (#1,#3) -- (0,#3) -- (F) -- (#2,#4);
+ \draw[arrDec={#1-10},magenta] (O) -- (F) -- (0,#4) -- (#2,#4);
+ \draw[arrDec={#1-10},violet,dotted] (O) -- (V) -- (#2,#4);
+ };
+ } else {
+ {
+ \draw[arrDec={#1},cyan] (#1,#3) -- (0,#3) -- (F);
+ \draw[arrDec={#1-10},violet,dotted] (O) -- (V) -- (#1,-#3);
+ };
+ };
+ };
+ \end{scope}
+}
+% *******************************************************
+
+% =======================================================
+% Lens - Base
+% =======================================================
+% Summary of commands
+% \lensBase{f}{ymirror}{minEixoX}{maxEixoX}
+% \lensPts{v}{f}{a}
+% \lensRays{p}{pp}{o}{i}
+% =======================================================
+\newcommand{\lensBase}[4]{
+ \begin{scope}
+ \draw[dashed, extended line=15pt] (#3,0) -- (#4,0);
+ \foreach \ys in {1,-1}{
+ \begin{scope}[yscale=\ys]
+ \draw[blue] (0,0) -- ++(0,#2);% arc (0:-sign(\f)*90:{-sign(\f)*0.5});
+ \draw[blue, fill=white] (0,#2) -- ++(0.25,0) -- ++(-0.25,{sign(#1)*0.25}) -- ++(-0.25,{-sign(#1)*0.25}) -- cycle;
+ \end{scope}
+ }
+ \end{scope}
+}
+\newcommand{\lensPts}[3]{
+ \begin{scope}[red]
+ \fill (#1,0) coordinate(V) circle(0.05) node[below left]{$V$};
+ \fill (#2,0) coordinate(F) circle(0.05) node[below]{$f_o$};
+ \fill (#3,0) coordinate(C) circle(0.05) node[below]{$A_0$};
+ \fill (-#2,0) coordinate(Fi) circle(0.05) node[below]{$f_i$};
+ \fill (-#3,0) coordinate(Ci) circle(0.05) node[below]{$A_i$};
+ \end{scope}
+}
+\newcommand{\lensRays}[4]{
+ \begin{scope}[thick,extended line=25pt]
+ \tikzmath{
+ if (\pp != 0) then {
+ {
+ \draw[arrDec={#1},cyan] (\p,\o) -- (0,\o) -- (Fi) -- (\pp,\i);
+ \draw[arrDec={#1-10},magenta] (O) -- (F) -- (0,\i) -- (\pp,\i);
+ \draw[arrDec={#1-10},violet,dotted] (O) -- (V) -- (\pp,\i);
+ };
+ } else {
+ {
+ \draw[arrDec={#1},cyan] (\p,\o) -- (0,\o) -- (Fi);
+ \draw[arrDec={#1-10},violet,dotted] (O) -- (V) -- (-\p,-\o);
+ };
+ };
+ };
+ \end{scope}
+}
+% *******************************************************
+
+% =======================================================
+% Mirrors
+% =======================================================
+\newcommand{\mirrorSphGauss}[5][60]{
+ \begin{tikzpicture}[very thick,
+ arrDec/.style={
+ decoration={
+ markings,
+ mark= between positions 0.1 and 0.99 step #1pt with {\arrow{latex}}
+ },
+ postaction={decorate},
+ },
+ arrDec/.default=20,
+ extended line/.style={shorten >=-#1,shorten <=-#1},
+ extended line/.default=1cm
+ ]
+ % Math
+ \mirrorMath{#2}{#3}{#4}{#5}{max(abs(\o),abs(\i)) + 0.5}
+ % Mirror, Notable points, Object and image, Notable Rays, Coordinates
+ \mirrorBase{\f}{\ymirror}{{min(\v,\pp,\c)}}{{max(\c+0.5,\p,\pp)}}
+ \mirrorPts{\v}{\f}{\c}
+ \mirrorLensObjIma{\p}{\pp}{\o}{\i}
+ \mirrorRays{\p}{\pp}{\o}{\i}
+ \end{tikzpicture}
+}
+\newcommand{\mirrorSphGaussCoord}[5][60]{
+ \begin{tikzpicture}[very thick,
+ arrDec/.style={
+ decoration={
+ markings,
+ mark= between positions 0.1 and 0.99 step #1pt with {\arrow{latex}}
+ },
+ postaction={decorate},
+ },
+ arrDec/.default=20,
+ extended line/.style={shorten >=-#1,shorten <=-#1},
+ extended line/.default=1cm
+ ]
+ % Math
+ \mirrorMath{#2}{#3}{#4}{#5}{max(abs(\o),abs(\i)) + 0.5}
+ % Mirror, Notable points, Object and image, Notable Rays, Coordinates
+ \mirrorBase{\f}{\ymirror}{{min(\v,\pp,\c)}}{{max(\c+0.5,\p,\pp)}}
+ \mirrorPts{\v}{\f}{\c}
+ \mirrorLensObjIma{\p}{\pp}{\o}{\i}
+ \mirrorRays{\p}{\pp}{\o}{\i}
+ \mirrorLensCoord{\p}{\pp}{\o}{\i}{\f}{({max(\c+0.5,\p,\pp)+1},-1)}
+ \end{tikzpicture}
+ }
+\newcommand{\mirrorSphGaussFixed}[8][60]{
+ \begin{tikzpicture}[very thick,
+ arrDec/.style={
+ decoration={
+ markings,
+ mark= between positions 0.1 and 0.99 step #1pt with {\arrow{latex}}
+ },
+ postaction={decorate},
+ },
+ arrDec/.default=20,
+ extended line/.style={shorten >=-#1,shorten <=-#1},
+ extended line/.default=1cm
+ ]
+ % Math
+ \mirrorMath{#2}{#3}{#4}{#5}{#6}
+ % Mirror, Notable points, Object and image, Notable Rays, Coordinates
+ \mirrorBase{\f}{\ymirror}{#7}{#8}
+ \mirrorPts{\v}{\f}{\c}
+ \mirrorLensObjIma{\p}{\pp}{\o}{\i}
+ \mirrorRays{\p}{\pp}{\o}{\i}
+ \end{tikzpicture}
+}
+\newcommand{\mirrorSphGaussFixedCoord}[9][60]{
+ \begin{tikzpicture}[very thick,
+ arrDec/.style={
+ decoration={
+ markings,
+ mark= between positions 0.1 and 0.99 step #1pt with {\arrow{latex}}
+ },
+ postaction={decorate},
+ },
+ arrDec/.default=20,
+ extended line/.style={shorten >=-#1,shorten <=-#1},
+ extended line/.default=1cm
+ ]
+ % Math
+ \mirrorMath{#2}{#3}{#4}{#5}{#6}
+ % Mirror, Notable points, Object and image, Notable Rays, Coordinates
+ \mirrorBase{\f}{\ymirror}{#7}{#8}
+ \mirrorPts{\v}{\f}{\c}
+ \mirrorLensObjIma{\p}{\pp}{\o}{\i}
+ \mirrorRays{\p}{\pp}{\o}{\i}
+ \mirrorLensCoord{\p}{\pp}{\o}{\i}{\f}{#9}
+ \end{tikzpicture}
+}
+% *******************************************************
+
+% =======================================================
+% Lens
+% =======================================================
+\newcommand{\lensSphGauss}[5][60]{
+ \begin{tikzpicture}[very thick,
+ arrDec/.style={
+ decoration={
+ markings,
+ mark= between positions 0.1 and 0.99 step #1pt with {\arrow{latex}}
+ },
+ postaction={decorate},
+ },
+ arrDec/.default=20,
+ extended line/.style={shorten >=-#1,shorten <=-#1},
+ extended line/.default=1cm
+ ]
+ % Math
+ \lensMath{#2}{#3}{#4}{#5}{max(abs(\o),abs(\i)) + 0.5}
+ % Lens, Notable points, Object and image, Notable Rays, Coordinates.
+ \lensBase{\f}{\ymirror}{{min(\v,\pp,\a)}}{{max(\a+0.5,\p,\pp)}}
+ \lensPts{\v}{\f}{\a}
+ \mirrorLensObjIma{\p}{\pp}{\o}{\i}
+ \lensRays{\p}{\pp}{\o}{\i}
+ %\mirrorLensCoord{\p}{\pp}{\o}{\i}{\f}{{max(\a+0.5,\p,\pp)}+1}
+ \end{tikzpicture}
+}
+\newcommand{\lensSphGaussCoord}[5][60]{
+ \begin{tikzpicture}[very thick,
+ arrDec/.style={
+ decoration={
+ markings,
+ mark= between positions 0.1 and 0.99 step #1pt with {\arrow{latex}}
+ },
+ postaction={decorate},
+ },
+ arrDec/.default=20,
+ extended line/.style={shorten >=-#1,shorten <=-#1},
+ extended line/.default=1cm
+ ]
+ % Math
+ \lensMath{#2}{#3}{#4}{#5}{max(abs(\o),abs(\i)) + 0.5}
+ % Lens, Notable points, Object and image, Notable Rays, Coordinates.
+ \lensBase{\f}{\ymirror}{{min(\v,\pp,\a)}}{{max(\a+0.5,\p,\pp)}}
+ \lensPts{\v}{\f}{\a}
+ \mirrorLensObjIma{\p}{\pp}{\o}{\i}
+ \lensRays{\p}{\pp}{\o}{\i}
+ \mirrorLensCoord{\p}{\pp}{\o}{\i}{\f}{({max(\a+0.5,\p,\pp)+1},-1)}
+ \end{tikzpicture}
+}
+\newcommand{\lensSphGaussFixed}[8][60]{
+ \begin{tikzpicture}[very thick,
+ arrDec/.style={
+ decoration={
+ markings,
+ mark= between positions 0.1 and 0.99 step #1pt with {\arrow{latex}}
+ },
+ postaction={decorate},
+ },
+ arrDec/.default=20,
+ extended line/.style={shorten >=-#1,shorten <=-#1},
+ extended line/.default=1cm
+ ]
+ % Math
+ \lensMath{#2}{#3}{#4}{#5}{#6}
+ % Lens, Notable points, Object and image, Notable Rays, Coordinates.
+ \lensBase{\f}{\ymirror}{#7}{#8}
+ \lensPts{\v}{\f}{\a}
+ \mirrorLensObjIma{\p}{\pp}{\o}{\i}
+ \lensRays{\p}{\pp}{\o}{\i}
+ \end{tikzpicture}
+}
+\newcommand{\lensSphGaussFixedCoord}[9][60]{
+ \begin{tikzpicture}[very thick,
+ arrDec/.style={
+ decoration={
+ markings,
+ mark= between positions 0.1 and 0.99 step #1pt with {\arrow{latex}}
+ },
+ postaction={decorate},
+ },
+ arrDec/.default=20,
+ extended line/.style={shorten >=-#1,shorten <=-#1},
+ extended line/.default=1cm
+ ]
+ % Math
+ \lensMath{#2}{#3}{#4}{#5}{#6}
+ % Lens, Notable points, Object and image, Notable Rays, Coordinates.
+ \lensBase{\f}{\ymirror}{#7}{#8}
+ \lensPts{\v}{\f}{\a}
+ \mirrorLensObjIma{\p}{\pp}{\o}{\i}
+ \lensRays{\p}{\pp}{\o}{\i}
+ \mirrorLensCoord{\p}{\pp}{\o}{\i}{\f}{#9}
+ \end{tikzpicture}
+}
+% *******************************************************
+
+% =======================================================
+% Lens - L
+% =======================================================
+\newcommand{\lensSphGaussL}[5][60]{
+ \begin{tikzpicture}[very thick,
+ arrDec/.style={
+ decoration={
+ markings,
+ mark= between positions 0.1 and 0.99 step #1pt with {\arrow{latex}}
+ },
+ postaction={decorate},
+ },
+ arrDec/.default=20,
+ extended line/.style={shorten >=-#1,shorten <=-#1},
+ extended line/.default=1cm
+ ]
+ % Math
+ \lensMathL{#2}{#3}{#4}{#5}{max(abs(\o),abs(\i)) + 0.5}
+ % Lens, Notable points, Object and image, Notable Rays, Coordinates.
+ \lensBase{\f}{\ymirror}{{min(\v,\p,\pp,\a,-\a)}}{{max(\v,\p,\pp,\a,-\a)}}
+ \lensPts{\v}{-\f}{-\a}
+ \mirrorLensObjIma{\p}{\pp}{\o}{\i}
+ \lensRays{\p}{\pp}{\o}{\i}
+ %\mirrorLensCoord{\p}{\pp}{\o}{\i}{\f}{{max(\a+0.5,\p,\pp)}+1}
+ \end{tikzpicture}
+}
+\newcommand{\lensSphGaussLCoord}[5][60]{
+ \begin{tikzpicture}[very thick,
+ arrDec/.style={
+ decoration={
+ markings,
+ mark= between positions 0.1 and 0.99 step #1pt with {\arrow{latex}}
+ },
+ postaction={decorate},
+ },
+ arrDec/.default=20,
+ extended line/.style={shorten >=-#1,shorten <=-#1},
+ extended line/.default=1cm
+ ]
+ % Math
+ \lensMathL{#2}{#3}{#4}{#5}{max(abs(\o),abs(\i)) + 0.5}
+ % Lens, Notable points, Object and image, Notable Rays, Coordinates.
+ \lensBase{\f}{\ymirror}{{min(\v,\p,\pp,\a,-\a)}}{{max(\v,\p,\pp,\a,-\a)}}
+ \lensPts{\v}{-\f}{-\a}
+ \mirrorLensObjIma{\p}{\pp}{\o}{\i}
+ \lensRays{\p}{\pp}{\o}{\i}
+ \mirrorLensCoord{\p}{\pp}{\o}{\i}{\f}{({max(\v,\p,\pp,\a,-\a)},-1)}
+ \end{tikzpicture}
+}
+\newcommand{\lensSphGaussLFixed}[8][60]{
+ \begin{tikzpicture}[very thick,
+ arrDec/.style={
+ decoration={
+ markings,
+ mark= between positions 0.1 and 0.99 step #1pt with {\arrow{latex}}
+ },
+ postaction={decorate},
+ },
+ arrDec/.default=20,
+ extended line/.style={shorten >=-#1,shorten <=-#1},
+ extended line/.default=1cm
+ ]
+ % Math
+ \lensMathL{#2}{#3}{#4}{#5}{#6}
+ % Lens, Notable points, Object and image, Notable Rays, Coordinates.
+ \lensBase{\f}{\ymirror}{#7}{#8}
+ \lensPts{\v}{-\f}{-\a}
+ \mirrorLensObjIma{\p}{\pp}{\o}{\i}
+ \lensRays{\p}{\pp}{\o}{\i}
+ \end{tikzpicture}
+}
+\newcommand{\lensSphGaussLFixedCoord}[9][60]{
+ \begin{tikzpicture}[very thick,
+ arrDec/.style={
+ decoration={
+ markings,
+ mark= between positions 0.1 and 0.99 step #1pt with {\arrow{latex}}
+ },
+ postaction={decorate},
+ },
+ arrDec/.default=20,
+ extended line/.style={shorten >=-#1,shorten <=-#1},
+ extended line/.default=1cm
+ ]
+ % Math
+ \lensMathL{#2}{#3}{#4}{#5}{#6}
+ % Lens, Notable points, Object and image, Notable Rays, Coordinates.
+ \lensBase{\f}{\ymirror}{#7}{#8}
+ \lensPts{\v}{-\f}{-\a}
+ \mirrorLensObjIma{\p}{\pp}{\o}{\i}
+ \lensRays{\p}{\pp}{\o}{\i}
+ \mirrorLensCoord{\p}{\pp}{\o}{\i}{\f}{#9}
+ \end{tikzpicture}
+}
+% *******************************************************
+
+\endinput \ No newline at end of file
diff --git a/info/biblio/typeset.bib b/info/biblio/typeset.bib
index 3a555274c6..81b4adffa5 100644
--- a/info/biblio/typeset.bib
+++ b/info/biblio/typeset.bib
@@ -2,9 +2,9 @@
%%% ====================================================================
%%% BibTeX-file{
%%% author = "Nelson H. F. Beebe",
-%%% version = "2.77",
-%%% date = "08 December 2022",
-%%% time = "14:04:25 MDT",
+%%% version = "2.78",
+%%% date = "24 December 2022",
+%%% time = "07:35:47 MDT",
%%% filename = "typeset.bib",
%%% address = "University of Utah
%%% Department of Mathematics, 110 LCB
@@ -14,7 +14,7 @@
%%% telephone = "+1 801 581 5254",
%%% FAX = "+1 801 581 4148",
%%% URL = "http://www.math.utah.edu/~beebe",
-%%% checksum = "53808 26470 127008 1193104",
+%%% checksum = "61626 26509 127241 1195294",
%%% email = "beebe at math.utah.edu, beebe at acm.org,
%%% beebe at computer.org (Internet)",
%%% codetable = "ISO/ASCII",
@@ -39,7 +39,7 @@
%%% and PDF (Portable Document Format), and
%%% sgml.bib covers SGML and HTML.
%%%
-%%% At version 2.77, the year coverage looked
+%%% At version 2.78, the year coverage looked
%%% like this:
%%%
%%% 1881 ( 1) 1929 ( 1) 1977 ( 12)
@@ -86,7 +86,7 @@
%%% 1923 ( 1) 1971 ( 11) 2019 ( 7)
%%% 1924 ( 0) 1972 ( 9) 2020 ( 1)
%%% 1925 ( 0) 1973 ( 12) 2021 ( 2)
-%%% 1926 ( 1) 1974 ( 8) 2022 ( 1)
+%%% 1926 ( 1) 1974 ( 8) 2022 ( 2)
%%% 1927 ( 0) 1975 ( 15)
%%% 1928 ( 1) 1976 ( 8)
%%% 19xx ( 3)
@@ -97,14 +97,14 @@
%%% InCollection: 5
%%% InProceedings: 55
%%% Manual: 42
-%%% MastersThesis: 20
+%%% MastersThesis: 21
%%% Misc: 19
%%% Periodical: 8
%%% PhdThesis: 6
%%% Proceedings: 33
%%% TechReport: 38
%%%
-%%% Total entries: 898
+%%% Total entries: 899
%%%
%%% This bibliography has been collected from
%%% bibliographies in the author's personal
@@ -25538,6 +25538,45 @@
journal-URL = "https://dl.acm.org/loi/sigdoc-cdq",
}
+@MastersThesis{Haug:2022:FTI,
+ author = "Martin E. Haug",
+ title = "Fast Typesetting with Incremental Compilation",
+ type = "{Master}'s thesis",
+ school = "Technische Universit{\"a}t Berlin, Faculty IV ---
+ Electrical Engineering and Computer Science",
+ address = "Berlin, Germany",
+ month = jun,
+ year = "2022",
+ DOI = "https://doi.org/10.13140/RG.2.2.15606.88642",
+ bibdate = "Sat Dec 24 07:29:29 2022",
+ bibsource = "http://www.math.utah.edu/pub/tex/bib/typeset.bib",
+ abstract = "Text-based typesetting systems like \LaTeX{} compile
+ source files into PDF and other formats. This process
+ is computationally expensive. Unlike ``What You See Is
+ What You Get'' (WYSIWYG) systems, most text-based
+ typesetting systems recompile the document from
+ scratch, even after minor changes. Constant expensive
+ recomputations prevent instant preview of changes, as
+ in WYSIWYG software. This thesis explores how to speed
+ up the text-based typesetting software Typst by reusing
+ artifacts from past compilations while parsing and
+ layouting. We propose an incremental parsing algorithm
+ that accommodates context-sensitive properties of
+ markup languages such as the ``off-side rule'' and is
+ suited for handwritten recursive descent parsers.
+ Furthermore, we also present a constrained layout
+ caching scheme that allows reusing previous layout
+ elements even if the dimensions of their parent
+ containers changed. In an evaluation based on a set of
+ typical documents and edits, we determined that this
+ thesis' contributions increase the speed of Typst by a
+ factor between 4.5 and 91. Compared with \LaTeX{},
+ Typst can compile an edit between 3.4 and 9895 times as
+ fast.",
+ acknowledgement = ack-nhfb,
+ advisor = "Nicolai Stawinoga",
+}
+
@Misc{Anonymous:20xx:W,
author = "Anonymous",
title = "WhatTheFont",
diff --git a/info/biblio/typeset.ltx b/info/biblio/typeset.ltx
index 56a339f976..19243734dc 100644
--- a/info/biblio/typeset.ltx
+++ b/info/biblio/typeset.ltx
@@ -2,9 +2,9 @@
%%% ====================================================================
%%% @LaTeX-file{
%%% author = "Nelson H. F. Beebe",
-%%% version = "2.77",
-%%% date = "08 December 2022",
-%%% time = "14:04:31 MDT",
+%%% version = "2.78",
+%%% date = "24 December 2022",
+%%% time = "07:35:52 MDT",
%%% filename = "typeset.ltx",
%%% address = "University of Utah
%%% Department of Mathematics, 110 LCB
@@ -14,7 +14,7 @@
%%% telephone = "+1 801 581 5254",
%%% FAX = "+1 801 581 4148",
%%% URL = "http://www.math.utah.edu/~beebe",
-%%% checksum = "32124 78 270 2852",
+%%% checksum = "36080 78 270 2852",
%%% email = "beebe@math.utah.edu, beebe@acm.org,
%%% beebe@computer.org (Internet)",
%%% codetable = "ISO/ASCII",
@@ -59,8 +59,8 @@
WWW URL: \protect\path=http://www.math.utah.edu/~beebe/=
}
-\date{08 December 2022 \\
-Version 2.77}
+\date{24 December 2022 \\
+Version 2.78}
\begin{document}
\maketitle
\nocite{*}
diff --git a/macros/latex/contrib/frenchmath/README.md b/macros/latex/contrib/frenchmath/README.md
index 0e6ac53066..47fa0fa721 100644
--- a/macros/latex/contrib/frenchmath/README.md
+++ b/macros/latex/contrib/frenchmath/README.md
@@ -6,7 +6,7 @@
The package provides:
- roman uppercase letters in mathematical mode according to French rule (can be optionnally disabled),
- optionally lowercase Greek letters in upright shape,
-- correct spacing after commas and before a semicolon in math mode,
+- correct spacing in math mode after commas, before a semicolon and around square brackets,
- some useful macros and aliases for symbols used in France : `\infeg`, `\supeg`, `\paral`,...
- several macros for writing french operator names like pgcd, ppcm, Card, rg, Vect,...
diff --git a/macros/latex/contrib/frenchmath/frenchmath.dtx b/macros/latex/contrib/frenchmath/frenchmath.dtx
index fb72a379ec..ebe9e760c2 100644
--- a/macros/latex/contrib/frenchmath/frenchmath.dtx
+++ b/macros/latex/contrib/frenchmath/frenchmath.dtx
@@ -20,21 +20,18 @@
%<*package>
\NeedsTeXFormat{LaTeX2e}[2005/12/01]
\ProvidesPackage{frenchmath}
- [2022/11/15 v2.2 .dtx frenchmath file]
+ [2022/12/26 v2.3 .dtx frenchmath file]
%</package>
%<*driver>
\documentclass{ltxdoc}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[french]{babel}
+\usepackage[font=fcm]{lgrmath}
\usepackage{mathpazo}
\usepackage[upgreek]{frenchmath}
\usepackage{textalpha}
\usepackage{metalogo} % pour les logos XeLaTeX et LuaLaTeX
-% Pour certains exemples de la doc on restitue les définitions originales :
-\DeclareMathSymbol{\PV}\mathpunct{operators}{'73} % code octal du ; dans ecrm (ou cmr)
-\DeclareMathSymbol{\OB}\mathclose{operators}{093} % crochet ouvrant [
-\DeclareMathSymbol{\CB}\mathopen{operators}{091} % crochet fermant ]
\DeclareSymbolFont{cmsymbols}{OMS}{cmsy}{m}{n} % symbole \emptyset de computer modern
\DeclareMathSymbol{\cmemptyset}{\mathord}{cmsymbols}{'73} % code octal dans cmsy
\DeclareTextSymbol{\textmicro}{TS1}{181} % mu de micro
@@ -59,7 +56,7 @@
%</driver>
% \fi
%
-% \CheckSum{543}
+% \CheckSum{541}
%
% \CharacterTable
% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
@@ -79,39 +76,70 @@
%
%
% \changes{v0.1}{27/12/2011}{Version personnelle préliminaire}
-% \changes{v1.0}{15/01/2019}{Première version publiée, création des fichiers dtx et ins}
-% \changes{v1.1}{07/04/2019}{Nouvelles macros pour les repères (Oij, Oijk),
-% ajouté ensuremath dans curs}
-% \changes{v1.1}{15/04/2019}{Changements mineurs dans la documentation}
-% \changes{v1.2}{25/04/2019}{L'option capsrm fonctionne à présent avec beamer,
-% ajouté Ouv, modifications du fichier README.md}
-% \changes{v1.2}{27/04/2019}{capsrm -> capsup}
-% \changes{v1.3}{15/05/2019}{Intégration de icomma et psset{comma=true},
-% changements dans la documentation}
-% \changes{v1.4}{2019/05/22}{Changement de la définition de fonte up -> operators,
-% car incompatibilité avec l'extension unicode-math}
-% \changes{v1.5}{2020/11/02}{Ajout des macros étoilées pour les repères du plan et de l'espace
-% et la base (i,j,k)}
-% \changes{v1.6}{2022/10/16}{Remplacement de icomma par ncccomma, grâce à une proposition
-% de Jean-François Burnol, amélioration du code redéfinissant les majuscules mathématiques,
-% suppression de l'option capsup (capsit à false suffit),
-% remplacement de \bslash tgh par \th pour la tangente hyperbolique.}
-% \changes{v2.0}{2022/10/24}{option permettant de définir les lettres
-% grecques minuscules en forme droite,
-% correction de bug avec la commande \bslash qui n'était pas définie,
-% compatibilité avec mathdesign}
-% \changes{v2.1}{11/11/2022}{reprise du doc pour les lettres grecques, les crochets
-% et les références ;
-% nouvelle commande paral*, \mathop{\operatorfont th} remplacé par \operatorname{th}}
-% \changes{v2.2}{15/11/2022}{Quelques changements dans la doc, fonte Palatino avec mathpazo,
-% commande paral redéfinie, la commande paral* devient inutile}
+% \changes{v1.0}{15/01/2019}{
+% - Première version publiée, création des fichiers dtx et ins}
+%
+% \changes{v1.1}{07/04/2019}{
+% - Nouvelles macros pour les repères (Oij, Oijk),
+% - ajouté ensuremath dans curs}
+% \changes{v1.1}{15/04/2019}{
+% - Changements mineurs dans la documentation}
+%
+% \changes{v1.2}{25/04/2019}{
+% - L'option capsrm fonctionne à présent avec beamer,
+% - ajouté Ouv, modifications du fichier README.md}
+% \changes{v1.2}{27/04/2019}{
+% - capsrm -> capsup}
+%
+% \changes{v1.3}{15/05/2019}{
+% - Intégration de icomma et psset{comma=true},
+% - changements dans la documentation}
+%
+% \changes{v1.4}{2019/05/22}{
+% - Changement de la définition de fonte up -> operators,
+% car incompatibilité avec l'extension unicode-math}
+%
+% \changes{v1.5}{2020/11/02}{
+% - Ajout des macros étoilées pour les repères du plan et de l'espace et la base (i,j,k)}
+%
+% \changes{v1.6}{2022/10/16}{
+% - Remplacement de icomma par ncccomma, grâce à une proposition de J. F. Burnol,
+% - amélioration du code redéfinissant les majuscules mathématiques,
+% - suppression de l'option capsup (capsit à false suffit),
+% - remplacement de tgh par th pour la tangente hyperbolique.}
+%
+% \changes{v2.0}{2022/10/24}{
+% - nouvelle option permettant de définir les lettres grecques minuscules en forme droite,
+% - correction de bug avec la commande \bslash qui n'était pas définie,
+% - compatibilité avec mathdesign}
+%
+% \changes{v2.1}{11/11/2022}{
+% - Reprise du doc pour les lettres grecques, les crochets et les références ;
+% - nouvelle commande paral*,
+% - '\mathop{\operatorfont th}' remplacé par '\operatorname{th}'}
+%
+% \changes{v2.2}{15/11/2022}{
+% - Quelques changements dans la doc, police Palatino avec mathpazo,
+% - commande paral redéfinie, la commande paral* devient inutile}
+%
+% \changes{v2.3}{16/11/2022}{
+% - Bug corrigé dans la commande Vect}
+% \changes{v2.3}{20/11/2022}{
+% - Ajout dans la doc : frenchmath doit être chargé après babel}
+% \changes{v2.3}{19/12/2022}{
+% - Suppression des warnings systématiques,
+% - utilisation de \string à la place de \bslash}
+% \changes{v2.3}{25/12/2022}{
+% - Nouvelle option lgrmath,
+% - utilisation de l'extension ibrackets,
+% - définition de cosec et cosech}
%
% \GetFileInfo{frenchmath.sty}
%
% \title{L'extension \textsf{frenchmath}\thanks{Ce document
-% correspond à \textsf{frenchmath}~\fileversion, dernière modification le 15/11/2022.}}
+% correspond à \textsf{frenchmath}~\fileversion, dernière modification le 26/12/2022.}}
% \author{Antoine Missier \\ \texttt{antoine.missier@ac-toulouse.fr}}
-% \date{15 novembre 2022}
+% \date{26 décembre 2022}
% \maketitle
%
% \section{Introduction}
@@ -121,18 +149,19 @@
% les majuscules en romain (lettres droites) plutôt qu'en italique
% (voir~\cite{RTIN} et~\cite{IGEN})
% ainsi que des espacements corrects
-% pour les virgules et point-virgules
-%\footnote{Merci à Jean-François Burnol pour certaines améliorations proposées au code.}.
-% Depuis la version 2.0, une option permet également de composer les minuscules grecques
-% du mode mathématique en forme droite.
+% pour les virgules
+%\footnote{Merci à Jean-François Burnol pour certaines améliorations proposées au code.}
+% et point-virgules.
+% Depuis la version 2.0, des options permettent
+% de composer les minuscules grecques du mode mathématique en forme droite.
%
% D'autres solutions pour composer les majuscules mathématiques en romain
% sont proposées dans les extensions \textsf{fourier} de Michel Bovani~\cite{FOUR}
% (avec la famille des fontes Adobe Utopia)
% ou encore \textsf{mathdesign} de Paul Pichaureau~\cite{DESIGN}
-% (avec les fontes Adobe Utopia, URW Garamond ou Bitstream Charter).
+% (avec les polices Adobe Utopia, URW Garamond ou Bitstream Charter).
% Mais \textsf{frenchmath} fournit une solution générique
-% s'adaptant à n'importe quelle fonte.
+% s'adaptant à n'importe quelle police de caractères.
%
% D'autres préconisations, telles que composer en lettre droite
% et non en italique le symbole différentiel,
@@ -159,7 +188,7 @@
% \end{itemize}
%
% Mentionnons aussi l'extension \textsf{tdsfrmath}~\cite{FRM} de Yvon Henel
-% qui fournit beaucoup de commandes francisées.
+% qui fournit aussi beaucoup de commandes francisées.
%
%
% \section{Utilisation}
@@ -168,20 +197,21 @@
% En France, les lettres majuscules du mode mathématique doivent toujours
% être composées en romain ($A, B, C, \ldots$) et non en italique
% (\cite{RTIN} p.107, voir aussi~\cite{IGEN}).
-% En utilisant \XeLaTeX\ ou \LuaLaTeX\ avec des fontes mathématiques OpenType,
+% En utilisant \XeLaTeX\ ou \LuaLaTeX\ avec des polices mathématiques OpenType,
% cette convention est assez commode à mettre en œuvre,
% mais, avec \LaTeX\ ou pdf\LaTeX, assez peu d'auteurs la respectent
-% et les extensions précitées ne fonctionnent qu'avec des fontes précises.
+% et les extensions précitées ne fonctionnent qu'avec des polices particulières.
% Par défaut \textsf{frenchmath} compose automatiquement toutes les majuscules
% mathématiques en romain,
% quelle que soit la fonte utilisée.
% Par exemple |\[ P(X)=\sum_{i=0}^{n} a_i X^i \]| donne avec \textsf{frenchmath}
% \[ P(X)=\sum_{i=0}^{n}a_i X^i. \]
%
-% \DescribeEnv{capsit}
-% L'extension \textsf{frenchmath} possède une option, |capsit|,
-% qui permet de conserver la composition des majuscules du mode mathématique
-% en italique (dans la famille de fonte par défaut).
+% \DescribeEnv{[capsit]}
+% L'option \texttt{capsit} de \textsf{frenchmath}
+% permet de désactiver la composition des majuscules du mode mathématique
+% en romain pour conserver la composition par défaut (en italique) :
+% |\usepackage[capsit]{frenchmath}|
% Que l'option soit activée ou pas, il est toujours possible de changer l'aspect
% d'une lettre particulière, avec les macros \LaTeX\ |\mathrm| et |\mathit|.
%
@@ -215,7 +245,7 @@
% \footnote{L'extension \textsf{newtxmath} doit être chargée
% après \textsf{frenchmath} qui utilise \textsf{amssymb} car la compilation
% produit sinon un message d'erreur pour la commande
-% \texttt{\bslash Bbbk}.}
+% \texttt{\string\Bbbk}.}
% et \textsf{libertinust1math}
% de Michael Sharpe,
% \textsf{pxgreeks}, \textsf{txgreeks}
@@ -223,40 +253,66 @@
% \textsf{pxgreeks} ou \textsf{txgreeks} doit être chargée
% \emph{après} \textsf{amsmath} (ou \textsf{mismath}),
% pour éviter une erreur de compilation due à la redéfinition des commandes
-% \texttt{\bslash iint}, \texttt{\bslash iiint}, \texttt{\bslash iiiint},
-% \texttt{\bslash idotsint}.}
+% \texttt{\string\iint}, \texttt{\string\iiint}, \texttt{\string\iiiint},
+% \texttt{\string\idotsint}.}
% et \textsf{libgreek} de Jean-François Burnol,
% qui donnent de beaux résultats pour une utilisation avec
-% respectivement les fontes Palatino, Times et Libertinus.
+% respectivement les polices Palatino, Times et Libertinus.
+%
+% \medskip
+% \DescribeEnv{[lgrmath]}
+% Jean-François Burnol a également développé l'extension \textsf{lgrmath}~\cite{LGR}
+% qui permet d'utiliser, en mode mathématique, les différentes fontes de lettres
+% grecques accessibles par \LaTeX\ avec l'encodage LGR. La documentation
+% de l'extension indique comment consulter et utiliser les fontes accessibles
+% sur votre distribution.
+%
+% En activant l'option \texttt{lgrmath}, \textsf{frenchmath}
+% charge cette extension avec l'option \texttt{style=french}
+% et la fonte fcm (de l'extension \textsf{cm-lgc})
+% \footnote{Évidemment il faut que \textsf{cm-lgc} soit installée
+% sur votre distribution sans quoi la fonte de substitution LGR/cmr/m/n sera utilisée.}
+% qui se marie particulièrement bien avec la police usuelle Latin Modern.
+% Les commandes |\alpha|, |\beta|, etc.
+% produisent alors automatiquement les lettres en forme droite
+% $\alphaup$, $\betaup$, \ldots, $\piup$, etc.,
+% tandis que |\alphait|, |\betait|, etc. produisent des formes italiques
+% $\alphait$, $\betait$, \ldots, $\piit$, etc.
+% Ces dernières sont peu à notre goût, mais elles n'ont pas vocation à être
+% utilisées lorsque l'on active l'option \texttt{lgrmath}.
+% Par contre, on peut choisir d'autres options de fontes en chargeant l'extension
+% \textsf{lgrmath} indépendamment de \textsf{frenchmath}
+% (voir par exemple avec l'option \texttt{font=Alegreya-LF} ou \texttt{font=Cochineal-LF}).
%
% \medskip
-% \DescribeEnv{upgreek}
+% \DescribeEnv{[upgreek]}
% Avec la même philosophie, \textsf{frenchmath} fournit l'option \texttt{upgreek}
% basée sur l'extension \textsf{upgreek} de Walter Schmidt~\cite{UPGREEK} qui donne
% accès aux lettres grecques minuscules en forme droite :
-% |\upalpha|, |\upbeta|, \ldots
+% |\upalpha|, |\upbeta|, etc.
% L'extension \textsf{upgreek} sera chargée avec l'option par défaut, \texttt{Euler}.
% Si l'on veut, par contre, utiliser l'extension \textsf{upgreek}
% avec l'une de deux autres options disponibles, \texttt{Symbol}
-% ou \texttt{Symbolsmallscale} (utilisant la fonte Adobe Symbol),
+% ou \texttt{Symbolsmallscale} (utilisant la police Adobe Symbol),
% il faut charger l'extension \textsf{upgreek} avec l'option souhaitée
% \emph{avant} \textsf{frenchmath}
% \footnote{L'option \texttt{Symbol} de \textsf{upgreek} se marie mieux
-% avec une fonte comme Times par exemple.}.
+% avec une police comme Times par exemple.}.
% L'option \texttt{upgreek} de \textsf{frenchmath} redéfinit ensuite les commandes
-% |\alpha|, |\beta|, \ldots
+% |\alpha|, |\beta|, etc.
% pour produire automatiquement les lettres en forme droite
% $\alpha$, $\beta$, \ldots, $\pi$, \ldots ; les formes italiques, $\italpha, \itbeta$, \ldots,
-% $\itpi$, \ldots, restant cependant disponibles avec les commandes
-% |\italpha|, |\itbeta|, \ldots, |\itpi|, \ldots
+% $\itpi$, etc. restant cependant disponibles avec les commandes
+% |\italpha|, |\itbeta|, \ldots, |\itpi|, etc.
%
% \medskip
-% \DescribeEnv{Upgreek}
+% \DescribeEnv{[Upgreek]}
% Avec \LaTeX, les lettres grecques majuscules sont automatiquement composées
-% en forme droite, néanmoins il peut être utile de disposer de toutes
-% les lettres grecques dans le même style ; ainsi l'extension \textsf{upgreek}
+% en forme droite et l'option \texttt{upgreek} ne concerne que les minuscules.
+% Cependant l'extension \textsf{upgreek}
% propose aussi |\Upgamma|, \ldots, |Upomega| : $\Upgamma, \ldots, \Upomega$.
-% L'option \texttt{Upgreek} de \textsf{frenchmath} redéfinit les majuscules
+% Si l'on veut conserver majuscules et minuscules dans le même style,
+% l'option \texttt{Upgreek} de \textsf{frenchmath} redéfinit les majuscules
% |\Gamma|, \ldots, |\Omega| pour correspondre à ces variantes.
% Par contre l'on n'a alors plus accès aux caractères d'origine : $\Gamma, \ldots, \Omega$.
%
@@ -269,30 +325,25 @@
% donne accès aux lettres en forme droite \textalpha, \textbeta, \ldots,
% \textpi, \ldots,
% mais en mode texte avec |\textalpha|, |\textbeta|, etc.
-% Ces glyphes se marient particulièrement bien avec la fonte Latin Modern.
-% Par contre le theta produit n'est pas vraiment celui attendu, \texttheta,
-% à moins d'utiliser la fonte \textsf{libertinus} ou l'extension \textsf{fontspec}
-% avec \XeLaTeX\
-% (et seulement avec les versions de \textsf{textalpha} postérieures à 2020) ;
-% d'autre part le rendu de |\textpi| est parfois curieusement déformé.
+% Ces glyphes se marient également bien avec la police Latin Modern.
+% Par contre le theta produit, \texttheta, n'est pas vraiment
+% celui qui est d'usage en mathématiques.
%
% \medskip
% Mentionnons ce commentaire de Walter Schmidt~\cite{UPGREEK} que le mu
% utilisé pour le préfixe des unités physiques, \textmicro, doit se composer avec |\textmu|
-% \footnote{L'extension \textsf{textalpha} fournit à la place \texttt{\bslash textmicro}
-% (depuis 2020) car elle redéfinit \texttt{\bslash textmu}.},
+% \footnote{L'extension \textsf{textalpha} fournit à la place \texttt{\string\textmicro}
+% (depuis 2020) car elle redéfinit \texttt{\string\textmu}.},
% disponible en mode texte dans beaucoup de fontes (ou avec \textsf{textcomp}) ;
% il diffère du $\upmu$ de |\upmu|.
%
% \subsection{Virgules, point-virgule et crochets}
-% \DescribeMacro{,}
-% \StandardMathComma
+% \DescribeMacro{virgules}
% Dans le mode mathématique de \LaTeX, la virgule est toujours, par défaut,
% un symbole de ponctuation et sera donc suivi d'une espace.
% Ceci est légitime dans un intervalle :
-% |$[a,b]$| donne $[a,b]$, mais pas pour un nombre en français : |$12,5$| donne $12,5$
-% \DecimalMathComma
-% au lieu de $12,5$.
+% |$[a,b]$| donne $[a,b]$, mais pas pour un nombre en français : |$12,5$| donne
+% $12, 5$ au lieu de $12,5$.
% L'extension \textsf{babel}, avec l'option |french|~\cite{BABEL}, fournit deux bascules :
% |\DecimalMathComma| et |\StandardMathComma|, qui permettent d'adapter
% le comportement de la virgule du mode mathématique.
@@ -304,7 +355,7 @@
% \begin{itemize}
% \item avec \textsf{icomma} (intelligent comma) de Walter Schmidt~\cite{ICOMMA},
% la virgule se comporte comme un caractère de ponctuation si elle est suivie d'une espace,
-% sinon c'est un caractère ordinaire,
+% sinon c'est un caractère ordinaire ;
% \item avec \textsf{ncccomma} de Alexander I.~Rozhenko~\cite{NCC},
% la virgule se comporte comme un caractère ordinaire si elle est suivie d'un chiffre
% (sans espace), sinon c'est un caractère de ponctuation.
@@ -327,6 +378,10 @@
% de Claudio Beccari~\cite{BECC} qui propose une solution simplifiée
% par rapport à \textsf{ncccomma} mais dont l'avantage semble discutable.}.
%
+% Signalons que, si l'on compile avec \LuaLaTeX, il est impératif de charger
+% \textsf{frenchmath} \emph{après} \textsf{babel-french}
+% (ce qui est, somme toute, la pratique normale).
+%
% \medskip
% Lorsque l'on utilise l'extension \textsf{pstricks-add} de \textsf{PSTricks}
% pour tracer des axes de coordonnées, l'appel |\psset{comma=true}|
@@ -334,46 +389,52 @@
% Ce réglage est effectué par défaut ici.
%
% \medskip
-% \DescribeMacro{;}
+% \DescribeMacro{point-virgule}
% Le symbole \og;\fg\ a été redéfini pour le mode mathématique
% car l'espace précédant le point-virgule est incorrecte en français
% |$x \in [0,25 ; 3,75]$| donne
-% $x\in [0,25 \PV 3,75 ]$ sans \textsf{frenchmath} et $x\in [0,25; 3,75]$
+% $x\in [0,25 \mathpunct; 3,75 ]$ sans \textsf{frenchmath} et $x\in [0,25 ; 3,75]$
% avec \textsf{frenchmath} ;
-% le comportement de \og ;\fg devient identique à celui de \og:\fg
-% \StandardMathComma
+% le comportement de \og ;\fg devient identique à celui de \og:\fg.
%
% \medskip
-% \DescribeMacro{[ ]}
-% Les crochets ouvrants et fermants $[$ et $]$ ont été redéfinis pour le mode
-% mathématique car l'espace extérieure est souvent incorrecte
+% \DescribeMacro{crochets}
+% Alors que les Anglais utilisent généralement les parenthèses
+% pour les intervalles ouverts $(0, +\infty)$, l'usage en français est d'utiliser
+% les crochets $]0, +\infty[$. Mais comme cela n'est pas prévu par \LaTeX,
+% les espaces seront souvent incorrectes.
+% Nous avons redéfini les crochets dans l'extension \textsf{ibrackets}~\cite{BRACKETS}
+% qui est chargée par \textsf{frenchmath}
% \footnote{L'extension \textsf{interval} fournit une autre
-% solution basée sur la macro \texttt{\bslash interval} ;
+% solution basée sur la macro \texttt{\string\interval} ;
% citons aussi \textsf{mathtools} et sa commande
-% \texttt{\bslash DeclarePairedDelimiter}.
-% Sinon l'extension \textsf{mismath} définit les crochets de la même manière
-% que \textsf{frenchmath}, sans incompatibilité entre les deux.}:
-% \begin{center}
-% |$x\in ]0,\pi[ \cup ]2\pi,3\pi[$| \hfill
-% $\left\{\begin{array}{@{\,}ll}
-% x\in \OB 0,\pi \CB \cup \OB 2\pi, 3\pi \CB
-% &\mbox{sans \textsf{frenchmath},}\\
-% x\in ]0, \pi[ \cup ]2\pi, 3\pi[
-% &\mbox{avec \textsf{frenchmath}.}
-% \end{array}\right.$
-% \end{center}
-% Dans notre code, les symboles $[$ et $]$ ne sont plus définis comme des délimiteurs.
+% \texttt{\string\DeclarePairedDelimiter}.}.
+% Le code
+% |$x\in ]-\pi, 0[ \cup ]2\pi, 3\pi[$|
+% produira
+% \[ x\in ]-\pi, 0[ \cup ]2\pi, 3\pi[ \mbox{\quad avec \textsf{ibrackets}}, \]
+% au lieu de
+% \[ x\in \mathclose{]}-\pi, 0 \mathopen{[} \cup \mathclose{]} 2\pi, 3\pi \mathopen{[}
+% \mbox{\quad sans \textsf{ibrackets}}. \]
+%
+% Dans notre code, les caractères $[$ et $]$ deviennent \og actifs \fg
+% et ne sont plus définis par défaut comme des délimiteurs.
% De ce fait, une coupure de ligne peut se produire entre les deux,
% mais il est toujours possible de transformer alors ces crochets en délimiteurs
% avec |\left| et |\right|.
-% Un autre problème se pose lorsque la borne inférieure de l'intervalle
-% contient un symbole d'opération car les espaces autour de l'opération seront alors
-% trop grandes : |$[-1, 1]$| donne
-% $[-1, 1]$ au lieu de $[{-1}, 1]$
-% \footnote{Problème signalé par J.F. Burnol, mais cela n'enlève pas l'intérêt de
-% cette redéfinition.}.
-% Pour rétablir les espaces correctes, il faut
-% entourer le $-$ ou le $-1$ par des accolades ou utiliser |\left| et |\right|.
+%
+% Avec \textsf{ibrackets}, un crochet devient un caractère ordinaire,
+% sauf s'il est immédiatement suivi par un signe + ou - (sans espace), auquel cas
+% c'est un délimiteur ouvrant.
+% Si la borne de gauche possède un signe - (ou +),
+% \emph{il ne faut pas laisser d'espace entre le premier crochet
+% et le signe}: par exemple |$x \in ] -\infty, 0]$| produit
+% $x \in ] -\infty, 0]$ avec des espaces trop grandes autour du signe.
+% Mais au contraire lorsque l'on souhaite faire de l'algèbre sur les intervalles,
+% \emph{il faut laisser une espace entre le second crochet et l'opération} + ou -,
+% par exemple, |$[a, b] + [c, d]$| produit $[a, b] + [c, d]$
+% mais |$[a, b]+ [c, d]$| produit $[a, b]+ [c, d]$.
+%
% \subsection{Quelques macros et alias utiles}
%
% \DescribeMacro{\curs}
@@ -382,7 +443,7 @@
% avec |\curs| et sont différentes de celles obtenues
% avec |\mathcal|
% \footnote{L'extension \textsf{calrsfs} fournit les mêmes cursives mais en redéfinissant
-% la commande \texttt{\bslash mathcal}.}
+% la commande \texttt{\string\mathcal}.}
% ($\mathcal{A}, \mathcal{B}, \mathcal{C}, \mathcal{D}, \ldots$).
% La commande |\curs| permet aussi de composer ces lettres en mode texte,
% sans les délimiteurs du mode mathématique.*
@@ -407,9 +468,9 @@
% \DescribeMacro{\paral}
% La commande |\paral| fournit la \emph{relation}
% \footnote{Pour noter que deux objets sont perpendiculaires, on utilise
-% \texttt{\bslash perp} : $\curs{D}\perp\curs{D}'$,
+% \texttt{\string\perp} : $\curs{D}\perp\curs{D}'$,
% défini comme une \emph{relation} mathématique plutôt que
-% \texttt{\bslash bot} défini comme un \emph{symbole} (les espacements diffèrent).}
+% \texttt{\string\bot} défini comme un \emph{symbole} (les espacements diffèrent).}
% du parallélisme : $\curs{D}\paral\curs{D}'$,
% plutôt que sa version anglaise |\parallel| : $\curs{D}\parallel\curs{D}'$.*
%
@@ -443,7 +504,7 @@
% \LaTeX\ fournit les macros
% |\ker| et |\hom|, alors que l'usage français est souvent
% de commencer ces noms par une majuscule pour obtenir $\Ker$
-% \footnote{La commande \texttt{\bslash Im} existe déjà pour la
+% \footnote{La commande \texttt{\string\Im} existe déjà pour la
% partie imaginaire des nombres complexes et produit $\Im$ ;
% elle est redéfinie en Im par l'extension \textsf{mismath}
% et peut aussi être utilisée pour l'image.}
@@ -462,10 +523,19 @@
% avec les langues d'Europe de l'Est~\cite{COMP},
% sont aussi utilisées en français~\cite{RTIN}.
% On les obtient avec les commandes |\ch|, |\sh| et |\th|
-% \footnote{La commande \texttt{\bslash th} existe déjà, pour le mode texte uniquement,
+% \footnote{La commande \texttt{\string\th} existe déjà, pour le mode texte uniquement,
% et produit \th ;
% elle a été redéfinie, uniquement pour le mode mathématique, à la place
-% de l'ancienne commande \texttt{\bslash tgh}, désormais obsolète.}.
+% de l'ancienne commande \texttt{\string\tgh}, utilisée jusqu'à la version 1.6,
+% désormais obsolète.}.
+%
+% \medskip
+% \DescribeMacro{\cosec} \DescribeMacro{\cosech}
+% La fonction cosécante (inverse du sinus) s'obtient avec la macro |\csc|, mais en français,
+% on utilise aussi |\cosec|~\cite{RTIN} et |\cosech| pour la cosécante hyperbolique
+% \footnote{La fonction sécante est définie en standard par \LaTeX\
+% avec \texttt{\textbackslash sec} et la sécante hyperbolique \texttt{\textbackslash sech}
+% est définie par \textsf{mismath}~\cite{MIS}.}.
%
% \subsection{Bases et repères}
%
@@ -483,23 +553,26 @@
%
% \DescribeMacro{\ij} \DescribeMacro{\ijk}
% Enfin les macros |\ij|
-% \footnote{Notons que la macro \texttt{\bslash ij} existait déjà
+% \footnote{Notons que la macro \texttt{\string\ij} existait déjà
% (ligature entre i et j pour le hollandais) et a été redéfinie.}
% et |\ijk| composent les bases du plan et de l'espace, \ij
% et \ijk, en homogénéisant la hauteur des flèches.
%
% Signalons que les macros de ce paragraphe peuvent ne pas fonctionner
-% avec certaines fontes mathématiques qui ne connaissent pas \texttt{\bslash jmath},
+% avec certaines fontes mathématiques qui ne connaissent pas \texttt{\string\jmath},
% par exemple l'extension \textsf{mathptmx} (basée sur la fonte de texte Times).
%
% \StopEventually{}
%
+% \pagebreak
% \section{Le code}
%
% \begin{macrocode}
\RequirePackage{ifthen}
\newboolean{capsit}
\DeclareOption{capsit}{\setboolean{capsit}{true}}
+\newboolean{lgrmath}
+\DeclareOption{lgrmath}{\setboolean{lgrmath}{true}}
\newboolean{upgreek}
\DeclareOption{upgreek}{\setboolean{upgreek}{true}}
\newboolean{Upgreek}
@@ -518,10 +591,15 @@
}
}
\RequirePackage{amsopn} % fournit \DeclareMathOperator
+\ifthenelse{\boolean{lgrmath}}{
+ \@ifpackageloaded{lgrmath}{}{
+ \RequirePackage[font=fcm,style=french]{lgrmath}}
+}{}
\ifthenelse{\boolean{upgreek}}{
\@ifpackageloaded{upgreek}{}{\RequirePackage[Euler]{upgreek}}
}{}
\RequirePackage{xspace} % utile pour les commandes \curs, \ssi, \Oij
+\RequirePackage{ibrackets} % intelligent brackets
% \RequirePackage{icomma} % intelligent comma
\RequirePackage{ncccomma} % depuis frenchmath 1.6
\AtBeginDocument{\mathcode`\,="8000\relax
@@ -531,9 +609,9 @@
}
% \end{macrocode}
% La macro ci-dessus permet d'utiliser \textsf{ncccomma} à la place de \textsf{icomma}.
-% Elle m'a été proposée par Jean-François Burnol, de même qu'une amélioration
-% du code ci-après,
-% redéfinissant les majuscules mathématiques.
+% \textsf{ncccomma} doit être chargée après \textsf{babel-french} si on utilise \LuaLaTeX.
+% Cette macro m'a été proposée par Jean-François Burnol, de même qu'une amélioration
+% du code ci-après, redéfinissant les majuscules mathématiques.
%
% Sauf si l'option \texttt{capsit} est activée, on redéfinit toutes les lettres majuscules
% du mode mathématique ; |\AtBeginDocument| est nécessaire pour que
@@ -582,10 +660,11 @@
\ifthenelse{\boolean{upgreek}}{
\@ifundefined{italpha}{\let\italpha\alpha}{
- \PackageWarningNoLine{frenchmath}{Italicized Greek
- \bslash italpha already exist \MessageBreak
+ \PackageWarningNoLine{frenchmath}{Command
+ \string\italpha\space already exist \MessageBreak
and will not be redefined, \MessageBreak
- no more warning for the other letters, except pi}
+ no more warning for the other Greek letters, \MessageBreak
+ except pi}
}
\@ifundefined{itbeta}{\let\itbeta\beta}{}
\@ifundefined{itgamma}{\let\itgamma\gamma}{}
@@ -601,8 +680,8 @@
\@ifundefined{itnu}{\let\itnu\nu}{}
\@ifundefined{itxi}{\let\itxi\xi}{}
\@ifundefined{itpi}{\let\itpi\pi}{
- \PackageWarningNoLine{frenchmath}{Italicized Greek
- \bslash itpi already exist \MessageBreak
+ \PackageWarningNoLine{frenchmath}{Command
+ \string\itpi\space already exist \MessageBreak
and will not be redefined}
}
\@ifundefined{itrho}{\let\itrho\rho}{}
@@ -667,9 +746,7 @@
}{}
\AtBeginDocument{\@ifpackageloaded{pstricks-add}{\psset{comma=true}}{}}
-\DeclareMathSymbol{;}\mathbin{operators}{'73} % \mathpunct à l'origine
-\DeclareMathSymbol{]}\mathord{operators}{093} % \mathclose à l'origine
-\DeclareMathSymbol{[}\mathord{operators}{091} % \mathopen à l'origine
+\DeclareMathSymbol{;}{\mathbin}{operators}{'73} % \mathpunct à l'origine
\newcommand*\curs[1]{\ensuremath{\mathscr{#1}}\xspace}
\newcommand\infeg{\leqslant}
@@ -695,21 +772,14 @@
\DeclareMathOperator{\Ker}{Ker}
\DeclareMathOperator{\Hom}{Hom}
\DeclareMathOperator{\rg}{rg}
-\DeclareMathOperator{\Vect}{\Vect}
+\DeclareMathOperator{\Vect}{Vect}
\DeclareMathOperator{\ch}{ch}
\DeclareMathOperator{\sh}{sh}
\AtBeginDocument{\let\oldth\th %\th existe déjà (mode texte)
\renewcommand\th{\TextOrMath{\oldth}{\operatorname{th}}}}
-{\catcode`\|=\z@ \catcode`\\=12 |gdef|bslash{\}} % commande \bslash
-\PackageWarningNoLine{frenchmath}{Command \bslash tgh in now obsolete,
- \MessageBreak
- use \bslash th instead}
-% \end{macrocode}
-% La commande |\bslash| provient du package \textsf{doc.sty} de Frank
-% Mittelbach. Elle est utilisée à la place de |\textbackslash|
-% (qui ne fonctionne pas ici).
+\DeclareMathOperator{\cosec}{cosec}
+\DeclareMathOperator{\cosech}{cosech}
-% \begin{macrocode}
\newcommand\@Oij{%
\ensuremath{\left(O, \vec{\imath}, \vec{\jmath}\,\right)}\xspace}
\newcommand\@@Oij{%
@@ -745,50 +815,53 @@
% \end{macrocode}
%
% \medskip
-% \begin{thebibliography}{19}
+% \begin{thebibliography}{25}
% \begin{raggedright}
-% \bibitem{RTIN} \emph{Lexique des règles typographiques en usage à l’Imprimerie Nationale}.
-% Édition du 26/08/2002.
-% \bibitem{IGEN} \emph{Composition des textes scientifiques}.
-% Inspection générale de mathématiques (IGEN-DESCO), 06/12/2001.
-% \url{http://mslp.ac-dijon.fr/IMG/pdf/typo_txt_sci.pdf}.
-% \bibitem{AA} \emph{Règles françaises de typographie mathématique}.
+% \bibitem{RTIN} \emph{Lexique des règles typographiques en usage à l’Imprimerie Nationale},
+% édition du 26/08/2002.
+% \bibitem{IGEN} \emph{Composition des textes scientifiques},
+% Inspection Générale de mathématiques (IGEN-DESCO), 06/12/2001.
+% \url{http://mslp.ac-dijon.fr/IMG/pdf/typo_txt_sci.pdf}
+% \bibitem{AA} \emph{Règles françaises de typographie mathématique},
% Alexandre André, 02/09/2015.
-% \url{http://sgalex.free.fr/typo-maths_fr.pdf}.
-% \bibitem{ES} \emph{Le petit typographe rationnel}. Eddie Saudrais, 20/03/2000.
+% \url{http://sgalex.free.fr/typo-maths_fr.pdf}
+% \bibitem{ES} \emph{Le petit typographe rationnel}, Eddie Saudrais, 20/03/2000.
+% \url{https://www.gutenberg-asso.fr/IMG/pdf/saudrais-typo.pdf}
% \bibitem{TYPMA} \emph{Typesetting mathematics for science and technology according
% to ISO 31/XI}, Claudio Beccari, TUGboat Volume 18 (1997), \No1.
-% \url{http://www.tug.org/TUGboat/tb18-1/tb54becc.pdf}.
+% \url{http://www.tug.org/TUGboat/tb18-1/tb54becc.pdf}
% \bibitem{NIST} \emph{Typefaces for Symbols in Scientific Manuscripts}.
-% \url{https://www.physics.nist.gov/cuu/pdf/typefaces.pdf}.
+% \url{https://www.physics.nist.gov/cuu/pdf/typefaces.pdf}
% \bibitem{ICTNS} \emph{On the Use of Italic and up Fonts for Symbols in Scientific Text},
% I.M.~Mills and W.V.~Metanomski, ICTNS (Interdivisional Committee on Terminology,
% Nomenclature and Symbols), dec 1999.
-%\url{https://old.iupac.org/standing/idcns/italic-roman_dec99.pdf}.
-% \bibitem{COMP} \emph{\LaTeX\ Companion}. Frank Mittelbach, Michel Goossens,
+%\url{https://old.iupac.org/standing/idcns/italic-roman_dec99.pdf}
+% \bibitem{COMP} \emph{\LaTeX\ Companion}, Frank Mittelbach, Michel Goossens,
% 2\ieme édition, Pearson Education France, 2005.
-% \bibitem{LSHORT} \emph{The Not So Short Introduction to \LaTeXe}. Manuel \LaTeX\
-% de Tobias Oetiker, Hubert Partl, Irene Hyna et Elisabeth Schlegl, CTAN, v6.4 09/03/2021.
-% \url{http://tug.ctan.org/info/lshort/english/lshort.pdf}.
-% \bibitem{MAFR} \emph{La distribution \textsf{mafr}}. Christian Obrecht,
+% \bibitem{LSHORT} \emph{The Not So Short Introduction to \LaTeXe},
+% Tobias Oetiker, Hubert Partl, Irene Hyna et Elisabeth Schlegl, CTAN, v6.4 09/03/2021.
+% \url{http://tug.ctan.org/info/lshort/english/lshort.pdf}
+% \bibitem{MAFR} \emph{La distribution \textsf{mafr}}, Christian Obrecht,
% CTAN, v1.0 17/09/2006.
-% \bibitem{FRM} \emph{L'extension \textsf{tdsfrmath}}. Yvon Henel,
+% \bibitem{FRM} \emph{L'extension \textsf{tdsfrmath}}, Yvon Henel,
% CTAN, v1.3 22/06/2009.
-% \bibitem{FOUR} \textsf{Fourier-GUT\hspace{-0.1em}\emph{enberg}}.
+% \bibitem{FOUR} \textsf{Fourier-GUT\hspace{-0.1em}\emph{enberg}},
% Michel Bovani, CTAN, v1.3 30/01/2005.
-% \bibitem{DESIGN} \emph{The \textsf{mathdesign} package}.
+% \bibitem{DESIGN} \emph{The \textsf{mathdesign} package},
% Paul Pichaureau, CTAN, v2.31 29/08/2013.
-% \bibitem{KPF} \emph{\textsf{Kp-Fonts} -- The Johannes Kepler project}.
+% \bibitem{KPF} \emph{\textsf{Kp-Fonts} -- The Johannes Kepler project},
% Christophe Caignaert, CTAN, v3.34 20/09/2022.
% \bibitem{ALPHA} \emph{The \textsf{textalpha} package}
-% (partie de l'extension \textsf{greek-fontenc}). Günter Milde, CTAN, v2.1 14/06/2022.
-% \bibitem{UPGREEK} \emph{The \textsf{upgreek} package for \LaTeXe}. Walter Schmidt, CTAN,
+% (partie de l'extension \textsf{greek-fontenc}), Günter Milde, CTAN, v2.1 14/06/2022.
+% \bibitem{LGR} \emph{The \textsf{lgrmath} package}, Jean-François B., CTAN,
+% v1.0 16/11/2022.
+% \bibitem{UPGREEK} \emph{The \textsf{upgreek} package for \LaTeXe}, Walter Schmidt, CTAN,
% v2.0 12/03/2003.
-% \bibitem{ISOM} \emph{\textsf{isomath} -- Mathematical style for science and technology}.
+% \bibitem{ISOM} \emph{\textsf{isomath} -- Mathematical style for science and technology},
% Günter Milde, CTAN, v0.6.1 2012/09/04.
-% \bibitem{PMISO} \emph{\textsf{PM-ISOmath}, The Poor Man ISO math bundle},
+% \bibitem{PMISO} \emph{\textsf{PM-ISOmath} -- The Poor Man ISO math bundle},
% Claudio Beccari, CTAN, v1.2.00 2021/08/04.
-% \bibitem{BABEL} \emph{A Babel language definition file for French}. Extension \LaTeX\
+% \bibitem{BABEL} \emph{A Babel language definition file for French}, extension \LaTeX\
% \textsf{babel-french} de Daniel Flipo, CTAN, v3.5c 14/09/2018.
% \bibitem{ICOMMA} \emph{The \textsf{icomma} package for \LaTeXe}.
% Walter Schmidt, CTAN, v2.0 10/03/2002.
@@ -796,9 +869,11 @@
% CTAN, v1.0 10/02/2005.
% \bibitem{BECC} \emph{Intelligent commas}. Claudio Beccari, The Prac\TeX\ Journal,
% 2011, No.\@1.
-% \url{https://tug.org/pracjourn/2011-1/beccari/Intcomma.pdf}.
-% \bibitem{MIS} \emph{\textsf{mismath} -- Miscellaneus mathematical macros}.
-% Antoine Missier, CTAN, v2.0 11/11/2022.
+% \url{https://tug.org/pracjourn/2011-1/beccari/Intcomma.pdf}
+% \bibitem{BRACKETS} \emph{Intelligent brackets -- The \textsf{ibrackets} package},
+% Antoine Missier, v1.0 19/12/2022.
+% \bibitem{MIS} \emph{\textsf{mismath} -- Miscellaneus mathematical macros},
+% Antoine Missier, CTAN, v2.1 26/12/2022.
% \end{raggedright}
% \end{thebibliography}
diff --git a/macros/latex/contrib/frenchmath/frenchmath.ins b/macros/latex/contrib/frenchmath/frenchmath.ins
index f5a146f156..65dbcdfa9c 100644
--- a/macros/latex/contrib/frenchmath/frenchmath.ins
+++ b/macros/latex/contrib/frenchmath/frenchmath.ins
@@ -28,7 +28,7 @@ the LaTeX Project Public License, either version 1.3 of this license
or (at your option) any later version. The latest version of this
license is in:
- http://www.latex-project.org/lppl.txt
+http://www.latex-project.org/lppl.txt
and version 1.3 or later is part of all distributions of LaTeX version
2005/12/01 or later.
diff --git a/macros/latex/contrib/frenchmath/frenchmath.pdf b/macros/latex/contrib/frenchmath/frenchmath.pdf
index 08825a28e0..e3dfbf5785 100644
--- a/macros/latex/contrib/frenchmath/frenchmath.pdf
+++ b/macros/latex/contrib/frenchmath/frenchmath.pdf
Binary files differ
diff --git a/macros/latex/contrib/mismath/mismath.dtx b/macros/latex/contrib/mismath/mismath.dtx
index b7ffaeb874..2f64b37985 100644
--- a/macros/latex/contrib/mismath/mismath.dtx
+++ b/macros/latex/contrib/mismath/mismath.dtx
@@ -20,7 +20,7 @@
%<*package>
\NeedsTeXFormat{LaTeX2e}[2005/12/01]
\ProvidesPackage{mismath}
- [2022/11/11 v2.0 .dtx mismath file]
+ [2022/12/26 v2.1 .dtx mismath file]
%</package>
%<*driver>
\documentclass{ltxdoc}
@@ -28,7 +28,7 @@
\usepackage[T1]{fontenc}
%\usepackage{textcomp}
\usepackage[english]{babel}
-\usepackage[charter]{mathdesign} % if changing font, modify 2.1 (3rd §)
+\usepackage[charter]{mathdesign} % in case of font change, modify 2.1 (3rd §)
\usepackage{mismath}
%\usepackage{amssymb} incompatible with mathdesign
\usepackage{multicol}
@@ -42,9 +42,6 @@
\DeclareMathSymbol{\mypi}\mathalpha{UpGr}{"70}
% For showing original \i and \j in text mode:
\DeclareTextFontCommand{\extrafont}{\fontfamily{lmr}\selectfont}
-% For an example in this doc we substitute [ and ] by \OB and \CB:
-\DeclareMathSymbol{\OB}\mathclose{operators}{093}
-\DeclareMathSymbol{\CB}\mathopen{operators}{091}
\DisableCrossrefs
%\CodelineIndex
@@ -66,7 +63,7 @@
%</driver>
% \fi
%
-%% \CheckSum{440}
+%% \CheckSum{454}
%
% \CharacterTable
% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
@@ -85,38 +82,74 @@
% Right brace \} Tilde \~}
%
% \changes{v0.1}{2011/12/27}{First personal version}
-% \changes{v1.0}{2019/04/11}{Initial published version, creating dtx and ins files}
-% \changes{v1.1}{2019/04/20}{Some forgotten french 'et' -> 'and', citecolor=blue}
-% \changes{v1.1}{2019/04/20}{Changing the default font for pinumber Euler -> Symbol}
-% \changes{v1.2}{2019/04/26}{Works fine with beamer now,
-% AtBeginDocument for enumber, inumber, jnumber,
-% creating general @moperator macro, using mathup instead of mathrm}
-% \changes{v1.2}{2019/04/27}{Added mathtools package, font definition Roman -> up,
-% changes in documentation, removing the PEroman macro}
-% \changes{v1.3}{2019/05/05}{Using bslash in the internal @mwarning macro,
-% loading of mathfixs package}
-% \changes{v1.3}{2019/05/08}{Many corrections in documentation}
-% \changes{v1.4}{2019/05/22}{Changing font definition up -> UpSh,
-% due to incompatibility with unicode-math}
-% \changes{v1.5}{2019/05/30}{A solution for using mul with frac, addition of paren macro}
-% \changes{v1.5}{2019/06/22}{small corrections in documentation}
-% \changes{v1.6}{2019/09/06}{Removing mathfixs package}
-% \changes{v1.7}{2019/12/27}{Adding a table of contents to the documentation}
-% \changes{v1.8}{2020/11/15}{Incompatibility and solution mentioned when using i
-% with accent in beamer titles small changes in documentation}
-% \changes{v1.9}{2020/10/17}{UpSh replaced by "operators" font in math mode,
-% PackageWarning "command exist" replaced by PackageWarningNoLine,
-% and also used by commands with arguments,
-% medspace replaced by thickspace in the \bslash lfrac command,
-% changing font in documentation, now Palatino (mathpazo)}
-% \changes{v1.10}{2020/10/25}{\bslash pinumber command code adapted to avoid
-% incompatibility with the new release of frenchmath,
-% default option (in upgreek) changed from Symbol to Euler.}
-% \changes{v2.0}{2022/11/11}{pinumber command has been improved using by default
-% LGR encoding, it is no longer compatible with the older,
-% paren command has been removed,
-% hvect and hlbar have been slighlty modified (phantom t instead of phantom h),
-% several changes in documentation, now using the charter font (mathdesign).}
+%
+% \changes{v1.0}{2019/04/11}{
+% - Initial published version: creating dtx and ins files}
+%
+% \changes{v1.1}{2019/04/20}{
+% - Some forgotten french 'et' -> 'and', citecolor=blue,
+% - changing the default font for pinumber Euler -> Symbol}
+%
+% \changes{v1.2}{2019/04/26}{
+% - Works fine with beamer now,
+% - AtBeginDocument for enumber, inumber, jnumber,
+% - creating general @moperator macro,
+% - using mathup instead of mathrm}
+% \changes{v1.2}{2019/04/27}{
+% - Added mathtools package,
+% - font definition Roman -> up,
+% - changes in documentation,
+% - removing the PEroman macro}
+%
+% \changes{v1.3}{2019/05/05}{
+% - Using bslash in the internal @mwarning macro,
+% - loading of mathfixs package}
+% \changes{v1.3}{2019/05/08}{
+% - Many corrections in documentation}
+%
+% \changes{v1.4}{2019/05/22}{
+% - Changing font definition up -> UpSh, due to incompatibility with unicode-math}
+%
+% \changes{v1.5}{2019/05/30}{
+% - A solution for using mul with frac -> braces,
+% - addition of paren macro}
+% \changes{v1.5}{2019/06/22}{
+% - Small corrections in documentation}
+%
+% \changes{v1.6}{2019/09/06}{
+% - Removing mathfixs package, problems with fractions}
+%
+% \changes{v1.7}{2019/12/27}{
+% - Adding a table of contents to the documentation}
+%
+% \changes{v1.8}{2020/11/15}{
+% - Incompatibility mentioned when using `i' with accent in beamer titles -> use \^i,
+% - small changes in documentation}
+%
+% \changes{v1.9}{2020/10/17}{
+% - UpSh replaced by "operators" font in math mode,
+% - PackageWarning `command exist' replaced by PackageWarningNoLine,
+% - medspace replaced by thickspace in the lfrac command,
+% - changing font in documentation, lmodern -> Palatino (mathpazo)}
+%
+% \changes{v1.10}{2020/10/25}{\
+% - pinumber command code adapted to avoid incompatibility with the new frenchmath,
+% - default option (in upgreek) changed from Symbol to Euler.}
+%
+% \changes{v2.0}{2022/11/11}{
+% - pinumber command has been improved to use other Greek letter packages,
+% (and by default LGR encoding), it is no longer compatible with the older,
+% - paren command has been removed,
+% - hvect and hlbar have been slighlty modified (phantom t instead of phantom h),
+% - several changes in documentation,
+% - now using the Charter font (mathdesign)}
+%
+% \changes{v2.1}{2022/12/26}{
+% - Improved management of square brackets with the ibrackets package,
+% - new macros codim, sinc, var, eqdef*,
+% - removing the systematic warning for paren command
+% - a small change in norm command -> bars in small size
+% - several changes in documentation}
%
% \GetFileInfo{mismath.sty}
%
@@ -124,7 +157,7 @@
% corresponds to \textsf{mismath}~\fileversion, dated \filedate.
% Thanks to François Bastouil for help in English translation.}}
% \author{Antoine Missier \\ \texttt{antoine.missier@ac-toulouse.fr}}
-% \date{November 11, 2022}
+% \date{December 26, 2022}
%
% \maketitle
% \tableofcontents
@@ -147,7 +180,7 @@
% and we provide a few more macros related to vectors with arrows,
% in particular to improve the typesetting of the norm: $\norm{\vect{AB}}$
% instead of \LaTeX\ version $\lVert\vect{AB}\rVert$ which is not vertically adjusted,
-% or worse $\left\Vert \vect{AB} \right\Vert$.
+% or worse $\left\Vert \vect{AB} \right\Vert$ (and even ugly with Latin Modern font family).
%
% \smallskip
% The package also provides other macros for:
@@ -180,13 +213,14 @@
%
% Another package,
% \textsf{mathtools} by Morten Høgholm and Lars Madsen~\cite{TOOL}
-% is also loaded. It provides many useful macros.
+% is also loaded. It provides many useful macros and improvements of \textsf{amsmath} package.
%
% \medskip
% A recommendation, seldom observed, is to typeset uppercase Greek letters in italic shape
% like other variables~\cite{ICTNS}. This is automatically done with the packages
-% \textsf{fixmath} by Walter Schmidt~\cite{FIXM}
-% or \textsf{isomath} by Günter Milde~\cite{ISOM} and many others
+% \textsf{fixmath} by Walter Schmidt~\cite{FIXM},
+% \textsf{isomath} by Günter Milde~\cite{ISOM}
+% or \textsf{pm-isomath} by Claudio Beccari~\cite{PMISO} and optionally with many others
% (for instance \textsf{mathpazo} or \textsf{mathptmx} with the option \texttt{slantedGreek}),
% but this feature is not implemented here because this rule is conflicting
% to the one used in France where all mathematics capitals
@@ -250,10 +284,13 @@
% $\e$ and $\i$~\cite{TYPMA}.
% Several packages allow to typeset mathematical Greek letters in upright shape,
% let us mention \textsf{upgreek}~\cite{GREEK}, \textsf{mathdesign}~\cite{DESIGN}
-% (used here), \textsf{kpfonts}, \textsf{fourier}, \textsf{libertinust1math},
-% \textsf{pxgreeks}, \textsf{txgreeks}, \textsf{libgreek} etc.
+% (used here), \textsf{kpfonts}~\cite{KPF}, \textsf{fourier}~\cite{FOUR},
+% \textsf{libertinust1math},
+% \textsf{pxgreeks}, \textsf{txgreeks}, \textsf{libgreek}, etc.
+% A special mention to \textsf{lgrmath} of Jean-François Burnol~\cite{LGR}
+% which allow to use, in math mode, any Greek LGR-encoded font.
% These packages provide commands like |\uppi| (\textsf{upgreek}),
-% |\piup| (\textsf{mathdesign}, \textsf{kpfonts}),
+% |\piup| (\textsf{mathdesign}, \textsf{kpfonts}, \textsf{lgrmath}),
% |\otherpi| (\textsf{fourier}), etc.\footnote{They also have options to
% typeset all the Greek lowercase letters in upright shape by default,
% but this in not our goal here.}
@@ -271,9 +308,9 @@
%
% When no argument is given, |\pinumber| defines |\pi| with an LGR encoding of Greek letters
% to produce $\mypi$. It looks the same as the one supplied with
-% the \textsf{textalpha} package by Günter Milde~\cite{ALPHA}.
+% Günter Milde's \textsf{textalpha} package~\cite{ALPHA}.
% This $\mypi$ is particularly suitable
-% for use with the default Computer Modern or Latin Modern font\footnote{This
+% for use with the default Computer Modern or Latin Modern font family\footnote{This
% default $\mypi$ doesn't fit well with many text fonts, more bold than Computer Modern;
% the \textsf{upgreek} package~\cite{GREEK} provides often a better $\uppi$
% and it has also a \texttt{Symbol} option (using Adobe Symbol font)
@@ -289,10 +326,9 @@
% the definition will take effect only if this macro is not defined before
% by another package.},
% produces vectors with arrows
-% (thanks to the \textsf{esvect} package by Eddie Saudrais\footnote{\textsf{esvect}
+% (thanks to the \textsf{esvect} package of Eddie Saudrais\footnote{\textsf{esvect}
% provides \texttt{\bslash vv} macro used by \texttt{\bslash vect}.})
-% which are much more elegant than those produced by \LaTeX\ |\overrightarrow| command
-% (giving $\overrightarrow{AB}$).
+% which are more elegant than those produced by \LaTeX's |\overrightarrow| command.
% The \textsf{esvect} package has an optional argument
% (one letter between \texttt{a} and \texttt{h}) defining
% the required type of arrow (see~\cite{VECT}).
@@ -371,12 +407,12 @@
% (rather than \texttt{\bslash}$\mid$) or |\left\Vert| and |\right\Vert|
% for delimiters adapting to the content. Unfortunately, these delimiters
% are always vertically centered, relatively to the middle of the base line,
-% whereas vectors with arrows are asymmetric objects,
-% the height above the middle of the base line
-% being superior to the depth under it.
-% The code |$\norm{\vec{h}}$| raises the double bar to produce $\norm{\vec{h}}$.
+% whereas vectors with arrows are asymmetric objects.
+% The code |$\norm{\vec{h}}$| raises a smaller double bar to produce $\norm{\vec{h}}$
+% instead of $\left\Vert \vec{h} \right\Vert$.
% Let's notice that the height of the bars don't adjust to content,
-% but however to context: main text, subscripts or exponents.
+% but however to context: main text, subscripts or exponents,
+% e.g. $\e^{\norm{\vec{h}}}$.
%
% \subsection{Standard operator names}
%
@@ -409,14 +445,16 @@
% This command can also stand for \emph{distance} (hence its name):
% \[\lambda\di(A,\mathcal{F})+\mu\di(B,\mathcal{H}).\]
%
-% \DescribeMacro{\P} \DescribeMacro{\E} \DescribeMacro{\V}
+% \DescribeMacro{\P} \DescribeMacro{\E} \DescribeMacro{\PEupright} \DescribeMacro{\V}
% To refer to probability\footnote{\LaTeX\ provides
% also \texttt{\bslash Pr} which gives $\Pr$.}
% and expectation the proper use is to typeset capital letters $\P$, $\E$
-% in upright shape as for any standard function identifier.
+% in roman as for any standard function identifier.
% This is obtained with |\P| and |\E|.
-% Variance is normally denoted by $\Var$ (see further),
-% but in some countries we can find $\V$ produced by |\V|.
+% In the same way as for $\i$ and $\j$, you can use |\PEupright| in the preamble
+% to avoid typing many |\P| or |\E|.
+% Variance is generally denoted by $\var$ or $\Var$ (see table below),
+% but some authors prefer to use $\V$, produced by |\V|.
%
% \medskip
% \DescribeMacro{\Par}
@@ -438,17 +476,18 @@
% which has to be called in the preamble.
%
% \medskip
-% The following operator names are also defined in \textsf{mismath}:
+% The following standard operator names are defined in \textsf{mismath}:
% \begin{center}
% \begin{tabular}{rlrlrl}
-% |\adj| & $\adj$ \qquad\mbox{} & |\erf| & $\erf$ \qquad\mbox{} & |\rank| & $\rank$ \\
-% |\Aut| & $\Aut$ & |\grad| & $\grad$ & |\Re| & $\Re$ \\
-% |\Conv| & $\Conv$ & |\id| & $\id$ & |\rot| & $\rot$ \\
-% |\cov| & $\cov$ & |\Id| & $\Id$ & |\sgn| & $\sgn$ \\
-% |\Cov| & $\Cov$ & |\im| & $\im$ & |\spa| & $\spa$ \\
-% |\curl| & $\curl$ & |\Im| & $\Im$ & |\tr| & $\tr$ \\
-% |\divg| & $\divg$ & |\lb| & $\lb$ & |\Var| & $\Var$ \\
-% |\End| & $\End$ & |\lcm| & $ \lcm$ & |\Zu| & $\Zu$
+% |\adj| & $\adj$ \qquad\mbox{} & |\erf| & $\erf$ \qquad\mbox{} & |\Re| & $\Re$ \\
+% |\Aut| & $\Aut$ & |\grad| & $\grad$ & |\rot| & $\rot$ \\
+% |\codim| & $\codim$ & |\id| & $\id$ & |\sgn| & $\sgn$ \\
+% |\Conv| & $\Conv$ & |\Id| & $\Id$ & |\sinc| & $\sinc$ \\
+% |\cov| & $\cov$ & |\im| & $\im$ & |\spa| & $\spa$ \\
+% |\Cov| & $\Cov$ & |\Im| & $\Im$ & |\tr| & $\tr$ \\
+% |\curl| & $\curl$ & |\lb| & $\lb$ & |\var| & $\var$ \\
+% |\divg| & $\divg$ & |\lcm| & $ \lcm$ & |\Var| & $\Var$ \\
+% |\End| & $\End$ & |\rank| & $\rank$ & |\Zu| & $\Zu$
% \end{tabular}
% \end{center}
%
@@ -456,15 +495,17 @@
% rather used in Europe), are written with an arrow on the top.
% When |\boldvect| is activated, they are typeset in bold style:
% $\boldvect \grad, \curl, \rot$.
-% For the covariance and the identity function,
+% For the variance, the covariance and the identity function,
% two notations are proposed, with or without a first capital letter,
% because they are both very common.
% On the other hand, ``$\im$'' stands for the image of a linear transformation
% (like ``$\ker$'' for the kernel)
-% but ``$\Im$'' is the imaginary part of a complex number.
-% Notice that |\div| and |\span| already exist
-% and haven't been redefined, therefore the |\divg| and |\spa| macros;
-% |\Z| is used otherwise (see further), therefore |\Zu|,
+% whereas ``$\Im$'' is the imaginary part of a complex number.
+% Notice that |\div| already exist ($\div$) and |\span| is a \TeX\ primitive
+% (used in |\multicolumn|);
+% they haven't been redefined, therefore the macros |\divg| (divergence)
+% and |\spa| (span of a set of vectors) ;
+% |\Z| is used for the set of integers (see \ref{aliases}), therefore we used |\Zu|,
% to designate the center of a group: $\Zu(G)$ (from German Zentrum).
%
%\medskip
@@ -491,7 +532,7 @@
% |\bigO| or |\bigo| and |\lito| commands:
% \[ n^2+\bigO(n\log n) \txt{or} n^2+\bigo(n\log n)\txt{and} \e^x=1+x+\lito(x^2).\]
%
-% \subsection{A few useful aliases}
+% \subsection{A few useful aliases} \label{aliases}
%
% In the tradition of Bourbaki and D.~Knuth, proper use requires
% that classic sets of numbers are typeset in bold roman:
@@ -507,7 +548,7 @@
% \DescribeMacro{\mathset}
% The |\mathset| command enables to change the behavior of all these macros in a global way:
% by default, |\mathset| is an alias for |\mathbf|, but if you prefer openwork letters,
-% just place |\renewcommand\mathset{\mathbb}| in the preamble,
+% just place |\renewcommand\mathset{\mathbb}| where you want, for instance in the preamble,
% after loading \textsf{amsfonts} package (which provides the ``blackboard bold'' typeface,
% also loaded by \textsf{amssymb}).
%
@@ -523,12 +564,12 @@
% $\zeta(s)=\sum_{n=1}^{\infty }\frac{1}{n^s}$ with
% \[\zeta(s)=\sum_{n=1}^{\infty}\frac{1}{n^s}.\]
%
+% \DescribeMacro{\dlim} \DescribeMacro{\dsum} \DescribeMacro{\dprod}
+% \DescribeMacro{\dcup} \DescribeMacro{\dcap}
% With in-line math mode, displaymath behavior can be forced with |\displaystyle|
% or its alias |\ds|, but then, all the rest of the current mathematical
% environment will be set in displaymath mode too (in the previous example,
% the fraction will be expanded).
-% \DescribeMacro{\dlim} \DescribeMacro{\dsum} \DescribeMacro{\dprod}
-% \DescribeMacro{\dcup} \DescribeMacro{\dcap}
% Just as the \textsf{amsmath} command |\dfrac|
% only transforms the required fraction in display style, we can limit
% the display style effect to the affected symbol, by using the following macros:
@@ -546,13 +587,15 @@
% is better than $\lbar{z+z'}=\lbar{z}+\lbar{z'}$.
% \end{center}
%
-% \DescribeMacro{\eqdef}
+% \DescribeMacro{\eqdef} \DescribeMacro{\eqdef*}
% The |\eqdef| macro writes equality symbol topped with ``def''
-% (thanks to the \LaTeX\ command |\stackrel|):\\
-% \begin{minipage}[t]{8cm}
+% or with ``$\scriptstyle \Delta$'' for |\eqdef*|
+% (thanks to the \LaTeX\ command |\stackrel|):
+%
+% \noindent\begin{minipage}[t]{8cm}
% \begin{verbatim}
-% $ \e^{\i\theta} \eqdef
-% \cos\theta + \i\sin\theta $
+%$ \e^{\i\theta} \eqdef
+% \cos\theta + \i\sin\theta $
% \end{verbatim}
% \end{minipage}
% \begin{minipage}{6cm}
@@ -565,7 +608,7 @@
% provides a new improved version of \texttt{\bslash underbrace} command
% (as many other usefull macros);
% it is loaded by \textsf{mismath}.}, making source code more compact.\\[2ex]
-% \begin{minipage}{6.75cm}
+% \begin{minipage}{7.5cm}
% \begin{verbatim}
%$ (QAP)^n = \unbr{QAP\mul QAP\mul
% \cdots\mul QAP}_{n\text{ times}} $
@@ -578,7 +621,7 @@
% \DescribeMacro{\iif}
% |\iif| is an alias for ``\iif'', to be used in text mode.
%
-% \subsection{Improving some spacing in mathematical formulas}
+% \subsection{Improved spacing in mathematical formulas}
%
% \DescribeMacro{\then}
% The |\then| macro produces the symbol $\Longrightarrow$ surrounded by large spaces
@@ -608,7 +651,7 @@
% the space may be too large on one side of |\mul|.
% To get the same amount of space on the two sides of |\mul|,
% you can use thin negative spaces |\!|
-% or enclose the function or the structure with brackets:
+% or enclose the function or the structure with braces:
% \begin{center}
% $x\mul{\sin x}$, obtained with |x\mul{\sin x}|, is slightly better than $x\mul\sin x$.\\[1ex]
% |$\sin\!{\left( \frac{\pi}{3} \right)} \mul 2$| gives\\
@@ -629,7 +672,7 @@
% slightly closer to the right parenthesis\footnote{This macro gives bad
% results with normal sized parenthesis.}. Compare:
% \[ \e^a \sim\pow{1+\frac{a}{n}}{n} \txt{may be better than}
-% \e^a \sim\left(1+\frac{a}{n}\right)^n.\]
+% \e^a \sim\left(1+\frac{a}{n}\right)^{n}.\]
%
% \DescribeMacro{\abs}
% Absolute value (or modular for a complex number) should be typeset with
@@ -656,31 +699,44 @@
% \[ \lbar{Z} = \lfrac{\lbar{z_1-z_2}}{\lbar{z_1+z_2}} \]
% \end{minipage}
%
-% \DescribeMacro{[ ]}
-% Open intervals may be represented with parenthesis but sometimes we find also
-% brackets. In that case the space before them is often unsuitable.
-% Brackets symbols $[$ and $]$ have been redefined for mathematical mode\footnote{We
-% could also use the macro \texttt{\bslash DeclarePairedDelimiters} from
-% the \textsf{mathtools} package ; let us also mention
-% the \textsf{interval} package~\cite{INT} with his
-% \texttt{\bslash interval} macro.}:
-% \begin{center}
-% |$x\in ]0,\pi[ \cup ]2\pi,3\pi[$| \\[1ex]
-% $\begin{cases}
-% x\in \OB 0,\pi \CB \cup \OB2\pi, 3\pi \CB &\text{ without \textsf{mismath}}\\
-% x\in ]0, \pi[ \cup ]2\pi, 3\pi[ &\text{ with \textsf{mismath}}
-% \end{cases}$
-% \end{center}
-% In our code, $[$ and $]$ symbols are not defined anymore as delimiters.
+% \DescribeMacro{brackets}
+% Open intervals are usually represented with parenthesis, e.g.\@ $(0, +\infty)$,
+% but sometimes we find also
+% brackets, for example in French mathematics.
+% In that case the space around them is often unsuitable,
+% e.g.\@ $x \in \mathclose{]} 0, +\infty[$.
+%
+% We have redefine brackets in the \textsf{ibrackets} package~\cite{BRACKET}
+% which is loaded by \textsf{mismath}.
+% Simply type |$x\in ]-\pi,0[ \cup ]2\pi,3\pi[$| to get
+% \begin{align*}
+% x\in ]-\pi, 0[ \cup ]2\pi, 3\pi[ &\mbox{\quad with \textsf{ibrackets}}, \\
+% \mbox{instead of \quad}
+% x\in \mathclose{]}-\pi, 0 \mathopen{[} \cup \mathclose{]} 2\pi, 3\pi \mathopen{[}
+% &\mbox{\quad without \textsf{ibrackets}}.
+% \end{align*}
+% In our code, $[$ and $]$ symbols become ``active''
+% and are not defined by default as delimiters.
% Thereby a line break could occur between the two brackets, but
% it is always possible to transform them
% into delimiters with |\left| and |\right|.
-% Another problem occurs when the left boundary contains an operator sign ;
-% the spaces surrounding the operator will then be too large :
-% |$[-1, 1]$| yields $[-1, 1]$ instead of $[{-1}, 1]$\footnote{A problem pointed out
-% by J.F.\@ Burnol, which does not detract from the interest of this redefinition.}.
-% To get correct spaces, we have to surround
-% the sign $-$ or $-1$ by braces, or use |\left| and |\right|.
+%
+% With \textsf{ibrackets}: a bracket become an ordinary character
+% but an open delimiter when it is immediately followed by a + or - character.
+% Thus, when the left boundary contains an operator sign,
+% \emph{you don't have to leave a space between the first bracket and the sign},
+% otherwise, the spaces surrounding the operator will be too large:
+% e.g.\@ |$x \in ] -\infty, 0]$| yields $x \in ] -\infty, 0]$.
+% Contrariwise, when you want to write algebra on intervals then
+% \emph{you must leave a blank space between the second bracket and the} +/-
+% \emph{operations},
+% e.g.\@ |$[a, b] + [c, d]$| yields $[a, b] + [c, d]$
+% but |$[a, b]+ [c, d]$| yields $[a, b]+ [c, d]$.
+%
+% Let us also mention other approaches e.g.\@ |\DeclarePairedDelimiters|, a macro from
+% the \textsf{mathtools} package~\cite{TOOL}, or
+% the \textsf{interval} package~\cite{INT} with his
+% |\interval| macro. Nevertheless our solution is lighter.
%
% \subsection{Environments for systems of equations and small matrices}
%
@@ -819,19 +875,27 @@
\RequirePackage{ifthen}
\RequirePackage{xspace}
\RequirePackage{mathtools}
+\RequirePackage{ibrackets}
+
% \end{macrocode}
% The above conditional packages loading avoids ``option clash'' errors if the packages
-% have been previously loaded with (other) options.
+% have been previously loaded with other options.
%
% \medskip
-% The three following internal commands are meta commands for a
-% conditional macro definition with a warning message if the macro already exists.
% \DescribeMacro{\bslash}
-% The |\bslash| macro comes from \textsf{doc.sty} package by Frank Mittelbach.
+% The |\bslash| macro comes from Frank Mittelbach's \textsf{doc.sty} package.
% It can also be used in other documents instead of |\textbackslash|
-% (which doesn't work here).
+% (which doesn't work inside warnings).
% \begin{macrocode}
{\catcode`\|=\z@ \catcode`\\=12 |gdef|bslash{\}} % \bslash command
+
+% \end{macrocode}
+% \medskip
+% \DescribeMacro{\@mwarning} \DescribeMacro{\@mmacro} \DescribeMacro{\@moperator}
+% The three following internal macros are meta commands for a
+% conditional macro definition with a warning message if the macro already exists.
+% They could be useful in other packages.
+% \begin{macrocode}
\newcommand\@mwarning[1]{
\PackageWarningNoLine{mismath}{
Command \bslash #1 already exist and will not be redefined}
@@ -892,7 +956,7 @@
\PackageWarningNoLine{mismath}{
\bslash pinumber command has changed since v2.0,
\MessageBreak
- option #1 must be a command name \MessageBreak
+ option #1 must be a valid command name \MessageBreak
(look at the documentation),
but command \bslash #1 is undefined, \MessageBreak
I cannot use it for replacement to \bslash pi.
@@ -913,8 +977,8 @@
\newcommand*{\hvec}[1]{\vec{\vphantom{t}#1}}
\newcommand*{\@norm}[1]{
- \mbox{\raisebox{1.75pt}{$\bigl\Vert$}} #1
- \mbox{\raisebox{1.75pt}{$\bigr\Vert$}} }
+ \mbox{\raisebox{1.75pt}{\small$\bigl\Vert$}} #1
+ \mbox{\raisebox{1.75pt}{\small$\bigr\Vert$}} }
% works better than with relative length
\newcommand*{\@@norm}[1]{
\mbox{\footnotesize\raisebox{1pt}{$\Vert$}} #1
@@ -942,6 +1006,7 @@
\@moperator{\adj}{adj}
\@moperator{\Aut}{Aut}
+\@moperator{\codim}{codim}
\@moperator{\Conv}{Conv}
\@moperator{\cov}{cov}
\@moperator{\Cov}{Cov}
@@ -962,8 +1027,10 @@
\let\oldRe\Re \renewcommand{\Re}{\operatorname{Re}}
\@mmacro{rot}{\operatorname{\vect{\mathup{rot}}}}
\@moperator{\sgn}{sgn}
+\@moperator{\sinc}{sinc}
\@moperator[spa]{\spa}{span}
\@moperator{\tr}{tr}
+\@moperator{\var}{var}
\@moperator{\Var}{Var}
\@moperator[Zu]{\Zu}{Z}
@@ -1001,7 +1068,9 @@
\@ifundefined{hlbar}{
\providecommand*{\hlbar}[1]{\overline{\vphantom{t}#1}}}{
\@mwarning{hlbar} }
-\@mmacro{eqdef}{\stackrel{\mathup{def}}{=}}
+\newcommand\@eqdef{\stackrel{\mathup{def}}{=}}
+\newcommand\@@eqdef{\stackrel{\Delta}{=}}
+\@mmacro{eqdef}{\@ifstar{\@@eqdef}{\@eqdef}}
\@mmacro{unbr}{\underbrace}
\@mmacro{iif}{if and only if\xspace}
@@ -1014,8 +1083,8 @@
\providecommand*{\txt}[1]{\quad\text{#1}\quad} }{
\@mwarning{txt} }
\@mmacro{mul}{\mathord{\times}}
-\PackageWarningNoLine{mismath}{Command \bslash paren
- is no longer supported}
+\providecommand\paren{\PackageWarning{mismath}{Command
+ \bslash paren is no longer supported}}
\@ifundefined{pow}{
\providecommand*{\pow}[2]{\left( #1 \right)^{\!#2}} }{
\@mwarning{pow} }
@@ -1025,8 +1094,6 @@
\@ifundefined{lfrac}{
\providecommand*{\lfrac}[2]{\frac{\;#1\;}{\;#2\;}} }{
\@mwarning{lfrac} }
-\DeclareMathSymbol{]}\mathord{operators}{093} % originally \mathclose
-\DeclareMathSymbol{[}\mathord{operators}{091} % originally \mathopen
\newcommand{\systemstretch}{1.2}
\newcommand{\systemsep}{\medspace}
@@ -1056,52 +1123,56 @@
}
% \end{macrocode}
% \bigskip
-% \begin{thebibliography}{17}
+% \begin{thebibliography}{23}
% \begin{raggedright}
% \bibitem{TYPMA} \emph{Typesetting mathematics for science and technology according
% to ISO 31/XI}, Claudio Beccari, TUGboat Volume 18 (1997), No.~1.
% \url{http://www.tug.org/TUGboat/tb18-1/tb54becc.pdf}.
-% \bibitem{NIST} \emph{Typefaces for Symbols in Scientific Manuscripts}.
+% \bibitem{NIST} \emph{Typefaces for Symbols in Scientific Manuscripts},
% \url{https://www.physics.nist.gov/cuu/pdf/typefaces.pdf}.
% \bibitem{SI} \emph{Guide for the Use of the International System of Units (SI)},
% NIST (National Institute of Standards and Technology), updated March 4, 2020
% \url{https://www.nist.gov/pml/special-publication-811}.
% \bibitem{ICTNS} \emph{On the Use of Italic and up Fonts for Symbols in Scientific Text},
% I.M.~Mills and W.V.~Metanomski, ICTNS (Interdivisional Committee
-% on Terminology, Nomenclature and Symbols), dec 1999.
+% on Terminology, Nomenclature and Symbols), dec 1999,
% \url{https://old.iupac.org/standing/idcns/italic-roman_dec99.pdf}.
-% \bibitem{VECT} \emph{Typesetting vectors with beautiful arrow with \LaTeXe}.
-% \textsf{esvect} package by Eddie Saudrais, CTAN, v1.3 2013/07/11.
-% \bibitem{AMS} \emph{The \textsf{amsmath} package}. Frank Mittelbach, Rainer Schöpf,
-% Michael Downes, Davis M.~Jones, David Carlisle, CTAN, v2.17b 2018/12/01.
-% \bibitem{TOOL} \emph{The \textsf{mathtool} package}. Morten Høgholm, Lars Madsen, CTAN,
-% v1.21 2018/01/08.
+% \bibitem{VECT} \emph{\textsf{esvect} -- Typesetting vectors with beautiful
+% arrow with \LaTeXe}, Eddie Saudrais, CTAN, v1.3 2013/07/11.
+% \bibitem{AMS} \emph{\textsf{amsmath} -- \AmS\ mathmatical facilities for \LaTeX},
+% Frank Mittelbach, Rainer Schöpf, Michael Downes, Davis M.~Jones, David Carlisle,
+% CTAN, v2.17n 2022/04/08.
+% \bibitem{TOOL} \emph{The \textsf{mathtool} package}, Morten Høgholm, Lars Madsen, CTAN,
+% v1.29 2022/06/29.
% \bibitem{FIXM} \emph{The \textsf{fixmath} package for \LaTeXe}, Walter Schmidt,
% CTAN, v0.9 2000/04/11.
% \bibitem{ISOM} \emph{\textsf{isomath} -- Mathematical style for science and technology}.
% Günter Milde, CTAN, v0.6.1 2012/09/04.
% \bibitem{PMISO} \emph{\textsf{PM-ISOmath}, The Poor Man ISO math bundle},
-% \textsf{pm-isomath} package by Claudio Beccari, CTAN, v1.2.00 2021/08/04.
+% the \textsf{pm-isomath} package by Claudio Beccari, CTAN, v1.2.00 2021/08/04.
% \bibitem{GREEK} \emph{The \textsf{upgreek} package for \LaTeXe}, Walter Schmidt,
% CTAN, v2.0 2003/02/12.
-% \bibitem{DESIGN} \emph{The \textsf{mathdesign} package}.
+% \bibitem{DESIGN} \emph{The \textsf{mathdesign} package},
% Paul Pichaureau, CTAN, v2.31 2013/08/29.
% \bibitem{ALPHA} \emph{The \textsf{textalpha} package}
-% (part of the \textsf{greek-fontenc} bundle). Günter Milde, CTAN, v2.1 14/06/2022.
-% \bibitem{KPF} \emph{\textsf{Kp-Fonts} -- The Johannes Kepler project}.
+% (part of the \textsf{greek-fontenc} bundle), Günter Milde, CTAN, v2.1 14/06/2022.
+% \bibitem{KPF} \emph{\textsf{Kp-Fonts} -- The Johannes Kepler project},
% Christophe Caignaert, CTAN, v3.34 20/09/2022.
-% \bibitem{FOUR} \textsf{Fourier-GUT\hspace{-0.1em}\emph{enberg}}.
+% \bibitem{FOUR} \textsf{Fourier-GUT\hspace{-0.1em}\emph{enberg}},
% Michel Bovani, CTAN, v1.3 30/01/2005.
+% \bibitem{LGR} \emph{The \textsf{lgrmath} package}, Jean-François B., CTAN, v1.0 2022/11/16.
% \bibitem{INT} \emph{The \textsf{interval} package}. Lars Madsen, CTAN,
% v0.4 2019/03/06.
-% \bibitem{SYST} \emph{L'extension pour \TeX\ et \LaTeX\ \textsf{systeme}}.
+% \bibitem{SYST} \emph{L'extension pour \TeX\ et \LaTeX\ \textsf{systeme}},
% Christian Tellechea, CTAN v0.32 2019/01/13.
-% \bibitem{SPAL} \emph{The \textsf{spalign} package}. Joseph Rabinoff, CTAN, 2016/10/05.
-% \bibitem{FR} \emph{L'extension \textsf{frenchmath}}. Antoine Missier, CTAN, v2.1 2022/11/11.
-% \bibitem{LSHORT} \emph{The Not So Short Introduction to \LaTeXe}. \textsf{lshort} package by
+% \bibitem{SPAL} \emph{The \textsf{spalign} package}, Joseph Rabinoff, CTAN, 2016/10/05.
+% \bibitem{FR} \emph{L'extension \textsf{frenchmath}}, Antoine Missier, CTAN, v2.3 2022/12/26.
+% \bibitem{BRACKET} \emph{Intelligent brackets -- The \textsf{ibrackets} package}
+% Antoine Missier, CTAN, v1.0, 2022/12/19.
+% \bibitem{LSHORT} \emph{The Not So Short Introduction to \LaTeXe}, the \textsf{lshort} package by
% Tobias Oetiker, Hubert Partl, Irene Hyna and Elisabeth Schlegl, CTAN, v6.4 2021/04/09.
% \url{http://tug.ctan.org/info/lshort/english/lshort.pdf}.
-% \bibitem{COMP} \emph{The \LaTeX\ Companion}. Frank Mittelbach, Michel Goossens,
+% \bibitem{COMP} \emph{The \LaTeX\ Companion}, Frank Mittelbach, Michel Goossens,
% Johannes Braams, David Carlisle, Chris Rowley, 2nd edition, Pearson Education, 2004.
% \end{raggedright}
% \end{thebibliography}
diff --git a/macros/latex/contrib/mismath/mismath.pdf b/macros/latex/contrib/mismath/mismath.pdf
index e2ba5b0321..85e97af3c0 100644
--- a/macros/latex/contrib/mismath/mismath.pdf
+++ b/macros/latex/contrib/mismath/mismath.pdf
Binary files differ
diff --git a/support/TeX4ht/source/ChangeLog b/support/TeX4ht/source/ChangeLog
index eb851e0e66..b7ad95ba12 100644
--- a/support/TeX4ht/source/ChangeLog
+++ b/support/TeX4ht/source/ChangeLog
@@ -1,3 +1,13 @@
+2022-12-24 Michal Hoftich <michal.h21@gmail.com>
+
+ * tex4ht-4ht.tex (mdframed.4ht): fixed support for Mdframed used
+ inside of \Picture*.
+ https://tex.stackexchange.com/a/669526/2891
+
+ * tex4ht-html4.tex (html4.4ht): added support for the inclusion of
+ MPS images.
+ https://tex.stackexchange.com/a/669526/2891
+
2022-12-23 Michal Hoftich <michal.h21@gmail.com>
* tex4ht-html4.tex (html4.4ht): fixed paragraph handling in the
diff --git a/support/TeX4ht/source/tex4ht-4ht.tex b/support/TeX4ht/source/tex4ht-4ht.tex
index 30a73224d3..2e301d2010 100644
--- a/support/TeX4ht/source/tex4ht-4ht.tex
+++ b/support/TeX4ht/source/tex4ht-4ht.tex
@@ -1,4 +1,4 @@
-% $Id: tex4ht-4ht.tex 1268 2022-12-16 15:18:27Z michal_h21 $
+% $Id: tex4ht-4ht.tex 1276 2022-12-24 12:44:15Z michal_h21 $
% tex tex4ht-4ht or ht tex tex4ht-4ht
%
% Copyright 2009-2022 TeX Users Group
@@ -27997,7 +27997,7 @@ We need to use dvips driver with XeLaTeX
\<mdframed.4ht\><<<
% mdframed.4ht (|version), generated from |jobname.tex
-% Copyright 2017-2021 TeX Users Group
+% Copyright 2017-2022 TeX Users Group
|<TeX4ht license text|>
\NewConfigure{mdframed}{2}
@@ -28005,18 +28005,20 @@ We need to use dvips driver with XeLaTeX
\NewConfigure{mdframetitle}{2}
\newcount\mdf:env:cnt
\def\mdf:id{mdframed-\the\mdf:env:cnt}
-\def\mdf@trivlist#1{\global\advance\mdf:env:cnt by1\relax\a:mdframed\a:mdframedstyle%
+\def\:tempa#1{\global\advance\mdf:env:cnt by1\relax\a:mdframed\a:mdframedstyle%
\ifdefempty{\mdf@frametitle}{}{\mdfframedtitleenv{\mdf@frametitle}\a:mdframetitle\mdf@@frametitle@use\b:mdframetitle}\let\mdf@frametitle\@empty%
}
+\HLet\mdf@trivlist\:tempa
-\def\endmdf@trivlist{\b:mdframed}
+\def\:tempa{\b:mdframed}
+\HLet\endmdf@trivlist\:tempa
% disable frame drawing, it can be supported using CSS
-\def\detected@mdf@put@frame{}%
+\HLet\detected@mdf@put@frame\relax%
\append:def\mdf@@ignorelastdescenders{\let\orig:unskip\unskip\def\unskip{\let\unskip\orig:unskip}}%
-\def\mdf@lrbox#1{}
-\def\endmdf@lrbox{}
+\HLet\mdf@lrbox\:gobble
+\HLet\endmdf@lrbox\relax
\Hinput{mdframed}
\endinput
>>> \AddFile{9}{mdframed}
diff --git a/support/TeX4ht/source/tex4ht-html4.tex b/support/TeX4ht/source/tex4ht-html4.tex
index 4d341ee3ff..4642e59faf 100644
--- a/support/TeX4ht/source/tex4ht-html4.tex
+++ b/support/TeX4ht/source/tex4ht-html4.tex
@@ -1,4 +1,4 @@
-% $Id: tex4ht-html4.tex 1274 2022-12-23 13:35:49Z michal_h21 $
+% $Id: tex4ht-html4.tex 1275 2022-12-24 12:38:23Z michal_h21 $
% Compile 4 times: latex tex4ht-html4
% Copy html4.4ht into the work directory before all but the last compilation.
%
@@ -14029,7 +14029,7 @@ Declare default graphics extensions supported in HTML or converted to these
supported formats by tex4ht.
\<graphics default extensions\><<<
-\DeclareGraphicsExtensions{.png,.svg,.jpg,.eps,.pdf}
+\DeclareGraphicsExtensions{.png,.svg,.jpg,.eps,.pdf,.mps}
>>>
diff --git a/systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl b/systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl
index c53b0796ba..e6f96f6a32 100644
--- a/systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl
+++ b/systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl
@@ -17,7 +17,6 @@ $mirrors = {
'https://mirrors.cqu.edu.cn/CTAN/' => 1,
'https://mirrors.hit.edu.cn/CTAN/' => 1,
'https://mirrors.nju.edu.cn/CTAN/' => 1,
- 'https://mirrors.nwafu.edu.cn/ctan/' => 1,
'https://mirrors.sjtug.sjtu.edu.cn/ctan/' => 1,
'https://mirrors.sustech.edu.cn/CTAN/' => 1,
'https://mirrors.tuna.tsinghua.edu.cn/CTAN/' => 1,
diff --git a/systems/texlive/tlnet/tlpkg/texlive.tlpdb b/systems/texlive/tlnet/tlpkg/texlive.tlpdb
index 6491398a2b..085ff806a9 100644
--- a/systems/texlive/tlnet/tlpkg/texlive.tlpdb
+++ b/systems/texlive/tlnet/tlpkg/texlive.tlpdb
@@ -26,11 +26,11 @@ depend container_split_src_files/1
depend frozen/0
depend minrelease/2016
depend release/2022
-depend revision/65345
+depend revision/65354
name 00texlive.image
category TLCore
-revision 65346
+revision 65354
shortdesc TeX Live files only in the source repository
longdesc The files here are not copied by the installer and containers
longdesc are not built for them; they exist only in the source
@@ -2028,6 +2028,7 @@ runfiles size=12956
tlpkg/tlpsrc/gothic.tlpsrc
tlpkg/tlpsrc/gotoh.tlpsrc
tlpkg/tlpsrc/grabbox.tlpsrc
+ tlpkg/tlpsrc/gradient-text.tlpsrc
tlpkg/tlpsrc/gradientframe.tlpsrc
tlpkg/tlpsrc/grading-scheme.tlpsrc
tlpkg/tlpsrc/gradstudentresume.tlpsrc
@@ -2714,6 +2715,7 @@ runfiles size=12956
tlpkg/tlpsrc/lualibs.tlpsrc
tlpkg/tlpsrc/luamathalign.tlpsrc
tlpkg/tlpsrc/luamesh.tlpsrc
+ tlpkg/tlpsrc/luamodulartables.tlpsrc
tlpkg/tlpsrc/luamplib.tlpsrc
tlpkg/tlpsrc/luaoptions.tlpsrc
tlpkg/tlpsrc/luaotfload.tlpsrc
@@ -4681,7 +4683,7 @@ depend setting_available_architectures:aarch64-linux amd64-freebsd amd64-netbsd
name 00texlive.installer
category TLCore
-revision 65337
+revision 65348
shortdesc TeX Live standalone installer package
longdesc This package defines the files to go into the installer
longdesc archives (install-tl-unx.tar.gz, install-tl.zip) built by the
@@ -70421,7 +70423,7 @@ containerchecksum c73220abd1545907a1d8de37cb534d2c6bd2534f1b55f03c069f39f535c326
name collection-latexextra
category Collection
-revision 65343
+revision 65353
shortdesc LaTeX additional packages
relocated 1
longdesc A very large collection of add-on packages for LaTeX.
@@ -71030,6 +71032,7 @@ depend gmiflink
depend gmutils
depend gmverb
depend grabbox
+depend gradient-text
depend grading-scheme
depend graphbox
depend graphicscache
@@ -71897,8 +71900,8 @@ depend zref-clever
depend zref-vario
depend zwgetfdate
depend zwpagelayout
-containersize 6804
-containerchecksum 9e8659774aa5755fcd24e107c61122b6f3522380fe06c3aed3f9b22fbeccb9eeb5dd2ea8346eabbad86a811cdd9bddefbabe6707693375cced500b66755cff29
+containersize 6812
+containerchecksum 15a6199c93d8a3b2dbbde8761f9889ea8d8ea3720500a9718e405a6146a8d460828e6c1010a3436c547e1bcb28e98fb7ac964c1facad4ed6c2b843b372e9bd89
name collection-latexrecommended
category Collection
@@ -71984,7 +71987,7 @@ containerchecksum 4e445e9830476058f6b878f306516de2fdf1b174011dd79e6a7d875adf104f
name collection-luatex
category Collection
-revision 65333
+revision 65354
shortdesc LuaTeX packages
relocated 1
longdesc Packages for LuaTeX, a TeX engine using Lua as an embedded
@@ -72036,6 +72039,7 @@ depend lualatex-math
depend lualatex-truncate
depend lualibs
depend luamathalign
+depend luamodulartables
depend luamplib
depend luaoptions
depend luaotfload
@@ -72079,8 +72083,8 @@ depend tsvtemplate
depend typewriter
depend uninormalize
depend yamlvars
-containersize 936
-containerchecksum 99e5476a3af791a9c4f795cd9acdf3a86e6f5e23f523b9788f14150cd7bfdc2209d51f12cac5635395d3b352515175d321a133945bfc8b8680a41ba35342cde4
+containersize 944
+containerchecksum 44e1041adf14954f5da71342247dd8863057ff52db1a05525c01caa87a4f27084580aab0b375c96bdb05e4ab718afebfdd2254146ed1cd69b2abccfa975e0330
name collection-mathscience
category Collection
@@ -120748,7 +120752,7 @@ catalogue-version 0.8.8
name fei
category Package
-revision 59589
+revision 65352
shortdesc Class for academic works at FEI University Center -- Brazil
relocated 1
longdesc fei is a class created by graduate students and LaTeX
@@ -120764,20 +120768,19 @@ longdesc based in the Brazilian National Standards Organization
longdesc (Associacao Brasileira de Normas Tecnicas, ABNT) standards for
longdesc the creation of academic works, such as ABNT NBR 10520:2002
longdesc (Citations) and ABNT NBR 6023:2002 (Bibliographic References).
-containersize 8028
-containerchecksum 52c214fe548e29cab53e508d51fe6b0cbab8d2604507e1f030f87cb8d9014bd91a4e4c9a07f4e41f98313eed4f2cecee214e22b02e5a7a1e5c357f01e0adf840
-doccontainersize 492852
-doccontainerchecksum 6d91dc8b85a6f3c89c8163890c44d62076bd9d411e95f00d902b02ca640c9bca6cee7181c55425943798687af31635af0d73cfb46f3a7e07280346692df3cb45
-docfiles size=177
- RELOC/doc/latex/fei/10.3
+containersize 8108
+containerchecksum 2be4e4d83c5a02bfd43eed59741e07868e0e22489bb087f91de0681dbb04e999cff2bb9441b87937c3e2cfa60b7d4a1641dce4529a5aabc15df12d70e22e521a
+doccontainersize 441996
+doccontainerchecksum adb30683e075801f74cd87bad431c880ffe410fdba738b197932af4f0efdb1c6530ddd66c6c860c1097b4f9e37601a1a9c744a1b573396c29898f130988174ea
+docfiles size=125
RELOC/doc/latex/fei/README details="Readme"
RELOC/doc/latex/fei/README.txt
RELOC/doc/latex/fei/fei-template-sublist.tex
RELOC/doc/latex/fei/fei-template.tex
RELOC/doc/latex/fei/fei.pdf details="Package documentation" language="pt-br"
RELOC/doc/latex/fei/referencias.bib
-srccontainersize 31436
-srccontainerchecksum 9883b3e37ea79056359407077f44aa6a3ea2612128ee92103c9a2fdf04ca03ccbefc294aa1a47d5736c5dfe5a70ce0aea32d5196faff0387a4c18d7915b62f4f
+srccontainersize 31128
+srccontainerchecksum 4241c9b50e339c450ca124285205d6fd7d2d2f73cab829c0248204012420f5ccd0615a1d1986cdec8efa15b2c8b8ed54ffd1d815f22ad0f9aa8e05b9ad485c07
srcfiles size=30
RELOC/source/latex/fei/fei.dtx
runfiles size=7
@@ -120789,7 +120792,7 @@ catalogue-contact-support https://groups.google.com/forum/#!forum/grupo-latex-fe
catalogue-ctan /macros/latex/contrib/fei
catalogue-license lppl1.3c
catalogue-topics dissertation class doc-templ std-conform portuguese-br
-catalogue-version 4.10.3
+catalogue-version 4.10.4
name fenixpar
category Package
@@ -138042,6 +138045,30 @@ catalogue-license lppl1.3c
catalogue-topics boxing
catalogue-version 1.4
+name gradient-text
+category Package
+revision 65353
+shortdesc Decorate text with linear gradient colors
+relocated 1
+longdesc This package enables writers to conveniently decorate text with
+longdesc linear gradient colors. The RGB values of the first and the
+longdesc last character are specified as parameters while the rest of
+longdesc the text is colored automatically.
+containersize 920
+containerchecksum a0a74ba09b010a5228b534c3381f95611ac0df3efd88391155f907c47c16eb8f1d846cf0c04ad64be51ccacd346cce63d768dadff305f60f087269425d1160c9
+doccontainersize 85364
+doccontainerchecksum cf13b3f1cbbd6223b285dee6c1f6edd8e70537a8403c67ebf0c8702d5a2655e59340f9362638a53824ae6ef7d27e1ad6ca1208732a6f630b3efbb8ba44b280d9
+docfiles size=23
+ RELOC/doc/latex/gradient-text/README.md details="Readme"
+ RELOC/doc/latex/gradient-text/gradient-text.pdf details="Package documentation"
+ RELOC/doc/latex/gradient-text/gradient-text.tex
+runfiles size=1
+ RELOC/tex/latex/gradient-text/gradient-text.sty
+catalogue-ctan /macros/latex/contrib/gradient-text
+catalogue-license lppl1.3c
+catalogue-topics colour expl3
+catalogue-version 1.1
+
name gradientframe
category Package
revision 21387
@@ -195234,6 +195261,24 @@ catalogue-license lppl1.3
catalogue-topics graphics maths pgf-tikz graphics-mpost luatex
catalogue-version 0.7
+name luamodulartables
+category Package
+revision 65354
+relocated 1
+containersize 1040
+containerchecksum 3c2f42ed9888947fa6947419511f43ec219b76fe5489449fbf1ae18fce15765d28169e125965a233b058bf35f9bf33ff13b07bdee1e56019793357c3ade1495b
+doccontainersize 269380
+doccontainerchecksum dde5a51187d74b410c2f98bedd3926f6dba09df3ee6d1757fc97f0c8e467a34267e0d8a48b8553f3d56421c43167a15cf343cada50f7f1925ba0544143c550e5
+docfiles size=117
+ RELOC/doc/lualatex/luamodulartables/README.txt
+ RELOC/doc/lualatex/luamodulartables/luamodular.bib
+ RELOC/doc/lualatex/luamodulartables/luamodularadd.jpg
+ RELOC/doc/lualatex/luamodulartables/luamodularmult.jpg
+ RELOC/doc/lualatex/luamodulartables/luamodulartables.pdf
+ RELOC/doc/lualatex/luamodulartables/luamodulartables.tex
+runfiles size=1
+ RELOC/tex/lualatex/luamodulartables/luamodulartables.sty
+
name luamplib
category Package
revision 61587
@@ -265529,7 +265574,7 @@ catalogue-topics listing
name pythonimmediate
category Package
-revision 65343
+revision 65349
shortdesc Library to run Python code
relocated 1
longdesc Just like PerlTeX or PyLuaTeX (and unlike PythonTeX or
@@ -265548,9 +265593,9 @@ depend l3packages
depend precattl
depend saveenv
containersize 20184
-containerchecksum 46f3beb84967bac6a6de4d4b6344e4c428250d53f25d368d8ce85735de582136a6c77e03c4cd8794c5be4b25d03c72bd8740cac0de4947751b9274f1c4e66311
-doccontainersize 408940
-doccontainerchecksum 06ff64571083eeedf1d2d353d9ea489a826e2bb4415929318a7f4bf1ffd6b463bca232f26aefc86d7ab1ac941bba43dbf86e412c05aabb01bd438d6d01f3d45c
+containerchecksum 970cd28032c551271f97fcae614a03f012684b0f1a09904284ff35e9461195a1e5b8a6f51c12c4e7dc7b54720d13a34d9bbe471469a03c0fd00ddc49d8462d9c
+doccontainersize 408944
+doccontainerchecksum 68068245368180f4dff747a18abdc068a2f0fddcc5b3cf3e63403d99ceaf56ddc5ee17bb32ebefb42f92268d3b681c5c5feb94aa76823b90478d77f0b3e511bd
docfiles size=106
RELOC/doc/latex/pythonimmediate/DEPENDS.txt
RELOC/doc/latex/pythonimmediate/README details="Readme"
@@ -300490,7 +300535,7 @@ binfiles arch=x86_64-solaris size=1
name tex4ht
category Package
-revision 65344
+revision 65350
shortdesc Convert (La)TeX to HTML/XML
longdesc A converter from TeX and LaTeX to SGML-based formats such as
longdesc (X)HTML, MathML, OpenDocument, and Docbook, providing a
@@ -300511,10 +300556,10 @@ longdesc files from them is nontrivial, and generally done with the
longdesc Makefile in development, from which the TeX4ht package in TeX
longdesc Live is updated.
depend tex4ht.ARCH
-containersize 976412
-containerchecksum d88af03f39cb6e0dd28e80f6508d7379d7c0c6fcc6bf0864166fe58f960bde3cc3cbb3bea800b927e95129f0504069f6bc658ba81c4f3f624fa255955c8993e3
+containersize 976568
+containerchecksum e3b117f12d342f03e13899258b791c2b03cb6956133be02728007d6a1824c5171962a2da28816de52853ae1e1988da1a843762e52e545eb4c36e9144a986baba
doccontainersize 136384
-doccontainerchecksum 88342d6883cf395f6dccb5d17d15a7fba6fd0a1974fd9d9b37816a4918828144aa4471b6114ecf8e4818319cf26bf9c53a430e531c2f5fa135976945022cce50
+doccontainerchecksum 41347785e3d29e39979050c9fd2feb49dc93b460f93fa4c9de9ed3d69ee8144b0f151ea126bd9a606a9d8274c66ee83313dfe1448d475f38d8c2c0f80a885553
docfiles size=260
texmf-dist/doc/generic/tex4ht/Makefile
texmf-dist/doc/generic/tex4ht/README details="Readme"
@@ -300586,8 +300631,8 @@ docfiles size=260
texmf-dist/doc/generic/tex4ht/mn56.html
texmf-dist/doc/generic/tex4ht/mn5x.png
texmf-dist/doc/generic/tex4ht/mn6x.png
-srccontainersize 1290316
-srccontainerchecksum 5f4efbe22853c951822de5b016f635c098d421a98713e9f4d1ecd09052ada4e5d5d782f9333adc33602d717b945166af5b6b71667839404f2fbf703b7da07fea
+srccontainersize 1294848
+srccontainerchecksum 062238917922908bd63b9974fc6a352e27fe73168e1d1cea15d9caf68bf8361d60ba99db7861b30e5706ab08a2e7593d74207f2ca46f6cda36be1c02c6470ada
srcfiles size=3944
texmf-dist/source/generic/tex4ht/ChangeLog
texmf-dist/source/generic/tex4ht/Makefile
@@ -311369,7 +311414,7 @@ docfiles size=376
name texlive-scripts
category TLCore
-revision 65337
+revision 65348
shortdesc TeX Live infrastructure programs
longdesc Includes install-tl, tl-portable, rungs, etc.; not needed for
longdesc tlmgr to run but still ours. Not included in tlcritical.
@@ -311377,10 +311422,10 @@ depend texlive-scripts.ARCH
depend texlive.infra
execute addMap mathpple.map
postaction shortcut type=menu name="TeX Live command-line" cmd=TEXDIR/tlpkg/installer/tl-cmd.bat
-containersize 113724
-containerchecksum 60078e5038d2204470d61104e241fda58f1ebc10dbba73d38e7cc4a7d63af0d781ba0f7d4bfba2baeec2eba23fe623fd79f2b307e74548ae4b304e2cb24ca21f
-doccontainersize 423764
-doccontainerchecksum ffe01a106eb0aff355aab5de2c4813994836139dfbda5d8d6739e50c2ea37f949be1164b8e3527c44c6f05c61b3aa9ac90f14d4e86d3289a23abd8f6eeb36997
+containersize 113712
+containerchecksum 4544eb983be141edffceda935282398f4f7b1fc6fa774373a3943024fbe88a547c3a0a4c5aa766bf277ecf18ead924f769ae83d22dc2e0d3d81d830ba5441f25
+doccontainersize 423988
+doccontainerchecksum ba6bfc1beb178783ed1fbb92da28f4effd517e89dea22e5bdb8b21191d788a1f5b3d1dbda076e203e4ebb1120cc12866ff57fbdca8f2b3378491215e2b246634
docfiles size=533
doc.html
texmf-dist/doc/man/man1/fmtutil-sys.1
@@ -354581,7 +354626,7 @@ binfiles arch=x86_64-solaris size=1
name yquant
category Package
-revision 63255
+revision 65351
shortdesc Typesetting quantum circuits in a human-readable language
relocated 1
longdesc This LaTeX package allows to quickly draw quantum circuits. It
@@ -354594,11 +354639,11 @@ longdesc i.e., it requires no external program -- that introduces a
longdesc logic oriented language and thus brings the best of both worlds
longdesc together. It builds on and interacts with TikZ, which brings an
longdesc enourmous flexibility for customization of individual circuit.
-containersize 56756
-containerchecksum fe563ece760084984dcca2ce769556460b6f50e5ea3a9b9d9f0a8e85f307ed1303233add84905d3997c4da640d732b6b1cea82f95f854ac2f5b159a3a826ae3d
-doccontainersize 825320
-doccontainerchecksum e6bc278323af211e531017bb95258713451f87b5af052527649d9b274ed095867f60ee8fa0fb1ec65432f04c5d3c65a137bc791ed8e305751073190e1820dd8b
-docfiles size=346
+containersize 56860
+containerchecksum dc7447fab91140b4c8a12660e4e9335ab83886269467159691e48f5f7a246b8d376515537d43cf2934a826dba4e6dca9664d16d87d3c2b61f5869ad50ced204e
+doccontainersize 827288
+doccontainerchecksum 9bf0fef2b0e91cf9610232d419a0d04b87854e52adf1963521a4c1b9bc24fc22c73da37cb8cccdd72bc959a2a33aa442585d91983a377c5b7886ec5a6f013ead
+docfiles size=347
RELOC/doc/latex/yquant/README.md details="Readme"
RELOC/doc/latex/yquant/test1.qasm
RELOC/doc/latex/yquant/test10.qasm
@@ -354639,7 +354684,7 @@ catalogue-contact-home https://github.com/projekter/yquant
catalogue-ctan /graphics/pgf/contrib/yquant
catalogue-license lppl1.3c
catalogue-topics graphics diagram-circ pgf-tikz
-catalogue-version 0.7.1
+catalogue-version 0.7.2
name ytableau
category Package
diff --git a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5 b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5
index 8da45d0bf8..122ee6690e 100644
--- a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5
+++ b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5
@@ -1 +1 @@
-bc9624a872eeac58a9b8ddcfab766b30 texlive.tlpdb
+ba9e7b26ea3369e35be3fcba362c4d8f texlive.tlpdb
diff --git a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512 b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512
index 202d7817c9..29cf6df442 100644
--- a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512
+++ b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512
@@ -1 +1 @@
-8101a8ef85303d49f9a0bdf16a010b658fed0f3e385a06fcc351683bdf9aa297f1f244a25f8a06883327c4a5e7c8f3cd9ee4ba31e36bd9008ea59922a843830c texlive.tlpdb
+6ec139f81128ba2945cd0cd524864d0b75f99af51bddf88f18514142c78ab02c66a2650127c3fe41fd7b95656f809e66625b9dc8122964a536d6651da3dd38d5 texlive.tlpdb
diff --git a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc
index 7e6825789f..dc422917bf 100644
--- a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc
+++ b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc
@@ -1,10 +1,10 @@
-----BEGIN PGP SIGNATURE-----
-iQEcBAEBCgAGBQJjpk38AAoJEEzhh34ZQ4xwDVgH/RnqxgA6p8oBksft1qTD141Z
-UMqAT29WVcSh49w0c5XwMhnLB27QLZIW8kGD5HjvPSVtQjaVDkm2a/2o1Pbsg0dM
-6nL/Xbxt/BZekee5ZOtx5Jvyp/2S4DeA5veJa2asFDt3MuNyt0lbJtHpbvHGAy1R
-A+9SwUvqMSGNIoWui6tWaAbMvtzhGo2seVskSq8up4CKyeBC2xSrYHk9i3Di07Oz
-4MT2eHapuo+3XAqR7SH2LoQ+5BCDOhf4tshmhrbhoLzfmJ4Un4C6cA+fCco2ExUD
-wvG/QLhOJlk/PrU9/lhhdSwB2NlJ2X2/p11YRcowCqZpsoJkJnwDbGr65xzcZw4=
-=UUdM
+iQEcBAEBCgAGBQJjp5+BAAoJEEzhh34ZQ4xwNvkH/iLLV80TGbpUh1x1nuhqXfoE
+QJx8o8KrCVKwRk4XOxSbWNPUU3H84R5ueCR8/lE0mjG4dUNSsGYpsM/DNd/4lgYt
+JNen/ckMhEo2HFb+uHv6pNihKL/oLeecjirutVm+ktyMdK2ZS0L5qs96u3OodEPh
+qCIOFMlZ0qlIl6D9DuERvIATjNdIdGoR+rr3grIoRgvUD9HzI9v3xDIyjYHLH6QD
+6N8NBTSVn7NcvodqV38pwt789qlk7u4uacumQiuzCJRnyVEP5MP6SPweTq5xX4qe
+FRfKBCGCOZKi6mV85dFYRxYUXkynZ2VStlcE7Vf8Cai937Mua15iDa8qt78lUQg=
+=jEph
-----END PGP SIGNATURE-----
diff --git a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz
index 3c67257d47..30cb9fba64 100644
--- a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz
+++ b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz
Binary files differ
diff --git a/timestamp b/timestamp
index 66aaae87ec..df2d90ff97 100644
--- a/timestamp
+++ b/timestamp
@@ -2,4 +2,4 @@
# The source CTAN of this site's material:
dante.ctan.org
# The year-month-day-hour-minute of this site's material:
-2022-12-25-02-02
+2022-12-26-02-02