diff options
author | Norbert Preining <norbert@preining.info> | 2023-09-08 03:02:30 +0000 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2023-09-08 03:02:30 +0000 |
commit | 608e422a8e775ac4d1c23c80b4170776701680d5 (patch) | |
tree | d1e69057c0dc339fb0f890882f5fef9fe3b3a66f /biblio | |
parent | 96f1d7a9e9fe6e682cbd19d1bf2b7797891160b6 (diff) |
CTAN sync 202309080302
Diffstat (limited to 'biblio')
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=", & "> - <!-- 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 Binary files differindex 301c74080c..2765720657 100644 --- a/biblio/citation-style-language/citation-style-language-doc.pdf +++ b/biblio/citation-style-language/citation-style-language-doc.pdf 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 Binary files differindex 85fb17c6f3..384266a41a 100644 --- a/biblio/ctan-bibdata/ctan.pdf +++ b/biblio/ctan-bibdata/ctan.pdf |