jgm / citeproc

CSL citation processing library in Haskell
BSD 2-Clause "Simplified" License
154 stars 17 forks source link

citation-label uses accessed instead of issued date #80

Closed phiresky closed 3 years ago

phiresky commented 3 years ago

Command:

pandoc -i content.md --citeproc --bibliography bib.json --csl style.csl

Output:

<p><span class="citation" data-cites="ppo">[SWDR21]</span></p>

Expected Output:

<p><span class="citation" data-cites="ppo">[SWDR17]</span></p>

If I remove the "accessed" field completely from the json, the problem goes away.

The related code is probably somewhere here: https://github.com/jgm/citeproc/blob/7cbd847da4b5a95fd28b666c48c6bdc80247cde6/src/Citeproc/Eval.hs#L2549

content.md

[@ppo]

bib.json

[
  {
    "URL": "http://arxiv.org/abs/1707.06347",
    "author": [
      {
        "family": "Schulman",
        "given": "John"
      },
      {
        "family": "Wolski",
        "given": "Filip"
      },
      {
        "family": "Dhariwal",
        "given": "Prafulla"
      },
      {
        "family": "Radford",
        "given": "Alec"
      },
      {
        "family": "Klimov",
        "given": "Oleg"
      }
    ],
    "container-title": "arXiv:1707.06347 [cs]",
    "id": "ppo",
    "issued": {
      "date-parts": [[2017, 8]]
    },
    "accessed": {
      "date-parts": [[2021, 7, 19]]
    },
    "keyword": "Computer Science - Machine Learning",
    "note": "arXiv: 1707.06347",
    "title": "Proximal Policy Optimization Algorithms",
    "type": "article-journal"
  }
]

style.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="sort-only">
  <info>
    <title>IEEE (with URL, alphanumeric)</title>
    <id>http://www.zotero.org/styles/ieee-with-url</id>
    <link href="http://www.zotero.org/styles/ieee-with-url" rel="self"/>
    <link href="https://ieeeauthorcenter.ieee.org/wp-content/uploads/IEEE-Reference-Guide.pdf" rel="documentation"/>
    <link href="https://journals.ieeeauthorcenter.ieee.org/your-role-in-article-production/ieee-editorial-style-manual/" rel="documentation"/>
    <author>
      <name>Michael Berkowitz</name>
      <email>mberkowi@gmu.edu</email>
    </author>
    <contributor>
      <name>Julian Onions</name>
      <email>julian.onions@gmail.com</email>
    </contributor>
    <contributor>
      <name>Rintze Zelle</name>
      <uri>http://twitter.com/rintzezelle</uri>
    </contributor>
    <contributor>
      <name>Stephen Frank</name>
      <uri>http://www.zotero.org/sfrank</uri>
    </contributor>
    <contributor>
      <name>Sebastian Karcher</name>
    </contributor>
    <category citation-format="numeric"/>
    <category field="engineering"/>
    <category field="generic-base"/>
    <summary>IEEE style with URLs as per the 2018 guidelines, V 11.12.2018.</summary>
    <updated>2019-12-20T09:20:25+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="chapter" form="short">ch.</term>
      <term name="presented at">presented at the</term>
      <term name="available at">available</term>
    </terms>
  </locale>
  <!-- Macros -->
  <macro name="edition">
    <choose>
      <if type="bill book chapter graphic legal_case legislation motion_picture paper-conference report song" match="any">
        <choose>
          <if is-numeric="edition">
            <group delimiter=" ">
              <number variable="edition" form="ordinal"/>
              <text term="edition" form="short"/>
            </group>
          </if>
          <else>
            <text variable="edition" text-case="capitalize-first" suffix="."/>
          </else>
        </choose>
      </if>
    </choose>
  </macro>
  <macro name="issued">
    <choose>
      <if type="article-journal report" match="any">
        <date variable="issued">
          <date-part name="month" form="short" suffix=" "/>
          <date-part name="year" form="long"/>
        </date>
      </if>
      <else-if type="bill book chapter graphic legal_case legislation motion_picture paper-conference song thesis" match="any">
        <date variable="issued">
          <date-part name="year" form="long"/>
        </date>
      </else-if>
      <else>
        <date variable="issued">
          <date-part name="day" form="numeric-leading-zeros" suffix="-"/>
          <date-part name="month" form="short" suffix="-" strip-periods="true"/>
          <date-part name="year" form="long"/>
        </date>
      </else>
    </choose>
  </macro>
  <macro name="author">
    <names variable="author">
      <name and="text" et-al-min="7" et-al-use-first="1" initialize-with=". "/>
      <label form="short" prefix=", " text-case="capitalize-first"/>
      <et-al font-style="italic"/>
      <substitute>
        <names variable="editor"/>
        <names variable="translator"/>
      </substitute>
    </names>
  </macro>
  <macro name="editor">
    <names variable="editor">
      <name initialize-with=". " delimiter=", " and="text"/>
      <label form="short" prefix=", " text-case="capitalize-first"/>
    </names>
  </macro>
  <macro name="locators">
    <group delimiter=", ">
      <text macro="edition"/>
      <group delimiter=" ">
        <text term="volume" form="short"/>
        <number variable="volume" form="numeric"/>
      </group>
      <group delimiter=" ">
        <number variable="number-of-volumes" form="numeric"/>
        <text term="volume" form="short" plural="true"/>
      </group>
      <group delimiter=" ">
        <text term="issue" form="short"/>
        <number variable="issue" form="numeric"/>
      </group>
    </group>
  </macro>
  <macro name="title">
    <choose>
      <if type="bill book graphic legal_case legislation motion_picture song" match="any">
        <text variable="title" font-style="italic"/>
      </if>
      <else>
        <text variable="title" quotes="true"/>
      </else>
    </choose>
  </macro>
  <macro name="publisher">
    <choose>
      <if type="bill book chapter graphic legal_case legislation motion_picture paper-conference song" match="any">
        <group delimiter=": ">
          <text variable="publisher-place"/>
          <text variable="publisher"/>
        </group>
      </if>
      <else>
        <group delimiter=", ">
          <text variable="publisher"/>
          <text variable="publisher-place"/>
        </group>
      </else>
    </choose>
  </macro>
  <macro name="event">
    <choose>
      <if type="paper-conference speech" match="any">
        <choose>
          <!-- Published Conference Paper -->
          <if variable="container-title">
            <group delimiter=", ">
              <group delimiter=" ">
                <text term="in"/>
                <text variable="container-title" font-style="italic"/>
              </group>
              <text variable="event-place"/>
            </group>
          </if>
          <!-- Unpublished Conference Paper -->
          <else>
            <group delimiter=", ">
              <group delimiter=" ">
                <text term="presented at"/>
                <text variable="event"/>
              </group>
              <text variable="event-place"/>
            </group>
          </else>
        </choose>
      </if>
    </choose>
  </macro>
  <macro name="access">
    <choose>
      <if variable="URL">
        <group delimiter=". ">
          <group delimiter=": ">
            <text term="available at" text-case="capitalize-first"/>
            <text variable="URL"/>
          </group>
          <group prefix="[" suffix="]" delimiter=": ">
            <text term="accessed" text-case="capitalize-first"/>
            <date variable="accessed">
              <date-part name="day" form="numeric-leading-zeros" suffix="-"/>
              <date-part name="month" form="short" suffix="-" strip-periods="true"/>
              <date-part name="year" form="long"/>
            </date>
          </group>
        </group>
      </if>
    </choose>
  </macro>
  <macro name="page">
    <group>
      <label variable="page" form="short" suffix=" "/>
      <text variable="page"/>
    </group>
  </macro>
  <macro name="citation-locator">
    <group delimiter=" ">
      <choose>
        <if locator="page">
          <label variable="locator" form="short"/>
        </if>
        <else>
          <label variable="locator" form="short" text-case="capitalize-first"/>
        </else>
      </choose>
      <text variable="locator"/>
    </group>
  </macro>
  <macro name="doi">
    <text variable="DOI" prefix="doi: "/>
  </macro>
  <!-- Citation -->
  <citation collapse="citation-number">
    <sort>
      <key variable="citation-number"/>
    </sort>
     <layout prefix="[" suffix="]" delimiter="; ">
      <group delimiter=", ">
        <text variable="citation-label"/>
        <group>
          <label variable="locator" form="short"/>
          <text variable="locator"/>
        </group>
      </group>
    </layout>
  </citation>
  <!-- Bibliography -->
  <bibliography entry-spacing="0" second-field-align="flush">
    <layout>
      <!-- Citation Number -->
      <text variable="citation-label" prefix="[" suffix="] "/>
      <!-- Author(s) -->
      <text macro="author" suffix=", "/>
      <!-- Rest of Citation -->
      <group suffix=". ">
        <choose>
          <!-- Specific Formats -->
          <if type="article-journal">
            <group delimiter=", ">
              <text macro="title"/>
              <text variable="container-title" font-style="italic" form="short"/>
              <text macro="locators"/>
              <text macro="page"/>
              <text macro="issued"/>
              <text macro="doi" suffix="."/>
            </group>
          </if>
          <else-if type="paper-conference">
            <group delimiter=", ">
              <text macro="title"/>
              <text macro="event"/>
              <text macro="issued"/>
              <text macro="locators"/>
              <text macro="page"/>
              <text macro="doi"/>
            </group>
          </else-if>
          <else-if type="report">
            <group delimiter=", ">
              <text macro="title"/>
              <text macro="publisher"/>
              <group delimiter=" ">
                <text variable="genre"/>
                <text variable="number"/>
              </group>
              <text macro="issued"/>
            </group>
          </else-if>
          <else-if type="thesis">
            <group delimiter=", ">
              <text macro="title"/>
              <text variable="genre"/>
              <text macro="publisher"/>
              <text macro="issued"/>
            </group>
          </else-if>
          <else-if type="webpage post post-weblog" match="any">
            <group delimiter=", " suffix=". ">
              <text macro="title"/>
              <text variable="container-title" font-style="italic"/>
              <text macro="issued"/>
            </group>
          </else-if>
          <else-if type="patent">
            <text macro="title" suffix=", "/>
            <text variable="number"/>
            <text macro="issued"/>
          </else-if>
          <!-- Generic/Fallback Formats -->
          <else-if type="bill book graphic legal_case legislation motion_picture report song" match="any">
            <group delimiter=", " suffix=". ">
              <text macro="title"/>
              <text macro="locators"/>
            </group>
            <group delimiter=", ">
              <text macro="publisher"/>
              <text macro="issued"/>
              <text macro="page"/>
            </group>
          </else-if>
          <else-if type="article-magazine article-newspaper broadcast interview manuscript map patent personal_communication song speech thesis webpage" match="any">
            <group delimiter=", ">
              <text macro="title"/>
              <text variable="container-title" font-style="italic"/>
              <text macro="locators"/>
              <text macro="publisher"/>
              <text macro="page"/>
              <text macro="issued"/>
            </group>
          </else-if>
          <else-if type="chapter paper-conference" match="any">
            <group delimiter=", " suffix=", ">
              <text macro="title"/>
              <group delimiter=" ">
                <text term="in"/>
                <text variable="container-title" font-style="italic"/>
              </group>
              <text macro="locators"/>
            </group>
            <text macro="editor" suffix=" "/>
            <group delimiter=", ">
              <text macro="publisher"/>
              <text macro="issued"/>
              <text macro="page"/>
            </group>
          </else-if>
          <else>
            <group delimiter=", " suffix=". ">
              <text macro="title"/>
              <text variable="container-title" font-style="italic"/>
              <text macro="locators"/>
            </group>
            <group delimiter=", ">
              <text macro="publisher"/>
              <text macro="page"/>
              <text macro="issued"/>
            </group>
          </else>
        </choose>
        <choose>
          <if variable="URL">
            <text value=" [Online]"/>
          </if>
        </choose>
      </group>
      <text macro="access"/>
    </layout>
  </bibliography>
</style>
jgm commented 3 years ago

Sure enough, we're just taking the first date variable in the list. How should it work? Should this always be issued (and nothing if there is no issued variable)? Or should it try for issued and fall back to something else?

phiresky commented 3 years ago

In general I'd say it should use the same logic as is used for the year in normal author-year styles.. seems to work "as expected" for those? The accessed date would be wrong there too..

Other than that, I'd say it should maybe be issued, fall back to submitted, then either fall back to accessed or directly throw an error / show ??.

jgm commented 3 years ago

it should use the same logic as is used for the year in normal author-year styles

There's no fixed logic for this; it all depends on the CSL style. But in chicago-author-date, it goes issued -> status -> no-date term.

jgm commented 3 years ago

See https://github.com/citation-style-language/schema/issues/295 It looks like CSL is moving to making the citation label generation explicit in styles. So in the future this will have to be handled differently, but for now I can just change the code to privilege issued.

phiresky commented 3 years ago

it all depends on the CSL style

Ah, didn't know that. And I guess it's not flexible in the "label" style since for some reason no one uses it? Then yeah forcing it to use issued seems like a good idea.

jgm commented 3 years ago

Note that you can explicitly specify a citation-label variable in your bibliography, to avoid the autogenerated one.