summaryrefslogtreecommitdiff
path: root/biblio
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2023-09-08 03:02:30 +0000
committerNorbert Preining <norbert@preining.info>2023-09-08 03:02:30 +0000
commit608e422a8e775ac4d1c23c80b4170776701680d5 (patch)
treed1e69057c0dc339fb0f890882f5fef9fe3b3a66f /biblio
parent96f1d7a9e9fe6e682cbd19d1bf2b7797891160b6 (diff)
CTAN sync 202309080302
Diffstat (limited to 'biblio')
-rw-r--r--biblio/citation-style-language/CHANGELOG.md16
-rw-r--r--biblio/citation-style-language/DEPENDS.txt2
-rw-r--r--biblio/citation-style-language/README.md2
-rw-r--r--biblio/citation-style-language/american-sociological-association.csl8
-rw-r--r--biblio/citation-style-language/apa.csl519
-rw-r--r--biblio/citation-style-language/citation-style-language-bib.sty3
-rw-r--r--biblio/citation-style-language/citation-style-language-cite.sty33
-rw-r--r--biblio/citation-style-language/citation-style-language-compatible.sty87
-rw-r--r--biblio/citation-style-language/citation-style-language-doc.pdfbin231003 -> 229863 bytes
-rw-r--r--biblio/citation-style-language/citation-style-language-doc.tex33
-rw-r--r--biblio/citation-style-language/citation-style-language-init.sty27
-rw-r--r--biblio/citation-style-language/citation-style-language.sty7
-rw-r--r--biblio/citation-style-language/citeproc-bibtex-data.lua4
-rw-r--r--biblio/citation-style-language/citeproc-bibtex-parser.lua84
-rw-r--r--biblio/citation-style-language/citeproc-bibtex2csl.lua91
-rw-r--r--biblio/citation-style-language/citeproc-context.lua16
-rw-r--r--biblio/citation-style-language/citeproc-element.lua10
-rw-r--r--biblio/citation-style-language/citeproc-engine.lua118
-rw-r--r--biblio/citation-style-language/citeproc-ir-node.lua37
-rw-r--r--biblio/citation-style-language/citeproc-journal-data.lua140
-rw-r--r--biblio/citation-style-language/citeproc-latex-core.lua197
-rw-r--r--biblio/citation-style-language/citeproc-latex.lua4
-rw-r--r--biblio/citation-style-language/citeproc-lua.12
-rw-r--r--biblio/citation-style-language/citeproc-node-bibliography.lua17
-rw-r--r--biblio/citation-style-language/citeproc-node-choose.lua20
-rw-r--r--biblio/citation-style-language/citeproc-node-citation.lua59
-rw-r--r--biblio/citation-style-language/citeproc-node-date.lua19
-rw-r--r--biblio/citation-style-language/citeproc-node-group.lua5
-rw-r--r--biblio/citation-style-language/citeproc-node-label.lua7
-rw-r--r--biblio/citation-style-language/citeproc-node-layout.lua4
-rw-r--r--biblio/citation-style-language/citeproc-node-locale.lua7
-rw-r--r--biblio/citation-style-language/citeproc-node-names.lua118
-rw-r--r--biblio/citation-style-language/citeproc-node-number.lua7
-rw-r--r--biblio/citation-style-language/citeproc-node-sort.lua11
-rw-r--r--biblio/citation-style-language/citeproc-node-style.lua97
-rw-r--r--biblio/citation-style-language/citeproc-node-text.lua15
-rw-r--r--biblio/citation-style-language/citeproc-output.lua288
-rw-r--r--biblio/citation-style-language/citeproc-unicode.lua5
-rw-r--r--biblio/citation-style-language/citeproc-util.lua97
-rw-r--r--biblio/citation-style-language/citeproc-yaml.lua95
-rw-r--r--biblio/citation-style-language/citeproc.lua2
-rw-r--r--biblio/citation-style-language/csl-locales-ca-AD.xml4
-rw-r--r--biblio/citation-style-language/modern-language-association.csl20
-rw-r--r--biblio/ctan-bibdata/ctan.bib36
-rw-r--r--biblio/ctan-bibdata/ctan.pdfbin3704308 -> 3706908 bytes
45 files changed, 1541 insertions, 832 deletions
diff --git a/biblio/citation-style-language/CHANGELOG.md b/biblio/citation-style-language/CHANGELOG.md
index 0d33fd34b0..b4f84afd44 100644
--- a/biblio/citation-style-language/CHANGELOG.md
+++ b/biblio/citation-style-language/CHANGELOG.md
@@ -7,6 +7,19 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [Unreleased]
+## [0.4.3] - 2023-09-07
+
+### Added
+
+- Add support for CSL-YAML input.
+- Add support for dependent styles.
+- Resolve `crossref`s in BibTeX data.
+- Add support for `backref` package (part of `hyperref`).
+
+### Fixed
+
+- Fix compatibility with `beamer` ([#41](https://github.com/zepinglee/citeproc-lua/issues/41)).
+
## [0.4.2] - 2023-07-04
### Changed
@@ -126,7 +139,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.4.2...HEAD
+[Unreleased]: https://github.com/zepinglee/citeproc-lua/compare/v0.4.3...HEAD
+[0.4.3]: https://github.com/zepinglee/citeproc-lua/compare/v0.4.2...v0.4.3
[0.4.2]: https://github.com/zepinglee/citeproc-lua/compare/v0.4.1...v0.4.2
[0.4.1]: https://github.com/zepinglee/citeproc-lua/compare/v0.4.0...v0.4.1
[0.4.0]: https://github.com/zepinglee/citeproc-lua/compare/v0.3.0...v0.4.0
diff --git a/biblio/citation-style-language/DEPENDS.txt b/biblio/citation-style-language/DEPENDS.txt
index 05ac013e96..83732d98bc 100644
--- a/biblio/citation-style-language/DEPENDS.txt
+++ b/biblio/citation-style-language/DEPENDS.txt
@@ -1,8 +1,8 @@
# The format of this file is described in https://www.tug.org/texlive/pkgcontrib.html#deps.
-hard filehook
hard l3kernel
hard l3packages # xparse
+hard lua-tinyyaml # YAML parser
hard lua-uca
hard lualibs # JSON parser
hard luatex
diff --git a/biblio/citation-style-language/README.md b/biblio/citation-style-language/README.md
index e11b5fc8af..efcd897361 100644
--- a/biblio/citation-style-language/README.md
+++ b/biblio/citation-style-language/README.md
@@ -27,7 +27,7 @@ A full LaTeX example is in the [`examples/`](examples) directory.
\usepackage{citation-style-language}
\cslsetup{style = apa}
-\addbibresource{example.bib}
+\addbibresource{example.json} % or example.bib or example.yaml
\begin{document}
diff --git a/biblio/citation-style-language/american-sociological-association.csl b/biblio/citation-style-language/american-sociological-association.csl
index f58f73cfb1..4f212f8e7d 100644
--- a/biblio/citation-style-language/american-sociological-association.csl
+++ b/biblio/citation-style-language/american-sociological-association.csl
@@ -16,7 +16,7 @@
<category citation-format="author-date"/>
<category field="sociology"/>
<summary>The ASA style following the 6th edition of the Style Guide</summary>
- <updated>2023-02-19T22:16:47-05:00</updated>
+ <updated>2023-07-16T16:48:31-04:00</updated>
<rights license="http://creativecommons.org/licenses/by-sa/3.0/">This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 License</rights>
</info>
<locale xml:lang="en">
@@ -38,8 +38,7 @@
<name and="text" name-as-sort-order="first" sort-separator=", " delimiter=", " delimiter-precedes-last="always" initialize="false" initialize-with=". "/>
<label form="short" prefix=", "/>
<substitute>
- <names variable="editor"/>
- <names variable="translator"/>
+ <names variable="editor translator director"/>
<choose>
<if type="report">
<text variable="publisher"/>
@@ -53,8 +52,7 @@
<names variable="author">
<name form="short" and="text" delimiter=", " initialize-with=". "/>
<substitute>
- <names variable="editor"/>
- <names variable="translator"/>
+ <names variable="editor director translator"/>
<choose>
<if type="report">
<text variable="publisher"/>
diff --git a/biblio/citation-style-language/apa.csl b/biblio/citation-style-language/apa.csl
index a71a992689..3734d8d76e 100644
--- a/biblio/citation-style-language/apa.csl
+++ b/biblio/citation-style-language/apa.csl
@@ -14,7 +14,7 @@
<category citation-format="author-date"/>
<category field="psychology"/>
<category field="generic-base"/>
- <updated>2023-05-13T12:14:52-04:00</updated>
+ <updated>2023-07-16T18:56:49-04:00</updated>
<rights license="http://creativecommons.org/licenses/by-sa/3.0/">This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 License</rights>
</info>
<locale xml:lang="en">
@@ -35,298 +35,88 @@
<term name="circa" form="short">ca.</term>
<term name="bc"> B.C.E.</term>
<term name="ad"> C.E.</term>
- <term name="letter">personal communication</term>
- <term name="letter" form="short">letter</term>
<term name="issue" form="long">
<single>issue</single>
<multiple>issues</multiple>
</term>
- </terms>
- </locale>
- <locale xml:lang="af">
- <terms>
- <term name="letter">persoonlike kommunikasie</term>
- <term name="letter" form="short">brief</term>
- </terms>
- </locale>
- <locale xml:lang="ar">
- <terms>
- <term name="letter">اتصال شخصي</term>
- <term name="letter" form="short">خطاب</term>
- </terms>
- </locale>
- <locale xml:lang="bg">
- <terms>
- <term name="letter">лична комуникация</term>
- <term name="letter" form="short">писмо</term>
- </terms>
- </locale>
- <locale xml:lang="ca">
- <terms>
- <term name="letter">comunicació personal</term>
- <term name="letter" form="short">carta</term>
- </terms>
- </locale>
- <locale xml:lang="cs">
- <terms>
- <term name="letter">osobní komunikace</term>
- <term name="letter" form="short">dopis</term>
- </terms>
- </locale>
- <locale xml:lang="cy">
- <terms>
- <term name="letter">cyfathrebu personol</term>
- <term name="letter" form="short">llythyr</term>
+ <term name="software">computer software</term>
</terms>
</locale>
<locale xml:lang="da">
<terms>
<term name="et-al">et al.</term>
- <term name="letter">personlig kommunikation</term>
- <term name="letter" form="short">brev</term>
</terms>
</locale>
<locale xml:lang="de">
<terms>
<term name="et-al">et al.</term>
- <term name="letter">persönliche Kommunikation</term>
- <term name="letter" form="short">Brief</term>
- </terms>
- </locale>
- <locale xml:lang="el">
- <terms>
- <term name="letter">προσωπική επικοινωνία</term>
- <term name="letter" form="short">επιστολή</term>
</terms>
</locale>
<locale xml:lang="es">
<terms>
<term name="from">de</term>
- <term name="letter">comunicación personal</term>
- <term name="letter" form="short">carta</term>
- </terms>
- </locale>
- <locale xml:lang="et">
- <terms>
- <term name="letter">isiklik suhtlus</term>
- <term name="letter" form="short">kiri</term>
- </terms>
- </locale>
- <locale xml:lang="eu">
- <terms>
- <term name="letter">komunikazio pertsonala</term>
- <term name="letter" form="short">gutuna</term>
- </terms>
- </locale>
- <locale xml:lang="fa">
- <terms>
- <term name="letter">ارتباط شخصی</term>
- <term name="letter" form="short">نامه</term>
- </terms>
- </locale>
- <locale xml:lang="fi">
- <terms>
- <term name="letter">henkilökohtainen viestintä</term>
- <term name="letter" form="short">kirje</term>
</terms>
</locale>
<locale xml:lang="fr">
<terms>
- <term name="letter">communication personnelle</term>
- <term name="letter" form="short">lettre</term>
<term name="editor" form="short">
<single>éd.</single>
<multiple>éds.</multiple>
</term>
</terms>
</locale>
- <locale xml:lang="he">
- <terms>
- <term name="letter">תקשורת אישית</term>
- <term name="letter" form="short">מכתב</term>
- </terms>
- </locale>
- <locale xml:lang="hr">
- <terms>
- <term name="letter">osobna komunikacija</term>
- <term name="letter" form="short">pismo</term>
- </terms>
- </locale>
- <locale xml:lang="hu">
- <terms>
- <term name="letter">személyes kommunikáció</term>
- <term name="letter" form="short">levél</term>
- </terms>
- </locale>
- <locale xml:lang="id">
- <terms>
- <term name="letter">komunikasi pribadi</term>
- <term name="letter" form="short">surat</term>
- </terms>
- </locale>
- <locale xml:lang="is">
- <terms>
- <term name="letter">persónuleg samskipti</term>
- <term name="letter" form="short">bréf</term>
- </terms>
- </locale>
- <locale xml:lang="it">
- <terms>
- <term name="letter">comunicazione personale</term>
- <term name="letter" form="short">lettera</term>
- </terms>
- </locale>
- <locale xml:lang="ja">
- <terms>
- <term name="letter">個人的なやり取り</term>
- <term name="letter" form="short">手紙</term>
- </terms>
- </locale>
- <locale xml:lang="ko">
- <terms>
- <term name="letter">개인 서신</term>
- <term name="letter" form="short">편지</term>
- </terms>
- </locale>
- <locale xml:lang="la">
- <terms>
- <term name="letter"/>
- <term name="letter" form="short">epistula</term>
- </terms>
- </locale>
- <locale xml:lang="lt">
- <terms>
- <term name="letter">communicationis personalis</term>
- <term name="letter" form="short"/>
- </terms>
- </locale>
- <locale xml:lang="lv">
- <terms>
- <term name="letter">personīga komunikācija</term>
- <term name="letter" form="short">vēstule</term>
- </terms>
- </locale>
- <locale xml:lang="mn">
- <terms>
- <term name="letter">хувийн харилцаа холбоо</term>
- <term name="letter" form="short">захиа</term>
- </terms>
- </locale>
<locale xml:lang="nb">
<terms>
<term name="et-al">et al.</term>
- <term name="letter">personlig kommunikasjon</term>
- <term name="letter" form="short">brev</term>
</terms>
</locale>
<locale xml:lang="nl">
<terms>
<term name="et-al">et al.</term>
- <term name="letter">persoonlijke communicatie</term>
- <term name="letter" form="short">brief</term>
</terms>
</locale>
<locale xml:lang="nn">
<terms>
<term name="et-al">et al.</term>
- <term name="letter">personlig kommunikasjon</term>
- <term name="letter" form="short">brev</term>
- </terms>
- </locale>
- <locale xml:lang="pl">
- <terms>
- <term name="letter">osobista komunikacja</term>
- <term name="letter" form="short">list</term>
- </terms>
- </locale>
- <locale xml:lang="pt">
- <terms>
- <term name="letter">comunicação pessoal</term>
- <term name="letter" form="short">carta</term>
- </terms>
- </locale>
- <locale xml:lang="ro">
- <terms>
- <term name="letter">comunicare personală</term>
- <term name="letter" form="short">scrisoare</term>
- </terms>
- </locale>
- <locale xml:lang="ru">
- <terms>
- <term name="letter">личная переписка</term>
- <term name="letter" form="short">письмо</term>
- </terms>
- </locale>
- <locale xml:lang="sk">
- <terms>
- <term name="letter">osobná komunikácia</term>
- <term name="letter" form="short">list</term>
- </terms>
- </locale>
- <locale xml:lang="sl">
- <terms>
- <term name="letter">osebna komunikacija</term>
- <term name="letter" form="short">pismo</term>
- </terms>
- </locale>
- <locale xml:lang="sr">
- <terms>
- <term name="letter">лична комуникација</term>
- <term name="letter" form="short">писмо</term>
- </terms>
- </locale>
- <locale xml:lang="sv">
- <terms>
- <term name="letter">personlig kommunikation</term>
- <term name="letter" form="short">brev</term>
- </terms>
- </locale>
- <locale xml:lang="th">
- <terms>
- <term name="letter">การสื่อสารส่วนบุคคล</term>
- <term name="letter" form="short">จดหมาย</term>
- </terms>
- </locale>
- <locale xml:lang="tr">
- <terms>
- <term name="letter">kişisel iletişim</term>
- <term name="letter" form="short">mektup</term>
- </terms>
- </locale>
- <locale xml:lang="uk">
- <terms>
- <term name="letter">особисте спілкування</term>
- <term name="letter" form="short">лист</term>
- </terms>
- </locale>
- <locale xml:lang="vi">
- <terms>
- <term name="letter">giao tiếp cá nhân</term>
- <term name="letter" form="short">thư</term>
- </terms>
- </locale>
- <locale xml:lang="zh-CN">
- <terms>
- <term name="letter">的私人交流</term>
- <term name="letter" form="short">信函</term>
- </terms>
- </locale>
- <locale xml:lang="zh-TW">
- <terms>
- <term name="letter">私人通訊</term>
- <term name="letter" form="short">信函</term>
</terms>
</locale>
+ <!-- TODO: New types: classic collection document event hearing performance periodical regulation -software- standard -->
+ <!-- TODO: New creator roles: chair compiler contributor curator executive-producer guest host narrator organizer performer producer script-writer series-creator -->
+ <!-- TODO: New variables:
+ available-date submitted
+ part-number printing-number supplement-number
+ part-title volume-title
+ archive_collection
+ division jurisdiction
+ event-title
+ language
+ license
+ reviewed-genre
+ -->
+ <!-- TODO: New terms:
+ advance-online-publication
+ album on audio-recording
+ original-work-published
+ personal-communication
+ preprint
+ review-of
+ item types
+ -->
+ <!-- TODO: Check Indigeneous Knowledge format -->
<!-- General categories of item types:
Periodical: article-journal article-magazine article-newspaper post-weblog review review-book
Periodical or Booklike: paper-conference
- Booklike: article book broadcast chapter dataset entry entry-dictionary entry-encyclopedia figure
+ Booklike: article book broadcast chapter classic collection dataset document
+ entry entry-dictionary entry-encyclopedia event figure
graphic interview manuscript map motion_picture musical_score pamphlet patent
- personal_communication report song speech thesis post webpage
- Legal: bill legal_case legislation treaty
+ performance periodical personal_communication post report
+ software song speech standard thesis webpage
+ Legal: bill hearing legal_case legislation regulation treaty
-->
<!-- APA references contain four parts: author, date, title, source -->
<macro name="author-bib">
+ <!-- TODO: New creator roles (media, contributor) -->
+ <!-- TODO: Add new item types -->
<names variable="composer" delimiter=", ">
<name name-as-sort-order="all" and="symbol" sort-separator=", " initialize-with=". " delimiter=", " delimiter-precedes-last="always"/>
<substitute>
@@ -355,7 +145,7 @@
</choose>
</if>
</choose>
- <!-- Test for editortranslator and put that first as that becomes available -->
+ <!-- TODO: Test for editortranslator and put that first as that becomes available -->
<names variable="editor" delimiter=", ">
<name name-as-sort-order="all" and="symbol" sort-separator=", " initialize-with=". " delimiter=", " delimiter-precedes-last="always"/>
<label form="short" prefix=" (" suffix=")" text-case="title"/>
@@ -383,6 +173,8 @@
</names>
</macro>
<macro name="author-intext">
+ <!-- TODO: New creator roles -->
+ <!-- TODO: Add new item types -->
<choose>
<if type="bill legal_case legislation treaty" match="any">
<text macro="title-intext"/>
@@ -399,8 +191,7 @@
<text macro="title-intext"/>
</substitute>
</names>
- <!-- Replace with term="personal-communication" if that becomes available -->
- <text term="letter"/>
+ <text term="personal-communication"/>
</group>
</if>
<else>
@@ -438,6 +229,7 @@
</choose>
</macro>
<macro name="date-bib">
+ <!-- TODO: Add new item types -->
<group delimiter=" " prefix="(" suffix=")">
<choose>
<if is-uncertain-date="issued">
@@ -476,6 +268,7 @@
</if>
<else-if variable="status">
<group>
+ <!-- TODO: Should I print status as-is, or should I print the in-press term? -->
<text variable="status" text-case="lowercase"/>
<text variable="year-suffix" prefix="-"/>
</group>
@@ -503,6 +296,7 @@
</choose>
</macro>
<macro name="date-intext">
+ <!-- TODO: Add new item types -->
<choose>
<if variable="issued">
<group delimiter="/">
@@ -550,6 +344,7 @@
</group>
</if>
<else-if variable="status">
+ <!-- TODO: Should I print status as-is, or should I print the in-press term? -->
<text variable="status" text-case="lowercase"/>
<text variable="year-suffix" prefix="-"/>
</else-if>
@@ -579,6 +374,7 @@
</choose>
</macro>
<macro name="title">
+ <!-- TODO: Add new item types -->
<choose>
<if type="post webpage" match="any">
<!-- Webpages are always italicized -->
@@ -600,7 +396,7 @@
<if variable="collection-editor editor editorial-director" match="any">
<group delimiter=": " font-style="italic">
<text variable="title"/>
- <!-- Replace with volume-title as that becomes available -->
+ <!-- TODO: Replace with volume-title -->
<choose>
<if is-numeric="volume" match="none">
<group delimiter=" ">
@@ -619,7 +415,7 @@
<else>
<group delimiter=": " font-style="italic">
<text variable="title"/>
- <!-- Replace with volume-title as that becomes available -->
+ <!-- TODO: Replace with volume-title -->
<choose>
<if is-numeric="volume" match="none">
<group delimiter=" ">
@@ -635,27 +431,28 @@
</choose>
</macro>
<macro name="title-intext">
+ <!-- TODO: Add new item types -->
<choose>
<if variable="title" match="none">
<text macro="bracketed-intext" prefix="[" suffix="]"/>
</if>
+ <else-if type="hearing">
+ <!-- Hearings are italicized -->
+ <text variable="title" form="short" font-style="italic" text-case="title"/>
+ </else-if>
<else-if type="bill">
- <!-- If a bill has no number or container-title, assume it is a hearing; italic -->
+ <!-- Bills are not italicized and substitute bill number if no title. -->
<choose>
- <if variable="number container-title" match="none">
- <text variable="title" form="short" font-style="italic" text-case="title"/>
- </if>
- <else-if variable="title">
+ <if variable="title">
<text variable="title" form="short" text-case="title"/>
- </else-if>
+ </if>
<else>
<group delimiter=" ">
<text variable="genre"/>
<group delimiter=" ">
<choose>
<if variable="chapter-number container-title" match="none">
- <!-- Replace with label variable="number" as that becomes available -->
- <text term="issue" form="short"/>
+ <label variable="number" form="short"/>
</if>
</choose>
<text variable="number"/>
@@ -686,6 +483,7 @@
</choose>
</macro>
<macro name="parenthetical">
+ <!-- TODO: Add new item types -->
<!-- (Secondary contributors; Database location; Genre no. 123; Report Series 123, Version, Edition, Volume, Page) -->
<group prefix="(" suffix=")">
<choose>
@@ -698,13 +496,11 @@
<text variable="genre" text-case="capitalize-first"/>
</if>
<else>
- <!-- This should be localized -->
- <text value="patent" text-case="capitalize-first"/>
+ <text term="patent" text-case="capitalize-first"/>
</else>
</choose>
<group delimiter=" ">
- <!-- Replace with label variable="number" if that becomes available -->
- <text term="issue" form="short" text-case="capitalize-first"/>
+ <label variable="number" form="short" text-case="capitalize-first"/>
<text variable="number"/>
</group>
</group>
@@ -741,6 +537,7 @@
</group>
</macro>
<macro name="parenthetical-container">
+ <!-- TODO: Add new item types -->
<choose>
<if variable="container-title" match="any">
<group prefix="(" suffix=")">
@@ -759,6 +556,7 @@
</choose>
</macro>
<macro name="bracketed">
+ <!-- TODO: Add new item types -->
<!-- [Descriptive information] -->
<!-- If there is a number, genre is already printed in macro="number" -->
<group prefix="[" suffix="]">
@@ -779,7 +577,9 @@
<text variable="medium" text-case="capitalize-first"/>
</else-if>
<else>
- <!-- Replace with term="review" as that becomes available -->
+ <!-- TODO: Replace with term="review" -->
+ <!-- TODO: Handle review vs review-of depending on presence of reviewed-title -->
+ <!-- TODO: Add reviewed-genre -->
<text value="Review of"/>
</else>
</choose>
@@ -790,7 +590,9 @@
<text variable="medium" text-case="capitalize-first"/>
</if>
<else>
- <!-- Replace with term="review" as that becomes available -->
+ <!-- TODO: Replace with term="review" -->
+ <!-- TODO: Handle review vs review-of depending on presence of reviewed-title -->
+ <!-- TODO: Add reviewed-genre -->
<text value="Review of"/>
</else>
</choose>
@@ -882,7 +684,7 @@
<text variable="medium" text-case="capitalize-first"/>
</else-if>
<else>
- <text term="letter" form="short" text-case="capitalize-first"/>
+ <text term="letter" text-case="capitalize-first"/>
</else>
</choose>
</if>
@@ -892,7 +694,7 @@
<text variable="medium" text-case="capitalize-first"/>
</if>
<else>
- <text term="letter" form="short" text-case="capitalize-first"/>
+ <text term="letter" text-case="capitalize-first"/>
</else>
</choose>
</else>
@@ -927,20 +729,20 @@
<choose>
<if variable="genre">
<text variable="genre" text-case="capitalize-first"/>
- <!-- Replace prefix with performer label as that becomes available -->
+ <!-- TODO: Replace prefix with performer label -->
<names variable="author" prefix="recorded by ">
<name and="symbol" initialize-with=". " delimiter=", "/>
</names>
</if>
<else-if variable="medium">
<text variable="medium" text-case="capitalize-first"/>
- <!-- Replace prefix with performer label as that becomes available -->
+ <!-- TODO: Replace prefix with performer label -->
<names variable="author" prefix="recorded by ">
<name and="symbol" initialize-with=". " delimiter=", "/>
</names>
</else-if>
<else>
- <!-- Replace prefix with performer label as that becomes available -->
+ <!-- TODO: Replace prefix with performer label -->
<names variable="author" prefix="Recorded by ">
<name and="symbol" initialize-with=". " delimiter=", "/>
</names>
@@ -953,13 +755,13 @@
<choose>
<if variable="medium">
<text variable="medium" text-case="capitalize-first"/>
- <!-- Replace prefix with performer label as that becomes available -->
+ <!-- TODO: Replace prefix with performer label -->
<names variable="author" prefix="recorded by ">
<name and="symbol" initialize-with=". " delimiter=", "/>
</names>
</if>
<else>
- <!-- Replace prefix with performer label as that becomes available -->
+ <!-- TODO: Replace prefix with performer label -->
<names variable="author" prefix="Recorded by ">
<name and="symbol" initialize-with=". " delimiter=", "/>
</names>
@@ -993,14 +795,7 @@
</if>
</choose>
</if>
- <else-if type="book">
- <choose>
- <if variable="version" match="none">
- <text macro="format"/>
- </if>
- </choose>
- </else-if>
- <else-if type="report" match="none">
+ <else-if type="report software" match="none">
<text macro="format"/>
</else-if>
</choose>
@@ -1009,11 +804,14 @@
</group>
</macro>
<macro name="bracketed-intext">
+ <!-- TODO: Add new item types -->
<group prefix="[" suffix="]">
<choose>
<if variable="reviewed-author reviewed-title" type="review review-book" match="any">
- <!-- This should be localized -->
- <text macro="reviewed-title-intext" prefix="Review of "/>
+ <group delimiter=" ">
+ <text term="review-of" text-case="capitalize-first"/>
+ <text macro="reviewed-title-intext"/>
+ </group>
</if>
<else-if variable="interviewer" type="interview" match="any">
<names variable="interviewer">
@@ -1034,7 +832,7 @@
<text variable="genre" text-case="capitalize-first"/>
</if>
<else>
- <text term="letter" form="short" text-case="capitalize-first"/>
+ <text term="letter" text-case="capitalize-first"/>
</else>
</choose>
<names variable="recipient" delimiter=", ">
@@ -1055,6 +853,7 @@
</group>
</macro>
<macro name="bracketed-container">
+ <!-- TODO: Add new item types -->
<group prefix="[" suffix="]">
<choose>
<if type="paper-conference speech" match="any">
@@ -1065,7 +864,7 @@
</if>
</choose>
</if>
- <else-if type="book" variable="version" match="all">
+ <else-if type="software" match="all">
<!-- For entries in mobile app reference works, place bracketed after the container-title -->
<text macro="format"/>
</else-if>
@@ -1077,6 +876,8 @@
</group>
</macro>
<macro name="secondary-contributors">
+ <!-- TODO: Add new item types -->
+ <!-- TODO: Add new creator roles -->
<choose>
<if type="article-journal article-magazine article-newspaper post-weblog review review-book" match="any">
<text macro="secondary-contributors-periodical"/>
@@ -1113,6 +914,7 @@
</group>
</macro>
<macro name="secondary-contributors-booklike">
+ <!-- TODO: Add new item types -->
<group delimiter="; ">
<choose>
<if variable="title">
@@ -1122,7 +924,7 @@
</names>
</if>
</choose>
- <!-- When editortranslator becomes available, add a test: variable="editortranslator" match="none"; then print translator -->
+ <!-- TODO: When editortranslator becomes available, add a test: variable="editortranslator" match="none"; then print translator -->
<choose>
<if type="post webpage" match="none">
<!-- Webpages treat container-title like publisher -->
@@ -1160,12 +962,13 @@
<choose>
<if variable="archive-place" match="none">
<!-- With `archive-place`: physical archives. Without: online archives. -->
- <!-- Add archive_collection as that becomes available -->
+ <!-- TODO: Add archive_collection -->
<text variable="archive_location"/>
</if>
</choose>
</macro>
<macro name="number">
+ <!-- TODO: Add new item types -->
<choose>
<if variable="number">
<group delimiter=", ">
@@ -1173,8 +976,7 @@
<text variable="genre" text-case="title"/>
<choose>
<if is-numeric="number">
- <!-- Replace with label variable="number" if that becomes available -->
- <text term="issue" form="short" text-case="capitalize-first"/>
+ <label variable="number" form="short" text-case="capitalize-first"/>
<text variable="number"/>
</if>
<else>
@@ -1197,6 +999,7 @@
</choose>
</macro>
<macro name="locators-booklike">
+ <!-- TODO: Add new item types -->
<choose>
<if type="article-journal article-magazine article-newspaper broadcast interview patent post post-weblog review review-book speech webpage" match="any"/>
<else-if type="paper-conference">
@@ -1223,8 +1026,7 @@
<choose>
<if is-numeric="version">
<group delimiter=" ">
- <!-- replace with label variable="version" if that becomes available -->
- <text term="version" text-case="capitalize-first"/>
+ <label variable="version" text-case="capitalize-first"/>
<text variable="version"/>
</group>
</if>
@@ -1247,6 +1049,7 @@
</choose>
</macro>
<macro name="volume-booklike">
+ <!-- TODO: Add new item types -->
<group delimiter=", ">
<!-- Report series [ex. 52] -->
<choose>
@@ -1259,6 +1062,7 @@
</choose>
<choose>
<if variable="volume" match="any">
+ <!-- TODO: Update using volume-title -->
<choose>
<!-- Non-numeric volumes are already printed as part of the book title -->
<if is-numeric="volume" match="none"/>
@@ -1272,8 +1076,7 @@
</if>
<else>
<group>
- <!-- Replace with label variable="number-of-volumes" if that becomes available -->
- <text term="volume" form="short" text-case="capitalize-first" suffix=" "/>
+ <label variable="number-of-volumes" form="short" text-case="capitalize-first" suffix=" "/>
<text term="page-range-delimiter" prefix="1"/>
<number variable="number-of-volumes" form="numeric"/>
</group>
@@ -1315,6 +1118,7 @@
</choose>
</macro>
<macro name="format">
+ <!-- TODO: Add new item types -->
<choose>
<if variable="genre medium" match="any">
<group delimiter="; ">
@@ -1327,18 +1131,17 @@
</group>
</if>
<!-- Generic labels for specific types -->
- <!-- These should be localized when possible -->
+ <!-- TODO: Add terms for other types? -->
<else-if type="dataset">
- <text value="Data set"/>
+ <text term="dataset"/>
</else-if>
- <else-if type="book" variable="version" match="all">
- <!-- Replace with type="software" and term="software" as that becomes available -->
- <text value="Computer software"/>
+ <else-if type="software">
+ <text term="software" text-case="capitalize-first"/>
</else-if>
<else-if type="interview personal_communication" match="any">
<choose>
<if variable="archive container-title DOI publisher URL" match="none">
- <text term="letter" text-case="capitalize-first"/>
+ <text term="personal-communication" text-case="capitalize-first"/>
</if>
<else-if type="interview">
<text term="interview" text-case="capitalize-first"/>
@@ -1346,11 +1149,12 @@
</choose>
</else-if>
<else-if type="map">
- <text value="Map"/>
+ <text term="map" text-case="capitalize-first"/>
</else-if>
</choose>
</macro>
<macro name="format-intext">
+ <!-- TODO: Add new item types -->
<choose>
<if variable="genre" match="any">
<text variable="genre" text-case="capitalize-first"/>
@@ -1359,18 +1163,17 @@
<text variable="medium" text-case="capitalize-first"/>
</else-if>
<!-- Generic labels for specific types -->
- <!-- These should be localized when possible -->
+ <!-- TODO: Add terms for other types? -->
<else-if type="dataset">
- <text value="Data set"/>
+ <text term="dataset"/>
</else-if>
- <else-if type="book" variable="version" match="all">
- <!-- Replace with type="software" and term="software" as that becomes available -->
- <text value="Computer software"/>
+ <else-if type="software">
+ <text term="software" text-case="capitalize-first"/>
</else-if>
<else-if type="interview personal_communication" match="any">
<choose>
<if variable="archive container-title DOI publisher URL" match="none">
- <text term="letter" text-case="capitalize-first"/>
+ <text term="personal-communication" text-case="capitalize-first"/>
</if>
<else-if type="interview">
<text term="interview" text-case="capitalize-first"/>
@@ -1378,13 +1181,14 @@
</choose>
</else-if>
<else-if type="map">
- <text value="Map"/>
+ <text term="map"/>
</else-if>
</choose>
</macro>
<!-- APA 'source' element contains four parts:
container, event, publisher, access -->
<macro name="container">
+ <!-- TODO: Add new item types -->
<choose>
<if type="article-journal article-magazine article-newspaper post-weblog review review-book" match="any">
<!-- Periodical items -->
@@ -1440,6 +1244,7 @@
<if variable="issued">
<choose>
<if variable="issue page volume" match="none">
+ <!-- TODO: Should I print status as-is, or should I print the in-press term? -->
<text variable="status" text-case="capitalize-first"/>
</if>
</choose>
@@ -1448,13 +1253,14 @@
</group>
</macro>
<macro name="container-booklike">
+ <!-- TODO: Add new item types -->
<choose>
<if variable="container-title" match="any">
<group delimiter=" ">
<text term="in" text-case="capitalize-first"/>
<group delimiter=", ">
<names variable="editor translator" delimiter=", &amp; ">
- <!-- Change to editortranslator and move editor to substitute as that becomes available -->
+ <!-- TODO: Change to editortranslator and move editor to substitute -->
<name and="symbol" initialize-with=". " delimiter=", "/>
<label form="short" text-case="title" prefix=" (" suffix=")"/>
<substitute>
@@ -1465,7 +1271,7 @@
</names>
<group delimiter=": " font-style="italic">
<text variable="container-title"/>
- <!-- Replace with volume-title as that becomes available -->
+ <!-- TODO: Replace with volume-title -->
<choose>
<if is-numeric="volume" match="none">
<group delimiter=" ">
@@ -1483,6 +1289,7 @@
</choose>
</macro>
<macro name="publisher">
+ <!-- TODO: Add new item types -->
<group delimiter="; ">
<choose>
<if type="thesis">
@@ -1517,7 +1324,7 @@
<!-- With `archive-place`: physical archives. Without: online archives. -->
<!-- For physical archives, print the location before the archive name.
For electronic archives, these are printed in macro="description". -->
- <!-- Split "archive_location" into "archive_collection" and "archive_location" as that becomes available -->
+ <!-- TODO: Split "archive_location" into "archive_collection" and "archive_location" -->
<!-- Must test for archive_collection:
With collection: archive_collection (archive_location), archive, archive-place
No collection: archive (archive_location), archive-place
@@ -1552,6 +1359,7 @@
</choose>
</macro>
<macro name="event">
+ <!-- TODO: Add new item types (e.g., event, collection, performance) -->
<choose>
<if variable="event event-title" match="any">
<!-- To prevent Zotero from printing event-place due to its double-mapping of all 'place' to
@@ -1584,6 +1392,7 @@
</macro>
<!-- After 'source', APA also prints publication history (original publication, reprint info, retraction info) -->
<macro name="publication-history">
+ <!-- TODO: Add new item types -->
<choose>
<if type="patent" match="none">
<group prefix="(" suffix=")">
@@ -1595,6 +1404,7 @@
<text variable="references"/>
</if>
<else>
+ <!-- TODO: Replace these with terms -->
<group delimiter=" ">
<text term="original-work-published" text-case="capitalize-first"/>
<choose>
@@ -1617,86 +1427,60 @@
</macro>
<!-- Legal citations have their own rules -->
<macro name="legal-cites">
+ <!-- TODO: Add new item types -->
<choose>
- <if type="legal_case">
- <group delimiter=". ">
- <group delimiter=", ">
- <text variable="title"/>
- <group delimiter=" ">
- <text macro="container-legal"/>
- <text macro="date-legal"/>
- </group>
- <text variable="references"/>
- </group>
+ <if type="treaty">
+ <!-- APA generally defers to Bluebook for legal citations, but diverges without
+ explanation for treaty items. The Bluebook format that was used in APA 6th
+ ed. is used here. -->
+ <group delimiter=", ">
+ <text variable="title" text-case="title"/>
+ <names variable="author">
+ <name initialize-with="." form="short" delimiter="-"/>
+ </names>
+ <text macro="date-legal"/>
+ <text macro="container-legal"/>
<text macro="access"/>
</group>
</if>
- <else-if type="bill">
- <!-- Currently designed to handle bills, resolutions, hearings, rederal reports. -->
+ <else>
+ <!-- For `bill`: currently designed to handle bills, resolutions, federal reports. -->
+ <!-- For `legislation`: currently designed to handle statutes, codified regulations, executive orders. -->
<group delimiter=". ">
<group delimiter=", ">
<choose>
- <if variable="number container-title" match="none">
- <!-- If no number or container-title, then assume it is a hearing -->
- <text variable="title" font-style="italic"/>
- </if>
- <else>
+ <if type="bill legal_case legislation" match="any">
<text variable="title"/>
- </else>
+ </if>
+ <else-if type="hearing">
+ <text variable="title" font-style="italic"/>
+ </else-if>
</choose>
<group delimiter=" ">
<text macro="container-legal"/>
<text macro="date-legal"/>
<choose>
- <if variable="number container-title" match="none">
- <!-- If no number or container-title, then assume it is a hearing -->
+ <if type="hearing">
<names variable="author" prefix="(testimony of " suffix=")">
+ <!-- TODO: Localize this with the hearing term. -->
<name and="symbol" delimiter=", "/>
</names>
</if>
- <else>
+ <else-if type="bill legislation" match="any">
+ <!-- `legislation`: For uncodified regulations, assume future code section is in status. -->
<text variable="status" prefix="(" suffix=")"/>
- </else>
+ </else-if>
</choose>
</group>
<text variable="references"/>
</group>
<text macro="access"/>
</group>
- </else-if>
- <else-if type="legislation">
- <!-- Currently designed to handle statutes, codified regulations, executive orders.
- For uncodified regulations, assume future code section is in status. -->
- <group delimiter=". ">
- <group delimiter=", ">
- <text variable="title"/>
- <group delimiter=" ">
- <text macro="container-legal"/>
- <text macro="date-legal"/>
- <text variable="status" prefix="(" suffix=")"/>
- </group>
- <text variable="references"/>
- </group>
- <text macro="access"/>
- </group>
- </else-if>
- <else-if type="treaty">
- <!-- APA generally defers to Bluebook for legal citations, but diverges without
- explanation for treaty items. The Bluebook format that was used in APA 6th
- ed. is used here. -->
- <group delimiter=", ">
- <text variable="title" text-case="title"/>
- <names variable="author">
- <name initialize-with="." form="short" delimiter="-"/>
- </names>
- <text macro="date-legal"/>
- <text macro="container-legal"/>
- <text macro="access"/>
- </group>
- </else-if>
+ </else>
</choose>
</macro>
<macro name="date-legal">
+ <!-- TODO: Add new item types -->
<choose>
<if type="legal_case">
<group prefix="(" suffix=")" delimiter=" ">
@@ -1712,7 +1496,7 @@
</choose>
</group>
</if>
- <else-if type="bill legislation" match="any">
+ <else-if type="bill legislation hearing" match="any">
<group prefix="(" suffix=")" delimiter=" ">
<group delimiter=" ">
<date variable="original-date">
@@ -1731,6 +1515,7 @@
</choose>
</macro>
<macro name="container-legal">
+ <!-- TODO: Add new item types -->
<!-- Expect legal item container-titles to be stored in short form -->
<choose>
<if type="legal_case">
@@ -1741,8 +1526,7 @@
<text variable="volume"/>
<text variable="container-title"/>
<group delimiter=" ">
- <!-- Change to label variable="section" as that becomes available -->
- <text term="section" form="symbol"/>
+ <label variable="section" form="symbol"/>
<text variable="section"/>
</group>
<choose>
@@ -1759,8 +1543,7 @@
<group delimiter=" ">
<choose>
<if is-numeric="number">
- <!-- Replace with label variable="number" if that becomes available -->
- <text term="issue" form="short" text-case="capitalize-first"/>
+ <label variable="number" form="short" text-case="capitalize-first"/>
</if>
</choose>
<text variable="number"/>
@@ -1776,8 +1559,7 @@
<group delimiter=" ">
<choose>
<if variable="chapter-number container-title" match="none">
- <!-- Replace with label variable="number" as that becomes available -->
- <text term="issue" form="short"/>
+ <label variable="number" form="short"/>
</if>
</choose>
<text variable="number"/>
@@ -1812,7 +1594,7 @@
<choose>
<if variable="section">
<group delimiter=" ">
- <!-- Change to label variable="section" as that becomes available -->
+ <!-- TODO: Change to label variable="section" -->
<text term="section" form="symbol"/>
<text variable="section"/>
</group>
@@ -1835,8 +1617,7 @@
</if>
<else>
<group delimiter=" ">
- <!-- Replace with label variable="number" if that becomes available -->
- <text term="issue" form="short" text-case="capitalize-first"/>
+ <label variable="number" form="short" text-case="capitalize-first"/>
<text variable="number"/>
</group>
</else>
@@ -1846,6 +1627,7 @@
</choose>
</macro>
<macro name="citation-locator">
+ <!-- TODO: Add new locator types? -->
<group delimiter=" ">
<choose>
<if locator="chapter">
@@ -1883,6 +1665,7 @@
</sort>
<layout>
<choose>
+ <!-- TODO: Add new item types -->
<if type="bill legal_case legislation treaty" match="any">
<!-- Legal items have different orders and delimiters -->
<choose>
diff --git a/biblio/citation-style-language/citation-style-language-bib.sty b/biblio/citation-style-language/citation-style-language-bib.sty
index ee8f33d504..4f450ff8dc 100644
--- a/biblio/citation-style-language/citation-style-language-bib.sty
+++ b/biblio/citation-style-language/citation-style-language-bib.sty
@@ -285,7 +285,8 @@
}
% Hook
-\cs_new:Npn \backref #1 {#1}
+\cs_if_free:NT \backref
+ { \cs_new:Npn \backref #1 {#1} }
% For author-date bibliography
diff --git a/biblio/citation-style-language/citation-style-language-cite.sty b/biblio/citation-style-language/citation-style-language-cite.sty
index 9ac52d7df0..bbfb9c6336 100644
--- a/biblio/citation-style-language/citation-style-language-cite.sty
+++ b/biblio/citation-style-language/citation-style-language-cite.sty
@@ -56,15 +56,24 @@
\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
+ \bool_if:NTF \l__csl_note_bool
+ {
+ % In note styles, the authors are printed in-text followed by a note.
+ \bool_set_false:N \l__csl_note_bool
+ \__csl_cite_author:nnn {#1} {#2} {#3}
+ \bool_set_true:N \l__csl_note_bool
+ \__csl_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 }
+ \__csl_make_citation:N \l__csl_citation_info_prop
+ }
}
@@ -457,7 +466,9 @@
\bool_if:NT \l__csl_regression_test_bool
{ \tl_show:N \l__csl_citation_tl }
\group_begin:
- \reset@font \l__csl_citation_tl
+ \bool_if:NTF \l__csl_note_bool
+ { \footnote { \reset@font \l__csl_citation_tl } }
+ { \reset@font \l__csl_citation_tl }
\group_end:
}
@@ -509,7 +520,7 @@
{
\__csl_if_preamble:TF
{
- \AtBeginDocument
+ \hook_gput_code:nnn { begindocument } { . }
{ \exp_args:Nx \__csl_write_aux_citation:n { #1 } }
}
{ \exp_args:Nx \__csl_write_aux_citation:n { #1 } }
diff --git a/biblio/citation-style-language/citation-style-language-compatible.sty b/biblio/citation-style-language/citation-style-language-compatible.sty
index db70f54c1c..eedc5dc4a1 100644
--- a/biblio/citation-style-language/citation-style-language-compatible.sty
+++ b/biblio/citation-style-language/citation-style-language-compatible.sty
@@ -9,7 +9,7 @@
% ### `babel`
% This should be disabled.
-\AtEndOfPackageFile* { babel }
+\hook_gput_code:nnn { package / babel / after } { . }
{
\RenewDocumentCommand \nocite { m }
{
@@ -24,6 +24,54 @@
}
+% ### `backref`
+
+\hook_gput_code:nnn { package / backref / after } { . }
+ {
+ \cs_set:Npn \__csl_add_back_ref_info:
+ { \seq_map_inline:Nn \l__csl_cite_keys_seq { \Hy@backout {##1} } }
+ }
+
+
+% ### `beamer`
+
+% `beamer` passes `implicit=false` to `hyperref` to skip its patch to LaTeX2e
+% internal bibliographic commands. Instead `beamer` refines those commands
+% in its own way.
+
+\cs_new:Npn \__csl_beamer_cite_item:nn #1#2
+ { \hyperlink { beamerbib #1 } { #2 } }
+
+\cs_new:Npn \__csl_beamer_lbibitem:nn [#1]#2
+ {
+ \exp_after:wN \item \beamer@bibstore [ \@biblabel {#1} \hfill ]
+ \cs_if_exist:cF { beamerbib@ #2 @ \int_use:N \c@framenumber }
+ {
+ \cs_gset:cpn { beamerbib@ #2 @ \int_use:N \c@framenumber } { \relax }
+ \hypertarget { beamerbib #2 } { }
+ }
+ \hbox { }
+ \ignorespaces
+ }
+
+\cs_new:Npn \__csl_beamer_lbibitem:n #1
+ {
+ \exp_after:wN \item \beamer@bibstore
+ \cs_if_exist:cF { beamerbib@ #1 @ \int_use:N \c@framenumber }
+ {
+ \cs_gset:cpn { beamerbib@ #1 @ \int_use:N \c@framenumber } { \relax }
+ \hypertarget { beamerbib #1 } { }
+ }
+ }
+
+\hook_gput_code:nnn { class / beamer / after } { . }
+ {
+ \cs_gset_eq:NN \@lbibitem \__csl_beamer_lbibitem:nn
+ \cs_gset_eq:NN \@bibitem \__csl_beamer_bibitem:n
+ \cs_gset_eq:NN \cslcite \__csl_beamer_cite_item:nn
+ }
+
+
% ### `biblatex`
% The following doesn't really make `csl` compatible with `biblatex`.
% It just provides commands to make it accepting `biblatex`'s database.
@@ -37,7 +85,7 @@
% ### `csquotes`
-\AtEndOfPackageFile* { csquotes }
+\hook_gput_code:nnn { package / csquotes / after } { . }
{
\BlockquoteDisable
{
@@ -49,21 +97,6 @@
% ### `hyperref`
-% The hyperref package also patches \bibcite but it cannot provide hyperlinks
-% when used with csl.
-\bool_new:N \l__csl_hyperref_loaded_bool
-\AtEndOfPackageFile* { hyperref }
- {
- \bool_set_true:N \l__csl_hyperref_loaded_bool
- % Pakcage "hyperref" redefines \@lbibitem and \bibitem and we need to
- % recover them.
- \cs_gset_eq:NN \@lbibitem \__csl_lbibitem:
- \cs_gset_eq:NN \@bibitem \__csl_bibitem:
- \cs_gset_eq:NN \__csl_lbibitem_plain:nn \__csl_hyperref_lbibitem:nn
- \cs_gset_eq:NN \__csl_bibitem_plain:n \__csl_hyperref_bibitem:n
- \cs_gset_eq:NN \cslcite \__csl_hyperref_cite_item:nn
- }
-
\cs_set:Npn \__csl_hyperref_cite_item:nn #1#2
{ \hyper@@link [ cite ] { } { cite. #1 \@extra@b@citeb } { #2 } }
@@ -100,3 +133,23 @@
}
\ignorespaces
}
+
+% The hyperref package also patches \bibcite but it cannot provide hyperlinks
+% when used with csl.
+\bool_new:N \l__csl_hyperref_loaded_bool
+\hook_gput_code:nnn { package / hyperref / after } { . }
+ {
+ \bool_set_true:N \l__csl_hyperref_loaded_bool
+ % Pakcage "hyperref" redefines \@lbibitem and \bibitem and we need to
+ % recover them.
+ % In non-implicit mode (e.g., loaded by `beamer`), hyperref stops early
+ % (`\MaybeStopEarly`) and it doesn't redefine the cite internal commands.
+ \cs_if_exist:NT \@extra@b@citeb
+ {
+ \cs_gset_eq:NN \@lbibitem \__csl_lbibitem:
+ \cs_gset_eq:NN \@bibitem \__csl_bibitem:
+ \cs_gset_eq:NN \__csl_lbibitem_plain:nn \__csl_hyperref_lbibitem:nn
+ \cs_gset_eq:NN \__csl_bibitem_plain:n \__csl_hyperref_bibitem:n
+ \cs_gset_eq:NN \cslcite \__csl_hyperref_cite_item:nn
+ }
+ }
diff --git a/biblio/citation-style-language/citation-style-language-doc.pdf b/biblio/citation-style-language/citation-style-language-doc.pdf
index 301c74080c..2765720657 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 50b95ee1ae..991b68dcfb 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{2023-07-04 v0.4.2}
+\date{2023-09-07 v0.4.3}
\maketitle
@@ -243,24 +243,19 @@ By default, it is 1 em (with respect to the \opt{bib-font} size if set).
\begin{function}{\addbibresource}
\begin{syntax}
- \cs{addbibresource}\oarg{options}\marg{resource}
+ \cs{addbibresource}\marg{resource}
\end{syntax}
\end{function}
-The \cs{addbibresource} command adds the contents of \meta{resource} into the
-bibliographic metadata.
-The \meta{resource} may be a CSL-JSON file or the Bib(La)TeX \file{.bib} file.
-CSL-JSON \footnote{\url{https://github.com/citation-style-language/schema\#csl-json-schema}}
-is the default data model defined by CSL.
-Its contents are usually exported from Zotero.
-The traditional \file{.bib} file is converted to CSL-JSON internally for
-further processing.
-The mapping of entry-types and fields between them is detailed in the GitHub wiki
-page\footnote{\url{https://github.com/zepinglee/citeproc-lua/wiki/Bib-CSL-mapping}}.
-Note that only UTF-8 encoding is supported in the \meta{resource} file.
+The \cs{addbibresource} command loads bibliographic data from \meta{resource}
+file. CSL-JSON is the preferred format especially when the data is exported
+from a reference manager like Zotero. Other formats like CSL-YAML and
+Bib(La)TeX (for compatibility) are also supported but they need to be converted
+to CSL-JSON for internal processing. Note that the files must be specified with
+their extension names and the content should be encoded in UTF-8.
\begin{LaTeXdemo}
- \addbibresource{data-file.json}
- \addbibresource{bib-file.bib}
+ \addbibresource{file1.json}
+ \addbibresource{file2.yaml, file3.bib}
\end{LaTeXdemo}
@@ -407,11 +402,17 @@ Currently no options are available.
The main language set by \pkg{babel} is used as the locale for \pkg{citation-style-language}.
In general, \pkg{babel} is supposed to be loaded before \pkg{citation-style-language}.
+\paragraph{\pkg{beamer}}
+
+Most of this package's features work fine with \pkg{beamer} except the
+\opt{backref} option. At the moment this can be addressed with \pkg{hyperref}'s
+\opt{backref} option.
+
+
\paragraph{\pkg{hyperref}}
When \pkg{hyperref} is loaded, the DOIs, PMIDs, and PMCIDs are correctly
rendered as hyperlinks.
-But the citations are not linked to the entries in bibliography.
\paragraph{Incompatible packages}
diff --git a/biblio/citation-style-language/citation-style-language-init.sty b/biblio/citation-style-language/citation-style-language-init.sty
index ff35eed14e..db7dc0111a 100644
--- a/biblio/citation-style-language/citation-style-language-init.sty
+++ b/biblio/citation-style-language/citation-style-language-init.sty
@@ -6,7 +6,7 @@
% ## Initialization at `\begin{document}`
-\AtBeginDocument { \__csl_at_begin_document_hook: }
+\hook_gput_code:nnn { begindocument } { . } { \__csl_at_begin_document_hook: }
\cs_new:Npn \__csl_at_begin_document_hook:
@@ -14,7 +14,10 @@
\__csl_write_aux_info:
\sys_if_engine_luatex:TF
{ \__csl_initialize_lua_module: }
- { \__csl_load_bbl: }
+ {
+ \__csl_load_bbl:
+ \__csl_read_style_class:
+ }
}
@@ -316,5 +319,25 @@
\group_end:
}
+
+% The `\textcite` bahaves differently with note styles.
+% Thus we read the style class from the `.csl` file with non-LuaTeX engines.
+\ior_new:N \l__csl_style_ior
+\cs_new:Npn \__csl_read_style_class:
+ {
+ \exp_args:NNx \ior_open:Nn \l__csl_style_ior { \l__csl_style_tl .csl }
+ \ior_map_inline:Nn \l__csl_style_ior
+ {
+ % \tl_show:n {##1}
+ \tl_if_in:nnT {##1} { class="note" }
+ {
+ \tl_set:Nn \l__csl_class_tl { note }
+ \bool_set_true:N \l__csl_note_bool
+ \ior_map_break:
+ }
+ }
+ \ior_close:N \l__csl_style_ior
+ }
+
% \msg_new:nnn { citation-style-language } { file / non-exist }
% { No~ file~ #1. }
diff --git a/biblio/citation-style-language/citation-style-language.sty b/biblio/citation-style-language/citation-style-language.sty
index 974b918c8d..c7c54fb4d9 100644
--- a/biblio/citation-style-language/citation-style-language.sty
+++ b/biblio/citation-style-language/citation-style-language.sty
@@ -9,11 +9,10 @@
\RequirePackage{expl3}
\RequirePackage{xparse}
-\ProvidesExplPackage {citation-style-language} {2023-07-04} {0.4.2}
+\ProvidesExplPackage {citation-style-language} {2023-09-07} {0.4.3}
{Citation Style Language for LaTeX}
\RequirePackage { l3keys2e }
-\RequirePackage { filehook }
\RequirePackage { url }
@@ -23,12 +22,12 @@
\clist_map_inline:nn
{
- babelbib , backref , biblatex , bibtopic , bibunits , chapterbib ,
+ babelbib , biblatex , bibtopic , bibunits , chapterbib ,
cite , citeref , inlinebib , jurabib , mcite , mciteplus ,
multibib , natbib , splitbib
}
{
- \AtBeginOfPackageFile* {#1}
+ \hook_gput_code:nnn { package / #1 / before } { . }
{ \msg_error:nnn { citation-style-language } { incompatible-package } {#1} }
}
diff --git a/biblio/citation-style-language/citeproc-bibtex-data.lua b/biblio/citation-style-language/citeproc-bibtex-data.lua
index 8018554c73..b875f3eb91 100644
--- a/biblio/citation-style-language/citeproc-bibtex-data.lua
+++ b/biblio/citation-style-language/citeproc-bibtex-data.lua
@@ -4185,6 +4185,10 @@ return {
csl = nil,
source = "adrbirthday.bst",
},
+ monthtie = {
+ csl = nil,
+ source = "tugboat.bst",
+ },
},
macros = {
acmcs = {
diff --git a/biblio/citation-style-language/citeproc-bibtex-parser.lua b/biblio/citation-style-language/citeproc-bibtex-parser.lua
index 00d66169f6..aa6bf67183 100644
--- a/biblio/citation-style-language/citeproc-bibtex-parser.lua
+++ b/biblio/citation-style-language/citeproc-bibtex-parser.lua
@@ -13,9 +13,9 @@
-- @module bibtex_parser
local bibtex_parser = {}
-local unicode
-local bibtex_data
-local util
+local unicode
+local bibtex_data
+local util
if kpse then
unicode = require("citeproc-unicode")
bibtex_data = require("citeproc-bibtex-data")
@@ -136,8 +136,8 @@ local BibtexParser = {
-- allow_escaped_braces = true,
convert_to_unicode = false,
-- common_strings = false,
- split_names = false,
- split_name_parts = false,
+ -- split_names = false,
+ -- split_name_parts = false,
},
-- variables
name_fields = {},
@@ -163,14 +163,19 @@ end
---@alias BibtexEntry { key: string, type: string, fields: table<string, string> }
----@alias BibtexData table
+---@class BibtexData
+---@field entries BibtexEntry[]
+---@field entries_by_id table<string, BibtexEntry>
+---@field strings table<string, string>
+---@field preamble string?
+
---@alias Exception table
---comment
---@param bib_str string
----@param strings table
+---@param strings table<string, string>?
---@return BibtexData?
----@return Exception[]?
+---@return Exception[]
function BibtexParser:parse(bib_str, strings)
if strings then
strings = setmetatable({}, {__index = strings})
@@ -189,6 +194,7 @@ function BibtexParser:parse(bib_str, strings)
return nil, {error}
end
+ ---@type BibtexData
local res = {
---@type BibtexEntry[]
entries = {},
@@ -197,6 +203,7 @@ function BibtexParser:parse(bib_str, strings)
strings = {},
preamble = nil,
}
+ ---@type Exception[]
local exceptions = {}
for _, object in ipairs(bib_objects) do
@@ -245,16 +252,17 @@ function BibtexParser:_make_entry(object, strings)
value = latex_parser.latex_to_unicode(value)
end
- if self.name_fields[field] then
- if self.options.split_names then
- value = bibtex_parser.split_names(value)
- if self.options.split_name_parts then
- for i, name in ipairs(value) do
- value[i] = bibtex_parser.split_name_parts(name)
- end
- end
- end
- end
+ -- if self.name_fields[field] then
+ -- if self.options.split_names then
+ -- local value = bibtex_parser.split_names(value)
+ -- value = {}
+ -- if self.options.split_name_parts then
+ -- for i, name in ipairs(value) do
+ -- value[i] = bibtex_parser.split_name_parts(name)
+ -- end
+ -- end
+ -- end
+ -- end
object.fields[field] = value
end
@@ -483,13 +491,49 @@ function bibtex_parser._split_von_last_parts(str)
end
+--- Note that BibTeX find crossref in a case-insensitive manner (see
+--- `article-crossref` in `xampl.bib`) which is unlike biber/biblatex.
+--- This function is case-sensitive.
+---@param entry_list BibtexEntry[]
+---@param entry_dict table<string, BibtexEntry>?
+function bibtex_parser.resolve_crossrefs(entry_list, entry_dict)
+ if not entry_dict then
+ entry_dict = {}
+ for _, entry in ipairs(entry_list) do
+ entry_dict[entry.key] = entry
+ end
+ end
+ for _, entry in ipairs(entry_list) do
+ local ref_entry = entry
+ ---@type string?
+ local ref_key = entry.fields.crossref
+ while ref_key do
+ local crossref_entry = entry_dict[ref_key]
+ if crossref_entry then
+ ref_entry = crossref_entry
+ for field, value in pairs(ref_entry.fields) do
+ if not entry.fields[field] then
+ entry.fields[field] = value
+ end
+ end
+ ref_key = ref_entry.fields.crossref
+ else
+ util.warning(string.format("Didn't find a database entry for crossref '%s' in entry '%s'.", ref_key, ref_entry.key))
+ ref_entry.fields.crossref = nil
+ ref_key = nil
+ end
+ end
+ end
+end
+
+
bibtex_parser._default_parser = BibtexParser:new()
---comment
---@param bib_str string input string
----@param strings table<string, string> strings
----@return BibtexData?, Exception[]?
+---@param strings table<string, string>? strings
+---@return BibtexData?, Exception[]
function bibtex_parser.parse(bib_str, strings)
return bibtex_parser._default_parser:parse(bib_str, strings)
end
diff --git a/biblio/citation-style-language/citeproc-bibtex2csl.lua b/biblio/citation-style-language/citeproc-bibtex2csl.lua
index 51e0e7f42f..3588b50df8 100644
--- a/biblio/citation-style-language/citeproc-bibtex2csl.lua
+++ b/biblio/citation-style-language/citeproc-bibtex2csl.lua
@@ -27,7 +27,7 @@ else
end
----@alias CslItem table<string, nil | string | number | table>
+---@alias CslItem ItemData
---@alias CslData CslItem[]
@@ -49,6 +49,7 @@ function bibtex2csl.parse_bibtex_to_csl(str, keep_unknown_commands, case_protect
local bib_data, exceptions = bibtex_parser.parse(str, strings)
local csl_json_items = nil
if bib_data then
+ bibtex_parser.resolve_crossrefs(bib_data.entries, bibtex_data.entries_by_id)
csl_json_items = bibtex2csl.convert_to_csl_data(bib_data, keep_unknown_commands, case_protection, sentence_case_title, check_sentence_case)
end
return csl_json_items, exceptions
@@ -71,68 +72,58 @@ function bibtex2csl.convert_to_csl_data(bib, keep_unknown_commands, case_protect
end
for _, entry in ipairs(bib.entries) do
- ---@type CslItem
- local item = {
- id = entry.key,
- type = "document",
- }
+ local item = bibtex2csl.convert_to_csl_item(entry, keep_unknown_commands, case_protection, sentence_case_title, check_sentence_case)
+ table.insert(csl_data, item)
+ end
+ return csl_data
+end
- -- crossref
- if entry.fields.crossref then
- bibtex2csl.process_cross_ref(entry, entries_by_id)
- end
- bibtex2csl.pre_process_special_fields(item, entry)
-
- -- First convert primary fields
- for field, csl_field in pairs(bibtex_data.primary_fields) do
- local value = entry.fields[field]
- if value then
- local _, csl_value = bibtex2csl.convert_field(
- field, value, keep_unknown_commands, case_protection, sentence_case_title, item.language, check_sentence_case)
- if csl_field and csl_value and not item[csl_field] then
- item[csl_field] = csl_value
- end
- end
- end
+---@param entry BibtexEntry
+---@param keep_unknown_commands boolean?
+---@param case_protection boolean?
+---@param sentence_case_title boolean?
+---@param check_sentence_case boolean?
+---@return CslItem
+function bibtex2csl.convert_to_csl_item(entry, keep_unknown_commands, case_protection, sentence_case_title, check_sentence_case)
+ ---@type CslItem
+ local item = {
+ id = entry.key,
+ type = "document",
+ }
- -- Convert the fields in a fixed order
- local field_list = {}
- for field, _ in pairs(entry.fields) do
- table.insert(field_list, field)
- end
- table.sort(field_list)
+ bibtex2csl.pre_process_special_fields(item, entry)
- for _, field in ipairs(field_list) do
- local value = entry.fields[field]
- local csl_field, csl_value = bibtex2csl.convert_field(
+ -- First convert primary fields
+ for field, csl_field in pairs(bibtex_data.primary_fields) do
+ local value = entry.fields[field]
+ if value then
+ local _, csl_value = bibtex2csl.convert_field(
field, value, keep_unknown_commands, case_protection, sentence_case_title, item.language, check_sentence_case)
if csl_field and csl_value and not item[csl_field] then
item[csl_field] = csl_value
end
end
-
- bibtex2csl.post_process_special_fields(item, entry, entry.type)
-
- table.insert(csl_data, item)
end
- return csl_data
-end
-
----@param entry BibtexEntry
----@param entries_by_id table<string, BibtexEntry>
-function bibtex2csl.process_cross_ref(entry, entries_by_id)
- local ref_entry = entries_by_id[unicode.casefold(entry.fields.crossref)]
- if ref_entry then
- for field, value in pairs(ref_entry.fields) do
- if not entry.fields[field] then
- entry.fields[field] = value
- end
+ -- Convert the fields in a fixed order
+ local field_list = {}
+ for field, _ in pairs(entry.fields) do
+ table.insert(field_list, field)
+ end
+ table.sort(field_list)
+
+ for _, field in ipairs(field_list) do
+ local value = entry.fields[field]
+ local csl_field, csl_value = bibtex2csl.convert_field(
+ field, value, keep_unknown_commands, case_protection, sentence_case_title, item.language, check_sentence_case)
+ if csl_field and csl_value and not item[csl_field] then
+ item[csl_field] = csl_value
end
- else
- util.error(string.format('Crossref "%s" not found.', entry.fields.crossref))
end
+
+ bibtex2csl.post_process_special_fields(item, entry)
+ return item
end
diff --git a/biblio/citation-style-language/citeproc-context.lua b/biblio/citation-style-language/citeproc-context.lua
index 58adc9609c..7ccf72269d 100644
--- a/biblio/citation-style-language/citeproc-context.lua
+++ b/biblio/citation-style-language/citeproc-context.lua
@@ -21,6 +21,21 @@ else
end
+---@class Context
+---@field reference ItemData?
+---@field format any
+---@field cite_id string?
+---@field style any Style
+---@field locale Locale?
+---@field name_citation any
+---@field names_delimiter any
+---@field position any
+---@field disamb_pass any
+---@field cite CitationItem?
+---@field bib_number integer?
+---@field in_bibliography boolean
+---@field sort_key any
+---@field year_suffix any
local Context = {
reference = nil,
format = nil,
@@ -292,6 +307,7 @@ function Context:get_simple_term(name, form, plural)
return self.locale:get_simple_term(name, form, plural)
end
+---@return LocalizedQuotes
function Context:get_localized_quotes()
return LocalizedQuotes:new(
self:get_simple_term("open-quote"),
diff --git a/biblio/citation-style-language/citeproc-element.lua b/biblio/citation-style-language/citeproc-element.lua
index 65d836c646..1ed800e7f2 100644
--- a/biblio/citation-style-language/citeproc-element.lua
+++ b/biblio/citation-style-language/citeproc-element.lua
@@ -29,6 +29,8 @@ local Micro = output.Micro
---@class Element
+---@field element_name string?
+---@field children Element[]?
local Element = {
element_name = nil,
children = nil,
@@ -44,6 +46,9 @@ function Element:new(element_name)
return o
end
+---@param element_name string
+---@param default_options table?
+---@return Element
function Element:derive(element_name, default_options)
local o = {
element_name = element_name or self.element_name,
@@ -62,6 +67,11 @@ function Element:derive(element_name, default_options)
return o
end
+---@class Node
+
+---@param node Node
+---@param parent Element?
+---@return Element
function Element:from_node(node, parent)
local o = self:new()
o.element_name = self.element_name or node:get_element_name()
diff --git a/biblio/citation-style-language/citeproc-engine.lua b/biblio/citation-style-language/citeproc-engine.lua
index a9feeb6f6f..be7031839b 100644
--- a/biblio/citation-style-language/citeproc-engine.lua
+++ b/biblio/citation-style-language/citeproc-engine.lua
@@ -46,12 +46,33 @@ local LatexWriter = output.LatexWriter
local HtmlWriter = output.HtmlWriter
local SortStringFormat = output.SortStringFormat
+local Position = util.Position
----@alias ItemId string
+
+---@alias ItemId string | number
---@alias NoteIndex integer
---@alias CitationId string
----@alias CitationData {citationID: CitationId, citationItems: table[], properties: table}
----@alias ItemData {id: ItemId, type: string, [string]: any}
+---@alias CitationData {citationID: CitationId, citationItems: table[], properties: table, citation_index: integer}
+
+---@class NameVariable
+---@field family string?
+---@field given string?
+---@field dropping-particle string?
+---@field non-dropping-particle string?
+---@field suffix string?
+---@field comma-suffix string | number | boolean?
+---@field static-ordering string | number | boolean?
+---@field literal string | number | boolean?
+---@field parse-names string | number | boolean?
+
+---@class DateVariable
+---@field date-parts (string | number)[][]
+---@field season (string | number)
+---@field circa (string | number | boolean)
+---@field literal string
+---@field raw string
+
+---@alias ItemData { id: ItemId, type: string, language: string?, [string]: string | number | NameVariable[] | DateVariable }
---@class Registry
@@ -69,10 +90,10 @@ local Registry = {}
---@class CiteProc
----@field style any
+---@field style Style
---@field sys any
----@field lcoales any
----@field system_locales any
+---@field locales Locale[]
+---@field system_locales Locale[]
---@field lang string
---@field output_format any
---@field opt table
@@ -96,6 +117,7 @@ function CiteProc.new(sys, style, lang, force_lang)
if sys.retrieveItem == nil then
error("\"citeprocSys.retrieveItem\" required")
end
+ ---@type CiteProc
local o = {}
o.style = Style:parse(style)
@@ -155,7 +177,28 @@ function CiteProc.new(sys, style, lang, force_lang)
return o
end
+---@return boolean
+function CiteProc:is_dependent_style()
+ return self.style.info.independent_parent ~= nil
+end
+
+---@return string?
+function CiteProc:get_independent_parent()
+ return self.style.info.independent_parent
+end
+
+function CiteProc:check_valid_citation_element()
+ if not self.style.citation then
+ if self.style.info and self.style.info.independent_parent then
+ util.error(string.format('This is a dependent style linked to "%s".', self.style.info.independent_parent))
+ else
+ util.error('No <citation> in style.')
+ end
+ end
+end
+
function CiteProc:updateItems(ids)
+ -- util.debug(string.format('updateItems(%s)', table.concat(ids, ", ")))
self.registry.reflist = {}
self.registry.registry = {}
self.person_names = {}
@@ -177,6 +220,9 @@ function CiteProc:updateItems(ids)
end
end
+ -- Clean the first note number to reset all the positions
+ self.cite_first_note_numbers = {}
+
-- TODO: optimize this
self:makeCitationCluster(cite_items)
@@ -238,6 +284,7 @@ end
function CiteProc:processCitationCluster(citation, citationsPre, citationsPost)
-- util.debug(citation.citationID)
+ self:check_valid_citation_element()
citation = self:normalize_citation_input(citation)
-- Registor citation
@@ -345,6 +392,8 @@ function CiteProc:normalize_citation_input(citation)
return citation
end
+---@param cite_item CitationItem
+---@return CitationItem
function CiteProc:normalize_cite_item(cite_item)
-- Shallow copy
cite_item = util.clone(cite_item)
@@ -361,14 +410,14 @@ function CiteProc:normalize_cite_item(cite_item)
if cite_item.prefix == "" then
cite_item.prefix = nil
else
- cite_item.prefix = InlineElement:parse(cite_item.prefix, nil, true)
+ cite_item.prefix_inlines = InlineElement:parse(cite_item.prefix, nil, true)
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, nil, true)
+ cite_item.suffix_inlines = InlineElement:parse(cite_item.suffix, nil, true)
end
end
@@ -435,6 +484,10 @@ function CiteProc:get_tainted_citation_ids(citation_note_pairs)
-- 2 = {"citation-2"},
-- }
+ -- Citations with noteIndex == 0 are in-text citations and they may also
+ -- have position properties.
+ local in_text_citations = {}
+
local previous_citation
for citation_index, pair in ipairs(citation_note_pairs) do
local citation_id, note_number = table.unpack(pair)
@@ -445,9 +498,14 @@ function CiteProc:get_tainted_citation_ids(citation_note_pairs)
local tainted = false
+ local prev_citation = previous_citation
+ if note_number == 0 then
+ -- Find the previous in-text citation.
+ prev_citation = in_text_citations[#in_text_citations]
+ end
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, citation)
+ tainted = self:set_cite_item_position(cite_item, note_number, previous_cite, prev_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.
@@ -466,7 +524,11 @@ function CiteProc:get_tainted_citation_ids(citation_note_pairs)
end
table.insert(self.note_citations_map[note_number], citation.citationID)
if citation.properties.mode ~= "author-only" then
- previous_citation = citation
+ if note_number == 0 then
+ table.insert(in_text_citations, citation)
+ else
+ previous_citation = citation
+ end
end
end
@@ -484,14 +546,11 @@ function CiteProc:get_tainted_citation_ids(citation_note_pairs)
end
function CiteProc:set_cite_item_position(cite_item, note_number, previous_cite, previous_citation, citation)
- local position = util.position_map["first"]
+ local position = Position.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
+ if citation.properties.mode == "author-only" then
-- discretionary_IbidInAuthorDateStyleWithoutIntext.txt
cite_item.position_level = position
return false
@@ -499,12 +558,14 @@ function CiteProc:set_cite_item_position(cite_item, note_number, previous_cite,
local first_reference_note_number = self.cite_first_note_numbers[cite_item.id]
if first_reference_note_number then
- position = util.position_map["subsequent"]
- else
+ position = Position.Subsequent
+ elseif note_number > 0 then
+ -- note_number == 0 implied an in-text citation
self.cite_first_note_numbers[cite_item.id] = note_number
end
local preceding_cite_item = self:get_preceding_cite_item(cite_item, previous_cite, previous_citation, note_number)
+
if preceding_cite_item then
position = self:_get_cite_position(cite_item, preceding_cite_item)
end
@@ -568,18 +629,18 @@ function CiteProc:_get_cite_position(item, preceding_cite)
if preceding_cite.locator then
if item.locator then
if item.locator == preceding_cite.locator and item.label == preceding_cite.label then
- return util.position_map["ibid"]
+ return Position.Ibid
else
- return util.position_map["ibid-with-locator"]
+ return Position.IbidWithLocator
end
else
- return util.position_map["subsequent"]
+ return Position.Subsequent
end
else
if item.locator then
- return util.position_map["ibid-with-locator"]
+ return Position.IbidWithLocator
else
- return util.position_map["ibid"]
+ return Position.Ibid
end
end
end
@@ -611,9 +672,9 @@ function CiteProc:makeCitationCluster(citation_items)
item_data["first-reference-note-number"] = citations[1].properties.noteIndex
end
- cite_item.position_level = util.position_map["first"]
+ cite_item.position_level = Position.First
if self.cite_first_note_numbers[cite_item.id] then
- cite_item.position_level = util.position_map["subsequent"]
+ cite_item.position_level = Position.Subsequent
else
self.cite_first_note_numbers[cite_item.id] = 0
end
@@ -641,6 +702,7 @@ function CiteProc:makeCitationCluster(citation_items)
self:sort_bibliography()
end
+ self:check_valid_citation_element()
local citation_element = self.style.citation
if special_form == "author-only" and self.style.intext then
citation_element = self.style.intext
@@ -879,7 +941,10 @@ function CiteProc.create_element_tree(node)
return el
end
+---@param id ItemId
+---@return ItemData?
function CiteProc:get_item(id)
+ ---@type ItemData?
local item = self.registry.registry[id]
if not item then
item = self:_retrieve_item(id)
@@ -898,6 +963,8 @@ function CiteProc:get_item(id)
return item
end
+---@param id ItemId
+---@return ItemData?
function CiteProc:_retrieve_item(id)
-- Retrieve, copy, and normalize
local res = {}
@@ -940,7 +1007,7 @@ function CiteProc:process_extra_note(item)
if variable_type == "number" then
item[field] = value
elseif variable_type == "date" then
- item[field] = util.parse_iso_date(value)
+ item[field] = util.parse_edtf(value)
elseif variable_type == "name" then
if not note_fields[field] then
note_fields[field] = {}
@@ -1081,6 +1148,7 @@ function CiteProc:get_style_class()
end
+---@class Macro: Element
local Macro = Element:derive("macro")
function Macro:from_node(node)
diff --git a/biblio/citation-style-language/citeproc-ir-node.lua b/biblio/citation-style-language/citeproc-ir-node.lua
index 9d1ee21905..7a940ef061 100644
--- a/biblio/citation-style-language/citeproc-ir-node.lua
+++ b/biblio/citation-style-language/citeproc-ir-node.lua
@@ -25,6 +25,21 @@ local GroupVar = {
---@class IrNode
+---@field _element Element?
+---@field _element_name string?
+---@field _type string
+---@field _base_class string
+---@field text string?
+---@field formatting any
+---@field affixes any
+---@field inlines InlineElement[]?
+---@field children IrNode[]?
+---@field delimiter string?
+---@field should_inherit_delim boolean?
+---@field group_var GroupVar
+---@field person_name_irs IrNode[]
+---@field name_count integer?
+---@field is_year boolean?
local IrNode = {
_element = nil,
_element_name = nil,
@@ -37,6 +52,9 @@ local IrNode = {
delimiter = nil,
}
+---@param children IrNode[]
+---@param element Element
+---@return IrNode
function IrNode:new(children, element)
local o = {
_element = element,
@@ -79,6 +97,8 @@ function IrNode:derive(type)
return o
end
+---@param level integer
+---@return string
function IrNode:_debug(level)
level = level or 0
local ir_info_str = ""
@@ -94,7 +114,13 @@ function IrNode:_debug(level)
if ir_info_str ~= "" then
ir_info_str = string.format("{%s}", ir_info_str)
end
- local text = string.format("\n%s [%s] %s <%s> %s", string.rep(" ", level), self.group_var, self._type, self._element_name, ir_info_str)
+ local element_info = self._element.element_name
+ for _, attr in ipairs({"name", "variable"}) do
+ if self._element[attr] then
+ element_info = element_info .. string.format(' %s="%s"', attr, self._element[attr])
+ end
+ end
+ local text = string.format("\n%s [%s] %s <%s> %s", string.rep(" ", level), self.group_var, self._type, element_info, ir_info_str)
if self.children and #self.children > 0 then
for _, child_ir in ipairs(self.children) do
text = text .. child_ir:_debug(level + 1)
@@ -114,8 +140,12 @@ end
function IrNode:capitalize_first_term()
-- util.debug(self)
- if self._type == "Rendered" and self.element and (self.element.term == "ibid" or self.element.term == "and") then
- self.inlines[1]:capitalize_first_term()
+ if self._type == "Rendered" and self._element then
+ local element = self._element
+ ---@cast element Text
+ if (element.term == "ibid" or element.term == "and") then
+ self.inlines[1]:capitalize_first_term()
+ end
elseif self._type == "SeqIr" and self.children[1] then
self.children[1]:capitalize_first_term()
end
@@ -213,6 +243,7 @@ end
---@class SeqIr: IrNode
+---@field children IrNode[]
local SeqIr = IrNode:derive("SeqIr")
-- function SeqIr:new(children)
diff --git a/biblio/citation-style-language/citeproc-journal-data.lua b/biblio/citation-style-language/citeproc-journal-data.lua
index 1eb7808108..c78a3f9d4a 100644
--- a/biblio/citation-style-language/citeproc-journal-data.lua
+++ b/biblio/citation-style-language/citeproc-journal-data.lua
@@ -2072,6 +2072,8 @@ abbrevs = {
["ABELIAN GROUPS, RINGS, MODULES, AND HOMOLOGICAL ALGEBRA"] = "Mg. Txb. Pur. Appl. Math.",
["ABERDEEN UNIVERSITY REVIEW"] = "Aberdeen Univ Rev",
["ABHANDLUNG DER AKADEMIE DER WISSENSCHAFTEN ZU GOTTINGEN PHILOLOGISCH HISTORISCHE KLASSE NEUE FOLGE"] = "Abh. Akad. Wiss. Got. Ph.",
+ ["ABHANDLUNG ZUR ERLANGUNG DER WURDE EINES DOKTORS DER NATURWISSENSCHAFTEN DER EIDGENOSSISCHEN TECHNISCHEN HOCHSCHULE ZURICH"] = "Abhandlung zur Erlangung der Wurde eines Doktors der Naturwissenschaften der Eidgenossischen Technischen Hochschule",
+ ["ABHANDLUNG ZUR ERLANGUNG DER WURDE EINES DOKTORS DER TECHNISCHEN WISSENSCHAFTEN DER EIDGENOSSISCHEN TECHNISCHEN HOCHSCHULE ZURICH"] = "Abhandlung zur Erlangung der Wurde eines Doktors der technischen Wissenschaften der Eidgenossischen Technischen Hoch",
["ABHANDLUNGEN AUS DEM MATHEMATISCHEN SEMINAR DER UNIVERSITAT HAMBURG"] = "Abh. Math. Semin. Univ. Hambg.",
["ABHANDLUNGEN AUS DEM MATHEMATISCHEN SEMINAR DER UNIVERSITÄT HAMBURG"] = "Abh. Math. Sem. Univ. Hamburg",
["ABHANDLUNGEN AUS DEM WESTFÄLISCHEN MUSEUM FÜR NATURKUNDE"] = "Abh Westfal Mus Naturkunde",
@@ -2280,7 +2282,7 @@ abbrevs = {
["ACCOUNTING ORGANIZATIONS AND SOCIETY"] = "Account. Org. Soc.",
["ACCOUNTING REVIEW"] = "Acc. Rev.",
["ACCOUNTING, BANKING AND CORPORATE FINANCIAL MANAGEMENT IN EMERGING ECONOMIES"] = "Res. Account. Emerg. Ec.",
- ["ACCOUNTING, BUSINESS AND FINANCIAL HISTORY"] = "Acc., Bus. Finan. Hist.",
+ ["ACCOUNTING, BUSINESS AND FINANCIAL HISTORY"] = "Acc.",
["ACCOUNTS IN DRUG DISCOVERY: CASE STUDIES IN MEDICINAL CHEMISTRY"] = "Rsc. Drug Discov.",
["ACCOUNTS OF CHEMICAL RESEARCH"] = "Acc Chem Res",
["ACCOUNTS OF MATERIALS RESEARCH"] = "Acc Mater Res",
@@ -3252,6 +3254,7 @@ abbrevs = {
["ACTA SALMANTICENSIA. FILOSOFIA Y LETRAS"] = "Acta Salmanticensia Ser Filos Letra",
["ACTA SALMANTICENSIA. FILOSOFÍA Y LETRAS"] = "Acta Salmanticensia Ser Filos Letra",
["ACTA SALMANTICENSIA. HISTORIA DE LA MEDICINA"] = "Acta Salmant Hist Med",
+ ["ACTA SALMANTICENSIA: COLECCION DE MEMORIAS Y TRABAJOS CIENTIFICOS EDITADOS POR LA UNIVERSIDAD DE SALAMANCA, SERIE DE CIENCIAS"] = "Acta Salmanticensia: Coleccion de Memorias y Trabajos Cientificos Editados por la Universidad de Salamanca, Serie",
["ACTA SCHOLAE MEDICINALIS UNIVERSITATIS IN KIOTO"] = "Acta Sch Med Univ Kioto",
["ACTA SCIENTIA SINICA = CHUNG-KUO K'O HSÜEH"] = "Acta Sci Sin",
["ACTA SCIENTIAE VETERINARIAE"] = "Acta Sci Vet",
@@ -8847,6 +8850,7 @@ abbrevs = {
["ANALYTICAL METHODS"] = "Anal. Methods",
["ANALYTICAL METHODS : ADVANCING METHODS AND APPLICATIONS"] = "Anal Methods",
["ANALYTICAL METHODS AND INSTRUMENTATION"] = "Anal. Method. Instrum.",
+ ["ANALYTICAL METHODS AND SPECIAL FUNCTIONS"] = "Anal. Methods Spec. Funct.",
["ANALYTICAL METHODS FOR PROBLEMS OF MOLECULAR TRANSPORT"] = "Fluid. Mech. Appl.",
["ANALYTICAL METHODS FOR SOCIAL RESEARCH"] = "Anal. Methods Soc. Res.",
["ANALYTICAL METHODS IN FUZZY MODELING AND CONTROL"] = "Stud. Fuzz. Soft. Comp.",
@@ -9556,7 +9560,7 @@ abbrevs = {
["ANNALI DELLA FACOLTA DI MEDICINA E CHIRURGIA DELLA UNIVERSITA DEGLI STUDI DI PERUGIA"] = "Ann Fac Med Chir Univ Studi Perugia",
["ANNALI DELLA FACOLTÀ DI ECONOMIA E COMMERCIO (UNIVERSITÀ DI MESSINA)"] = "Ann Fac Econ Commer",
["ANNALI DELLA FACOLTÀ DI MEDICINA E CHIRURGIA DELLA UNIVERSITÀ DEGLI STUDI DI PERUGIA"] = "Ann Fac Med Chir Univ Studi Perugia",
- ["ANNALI DELLA FACOLTÀ DI ECONOMIA E COMMERCIO, UNIVERSITÀ PALERMO"] = "Ann. Fac. Econ. Com., Univ. Palermo",
+ ["ANNALI DELLA FACOLTÀ DI ECONOMIA E COMMERCIO, UNIVERSITÀ PALERMO"] = "Ann. Fac. Econ. Com.",
["ANNALI DELLA FACOLTÀ DI GIURISPRUDENZA, UNIVERSITÀ DI GENOVA"] = "AFGG",
["ANNALI DELLA FACOLTÀ DI LETTERE DI LECCE"] = "AFLL",
["ANNALI DELLA FACOLTÀ DI LETTERE E FILOSOFIA DELLA UNIVERSITÀ DI CAGLIARI"] = "AFLC",
@@ -15360,6 +15364,8 @@ abbrevs = {
["BERICHT UBER DIE ZUSAMMENKUNFT. DEUTSCHE OPHTHALMOLOGISCHE GESELLSCHAFT"] = "Ber Zusammenkunft Dtsch Ophthalmol Ges",
["BERICHT ÜBER DIE ZUSAMMENKUNFT. DEUTSCHE OPHTHALMOLOGISCHE GESELLSCHAFT"] = "Ber Zusammenkunft Dtsch Ophthalmol Ges",
["BERICHT ÜBER DIE AUSGRABUNGEN IN OLYMPIA"] = "OlBer",
+ ["BERICHTE AUS DEM INSTITUT FUR STATISTIK UND VERSICHERUNGSMATHEMATIK UND AUS DEM INSTITUT FUR ANGEWANDTE STATISTIK DER FREIEN UNIVERSITAT BERLIN"] = "Berichte aus dem Institut fur Statistik und Versicherungsmathematik und aus dem Institut fur Angewandte Statistik de",
+ ["BERICHTE AUS DEM INSTITUT FUR STATISTIK UND WIRTSCHAFTSMATHEMATIK UND AUS DEM INSTITUT FUR ANGEWANDTE STATISTIK DER FREIEN UNIVERSITAT BERLIN"] = "Berichte aus dem Institut fur Statistik und Wirtschaftsmathematik und aus dem Institut fur Angewandte Statistik der",
["BERICHTE AUS DER BAYERISCHEN LANDESANSTALT FÜR WALD UND FORSTWIRTSCHAFT"] = "Ber. Bayer. Landesanst. Wald Forstwirtsch.",
["BERICHTE AUS DER BONNER UNIVERSITATSKLINIK UND POLIKLINIK FUR MUND-, ZAHN- UND KIEFERKRANKHEITEN"] = "Ber Bonn Univ Poliklin Mund Zahn Kieferkr",
["BERICHTE AUS DER MATHEMATIK"] = "Ber. Math.",
@@ -22376,11 +22382,13 @@ abbrevs = {
["CHAPMAN & HALL/CRC MATHEMATICAL & COMPUTATIONAL BIOLOGY SERIES"] = "Chapman Hall CRC Math Comput Biol Ser",
["CHAPMAN & HALL/CRC MATHEMATICAL AND COMPUTATIONAL BIOLOGY SERIES"] = "Chapman & Hall/CRC Math. Comput. Biol. Ser.",
["CHAPMAN & HALL/CRC MATHEMATICAL AND COMPUTATIONAL IMAGING SCIENCES"] = "Chapman & Hall/CRC Math. Comput. Imaging Sci.",
+ ["CHAPMAN & HALL/CRC MATHEMATICAL BIOLOGY SERIES"] = "Chapman Hall/CRC Math. Biol. Ser.",
["CHAPMAN & HALL/CRC MATHEMATICS"] = "Chapman & Hall/CRC Math.",
["CHAPMAN & HALL/CRC MONOGRAPHS AND SURVEYS IN PURE AND APPLIED MATHEMATICS"] = "Ch/c. Mon. Sur. Pur. App.",
["CHAPMAN & HALL/CRC NUMERICAL ANALYSIS AND SCIENTIFIC COMPUTING"] = "Chapman & Hall/CRC Numer. Anal. Sci. Comput.",
["CHAPMAN & HALL/CRC RESEARCH NOTES IN MATHEMATICS"] = "Ch. Crc. Res. Notes",
["CHAPMAN & HALL/CRC RESEARCH NOTES IN MATHEMATICS SERIES"] = "Ch. Crc. Res. Notes",
+ ["CHAPMAN & HALL/CRC SERIES IN OPERATIONS RESEARCH"] = "Chapman & Hall/CRC Ser. Oper. Res.",
["CHAPMAN & HALL/CRC TEXTS IN STATISTICAL SCIENCE SERIES"] = "Chapman & Hall/CRC Texts Stat. Sci. Ser.",
["CHAPMAN AND HALL ECOTOXICOLOGY SERIES"] = "Ch. Ecotoxic.",
["CHAPMAN AND HALL MATHEMATICS SERIES"] = "Chapman and Hall Math. Ser.",
@@ -23683,7 +23691,7 @@ abbrevs = {
["CIRDAP DEVELOPMENT DIGEST"] = "CIRDAP Dev Dig",
["CIRES, CAHIERS IVOIRIENS DE RECHERCHE ECONOMIQUE ET SOCIALE. CENTRE IVOIRIEN DE RECHERCHES ECONOMIQUES ET SOCIALES"] = "CIRES Cah Ivoir Rech Econ Soc",
["CIRES, CAHIERS IVOIRIENS DE RECHERCHE ÉCONOMIQUE ET SOCIALE. CENTRE IVOIRIEN DE RECHERCHES ÉCONOMIQUES ET SOCIALES"] = "CIRES Cah Ivoir Rech Econ Soc",
- ["CIRIEC-ESPAÑA, REVISTA DE ECONOMÍA PÚBLICA, SOCIAL Y COOPERATIVA"] = "CIRIEC-España, Revista Econ. Pública, Soc. Cooperativa",
+ ["CIRIEC-ESPAÑA, REVISTA DE ECONOMÍA PÚBLICA, SOCIAL Y COOPERATIVA"] = "CIRIEC-España",
["CIRM JEAN-MORLET SERIES"] = "CIRM Jean-Morlet Ser.",
["CIRP ANNALS"] = "CIRP Ann.",
["CIRP ANNALS-MANUFACTURING TECHNOLOGY"] = "Cirp Ann-manuf. Techn.",
@@ -32288,6 +32296,8 @@ abbrevs = {
["DIE ERDE; ZEITSCHRIFT DER GESELLSCHAFT FÜR ERDKUNDE ZU BERLIN"] = "Erde",
["DIE FRUHZEIT DER THURINGER: ARCHAOLOGIE, SPRACHE, GESCHICHTE"] = "Reallexikon. Ger. Alte.",
["DIE FUNDMÜNZEN DER RÖMISCHEN ZEIT IN DEUTSCHLAND"] = "FMRD",
+ ["DIE GRUNDLEHREN DER MATHEMATISCHEN WISSENSCHAFTEN IN EINZELDARSTELLUNGEN MIT BESONDERER BERUCKSICHTIGUNG DER ANWENDUNGSGEBIETE"] = "Die Grundlehren der mathematischen Wissenschaften in Einzeldarstellungen mit besonderer Berucksichtigung der Anwendung",
+ ["DIE GRUNDLEHREN DER MATHEMATISCHEN WISSENSCHAFTEN IN EINZELDARSTELLUNGEN MIT BESONDERER BERUCKSIGHTIGUNG DER ANWENDUNGSGEBIETE"] = "Die Grundlehren der mathematischen Wissenschaften in Einzeldarstellungen mit besonderer Berucksightigung der Anwendung",
["DIE HEILBERUFE"] = "Heilberufe",
["DIE HEILKUNST"] = "Heilkunst",
["DIE INFUSIONSTHERAPIE"] = "Infusionstherapie",
@@ -34084,7 +34094,7 @@ abbrevs = {
["EAST-WEST LIFE EXPECTANCY GAP IN EUROPE"] = "Nato. Asi. 2.",
["EAST-WEST PERSPECTIVES : JOURNAL OF THE EAST-WEST CENTER"] = "East West Perspect",
["EAST-WEST SCIENTIFIC CO-OPERATION"] = "Nato. Asi. S. 4. Sci. Tec.",
- ["EAST-WEST SERIES IN ECONOMICS, BUSINESS, AND THE ENVIRONMENT"] = "East-West Ser. Econ., Bus., Environ.",
+ ["EAST-WEST SERIES IN ECONOMICS, BUSINESS, AND THE ENVIRONMENT"] = "East-West Ser. Econ.",
["EAST-WEST TECHNOLOGY TRANSFER"] = "Nato. Asi. S. 4. Sci. Tec.",
["EASTER ISLAND FOUNDATION OCCASIONAL PAPER"] = "Eas. Isl. Fdn.",
["EASTER ISLAND IN PACIFIC CONTEXT - SOUTH SEAS SYMPOSIUM"] = "Eas. Isl. Fdn.",
@@ -34324,7 +34334,7 @@ abbrevs = {
["ECONOMIA E STORIA"] = "Econ Stor",
["ECONOMIA INDUSTRIAL"] = "Econ. Ind.",
["ECONOMIA INTERNAZIONALE"] = "Econ. Int.",
- ["ECONOMIA MEXICANA, NUEVA EPOCA"] = "Econ. Mexicana, Nueva Epoca",
+ ["ECONOMIA MEXICANA, NUEVA EPOCA"] = "Econ. Mexicana",
["ECONOMIA MEXICANA-NUEVA EPOCA"] = "Econ. Mex.",
["ECONOMIA POLITICA"] = "Econ. Politica",
["ECONOMIA PUBBLICA : MENSILE DI STUDI E D'INFORMAZIONE DEL CIRIEC"] = "Econ Pubblica",
@@ -34335,7 +34345,7 @@ abbrevs = {
["ECONOMIC AFFAIRS"] = "Econ. Aff.",
["ECONOMIC ANALYSIS"] = "Econ. Anal.",
["ECONOMIC ANALYSIS AND POLICY"] = "Econ Anal Policy",
- ["ECONOMIC ANALYSIS AND POLICY, NEW SERIES"] = "Econ. Anal. Pol., N.S.",
+ ["ECONOMIC ANALYSIS AND POLICY, NEW SERIES"] = "Econ. Anal. Pol.",
["ECONOMIC ANALYSIS AND WORKERS’ MANAGEMENT"] = "Econ. Anal. Workers’ Manage.",
["ECONOMIC ANALYSIS OF SUBSTANCE USE AND ABUSE"] = "Nber. Conf. R.",
["ECONOMIC ANALYSIS OF TERRORISM"] = "Rout. Stud. Defen. Peac.",
@@ -34363,7 +34373,7 @@ abbrevs = {
["ECONOMIC BULLETIN - NATIONAL BANK OF EGYPT"] = "Econ Bull Natl Bank Egypt.",
["ECONOMIC BULLETIN FOR ASIA AND THE PACIFIC"] = "Econ Bull Asia Pac",
["ECONOMIC BULLETIN FOR EUROPE"] = "Econ Bull Eur",
- ["ECONOMIC BULLETIN OF GHANA, SECOND SERIES"] = "Econ. Bull. Ghana, 2nd Ser.",
+ ["ECONOMIC BULLETIN OF GHANA, SECOND SERIES"] = "Econ. Bull. Ghana",
["ECONOMIC CHANGE, SOCIAL WELFARE AND HEALTH IN EUROPE"] = "Who. Reg. Pub.",
["ECONOMIC CO-OPERATION IN THE GULF: ISSUES IN THE ECONOMIES OF THE ARAB GULF CO-OPERATION COUNCIL STATES"] = "Rout. Stud. Mid. E. Econ.",
["ECONOMIC COMPUTATION AND ECONOMIC CYBERNETICS STUDIES AND RESEARCH"] = "Econ Comput Econ Cybern Stud Res",
@@ -34394,7 +34404,7 @@ abbrevs = {
["ECONOMIC GROWTH AND THE STRUCTURE OF LONG-TERM DEVELOPMENT"] = "Iea. Conf. Vol.",
["ECONOMIC HISTORY OF THE AMERICAN STEEL INDUSTRY"] = "Routl. Explor. Econ. Hi.",
["ECONOMIC HISTORY REVIEW"] = "Econ. Hist. Rev.",
- ["ECONOMIC HISTORY REVIEW, SECOND SERIES"] = "Econ. Hist. Rev., 2nd Ser.",
+ ["ECONOMIC HISTORY REVIEW, SECOND SERIES"] = "Econ. Hist. Rev.",
["ECONOMIC HISTORY REVIEW-FIRST SERIES"] = "Econ. Hist. Rev-first.",
["ECONOMIC IDEAS LEADING TO THE 21ST CENTURY"] = "Econ. Id. Lead. 21st C.",
["ECONOMIC IMPACT OF PUBLIC SUPPORT TO AGRICULTURE: AN INTERNATIONAL PERSPECTIVE"] = "Stud. Product. Effic.",
@@ -34467,7 +34477,7 @@ abbrevs = {
["ECONOMIC WRITINGS: SELECTIONS 1904-1945"] = "Vienna. Circ. Collect.",
["ECONOMIC, MEDICAL/SCIENTIFIC AND REGULATORY ASPECTS OF CLINICAL NUTRITION PRACTICE: WHAT IMPACTS WHAT?"] = "Nes. Nutr. Ws.",
["ECONOMICA"] = "Economica",
- ["ECONOMICA, N.S."] = "Economica, N.S.",
+ ["ECONOMICA, N.S."] = "Economica",
["ECONOMICA-NEW SERIES"] = "Economica-new Ser.",
["ECONOMICA. NEW SERIES"] = "Economica (N.S.)",
["ECONOMICS"] = "Economics",
@@ -40591,7 +40601,7 @@ abbrevs = {
["FINANCIAL MARKETS AND FINANCIAL CRISES"] = "Nat. Bur. Ec.",
["FINANCIAL MARKETS AND THE MACROECONOMY"] = "Routl. Int. Stud. Money.",
["FINANCIAL MARKETS ETHICS"] = "Etud. Europ.",
- ["FINANCIAL MARKETS, INSTITUTIONS AND INSTRUMENTS"] = "Finan. Markets, Inst. Instruments",
+ ["FINANCIAL MARKETS, INSTITUTIONS AND INSTRUMENTS"] = "Finan. Markets",
["FINANCIAL MATHEMATICS"] = "Financ. Math.",
["FINANCIAL MATHEMATICS AND APPLICATIONS"] = "Financ. Math. Appl.",
["FINANCIAL MATHEMATICS AND FINTECH"] = "Financ. Math. Fintech",
@@ -41955,6 +41965,7 @@ abbrevs = {
["FOUNDATIONS OF COMPUTER SOFTWARE: FUTURE TRENDS AND TECHNIQUES FOR DEVELOPMENT"] = "Lect. Notes. Comput. Sc.",
["FOUNDATIONS OF COMPUTING SERIES"] = "Found. Comput. Ser.",
["FOUNDATIONS OF DATA MINING AND KNOWLEDGE DISCOVERY"] = "Stud. Comp. Intell.",
+ ["FOUNDATIONS OF DATA SCIENCE"] = "Found. Data Sci.",
["FOUNDATIONS OF ENGINEERING MECHANICS"] = "Found. Eng. Mech.",
["FOUNDATIONS OF EUROPE: EUROPEAN INTEGRATION IDEAS IN FRANCE, GERMANY AND BRITAIN IN THE 1950S"] = "Forsch. Eur. Integr.",
["FOUNDATIONS OF FUZZY LOGIC AND SOFT COMPUTING, PROCEEDINGS"] = "Lect. Notes. Comput. Sc.",
@@ -58812,7 +58823,6 @@ abbrevs = {
["JANASAṂKHYĀ ŚIKSHĀ MUKHAPATRA"] = "Janasamkhya Siksha Mukhapatra",
["JANUS; REVUE INTERNATIONALE DE L'HISTOIRE DES SCIENCES, DE LA MÉDECINE, DE LA PHARMACIE, ET DE LA TECHNIQUE"] = "Janus",
["JANUS; REVUE INTERNATIONALE DE L’HISTOIRE DES SCIENCES, DE LA MEDECINE, DE LA PHARMACIE, ET DE LA TECHNIQUE"] = "Janus",
- ["JAPAN ACADEMY"] = "Proc. Japan Acad. Ser. A Math. Sci.",
["JAPAN ACADEMY. PROCEEDINGS. SERIES A. MATHEMATICAL SCIENCES"] = "Proc. Japan Acad. Ser. A Math. Sci.",
["JAPAN AFTER THE ECONOMIC MIRACLE"] = "Social. Indic. Res.",
["JAPAN AGRICULTURAL RESEARCH QUARTERLY"] = "Jpn Agric Res Q",
@@ -59582,7 +59592,7 @@ abbrevs = {
["JOURNAL OF ACCOUNTING AND ECONOMICS"] = "J. Acc. Econ.",
["JOURNAL OF ACCOUNTING AND PUBLIC POLICY"] = "J. Account. Public Pol.",
["JOURNAL OF ACCOUNTING RESEARCH"] = "J. Acc. Res.",
- ["JOURNAL OF ACCOUNTING, AUDITING AND FINANCE"] = "J. Acc., Aud. Finance",
+ ["JOURNAL OF ACCOUNTING, AUDITING AND FINANCE"] = "J. Acc.",
["JOURNAL OF ACQUIRED IMMUNE DEFICIENCY SYNDROMES"] = "J Acquir Immune Defic Syndr (1988)",
["JOURNAL OF ACQUIRED IMMUNE DEFICIENCY SYNDROMES (1999)"] = "J Acquir Immune Defic Syndr",
["JOURNAL OF ACQUIRED IMMUNE DEFICIENCY SYNDROMES AND HUMAN RETROVIROLOGY"] = "J. Acquir. Immune Defic. Syndr. Hum. Retrovirol.",
@@ -61000,7 +61010,7 @@ abbrevs = {
["JOURNAL OF CONVEX ANALYSIS"] = "J. Convex Anal.",
["JOURNAL OF COORDINATION CHEMISTRY"] = "J. Coord. Chem.",
["JOURNAL OF CORPORATE FINANCE"] = "J. Corp. Financ.",
- ["JOURNAL OF CORPORATE FINANCE: CONTRACTING, GOVERNANCE AND ORGANIZATION"] = "J. Corp. Finan.: Contracting, Governance Organ.",
+ ["JOURNAL OF CORPORATE FINANCE: CONTRACTING, GOVERNANCE AND ORGANIZATION"] = "J. Corp. Finan.: Contracting",
["JOURNAL OF CORPORATE TAXATION"] = "J. Corp. Tax.",
["JOURNAL OF CORRECTIONAL EDUCATION (GLEN MILLS, PA.)"] = "J Correct Educ (Glen Mills)",
["JOURNAL OF CORRECTIONAL HEALTH CARE : THE OFFICIAL JOURNAL OF THE NATIONAL COMMISSION ON CORRECTIONAL HEALTH CARE"] = "J Correct Health Care",
@@ -61643,7 +61653,6 @@ abbrevs = {
["JOURNAL OF EVOLUTION EQUATIONS"] = "J. Evol. Equ.",
["JOURNAL OF EVOLUTION OF MEDICAL AND DENTAL SCIENCES"] = "J Evol Med Dent Sci",
["JOURNAL OF EVOLUTIONARY BIOCHEMISTRY AND PHYSIOLOGY"] = "J Evol Biochem Physiol",
- ["JOURNAL OF EVOLUTIONARY BIOCHEMISTRY AND PHYSIOLOGY\\"] = "J. Evol. Biochem. Physiol.",
["JOURNAL OF EVOLUTIONARY BIOLOGY"] = "J Evol Biol",
["JOURNAL OF EVOLUTIONARY ECONOMICS"] = "J Evol Econ",
["JOURNAL OF EVOLVING STEM CELL RESEARCH"] = "J Evol Stem Cell Res",
@@ -62597,7 +62606,7 @@ abbrevs = {
["JOURNAL OF INTERNATIONAL DEVELOPMENT"] = "J Int Dev",
["JOURNAL OF INTERNATIONAL ECONOMIC LAW"] = "J. Int. Econ. Law",
["JOURNAL OF INTERNATIONAL ECONOMICS"] = "J Int Econ",
- ["JOURNAL OF INTERNATIONAL FINANCIAL MARKETS, INSTITUTIONS AND MONEY"] = "J. Int. Finan. Markets, Inst. Money",
+ ["JOURNAL OF INTERNATIONAL FINANCIAL MARKETS, INSTITUTIONS AND MONEY"] = "J. Int. Finan. Markets",
["JOURNAL OF INTERNATIONAL LAW AND ECONOMICS"] = "J. Int. Law Econ.",
["JOURNAL OF INTERNATIONAL MANAGEMENT"] = "J. Int. Manag.",
["JOURNAL OF INTERNATIONAL MARKETING"] = "J. Int. Marketing",
@@ -62732,7 +62741,7 @@ abbrevs = {
["JOURNAL OF LAW ENFORCEMENT LEADERSHIP AND ETHICS"] = "J Law Enforc Leadersh Ethics",
["JOURNAL OF LAW MEDICINE & ETHICS"] = "J. Law Med. Ethics",
["JOURNAL OF LAW, ECONOMICS, & ORGANIZATION"] = "J Law Econ Organ",
- ["JOURNAL OF LAW, ECONOMICS, AND ORGANIZATION"] = "J. Law, Econ., Organ.",
+ ["JOURNAL OF LAW, ECONOMICS, AND ORGANIZATION"] = "J. Law",
["JOURNAL OF LAW, MEDICINE AND ETHICS"] = "J. Law. Med. Ethics",
["JOURNAL OF LEADERSHIP & ORGANIZATIONAL STUDIES"] = "J Leadersh Organ Stud",
["JOURNAL OF LEARNING DISABILITIES"] = "J Learn Disabil",
@@ -70659,11 +70668,12 @@ abbrevs = {
["L’ENSEIGNEMENT MATHÉMATIQUE"] = "Enseign. Math. (2)",
["L’ESPACE GEOGRAPHIQUE"] = "Espace Geogr",
["L’ESTAMPILLE"] = "Estampille",
+ ["L’EVOLUTION DE L’HUMANITE, SYNTHESE COLLECTIVE. PREMIERE SECTION, SERIE COMPLEMENTAIRE: LA SCIENCE DANS L’ANTIQUITE"] = "L’Evolution de l’Humanite, Synthese Collective. Premiere Section, Serie Complementaire: La Science dans l’An",
["L’HYGIENE MENTALE"] = "Hyg Ment",
["L’IGIENE MODERNA"] = "Ig Mod",
["L’IMPRESA"] = "L’Impresa",
["L’INDUSTRIA"] = "L’Industria",
- ["L’INDUSTRIA, NUOVA SERIE"] = "L’Industria, N.S.",
+ ["L’INDUSTRIA, NUOVA SERIE"] = "L’Industria",
["L’INFIRMIERE AUXILIAIRE : REVUE DE LA CORPORATION PROFESSIONNELLE DES INFIRMIERES ET INFIRMIERS AUXILIAIRES DU QUEBEC"] = "Infirm Aux",
["L’INFIRMIERE DU QUEBEC : REVUE OFFICIELLE DE L’ORDRE DES INFIRMIERES ET INFIRMIERS DU QUEBEC"] = "Infirm Que",
["L’INFIRMIERE FRANCAISE"] = "Infirm Fr",
@@ -72637,8 +72647,10 @@ abbrevs = {
["MATHEMATIQUES & APPLICATIONS"] = "Math. Appl-berlin.",
["MATHEMATIQUES & APPLICATIONS (BERLIN)"] = "Math. Appl. (Berlin)",
["MATHEMATIQUES SUPERIEURES ET SPECIALES"] = "Math. Super. Spec.",
+ ["MATHEMATISCH CENTRUM, AFDELING MATHEMATISCHE BESLISKUNDE IN SAMENWERKING MET HET INTERUNIVERSITAIR INSTITUUT BEDRIJFSKUNDE DELFT/ROTTERDAM"] = "Mathematisch Centrum, Afdeling Mathematische Besliskunde in samenwerking met het Interuniversitair Instituut Bedrijfskun",
["MATHEMATISCH-ASTRONOMISCHE BLÄTTER—NEUE FOLGE"] = "Math.-Astronom. Blätter—N.F.",
["MATHEMATISCHE ANNALEN"] = "Math. Ann.",
+ ["MATHEMATISCHE LEHRBUCHER UND MONOGRAPHIEN, HERAUSGEGEBEN VON DER DEUTSCHEN AKADEMIE DER WISSENSCHAFTEN ZU BERLIN, FORSCHUNGSINSTITUT FUR MATHEMATIK. I. ABTEILUNG, MATHEMATISCHE LEHRBUCHER"] = "Mathematische Lehrbucher und Monographien, herausgegeben von der Deutschen Akademie der Wissenschaften zu Berlin, Fors",
["MATHEMATISCHE LEITFÄDEN"] = "Math. Leitfäden",
["MATHEMATISCHE NACHRICHTEN"] = "Math. Nachr.",
["MATHEMATISCHE OPTIMIERUNG UND WIRTSCHAFTSMATHEMATIK/MATHEMATICAL OPTIMIZATION AND ECONOMATHEMATICS"] = "Math. Optim. Wirtsch.math./Math. Optim. Economath.",
@@ -77621,6 +77633,7 @@ abbrevs = {
["MULTIDIMENSIONAL SPECTROSCOPY OF POLYMERS"] = "Acs. Sym. Ser.",
["MULTIDIMENSIONAL SYSTEMS AND SIGNAL PROCESSING"] = "Multidimens Syst Signal Process",
["MULTIDIMENSIONAL SYSTEMS AND SIGNAL PROCESSING. AN INTERNATIONAL JOURNAL"] = "Multidimens. Syst. Signal Process.",
+ ["MULTIDISCIPLINARY AND APPLIED OPTICS"] = "Multidiscip. Appl. Opt.",
["MULTIDISCIPLINARY APPROACH TO MYELIN DISEASES II"] = "Nato. Adv. Sci. Inst. Se.",
["MULTIDISCIPLINARY APPROACHES TO VISUAL REPRESENTATIONS AND INTERPRETATIONS"] = "Stud. Multidiscip.",
["MULTIDISCIPLINARY DESIGN OPTIMIZATION"] = "Siam. Proc. S.",
@@ -85546,6 +85559,8 @@ abbrevs = {
["OSTERREICHISCHE AKADEMIE DER WISSENSCHAFTEN PHILOSOPHISCH-HISTORISCHE KLASSE DENKSCHRIFTEN"] = "Oaw. Denkschriften",
["OSTERREICHISCHE AKADEMIE DER WISSENSCHAFTEN SCHRIFTENREIHE DER ERDWISSENSCHAFTLICHEN KOMMISSIONEN"] = "Schr. Erdwissenschaft.",
["OSTERREICHISCHE AKADEMIE DER WISSENSCHAFTEN, PHILOSOPHISCH-HHISTORISCHE KLASSE, HISTORISCHE KOMMISSION - ZENTRALEUROPA STUDIEN"] = "Oaw. Zentraleuropa St.",
+ ["OSTERREICHISCHE AKADEMIE DER WISSENSCHAFTEN, PHILOSOPHISCH-HISTORISCHE KLASSE, SITZUNGSBERICHTE, 252. BAND, 5. ABHANDLUNG; VEROFFENTLICHUNGEN DER KOMMISSION FUR GESCHICHTE DER ERZIEHUNG UND DES UNTERRICHTS"] = "Osterreichische Akademie der Wissenschaften, Philosophisch-Historische Klasse, Sitzungsberichte, 252. Band, 5. Abhandl",
+ ["OSTERREICHISCHE AKADEMIE DER WISSENSCHAFTEN.KOMMISSION FUR BYZANTINISTIK.INSTITUT FUR BYZANTINISTIK DER UNIVERSITAT WIEN"] = "Osterreichische Akademie der Wissenschaften.Kommission fur Byzantinistik.Institut fur By",
["OSTERREICHISCHE ARZTEZEITUNG"] = "Osterr Arzteztg",
["OSTERREICHISCHE BOTANISCHE ZEITSCHRIFT"] = "Osterr. Bot. Z.",
["OSTERREICHISCHE CHEMIE ZEITSCHRIFT"] = "Osterr. Chem. Z.",
@@ -94880,7 +94895,6 @@ abbrevs = {
["PSYCCRITIQUES"] = "Psyccritiques",
["PSYCH"] = "Psych",
["PSYCH JOURNAL"] = "Psych J",
- ["PSYCHANALYSE"] = "Psychanalyse",
["PSYCHANALYSE ET"] = "Psychanalyse Et",
["PSYCHE"] = "Psyche (Stuttg)",
["PSYCHE-ZEITSCHRIFT FUR PSYCHOANALYSE UND IHRE ANWENDUNGEN"] = "Psyche-z. Psychoanal.",
@@ -95311,6 +95325,7 @@ abbrevs = {
["PUBLICACIONES DE LA INSTITUCIÓN »TELLO TÉLLEZ DE MENESES«"] = "PublInstTTMeneses",
["PUBLICACIONES DEL DEPARTAMENTO DE MATEMÁTICAS, UNIVERSIDAD DE EXTREMADURA"] = "Publ. Dep. Mat. Univ. Extremadura",
["PUBLICACIONES DEL MUSEO DE LA FARMACIA"] = "Publ Mus Farm",
+ ["PUBLICACIONES DEL OBSERVATORIO DE SANTIAGO, II. CONSEJO SUPERIOR DE INVESTIGACIONES CIENTIFICAS, INSTITUTO NACIONAL DE GEOFISICA"] = "Publicaciones del Observatorio de Santiago, II. Consejo Superior de Investigaciones Cientificas, Instituto Nacional de G",
["PUBLICACIONES MATEMATICAS DEL URUGUAY"] = "Publ. Mat. Urug.",
["PUBLICACIONES MATEMÁTICAS DEL URUGUAY"] = "Publ. Mat. Urug.",
["PUBLICACIONES MÉDICAS"] = "Publ Med",
@@ -95325,7 +95340,6 @@ abbrevs = {
["PUBLICACOES MATEMATICAS DO IMPA"] = "Publ. Mat. IMPA",
["PUBLICAÇÕES FARMACÊUTICAS"] = "Publ Farm (Sao Paulo)",
["PUBLICAÇÕES MÉDICAS"] = "Publicacoes Med",
- ["PUBLICATION"] = "Publication",
["PUBLICATION - AMERICAN INSTITUTE OF THE HISTORY OF PHARMACY"] = "Publ Am Inst Hist Pharm",
["PUBLICATION - GROUP FOR THE ADVANCEMENT OF PSYCHIATRY"] = "Publ Group Adv Psychiatry",
["PUBLICATION DE L’INSTITUT DE RECHERCHE MATHÉMATIQUE AVANCÉE"] = "Publ. Inst. Rech. Math. Av.",
@@ -95343,6 +95357,8 @@ abbrevs = {
["PUBLICATIONS DE LA COUR EUROPÉENNE DES DROITS DE L'HOMME. SÉRIE A, ARRÊTS ET DÉCISIONS = PUBLICATIONS OF THE EUROPEAN COURT OF HUMAN RIGHTS. SERIES A, JUDGMENTS AND DECISIONS. EUROPEAN COURT OF HUMAN RIGHTS"] = "Publ Cour Eur Droits Homme Sr A Arrets Decis",
["PUBLICATIONS DE LA SOCIETE HISTORIQUE ET ARCHEOLOGIQUE DANS LE LIMBOURG. LIMBURGS GESCHIED- EN OUDHEIDKUNDIG GENOOTSCHAP"] = "Publ Soc Hist Archeol Limbg",
["PUBLICATIONS DE LA SOCIÉTÉ HISTORIQUE ET ARCHÉOLOGIQUE DANS LE LIMBOURG. LIMBURGS GESCHIED- EN OUDHEIDKUNDIG GENOOTSCHAP"] = "Publ Soc Hist Archeol Limbg",
+ ["PUBLICATIONS DE L’INSTITUT DE MATHEMATIQUE DE L’UNIVERSITE DE STRASBOURG, XIV. ACTUALITES SCIENTIFIQUES ET INDUSTRIELLES"] = "Publications de l’Institut de Mathematique de l’Universite de Strasbourg, XIV. Actualites Scientifiques et Industr",
+ ["PUBLICATIONS DE L’INSTITUT DE MATHEMATIQUE DE L’UNIVERSITE DE STRASBOURG, XV. ACTUALITES SCIENTIFIQUES ET INDUSTRIELLES"] = "Publications de l’Institut de Mathematique de l’Universite de Strasbourg, XV. Actualites Scientifiques et Industri",
["PUBLICATIONS DE L’INSTITUT DE RECHERCHE MATHÉMATIQUE DE RENNES"] = "Publ. Inst. Rech. Math. Rennes",
["PUBLICATIONS DES ARCHIVES HENRI-POINCARE"] = "Publ. Arch. Henri-Poincare",
["PUBLICATIONS DU CENTRE DE RECHERCHES EN MATHÉMATIQUES PURES, SÉRIE II"] = "Publ. Centre Rech. Math. Pures Sér. II",
@@ -101474,7 +101490,7 @@ abbrevs = {
["RIVISTA DI STORIA DELLA SCIENZA"] = "Riv Stor Sci",
["RIVISTA DI STORIA DELLE SCIENZE MEDICHE E NATURALI"] = "Riv Stor Sci Mediche Nat",
["RIVISTA DI STORIA E LETTERATURA RELIGIOSA"] = "RSLR",
- ["RIVISTA DI STORIA ECONOMICA, N.S."] = "Rivista Storia Econ., N.S.",
+ ["RIVISTA DI STORIA ECONOMICA, N.S."] = "Rivista Storia Econ.",
["RIVISTA DI STUDI BIZANTINI E NEOELLENICI"] = "RSBN",
["RIVISTA DI STUDI BIZANTINI E SLAVI"] = "RSBS",
["RIVISTA DI STUDI CLASSICI"] = "Riv Studi Class",
@@ -103324,6 +103340,8 @@ abbrevs = {
["SCHRIFTENREIHE DER FORSTWISSENSCHAFTLICHEN FAKULTÄT DER ALBERT-LUDWIGS-UNIVERSITÄT FREIBURG I. BR."] = "Schr.reihe Forstwiss. Fak. Albert-Ludwigs-Univ.  Freibg. i.B.",
["SCHRIFTENREIHE DER GESELLSCHAFT FUR MINERALSTOFFE UND SPURENELEMENTE E V"] = "Schrif. Gms.",
["SCHRIFTENREIHE DER HAMBURG-MANNHEIMER-STIFTUNG FUR INFORMATIONSMEDIZIN"] = "Schr. Hamb. M.",
+ ["SCHRIFTENREIHE DER INSTITUT FUR MATHEMATIK BEI DER DEUTSCHEN AKADEMIE DER WISSENSCHAFTEN ZU BERLIN, REIHE A. REINE MATHEMATIK"] = "Schriftenreihe der Institut fur Mathematik bei der Deutschen Akademie der Wissenschaften zu Berlin, Reihe A. Reine Mat",
+ ["SCHRIFTENREIHE DER INSTITUT FUR MATHEMATIK BEI DER DEUTSCHEN AKADEMIE DER WISSENSCHAFTEN ZU BERLIN, REIHE B. ANGEWANDTE MATHEMATIK UND MECHANIK"] = "Schriftenreihe der Institut fur Mathematik bei der Deutschen Akademie der Wissenschaften zu Berlin, Reihe B. Angewandt",
["SCHRIFTENREIHE DER INSTITUTE FUR SYSTEMDYNAMIK (ISD) UND OPTISCHE SYSTEME (IOS)"] = "Schriftenr. Inst. Syst.dyn. (ISD) Opt. Syst. (IOS)",
["SCHRIFTENREIHE DER JURISTISCHEN FAKULTAT DER EUROPA-UNIVERSITAT VIADRINA FRANKFURT-ODER"] = "Schr. Juris. Fak. Eur.",
["SCHRIFTENREIHE DER LANDESANSTALT FÜR ÖKOLOGIE, LANDSCHAFTSENTWICKLUNG UND FORSTPLANUNG NORDRHEIN-WESTFALEN"] = "Schr.reihe Landesanst. Ökol. Landsch.entwickl. Forstplan. Nordrh.-Westfal.",
@@ -103743,6 +103761,7 @@ abbrevs = {
["SCIENCE, TECHNOLOGY & HUMAN VALUES"] = "Sci Technol Human Values",
["SCIENCE, TECHNOLOGY AND ARTS RESEARCH"] = "Sci Technol Arts Res",
["SCIENCE, TECHNOLOGY, AND INNOVATION POLICY"] = "Int. S. Techn. Pol. Inn.",
+ ["SCIENCE, TECHNOLOGY, AND MANAGEMENT SERIES"] = "Sci. Technol. Manag. Ser.",
["SCIENCE, TECHNOLOGY, AND MEDICINE IN ANCIENT CULTURES"] = "Sci. Technol. Med. Anc. Cult.",
["SCIENCE-BASED ECONOMIC DEVELOPMENT"] = "Ann. Ny. Acad. Sci.",
["SCIENCE-FICTION STUDIES"] = "Sci-fiction. Stud.",
@@ -104480,6 +104499,7 @@ abbrevs = {
["SELFLESS CINEMA? ETHICS AND FRENCH DOCUMENTARY"] = "Res. Monogr. Fr. Stud.",
["SELʹSKOKHOZI︠A︡ĬSTVENNAI︠A︡ BIOLOGII︠A︡"] = "Selskokhoziaĭstvennaia Biol",
["SEMA JOURNAL. BOLETIN DE LA SOCIEDAD ESPANNOLA DE MATEMATICA APLICADA"] = "SeMA J.",
+ ["SEMA JOURNAL. BOLETIN DE LA SOCIEDAD ESPANOLA DE MATEMATICA APLICADA"] = "SeMA J.",
["SEMA SIMAI SPRINGER SERIES"] = "SEMA SIMAI Springer Ser.",
["SEMAINE DES HOPITAUX"] = "Sem. Hop.",
["SEMAINE DES HOPITAUX THERAPEUTIQUE"] = "Sem. Hop. Ther.",
@@ -105016,6 +105036,7 @@ abbrevs = {
["SERIE SCIENTIFICA"] = "Ser. Sci.",
["SERIE SYSTEMES AUTOMATISES"] = "Ser. Syst. Autom.",
["SERIE-UITGAVE VAN DE STICHTING HISTORIA MEDICINAE"] = "S. St. Hist. M.",
+ ["SERIE: ECOLE NATIONALE DE LA STATISTIQUE ET DE L’ADMINISTRATION ECONOMIQUE ET DU CENTRE D’ETUDES DES PROGRAMMES ECONOMIQUES"] = "Serie: Ecole Nationale de la Statistique et de l’Administration economique et du Centre d’Etudes des Programmes",
["SERIES : JOURNAL OF THE SPANISH ECONOMIC ASSOCIATION"] = "SERIEs (Berl)",
["SERIES DE LA DECOUVERTE FREUDIENNE"] = "S. Decouv. Fr.",
["SERIES ENTOMOLOGICA"] = "Series Entom.",
@@ -107785,7 +107806,7 @@ abbrevs = {
["SOUTH AFRICAN JOURNAL OF COMMUNICATION DISORDERS"] = "S. Afr. J. Commun. Disord.",
["SOUTH AFRICAN JOURNAL OF COMMUNICATION DISORDERS. DIE SUID-AFRIKAANSE TYDSKRIF VIR KOMMUNIKASIEAFWYKINGS"] = "S Afr J Commun Disord",
["SOUTH AFRICAN JOURNAL OF ECONOMIC AND MANAGEMENT SCIENCES"] = "South African J. Econ. Manage. Sci.",
- ["SOUTH AFRICAN JOURNAL OF ECONOMIC AND MANAGEMENT SCIENCES, N.S."] = "South African J. Econ. Manage. Sci., N.S.",
+ ["SOUTH AFRICAN JOURNAL OF ECONOMIC AND MANAGEMENT SCIENCES, N.S."] = "South African J. Econ. Manage. Sci.",
["SOUTH AFRICAN JOURNAL OF ECONOMICS"] = "South African J. Econ.",
["SOUTH AFRICAN JOURNAL OF EDUCATION"] = "S Afr J Educ",
["SOUTH AFRICAN JOURNAL OF ENOLOGY AND VITICULTURE"] = "S. Afr. J. Enol. Vitic.",
@@ -119427,6 +119448,7 @@ abbrevs = {
["UNCERTAINTY IN THE RISK ASSESSMENT OF ENVIRONMENTAL AND OCCUPATIONAL HAZARDS"] = "Ann. Ny. Acad. Sci.",
["UNCERTAINTY PRINCIPLES ASSOCIATED TO NON-DEGENERATE QUADRATIC FORMS"] = "Mem. Soc. Math. Fr.",
["UNCERTAINTY REASONING FOR THE SEMANTIC WEB I"] = "Lect. Notes. Artif. Int.",
+ ["UNCERTAINTY, COMPUTATIONAL TECHNIQUES, AND DECISION INTELLIGENCE"] = "Uncertain. Comput. Tech. Decis. Intell.",
["UNCLASSICAL TRADITIONS"] = "Camb. C. J. Proc. Cam. Ph.",
["UNCOMMON MATHEMATICAL EXCURSIONS: POLYNOMIA AND RELATED REALMS"] = "Dolciani. Math. Expo.",
["UNCONVENTIONAL APPROACHES TO NANOSTRUCTURES WITH APPLICATIONS IN ELECTRONICS, PHOTONICS, INFORMATION STORAGE AND SENSING"] = "Mater. Res. Soc. Symp. P.",
@@ -120602,6 +120624,10 @@ abbrevs = {
["VEROFFENTLICHUNGEN DER SCHWEIZERISCHEN GESELLSCHAFT FUR GESCHICHTE DER PHARMAZIE / HERAUSGEGEBEN VOM VORSTAND DER SCHWEIZERISCHEN GESELLSCHAFT FUR GESCHICHTE DER PHARMAZIE (SGGP)"] = "Veroff Schweiz Ges Gesch Pharm",
["VEROFFENTLICHUNGEN DER UNIVERSITATSBIBLIOTHEK ESSEN"] = "Ver. U. Essen",
["VEROFFENTLICHUNGEN DES DEUTSCHEN HISTORISCHEN INSTITUTS LONDON"] = "Veroff. Dtsch. Hist. Inst. London",
+ ["VEROFFENTLICHUNGEN DES FORSCHUNGSINSTITUTS DES DEUTSCHEN MUSEUMS FUR DIE GESCHICHTE DER NATURWISSENSCHAFTEN UND DER TECHNIK, REIHE A: KLEINE MITTEILUNGEN"] = "Veroffentlichungen des Forschungsinstituts des Deutschen Museums fur die Geschichte der Naturwissenschaften und der",
+ ["VEROFFENTLICHUNGEN DES FORSCHUNGSINSTITUTS DES DEUTSCHEN MUSEUMS FUR DIE GESCHICHTE DER NATURWISSENSCHAFTEN UND DER TECHNIK, REIHE C: QUELLENTEXTE UND UBERSETZUNGEN"] = "Veroffentlichungen des Forschungsinstituts des Deutschen Museums fur die Geschichte der Naturwissenschaften und der",
+ ["VEROFFENTLICHUNGEN DES FORSCHUNGSINSTITUTS DES DEUTSCHEN MUSEUMS FUR DIE GESCHICHTE DER NATURWISSENSCHAFTEN UND DER TECHNIK. REIHE A: KLEINE MITTEILUNGEN"] = "Veroffentlichungen des Forschungsinstituts des Deutschen Museums fur die Geschichte der Naturwissenschaften und der",
+ ["VEROFFENTLICHUNGEN DES FORSCHUNGSINSTITUTS DES DEUTSCHEN MUSEUMS FUR DIE GESCHICHTE DER NATURWISSENSCHAFTEN UND DER TECHNIK. REIHE C: QUELLENTEXTE UND UBERSETZUNGEN"] = "Veroffentlichungen des Forschungsinstituts des Deutschen Museums fur die Geschichte der Naturwissenschaften und der",
["VEROFFENTLICHUNGEN DES GEOBOTANISCHEN INSTITUTES DER EIDGENOSSISCHEN TECHNISCHEN HOCHSCHULE STIFTUNG RUBEL"] = "Ver. Geobot.",
["VEROFFENTLICHUNGEN DES HWWA-INSTITUT FUR WIRTSCHAFTSFORSCHUNG - HAMBURG"] = "Ver. Hwwa. Inst. Wirts.",
["VEROFFENTLICHUNGEN DES INSTITUTS FUR BIBLIOTHEKSWISSENSCHAFT UND BIBLIOTHEKARAUSBILDUNG DER FREIEN UNIVERSITAT BERLIN"] = "Veroffentl. Inst. Bibliothekswissen. Bibliothekarausbild. Freien Univ. Berlin",
@@ -121694,6 +121720,8 @@ abbrevs = {
["VŬTRESHNI BOLESTI"] = "Vutr Boles",
["VYCHISLITELNAYA TEKHNIKA SOTSIALISTICHESKIKH STRAN"] = "Vychisl. Tekhn. Sots. Stran",
["VYCHISLITELNYE TEKHNOLOGII. COMPUTATIONAL TECHNOLOGIES"] = "Vychisl. Tekhnol.",
+ ["VYCHISLITELNYI TSENTR MOSKOVSKOGO GOSUDARSTVENNOGO UNIVERSITETA. SERIYA: STATISTIKA I STOKHASTICHESKIE SISTEMI,"] = "Vychislitelnyi Tsentr Moskovskogo Gosudarstvennogo Universiteta. Seriya: Statistika i Stokhasticheskie",
+ ["VYCHISLITELNYI TSENTR MOSKOVSKOGO GOSUDARSTVENNOGO UNIVERSITETA. SERIYA: STATISTIKA I STOKHASTICHESKIE SISTEMY,"] = "Vychislitelnyi Tsentr Moskovskogo Gosudarstvennogo Universiteta. Seriya: Statistika i Stokhasticheskie",
["VYCHISLITEL\\CPRIME NAYA I PRIKLADNAYA MATEMATIKA"] = "Vychisl. Prikl. Mat. (Kiev)",
["VYCHISLITEL\\CPRIME NAYA TEKHNIKA"] = "Vychisl. Tekhn. Sistemy Upravlenie",
["VYCHISLITEL\\CPRIME NAYA TEKHNIKA I VOPROSY KIBERNETIKI"] = "Vychisl. Tekhn. Vopr. Kibern.",
@@ -125022,7 +125050,6 @@ abbrevs = {
["ZESZYTY NAUKOWE POLITECHNIKI RZESZOWSKIEJ"] = "Zeszyty Nauk. Politech. Rzeszowskiej Mat.",
["ZESZYTY NAUKOWE UNIWERSYTETU JAGIELLONSKIEGO. PRACE GEOGRAFICZNE"] = "Zesz Nauk Uniw Jagiell Pr Geogr",
["ZESZYTY NAUKOWE WYDZIALU BUDOWNICTWAI I INZYNIERII SRODOWISKA"] = "Zesz. Nauk. Wydzialu B.",
- ["ZESZYTY NAUKOWE WY\\"] = "Problemy Mat.",
["ZESZYTY NAUKOWE WYŻSZA SZKOŁA PEDAGOGICZNA IM. POWSTAŃCÓW ŚL\\POLHK ASKICH W OPOLU. MATEMATYKA"] = "Zeszyty Nauk. Wyż. Szkoły Ped. Powstańców Śl. Opolu Mat.",
["ZETA FUNCTIONS OF GROUPS AND RINGS"] = "Lect. Notes. Math.",
["ZETA FUNCTIONS OVER ZEROS OF ZETA FUNCTIONS"] = "Lect. Notes. Unione. Ma.",
@@ -125900,6 +125927,8 @@ unabbrevs = {
["ABH SENCKB NATURFORSCH GES"] = "Abhandlungen der Senckenbergischen Naturforschenden Gesellschaft",
["ABH WESTFAL MUS NATURKUNDE"] = "Abhandlungen aus dem Westfälischen Museum für Naturkunde",
["ABH WESTFÄL MUS NATKD"] = "Abhandlungen aus dem Westfälischen Museum für Naturkunde",
+ ["ABHANDLUNG ZUR ERLANGUNG DER WURDE EINES DOKTORS DER NATURWISSENSCHAFTEN DER EIDGENOSSISCHEN TECHNISCHEN HOCHSCHULE"] = "Abhandlung zur Erlangung der Wurde eines Doktors der Naturwissenschaften der Eidgenossischen Technischen Hochschule Zurich",
+ ["ABHANDLUNG ZUR ERLANGUNG DER WURDE EINES DOKTORS DER TECHNISCHEN WISSENSCHAFTEN DER EIDGENOSSISCHEN TECHNISCHEN HOCH"] = "Abhandlung zur Erlangung der Wurde eines Doktors der technischen Wissenschaften der Eidgenossischen Technischen Hochschule Zurich",
["ABHBERLIN"] = "Abhandlungen der Deutschen Akademie der Wissenschaften zu Berlin",
["ABHDÜSSELDORF"] = "Abhandlungen der Rheinisch-Westfälischen Akademie der Wissenschaften",
["ABHGOETTINGEN"] = "Abhandlungen der Akademie der Wissenschaften zu Göttingen. Philologisch-Historische Klasse",
@@ -125990,11 +126019,11 @@ unabbrevs = {
["ACARINA"] = "Acarina : Russkiǐ akarologicheskiǐ zhurnal + Russian journal of acarology",
["ACAROLOGIA"] = "Acarologia",
["ACBIBL"] = "Accademie e biblioteche d’Italia",
+ ["ACC"] = "Accounting, Business and Financial History",
["ACC CHEM RES"] = "Accounts of chemical research",
["ACC CURR J REV"] = "ACC current journal review",
["ACC MATER RES"] = "Accounts of materials research",
["ACC REV"] = "Accounting Review",
- ["ACC, BUS FINAN HIST"] = "Accounting, Business and Financial History",
["ACCAD BIBL ITAL"] = "Accademie e biblioteche d'Italia",
["ACCAD MEDICA"] = "Accademia medica",
["ACCAD NAZ LINCEI ROME"] = "Accademia nazionale dei Lincei. Fondazione Leone Caetani",
@@ -126880,6 +126909,7 @@ unabbrevs = {
["ACTA RHUMATOL BELG"] = "Acta rhumatologica Belgica",
["ACTA SALMANT HIST MED"] = "Acta Salmanticensia. Historia de la medicina",
["ACTA SALMANTICENSIA SER FILOS LETRA"] = "Acta Salmanticensia. Filosofía y letras",
+ ["ACTA SALMANTICENSIA: COLECCION DE MEMORIAS Y TRABAJOS CIENTIFICOS EDITADOS POR LA UNIVERSIDAD DE SALAMANCA, SERIE"] = "Acta Salmanticensia: Coleccion de Memorias y Trabajos Cientificos Editados por la Universidad de Salamanca, Serie de Ciencias",
["ACTA SCH MED UNIV KIOTO"] = "Acta Scholae Medicinalis Universitatis in Kioto",
["ACTA SCI"] = "Acta scientiarum. Animal sciences",
["ACTA SCI AGRON"] = "Acta scientiarum. Agronomy",
@@ -129905,6 +129935,7 @@ unabbrevs = {
["ANAL METHODS"] = "Analytical methods : advancing methods and applications",
["ANAL METHODS ACCID RES"] = "Analytic methods in accident research",
["ANAL METHODS SOC RES"] = "Analytical Methods for Social Research",
+ ["ANAL METHODS SPEC FUNCT"] = "Analytical Methods and Special Functions",
["ANAL METHODS-UK"] = "Analytical Methods",
["ANAL MODERN APL"] = "Analiză Modernă şi Aplicaţii",
["ANAL PDE"] = "Analysis & PDE",
@@ -130335,7 +130366,7 @@ unabbrevs = {
["ANN EUGEN"] = "Annals of eugenics",
["ANN EUGENIC"] = "Annals of Eugenics",
["ANN EYE SCI"] = "Annals of eye science",
- ["ANN FAC ECON COM, UNIV PALERMO"] = "Annali della facoltà di Economia e Commercio, Università Palermo",
+ ["ANN FAC ECON COM"] = "Annali della facoltà di Economia e Commercio, Università Palermo",
["ANN FAC ECON COMMER"] = "Annali della Facoltà di economia e commercio (Università di Messina)",
["ANN FAC LETT SCI HUM"] = "Annales de la Faculté des lettres et sciences humaines (Dakar, Senegal)",
["ANN FAC LETT SCI HUM NICE"] = "Annales. Faculté des lettres et sciences humaines de Nice",
@@ -134484,6 +134515,8 @@ unabbrevs = {
["BERGAMO HAE"] = "Bergamo Spring Conferences On Haematology",
["BERICH BUNSEN GESELL"] = "Berichte Der Bunsen-gesellschaft Fur Physikalische Chemie",
["BERICHT"] = "Bericht",
+ ["BERICHTE AUS DEM INSTITUT FUR STATISTIK UND VERSICHERUNGSMATHEMATIK UND AUS DEM INSTITUT FUR ANGEWANDTE STATISTIK DE"] = "Berichte aus dem Institut fur Statistik und Versicherungsmathematik und aus dem Institut fur Angewandte Statistik der Freien Universitat Berlin",
+ ["BERICHTE AUS DEM INSTITUT FUR STATISTIK UND WIRTSCHAFTSMATHEMATIK UND AUS DEM INSTITUT FUR ANGEWANDTE STATISTIK DER"] = "Berichte aus dem Institut fur Statistik und Wirtschaftsmathematik und aus dem Institut fur Angewandte Statistik der Freien Universitat Berlin",
["BERICHTE GERMAN CHAPTER ACM"] = "Berichte des German Chapter of the ACM",
["BERITA JURURAWAT"] = "Berita jururawat",
["BERK INSIGH LINGUIST"] = "Berkeley Insights in Linguistics and Semiotics",
@@ -138981,10 +139014,12 @@ unabbrevs = {
["CHAPMAN & HALL/CRC MATH COMPUT BIOL SER"] = "Chapman & Hall/CRC Mathematical and Computational Biology Series",
["CHAPMAN & HALL/CRC MATH COMPUT IMAGING SCI"] = "Chapman & Hall/CRC Mathematical and Computational Imaging Sciences",
["CHAPMAN & HALL/CRC NUMER ANAL SCI COMPUT"] = "Chapman & Hall/CRC Numerical Analysis and Scientific Computing",
+ ["CHAPMAN & HALL/CRC SER OPER RES"] = "Chapman & Hall/CRC Series in Operations Research",
["CHAPMAN & HALL/CRC TEXTS STAT SCI SER"] = "Chapman & Hall/CRC Texts in Statistical Science Series",
["CHAPMAN AND HALL MATH SER"] = "Chapman and Hall Mathematics Series",
["CHAPMAN HALL CRC HANDB MOD STAT METHODS"] = "Chapman & Hall/CRC handbooks of modern statistical methods",
["CHAPMAN HALL CRC MATH COMPUT BIOL SER"] = "Chapman & Hall/CRC mathematical & computational biology series",
+ ["CHAPMAN HALL/CRC MATH BIOL SER"] = "Chapman & Hall/CRC Mathematical Biology Series",
["CHARACT PERSON"] = "Character and Personality",
["CHARACTER PERS"] = "Character and personality",
["CHARADRIUS (BONN)"] = "Charadrius : Zeitschrift für Vogelkunde, Vogelschutz und Naturschutz in Rheinland und in Westfalen",
@@ -139804,7 +139839,7 @@ unabbrevs = {
["CIRCULATION"] = "Circulation",
["CIRDAP DEV DIG"] = "CIRDAP development digest",
["CIRES CAH IVOIR RECH ECON SOC"] = "CIRES, Cahiers ivoiriens de recherche économique et sociale. Centre ivoirien de recherches économiques et sociales",
- ["CIRIEC-ESPAÑA, REVISTA ECON PÚBLICA, SOC COOPERATIVA"] = "CIRIEC-España, Revista de Economía Pública, Social y Cooperativa",
+ ["CIRIEC-ESPAÑA"] = "CIRIEC-España, Revista de Economía Pública, Social y Cooperativa",
["CIRM JEAN-MORLET SER"] = "CIRM Jean-Morlet Series",
["CIRP ANN"] = "CIRP Annals",
["CIRP ANN-MANUF TECHN"] = "Cirp Annals-manufacturing Technology",
@@ -144127,6 +144162,8 @@ unabbrevs = {
["DIDACT SLOV-PEDAGOS"] = "Didactica Slovenica-pedagoska Obzorja",
["DIDATT PROPOS ESPER"] = "Didattica: Proposte ed Esperienze",
["DIE CAST ENG"] = "Die Casting Engineer",
+ ["DIE GRUNDLEHREN DER MATHEMATISCHEN WISSENSCHAFTEN IN EINZELDARSTELLUNGEN MIT BESONDERER BERUCKSICHTIGUNG DER ANWENDUNG"] = "Die Grundlehren der mathematischen Wissenschaften in Einzeldarstellungen mit besonderer Berucksichtigung der Anwendungsgebiete",
+ ["DIE GRUNDLEHREN DER MATHEMATISCHEN WISSENSCHAFTEN IN EINZELDARSTELLUNGEN MIT BESONDERER BERUCKSIGHTIGUNG DER ANWENDUNG"] = "Die Grundlehren der mathematischen Wissenschaften in Einzeldarstellungen mit besonderer Berucksightigung der Anwendungsgebiete",
["DIECIOCHO"] = "Dieciocho-hispanic Enlightenment",
["DIESEL PROG ENGINE D"] = "Diesel Progress Engines & Drives",
["DIESEL PROG N AM ED"] = "Diesel Progress North American Edition",
@@ -144964,7 +145001,7 @@ unabbrevs = {
["EAST-WEST J ECON BUS"] = "East-West Journal of Economics and Business",
["EAST-WEST J MATH"] = "East-West Journal of Mathematics",
["EAST-WEST J NUMER MATH"] = "East-West Journal of Numerical Mathematics",
- ["EAST-WEST SER ECON, BUS, ENVIRON"] = "East-West Series in Economics, Business, and the Environment",
+ ["EAST-WEST SER ECON"] = "East-West Series in Economics, Business, and the Environment",
["EASTERN AFR ECON REV"] = "Eastern African Economic Review",
["EASTERN AFRICA ECON REV"] = "Eastern Africa Economic Review",
["EASTERN ANTHROPOL"] = "Eastern Anthropologist",
@@ -145074,8 +145111,7 @@ unabbrevs = {
["ECOMAT"] = "EcoMat",
["ECON AFF"] = "Economics Affairs (Calcutta)",
["ECON ANAL"] = "Economic Analysis",
- ["ECON ANAL POL"] = "Economic Analysis and Policy",
- ["ECON ANAL POL, NS"] = "Economic Analysis and Policy, New Series",
+ ["ECON ANAL POL"] = "Economic Analysis and Policy, New Series",
["ECON ANAL POLICY"] = "Economic analysis and policy",
["ECON ANAL WORKERS’ MANAGE"] = "Economic Analysis and Workers’ Management",
["ECON ANTHROPOL"] = "Economic anthropology (Hoboken, N.J.)",
@@ -145085,7 +145121,6 @@ unabbrevs = {
["ECON BULL ASIA PAC"] = "Economic bulletin for Asia and the Pacific",
["ECON BULL EUR"] = "Economic bulletin for Europe",
["ECON BULL GHANA"] = "The Economic bulletin of Ghana",
- ["ECON BULL GHANA, 2ND SER"] = "Economic Bulletin of Ghana, Second Series",
["ECON BULL NATL BANK EGYPT"] = "Economic bulletin - National Bank of Egypt",
["ECON BUS BULL"] = "Economic and Business Bulletin",
["ECON BUS EDUC"] = "Economics and Business Education",
@@ -145122,7 +145157,6 @@ unabbrevs = {
["ECON GOVERNANCE"] = "Economics of Governance",
["ECON HIST (SWEDEN)"] = "Economy and history",
["ECON HIST REV"] = "The Economic history review",
- ["ECON HIST REV, 2ND SER"] = "Economic History Review, Second Series",
["ECON HIST REV-FIRST"] = "Economic History Review-first Series",
["ECON HUM BIOL"] = "Economics and human biology",
["ECON HUMANISME"] = "Economie et humanisme",
@@ -145152,7 +145186,7 @@ unabbrevs = {
["ECON MED ANIM"] = "Economie et médecine animales",
["ECON MERID"] = "Economie méridionale",
["ECON MEX"] = "Economia Mexicana-nueva Epoca",
- ["ECON MEXICANA, NUEVA EPOCA"] = "Economia Mexicana, Nueva Epoca",
+ ["ECON MEXICANA"] = "Economia Mexicana, Nueva Epoca",
["ECON MODEL"] = "Economic modelling",
["ECON MODELLING"] = "Economic Modelling",
["ECON NON-MARK GOOD"] = "Bounded Rationality and Public Policy: A Perspective From Behavioural Economics",
@@ -145249,7 +145283,6 @@ unabbrevs = {
["ECONOMIA UMANA RASSEGNA MEDICA INTERNAZIONALE"] = "L'Economia umana; rassegna medica internazionale",
["ECONOMICA"] = "Economica",
["ECONOMICA (NS)"] = "Economica. New Series",
- ["ECONOMICA, NS"] = "Economica, N.S.",
["ECONOMICA-NEW SER"] = "Economica-new Series",
["ECONOMICS"] = "Economics",
["ECONOMIST"] = "Economist (London, England : 1843)",
@@ -148408,7 +148441,7 @@ unabbrevs = {
["FINAN HIST REV"] = "Financial History Review",
["FINAN INDUSTRY STUD"] = "Financial Industry Studies",
["FINAN MANAGE"] = "Financial Management",
- ["FINAN MARKETS, INST INSTRUMENTS"] = "Financial Markets, Institutions and Instruments",
+ ["FINAN MARKETS"] = "Financial Markets, Institutions and Instruments",
["FINAN MON P"] = "Advances in Small Business Finance",
["FINAN PRACTICE EDUC"] = "Financial Practice and Education",
["FINAN REV"] = "Financial Review",
@@ -149091,6 +149124,7 @@ unabbrevs = {
["FOUND COMPUT MATH"] = "Foundations of Computational Mathematics. The Journal of the Society for the Foundations of Computational Mathematics",
["FOUND COMPUT SER"] = "Foundations of Computing Series",
["FOUND COMUT MATH"] = "Foundations of computational mathematics (New York, N.Y.)",
+ ["FOUND DATA SCI"] = "Foundations of Data Science",
["FOUND ENG MECH"] = "Foundations of Engineering Mechanics",
["FOUND FUTURES EDUC"] = "Education and The Family",
["FOUND LANG"] = "Foundations of Language",
@@ -158340,9 +158374,9 @@ unabbrevs = {
["J ACAD R"] = "Journal of The Academy of Rehabilitative Audiology",
["J ACAD REH"] = "Journal of The Academy of Rehabilitative Audiology.",
["J ACAD REHABIL AUDIOL"] = "Journal of the Academy of Rehabilitative Audiology",
+ ["J ACC"] = "Journal of Accounting, Auditing and Finance",
["J ACC ECON"] = "Journal of Accounting and Economics",
["J ACC RES"] = "Journal of Accounting Research",
- ["J ACC, AUD FINANCE"] = "Journal of Accounting, Auditing and Finance",
["J ACCESS SERV"] = "Journal of access services",
["J ACCID EMERG MED"] = "Journal of accident & emergency medicine",
["J ACCOUNT ECON"] = "Journal of Accounting & Economics",
@@ -160308,7 +160342,7 @@ unabbrevs = {
["J CONVEX ANAL"] = "Journal of Convex Analysis",
["J COORD CHEM"] = "Journal of Coordination Chemistry",
["J COPYRIGHT SOC USA"] = "Journal of The Copyright Society of The Usa",
- ["J CORP FINAN: CONTRACTING, GOVERNANCE ORGAN"] = "Journal of Corporate Finance: Contracting, Governance and Organization",
+ ["J CORP FINAN: CONTRACTING"] = "Journal of Corporate Finance: Contracting, Governance and Organization",
["J CORP FINANC"] = "Journal of Corporate Finance",
["J CORP LAW"] = "The Journal of corporation law",
["J CORP TAX"] = "Journal of Corporate Taxation",
@@ -161678,7 +161712,7 @@ unabbrevs = {
["J HEALTH PHYS EDUC"] = "The Journal of health and physical education",
["J HEALTH POLIT POLIC"] = "Journal of Health Politics Policy and Law",
["J HEALTH POLIT POLICY LAW"] = "Journal of health politics, policy and law",
- ["J HEALTH POLITICS, POL LAW"] = "Journal of Health Politics, Policy and Law",
+ ["J HEALTH POLITICS"] = "Journal of Health Politics, Policy and Law",
["J HEALTH POLLUT"] = "Journal of health & pollution",
["J HEALTH POPUL DEV CTRIES"] = "Journal of health & population in developing countries",
["J HEALTH POPUL NUTR"] = "Journal of health, population, and nutrition",
@@ -162189,7 +162223,7 @@ unabbrevs = {
["J INT ECON LAW"] = "Journal of International Economic Law",
["J INT FED CLIN CHEM"] = "Journal of the International Federation of Clinical Chemistry",
["J INT FED GYNAECOL OBSTET"] = "Journal of the International Federation of Gynaecology and Obstetrics",
- ["J INT FINAN MARKETS, INST MONEY"] = "Journal of International Financial Markets, Institutions and Money",
+ ["J INT FINAN MARKETS"] = "Journal of International Financial Markets, Institutions and Money",
["J INT LAW ECON"] = "The Journal of international law and economics",
["J INT MANAG"] = "Journal of International Management",
["J INT MARKETING"] = "Journal of International Marketing",
@@ -162489,6 +162523,7 @@ unabbrevs = {
["J LAT AMER LORE"] = "Journal of Latin American Lore",
["J LAT EDUC"] = "Journal of Latinos and education",
["J LAT PSYCHOL"] = "Journal of Latina/o psychology",
+ ["J LAW"] = "Journal of Law, Economics, and Organization",
["J LAW BIOSCI"] = "Journal of law and the biosciences",
["J LAW ECON"] = "The Journal of law & economics",
["J LAW ECON ORGAN"] = "Journal of law, economics, & organization",
@@ -162503,7 +162538,6 @@ unabbrevs = {
["J LAW RELIG"] = "The Journal of law and religion",
["J LAW SOC"] = "Journal of law and society",
["J LAW TECHNOL"] = "The Journal of law and technology",
- ["J LAW, ECON, ORGAN"] = "Journal of Law, Economics, and Organization",
["J LEADERSH ORGAN STUD"] = "Journal of leadership & organizational studies",
["J LEARN DISABIL"] = "Journal of learning disabilities",
["J LEARN DISABIL-US"] = "Journal of Learning Disabilities",
@@ -163190,8 +163224,8 @@ unabbrevs = {
["J MOLLUSCAN STUD"] = "The Journal of molluscan studies",
["J MONET ECON"] = "Journal of monetary economics",
["J MONETARY ECON"] = "Journal of Monetary Economics",
+ ["J MONEY"] = "Journal of Money, Credit, and Banking",
["J MONEY CREDIT BANK"] = "Journal of money, credit, and banking",
- ["J MONEY, CREDIT, BANKING"] = "Journal of Money, Credit, and Banking",
["J MONG MATH SOC"] = "Journal of the Mongolian Mathematical Society",
["J MORAL EDUC"] = "Journal of moral education",
["J MORAL PHILOS"] = "Journal of moral philosophy",
@@ -168424,9 +168458,9 @@ unabbrevs = {
["LÖBF-SCHRREIHE, LANDESANST ÖKOL BODENORDN FORSTEN NORDRH-WESTFAL"] = "LÖBF-Schriftenreihe, Landesanstalt für Ökologie, Bodenordnung und Forsten, Nordrhein-Westfalen",
["LÖLF-MITT, LANDESANST ÖKOL LANDSCHENTWICKL  FORSTPLAN, NORDRH-WESTFAL"] = "LÖLF-Mitteilungen, Landesanstalt für Ökologie, Landschaftsentwicklung und Forstplanung, Nordrhein-Westfalen",
["L’ACTUAL ECON"] = "L’Actualité Economique",
+ ["L’EVOLUTION DE L’HUMANITE, SYNTHESE COLLECTIVE PREMIERE SECTION, SERIE COMPLEMENTAIRE: LA SCIENCE DANS L’AN"] = "L’Evolution de l’Humanite, Synthese Collective. Premiere Section, Serie Complementaire: La Science dans l’Antiquite",
["L’IMPRESA"] = "L’Impresa",
- ["L’INDUSTRIA"] = "L’Industria",
- ["L’INDUSTRIA, NS"] = "L’Industria, Nuova Serie",
+ ["L’INDUSTRIA"] = "L’Industria, Nuova Serie",
["M B PHARM BULL"] = "M & B pharmaceutical bulletin",
["M B PORTER LECTURES"] = "M",
["M D ANDERSON CANCER"] = "Breast Cancer, Second Edition",
@@ -169401,6 +169435,8 @@ unabbrevs = {
["MATHEMATICA (CLUJ)"] = "Académie Roumaine",
["MATHEMATICS (BASEL)"] = "Mathematics (Basel, Switzerland)",
["MATHEMATIKA"] = "Mathematika",
+ ["MATHEMATISCH CENTRUM, AFDELING MATHEMATISCHE BESLISKUNDE IN SAMENWERKING MET HET INTERUNIVERSITAIR INSTITUUT BEDRIJFSKUN"] = "Mathematisch Centrum, Afdeling Mathematische Besliskunde in samenwerking met het Interuniversitair Instituut Bedrijfskunde Delft/Rotterdam",
+ ["MATHEMATISCHE LEHRBUCHER UND MONOGRAPHIEN, HERAUSGEGEBEN VON DER DEUTSCHEN AKADEMIE DER WISSENSCHAFTEN ZU BERLIN, FORS"] = "Mathematische Lehrbucher und Monographien, herausgegeben von der Deutschen Akademie der Wissenschaften zu Berlin, Forschungsinstitut fur Mathematik. I. Abteilung, Mathematische Lehrbucher",
["MATHESIS"] = "Mathesis",
["MATHEWS J CASE REP"] = "Mathews journal of case reports",
["MATHEWS J OPHTHALMOL"] = "Mathews journal of ophthalmology",
@@ -171919,6 +171955,7 @@ unabbrevs = {
["MULTIDIMENS SYST SIGNAL PROCESS"] = "Multidimensional systems and signal processing",
["MULTIDIMENS SYSTEMS SIGNAL PROCESS"] = "Multidimensional Systems and Signal Processing",
["MULTIDIMENSION SYST SIGNAL PROCESS"] = "Multidimensional Systems and Signal Processing",
+ ["MULTIDISCIP APPL OPT"] = "Multidisciplinary and Applied Optics",
["MULTIDISCIP J EDUC RESEARCH"] = "Multidisciplinary journal of educational research",
["MULTIDISCIP RESP MED"] = "Multidisciplinary Respiratory Medicine",
["MULTIDISCIP RESPIR MED"] = "Multidisciplinary respiratory medicine",
@@ -173931,7 +173968,6 @@ unabbrevs = {
["NONLINEAR DYN PSYCHOL LIFE SCI"] = "Nonlinear Dynamics, Psychology, and Life Sciences",
["NONLINEAR DYN SYST THEORY"] = "Nonlinear Dynamics and Systems Theory. An International Journal of Research and Surveys",
["NONLINEAR DYNAM"] = "Nonlinear Dynamics",
- ["NONLINEAR DYNAM, PSYCH, AND LIFE SCI"] = "Nonlinear Dynamics, Psychology, and Life Sciences",
["NONLINEAR DYNAMICS PSYCHOL LIFE SCI"] = "Nonlinear dynamics, psychology, and life sciences",
["NONLINEAR OSCIL"] = "Nonlinear Oscillations",
["NONLINEAR PHENOM COMPLEX SYSTEMS"] = "Nonlinear Phenomena and Complex Systems",
@@ -175756,6 +175792,8 @@ unabbrevs = {
["OSTERR ZAHNPROTHET"] = "Osterreichische Zahnprothetik",
["OSTERR ZAHNTECH HANDW"] = "Das Österreichische Zahntechniker Handwerk : offizielles Organ der Bundesinnung der Zahntechniker",
["OSTERR ZAHNTECH HANDWERK"] = "Osterreichische Zahntechniker Handwerk",
+ ["OSTERREICHISCHE AKADEMIE DER WISSENSCHAFTEN, PHILOSOPHISCH-HISTORISCHE KLASSE, SITZUNGSBERICHTE, 252 BAND, 5 ABHANDL"] = "Osterreichische Akademie der Wissenschaften, Philosophisch-Historische Klasse, Sitzungsberichte, 252. Band, 5. Abhandlung; Veroffentlichungen der Kommission fur Geschichte der Erziehung und des Unterrichts",
+ ["OSTERREICHISCHE AKADEMIE DER WISSENSCHAFTENKOMMISSION FUR BYZANTINISTIKINSTITUT FUR BY"] = "Osterreichische Akademie der Wissenschaften.Kommission fur Byzantinistik.Institut fur Byzantinistik der Universitat Wien",
["OSTERREICHISCHE PFLEGEZEITSCHRIFT"] = "Osterreichische Pflegezeitschrift : Organ des Osterreichischen Gesundheits- und Krankenpflegeverbands",
["OSTEUROPA"] = "Osteuropa",
["OSTOMY WOUND MANAG"] = "Ostomy Wound Management",
@@ -179091,7 +179129,6 @@ unabbrevs = {
["PROBLEMI TEKHN KIBERNET ROBOT"] = "Problemi na Tekhnicheskata Kibernetika i Robotikata",
["PROBLEMOS"] = "Problemos",
["PROBLEMS INFORM TRANSMISSION"] = "Problems of Information Transmission",
- ["PROBLEMY MAT"] = "Zeszyty Naukowe Wy\\",
["PROBLEMY PEREDACHI INFORMATSII"] = "Rossiiskaya Akademiya Nauk. Problemy Peredachi Informatsii",
["PROBLEMY TEOR GRAVITATSII I ELEMENT CHASTITS"] = "Problemy Teorii Gravitatsii i Èlementarnykh Chastits",
["PROBLEMY UPRAVLEN INFORM"] = "Natsionalnaya Akademiya Nauk Ukrainy. Problemy Upravleniya i Informatiki",
@@ -180131,7 +180168,6 @@ unabbrevs = {
["PSYCH"] = "Psych",
["PSYCH FEN S"] = "Many Faces of Panic Disorder",
["PSYCH J"] = "PsyCh journal",
- ["PSYCHANALYSE"] = "Psychanalyse",
["PSYCHANALYSE ET"] = "Malaise Dans Le Capitalisme",
["PSYCHE (CAMB MASS)"] = "Psyche; a journal of entomology",
["PSYCHE (STUTTG)"] = "Psyche",
@@ -180555,8 +180591,10 @@ unabbrevs = {
["PUBLIC WELFARE"] = "Public Welfare",
["PUBLIC WORKS"] = "Public Works",
["PUBLIC WORLDS"] = "Calibrations: Reading for The Social",
+ ["PUBLICACIONES DEL OBSERVATORIO DE SANTIAGO, II CONSEJO SUPERIOR DE INVESTIGACIONES CIENTIFICAS, INSTITUTO NACIONAL DE G"] = "Publicaciones del Observatorio de Santiago, II. Consejo Superior de Investigaciones Cientificas, Instituto Nacional de Geofisica",
["PUBLICACOES MED"] = "Publicações médicas",
- ["PUBLICATION"] = "Publication",
+ ["PUBLICATIONS DE L’INSTITUT DE MATHEMATIQUE DE L’UNIVERSITE DE STRASBOURG, XIV ACTUALITES SCIENTIFIQUES ET INDUSTR"] = "Publications de l’Institut de Mathematique de l’Universite de Strasbourg, XIV. Actualites Scientifiques et Industrielles",
+ ["PUBLICATIONS DE L’INSTITUT DE MATHEMATIQUE DE L’UNIVERSITE DE STRASBOURG, XV ACTUALITES SCIENTIFIQUES ET INDUSTRI"] = "Publications de l’Institut de Mathematique de l’Universite de Strasbourg, XV. Actualites Scientifiques et Industrielles",
["PUBLICO PRIV"] = "O público e o privado : caderno dos núcleos e grupos de pesquisa vinculados ao Mestrado Acadêmico em Políticas Públicas e Sociedade da Universidade Estadual do Ceará",
["PUBLINSTTTMENESES"] = "Publicaciones de la Institución »Tello Téllez de Meneses«",
["PUBLISH RES Q"] = "Publishing Research Quarterly",
@@ -184003,7 +184041,7 @@ unabbrevs = {
["RIVISTA ITALIANA ECON"] = "Rivista Italiana degli Economisti",
["RIVISTA POLITICA ECON"] = "Rivista di Politica Economica",
["RIVISTA STATIST APPL"] = "Rivista di Statistica Applicata",
- ["RIVISTA STORIA ECON, NS"] = "Rivista di Storia Economica, N.S.",
+ ["RIVISTA STORIA ECON"] = "Rivista di Storia Economica, N.S.",
["RJ"] = "Rechtshistoriches Journal",
["RKI"] = "Report of the Keio Institute of Cultural and Linguistic Studies",
["RL"] = "Revista de letras",
@@ -185336,6 +185374,8 @@ unabbrevs = {
["SCHRIFTENR VER WASSER BODEN LUFTHYG"] = "Schriftenreihe des Vereins für Wasser-, Boden- und Lufthygiene",
["SCHRIFTENR ZENTRALBL ARBEITSMED ARBEITSSCHUTZ PROPHYL"] = "Schriftenreihe Zentralblatt für Arbeitsmedizin, Arbeitsschutz und Prophylaxe",
["SCHRIFTENR ZENTRALBL ARBEITSMED ARBEITSSCHUTZ PROPHYL ERGONOMIE"] = "Schriftenreihe Zentralblatt fur Arbeitsmedizin, Arbeitsschutz, Prophylaxe, und Ergonomie",
+ ["SCHRIFTENREIHE DER INSTITUT FUR MATHEMATIK BEI DER DEUTSCHEN AKADEMIE DER WISSENSCHAFTEN ZU BERLIN, REIHE A REINE MAT"] = "Schriftenreihe der Institut fur Mathematik bei der Deutschen Akademie der Wissenschaften zu Berlin, Reihe A. Reine Mathematik",
+ ["SCHRIFTENREIHE DER INSTITUT FUR MATHEMATIK BEI DER DEUTSCHEN AKADEMIE DER WISSENSCHAFTEN ZU BERLIN, REIHE B ANGEWANDT"] = "Schriftenreihe der Institut fur Mathematik bei der Deutschen Akademie der Wissenschaften zu Berlin, Reihe B. Angewandte Mathematik und Mechanik",
["SCHRIFTENREIHE INST EMPIRISCHE WIRTSCHAFTSFORSCH UNIV ZURICH"] = "Schriftenreihe des Instituts fur Empirische Wirtschaftsforschung der Universitat Zurich",
["SCHRIFTENREIHE MATH INST UNIV MÜNSTER 3 SER"] = "Schriftenreihe des Mathematischen Instituts der Universität Münster, 3",
["SCHRIFTENREIHE PÄDAGOG HOCHSCH HEIDELBERG"] = "Schriftenreihe der Pädagogischen Hochschule Heidelberg",
@@ -185690,6 +185730,7 @@ unabbrevs = {
["SCI TECHNOL HUM VAL"] = "Science Technology & Human Values",
["SCI TECHNOL HUMAN VALUES"] = "Science, technology & human values",
["SCI TECHNOL LIBR (NEW YORK, NY)"] = "Science & technology libraries",
+ ["SCI TECHNOL MANAG SER"] = "Science, Technology, and Management Series",
["SCI TECHNOL MED ANC CULT"] = "Science, Technology, and Medicine in Ancient Cultures",
["SCI TECHNOL MED MOD"] = "Hearts Exposed: Transplants and The Media in 1960s Britain",
["SCI TECHNOL REV"] = "Science & technology review (Livermore, Calif.)",
@@ -186259,6 +186300,7 @@ unabbrevs = {
["SERDP ESTCP REMEDIAT"] = "In Situ Chemical Oxidation for Groundwater Remediation",
["SERIALS LIBR"] = "Serials Librarian",
["SERIALS REV"] = "Serials Review",
+ ["SERIE: ECOLE NATIONALE DE LA STATISTIQUE ET DE L’ADMINISTRATION ECONOMIQUE ET DU CENTRE D’ETUDES DES PROGRAMMES"] = "Serie: Ecole Nationale de la Statistique et de l’Administration economique et du Centre d’Etudes des Programmes Economiques",
["SERIES (BERL)"] = "SERIEs : journal of the Spanish Economic Association",
["SERIES ENTOM"] = "Bruchids and Legumes : Economics, Ecology and Coevolution",
["SERIES-J SPAN ECON"] = "Series-journal of The Spanish Economic Association",
@@ -187376,8 +187418,7 @@ unabbrevs = {
["SOUTH AFR LINGUIST A"] = "Southern African Linguistics and Applied Language Studies",
["SOUTH AFR POLIT ECON MON"] = "Southern Africa political & economic monthly",
["SOUTH AFRICAN J ECON"] = "South African Journal of Economics",
- ["SOUTH AFRICAN J ECON MANAGE SCI"] = "South African Journal of Economic and Management Sciences",
- ["SOUTH AFRICAN J ECON MANAGE SCI, NS"] = "South African Journal of Economic and Management Sciences, N.S.",
+ ["SOUTH AFRICAN J ECON MANAGE SCI"] = "South African Journal of Economic and Management Sciences, N.S.",
["SOUTH AFRICAN STATIST J"] = "South African Statistical Journal. Suid-Afrikaanse Statistiese Tydskrif",
["SOUTH AM INDIAN STUD"] = "South American Indian studies",
["SOUTH AM J HERPETOL"] = "South american journal of herpetology",
@@ -191857,6 +191898,7 @@ unabbrevs = {
["UNA COMMUN"] = "UNA communiqué",
["UNA NURS J"] = "UNA nursing journal",
["UNASYLVA"] = "Unasylva",
+ ["UNCERTAIN COMPUT TECH DECIS INTELL"] = "Uncertainty, Computational Techniques, and Decision Intelligence",
["UNCERTAIN OPER RES"] = "Uncertainty and Operations Research",
["UNCERTAIN SAFE UTIL MACH LEARN MED IMAGING GRAPH BIOMED IMAGE ANAL (2020)"] = "Uncertainty for safe utilization of machine learning in medical imaging, and graphs in biomedical image analysis : Second International Workshop, UNSURE 2020, and Third International Workshop, GRAIL 2020, Held in Conjunction with MICCAI 2020, Lima, Peru, October 8, 2020, Proceedings",
["UNCERTAIN SAFE UTIL MACHINE LEARN MED IMAGING CLIN IMAGE BASED PROCED (2019)"] = "Uncertainty for Safe Utilization of Machine Learning in Medical Imaging and Clinical Image-based Procedures : first International Workshop, UNSURE 2019, and 8th International Workshop, CLIP 2019, held in conjunction with MICCAI 2019, Shenzhen, China, October 17, 2019, Proceedings. UNSURE (Workshop) (1st : 2019 : Shenzhen Shi, China)",
@@ -192413,6 +192455,7 @@ unabbrevs = {
["VEROFF SCHWEIZ GES GESCH MED NATURWISS"] = "Veröffentlichungen der Schweizerischen Gesellschaft für Geschichte der Medizin und der Naturwissenschaften",
["VEROFF SCHWEIZ GES GESCH PHARM"] = "Veröffentlichungen der Schweizerischen Gesellschaft für Geschichte der Pharmazie",
["VEROFFENTL INST BIBLIOTHEKSWISSEN BIBLIOTHEKARAUSBILD FREIEN UNIV BERLIN"] = "Veroffentlichungen des Instituts fur Bibliothekswissenschaft und Bibliothekarausbildung der Freien Universitat Berlin",
+ ["VEROFFENTLICHUNGEN DES FORSCHUNGSINSTITUTS DES DEUTSCHEN MUSEUMS FUR DIE GESCHICHTE DER NATURWISSENSCHAFTEN UND DER"] = "Veroffentlichungen des Forschungsinstituts des Deutschen Museums fur die Geschichte der Naturwissenschaften und der Technik, Reihe A: Kleine Mitteilungen",
["VERPACK RUNDSCH"] = "Verpackungs Rundschau",
["VERPLEEGKD GEM"] = "Verpleegkundigen en gemeenschapszorg : tijdschrift van de het Nationaal Verbond der Katholieke Vlaamse Verplegenden",
["VERPLEEGKUNDE"] = "Verpleegkunde",
@@ -192984,6 +193027,7 @@ unabbrevs = {
["VYCHISL TEKHN VOPR KIBERN"] = "Vychislitel\\cprime naya Tekhnika i Voprosy Kibernetiki",
["VYCHISL TEKHN VOPROSY KIBERNET"] = "Leningradskiy Gosudarstvennyy Universitet",
["VYCHISL TEKHNOL"] = "Vychislitelnye Tekhnologii. Computational Technologies",
+ ["VYCHISLITELNYI TSENTR MOSKOVSKOGO GOSUDARSTVENNOGO UNIVERSITETA SERIYA: STATISTIKA I STOKHASTICHESKIE"] = "Vychislitelnyi Tsentr Moskovskogo Gosudarstvennogo Universiteta. Seriya: Statistika i Stokhasticheskie Sistemi,",
["VYSOKOCHIST VESHCHESTVA"] = "Vysokochistye Veshchestva",
["VYSOKOMOL SOEDIN"] = "Vysokomolekulyarnye Soedineniya Seriya A & Seriya B",
["VYSOKOMOL SOEDIN A"] = "Vysokomolekulyarnye Soedineniya Section A",
diff --git a/biblio/citation-style-language/citeproc-latex-core.lua b/biblio/citation-style-language/citeproc-latex-core.lua
index 4d53d4c6e3..42beb07735 100644
--- a/biblio/citation-style-language/citeproc-latex-core.lua
+++ b/biblio/citation-style-language/citeproc-latex-core.lua
@@ -6,12 +6,17 @@
local core = {}
+require("lualibs")
+local json_decode = utilities.json.tolua
+
local citeproc = require("citeproc")
-local bibtex2csl -- = require("citeproc-bibtex-parser") -- load on demand
+local bibtex_data = require("citeproc-bibtex-data")
+local bibtex_parser = require("citeproc-bibtex-parser")
+local latex_parser = require("citeproc-latex-parser")
+local yaml -- = require("citeproc-yaml") -- load on demand
+local bibtex2csl -- = require("citeproc-bibtex2csl") -- load on demand
local unicode = require("citeproc-unicode")
local util = citeproc.util
-require("lualibs")
-local latex_parser = require("citeproc-latex-parser")
core.locale_file_format = "csl-locales-%s.xml"
@@ -21,6 +26,10 @@ core.uncite_all_items = false
core.item_list = {}
core.item_dict = {}
+---@param file_name string
+---@param ftype "bib"?
+---@param file_info string
+---@return string? contents
function core.read_file(file_name, ftype, file_info)
if file_info then
file_info = unicode.capitalize(file_info)
@@ -47,87 +56,139 @@ function core.read_file(file_name, ftype, file_info)
end
-local function read_data_file(data_file)
- local file_name = data_file
- local extension = nil
+---@param filename string
+---@return string file
+---@return string format
+---@return string? contents
+local function read_data_file(filename)
+ local file = filename
+ local format = "json"
local contents = nil
- if util.endswith(data_file, ".json") then
- extension = ".json"
- contents = core.read_file(data_file, nil, "database file")
- elseif util.endswith(data_file, ".bib") then
- extension = ".bib"
- contents = core.read_file(data_file, "bib", "database file")
+ if util.endswith(filename, ".json") then
+ format = "json"
+ contents = core.read_file(filename, nil, "database file")
+ elseif string.match(filename, "%.ya?ml$") then
+ format = "yaml"
+ contents = core.read_file(filename, nil, "database file")
+ elseif util.endswith(filename, ".bib") then
+ format = "bibtex"
+ contents = core.read_file(filename, "bib", "database file")
else
- local path = kpse.find_file(data_file .. ".json")
+ file = filename .. ".json"
+ local path = kpse.find_file(file)
if path then
- file_name = data_file .. ".json"
- extension = ".json"
- contents = core.read_file(data_file .. ".json", nil, "database file")
+ format = "json"
+ contents = core.read_file(file, nil, "database file")
else
- path = kpse.find_file(data_file, "bib")
+ path = kpse.find_file(filename .. ".yaml") or kpse.find_file(filename .. ".yml")
if path then
- file_name = data_file .. ".bib"
- extension = ".bib"
- contents = core.read_file(data_file, "bib", "database file")
+ format = "yaml"
+ file = filename .. string.match(path, "%.ya?ml$")
+ contents = core.read_file(path, nil, "database file")
else
- util.error(string.format('Cannot find database file "%s"', data_file .. ".json"))
- end
- end
- end
-
- local csl_items = nil
-
- if extension == ".json" then
- local status, res = pcall(utilities.json.tolua, contents)
- if status and res then
- csl_items = res
- for _, item in ipairs(csl_items) do
- -- Jounal abbreviations
- if item.type == "article-journal" or item.type == "article-magazine"
- or item.type == "article-newspaper" then
- util.check_journal_abbreviations(item)
+ path = kpse.find_file(filename, "bib")
+ if path then
+ file = filename .. ".bib"
+ format = "bibtex"
+ contents = core.read_file(filename, "bib", "database file")
+ else
+ util.error(string.format('Cannot find database file "%s"', filename .. ".json"))
+ return file, format, nil
end
end
- else
- util.error(string.format('JSON decoding error in file "%s"', data_file))
- csl_items = {}
end
- elseif extension == ".bib" then
- bibtex2csl = bibtex2csl or require("citeproc-bibtex2csl")
- csl_items = bibtex2csl.parse_bibtex_to_csl(contents, true, true, true, true)
end
-
- if not csl_items then
- csl_items = {}
- end
-
- return file_name, csl_items
+ return file, format, contents
end
local function read_data_files(data_files)
local item_list = {}
local item_dict = {}
+
+ --- Store BibTeX entries for later resolving crossref
+ ---@type table<string, BibtexEntry>
+ local bibtex_entries = {}
+ ---@type table<string, string>
+ local bibtex_strings = {}
+ for name, macro in pairs(bibtex_data.macros) do
+ bibtex_strings[name] = macro.value
+ end
+ ---@type BibtexEntry[]
+ local entries_with_crossref = {}
+
for _, data_file in ipairs(data_files) do
- local file_name, csl_items = read_data_file(data_file)
+ -- local file_name, csl_items = read_data_file(data_file)
- -- TODO: parse item_dict entries on demand
- for _, item in ipairs(csl_items) do
- local id = item.id
- if item_dict[id] then
- util.warning(string.format('Duplicate entry key "%s" in "%s".', id, file_name))
- else
- item_dict[id] = item
- table.insert(item_list, item)
+ local csl_items = {}
+
+ local file, format, contents = read_data_file(data_file)
+
+ if contents then
+
+ if format == "json" then
+ local ok, res = pcall(json_decode, contents)
+ if ok then
+ ---@cast res CslData
+ csl_items = res
+ else
+ util.error(string.format('JSON decode error in file "%s".', file))
+ end
+
+ elseif format == "yaml" then
+ yaml = yaml or require("citeproc-yaml")
+ csl_items = yaml.parse(contents)
+
+ elseif format == "bibtex" then
+ local bib_data, exceptions = bibtex_parser.parse(contents, bibtex_strings)
+ if bib_data then
+ bibtex2csl = bibtex2csl or require("citeproc-bibtex2csl")
+ csl_items = bibtex2csl.convert_to_csl_data(bib_data, true, true, true, true)
+ for _, entry in ipairs(bib_data.entries) do
+ if not bibtex_entries[entry.key] then
+ bibtex_entries[entry.key] = entry
+ if entry.fields.crossref then
+ table.insert(entries_with_crossref, entry)
+ end
+ end
+ end
+ for string_name, value in pairs(bib_data.strings) do
+ bibtex_strings[string_name] = value
+ end
+ end
end
+
+ for _, item in ipairs(csl_items) do
+ local id = item.id
+ if item_dict[id] then
+ util.warning(string.format('Duplicate entry key "%s" in "%s".', id, file))
+ else
+ item_dict[id] = item
+ table.insert(item_list, item)
+ end
+ end
+
end
end
+
+ bibtex_parser.resolve_crossrefs(entries_with_crossref, bibtex_entries)
+
+ for _, entry in ipairs(entries_with_crossref) do
+ local new_item = bibtex2csl.convert_to_csl_item(entry, true, true, true, true)
+ item_dict[new_item.id] = new_item
+ for i, item in ipairs(item_list) do
+ if item.id == new_item.id then
+ item_list[i] = new_item
+ break
+ end
+ end
+ end
+
return item_list, item_dict
end
-
function core.make_citeproc_sys(data_files)
core.item_list, core.item_dict = read_data_files(data_files)
local citeproc_sys = {
@@ -169,6 +230,24 @@ function core.init(style_name, data_files, lang)
local citeproc_sys = core.make_citeproc_sys(data_files)
local engine = citeproc.new(citeproc_sys, style, lang, force_lang)
+
+ if engine:is_dependent_style() then
+ local default_locale = engine.style.default_locale;
+ local parent_style_link = engine:get_independent_parent()
+ if not parent_style_link then
+ return nil
+ end
+ local parent_style_id = string.match(string.gsub(parent_style_link, "/+$", ""), "[^/]+$")
+ util.info(string.format('Style "%s" is a dependent style linked to "%s".', style_name, parent_style_id))
+ style = core.read_file(parent_style_id .. ".csl", nil, "style")
+ if not style then
+ util.error(string.format('Failed to load style "%s.csl"', parent_style_id))
+ return nil
+ end
+ engine = citeproc.new(citeproc_sys, style, lang, force_lang)
+ engine.style.default_locale = default_locale
+ end
+
return engine
end
@@ -197,6 +276,7 @@ end
function core.make_citation(citation_info)
-- `citation_info`: "citationID={ITEM-1@2},citationItems={{id={ITEM-1},label={page},locator={6}}},properties={noteIndex={3}}"
+ -- util.debug(citation_info)
local citation = parse_latex_prop(citation_info)
-- assert(citation.citationID)
-- assert(citation.citationItems)
@@ -227,6 +307,7 @@ function core.make_citation(citation_info)
util.error(string.format('Invalid note index "%s".', note_index))
end
+ -- util.debug(citation)
return citation
end
diff --git a/biblio/citation-style-language/citeproc-latex.lua b/biblio/citation-style-language/citeproc-latex.lua
index 569911666c..74c3637733 100644
--- a/biblio/citation-style-language/citeproc-latex.lua
+++ b/biblio/citation-style-language/citeproc-latex.lua
@@ -28,7 +28,7 @@ function csl.init(style_name, bib_files, lang)
csl.engine = core.init(style_name, bib_files, lang)
- if csl.engine then
+ if csl.engine and csl.engine.style.citation then
csl.initialized = "true"
else
return
@@ -91,7 +91,7 @@ end
function csl.cite(citation_info)
-- "citationID={ITEM-UNAVAILABLE@1},citationItems={{id={ITEM-UNAVAILABLE}}},properties={noteIndex={1}}"
if not csl.engine then
- csl.error("CSL engine is not initialized.")
+ util.error("CSL engine is not initialized.")
end
-- util.debug(citation_info)
diff --git a/biblio/citation-style-language/citeproc-lua.1 b/biblio/citation-style-language/citeproc-lua.1
index dec7dd1962..65581dfb00 100644
--- a/biblio/citation-style-language/citeproc-lua.1
+++ b/biblio/citation-style-language/citeproc-lua.1
@@ -1,4 +1,4 @@
-.TH citeproc-lua 1 "0.4.2"
+.TH citeproc-lua 1 "0.4.3"
.SH NAME
citeproc-lua \- make CSL citations and bibliography for LaTeX
.SH SYNOPSIS
diff --git a/biblio/citation-style-language/citeproc-node-bibliography.lua b/biblio/citation-style-language/citeproc-node-bibliography.lua
index df0db20576..81add4013e 100644
--- a/biblio/citation-style-language/citeproc-node-bibliography.lua
+++ b/biblio/citation-style-language/citeproc-node-bibliography.lua
@@ -43,14 +43,15 @@ local YearSuffix = ir_node.YearSuffix
---@class Bibliography: Element
---@field hanging_indent boolean
----@field line_spacing integer
----@field entry_spacing integer
+---@field second_field_align string?
+---@field line_spacing number
+---@field entry_spacing number
+---@field subsequent_author_substitute string?
---@field subsequent_author_substitute_rule string
---@field layout Layout
---@field layouts_by_language table<string, Layout>
-local Bibliography = {}
-
-Bibliography = Element:derive("bibliography", {
+---@field name_inheritance Name
+local Bibliography = Element:derive("bibliography", {
hanging_indent = false,
line_spacing = 1,
entry_spacing = 1,
@@ -107,7 +108,7 @@ end
---comment
---@param id string
---@param engine CiteProc
----@return string
+---@return string?
function Bibliography:build_bibliography_str(id, engine)
local output_format = engine.output_format
@@ -229,6 +230,7 @@ function Bibliography:substitute_subsequent_authors_complete_all(engine, ir)
if engine.previous_bib_names_ir and
engine.previous_bib_names_ir.bib_names_str == bib_names_str then
+ ---@type string
local text = self.subsequent_author_substitute
if text == "" then
ir.first_name_ir.children = {}
@@ -262,6 +264,7 @@ function Bibliography:substitute_subsequent_authors_complete_each(engine, ir)
if engine.previous_bib_names_ir and
engine.previous_bib_names_ir.bib_names_str == bib_names_str then
+ ---@type string
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
@@ -292,6 +295,7 @@ function Bibliography:substitute_subsequent_authors_partial_each(engine, ir)
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
+ ---@type string
local text = self.subsequent_author_substitute
person_name_ir.inlines = {PlainText:new(text)}
else
@@ -308,6 +312,7 @@ function Bibliography:substitute_subsequent_authors_partial_each(engine, ir)
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
+ ---@type string
local text = self.subsequent_author_substitute
if text == "" then
ir.first_name_ir.children = {}
diff --git a/biblio/citation-style-language/citeproc-node-choose.lua b/biblio/citation-style-language/citeproc-node-choose.lua
index 176f4523c8..3bc48a8f05 100644
--- a/biblio/citation-style-language/citeproc-node-choose.lua
+++ b/biblio/citation-style-language/citeproc-node-choose.lua
@@ -24,7 +24,12 @@ local Element = element.Element
local SeqIr = ir_node.SeqIr
local GroupVar = ir_node.GroupVar
+local Position = util.Position
+
+
-- [Choose](https://docs.citationstyles.org/en/stable/specification.html#choose)
+---@class Choose: Element
+---@field children (If | ElseIf | Else)[]
local Choose = Element:derive("choose")
function Choose:from_node(node)
@@ -48,6 +53,7 @@ function Choose:build_ir(engine, state, context)
for _, child in ipairs(self.children) do
if child:evaluate_conditions(engine, state, context) then
active_branch = child
+ ---@cast child If
branch_ir = child:build_ir(engine, state, context)
if branch_ir and branch_ir.group_var ~= GroupVar.Missing then
table.insert(ir.children, branch_ir)
@@ -69,6 +75,7 @@ function Choose:build_ir(engine, state, context)
for _, child in ipairs(self.children) do
if child:evaluate_conditions(engine, state, context) then
if child ~= active_branch then
+ ---@cast child If
ir.disambiguate_branch_ir = child:build_ir(engine, state, context)
end
break
@@ -82,9 +89,11 @@ function Choose:build_ir(engine, state, context)
end
+---@class Condition
+---@field condition string
+---@field value string
+---@field match_type string
local Condition = {
- condition = nil,
- value = nil,
match_type = "all",
}
@@ -100,6 +109,9 @@ function Condition:new(condition, value, match_type)
end
+---@class If: Element
+---@field match string?
+---@field conditions Condition[]
local If = Element:derive("if", {
conditions = nil,
match = "all"
@@ -291,7 +303,7 @@ function If:check_position(position, context)
-- context.cite.position is for hacking in debugging
-- bugreports_DemoPageFullCiteCruftOnSubsequent.txt
if position == "first" then
- return (position_level == util.position_map["first"])
+ return (position_level == Position.First)
elseif position == "near-note" then
return context.cite["near-note"] or context.cite.near_note
else
@@ -300,9 +312,11 @@ function If:check_position(position, context)
end
+---@class ElseIf: If
local ElseIf = If:derive("else-if")
+---@class Else: Element
local Else = Element:derive("else")
function Else:from_node(node)
diff --git a/biblio/citation-style-language/citeproc-node-citation.lua b/biblio/citation-style-language/citeproc-node-citation.lua
index 4d05fe94f5..cea12afc8a 100644
--- a/biblio/citation-style-language/citeproc-node-citation.lua
+++ b/biblio/citation-style-language/citeproc-node-citation.lua
@@ -45,11 +45,28 @@ local CiteInline = output.CiteInline
local DisamStringFormat = output.DisamStringFormat
local SortStringFormat = output.SortStringFormat
+local Position = util.Position
+
local DEBUG_DISAMBIGUATE = false
---@class Citation: Element
+---@field disambiguate_add_givenname boolean?
+---@field givenname_disambiguation_rule string
+---@field disambiguate_add_names boolean?
+---@field disambiguate_add_year_suffix boolean?
+---@field cite_group_delimiter string
+---@field cite_grouping boolean?
+---@field collapse string?
+---@field year_suffix_delimiter string
+---@field after_collapse_delimiter string
+---@field near_note_distance integer
+---@field style Style
+---@field sort Sort
+---@field layout Layout
+---@field layouts_by_language { [string]: Layout }
+---@field name_inheritance Name
local Citation = Element:derive("citation", {
givenname_disambiguation_rule = "by-cite",
-- https://github.com/citation-style-language/schema/issues/338
@@ -159,6 +176,10 @@ end
---@field id string | number
---@field prefix string?
---@field suffix string?
+---@field locator string?
+---@field label string?
+---@field prefix_inlines InlineElement[]?
+---@field suffix_inlines InlineElement[]?
---comment
---@param citation_items CitationItem[]
@@ -200,15 +221,15 @@ function Citation:build_cluster(citation_items, engine, properties)
-- if layout_affixes then
-- layout_prefix = layout_affixes.prefix
-- end
- local prefix = citation_items[i].prefix
- if prefix then
+ local prefix_inlines = citation_items[i].prefix_inlines
+ if prefix_inlines then
-- Prefix is inlines
- local prefix_str = output.SortStringFormat:new():output(prefix, context)
+ local prefix_str = output.SortStringFormat:new():output(prefix_inlines, context)
if (string.match(prefix_str, "[.!?]%s*$")
-- position_IbidWithPrefixFullStop.txt
-- `Book A. He said “Please work.” Ibid.`
or string.match(prefix_str, "[.!?]”%s*$")
- ) and InlineElement.has_space(prefix) then
+ ) and InlineElement.has_space(prefix_inlines) then
ir:capitalize_first_term()
end
else
@@ -234,8 +255,8 @@ function Citation:build_cluster(citation_items, engine, properties)
local previous_ir
for i, ir in ipairs(irs) do
- local cite_prefix = citation_items[i].prefix
- local cite_suffix = citation_items[i].suffix
+ local cite_prefix = citation_items[i].prefix_inlines
+ local cite_suffix = citation_items[i].suffix_inlines
if not ir.collapse_suppressed then
local cite_inlines = ir:flatten(output_format)
if #cite_inlines > 0 then
@@ -385,6 +406,7 @@ end
---@field ir_index any
---@field is_ambiguous boolean
---@field disam_level integer
+---@field disam_str string?
---@field cite_delimiter string?
---@field cite_prefix string?
---@field cite_suffix string?
@@ -405,10 +427,18 @@ function Citation:build_fully_disambiguated_ir(cite_item, output_format, 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)
- -- if cite_item.id == "ITEM-3" then
- -- util.debug(cite_item.id)
- -- util.debug(cite_ir)
- -- end
+
+ if engine.style.class == "note" and cite_item.position_level == Position.First then
+ -- Disambiguation should be based on the subsequent form
+ -- disambiguate_BasedOnEtAlSubsequent.txt
+ cite_item.position_level = Position.Subsequent
+ local disam_ir = self:build_ambiguous_ir(cite_item, output_format, engine)
+ disam_ir = self:apply_disambiguate_add_givenname(disam_ir, engine)
+ disam_ir = self:apply_disambiguate_add_names(disam_ir, engine)
+ disam_ir = self:apply_disambiguate_conditionals(disam_ir, engine)
+ disam_ir = self:apply_disambiguate_add_year_suffix(disam_ir, engine)
+ cite_item.position_level = Position.First
+ end
return cite_ir
end
@@ -439,7 +469,7 @@ function Citation:build_ambiguous_ir(cite_item, output_format, engine)
if context.reference then
ir = self:build_ir(engine, state, context, active_layout)
else
- ir = Rendered:new({Formatted:new({PlainText:new(cite_item.id)}, {["font-weight"] = "bold"})}, self)
+ ir = Rendered:new({Formatted:new({PlainText:new(tostring(cite_item.id))}, {["font-weight"] = "bold"})}, self)
end
ir.cite_item = cite_item
@@ -488,6 +518,11 @@ function Citation:build_ambiguous_ir(cite_item, output_format, engine)
return ir
end
+---@param engine CiteProc
+---@param state State
+---@param context Context
+---@param active_layout Layout
+---@return CiteIr
function Citation:build_ir(engine, state, context, active_layout)
if not active_layout then
util.error("Missing citation layout.")
@@ -1241,7 +1276,7 @@ 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
+ if first_names_ir and engine.style.class ~= "note" then
-- util.debug(first_names_ir)
first_names_ir.collapse_suppressed = true
end
diff --git a/biblio/citation-style-language/citeproc-node-date.lua b/biblio/citation-style-language/citeproc-node-date.lua
index 1102811573..5cf624c370 100644
--- a/biblio/citation-style-language/citeproc-node-date.lua
+++ b/biblio/citation-style-language/citeproc-node-date.lua
@@ -32,6 +32,15 @@ local PlainText = output.PlainText
-- [Date](https://docs.citationstyles.org/en/stable/specification.html#date)
+---@class Date: Element
+---@field children DatePart[]?
+---@field variable string
+---@field form string?
+---@field date_parts string?
+---@field delimiter string?
+---@field prefix string?
+---@field suffix string?
+---@field text_case string?
local Date = Element:derive("date")
function Date:from_node(node)
@@ -64,6 +73,7 @@ end
function Date:build_ir(engine, state, context)
local variable
if not state.suppressed[self.variable] then
+ ---@type DateVariable?
variable = context:get_variable(self.variable)
end
@@ -294,8 +304,8 @@ function Date:render_sort_key(engine, state, context)
return false
end
if not date["date-parts"] then
- if self.literal then
- return "1" .. self.literal
+ if date.literal then
+ return "1" .. date.literal
else
return false
end
@@ -337,6 +347,11 @@ end
-- [Date-part](https://docs.citationstyles.org/en/stable/specification.html#date-part)
+---@class DatePart: Element
+---@field name string
+---@field form string?
+---@field text_case string?
+---@field range_delimiter string?
local DatePart = Element:derive("date-part")
function DatePart:from_node(node)
diff --git a/biblio/citation-style-language/citeproc-node-group.lua b/biblio/citation-style-language/citeproc-node-group.lua
index a89199128f..e70eb4101b 100644
--- a/biblio/citation-style-language/citeproc-node-group.lua
+++ b/biblio/citation-style-language/citeproc-node-group.lua
@@ -24,6 +24,11 @@ local SeqIr = ir_node.SeqIr
local Element = element.Element
+---@class Group: Element
+---@field delimiter string?
+---@field prefix string?
+---@field suffix string?
+---@field display string?
local Group = Element:derive("group")
function Group:from_node(node)
diff --git a/biblio/citation-style-language/citeproc-node-label.lua b/biblio/citation-style-language/citeproc-node-label.lua
index 5c0ee9bf98..024dc877d7 100644
--- a/biblio/citation-style-language/citeproc-node-label.lua
+++ b/biblio/citation-style-language/citeproc-node-label.lua
@@ -30,6 +30,13 @@ local PlainText = output.PlainText
-- [Label](https://docs.citationstyles.org/en/stable/specification.html#label)
+---@class Label: Element
+---@field variable string
+---@field form string?
+---@field plural string?
+---@field prefix string?
+---@field suffix string?
+---@field text_case string?
local Label = Element:derive("label")
Label.form = "long"
diff --git a/biblio/citation-style-language/citeproc-node-layout.lua b/biblio/citation-style-language/citeproc-node-layout.lua
index ec198fcb13..85ef112d25 100644
--- a/biblio/citation-style-language/citeproc-node-layout.lua
+++ b/biblio/citation-style-language/citeproc-node-layout.lua
@@ -25,6 +25,10 @@ local SeqIr = ir_node.SeqIr
---@class Layout: Element
+---@field prefix string?
+---@field suffix string?
+---@field delimiter string?
+---@field locale string?
local Layout = Element:derive("layout")
function Layout:from_node(node)
diff --git a/biblio/citation-style-language/citeproc-node-locale.lua b/biblio/citation-style-language/citeproc-node-locale.lua
index 6ab65b3ffb..540630d61e 100644
--- a/biblio/citation-style-language/citeproc-node-locale.lua
+++ b/biblio/citation-style-language/citeproc-node-locale.lua
@@ -20,6 +20,11 @@ end
local Element = element.Element
+---@class Locale: Element
+---@field xml_lang string?
+---@field terms Terms
+---@field dates table<string, Date>
+---@field style_options { limit_day_ordinals_to_day_1: boolean?, punctuation_in_quote: boolean }
local Locale = Element:derive("locale")
function Locale:new()
@@ -181,6 +186,7 @@ function Locale:get_number_gender(name)
end
+---@class Terms: Element
local Terms = Element:derive("terms")
function Terms:new()
@@ -234,6 +240,7 @@ function Terms:from_node(node)
end
+---@class Term: Element
local Term = Element:derive("term")
function Term:from_node(node)
diff --git a/biblio/citation-style-language/citeproc-node-names.lua b/biblio/citation-style-language/citeproc-node-names.lua
index 11d91b40ea..72bcbfb95e 100644
--- a/biblio/citation-style-language/citeproc-node-names.lua
+++ b/biblio/citation-style-language/citeproc-node-names.lua
@@ -38,8 +38,42 @@ local SortStringFormat = output.SortStringFormat
local Element = element.Element
+local Position = util.Position
+
+---@class Names: Element
+---@field variable string
+---@field delimiter string?
+---@field name Name
+---@field et_al EtAl
+---@field label Label
+---@field substitute Substitute
local Names = Element:derive("names")
+
+---@class Name: Element
+---@field and string?
+---@field delimiter string?
+---@field delimiter_precedes_et_al string?
+---@field delimiter_precedes_last string?
+---@field et_al_min integer?
+---@field et_al_use_first integer?
+---@field et_al_subsequent_min integer?
+---@field et_al_subsequent_use_first integer?
+---@field et_al_subsequent_use_last integer?
+---@field form string?
+---@field initialize boolean?
+---@field initialize_with string?
+---@field name_as_sort_order string?
+---@field sort_separator string?
+---@field prefix string?
+---@field suffix string?
+---@field font_style string?
+---@field font_variant string?
+---@field font_weight string?
+---@field text_decoration string?
+---@field vertical_align string?
+---@field family NamePart
+---@field given NamePart
local Name = Element:derive("name", {
delimiter = ", ",
delimiter_precedes_et_al = "contextual",
@@ -49,8 +83,18 @@ local Name = Element:derive("name", {
initialize = true,
sort_separator = ", ",
})
+
+---@class NamePart: Element
+---@field name string
+---@field text_case string?
+---@field prefix string?
+---@field suffix string?
local NamePart = Element:derive("name-part")
+
+---@class EtAl: Element
local EtAl = Element:derive("et-al")
+
+---@class Substitute: Element
local Substitute = Element:derive("substitute")
@@ -144,7 +188,7 @@ function Names:build_ir(engine, state, context)
if context.cite then
local position_level = context.cite.position or context.cite.position_level
- if position_level and position_level >= util.position_map["subsequent"] then
+ if position_level and position_level >= Position.Subsequent then
if names_inheritance.name.et_al_subsequent_min then
names_inheritance.name.et_al_min = names_inheritance.name.et_al_subsequent_min
end
@@ -158,7 +202,9 @@ function Names:build_ir(engine, state, context)
local num_names = 0
-- util.debug(self.name)
- -- The names element may not hold a variable attribute.
+ local index_by_variable = {}
+
+ -- The names element may have an empty variable attribute.
-- substitute_SubstituteOnlyOnceString.txt
if names_inheritance.variable then
for _, variable in ipairs(util.split(names_inheritance.variable)) do
@@ -168,6 +214,52 @@ function Names:build_ir(engine, state, context)
end
if name_ir and name_ir.group_var ~= GroupVar.Missing then
table.insert(irs, name_ir)
+ index_by_variable[variable] = #irs
+ end
+ end
+ end
+
+ -- editor & translator
+ local editor_ir = irs[index_by_variable.editor]
+ local translator_ir = irs[index_by_variable.translator]
+ if editor_ir and translator_ir then
+ local editor_name_ir
+ local editor_label_ir
+ local translator_name_ir
+ local translator_label_ir
+ for _, ir in ipairs(editor_ir.children) do
+ if ir._type == "NameIr" then
+ editor_name_ir = ir
+ elseif ir._element_name == "label" then
+ editor_label_ir = ir
+ end
+ end
+ for _, ir in ipairs(translator_ir.children) do
+ if ir._type == "NameIr" then
+ translator_name_ir = ir
+ elseif ir._element_name == "label" then
+ translator_label_ir = ir
+ end
+ end
+
+ if editor_name_ir.full_name_str == translator_name_ir.full_name_str then
+ local names = context:get_variable("editor")
+ local editor_translator_label_ir = names_inheritance.name:build_name_label(names_inheritance.label, "editortranslator", names, context)
+ if editor_translator_label_ir then
+ local first_index = index_by_variable.editor
+ local second_index = index_by_variable.translator
+ if first_index > second_index then
+ local tmp = first_index
+ first_index = second_index
+ second_index = tmp
+ end
+ table.remove(irs, second_index)
+ for i, ir in ipairs(irs[first_index].children) do
+ if ir._element_name == "label" then
+ irs[first_index].children[i] = editor_translator_label_ir
+ break
+ end
+ end
end
end
end
@@ -270,6 +362,7 @@ function Names:substitute_names(result, context)
for _, text in ipairs(context.build.first_rendered_names) do
text.contents = {sub_str}
end
+ -- FIXME: Resolve the undefined concat() method.
result = self:concat(context.build.first_rendered_names, context)
end
@@ -345,6 +438,18 @@ function Name:from_node(node)
end
+function Name:build_name_label(label, variable, names, context)
+ local is_plural = (label.plural == "always" or (label.plural == "contextual" and #names > 1))
+ local label_term = context.locale:get_simple_term(variable, label.form, is_plural)
+ if not label_term or label_term == "" then
+ return nil
+ end
+ local inlines = label:render_text_inlines(label_term, context)
+ local label_ir = Rendered:new(inlines, label)
+ return label_ir
+end
+
+
function Name:build_ir(variable, et_al, label, engine, state, context)
-- Returns NameIR
local names
@@ -371,7 +476,7 @@ function Name:build_ir(variable, et_al, label, engine, state, context)
label = nil
end
- local et_al_abbreviation = self.et_al_min and self.et_al_use_first and #names >= self.et_al_min
+ local et_al_abbreviation = self.et_al_min and self.et_al_use_first and #names >= self.et_al_min and #names > self.et_al_use_first
local use_last = et_al_abbreviation and self.et_al_use_last and self.et_al_use_first <= self.et_al_min - 2
if self.form == "count" then
@@ -462,11 +567,8 @@ function Name:build_ir(variable, et_al, label, engine, state, context)
irs = {ir}
if label then
- local is_plural = (label.plural == "always" or (label.plural == "contextual" and #names > 1))
- local label_term = context.locale:get_simple_term(variable, label.form, is_plural)
- if label_term and label_term ~= "" then
- local inlines = label:render_text_inlines(label_term, context)
- local label_ir = Rendered:new(inlines, label)
+ local label_ir = self:build_name_label(label, variable, names, context);
+ if label_ir then
if label.after_name then
table.insert(irs, label_ir)
else
diff --git a/biblio/citation-style-language/citeproc-node-number.lua b/biblio/citation-style-language/citeproc-node-number.lua
index a3cf140aa5..cc2bc45c7d 100644
--- a/biblio/citation-style-language/citeproc-node-number.lua
+++ b/biblio/citation-style-language/citeproc-node-number.lua
@@ -25,6 +25,13 @@ local Rendered = ir_node.Rendered
local GroupVar = ir_node.GroupVar
+---@class Number: Element
+---@field variable string
+---@field form string?
+---@field prefix string?
+---@field suffix string?
+---@field display string?
+---@field text_case string?
local Number = Element:derive("number")
function Number:new(node)
diff --git a/biblio/citation-style-language/citeproc-node-sort.lua b/biblio/citation-style-language/citeproc-node-sort.lua
index 04fe46c045..13a97adeb7 100644
--- a/biblio/citation-style-language/citeproc-node-sort.lua
+++ b/biblio/citation-style-language/citeproc-node-sort.lua
@@ -39,6 +39,9 @@ local InlineElement = output.InlineElement
-- [Sorting](https://docs.citationstyles.org/en/stable/specification.html#sorting)
+---@class Sort: Element
+---@field children Key[]
+---@field sort_directions boolean[]
local Sort = Element:derive("sort")
function Sort:from_node(node)
@@ -151,6 +154,14 @@ function Sort.compare_entry(key_map, sort_directions, item1, item2)
end
end
+
+---@class Key: Element
+---@field sort string?
+---@field variable string?
+---@field macro string?
+---@field names_min number?
+---@field names_use_first number?
+---@field names_use_last number?
local Key = Element:derive("key")
function Key:new()
diff --git a/biblio/citation-style-language/citeproc-node-style.lua b/biblio/citation-style-language/citeproc-node-style.lua
index 9bf37b7b91..8f194dbe59 100644
--- a/biblio/citation-style-language/citeproc-node-style.lua
+++ b/biblio/citation-style-language/citeproc-node-style.lua
@@ -37,6 +37,20 @@ local PlainText = output.PlainText
local DisamStringFormat = output.DisamStringFormat
+---@class Style: Element
+---@field class string
+---@field default_locale string?
+---@field version string?
+---@field initialize_with_hyphen boolean
+---@field page_range_format string?
+---@field demote_non_dropping_particle boolean?
+---@field info Element
+---@field locales { [string]: Locale }
+---@field macros { [string]: Element }
+---@field citation Citation
+---@field intext Citation?
+---@field bibliography Bibliography?
+---@field has_disambiguate boolean
local Style = Element:derive("style")
function Style:new()
@@ -72,6 +86,8 @@ function Style:parse(xml_str)
return Style:from_node(style_node)
end
+---@param node any
+---@return Style
function Style:from_node(node)
local o = Style:new()
@@ -137,66 +153,63 @@ Style._default_options = {
["demote-non-dropping-particle"] = "display-and-sort",
}
-function Style:set_lang(lang, force_lang)
- local default_locale = self:get_attribute("default-locale")
- if lang then
- if default_locale and not force_lang then
- self.lang = default_locale
- end
- else
- self.lang = default_locale or "en-US"
- end
-end
-
+---@class Info: Element
+---@field author table?
+---@field contributors table[]
+---@field citation_format string?
+---@field fields string[]
+---@field id string?
+---@field issn string?
+---@field eissn string?
+---@field issnl string?
+---@field links string[]
+---@field link_rel table<string, string>
+---@field independent_parent string?
+---@field published string?
+---@field rghts string?
+---@field summary string?
+---@field title string?
+---@field title_short string?
+---@field updated string?
local Info = Element:derive("info")
function Info:from_node(node)
+ ---@type Info
local o = Info:new()
- -- o.authors = nil
- -- o.contributors = nil
- o.categories = {}
- o.id = nil
- -- o.issn = nil
- -- o.eissn = nil
- -- o.issnl = nil
- o.links = {
- independent_parent = nil,
- }
- -- o.published = nil
- -- o.rights = nil
- -- o.summary = nil
- o.title = nil
- -- o.title_short = nil
- o.updated = nil
+ o.contributors = {}
+ o.fields = {}
+ o.links = {}
+ o.link_rel = {}
for _, child in ipairs(node:get_children()) do
if child:is_element() then
local element_name = child:get_element_name()
- if element_name == "category" then
+
+ if element_name == "author" or element_name == "contributor" then
+ -- TODO
+ elseif element_name == "category" then
local citation_format = child:get_attribute("citation-format")
+ local field = child:get_attribute("field")
if citation_format then
- o.categories.citation_format = citation_format
+ o.citation_format = citation_format
+ elseif field then
+ table.insert(o.fields, field)
end
-
- elseif element_name == "id" then
- o.id = child:get_text()
-
elseif element_name == "link" then
local href = child:get_attribute("href")
local rel = child:get_attribute("rel")
- if href and rel == "independent-parent" then
- o.links.independent_parent = href
+ if href and rel then
+ table.insert(o.links, href)
+ o.link_rel[href] = rel
+ if rel == "independent-parent" then
+ o.independent_parent = href
+ end
end
-
- elseif element_name == "title" then
- o.title = child:get_text()
-
- elseif element_name == "updated" then
- o.updated = child:get_text()
-
+ else
+ o[element_name] = child:get_text()
end
end
end
diff --git a/biblio/citation-style-language/citeproc-node-text.lua b/biblio/citation-style-language/citeproc-node-text.lua
index 13fda088ff..147074e68a 100644
--- a/biblio/citation-style-language/citeproc-node-text.lua
+++ b/biblio/citation-style-language/citeproc-node-text.lua
@@ -33,6 +33,19 @@ local Linked = output.Linked
-- [Text](https://docs.citationstyles.org/en/stable/specification.html#text)
+---@class Text: Element
+---@field variable string?
+---@field form string?
+---@field macro string?
+---@field term string?
+---@field plural string?
+---@field value string?
+---@field prefix string?
+---@field suffix string?
+---@field display string?
+---@field quotes boolean?
+---@field strip_periods string?
+---@field text_case string?
local Text = Element:derive("text", {
-- Default attributes
variable = nil,
@@ -44,7 +57,6 @@ local Text = Element:derive("text", {
-- Style behavior
formatting = nil,
affixes = nil,
- delimiter = nil,
display = nil,
quotes = false,
strip_periods = false,
@@ -84,6 +96,7 @@ function Text:build_ir(engine, state, context)
end
function Text:build_variable_ir(engine, state, context)
+ ---@type string
local variable = self.variable
local text
diff --git a/biblio/citation-style-language/citeproc-output.lua b/biblio/citation-style-language/citeproc-output.lua
index 7115fe2acd..f596a39e3a 100644
--- a/biblio/citation-style-language/citeproc-output.lua
+++ b/biblio/citation-style-language/citeproc-output.lua
@@ -6,6 +6,7 @@
local output_module = {}
+local lpeg = require("lpeg")
local uni_utf8
local unicode
local dom
@@ -29,6 +30,7 @@ end
local GroupVar = ir_node.GroupVar
+---@class LocalizedQuotes
local LocalizedQuotes = {
outer_open = util.unicode['left double quotation mark'],
outer_close = util.unicode['right double quotation mark'],
@@ -54,6 +56,10 @@ end
-- https://github.com/zotero/citeproc-rs/blob/master/crates/io/src/output/markup.rs#L67
-- https://hackage.haskell.org/package/pandoc-types-1.22.2.1/docs/Text-Pandoc-Definition.html
---@class InlineElement
+---@field _type string
+---@field _base_class string
+---@field value string?
+---@field inlines InlineElement[]?
local InlineElement = {
_type = "InlineElement",
_base_class = "InlineElement",
@@ -106,9 +112,11 @@ function InlineElement:_debug()
end
----@class PlainText
+---@class PlainText: InlineElement
local PlainText = InlineElement:derive("PlainText")
+---@param value string
+---@return PlainText
function PlainText:new(value)
local o = InlineElement.new(self)
o.value = value
@@ -117,9 +125,13 @@ function PlainText:new(value)
end
----@class Formatted
+---@class Formatted: InlineElement
+---@field formatting table?
local Formatted = InlineElement:derive("Formatted")
+---@param inlines InlineElement[]
+---@param formatting table?
+---@return Formatted
function Formatted:new(inlines, formatting)
local o = InlineElement.new(self)
o.inlines = inlines
@@ -129,11 +141,13 @@ function Formatted:new(inlines, formatting)
end
----@class Micro
+---@class Micro: InlineElement
local Micro = InlineElement:derive("Micro")
-- This is how we can flip-flop only user-supplied styling.
-- Inside this is parsed micro html
+---@param inlines InlineElement[]
+---@return Micro
function Micro:new(inlines)
local o = InlineElement.new(self)
o.inlines = inlines
@@ -142,9 +156,14 @@ function Micro:new(inlines)
end
----@class Quoted
+---@class Quoted: InlineElement
+---@field is_inner boolean
+---@field quotes table
local Quoted = InlineElement:derive("Quoted")
+---@param inlines InlineElement[]
+---@param localized_quotes table?
+---@return Quoted
function Quoted:new(inlines, localized_quotes)
local o = InlineElement.new(self)
o.inlines = inlines
@@ -160,9 +179,11 @@ function Quoted:new(inlines, localized_quotes)
end
----@class Code
+---@class Code: InlineElement
local Code = InlineElement:derive("Code")
+---@param value string
+---@return Code
function Code:new(value)
local o = InlineElement.new(self)
o.value = value
@@ -171,9 +192,11 @@ function Code:new(value)
end
----@class MathML
+---@class MathML: InlineElement
local MathML = InlineElement:derive("MathML")
+---@param value string
+---@return MathML
function MathML:new(value)
local o = InlineElement.new(self)
o.value = value
@@ -182,9 +205,11 @@ function MathML:new(value)
end
----@class MathTeX
+---@class MathTeX: InlineElement
local MathTeX = InlineElement:derive("MathTeX")
+---@param value string
+---@return MathTeX
function MathTeX:new(value)
local o = InlineElement.new(self)
o.value = value
@@ -193,9 +218,11 @@ function MathTeX:new(value)
end
----@class NoCase
+---@class NoCase: InlineElement
local NoCase = InlineElement:derive("NoCase")
+---@param inlines InlineElement[]
+---@return NoCase
function NoCase:new(inlines)
local o = InlineElement.new(self)
o.inlines = inlines
@@ -204,9 +231,11 @@ function NoCase:new(inlines)
end
----@class NoDecor
+---@class NoDecor: InlineElement
local NoDecor = InlineElement:derive("NoDecor")
+---@param inlines InlineElement[]
+---@return NoDecor
function NoDecor:new(inlines)
local o = InlineElement.new(self)
o.inlines = inlines
@@ -215,9 +244,13 @@ function NoDecor:new(inlines)
end
----@class Linked
+---@class Linked: InlineElement
+---@field href string
local Linked = InlineElement:derive("Linked")
+---@param value string
+---@param href string
+---@return Linked
function Linked:new(value, href)
local o = InlineElement.new(self)
o.value = value
@@ -227,9 +260,13 @@ function Linked:new(value, href)
end
----@class Div
+---@class Div: InlineElement
+---@field div table?
local Div = InlineElement:derive("Div")
+---@param inlines InlineElement[]
+---@param display table?
+---@return Div
function Div:new(inlines, display)
local o = InlineElement.new(self)
o.inlines = inlines
@@ -239,9 +276,13 @@ function Div:new(inlines, display)
end
----@class CiteInline
+---@class CiteInline: InlineElement
+---@field cite_item CitationItem
local CiteInline = InlineElement:derive("CiteInline")
+---@param inlines InlineElement[]
+---@param cite_item CitationItem
+---@return CiteInline
function CiteInline:new(inlines, cite_item)
local o = InlineElement.new(self)
o.inlines = inlines
@@ -251,6 +292,10 @@ function CiteInline:new(inlines, cite_item)
end
+---@param text string
+---@param context Context?
+---@param is_external boolean?
+---@return InlineElement[]
function InlineElement:parse(text, context, is_external)
local text_type = type(text)
local inlines
@@ -270,6 +315,8 @@ function InlineElement:parse(text, context, is_external)
return inlines
end
+---@param text string | (string | table)[]
+---@return InlineElement[]
function InlineElement:parse_csl_rich_text(text)
-- Example: [
-- "A title with a",
@@ -337,74 +384,108 @@ function InlineElement:parse_csl_rich_text(text)
return inlines
end
--- TODO: Rewrite with lpeg
-function InlineElement:parse_html_tags(str, context, is_external)
- -- 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
- if ok then
- local div = html:get_path("div")[1]
- local el = InlineElement:from_node(div)
- inlines = el.inlines
- else
- local el = PlainText:new(str)
- inlines = {el}
+local function tokens2inlines(tokens)
+ local inlines = {}
+ local i = 1
+ while i <= #tokens do
+ local token = tokens[i]
+ if type(token) == "string" then
+ local text = token
+ local j = i + 1
+ while j <= #tokens and type(tokens[j]) == "string" do
+ text = text .. tokens[j]
+ j = j + 1
+ end
+ i = j
+ table.insert(inlines, PlainText:new(text))
+ else
+ table.insert(inlines, token)
+ i = i + 1
+ end
end
-
- inlines = InlineElement:parse_quotes(inlines, context, is_external)
return inlines
end
-function InlineElement:from_node(node)
- local tag_name = node:get_element_name()
- local inlines = {}
+local function get_inline_element_grammar()
+ local P = lpeg.P
+ local C = lpeg.C
+ local Ct = lpeg.Ct
+ local S = lpeg.S
+ local V = lpeg.V
+ local spaces = P(" ")^1
+ local grammar = P{
+ "content";
+ token = V"italic" + V"bold" + V"sup" + V"sub" + V"sc" + V"small_caps" + V"span_nocase" + V"nodecor" + V"mathtex" + V"mathml" + V"code" + V"script" + C(1),
+ content = Ct((V"token")^0) / tokens2inlines,
+ italic = P"<i>" * Ct((V"token" - P"</i>")^0) * P"</i>" / function (tokens)
+ return Formatted:new(tokens2inlines(tokens), {["font-style"] = "italic"})
+ end,
+ bold = P"<b>" * Ct((V"token" - P"</b>")^0) * P"</b>" / function (tokens)
+ return Formatted:new(tokens2inlines(tokens), {["font-weight"] = "bold"})
+ end,
+ sup = P"<sup>" * Ct((V"token" - P"</sup>")^0) * P"</sup>" / function (tokens)
+ return Formatted:new(tokens2inlines(tokens), {["vertical-align"] = "sup"})
+ end,
+ sub = P"<sub>" * Ct((V"token" - P"</sub>")^0) * P"</sub>" / function (tokens)
+ return Formatted:new(tokens2inlines(tokens), {["vertical-align"] = "sub"})
+ end,
+ sc = P"<sc>" * Ct((V"token" - P"</sc>")^0) * P"</sc>" / function (tokens)
+ return Formatted:new(tokens2inlines(tokens), {["font-variant"] = "small-caps"})
+ end,
+ quoted = (
+ C(P'"') * Ct((V"token" - P'"')^0) * C(P'"')
+ + C(P"'") * Ct((V"token" - P"'")^0) * C(P"'")
+ + C(P'“') * Ct((V"token" - P'”')^0) * C(P'”')
+ + C(P"‘") * Ct((V"token" - P"’")^0) * C(P"’")
+ + C(P"«") * Ct((V"token" - P"»")^0) * C(P"»")
+ ) / function (open, tokens, close)
+ return Quoted:new(tokens2inlines(tokens), LocalizedQuotes:new(open, close))
+ end,
+ small_caps = P"<span" * spaces * P'style="font-variant:' * spaces^0 * P'small-caps;">' * Ct((V"token" - P"</span>")^0) * P"</span>" / function (tokens)
+ return Formatted:new(tokens2inlines(tokens), {["font-variant"] = "small-caps"})
+ end,
+ -- nocase = P"<nocase>" * Ct((V"token" - P"</nocase>")^0) * P"</nocase>" / function (tokens)
+ -- return NoCase:new(tokens2inlines(tokens))
+ -- end,
+ span_nocase = P"<span" * spaces * P'class="nocase">' * Ct((V"token" - P"</span>")^0) * P"</span>" / function (tokens)
+ return NoCase:new(tokens2inlines(tokens))
+ end,
+ nodecor = P"<span" * spaces * P'class="nodecor">' * Ct((V"token" - P"</span>")^0) * P"</span>" / function (tokens)
+ return NoDecor:new(tokens2inlines(tokens))
+ end,
+ mathtex = P"<mathtex>" * Ct((1- P"</mathtex>")^0) * P"</mathtex>" / function (text)
+ return MathML:new(text)
+ end,
+ mathml = P"<math>" * C((1- P"</math>")^0) * P"</math>" / function (text)
+ return MathML:new(text)
+ end,
+ code = P"<code>" * C((1 - P"</code>")^0) * P"</code>" / function (text)
+ return Code:new(text)
+ end,
+ script = P"<script>" * C((1- P"</script>")^0) * P"</script>" / function (text)
+ return Code:new(text)
+ end,
+ }
+ return grammar
+end
- for _, child in ipairs(node:get_children()) do
- local inline
- if child:is_text() then
- local text = child:get_text()
- if tag_name == "code" or tag_name == "script" then
- inline = Code:new(text)
- elseif tag_name == "math" then
- inline = MathTeX:new(text)
- else
- inline = PlainText:new(text)
- end
- elseif child:is_element() then
- inline = InlineElement:from_node(child)
- end
- table.insert(inlines, inline)
- end
-
- if tag_name == "i" then
- return Formatted:new(inlines, {["font-style"] = "italic"})
- elseif tag_name == "b" then
- return Formatted:new(inlines, {["font-weight"] = "bold"})
- elseif tag_name == "sup" then
- return Formatted:new(inlines, {["vertical-align"] = "sup"})
- elseif tag_name == "sub" then
- return Formatted:new(inlines, {["vertical-align"] = "sub"})
- elseif tag_name == "sc" then
- return Formatted:new(inlines, {["font-variant"] = "small-caps"})
- elseif tag_name == "span" then
- local style = node:get_attribute("style")
- local class = node:get_attribute("class")
- if style == "font-variant:small-caps;" or style == "font-variant: small-caps;" then
- return Formatted:new(inlines, {["font-variant"] = "small-caps"})
- elseif class == "nocase" then
- return NoCase:new(inlines)
- elseif class == "nodecor" then
- return NoDecor:new(inlines)
- end
- end
+local inline_element_grammar = get_inline_element_grammar()
- return InlineElement:new(inlines)
+---@param str string
+---@param context Context?
+---@param is_external boolean?
+---@return InlineElement[]
+function InlineElement:parse_html_tags(str, context, is_external)
+ local inlines = inline_element_grammar:match(str)
+ inlines = InlineElement:parse_quotes(inlines, context, is_external)
+ return inlines
end
+-- TODO: Rewrite with lpeg
+---@param inlines InlineElement[]
+---@param context Context
+---@param is_external boolean?
+---@return table
function InlineElement:parse_quotes(inlines, context, is_external)
local quote_fragments = InlineElement:get_quote_fragments(inlines)
-- util.debug(quote_fragments)
@@ -653,11 +734,17 @@ OutputFormat
└── PlainTextWriter
--]]
-local OutputFormat = {}
+---@class OutputFormat
+---@field name string
+---@field markups table<string, string>
+local OutputFormat = {
+
+}
function OutputFormat:new(format_name)
local o = {
name = format_name,
+ -- markups = {},
}
setmetatable(o, self)
self.__index = self
@@ -998,12 +1085,15 @@ local function title_case_word(word, is_first, after_end_punct, is_last, ignore_
-- TODO: two-word cases like "due to"
-- util.debug(word)
-- util.debug(ignore_stop_word)
+ local res
if (is_first or is_last or after_end_punct or ignore_stop_word or not util.stop_words[word])
and string.match(word, "%a") and unicode.islower(word) then
- return unicode.capitalize(word)
+ res = unicode.capitalize(word)
else
- return word
+ res = word
end
+ -- util.debug(res)
+ return res
end
local function transform_lowercase_if_capitalize(word, is_first, after_end_punct, is_last, is_stop_word)
@@ -1061,10 +1151,10 @@ function OutputFormat:affixed_quoted(inlines, affixes, localized_quotes)
if localized_quotes then
inlines = self:quoted(inlines, localized_quotes)
end
- if affixes and affixes.prefix then
+ if affixes and affixes.prefix and affixes.prefix ~= "" then
table.insert(inlines, 1, PlainText:new(affixes.prefix))
end
- if affixes and affixes.suffix then
+ if affixes and affixes.suffix and affixes.suffix ~= "" then
table.insert(inlines, PlainText:new(affixes.suffix))
end
return inlines
@@ -1082,6 +1172,8 @@ function OutputFormat:with_display(nodes, display)
end
end
+---@param inlines InlineElement[]
+---@param context Context
function OutputFormat:output(inlines, context)
self:flip_flop_inlines(inlines)
@@ -1092,6 +1184,9 @@ function OutputFormat:output(inlines, context)
return self:write_inlines(inlines, context)
end
+---@param inlines InlineElement[]
+---@param context Context
+---@return string?
function OutputFormat:output_bibliography_entry(inlines, context)
self:flip_flop_inlines(inlines)
-- util.debug(inlines)
@@ -1110,7 +1205,9 @@ function OutputFormat:output_bibliography_entry(inlines, context)
return res
end
+---@param inlines InlineElement[]
function OutputFormat:flip_flop_inlines(inlines)
+ ---@class FlipFlopState
local flip_flop_state = {
["font-style"] = "normal",
["font-variant"] = "normal",
@@ -1122,6 +1219,8 @@ function OutputFormat:flip_flop_inlines(inlines)
self:flip_flop(inlines, flip_flop_state)
end
+---@param inlines InlineElement[]
+---@param state FlipFlopState
function OutputFormat:flip_flop(inlines, state)
for i, inline in ipairs(inlines) do
if inline._type == "Micro" then
@@ -1182,6 +1281,8 @@ function OutputFormat:flip_flop(inlines, state)
end
end
+---@param inlines InlineElement[]
+---@param state FlipFlopState
function OutputFormat:flip_flop_micro_inlines(inlines, state)
for i, inline in ipairs(inlines) do
if inline._type == "Micro" then
@@ -1243,6 +1344,8 @@ function OutputFormat:flip_flop_micro_inlines(inlines, state)
end
end
+---@param inline InlineElement
+---@return InlineElement?
local function find_left(inline)
if inline._type == "PlainText" then
return inline
@@ -1279,9 +1382,11 @@ local function find_right_in_quoted(inline)
end
end
--- "'Foo,' bar" => ,
+--- "'Foo,' bar" => ,
+---@param inline InlineElement
local function find_right_quoted(inline)
if inline._type == "Quoted" and #inline.inlines > 0 then
+ ---@cast inline Quoted
return find_right_in_quoted(inline.inlines[#inline.inlines]), inline.quotes.punctuation_in_quote
-- elseif inline._type == "Micro" then
-- return nil
@@ -1432,6 +1537,7 @@ local function move_out_quotes(first, second)
return success
end
+---@param inlines InlineElement[]
local function move_around_quote(inlines)
local idx = 1
@@ -1456,7 +1562,9 @@ local function move_around_quote(inlines)
end
end
-function OutputFormat:move_punctuation(inlines, piq)
+---@param inlines InlineElement[]
+---@param punctuation_in_quote boolean?
+function OutputFormat:move_punctuation(inlines, punctuation_in_quote)
-- Merge punctuations
normalise_text_elements(inlines)
@@ -1492,6 +1600,7 @@ function OutputFormat:write_escaped(str, context)
end
+---@class Markup: OutputFormat
local Markup = OutputFormat:new()
function Markup:write_inline(inline, context)
@@ -1552,6 +1661,9 @@ function Markup:write_formatted(inline, context)
return self:write_inlines(inline.inlines, context)
end
+---@param inline Quoted
+---@param context Context
+---@return string
function Markup:write_quoted(inline, context)
local res = self:write_inlines(inline.inlines, context)
local quotes = inline.quotes
@@ -1574,6 +1686,18 @@ function Markup:write_cite(inline, context)
return self:write_inlines(inline.inlines, context)
end
+function Markup:write_code(inline, context)
+ return inline.value
+end
+
+function Markup:write_mathml(inline, context)
+ return inline.value
+end
+
+function Markup:write_math_tex(inline, context)
+ return inline.value
+end
+
function Markup:write_nocase(inline, context)
return self:write_inlines(inline.inlines, context)
end
@@ -1787,7 +1911,9 @@ function HtmlWriter:write_display(inline, context)
res = string.gsub(res, "%s+$", "")
end
local format_str = self.markups[key]
- res = string.format(format_str, res)
+ if format_str then
+ res = string.format(format_str, res)
+ end
return res
end
@@ -1929,7 +2055,7 @@ function PseudoHtml:write_mathml(inline, context)
end
function PseudoHtml:write_math_tex(inline, context)
- return string.format("<math>%s</math>", inline.value)
+ return string.format("<mathtex>%s</mathtex>", inline.value)
end
function PseudoHtml:write_nocase(inline, context)
diff --git a/biblio/citation-style-language/citeproc-unicode.lua b/biblio/citation-style-language/citeproc-unicode.lua
index 2aa12b29bf..26cdbc8110 100644
--- a/biblio/citation-style-language/citeproc-unicode.lua
+++ b/biblio/citation-style-language/citeproc-unicode.lua
@@ -266,6 +266,7 @@ function unicode.split_word_bounds(str)
-- util.debug(str)
local segments = {}
if uni_algos_words then
+ -- util.debug("uni_algos_words")
for _, _, segment in uni_algos_words.word_boundaries(str) do
table.insert(segments, segment)
end
@@ -283,9 +284,9 @@ function unicode.split_word_bounds(str)
end
end
end
- -- util.debug(segments)
else
+ -- util.debug("no uni_algos_words")
-- A naive implementation
local state = CharState.Other
local segment = ""
@@ -312,9 +313,9 @@ function unicode.split_word_bounds(str)
end
table.insert(segments, segment)
- -- util.debug(segments)
end
+ -- util.debug(segments)
return segments
end
diff --git a/biblio/citation-style-language/citeproc-util.lua b/biblio/citation-style-language/citeproc-util.lua
index 77cd82a801..56f9ae5fb1 100644
--- a/biblio/citation-style-language/citeproc-util.lua
+++ b/biblio/citation-style-language/citeproc-util.lua
@@ -751,6 +751,31 @@ util.stop_words = {
["yet"] = true,
}
+-- <https://github.com/Juris-M/citeproc-js/blob/73bc1b44bc7d54d0bfec4e070fd27f5efe024ff9/src/load.js#L1052C2-L1052C2>
+local citeproc_js_addition_stop_words = {
+ ["about"] = true,
+ ["above"] = true,
+ ["al"] = true,
+ ["as for"] = true,
+ ["as of"] = true,
+ ["as per"] = true,
+ ["aside from"] = true,
+ ["except for"] = true,
+ ["inside of"] = true,
+ ["near to"] = true,
+ ["next to"] = true,
+ ["on to"] = true,
+ ["out from"] = true,
+ ["out of"] = true,
+ ["up to"] = true,
+ ["v"] = true,
+ ["vs"] = true,
+}
+
+for word, _ in pairs(citeproc_js_addition_stop_words) do
+ util.stop_words[word] = true
+end
+
function util.all (t)
for _, item in ipairs(t) do
if not item then
@@ -960,11 +985,20 @@ util.roman_numerals = {
-- Choose
+---@enum Postion
+local Position = {
+ First = 0,
+ Subsequent = 1,
+ Ibid = 2,
+ IbidWithLocator = 3,
+}
+util.Position = Position
+
util.position_map = {
- ["first"] = 0,
- ["subsequent"] = 1,
- ["ibid"] = 2,
- ["ibid-with-locator"] = 3,
+ ["first"] = Position.First,
+ ["subsequent"] = Position.Subsequent,
+ ["ibid"] = Position.Ibid,
+ ["ibid-with-locator"] = Position.IbidWithLocator,
["container-subsequent"] = 4,
}
@@ -1092,13 +1126,15 @@ end
---@param path string
---@return string?
-function util.read_file(path)
+function util.read_file(path, allowe_missing)
if type(path) ~= "string" then
error("Invalid path.")
end
local file = io.open(path, "r")
if not file then
- util.error(string.format('Cannot open file "%s".', path))
+ if not allowe_missing then
+ util.error(string.format('Cannot open file "%s".', path))
+ end
return nil
end
local content = file:read("*a")
@@ -1121,17 +1157,46 @@ function util.write_file(text, path)
end
-function util.parse_iso_date(str)
- local date
- local date_parts = util.split(str, "/")
- if #date_parts <= 2 then
- date = {["date-parts"] = {}}
- for _, date_part in ipairs(date_parts) do
- table.insert(date["date-parts"], util.split(date_part, "%-"))
+function util.parse_edtf(str)
+ local date = {["date-parts"] = {}}
+ local range_parts = util.split(str, "/")
+ for i, range_part in ipairs(range_parts) do
+ if i > 2 then
+ break
+ end
+ date["date-parts"][i] = {}
+ local negative_year = false
+ if string.match(range_part, "^Y%-") then
+ negative_year = true
+ end
+ range_part = string.gsub(range_part, "^Y[+-]?", "")
+ if string.match(range_part, "[?~%%]$") then
+ date.circa = true
+ range_part = string.gsub(range_part, "[?~%%]$", "")
+ end
+ range_part = string.gsub(range_part, "T.*$", "")
+ for j, date_part in ipairs(util.split(range_part, "%-")) do
+ if j > 3 then
+ break
+ end
+ if string.match(date_part, "X") then
+ date.circa = true
+ date_part = string.gsub(date_part, "X", "0")
+ end
+ if string.match(date_part, "^%d+$") then
+ date_part = tonumber(date_part)
+ if date_part > 0 then
+ date["date-parts"][i][j] = date_part
+ else
+ break
+ end
+ else
+ return nil
+ end
+ end
+ if negative_year then
+ date["date-parts"][i][1] = - date["date-parts"][i][1]
end
- end
- if not date then
- date = {literal = str}
end
return date
end
diff --git a/biblio/citation-style-language/citeproc-yaml.lua b/biblio/citation-style-language/citeproc-yaml.lua
new file mode 100644
index 0000000000..cdf70efb94
--- /dev/null
+++ b/biblio/citation-style-language/citeproc-yaml.lua
@@ -0,0 +1,95 @@
+--
+-- Copyright (c) 2021-2022 Zeping Lee
+-- Released under the MIT license.
+-- Repository: https://github.com/zepinglee/citeproc-lua
+--
+
+local csl_yaml = {}
+
+local yaml
+local util
+
+if kpse then
+ yaml = require("tinyyaml")
+ util = require("citeproc-util")
+else
+ yaml = require("tinyyaml")
+ util = require("citeproc.util")
+end
+
+
+-- Convert CSL-YAML string to CSL-JSON
+
+---@param str string
+---@return CslData
+function csl_yaml.parse(str)
+ -- lua-tinyyaml 0.4.2 doesn't support dots terminator.
+ -- See <https://github.com/api7/lua-tinyyaml/issues/22>.
+ str = string.gsub(str, "%.%.%.%s*$", "")
+
+ local status, items = pcall(yaml.parse, str)
+ if not status then
+ local err = items
+ util.error("Failed to parse the YAML contents:\n" .. err)
+ return {}
+ end
+
+ -- The items exported from Better BibTeX has a {references = []} structure.
+ if type(items) == 'table' and items.references then
+ items = items.references
+ end
+
+ for _, item in ipairs(items) do
+ for field, value in pairs(item) do
+ if util.variable_types[field] == "date" then
+ if type(value) == "number" then
+ value = tostring(value)
+ end
+ if type(value) == "string" then
+ -- "2005-11-22"
+ -- EDTF is not supported until CSL v1.1.
+ local date = util.parse_edtf(value)
+ if not date then
+ date = {literal = value}
+ end
+ item[field] = date
+
+ elseif type(value) == "table" and not value["date-parts"] then
+ local new_date = {
+ ["date-parts"] = {}
+ }
+
+ if value.year then
+ -- Generated by lua-tinyyaml parser
+ new_date["date-parts"][1] = {}
+ for j, part_name in ipairs({"year", "month", "day"}) do
+ local date_part = value[part_name]
+ if date_part then
+ new_date["date-parts"][1][j] = date_part
+ end
+ end
+
+ elseif #value >= 1 then
+ -- Exported by Better BibTeX
+ for i, range_part in ipairs(value) do
+ new_date["date-parts"][i] = {}
+ for _, part_name in ipairs({"year", "month", "day"}) do
+ local date_part = range_part[part_name]
+ if date_part then
+ table.insert(new_date["date-parts"][i], date_part)
+ end
+ end
+ end
+ end
+
+ item[field] = new_date
+ end
+ end
+ end
+ end
+
+ return items
+end
+
+
+return csl_yaml
diff --git a/biblio/citation-style-language/citeproc.lua b/biblio/citation-style-language/citeproc.lua
index 3755a1de49..51b9bfe9c7 100644
--- a/biblio/citation-style-language/citeproc.lua
+++ b/biblio/citation-style-language/citeproc.lua
@@ -16,7 +16,7 @@ else
util = require("citeproc.util")
end
-citeproc.__VERSION__ = "0.4.2"
+citeproc.__VERSION__ = "0.4.3"
citeproc.new = engine.CiteProc.new
citeproc.util = util
diff --git a/biblio/citation-style-language/csl-locales-ca-AD.xml b/biblio/citation-style-language/csl-locales-ca-AD.xml
index ca5d908ece..6b1bd71386 100644
--- a/biblio/citation-style-language/csl-locales-ca-AD.xml
+++ b/biblio/citation-style-language/csl-locales-ca-AD.xml
@@ -8,7 +8,7 @@
<name>javimat</name>
</translator>
<rights license="http://creativecommons.org/licenses/by-sa/3.0/">This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 License</rights>
- <updated>2022-10-12T15:53:27-04:00</updated>
+ <updated>2023-07-31T10:30:14-04:00</updated>
</info>
<style-options punctuation-in-quote="false"/>
<date form="text">
@@ -541,7 +541,7 @@
<term name="editor" form="verb">editat per</term>
<term name="editorial-director" form="verb">editat per</term>
<term name="illustrator" form="verb">il·lustrat per</term>
- <term name="interviewer" form="verb">entrevistat per</term>
+ <term name="interviewer" form="verb">entrevista feta per</term>
<term name="recipient" form="verb">a</term>
<term name="reviewed-author" form="verb">per</term>
<term name="translator" form="verb">traduït per</term>
diff --git a/biblio/citation-style-language/modern-language-association.csl b/biblio/citation-style-language/modern-language-association.csl
index fcb9845c4c..8fe62060ec 100644
--- a/biblio/citation-style-language/modern-language-association.csl
+++ b/biblio/citation-style-language/modern-language-association.csl
@@ -9,10 +9,13 @@
<author>
<name>Sebastian Karcher</name>
</author>
+ <contributor>
+ <name>Patrick O'Brien</name>
+ </contributor>
<category citation-format="author"/>
<category field="generic-base"/>
<summary>This style adheres to the MLA 9th edition handbook. Follows the structure of references as outlined in the MLA Manual closely</summary>
- <updated>2022-04-24T09:59:40-04:00</updated>
+ <updated>2023-07-24T10:57:53+02:00</updated>
<rights license="http://creativecommons.org/licenses/by-sa/3.0/">This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 License</rights>
</info>
<locale xml:lang="en">
@@ -195,9 +198,18 @@
</macro>
<macro name="publisher">
<choose>
- <if type="article-magazine article-newspaper article-journal" match="none">
- <text variable="publisher"/>
+ <if type="thesis" match="any">
+ <group delimiter=". ">
+ <date variable="issued" form="numeric" date-parts="year"/>
+ <group delimiter=", ">
+ <text variable="publisher"/>
+ <text variable="genre"/>
+ </group>
+ </group>
</if>
+ <else-if type="article-magazine article-newspaper article-journal" match="none">
+ <text variable="publisher"/>
+ </else-if>
</choose>
</macro>
<macro name="publication-date">
@@ -208,7 +220,7 @@
<else-if type="article-journal" match="any">
<date variable="issued" form="text" date-parts="year-month"/>
</else-if>
- <else-if type="speech" match="none">
+ <else-if type="speech thesis" match="none">
<date variable="issued" form="text"/>
</else-if>
</choose>
diff --git a/biblio/ctan-bibdata/ctan.bib b/biblio/ctan-bibdata/ctan.bib
index b28d330b28..67fbe295be 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 07-09-2023, 02:00:13
+%% created at 08-09-2023, 02:01:08
%%
%% This file is provided under the terms of the LPPL v1.3 or
@@ -12618,8 +12618,8 @@
title = {The \texttt{citation-style-language} package},
subtitle = {Bibliography formatting with Citation Style Language},
author = {Zeping Lee},
- date = {2023-07-04},
- version = {0.4.2},
+ date = {2023-09-07},
+ version = {0.4.3},
license = {mit,cc-by-sa-3},
mirror = {https://mirror.ctan.org/biblio/citation-style-language},
url = {https://ctan.org/pkg/citation-style-language},
@@ -36829,7 +36829,7 @@
title = {The \texttt{l3build} package},
subtitle = {A testing and building system for (La)TeX},
author = {{The \LaTeX{} Project Team}},
- date = {2023-09-05},
+ date = {2023-09-07},
version = {},
license = {lppl1.3c},
mirror = {https://mirror.ctan.org/macros/latex/contrib/l3build},
@@ -43142,8 +43142,8 @@
title = {The \texttt{marginnote} package},
subtitle = {Notes in the margin, even where \textbackslash{}marginpar fails},
author = {Markus Kohm},
- date = {2018-08-09},
- version = {1.4b},
+ date = {2023-09-07},
+ version = {},
license = {lppl1.3c},
mirror = {https://mirror.ctan.org/macros/latex/contrib/marginnote},
url = {https://ctan.org/pkg/marginnote},
@@ -48264,8 +48264,8 @@
title = {The \texttt{newpx} package},
subtitle = {Alternative uses of the PX fonts, with improved metrics},
author = {Michael Sharpe},
- date = {2023-08-26},
- version = {1.511},
+ date = {2023-09-07},
+ version = {1.52},
license = {lppl,ofl},
mirror = {https://mirror.ctan.org/fonts/newpx},
url = {https://ctan.org/pkg/newpx},
@@ -49754,8 +49754,8 @@
title = {The \texttt{odsfile} package},
subtitle = {Read OpenDocument Spreadsheet documents as \LaTeX{} tables},
author = {Michal Hoftich},
- date = {2022-12-13},
- version = {0.7},
+ date = {2023-09-07},
+ version = {0.8},
license = {lppl1.3c},
mirror = {https://mirror.ctan.org/macros/luatex/latex/odsfile},
url = {https://ctan.org/pkg/odsfile},
@@ -51255,8 +51255,8 @@
title = {The \texttt{parsinevis} package},
subtitle = {“Scheherazade New” adapted for Persian typesetting and scientific writings},
author = {Sajad Kazemi},
- date = {2023-09-06},
- version = {1.0},
+ date = {2023-09-07},
+ version = {1.1},
license = {ofl},
mirror = {https://mirror.ctan.org/fonts/parsinevis},
url = {https://ctan.org/pkg/parsinevis},
@@ -53759,7 +53759,7 @@
title = {The \texttt{plex} package},
subtitle = {Support for IBM Plex fonts},
author = {Bob Tennent},
- date = {2022-09-23},
+ date = {2023-09-07},
version = {},
license = {ofl,lppl},
mirror = {https://mirror.ctan.org/fonts/plex},
@@ -54808,8 +54808,8 @@
title = {The \texttt{ProfCollege} package},
subtitle = {A \LaTeX{} package for French maths teachers in college},
author = {Christophe Poulain},
- date = {2023-08-15},
- version = {0.99-z-s},
+ date = {2023-09-07},
+ version = {0.99-z-t},
license = {lppl1.3c},
mirror = {https://mirror.ctan.org/macros/latex/contrib/profcollege},
url = {https://ctan.org/pkg/profcollege},
@@ -59353,7 +59353,7 @@
title = {The \texttt{robust-externalize} package},
subtitle = {Cache anything (TikZ, python, ...) in a robust, efficient and pure way},
author = {Léo Colisson},
- date = {2023-09-06},
+ date = {2023-09-07},
version = {1.0},
license = {mit},
mirror = {https://mirror.ctan.org/macros/latex/contrib/robust-externalize},
@@ -65315,8 +65315,8 @@
title = {The \texttt{suftesi} package},
subtitle = {A document class for typesetting theses, books and articles},
author = {Ivan Valbusa},
- date = {2021-11-01},
- version = {3.2.0},
+ date = {2023-09-07},
+ version = {3.2.1},
license = {lppl1.3},
mirror = {https://mirror.ctan.org/macros/latex/contrib/suftesi},
url = {https://ctan.org/pkg/suftesi},
diff --git a/biblio/ctan-bibdata/ctan.pdf b/biblio/ctan-bibdata/ctan.pdf
index 85fb17c6f3..384266a41a 100644
--- a/biblio/ctan-bibdata/ctan.pdf
+++ b/biblio/ctan-bibdata/ctan.pdf
Binary files differ