Skip to content

Instantly share code, notes, and snippets.

@zepinglee
Created October 7, 2023 15:04
Show Gist options
  • Save zepinglee/157bbf15b4a52b149ded753060b5bf47 to your computer and use it in GitHub Desktop.
Save zepinglee/157bbf15b4a52b149ded753060b5bf47 to your computer and use it in GitHub Desktop.
APA: Sorting citation items by year-suffix
\documentclass{article}
\begin{filecontents}[force,noheader]{\jobname.bib}
@book{ITEM-1,
author = {Nietzsche, Friedrich},
title = {Title B of ITEM-1},
date = 1988,
}
@book{ITEM-2,
author = {Nietzsche, Friedrich},
title = {Title A of ITEM-2},
date = 1988,
}
\end{filecontents}
\usepackage[style=apa]{biblatex}
\addbibresource{\jobname.bib}
\begin{document}
\parencite{ITEM-1, ITEM-2}
\printbibliography
\end{document}
>>===== MODE =====>>
citation
<<===== MODE =====<<
>>===== RESULT =====>>
>>[0] (Nietzsche, 1988a, 1988b)
<<===== RESULT =====<<
>>===== CITATIONS =====>>
[
[
{
"citationID": "CITATION-1",
"citationItems": [
{
"id": "ITEM-1"
},
{
"id": "ITEM-2"
}
],
"properties": {
"noteIndex": 0
}
},
[],
[]
]
]
<<===== CITATIONS =====<<
>>===== CSL =====>>
<style xmlns="http://purl.org/net/xbiblio/csl" class="in-text" version="1.0" demote-non-dropping-particle="never" page-range-format="expanded">
<info>
<title>American Psychological Association 7th edition</title>
<title-short>APA</title-short>
<id>http://www.zotero.org/styles/apa</id>
<link href="http://www.zotero.org/styles/apa" rel="self"/>
<link href="http://www.zotero.org/styles/apa-6th-edition" rel="template"/>
<link href="https://apastyle.apa.org/style-grammar-guidelines/references/examples" rel="documentation"/>
<author>
<name>Brenton M. Wiernik</name>
<email>zotero@wiernik.org</email>
</author>
<category citation-format="author-date"/>
<category field="psychology"/>
<category field="generic-base"/>
<updated>2023-10-07T22:57:56+08: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">
<terms>
<term name="editortranslator" form="short">
<single>ed. &amp; trans.</single>
<multiple>eds. &amp; trans.</multiple>
</term>
<term name="translator" form="short">trans.</term>
<term name="interviewer" form="short">
<single>interviewer</single>
<multiple>interviewers</multiple>
</term>
<term name="collection-editor" form="short">
<single>ed.</single>
<multiple>eds.</multiple>
</term>
<term name="circa" form="short">ca.</term>
<term name="bc"> B.C.E.</term>
<term name="ad"> C.E.</term>
<term name="issue" form="long">
<single>issue</single>
<multiple>issues</multiple>
</term>
<term name="software">computer software</term>
</terms>
</locale>
<locale xml:lang="da">
<terms>
<term name="et-al">et al.</term>
</terms>
</locale>
<locale xml:lang="de">
<terms>
<term name="et-al">et al.</term>
</terms>
</locale>
<locale xml:lang="es">
<terms>
<term name="from">de</term>
</terms>
</locale>
<locale xml:lang="fr">
<terms>
<term name="editor" form="short">
<single>éd.</single>
<multiple>éds.</multiple>
</term>
</terms>
</locale>
<locale xml:lang="nb">
<terms>
<term name="et-al">et al.</term>
</terms>
</locale>
<locale xml:lang="nl">
<terms>
<term name="et-al">et al.</term>
</terms>
</locale>
<locale xml:lang="nn">
<terms>
<term name="et-al">et al.</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 classic collection dataset document
entry entry-dictionary entry-encyclopedia event figure
graphic interview manuscript map motion_picture musical_score pamphlet patent
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>
<names variable="author"/>
<names variable="illustrator"/>
<names variable="director">
<name name-as-sort-order="all" and="symbol" sort-separator=", " initialize-with=". " delimiter=", " delimiter-precedes-last="always"/>
<label form="long" prefix=" (" suffix=")" text-case="title"/>
</names>
<choose>
<if variable="container-title">
<choose>
<if type="book entry entry-dictionary entry-encyclopedia" match="any">
<choose>
<if variable="title">
<group delimiter=" ">
<text macro="title"/>
<text macro="parenthetical"/>
</group>
</if>
<else>
<text macro="title-and-descriptions"/>
</else>
</choose>
</if>
</choose>
</if>
</choose>
<!-- 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"/>
</names>
<names variable="editorial-director">
<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"/>
</names>
<names variable="collection-editor">
<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"/>
</names>
<choose>
<if variable="title">
<group delimiter=" ">
<text macro="title"/>
<text macro="parenthetical"/>
</group>
</if>
<else>
<text macro="title-and-descriptions"/>
</else>
</choose>
</substitute>
</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"/>
</if>
<else-if type="interview personal_communication" match="any">
<choose>
<!-- These variables indicate that the letter is retrievable by the reader.
If not, then use the APA in-text-only personal communication format -->
<if variable="archive container-title DOI publisher URL" match="none">
<group delimiter=", ">
<names variable="author">
<name and="symbol" delimiter=", " initialize-with=". "/>
<substitute>
<text macro="title-intext"/>
</substitute>
</names>
<text term="personal-communication"/>
</group>
</if>
<else>
<names variable="author" delimiter=", ">
<name form="short" and="symbol" delimiter=", " initialize-with=". "/>
<substitute>
<text macro="title-intext"/>
</substitute>
</names>
</else>
</choose>
</else-if>
<else>
<names variable="composer" delimiter=", ">
<name form="short" and="symbol" delimiter=", " initialize-with=". "/>
<substitute>
<names variable="author"/>
<names variable="illustrator"/>
<names variable="director"/>
<choose>
<if variable="container-title">
<choose>
<if type="book entry entry-dictionary entry-encyclopedia" match="any">
<text macro="title-intext"/>
</if>
</choose>
</if>
</choose>
<names variable="editor"/>
<names variable="editorial-director"/>
<text macro="title-intext"/>
</substitute>
</names>
</else>
</choose>
</macro>
<macro name="date-bib">
<!-- TODO: Add new item types -->
<group delimiter=" " prefix="(" suffix=")">
<choose>
<if is-uncertain-date="issued">
<text term="circa" form="short"/>
</if>
</choose>
<group>
<choose>
<if variable="issued">
<date variable="issued">
<date-part name="year"/>
</date>
<text variable="year-suffix"/>
<choose>
<if type="article-magazine article-newspaper broadcast interview motion_picture pamphlet personal_communication post post-weblog song speech webpage" match="any">
<!-- Many video and audio examples in manual give full dates. Err on the side of too much information. -->
<date variable="issued">
<date-part prefix=", " name="month"/>
<date-part prefix=" " name="day"/>
</date>
</if>
<else-if type="paper-conference">
<!-- Capture 'speech' stored as 'paper-conference' -->
<choose>
<if variable="collection-editor editor editorial-director issue page volume" match="none">
<date variable="issued">
<date-part prefix=", " name="month"/>
<date-part prefix=" " name="day"/>
</date>
</if>
</choose>
</else-if>
<!-- Only year: article article-journal book chapter entry entry-dictionary entry-encyclopedia dataset figure graphic
manuscript map musical_score paper-conference[published] patent report review review-book thesis -->
</choose>
</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>
</else-if>
<else>
<text term="no date" form="short"/>
<text variable="year-suffix" prefix="-"/>
</else>
</choose>
</group>
</group>
</macro>
<macro name="date-sort-group">
<!-- APA sorts 1. no-date items, 2. items with dates, 3. in-press (status) items -->
<choose>
<if variable="issued">
<text value="1"/>
</if>
<else-if variable="status">
<text value="2"/>
</else-if>
<else>
<text value="0"/>
</else>
</choose>
</macro>
<macro name="date-intext">
<!-- TODO: Add new item types -->
<choose>
<if variable="issued">
<group delimiter="/">
<group delimiter=" ">
<choose>
<if is-uncertain-date="original-date">
<text term="circa" form="short"/>
</if>
</choose>
<date variable="original-date">
<date-part name="year"/>
</date>
</group>
<group delimiter=" ">
<choose>
<if is-uncertain-date="issued">
<text term="circa" form="short"/>
</if>
</choose>
<group>
<choose>
<if type="interview personal_communication" match="any">
<choose>
<if variable="archive container-title DOI publisher URL" match="none">
<!-- These variables indicate that the communication is retrievable by the reader.
If not, then use the in-text-only personal communication format -->
<date variable="issued" form="text"/>
</if>
<else>
<date variable="issued">
<date-part name="year"/>
</date>
</else>
</choose>
</if>
<else>
<date variable="issued">
<date-part name="year"/>
</date>
</else>
</choose>
<text variable="year-suffix"/>
</group>
</group>
</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>
<else>
<text term="no date" form="short"/>
<text variable="year-suffix" prefix="-"/>
</else>
</choose>
</macro>
<!-- APA has two description elements following the title:
title (parenthetical) [bracketed] -->
<macro name="title-and-descriptions">
<choose>
<if variable="title">
<group delimiter=" ">
<text macro="title"/>
<text macro="parenthetical"/>
<text macro="bracketed"/>
</group>
</if>
<else>
<group delimiter=" ">
<text macro="bracketed"/>
<text macro="parenthetical"/>
</group>
</else>
</choose>
</macro>
<macro name="title">
<!-- TODO: Add new item types -->
<choose>
<if type="post webpage" match="any">
<!-- Webpages are always italicized -->
<text variable="title" font-style="italic"/>
</if>
<else-if variable="container-title" match="any">
<!-- Other types are italicized based on presence of container-title.
Assume that review and review-book are published in periodicals/blogs,
not just on a web page (ex. 69) -->
<text variable="title"/>
</else-if>
<else>
<choose>
<if type="article-journal article-magazine article-newspaper post-weblog review review-book" match="any">
<text variable="title" font-style="italic"/>
</if>
<else-if type="paper-conference">
<choose>
<if variable="collection-editor editor editorial-director" match="any">
<group delimiter=": " font-style="italic">
<text variable="title"/>
<!-- TODO: Replace with volume-title -->
<choose>
<if is-numeric="volume" match="none">
<group delimiter=" ">
<label variable="volume" form="short" text-case="capitalize-first"/>
<text variable="volume"/>
</group>
</if>
</choose>
</group>
</if>
<else>
<text variable="title" font-style="italic"/>
</else>
</choose>
</else-if>
<else>
<group delimiter=": " font-style="italic">
<text variable="title"/>
<!-- TODO: Replace with volume-title -->
<choose>
<if is-numeric="volume" match="none">
<group delimiter=" ">
<label variable="volume" form="short" text-case="capitalize-first"/>
<text variable="volume"/>
</group>
</if>
</choose>
</group>
</else>
</choose>
</else>
</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">
<!-- Bills are not italicized and substitute bill number if no title. -->
<choose>
<if variable="title">
<text variable="title" form="short" text-case="title"/>
</if>
<else>
<group delimiter=" ">
<text variable="genre"/>
<group delimiter=" ">
<choose>
<if variable="chapter-number container-title" match="none">
<label variable="number" form="short"/>
</if>
</choose>
<text variable="number"/>
</group>
</group>
</else>
</choose>
</else-if>
<else-if type="legal_case" match="any">
<!-- Cases are italicized -->
<text variable="title" font-style="italic"/>
</else-if>
<else-if type="legislation treaty" match="any">
<!-- Legislation and treaties not italicized or quoted -->
<text variable="title" form="short" text-case="title"/>
</else-if>
<else-if type="post webpage" match="any">
<!-- Webpages are always italicized -->
<text variable="title" form="short" font-style="italic" text-case="title"/>
</else-if>
<else-if variable="container-title" match="any">
<!-- Other types are italicized or quoted based on presence of container-title. As in title macro. -->
<text variable="title" form="short" quotes="true" text-case="title"/>
</else-if>
<else>
<text variable="title" form="short" font-style="italic" text-case="title"/>
</else>
</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>
<if type="patent">
<!-- authority: U.S. ; genre: patent ; number: 123,445 -->
<group delimiter=" ">
<text variable="authority" form="short"/>
<choose>
<if variable="genre">
<text variable="genre" text-case="capitalize-first"/>
</if>
<else>
<text term="patent" text-case="capitalize-first"/>
</else>
</choose>
<group delimiter=" ">
<label variable="number" form="short" text-case="capitalize-first"/>
<text variable="number"/>
</group>
</group>
</if>
<else-if type="post webpage" match="any">
<!-- For post webpage, container-title is treated as publisher -->
<group delimiter="; ">
<text macro="secondary-contributors"/>
<text macro="database-location"/>
<text macro="number"/>
<text macro="locators-booklike"/>
</group>
</else-if>
<else-if variable="container-title">
<group delimiter="; ">
<text macro="secondary-contributors"/>
<choose>
<if type="broadcast graphic map motion_picture song" match="any">
<!-- For audiovisual media, number information comes after title, not container-title -->
<text macro="number"/>
</if>
</choose>
</group>
</else-if>
<else>
<group delimiter="; ">
<text macro="secondary-contributors"/>
<text macro="database-location"/>
<text macro="number"/>
<text macro="locators-booklike"/>
</group>
</else>
</choose>
</group>
</macro>
<macro name="parenthetical-container">
<!-- TODO: Add new item types -->
<choose>
<if variable="container-title" match="any">
<group prefix="(" suffix=")">
<group delimiter="; ">
<text macro="database-location"/>
<choose>
<if type="broadcast graphic map motion_picture song" match="none">
<!-- For audiovisual media, number information comes after title, not container-title -->
<text macro="number"/>
</if>
</choose>
<text macro="locators-booklike"/>
</group>
</group>
</if>
</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="]">
<choose>
<if variable="reviewed-author reviewed-title" type="review review-book" match="any">
<!-- Reviewed item -->
<group delimiter="; ">
<group delimiter=", ">
<group delimiter=" ">
<!-- Assume that genre is entered as 'Review of the book' or similar -->
<choose>
<if variable="number" match="none">
<choose>
<if variable="genre">
<text variable="genre" text-case="capitalize-first"/>
</if>
<else-if variable="medium">
<text variable="medium" text-case="capitalize-first"/>
</else-if>
<else>
<!-- 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>
</if>
<else>
<choose>
<if variable="medium">
<text variable="medium" text-case="capitalize-first"/>
</if>
<else>
<!-- 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>
</else>
</choose>
<text macro="reviewed-title"/>
</group>
<names variable="reviewed-author">
<label form="verb-short" suffix=" "/>
<name and="symbol" initialize-with=". " delimiter=", "/>
</names>
</group>
<choose>
<if variable="genre" match="any">
<choose>
<if variable="number" match="none">
<text variable="medium" text-case="capitalize-first"/>
</if>
</choose>
</if>
</choose>
</group>
</if>
<else-if type="thesis">
<!-- Thesis type and institution -->
<group delimiter="; ">
<choose>
<if variable="number" match="none">
<group delimiter=", ">
<text variable="genre" text-case="capitalize-first"/>
<choose>
<if variable="archive DOI URL" match="any">
<!-- Include the university in brackets if thesis is published -->
<text variable="publisher"/>
</if>
</choose>
</group>
</if>
</choose>
<text variable="medium" text-case="capitalize-first"/>
</group>
</else-if>
<else-if variable="interviewer" type="interview" match="any">
<!-- Interview information -->
<choose>
<if variable="title">
<text macro="format"/>
</if>
<else-if variable="genre">
<group delimiter="; ">
<group delimiter=" ">
<text variable="genre" text-case="capitalize-first"/>
<group delimiter=" ">
<text term="author" form="verb"/>
<names variable="interviewer">
<name and="symbol" initialize-with=". " delimiter=", "/>
</names>
</group>
</group>
</group>
</else-if>
<else-if variable="interviewer">
<group delimiter="; ">
<names variable="interviewer">
<label form="verb" suffix=" " text-case="capitalize-first"/>
<name and="symbol" initialize-with=". " delimiter=", "/>
</names>
<text variable="medium" text-case="capitalize-first"/>
</group>
</else-if>
<else>
<text macro="format"/>
</else>
</choose>
</else-if>
<else-if type="personal_communication">
<!-- Letter information -->
<choose>
<if variable="recipient">
<group delimiter="; ">
<group delimiter=" ">
<choose>
<if variable="number" match="none">
<choose>
<if variable="genre">
<text variable="genre" text-case="capitalize-first"/>
</if>
<else-if variable="medium">
<text variable="medium" text-case="capitalize-first"/>
</else-if>
<else>
<text term="letter" text-case="capitalize-first"/>
</else>
</choose>
</if>
<else>
<choose>
<if variable="medium">
<text variable="medium" text-case="capitalize-first"/>
</if>
<else>
<text term="letter" text-case="capitalize-first"/>
</else>
</choose>
</else>
</choose>
<names variable="recipient" delimiter=", ">
<label form="verb" suffix=" "/>
<name and="symbol" delimiter=", "/>
</names>
</group>
<choose>
<if variable="genre" match="any">
<choose>
<if variable="number" match="none">
<text variable="medium" text-case="capitalize-first"/>
</if>
</choose>
</if>
</choose>
</group>
</if>
<else>
<text macro="format"/>
</else>
</choose>
</else-if>
<else-if variable="composer" type="song" match="all">
<!-- Performer of classical music works -->
<group delimiter="; ">
<choose>
<if variable="number" match="none">
<group delimiter=" ">
<choose>
<if variable="genre">
<text variable="genre" text-case="capitalize-first"/>
<!-- 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"/>
<!-- TODO: Replace prefix with performer label -->
<names variable="author" prefix="recorded by ">
<name and="symbol" initialize-with=". " delimiter=", "/>
</names>
</else-if>
<else>
<!-- TODO: Replace prefix with performer label -->
<names variable="author" prefix="Recorded by ">
<name and="symbol" initialize-with=". " delimiter=", "/>
</names>
</else>
</choose>
</group>
</if>
<else>
<group delimiter=" ">
<choose>
<if variable="medium">
<text variable="medium" text-case="capitalize-first"/>
<!-- TODO: Replace prefix with performer label -->
<names variable="author" prefix="recorded by ">
<name and="symbol" initialize-with=". " delimiter=", "/>
</names>
</if>
<else>
<!-- TODO: Replace prefix with performer label -->
<names variable="author" prefix="Recorded by ">
<name and="symbol" initialize-with=". " delimiter=", "/>
</names>
</else>
</choose>
</group>
</else>
</choose>
<choose>
<if variable="genre" match="any">
<choose>
<if variable="number" match="none">
<text variable="medium" text-case="capitalize-first"/>
</if>
</choose>
</if>
</choose>
</group>
</else-if>
<else-if variable="container-title" match="none">
<!-- Other description -->
<text macro="format"/>
</else-if>
<else>
<!-- For conference presentations, chapters in reports, software, place bracketed after the container title -->
<choose>
<if type="paper-conference speech" match="any">
<choose>
<if variable="collection-editor editor editorial-director issue page volume" match="any">
<text macro="format"/>
</if>
</choose>
</if>
<else-if type="report software" match="none">
<text macro="format"/>
</else-if>
</choose>
</else>
</choose>
</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">
<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">
<label form="verb" suffix=" " text-case="capitalize-first"/>
<name and="symbol" initialize-with=". " delimiter=", "/>
<substitute>
<text macro="format-intext"/>
</substitute>
</names>
</else-if>
<else-if type="personal_communication">
<!-- Letter information -->
<choose>
<if variable="recipient">
<group delimiter=" ">
<choose>
<if variable="number" match="none">
<text variable="genre" text-case="capitalize-first"/>
</if>
<else>
<text term="letter" text-case="capitalize-first"/>
</else>
</choose>
<names variable="recipient" delimiter=", ">
<label form="verb" suffix=" "/>
<name and="symbol" delimiter=", "/>
</names>
</group>
</if>
<else>
<text macro="format-intext"/>
</else>
</choose>
</else-if>
<else>
<text macro="format-intext"/>
</else>
</choose>
</group>
</macro>
<macro name="bracketed-container">
<!-- TODO: Add new item types -->
<group prefix="[" suffix="]">
<choose>
<if type="paper-conference speech" match="any">
<!-- Conference presentations should describe the session [container] in bracketed unless published in a proceedings -->
<choose>
<if variable="collection-editor editor editorial-director issue page volume" match="none">
<text macro="format"/>
</if>
</choose>
</if>
<else-if type="software" match="all">
<!-- For entries in mobile app reference works, place bracketed after the container-title -->
<text macro="format"/>
</else-if>
<else-if type="report">
<!-- For chapters in reports, place bracketed after the container title -->
<text macro="format"/>
</else-if>
</choose>
</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"/>
</if>
<else-if type="paper-conference">
<choose>
<if variable="collection-editor editor editorial-director" match="any">
<text macro="secondary-contributors-booklike"/>
</if>
<else>
<text macro="secondary-contributors-periodical"/>
</else>
</choose>
</else-if>
<else>
<text macro="secondary-contributors-booklike"/>
</else>
</choose>
</macro>
<macro name="secondary-contributors-periodical">
<group delimiter="; ">
<choose>
<if variable="title">
<names variable="interviewer" delimiter="; ">
<name and="symbol" initialize-with=". " delimiter=", "/>
<label form="short" prefix=", " text-case="title"/>
</names>
</if>
</choose>
<names variable="translator" delimiter="; ">
<name and="symbol" initialize-with=". " delimiter=", "/>
<label form="short" prefix=", " text-case="title"/>
</names>
</group>
</macro>
<macro name="secondary-contributors-booklike">
<!-- TODO: Add new item types -->
<group delimiter="; ">
<choose>
<if variable="title">
<names variable="interviewer">
<name and="symbol" initialize-with=". " delimiter=", "/>
<label form="short" prefix=", " text-case="title"/>
</names>
</if>
</choose>
<!-- 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 -->
<choose>
<if variable="container-title" match="none">
<group delimiter="; ">
<names variable="container-author">
<label form="verb-short" suffix=" " text-case="title"/>
<name and="symbol" initialize-with=". " delimiter=", "/>
</names>
<names variable="editor translator" delimiter="; ">
<name and="symbol" initialize-with=". " delimiter=", "/>
<label form="short" prefix=", " text-case="title"/>
</names>
</group>
</if>
</choose>
</if>
<else>
<group delimiter="; ">
<names variable="container-author">
<label form="verb-short" suffix=" " text-case="title"/>
<name and="symbol" initialize-with=". " delimiter=", "/>
</names>
<names variable="editor translator" delimiter="; ">
<name and="symbol" initialize-with=". " delimiter=", "/>
<label form="short" prefix=", " text-case="title"/>
</names>
</group>
</else>
</choose>
</group>
</macro>
<macro name="database-location">
<choose>
<if variable="archive-place" match="none">
<!-- With `archive-place`: physical archives. Without: online archives. -->
<!-- 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=", ">
<group delimiter=" ">
<text variable="genre" text-case="title"/>
<choose>
<if is-numeric="number">
<label variable="number" form="short" text-case="capitalize-first"/>
<text variable="number"/>
</if>
<else>
<text variable="number"/>
</else>
</choose>
</group>
<choose>
<if type="thesis">
<choose>
<!-- Include the university in brackets if thesis is published -->
<if variable="archive DOI URL" match="any">
<text variable="publisher"/>
</if>
</choose>
</if>
</choose>
</group>
</if>
</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">
<choose>
<if variable="collection-editor editor editorial-director" match="any">
<group delimiter=", ">
<text macro="version"/>
<text macro="edition"/>
<text macro="volume-booklike"/>
</group>
</if>
</choose>
</else-if>
<else>
<group delimiter=", ">
<text macro="version"/>
<text macro="edition"/>
<text macro="volume-booklike"/>
</group>
</else>
</choose>
</macro>
<macro name="version">
<choose>
<if is-numeric="version">
<group delimiter=" ">
<label variable="version" text-case="capitalize-first"/>
<text variable="version"/>
</group>
</if>
<else>
<text variable="version"/>
</else>
</choose>
</macro>
<macro name="edition">
<choose>
<if is-numeric="edition">
<group delimiter=" ">
<number variable="edition" form="ordinal"/>
<label variable="edition" form="short"/>
</group>
</if>
<else>
<text variable="edition"/>
</else>
</choose>
</macro>
<macro name="volume-booklike">
<!-- TODO: Add new item types -->
<group delimiter=", ">
<!-- Report series [ex. 52] -->
<choose>
<if type="report">
<group delimiter=" ">
<text variable="collection-title" text-case="title"/>
<text variable="collection-number"/>
</group>
</if>
</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"/>
<else>
<group delimiter=" ">
<label variable="volume" form="short" text-case="capitalize-first"/>
<number variable="volume" form="numeric"/>
</group>
</else>
</choose>
</if>
<else>
<group>
<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>
</else>
</choose>
<group delimiter=" ">
<label variable="issue" text-case="capitalize-first"/>
<text variable="issue"/>
</group>
<group delimiter=" ">
<label variable="page" form="short" suffix=" "/>
<text variable="page"/>
</group>
</group>
</macro>
<macro name="reviewed-title">
<choose>
<if variable="reviewed-title">
<!-- Not possible to distinguish TV series episode from other reviewed
works [Ex. 69] -->
<text variable="reviewed-title" font-style="italic"/>
</if>
<else>
<!-- Assume title is title of reviewed work -->
<text variable="title" font-style="italic"/>
</else>
</choose>
</macro>
<macro name="reviewed-title-intext">
<choose>
<if variable="reviewed-title">
<!-- Not possible to distinguish TV series episode from other reviewed works [Ex. 69] -->
<text variable="reviewed-title" form="short" font-style="italic" text-case="title"/>
</if>
<else>
<!-- Assume title is title of reviewed work -->
<text variable="title" form="short" font-style="italic" text-case="title"/>
</else>
</choose>
</macro>
<macro name="format">
<!-- TODO: Add new item types -->
<choose>
<if variable="genre medium" match="any">
<group delimiter="; ">
<choose>
<if variable="number" match="none">
<text variable="genre" text-case="capitalize-first"/>
</if>
</choose>
<text variable="medium" text-case="capitalize-first"/>
</group>
</if>
<!-- Generic labels for specific types -->
<!-- TODO: Add terms for other types? -->
<else-if type="dataset">
<text term="dataset"/>
</else-if>
<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="personal-communication" text-case="capitalize-first"/>
</if>
<else-if type="interview">
<text term="interview" text-case="capitalize-first"/>
</else-if>
</choose>
</else-if>
<else-if type="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"/>
</if>
<else-if variable="medium">
<text variable="medium" text-case="capitalize-first"/>
</else-if>
<!-- Generic labels for specific types -->
<!-- TODO: Add terms for other types? -->
<else-if type="dataset">
<text term="dataset"/>
</else-if>
<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="personal-communication" text-case="capitalize-first"/>
</if>
<else-if type="interview">
<text term="interview" text-case="capitalize-first"/>
</else-if>
</choose>
</else-if>
<else-if type="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 -->
<text macro="container-periodical"/>
</if>
<else-if type="paper-conference">
<!-- Determine if paper-conference is a periodical or booklike -->
<choose>
<if variable="editor editorial-director collection-editor container-author" match="any">
<text macro="container-booklike"/>
</if>
<else>
<text macro="container-periodical"/>
</else>
</choose>
</else-if>
<else-if type="post webpage" match="none">
<!-- post and webpage treat container-title like publisher -->
<text macro="container-booklike"/>
</else-if>
</choose>
</macro>
<macro name="container-periodical">
<group delimiter=". ">
<group delimiter=", ">
<text variable="container-title" font-style="italic" text-case="title"/>
<choose>
<if variable="volume">
<group>
<text variable="volume" font-style="italic"/>
<text variable="issue" prefix="(" suffix=")"/>
</group>
</if>
<else>
<text variable="issue" font-style="italic"/>
</else>
</choose>
<choose>
<if variable="number">
<!-- Ex. 6: Journal article with article number or eLocator -->
<!-- This should be localized -->
<group delimiter=" ">
<text term="article-locator" text-case="capitalize-first"/>
<text variable="number"/>
</group>
</if>
<else>
<text variable="page"/>
</else>
</choose>
</group>
<choose>
<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>
</if>
</choose>
</group>
</macro>
<macro name="container-booklike">
<!-- TODO: Add new item types -->
<choose>
<if variable="container-title" match="any">
<group delimiter=" ">
<text term="in" text-case="capitalize-first"/>
<group delimiter=", ">
<names variable="editor translator" delimiter=", &amp; ">
<!-- TODO: Change to editortranslator and move editor to substitute -->
<name and="symbol" initialize-with=". " delimiter=", "/>
<label form="short" text-case="title" prefix=" (" suffix=")"/>
<substitute>
<names variable="editorial-director"/>
<names variable="collection-editor"/>
<names variable="container-author"/>
</substitute>
</names>
<group delimiter=": " font-style="italic">
<text variable="container-title"/>
<!-- TODO: Replace with volume-title -->
<choose>
<if is-numeric="volume" match="none">
<group delimiter=" ">
<label variable="volume" form="short" text-case="capitalize-first"/>
<text variable="volume"/>
</group>
</if>
</choose>
</group>
</group>
<text macro="parenthetical-container"/>
<text macro="bracketed-container"/>
</group>
</if>
</choose>
</macro>
<macro name="publisher">
<!-- TODO: Add new item types -->
<group delimiter="; ">
<choose>
<if type="thesis">
<choose>
<if variable="archive DOI URL" match="none">
<text variable="publisher"/>
</if>
</choose>
</if>
<else-if type="post webpage" match="any">
<!-- For websites, treat container title like publisher -->
<group delimiter="; ">
<text variable="container-title" text-case="title"/>
<text variable="publisher"/>
</group>
</else-if>
<else-if type="paper-conference">
<!-- For paper-conference, don't print publisher if in a journal-like proceedings -->
<choose>
<if variable="collection-editor editor editorial-director" match="any">
<text variable="publisher"/>
</if>
</choose>
</else-if>
<else-if type="article-journal article-magazine article-newspaper post-weblog" match="none">
<text variable="publisher"/>
</else-if>
</choose>
<group delimiter=", ">
<choose>
<if variable="archive-place">
<!-- 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". -->
<!-- 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
-->
<text variable="archive_location"/>
</if>
</choose>
<text variable="archive"/>
<text variable="archive-place"/>
</group>
</group>
</macro>
<macro name="access">
<choose>
<if variable="DOI" match="any">
<text variable="DOI" prefix="https://doi.org/"/>
</if>
<else-if variable="URL">
<group delimiter=" ">
<choose>
<if variable="issued status" match="none">
<group delimiter=" ">
<text term="retrieved" text-case="capitalize-first"/>
<date variable="accessed" form="text" suffix=","/>
<text term="from"/>
</group>
</if>
</choose>
<text variable="URL"/>
</group>
</else-if>
</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
both publisher-place and event-place. Remove this 'choose' when that is changed. -->
<choose>
<if variable="collection-editor editor editorial-director issue page volume" match="none">
<!-- Don't print event info if published in a proceedings -->
<group delimiter=", ">
<text macro="event-title"/>
<text variable="event-place"/>
</group>
</if>
</choose>
</if>
</choose>
</macro>
<macro name="event-title">
<choose>
<!-- TODO: We expect "event-title" to be used,
but processors and applications may not be updated yet.
This macro ensures that either "event" or "event-title" can be accpeted.
Remove if procesor logic and application adoption can handle this. -->
<if variable="event-title">
<text variable="event-title"/>
</if>
<else>
<text variable="event"/>
</else>
</choose>
</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=")">
<choose>
<if variable="references">
<!-- This provides the option for more elaborate description
of publication history, such as full "reprinted" references
(examples 11, 43, 44) or retracted references -->
<text variable="references"/>
</if>
<else>
<!-- TODO: Replace these with terms -->
<group delimiter=" ">
<text term="original-work-published" text-case="capitalize-first"/>
<choose>
<if is-uncertain-date="original-date">
<text term="circa" form="short"/>
</if>
</choose>
<date variable="original-date">
<date-part name="year"/>
</date>
</group>
</else>
</choose>
</group>
</if>
<else>
<text variable="references" prefix="(" suffix=")"/>
</else>
</choose>
</macro>
<!-- Legal citations have their own rules -->
<macro name="legal-cites">
<!-- TODO: Add new item types -->
<choose>
<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>
<!-- 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 type="bill legal_case legislation" match="any">
<text variable="title"/>
</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 type="hearing">
<names variable="author" prefix="(testimony of " suffix=")">
<!-- TODO: Localize this with the hearing term. -->
<name and="symbol" delimiter=", "/>
</names>
</if>
<else-if type="bill legislation" match="any">
<!-- `legislation`: For uncodified regulations, assume future code section is in status. -->
<text variable="status" prefix="(" suffix=")"/>
</else-if>
</choose>
</group>
<text variable="references"/>
</group>
<text macro="access"/>
</group>
</else>
</choose>
</macro>
<macro name="date-legal">
<!-- TODO: Add new item types -->
<choose>
<if type="legal_case">
<group prefix="(" suffix=")" delimiter=" ">
<text variable="authority"/>
<choose>
<if variable="container-title" match="any">
<!-- Print only year for cases published in reporters-->
<date variable="issued" form="numeric" date-parts="year"/>
</if>
<else>
<date variable="issued" form="text"/>
</else>
</choose>
</group>
</if>
<else-if type="bill legislation hearing" match="any">
<group prefix="(" suffix=")" delimiter=" ">
<group delimiter=" ">
<date variable="original-date">
<date-part name="year"/>
</date>
<text term="and" form="symbol"/>
</group>
<date variable="issued">
<date-part name="year"/>
</date>
</group>
</else-if>
<else-if type="treaty">
<date variable="issued" form="text"/>
</else-if>
</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">
<group delimiter=" ">
<choose>
<if variable="container-title">
<group delimiter=" ">
<text variable="volume"/>
<text variable="container-title"/>
<group delimiter=" ">
<label variable="section" form="symbol"/>
<text variable="section"/>
</group>
<choose>
<if variable="page page-first" match="any">
<text variable="page-first"/>
</if>
<else>
<text value="___"/>
</else>
</choose>
</group>
</if>
<else>
<group delimiter=" ">
<choose>
<if is-numeric="number">
<label variable="number" form="short" text-case="capitalize-first"/>
</if>
</choose>
<text variable="number"/>
</group>
</else>
</choose>
</group>
</if>
<else-if type="bill">
<group delimiter=", ">
<group delimiter=" ">
<text variable="genre"/>
<group delimiter=" ">
<choose>
<if variable="chapter-number container-title" match="none">
<label variable="number" form="short"/>
</if>
</choose>
<text variable="number"/>
</group>
</group>
<text variable="authority"/>
<text variable="chapter-number"/>
<group delimiter=" ">
<text variable="volume"/>
<text variable="container-title"/>
<text variable="page-first"/>
</group>
</group>
</else-if>
<else-if type="legislation">
<choose>
<if variable="number">
<!--There's a public law number-->
<group delimiter=", ">
<text variable="number" prefix="Pub. L. No. "/>
<group delimiter=" ">
<text variable="volume"/>
<text variable="container-title"/>
<text variable="page-first"/>
</group>
</group>
</if>
<else>
<group delimiter=" ">
<text variable="volume"/>
<text variable="container-title"/>
<choose>
<if variable="section">
<group delimiter=" ">
<!-- TODO: Change to label variable="section" -->
<text term="section" form="symbol"/>
<text variable="section"/>
</group>
</if>
<else>
<text variable="page-first"/>
</else>
</choose>
</group>
</else>
</choose>
</else-if>
<else-if type="treaty">
<group delimiter=" ">
<number variable="volume"/>
<text variable="container-title"/>
<choose>
<if variable="page page-first" match="any">
<text variable="page-first"/>
</if>
<else>
<group delimiter=" ">
<label variable="number" form="short" text-case="capitalize-first"/>
<text variable="number"/>
</group>
</else>
</choose>
</group>
</else-if>
</choose>
</macro>
<macro name="citation-locator">
<!-- TODO: Add new locator types? -->
<group delimiter=" ">
<choose>
<if locator="chapter">
<label variable="locator" text-case="capitalize-first"/>
</if>
<else>
<label variable="locator" form="short"/>
</else>
</choose>
<text variable="locator"/>
</group>
</macro>
<citation et-al-min="3" et-al-use-first="1" disambiguate-add-year-suffix="true" disambiguate-add-names="true" disambiguate-add-givenname="true" collapse="year" givenname-disambiguation-rule="primary-name-with-initials">
<sort>
<key macro="author-bib" names-min="3" names-use-first="1"/>
<key macro="date-sort-group"/>
<key macro="date-bib" sort="ascending"/>
<key variable="status"/>
</sort>
<layout prefix="(" suffix=")" delimiter="; ">
<group delimiter=", ">
<text macro="author-intext"/>
<text macro="date-intext"/>
<text macro="citation-locator"/>
</group>
</layout>
</citation>
<bibliography hanging-indent="true" et-al-min="21" et-al-use-first="19" et-al-use-last="true" entry-spacing="0" line-spacing="2">
<sort>
<key macro="author-bib"/>
<key macro="date-sort-group"/>
<key macro="date-bib" sort="ascending"/>
<key variable="status"/>
<key macro="title"/>
</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>
<if variable="DOI URL" match="any">
<text macro="legal-cites"/>
</if>
<else>
<text macro="legal-cites" suffix="."/>
</else>
</choose>
</if>
<else>
<group delimiter=" ">
<group delimiter=". " suffix=".">
<text macro="author-bib"/>
<text macro="date-bib"/>
<text macro="title-and-descriptions"/>
<text macro="container"/>
<text macro="event"/>
<text macro="publisher"/>
</group>
<text macro="access"/>
<text macro="publication-history"/>
</group>
</else>
</choose>
</layout>
</bibliography>
</style>
<<===== CSL =====<<
>>===== INPUT =====>>
[
{
"id": "ITEM-1",
"type": "book",
"author": [
{
"family": "Nietzsche",
"given": "Friedrich"
}
],
"issued": {
"date-parts": [
[
1988
]
]
},
"title": "Title B of ITEM-1"
},
{
"id": "ITEM-2",
"type": "book",
"author": [
{
"family": "Nietzsche",
"given": "Friedrich"
}
],
"issued": {
"date-parts": [
[
1988
]
]
},
"title": "Title A of ITEM-2"
}
]
<<===== INPUT =====<<
>>===== VERSION =====>>
1.0
<<===== VERSION =====<<
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment