Skip to content

The delimiter attribute of <group> is not applied to items inside <choose> #180

@csimide

Description

@csimide

Consider the following CSL snippet:

<group delimiter=". ">
  <text value="v0"/> 
  <text value="v1"/>
  <choose>
    <if type="book">
      <text value="v2"/>
      <text value="v3"/>
    </if>
  </choose>
</group>
The complete test CSL file
<?xml version="1.0" encoding="utf-8"?>
<style xmlns="http://purl.org/net/xbiblio/csl" version="1.0" class="in-text" name-as-sort-order="all" sort-separator=" " demote-non-dropping-particle="never" initialize-with=" " initialize-with-hyphen="false" page-range-format="expanded" default-locale="zh-CN">
  <info>
    <title>test</title>
    <id>http://test</id>
    <category citation-format="numeric"/>
    <category field="generic-base"/>
  </info>
  <macro name="entry-layout">
    <group delimiter=". ">
      <text value="v0"/> 
      <text value="v1"/>
      <choose>
        <if type="book">
          <text value="v2"/>
          <text value="v3"/>
        </if>
      </choose>
    </group>
  </macro>
  <citation collapse="citation-number" after-collapse-delimiter=",">
    <sort>
      <key variable="citation-number"/>
    </sort>
    <layout vertical-align="sup" delimiter="," prefix="[" suffix="]">
      <text variable="citation-number"/>
    </layout>
  </citation>
  <bibliography>
    <layout>
      <text variable="citation-number" prefix="[" suffix="]"/>
      <text macro="entry-layout"/>
    </layout>
  </bibliography>
</style>

Expected reference output: v0. v1. v2. v3
Actual reference output in Typst: v0. v1. v2v3

image

I noticed that when <group> contains <choose>, the group delimiter is not applied to elements inside <choose>. Instead, <choose> is treated as a group without a delimiter.

This behavior is inconsistent with reference management software like Zotero. In the CSL 1.0.2 documentation, it is stated:

Delimiters from the nearest delimiting element are applied within the output of cs:choose (i.e., the output of the matching cs:if, cs:else-if, or cs:else; see delimiter).

src: https://docs.citationstyles.org/en/stable/specification.html#choose


P.S. Currently, this issue can be mitigated by nesting <group delimiter=". "> inside <choose>. However, this means that additional modifications to the CSL are required for it to work with Typst.

Example
<group delimiter=". ">
  <text value="v0"/> 
  <text value="v1"/>
  <choose>
    <if type="book">
      <group delimiter=". "> <!-- Add a nested group -->
        <text value="v2"/>
        <text value="v3"/>
      </group>  <!-- Add a nested group -->
    </if>
  </choose>
</group>

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions