jgm/citeproc

Graceful handling of BibTeX `and others` with style that have `et-al-use-last="true"`

Closed this issue · 9 comments

BibTeX allows to explicitly add "et al." to the authors list of a reference by appending and others, as in

author = {Max Mustermann and John Doe and others}

This is problematic when these entries are handled with a style like APA, where the et-al-use-last property is used: Normally, this causes very long author lists to be shortened by replacing all but the last of later authors with an ellipsis. An explicit et al. entry does not fit in this schema.

Currently, citeproc adds others directly after the second-to-last name, e.g. Mustermann, M., Doe J.others. A better rendering could be to fall back to an explicit et al., regardless of what the style specifies. I believe that this was the behavior implemented in pandoc-citeproc.

jgm commented

There is code in citeproc to handle this: src/Citeproc/Eval.hs l.2120:

  let finalNameIsOthers = (lastMay names >>= nameLiteral) == Just "others"
        -- bibtex conversions often have this, and we want to render it "et al"
  let etAlUseLast = nameEtAlUseLast nameFormat
  let etAlThreshold = case etAlMin of
                        Just x | numnames >= x
                          -> case (disamb >>= disambEtAlNames, etAlUseFirst) of
                               (Just n, Just m) -> Just (max m n)
                               (_, y) -> y
                               | numnames < x
                               , finalNameIsOthers -> Just (numnames - 1)
                        _ -> Nothing

Maybe it's buggy, though.

jgm commented

APA has et-al-use-first = 6 , et-al-use-last = true, et-al-min = 8
numnames should be 3 here.
I would think that etAlThreshold should be Just 2, then.
Need to get an example and use tracing...

jgm commented

I tried to reproduce this but couldn't. Here's a test file that just uses citeproc.
Save as test.txt. To run the test, make PATTERN=./test.txt. It passes, so you can see that the "others" name gets turned into "et. al." See if you can get a test case in this format.

>>===== MODE =====>>
citation
<<===== MODE =====<<

>>===== RESULT =====>>
(FamilyA &#38; FamilyB, 2003; FamilyA, FamilyC, et al., 2007)
<<===== RESULT =====<<

>>===== CSL =====>>
<?xml version="1.0" encoding="utf-8"?>
<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 6th 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://owl.english.purdue.edu/owl/resource/560/01/" rel="documentation"/>
    <author>
      <name>Simon Kornblith</name>
      <email>simon@simonster.com</email>
    </author>
    <contributor>
      <name>Bruce D'Arcus</name>
    </contributor>
    <contributor>
      <name>Curtis M. Humphrey</name>
    </contributor>
    <contributor>
      <name>Richard Karnesky</name>
      <email>karnesky+zotero@gmail.com</email>
      <uri>http://arc.nucapt.northwestern.edu/Richard_Karnesky</uri>
    </contributor>
    <contributor>
      <name>Sebastian Karcher</name>
    </contributor>
    <contributor>
      <name> Brenton M. Wiernik</name>
      <email>zotero@wiernik.org</email>
    </contributor>
    <category citation-format="author-date"/>
    <category field="psychology"/>
    <category field="generic-base"/>
    <updated>2016-09-28T13:09:49+00: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>
    </terms>
  </locale>
  <locale xml:lang="es">
    <terms>
      <term name="from">de</term>
    </terms>
  </locale>
  <macro name="container-contributors">
    <choose>
      <if type="chapter paper-conference entry-dictionary entry-encyclopedia" match="any">
        <group delimiter=", ">
          <names variable="container-author" delimiter=", ">
            <name and="symbol" initialize-with=". " delimiter=", "/>
            <label form="short" prefix=" (" text-case="title" suffix=")"/>
          </names>
          <names variable="editor translator" delimiter=", ">
            <name and="symbol" initialize-with=". " delimiter=", "/>
            <label form="short" prefix=" (" text-case="title" suffix=")"/>
          </names>
        </group>
      </if>
    </choose>
  </macro>
  <macro name="secondary-contributors">
    <choose>
      <if type="article-journal chapter paper-conference entry-dictionary entry-encyclopedia" match="none">
        <group delimiter=", " prefix=" (" suffix=")">
          <names variable="container-author" delimiter=", ">
            <name and="symbol" initialize-with=". " delimiter=", "/>
            <label form="short" prefix=", " text-case="title"/>
          </names>
          <names variable="editor translator" delimiter=", ">
            <name and="symbol" initialize-with=". " delimiter=", "/>
            <label form="short" prefix=", " text-case="title"/>
          </names>
        </group>
      </if>
    </choose>
  </macro>
  <macro name="author">
    <names variable="author">
      <name name-as-sort-order="all" and="symbol" sort-separator=", " initialize-with=". " delimiter=", " delimiter-precedes-last="always"/>
      <label form="short" prefix=" (" suffix=")" text-case="capitalize-first"/>
      <substitute>
        <names variable="editor"/>
        <names variable="translator"/>
        <choose>
          <if type="report">
            <text variable="publisher"/>
            <text macro="title"/>
          </if>
          <else>
            <text macro="title"/>
          </else>
        </choose>
      </substitute>
    </names>
  </macro>
  <macro name="author-short">
    <choose>
      <if type="patent" variable="number" match="all">
        <text macro="patent-number"/>
      </if>
      <else>
        <names variable="author">
          <name form="short" and="symbol" delimiter=", " initialize-with=". "/>
          <substitute>
            <names variable="editor"/>
            <names variable="translator"/>
            <choose>
              <if type="report">
                <text variable="publisher"/>
                <text variable="title" form="short" font-style="italic"/>
              </if>
              <else-if type="legal_case">
                <text variable="title" font-style="italic"/>
              </else-if>
              <else-if type="book graphic  motion_picture song" match="any">
                <text variable="title" form="short" font-style="italic"/>
              </else-if>
              <else-if type="bill legislation" match="any">
                <text variable="title" form="short"/>
              </else-if>
              <else-if variable="reviewed-author">
                <choose>
                  <if variable="reviewed-title" match="none">
                    <text variable="title" form="short" font-style="italic" prefix="Review of "/>
                  </if>
                  <else>
                    <text variable="title" form="short" quotes="true"/>
                  </else>
                </choose>
              </else-if>
              <else>
                <text variable="title" form="short" quotes="true"/>
              </else>
            </choose>
          </substitute>
        </names>
      </else>
    </choose>
  </macro>
  <macro name="patent-number">
    <!-- genre: U.S. Patent number: 123,445-->
    <group delimiter=" ">
      <group delimiter=" ">
        <text variable="genre"/>
        <text term="issue" form="short" text-case="capitalize-first"/>
      </group>
      <text variable="number"/>
    </group>
  </macro>
  <macro name="access">
    <choose>
      <if type="thesis report" match="any">
        <choose>
          <if variable="DOI" match="any">
            <text variable="DOI" prefix="https://doi.org/"/>
          </if>
          <else-if variable="URL" match="any">
            <group>
              <text term="retrieved" text-case="capitalize-first" suffix=" "/>
              <text term="from" suffix=" "/>
              <text variable="URL"/>
            </group>
          </else-if>
          <else-if variable="archive" match="any">
            <group>
              <text term="retrieved" text-case="capitalize-first" suffix=" "/>
              <text term="from" suffix=" "/>
              <text variable="archive" suffix="."/>
              <text variable="archive_location" prefix=" (" suffix=")"/>
            </group>
          </else-if>
        </choose>
      </if>
      <else>
        <choose>
          <if variable="DOI">
            <text variable="DOI" prefix="https://doi.org/"/>
          </if>
          <else>
            <choose>
              <if type="post post-weblog webpage" match="any">
                <group delimiter=" ">
                  <text term="retrieved" text-case="capitalize-first" suffix=" "/>
                  <group>
                    <date variable="accessed" form="text" suffix=", "/>
                  </group>
                  <text term="from"/>
                  <text variable="URL"/>
                </group>
              </if>
              <else>
                <group>
                  <text term="retrieved" text-case="capitalize-first" suffix=" "/>
                  <text term="from" suffix=" "/>
                  <text variable="URL"/>
                </group>
              </else>
            </choose>
          </else>
        </choose>
      </else>
    </choose>
  </macro>
  <macro name="title">
    <choose>
      <if type="book dataset graphic manuscript motion_picture report song speech thesis" match="any">
        <choose>
          <if variable="version" type="book" match="all">
            <!---This is a hack until we have a computer program type -->
            <text variable="title"/>
          </if>
          <else>
            <text variable="title" font-style="italic"/>
          </else>
        </choose>
      </if>
      <else-if variable="reviewed-author">
        <choose>
          <if variable="reviewed-title">
            <group delimiter=" ">
              <text variable="title"/>
              <group delimiter=", " prefix="[" suffix="]">
                <text variable="reviewed-title" font-style="italic" prefix="Review of "/>
                <names variable="reviewed-author" delimiter=", ">
                  <label form="verb-short" suffix=" "/>
                  <name and="symbol" initialize-with=". " delimiter=", "/>
                </names>
              </group>
            </group>
          </if>
          <else>
            <!-- assume `title` is title of reviewed work -->
            <group delimiter=", " prefix="[" suffix="]">
              <text variable="title" font-style="italic" prefix="Review of "/>
              <names variable="reviewed-author" delimiter=", ">
                <label form="verb-short" suffix=" "/>
                <name and="symbol" initialize-with=". " delimiter=", "/>
              </names>
            </group>
          </else>
        </choose>
      </else-if>
      <else-if type="patent" variable="number" match="all">
        <text macro="patent-number" font-style="italic"/>
      </else-if>
      <else>
        <text variable="title"/>
      </else>
    </choose>
  </macro>
  <macro name="title-plus-extra">
    <text macro="title"/>
    <choose>
      <if type="report thesis" match="any">
        <group prefix=" (" suffix=")" delimiter=", ">
          <group delimiter=" ">
            <choose>
              <if variable="genre" match="any">
                <text variable="genre"/>
              </if>
              <else>
                <text variable="collection-title"/>
              </else>
            </choose>
            <text variable="number" prefix="No. "/>
          </group>
          <group delimiter=" ">
            <text term="version" text-case="capitalize-first"/>
            <text variable="version"/>
          </group>
          <text macro="edition"/>
        </group>
      </if>
      <else-if type="post-weblog webpage" match="any">
        <text variable="genre" prefix=" [" suffix="]"/>
      </else-if>
      <else-if variable="version">
        <group delimiter=" " prefix=" (" suffix=")">
          <text term="version" text-case="capitalize-first"/>
          <text variable="version"/>
        </group>
      </else-if>
    </choose>
    <text macro="format" prefix=" [" suffix="]"/>
  </macro>
  <macro name="format">
    <choose>
      <if match="any" variable="medium">
        <text variable="medium" text-case="capitalize-first"/>
      </if>
      <else-if type="dataset" match="any">
        <choose>
          <if variable="genre">
            <text variable="genre" text-case="capitalize-first"/>
          </if>
          <else>
            <!-- This should be localized -->
            <text value="Data set"/>
          </else>
        </choose>
      </else-if>
    </choose>
  </macro>
  <macro name="publisher">
    <choose>
      <if type="report" match="any">
        <group delimiter=": ">
          <text variable="publisher-place"/>
          <text variable="publisher"/>
        </group>
      </if>
      <else-if type="thesis" match="any">
        <group delimiter=", ">
          <text variable="publisher"/>
          <text variable="publisher-place"/>
        </group>
      </else-if>
      <else-if type="patent">
        <group delimiter=": ">
          <text variable="publisher-place"/>
          <choose>
            <if variable="publisher">
              <text variable="publisher"/>
            </if>
            <else>
              <text variable="authority"/>
            </else>
          </choose>
        </group>
      </else-if>
      <else-if type="post-weblog webpage" match="none">
        <group delimiter=", ">
          <choose>
            <if variable="event version" type="speech dataset motion_picture" match="none">
              <!-- Including version is to avoid printing the programming language for computerProgram /-->
              <text variable="genre"/>
            </if>
          </choose>
          <choose>
            <if type="article-journal article-magazine article-newspaper" match="none">
              <group delimiter=": ">
                <choose>
                  <if variable="publisher-place">
                    <text variable="publisher-place"/>
                  </if>
                  <else>
                    <text variable="event-place"/>
                  </else>
                </choose>
                <text variable="publisher"/>
              </group>
            </if>
          </choose>
        </group>
      </else-if>
    </choose>
  </macro>
  <macro name="event">
    <choose>
      <if variable="container-title" match="none">
        <choose>
          <if variable="event">
            <choose>
              <if variable="genre" match="none">
                <text term="presented at" text-case="capitalize-first" suffix=" "/>
                <text variable="event"/>
              </if>
              <else>
                <group delimiter=" ">
                  <text variable="genre" text-case="capitalize-first"/>
                  <text term="presented at"/>
                  <text variable="event"/>
                </group>
              </else>
            </choose>
          </if>
          <else-if type="speech">
            <text variable="genre" text-case="capitalize-first"/>
          </else-if>
        </choose>
      </if>
    </choose>
  </macro>
  <macro name="issued">
    <choose>
      <if type="bill legal_case legislation" match="any"/>
      <else-if variable="issued">
        <group>
          <date variable="issued">
            <date-part name="year"/>
          </date>
          <text variable="year-suffix"/>
          <choose>
            <if type="speech" match="any">
              <date variable="issued" delimiter=" ">
                <date-part prefix=", " name="month"/>
              </date>
            </if>
            <else-if type="article article-magazine article-newspaper broadcast interview pamphlet personal_communication post post-weblog treaty webpage" match="any">
              <date variable="issued">
                <date-part prefix=", " name="month"/>
                <date-part prefix=" " name="day"/>
              </date>
            </else-if>
            <!-- Only year: article-journal chapter entry entry-dictionary entry-encyclopedia dataset figure graphic motion_picture manuscript map musical_score paper-conference patent report review review-book song thesis -->
          </choose>
        </group>
      </else-if>
      <else-if variable="status">
        <group>
          <text variable="status" text-case="lowercase"/>
          <text variable="year-suffix" prefix="-"/>
        </group>
      </else-if>
      <else>
        <group>
          <text term="no date" form="short"/>
          <text variable="year-suffix" prefix="-"/>
        </group>
      </else>
    </choose>
  </macro>
  <macro name="issued-sort">
    <choose>
      <if type="article article-magazine article-newspaper broadcast interview pamphlet personal_communication post post-weblog speech treaty webpage" match="any">
        <date variable="issued">
          <date-part name="year"/>
          <date-part name="month"/>
          <date-part name="day"/>
        </date>
      </if>
      <else>
        <date variable="issued">
          <date-part name="year"/>
        </date>
      </else>
    </choose>
  </macro>
  <macro name="issued-year">
    <choose>
      <if variable="issued">
        <group delimiter="/">
          <choose>
            <if is-uncertain-date="original-date">
              <group prefix="[" suffix="]" delimiter=" ">
                <text term="circa" form="short"/>
                <date variable="original-date">
                  <date-part name="year"/>
                </date>
              </group>
            </if>
            <else>
              <date variable="original-date">
                <date-part name="year"/>
              </date>
            </else>
          </choose>
          <choose>
            <if is-uncertain-date="issued">
              <group prefix="[" suffix="]" delimiter=" ">
                <text term="circa" form="short"/>
                <group>
                  <date variable="issued">
                    <date-part name="year"/>
                  </date>
                  <text variable="year-suffix"/>
                </group>
              </group>
            </if>
            <else>
              <group>
                <date variable="issued">
                  <date-part name="year"/>
                </date>
                <text variable="year-suffix"/>
              </group>
            </else>
          </choose>
        </group>
      </if>
      <else-if variable="status">
        <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>
  <macro name="original-date">
    <choose>
      <if type="bill legal_case legislation" match="any"/>
      <else-if type="speech" match="any">
        <date variable="original-date" delimiter=" ">
          <date-part name="month"/>
          <date-part name="year"/>
        </date>
      </else-if>
      <else-if type="article article-magazine article-newspaper broadcast interview pamphlet personal_communication post post-weblog treaty webpage" match="any">
        <date variable="original-date" form="text"/>
      </else-if>
      <else>
        <date variable="original-date">
          <date-part name="year"/>
        </date>
      </else>
    </choose>
  </macro>
  <macro name="original-published">
    <!--This should be localized -->
    <choose>
      <if type="bill legal_case legislation" match="any"/>
      <else-if type="broadcast interview motion_picture song">
        <text value="Original work recorded"/>
      </else-if>
      <else-if type="broadcast">
        <text value="Original work broadcast"/>
      </else-if>
      <else>
        <text value="Original work published"/>
      </else>
    </choose>
  </macro>
  <macro name="edition">
    <choose>
      <if is-numeric="edition">
        <group delimiter=" ">
          <number variable="edition" form="ordinal"/>
          <text term="edition" form="short"/>
        </group>
      </if>
      <else>
        <text variable="edition"/>
      </else>
    </choose>
  </macro>
  <macro name="locators">
    <choose>
      <if type="article-journal article-magazine" match="any">
        <group prefix=", " delimiter=", ">
          <group>
            <text variable="volume" font-style="italic"/>
            <text variable="issue" prefix="(" suffix=")"/>
          </group>
          <text variable="page"/>
        </group>
        <choose>
          <!--for advanced online publication-->
          <if variable="issued">
            <choose>
              <if variable="page issue" match="none">
                <text variable="status" text-case="capitalize-first" prefix=". "/>
              </if>
            </choose>
          </if>
        </choose>
      </if>
      <else-if type="article-newspaper">
        <group delimiter=" " prefix=", ">
          <label variable="page" form="short"/>
          <text variable="page"/>
        </group>
      </else-if>
      <else-if type="book graphic motion_picture report song chapter paper-conference entry-encyclopedia entry-dictionary" match="any">
        <group prefix=" (" suffix=")" delimiter=", ">
          <choose>
            <if type="report" match="none">
              <!-- edition for report is included in title-plus-extra /-->
              <text macro="edition"/>
            </if>
          </choose>
          <choose>
            <if variable="volume" match="any">
              <group>
                <text term="volume" form="short" text-case="capitalize-first" suffix=" "/>
                <number variable="volume" form="numeric"/>
              </group>
            </if>
            <else>
              <group>
                <text term="volume" form="short" plural="true" text-case="capitalize-first" suffix=" "/>
                <number variable="number-of-volumes" form="numeric" prefix="1&#8211;"/>
              </group>
            </else>
          </choose>
          <group>
            <label variable="page" form="short" suffix=" "/>
            <text variable="page"/>
          </group>
        </group>
      </else-if>
      <else-if type="legal_case">
        <group prefix=" (" suffix=")" delimiter=" ">
          <text variable="authority"/>
          <choose>
            <if variable="container-title" match="any">
              <!--Only print year for cases published in reporters-->
              <date variable="issued" form="numeric" date-parts="year"/>
            </if>
            <else>
              <date variable="issued" form="text"/>
            </else>
          </choose>
        </group>
      </else-if>
      <else-if type="bill legislation" match="any">
        <date variable="issued" prefix=" (" suffix=")">
          <date-part name="year"/>
        </date>
      </else-if>
    </choose>
  </macro>
  <macro name="citation-locator">
    <group>
      <choose>
        <if locator="chapter">
          <label variable="locator" form="long" text-case="capitalize-first"/>
        </if>
        <else>
          <label variable="locator" form="short"/>
        </else>
      </choose>
      <text variable="locator" prefix=" "/>
    </group>
  </macro>
  <macro name="container">
    <choose>
      <if type="post-weblog webpage" match="none">
        <group>
          <choose>
            <if type="chapter paper-conference entry-encyclopedia" match="any">
              <text term="in" text-case="capitalize-first" suffix=" "/>
            </if>
          </choose>
          <group delimiter=", ">
            <text macro="container-contributors"/>
            <text macro="secondary-contributors"/>
            <text macro="container-title"/>
          </group>
        </group>
      </if>
    </choose>
  </macro>
  <macro name="container-title">
    <choose>
      <if type="article article-journal article-magazine article-newspaper" match="any">
        <text variable="container-title" font-style="italic" text-case="title"/>
      </if>
      <else-if type="bill legal_case legislation" match="none">
        <text variable="container-title" font-style="italic"/>
      </else-if>
    </choose>
  </macro>
  <macro name="legal-cites">
    <choose>
      <if type="legal_case" match="any">
        <group prefix=", " delimiter=" ">
          <choose>
            <if variable="container-title">
              <text variable="volume"/>
              <text variable="container-title"/>
              <group delimiter=" ">
                <!--change to label variable="section" as that becomes available -->
                <text term="section" form="symbol"/>
                <text variable="section"/>
              </group>
              <text variable="page"/>
            </if>
            <else>
              <text variable="number" prefix="No. "/>
            </else>
          </choose>
        </group>
      </if>
      <else-if type="bill legislation" match="any">
        <group delimiter=", " prefix=", ">
          <choose>
            <if variable="number">
              <!--There's a public law number-->
              <text variable="number" prefix="Pub. L. No. "/>
              <group delimiter=" ">
                <!--change to label variable="section" as that becomes available -->
                <text term="section" form="symbol"/>
                <text variable="section"/>
              </group>
              <group delimiter=" ">
                <text variable="volume"/>
                <text variable="container-title"/>
                <text variable="page-first"/>
              </group>
            </if>
            <else>
              <group delimiter=" ">
                <text variable="volume"/>
                <text variable="container-title"/>
                <!--change to label variable="section" as that becomes available -->
                <text term="section" form="symbol"/>
                <text variable="section"/>
              </group>
            </else>
          </choose>
        </group>
      </else-if>
    </choose>
  </macro>
  <citation et-al-min="6" et-al-use-first="1" et-al-subsequent-min="3" et-al-subsequent-use-first="1" disambiguate-add-year-suffix="true" disambiguate-add-names="true" disambiguate-add-givenname="true" collapse="year" givenname-disambiguation-rule="primary-name">
    <sort>
      <key macro="author" names-min="8" names-use-first="6"/>
      <key macro="issued-sort"/>
    </sort>
    <layout prefix="(" suffix=")" delimiter="; ">
      <group delimiter=", ">
        <text macro="author-short"/>
        <text macro="issued-year"/>
        <text macro="citation-locator"/>
      </group>
    </layout>
  </citation>
  <bibliography hanging-indent="true" et-al-min="8" et-al-use-first="6" et-al-use-last="true" entry-spacing="0" line-spacing="2">
    <sort>
      <key macro="author"/>
      <key macro="issued-sort" sort="ascending"/>
      <key macro="title"/>
    </sort>
    <layout>
      <group suffix=".">
        <group delimiter=". ">
          <text macro="author"/>
          <choose>
            <if is-uncertain-date="issued">
              <group prefix=" [" suffix="]" delimiter=" ">
                <text term="circa" form="short"/>
                <text macro="issued"/>
              </group>
            </if>
            <else>
              <text macro="issued" prefix=" (" suffix=")"/>
            </else>
          </choose>
          <text macro="title-plus-extra"/>
          <text macro="container"/>
        </group>
        <text macro="legal-cites"/>
        <text macro="locators"/>
        <group delimiter=", " prefix=". ">
          <text macro="event"/>
          <text macro="publisher"/>
        </group>
      </group>
      <text macro="access" prefix=" "/>
      <choose>
        <if is-uncertain-date="original-date">
          <group prefix=" [" suffix="]" delimiter=" ">
            <text macro="original-published"/>
            <text term="circa" form="short"/>
            <text macro="original-date"/>
          </group>
        </if>
        <else-if variable="original-date">
          <group prefix=" (" suffix=")" delimiter=" ">
            <text macro="original-published"/>
            <text macro="original-date"/>
          </group>
        </else-if>
      </choose>
    </layout>
  </bibliography>
</style>
<<===== CSL =====<<

>>===== INPUT =====>>
[
    {
        "author": [
            {
                "family": "FamilyA",
                "given": "GivenA D."
            },
            {
                "family": "FamilyB",
                "given": "GivenB P."
            }
        ],
        "container-title": "Container Title01",
        "id": "ITEM-1",
        "issued": {
            "date-parts": [
                [
                    2003,
                    1
                ]
            ]
        },
        "title": "Title01",
        "type": "article-journal"
    },
    {
        "author": [
            {
                "family": "FamilyA",
                "given": "GivenA D."
            },
            {
                "family": "FamilyC",
                "given": "GivenC1 GivenC2"
            },
            {
                "literal": "others"
            }
        ],
        "container-title": "Container Title02",
        "id": "ITEM-2",
        "issued": {
            "date-parts": [
                [
                    2007,
                    1
                ]
            ]
        },
        "title": "Title02",
        "type": "article-journal"
    }
]
<<===== INPUT =====<<


>>===== VERSION =====>>
1.0
<<===== VERSION =====<<

Here's my test and incomplete fix: tarleb@50be24a

jgm commented

Ah wait - need to change mode to bibliography.

jgm commented

And then the bug is visible.

jgm commented

Your fix and test case look good to me!

Thanks, I can complete the fix tomorrow. It currently produces instead of et al..

I tried to keep the fix as minimal as possible. I'm not 100% that I considered all edge cases, but all tests pass.