diff --git a/CHANGELOG.md b/CHANGELOG.md
index b41960a..38a5608 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,13 @@
 
 `Inara` uses [SemVer][] (semantic versioning).
 
+## UNRELEASED
+
+- Support for annotating contributor roles with the Contribution Role Taxonomy (CRediT).
+  A text table is generated at the bottom of the PDF and preprint template containing
+  this information. As of https://github.com/jgm/pandoc/pull/10153, Pandoc will generate
+  conformant JATS containing contibutor roles. (https://github.com/openjournals/inara/pull/87)
+
 ## Inara v1.1.4
 
 Released 2024-11-06.
diff --git a/Dockerfile b/Dockerfile
index 63b31b0..60c8876 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,4 +1,6 @@
-FROM pandoc/latex:3.2.0-alpine
+# WARNING: this PR contains changes to pandoc from https://github.com/jgm/pandoc/pull/10153
+# that aren't yet released. They should land in the 3.6.3 future version
+FROM pandoc/latex:3.6.3-alpine
 
 RUN apk add --no-cache ttf-hack
 
diff --git a/data/defaults/jats.yaml b/data/defaults/jats.yaml
index 79bff5a..1799ec7 100644
--- a/data/defaults/jats.yaml
+++ b/data/defaults/jats.yaml
@@ -18,3 +18,6 @@ filters:
     # do it here for that reason.
     type: lua
     path: orcid-uri.lua
+
+  - type: lua
+    path: prepare-credit.lua
diff --git a/data/defaults/pdf.yaml b/data/defaults/pdf.yaml
index 01b2096..0f4f6b9 100644
--- a/data/defaults/pdf.yaml
+++ b/data/defaults/pdf.yaml
@@ -11,6 +11,8 @@ filters:
     path: self-citation.lua
   - type: lua
     path: fix-bibentry-spacing.lua
+  - type: lua
+    path: prepare-credit.lua
 variables:
   # styling options
   colorlinks: true
diff --git a/data/defaults/preprint.yaml b/data/defaults/preprint.yaml
index be33e27..10465f4 100644
--- a/data/defaults/preprint.yaml
+++ b/data/defaults/preprint.yaml
@@ -1,6 +1,9 @@
 to: latex
 output-file: paper.preprint.tex
 template: preprint.latex
+filters:
+  - type: lua
+    path: prepare-credit.lua
 variables:
   # styling options
   colorlinks: true
diff --git a/data/defaults/tex.yaml b/data/defaults/tex.yaml
index ec1b242..5b1ef3d 100644
--- a/data/defaults/tex.yaml
+++ b/data/defaults/tex.yaml
@@ -11,6 +11,8 @@ filters:
     path: self-citation.lua
   - type: lua
     path: fix-bibentry-spacing.lua
+  - type: lua
+    path: prepare-credit.lua
 variables:
   # styling options
   colorlinks: true
diff --git a/data/filters/prepare-credit.lua b/data/filters/prepare-credit.lua
new file mode 100644
index 0000000..37af1b2
--- /dev/null
+++ b/data/filters/prepare-credit.lua
@@ -0,0 +1,227 @@
+-- Checks if any contributor information is available
+
+local roles = {
+    ["conceptualization"] = {
+        name = "Conceptualization",
+        id = "8b73531f-db56-4914-9502-4cc4d4d8ed73",
+        uri = "https://credit.niso.org/contributor-roles/conceptualization/"
+    },
+    ["data-curation"] = {
+        name = "Data curation",
+        id = "f93e0f44-f2a4-4ea1-824a-4e0853b05c9d",
+        uri = "https://credit.niso.org/contributor-roles/data-curation/"
+    },
+    ["formal-analysis"] = {
+        name = "Formal analysis",
+        id = "95394cbd-4dc8-4735-b589-7e5f9e622b3f",
+        uri = "https://credit.niso.org/contributor-roles/formal-analysis/"
+    },
+    ["funding-acquisition"] = {
+        name = "Funding acquisition",
+        id = "34ff6d68-132f-4438-a1f4-fba61ccf364a",
+        uri = "https://credit.niso.org/contributor-roles/funding-acquisition/"
+    },
+    ["investigation"] = {
+        name = "Investigation",
+        id = "2451924d-425e-4778-9f4c-36c848ca70c2",
+        uri = "https://credit.niso.org/contributor-roles/investigation/"
+    },
+    ["methodology"] = {
+        name = "Methodology",
+        id = "f21e2be9-4e38-4ab7-8691-d6f72d5d5843",
+        uri = "https://credit.niso.org/contributor-roles/methodology/"
+    },
+    ["project-administration"] = {
+        name = "Project administration",
+        id = "a693fe76-ea33-49ad-9dcc-5e4f3ac5f938",
+        uri = "https://credit.niso.org/contributor-roles/project-administration/"
+    },
+    ["resources"] = {
+        name = "Resources",
+        id = "ebd781f0-bf79-492c-ac21-b31b9c3c990c",
+        uri = "https://credit.niso.org/contributor-roles/resources/"
+    },
+    ["software"] = {
+        name = "Software",
+        id = "f89c5233-01b0-4778-93e9-cc7d107aa2c8",
+        uri = "https://credit.niso.org/contributor-roles/software/"
+    },
+    ["supervision"] = {
+        name = "Supervision",
+        id = "0c8ca7d4-06ad-4527-9cea-a8801fcb8746",
+        uri = "https://credit.niso.org/contributor-roles/supervision/"
+    },
+    ["validation"] = {
+        name = "Validation",
+        id = "4b1bf348-faf2-4fc4-bd66-4cd3a84b9d44",
+        uri = "https://credit.niso.org/contributor-roles/validation/"
+    },
+    ["visualization"] = {
+        name = "Visualization",
+        id = "76b9d56a-e430-4e0a-84c9-59c11be343ae",
+        uri = "https://credit.niso.org/contributor-roles/visualization/"
+    },
+    ["writing-original-draft"] = {
+        name = "Writing – original draft",
+        id = "43ebbd94-98b4-42f1-866b-c930cef228ca",
+        uri = "https://credit.niso.org/contributor-roles/writing-original-draft/"
+    },
+    ["writing-review-editing"] = {
+        name = "Writing – review & editing",
+        id = "d3aead86-f2a2-47f7-bb99-79de6421164d",
+        uri = "https://credit.niso.org/contributor-roles/writing-review-editing/"
+    }
+}
+
+-- An enumeration of the JATS-recommended degrees of contribution
+degrees = pandoc.List {
+    "Lead",
+    "Supporting",
+    "Equal"
+}
+
+-- Check if the given string is one of the 14 valid
+-- CRediT identifiers by looking at the `roles` dict
+-- defined above
+function invalidCreditID(str)
+    return roles[str] == nil
+end
+
+-- Check if the degree contribution is valid based on the JATS recommendation,
+-- see https://jats.taylorandfrancis.com/jats-guide/topics/author-contributions-credit/#degree-of-contribution
+function invalidDegree(str)
+    return not degrees:includes(str)
+end
+
+function join_with_commas_and(list)
+    local len = #list
+    if len == 0 then
+        return ""
+    elseif len == 1 then
+        return list[1]
+    elseif len == 2 then
+        return list[1] .. " & " .. list[2]
+    else
+        local result = table.concat(list, ", ", 1, len - 1)
+        return result .. ", & " .. list[len]
+    end
+end
+
+function capitalize_first_letter(str)
+    return str:sub(1, 1):upper() .. str:sub(2)
+end
+
+-- If the data is just a string corresponding to a
+-- CRediT identifier, upgrade it to a dictionary,
+-- otherwise return it as is
+function clean_role_dict(d)
+    if d.credit then
+        return d
+    else
+        return { ["credit"] = pandoc.utils.stringify(d) }
+    end
+end
+
+local function prepare_credit (meta)
+    meta.hasRoles = false
+    for _, author in ipairs(meta.authors or {}) do
+        if author.roles then
+            roleList = {}
+            for _, roleDict in ipairs(author.roles) do
+                roleDict = clean_role_dict(roleDict)
+                credit_id = pandoc.utils.stringify(roleDict.credit)
+                if invalidCreditID(credit_id) then
+                    print("invalid credit ID for author " .. author.name .. ": " .. credit_id)
+                elseif roleDict.degree then
+                    degree = capitalize_first_letter(pandoc.utils.stringify(roleDict.degree))
+                    if invalidDegree(degree) then
+                        print("invalid degree for author " .. author.name .. ": " .. degree)
+                        -- even though the degree is invalid, add the role anyway
+                        table.insert(roleList, roles[credit_id].name)
+                    else
+                        table.insert(roleList, roles[credit_id].name .. " (" .. degree .. ")")
+                    end
+                else
+                    table.insert(roleList, roles[credit_id].name)
+                end
+            end
+            if #roleList > 0 then
+                meta.hasRoles = true
+                author.rolesString = join_with_commas_and(roleList)
+            end
+        end
+    end
+    return meta
+end
+
+function Meta (meta)
+    local ok, result = pcall(prepare_credit, meta)
+    if ok then
+        return result
+    end
+end
+
+function assertEqual(expected, actual)
+    assert(expected == actual, "got \"" .. actual .. "\", expected \"" .. expected .. "\"")
+end
+
+function tests()
+    assert("" == join_with_commas_and({ }))
+    assert("foo" == join_with_commas_and({ "foo" }))
+    assert("foo & bar" == join_with_commas_and({ "foo", "bar" }))
+    assert("foo, bar, & baz" == join_with_commas_and({ "foo", "bar", "baz" }))
+
+    local m1 = {
+        ["authors"] = {
+            {
+                ["name"] = "Author 1",
+                ["roles"] = {
+                    "methodology"
+                }
+            },
+            {
+                ["name"] = "Author 2",
+                ['roles'] = {
+                    { ["credit"] = "methodology" }
+                }
+            },
+            {
+                ["name"] = "Author 3",
+                ['roles'] = {
+                    { ["credit"] = "methodology" },
+                    { ["credit"] = "data-curation" },
+                    { ["credit"] = "conceptualization" },
+                }
+            },
+            {
+                ["name"] = "Author 4",
+                ['roles'] = {
+                    { ["credit"] = "methodology", ["degree"] = "lead" },
+                    { ["credit"] = "data-curation", ["degree"] = "supporting" },
+                    { ["credit"] = "conceptualization" },
+                }
+            },
+        }
+    }
+    local m1t = prepare_credit(m1)
+    assert(m1t.hasRoles, "hasRoles should be set to true")
+    assertEqual("Methodology", m1t['authors'][1].rolesString)
+    assertEqual("Methodology", m1t['authors'][2].rolesString)
+    assertEqual("Methodology, Data curation, & Conceptualization", m1t['authors'][3].rolesString)
+    assertEqual("Methodology (Lead), Data curation (Supporting), & Conceptualization", m1t['authors'][4].rolesString)
+
+    local m2 = {
+        ["authors"] = {
+            {
+                ["name"] = "Author 1"
+            },
+            {
+                ["name"] = "Author 2"
+            }
+        }
+    }
+    local m2t = prepare_credit(m2)
+    assert(not m2t.hasRoles, "hasRoles should be set to false")
+end
+
+tests()
diff --git a/data/templates/default.latex b/data/templates/default.latex
index d078560..f94513d 100644
--- a/data/templates/default.latex
+++ b/data/templates/default.latex
@@ -554,6 +554,17 @@ $if(lof)$
 $endif$
 $body$
 
+$if(hasRoles)$
+\section{Author Contributions}\label{author-contributions}
+\begin{enumerate}
+$for(authors)$
+$if(it.rolesString)$
+\item $it.name$ - $it.rolesString$
+$endif$
+$endfor$
+\end{enumerate}
+$endif$
+
 $if(natbib)$
 $if(bibliography)$
 $if(biblio-title)$
diff --git a/data/templates/preprint.latex b/data/templates/preprint.latex
index 51b85a6..f2d4dea 100644
--- a/data/templates/preprint.latex
+++ b/data/templates/preprint.latex
@@ -435,6 +435,17 @@ $if(has-frontmatter)$
 $endif$
 $body$
 
+$if(hasRoles)$
+\section{Author Contributions}\label{author-contributions}
+\begin{enumerate}
+$for(authors)$
+$if(it.rolesString)$
+\item $it.name$ - $it.rolesString$
+$endif$
+$endfor$
+\end{enumerate}
+$endif$
+
 $if(has-frontmatter)$
 \backmatter
 $endif$
diff --git a/example/paper.md b/example/paper.md
index 9c2e3fc..8599d07 100644
--- a/example/paper.md
+++ b/example/paper.md
@@ -7,14 +7,27 @@ authors:
     affiliation: "1, 2, 4"
     orcid: 0000-0002-9455-0796
     corresponding: true
+    roles:
+      - credit: software
+        degree: equal
+      - 'methodology'
   - name: Juanjo Bazán
     orcid: 0000-0001-7699-3983
     affiliation: [1]
     equal-contrib: true
+    roles:
+      - credit: software
+        degree: equal
   - name: Arfon M. Smith
     orcid: 0000-0002-3957-2474
     affiliation: [1, 3]
     equal-contrib: true
+    roles:
+      - credit: software
+        degree: equal
+      - credit: supervision
+        degree: lead
+
 affiliations:
   - index: 1
     name: Open Journals
@@ -365,6 +378,72 @@ authors:
   <!--     given-names: 瀧 -->
   <!--     surname: 立花 -->
 
+## Contributor Roles
+
+The [Contribution Role Taxonomy (CRediT)](https://credit.niso.org/contributor-roles) defines
+fourteen standard roles of authors. Each author can be annotated with one or more contribution
+roles.
+
+1. [conceptualization](https://credit.niso.org/contributor-roles/conceptualization)
+2. [data-curation](https://credit.niso.org/contributor-roles/data-curation)
+3. [formal-analysis](https://credit.niso.org/contributor-roles/formal-analysis)
+4. [funding-acquisition](https://credit.niso.org/contributor-roles/funding-acquisition)
+5. [investigation](https://credit.niso.org/contributor-roles/investigation)
+6. [methodology](https://credit.niso.org/contributor-roles/methodology)
+7. [project-administration](https://credit.niso.org/contributor-roles/project-administration)
+8. [resources](https://credit.niso.org/contributor-roles/resources)
+9. [software](https://credit.niso.org/contributor-roles/software)
+10. [supervision](https://credit.niso.org/contributor-roles/supervision)
+11. [validation](https://credit.niso.org/contributor-roles/validation)
+12. [visualization](https://credit.niso.org/contributor-roles/visualization)
+13. [writing-original-draft](https://credit.niso.org/contributor-roles/writing-original-draft)
+14. [writing-review-editing](https://credit.niso.org/contributor-roles/writing-review-editing)
+
+JATS also specifies three degrees which can be used to quantify the impact of a contribution:
+
+1. `Lead`
+2. `Supporting`
+3. `Equal` - for use if multiple equivalent leads
+
+Together, these can be used to identify which authors materially contributed to the paper,
+such as through `formal-analysis` or `data-curation` and which authors contributed immaterially,
+such as through `supervision`. It also allows for saying if multiple people made the same
+kind of contribution, who took the lead.
+
+```yaml
+authors:
+  - name: John Doe
+    affiliation: [ 1 ]
+    roles:
+      - credit: 'formal-analysis'
+        degree: 'lead'
+
+  - name: John Boss
+    affiliation: [ 1 ]
+    roles:
+      - credit: 'funding-acquisition'
+        degree: 'lead'
+      - credit: 'supervision'
+        degree: 'lead'
+```
+
+Roles are optional, and within roles, degrees are optional. It's possible to shorthand
+roles by using strings directly:
+
+```yaml
+authors:
+  - name: John Doe
+    affiliation: [ 1 ]
+    roles:
+      - 'formal-analysis'
+
+  - name: John Boss
+    affiliation: [ 1 ]
+    roles:
+      - 'funding-acquisition'
+      - 'supervision'
+```
+
 ## Affiliations
 
 Each affiliation requires an `index` and `name`.
diff --git a/test/expected-draft/paper.jats/paper.jats b/test/expected-draft/paper.jats/paper.jats
index 9ff56c8..f96e55b 100644
--- a/test/expected-draft/paper.jats/paper.jats
+++ b/test/expected-draft/paper.jats/paper.jats
@@ -28,6 +28,16 @@ publishing pipeline</article-title>
 <surname>Krewinkel</surname>
 <given-names>Albert</given-names>
 </name>
+<role vocab="credit" degree-contribution="Equal"
+      vocab-identifier="https://credit.niso.org/"
+      vocab-term-identifier="https://credit.niso.org/contributor-roles/software/"
+      vocab-term="Software"
+>Software</role>
+<role vocab="credit
+      vocab-identifier="https://credit.niso.org/"
+      vocab-term-identifier="https://credit.niso.org/contributor-roles/methodology/"
+      vocab-term="Methodology"
+>Methodology</role>
 <email>albert@zeitkraut.de</email>
 <xref ref-type="aff" rid="aff-1"/>
 <xref ref-type="aff" rid="aff-2"/>
@@ -40,6 +50,11 @@ publishing pipeline</article-title>
 <surname>Bazán</surname>
 <given-names>Juanjo</given-names>
 </name>
+<role vocab="credit" degree-contribution="Equal"
+      vocab-identifier="https://credit.niso.org/"
+      vocab-term-identifier="https://credit.niso.org/contributor-roles/software/"
+      vocab-term="Software"
+>Software</role>
 <xref ref-type="aff" rid="aff-1"/>
 </contrib>
 <contrib contrib-type="author" equal-contrib="yes">
@@ -48,6 +63,16 @@ publishing pipeline</article-title>
 <surname>Smith</surname>
 <given-names>Arfon M.</given-names>
 </name>
+<role vocab="credit" degree-contribution="Equal"
+      vocab-identifier="https://credit.niso.org/"
+      vocab-term-identifier="https://credit.niso.org/contributor-roles/software/"
+      vocab-term="Software"
+>Software</role>
+<role vocab="credit" degree-contribution="Lead"
+      vocab-identifier="https://credit.niso.org/"
+      vocab-term-identifier="https://credit.niso.org/contributor-roles/supervision/"
+      vocab-term="Supervision"
+>Supervision</role>
 <xref ref-type="aff" rid="aff-1"/>
 <xref ref-type="aff" rid="aff-3"/>
 </contrib>
@@ -520,6 +545,106 @@ Software should use an OSI-approved license.
       <p> </p>
     </sec>
   </sec>
+  <sec id="contributor-roles">
+    <title>Contributor Roles</title>
+    <p>The
+    <ext-link ext-link-type="uri" xlink:href="https://credit.niso.org/contributor-roles">Contribution
+    Role Taxonomy (CRediT)</ext-link> defines fourteen standard roles of
+    authors. Each author can be annotated with one or more contribution
+    roles.</p>
+    <list list-type="order">
+      <list-item>
+        <p><ext-link ext-link-type="uri" xlink:href="https://credit.niso.org/contributor-roles/conceptualization">conceptualization</ext-link></p>
+      </list-item>
+      <list-item>
+        <p><ext-link ext-link-type="uri" xlink:href="https://credit.niso.org/contributor-roles/data-curation">data-curation</ext-link></p>
+      </list-item>
+      <list-item>
+        <p><ext-link ext-link-type="uri" xlink:href="https://credit.niso.org/contributor-roles/formal-analysis">formal-analysis</ext-link></p>
+      </list-item>
+      <list-item>
+        <p><ext-link ext-link-type="uri" xlink:href="https://credit.niso.org/contributor-roles/funding-acquisition">funding-acquisition</ext-link></p>
+      </list-item>
+      <list-item>
+        <p><ext-link ext-link-type="uri" xlink:href="https://credit.niso.org/contributor-roles/investigation">investigation</ext-link></p>
+      </list-item>
+      <list-item>
+        <p><ext-link ext-link-type="uri" xlink:href="https://credit.niso.org/contributor-roles/methodology">methodology</ext-link></p>
+      </list-item>
+      <list-item>
+        <p><ext-link ext-link-type="uri" xlink:href="https://credit.niso.org/contributor-roles/project-administration">project-administration</ext-link></p>
+      </list-item>
+      <list-item>
+        <p><ext-link ext-link-type="uri" xlink:href="https://credit.niso.org/contributor-roles/resources">resources</ext-link></p>
+      </list-item>
+      <list-item>
+        <p><ext-link ext-link-type="uri" xlink:href="https://credit.niso.org/contributor-roles/software">software</ext-link></p>
+      </list-item>
+      <list-item>
+        <p><ext-link ext-link-type="uri" xlink:href="https://credit.niso.org/contributor-roles/supervision">supervision</ext-link></p>
+      </list-item>
+      <list-item>
+        <p><ext-link ext-link-type="uri" xlink:href="https://credit.niso.org/contributor-roles/validation">validation</ext-link></p>
+      </list-item>
+      <list-item>
+        <p><ext-link ext-link-type="uri" xlink:href="https://credit.niso.org/contributor-roles/visualization">visualization</ext-link></p>
+      </list-item>
+      <list-item>
+        <p><ext-link ext-link-type="uri" xlink:href="https://credit.niso.org/contributor-roles/writing-original-draft">writing-original-draft</ext-link></p>
+      </list-item>
+      <list-item>
+        <p><ext-link ext-link-type="uri" xlink:href="https://credit.niso.org/contributor-roles/writing-review-editing">writing-review-editing</ext-link></p>
+      </list-item>
+    </list>
+    <p>JATS also specifies three degrees which can be used to quantify
+    the impact of a contribution:</p>
+    <list list-type="order">
+      <list-item>
+        <p><monospace>Lead</monospace></p>
+      </list-item>
+      <list-item>
+        <p><monospace>Supporting</monospace></p>
+      </list-item>
+      <list-item>
+        <p><monospace>Equal</monospace> - for use if multiple equivalent
+        leads</p>
+      </list-item>
+    </list>
+    <p>Together, these can be used to identify which authors materially
+    contributed to the paper, such as through
+    <monospace>formal-analysis</monospace> or
+    <monospace>data-curation</monospace> and which authors contributed
+    immaterially, such as through <monospace>supervision</monospace>. It
+    also allows for saying if multiple people made the same kind of
+    contribution, who took the lead.</p>
+    <code language="yaml">authors:
+  - name: John Doe
+    affiliation: [ 1 ]
+    roles:
+      - credit: 'formal-analysis'
+        degree: 'lead'
+
+  - name: John Boss
+    affiliation: [ 1 ]
+    roles:
+      - credit: 'funding-acquisition'
+        degree: 'lead'
+      - credit: 'supervision'
+        degree: 'lead'</code>
+    <p>Roles are optional, and within roles, degrees are optional. It’s
+    possible to shorthand roles by using strings directly:</p>
+    <code language="yaml">authors:
+  - name: John Doe
+    affiliation: [ 1 ]
+    roles:
+      - 'formal-analysis'
+
+  - name: John Boss
+    affiliation: [ 1 ]
+    roles:
+      - 'funding-acquisition'
+      - 'supervision'</code>
+  </sec>
   <sec id="affiliations">
     <title>Affiliations</title>
     <p>Each affiliation requires an <monospace>index</monospace> and
diff --git a/test/expected-draft/paper.preprint.tex b/test/expected-draft/paper.preprint.tex
index f1d25d1..57e47fd 100644
--- a/test/expected-draft/paper.preprint.tex
+++ b/test/expected-draft/paper.preprint.tex
@@ -786,4 +786,11 @@ \section{Behind the scenes}\label{behind-the-scenes}}
 
 \end{CSLReferences}
 
+\section{Author Contributions}\label{author-contributions}
+\begin{enumerate}
+\item Albert Krewinkel - Software (Equal) & Methodology
+\item Juanjo Bazán - Software (Equal)
+\item Arfon M. Smith - Software (Equal) & Supervision (Lead)
+\end{enumerate}
+
 \end{document}
diff --git a/test/expected-draft/paper.tex b/test/expected-draft/paper.tex
index ec3a05d..8beb99d 100644
--- a/test/expected-draft/paper.tex
+++ b/test/expected-draft/paper.tex
@@ -845,6 +845,103 @@ \subsubsection{Example}\label{example}
 \end{Highlighting}
 \end{Shaded}
 
+\subsection{Contributor Roles}\label{contributor-roles}
+
+The \href{https://credit.niso.org/contributor-roles}{Contribution Role
+Taxonomy (CRediT)} defines fourteen standard roles of authors. Each
+author can be annotated with one or more contribution roles.
+
+\begin{enumerate}
+\def\labelenumi{\arabic{enumi}.}
+\tightlist
+\item
+  \href{https://credit.niso.org/contributor-roles/conceptualization}{conceptualization}
+\item
+  \href{https://credit.niso.org/contributor-roles/data-curation}{data-curation}
+\item
+  \href{https://credit.niso.org/contributor-roles/formal-analysis}{formal-analysis}
+\item
+  \href{https://credit.niso.org/contributor-roles/funding-acquisition}{funding-acquisition}
+\item
+  \href{https://credit.niso.org/contributor-roles/investigation}{investigation}
+\item
+  \href{https://credit.niso.org/contributor-roles/methodology}{methodology}
+\item
+  \href{https://credit.niso.org/contributor-roles/project-administration}{project-administration}
+\item
+  \href{https://credit.niso.org/contributor-roles/resources}{resources}
+\item
+  \href{https://credit.niso.org/contributor-roles/software}{software}
+\item
+  \href{https://credit.niso.org/contributor-roles/supervision}{supervision}
+\item
+  \href{https://credit.niso.org/contributor-roles/validation}{validation}
+\item
+  \href{https://credit.niso.org/contributor-roles/visualization}{visualization}
+\item
+  \href{https://credit.niso.org/contributor-roles/writing-original-draft}{writing-original-draft}
+\item
+  \href{https://credit.niso.org/contributor-roles/writing-review-editing}{writing-review-editing}
+\end{enumerate}
+
+JATS also specifies three degrees which can be used to quantify the
+impact of a contribution:
+
+\begin{enumerate}
+\def\labelenumi{\arabic{enumi}.}
+\tightlist
+\item
+  \texttt{Lead}
+\item
+  \texttt{Supporting}
+\item
+  \texttt{Equal} - for use if multiple equivalent leads
+\end{enumerate}
+
+Together, these can be used to identify which authors materially
+contributed to the paper, such as through \texttt{formal-analysis} or
+\texttt{data-curation} and which authors contributed immaterially, such
+as through \texttt{supervision}. It also allows for saying if multiple
+people made the same kind of contribution, who took the lead.
+
+\begin{Shaded}
+\begin{Highlighting}[]
+\FunctionTok{authors}\KeywordTok{:}
+\AttributeTok{  }\KeywordTok{{-}}\AttributeTok{ }\FunctionTok{name}\KeywordTok{:}\AttributeTok{ John Doe}
+\AttributeTok{    }\FunctionTok{affiliation}\KeywordTok{:}\AttributeTok{ }\KeywordTok{[}\AttributeTok{ }\DecValTok{1}\AttributeTok{ }\KeywordTok{]}
+\AttributeTok{    }\FunctionTok{roles}\KeywordTok{:}
+\AttributeTok{      }\KeywordTok{{-}}\AttributeTok{ }\FunctionTok{credit}\KeywordTok{:}\AttributeTok{ }\StringTok{\textquotesingle{}formal{-}analysis\textquotesingle{}}
+\AttributeTok{        }\FunctionTok{degree}\KeywordTok{:}\AttributeTok{ }\StringTok{\textquotesingle{}lead\textquotesingle{}}
+
+\AttributeTok{  }\KeywordTok{{-}}\AttributeTok{ }\FunctionTok{name}\KeywordTok{:}\AttributeTok{ John Boss}
+\AttributeTok{    }\FunctionTok{affiliation}\KeywordTok{:}\AttributeTok{ }\KeywordTok{[}\AttributeTok{ }\DecValTok{1}\AttributeTok{ }\KeywordTok{]}
+\AttributeTok{    }\FunctionTok{roles}\KeywordTok{:}
+\AttributeTok{      }\KeywordTok{{-}}\AttributeTok{ }\FunctionTok{credit}\KeywordTok{:}\AttributeTok{ }\StringTok{\textquotesingle{}funding{-}acquisition\textquotesingle{}}
+\AttributeTok{        }\FunctionTok{degree}\KeywordTok{:}\AttributeTok{ }\StringTok{\textquotesingle{}lead\textquotesingle{}}
+\AttributeTok{      }\KeywordTok{{-}}\AttributeTok{ }\FunctionTok{credit}\KeywordTok{:}\AttributeTok{ }\StringTok{\textquotesingle{}supervision\textquotesingle{}}
+\AttributeTok{        }\FunctionTok{degree}\KeywordTok{:}\AttributeTok{ }\StringTok{\textquotesingle{}lead\textquotesingle{}}
+\end{Highlighting}
+\end{Shaded}
+
+Roles are optional, and within roles, degrees are optional. It's
+possible to shorthand roles by using strings directly:
+
+\begin{Shaded}
+\begin{Highlighting}[]
+\FunctionTok{authors}\KeywordTok{:}
+\AttributeTok{  }\KeywordTok{{-}}\AttributeTok{ }\FunctionTok{name}\KeywordTok{:}\AttributeTok{ John Doe}
+\AttributeTok{    }\FunctionTok{affiliation}\KeywordTok{:}\AttributeTok{ }\KeywordTok{[}\AttributeTok{ }\DecValTok{1}\AttributeTok{ }\KeywordTok{]}
+\AttributeTok{    }\FunctionTok{roles}\KeywordTok{:}
+\AttributeTok{      }\KeywordTok{{-}}\AttributeTok{ }\StringTok{\textquotesingle{}formal{-}analysis\textquotesingle{}}
+
+\AttributeTok{  }\KeywordTok{{-}}\AttributeTok{ }\FunctionTok{name}\KeywordTok{:}\AttributeTok{ John Boss}
+\AttributeTok{    }\FunctionTok{affiliation}\KeywordTok{:}\AttributeTok{ }\KeywordTok{[}\AttributeTok{ }\DecValTok{1}\AttributeTok{ }\KeywordTok{]}
+\AttributeTok{    }\FunctionTok{roles}\KeywordTok{:}
+\AttributeTok{      }\KeywordTok{{-}}\AttributeTok{ }\StringTok{\textquotesingle{}funding{-}acquisition\textquotesingle{}}
+\AttributeTok{      }\KeywordTok{{-}}\AttributeTok{ }\StringTok{\textquotesingle{}supervision\textquotesingle{}}
+\end{Highlighting}
+\end{Shaded}
+
 \subsection{Affiliations}\label{affiliations}
 
 Each affiliation requires an \texttt{index} and \texttt{name}.
@@ -1026,4 +1123,11 @@ \section{Behind the scenes}\label{behind-the-scenes}
 
 \end{CSLReferences}
 
+\section{Author Contributions}\label{author-contributions}
+\begin{enumerate}
+\item Albert Krewinkel - Software (Equal) & Methodology
+\item Juanjo Bazán - Software (Equal)
+\item Arfon M. Smith - Software (Equal) & Supervision (Lead)
+\end{enumerate}
+
 \end{document}
diff --git a/test/expected-pub/paper.jats/paper.jats b/test/expected-pub/paper.jats/paper.jats
index b702ce9..4057ce1 100644
--- a/test/expected-pub/paper.jats/paper.jats
+++ b/test/expected-pub/paper.jats/paper.jats
@@ -28,6 +28,16 @@ publishing pipeline</article-title>
 <surname>Krewinkel</surname>
 <given-names>Albert</given-names>
 </name>
+<role vocab="credit" degree-contribution="Equal"
+      vocab-identifier="https://credit.niso.org/"
+      vocab-term-identifier="https://credit.niso.org/contributor-roles/software/"
+      vocab-term="Software"
+>Software</role>
+<role vocab="credit
+      vocab-identifier="https://credit.niso.org/"
+      vocab-term-identifier="https://credit.niso.org/contributor-roles/methodology/"
+      vocab-term="Methodology"
+>Methodology</role>
 <email>albert@zeitkraut.de</email>
 <xref ref-type="aff" rid="aff-1"/>
 <xref ref-type="aff" rid="aff-2"/>
@@ -40,6 +50,11 @@ publishing pipeline</article-title>
 <surname>Bazán</surname>
 <given-names>Juanjo</given-names>
 </name>
+<role vocab="credit" degree-contribution="Equal"
+      vocab-identifier="https://credit.niso.org/"
+      vocab-term-identifier="https://credit.niso.org/contributor-roles/software/"
+      vocab-term="Software"
+>Software</role>
 <xref ref-type="aff" rid="aff-1"/>
 </contrib>
 <contrib contrib-type="author" equal-contrib="yes">
@@ -48,6 +63,16 @@ publishing pipeline</article-title>
 <surname>Smith</surname>
 <given-names>Arfon M.</given-names>
 </name>
+<role vocab="credit" degree-contribution="Equal"
+      vocab-identifier="https://credit.niso.org/"
+      vocab-term-identifier="https://credit.niso.org/contributor-roles/software/"
+      vocab-term="Software"
+>Software</role>
+<role vocab="credit" degree-contribution="Lead"
+      vocab-identifier="https://credit.niso.org/"
+      vocab-term-identifier="https://credit.niso.org/contributor-roles/supervision/"
+      vocab-term="Supervision"
+>Supervision</role>
 <xref ref-type="aff" rid="aff-1"/>
 <xref ref-type="aff" rid="aff-3"/>
 </contrib>
@@ -520,6 +545,106 @@ Software should use an OSI-approved license.
       <p> </p>
     </sec>
   </sec>
+  <sec id="contributor-roles">
+    <title>Contributor Roles</title>
+    <p>The
+    <ext-link ext-link-type="uri" xlink:href="https://credit.niso.org/contributor-roles">Contribution
+    Role Taxonomy (CRediT)</ext-link> defines fourteen standard roles of
+    authors. Each author can be annotated with one or more contribution
+    roles.</p>
+    <list list-type="order">
+      <list-item>
+        <p><ext-link ext-link-type="uri" xlink:href="https://credit.niso.org/contributor-roles/conceptualization">conceptualization</ext-link></p>
+      </list-item>
+      <list-item>
+        <p><ext-link ext-link-type="uri" xlink:href="https://credit.niso.org/contributor-roles/data-curation">data-curation</ext-link></p>
+      </list-item>
+      <list-item>
+        <p><ext-link ext-link-type="uri" xlink:href="https://credit.niso.org/contributor-roles/formal-analysis">formal-analysis</ext-link></p>
+      </list-item>
+      <list-item>
+        <p><ext-link ext-link-type="uri" xlink:href="https://credit.niso.org/contributor-roles/funding-acquisition">funding-acquisition</ext-link></p>
+      </list-item>
+      <list-item>
+        <p><ext-link ext-link-type="uri" xlink:href="https://credit.niso.org/contributor-roles/investigation">investigation</ext-link></p>
+      </list-item>
+      <list-item>
+        <p><ext-link ext-link-type="uri" xlink:href="https://credit.niso.org/contributor-roles/methodology">methodology</ext-link></p>
+      </list-item>
+      <list-item>
+        <p><ext-link ext-link-type="uri" xlink:href="https://credit.niso.org/contributor-roles/project-administration">project-administration</ext-link></p>
+      </list-item>
+      <list-item>
+        <p><ext-link ext-link-type="uri" xlink:href="https://credit.niso.org/contributor-roles/resources">resources</ext-link></p>
+      </list-item>
+      <list-item>
+        <p><ext-link ext-link-type="uri" xlink:href="https://credit.niso.org/contributor-roles/software">software</ext-link></p>
+      </list-item>
+      <list-item>
+        <p><ext-link ext-link-type="uri" xlink:href="https://credit.niso.org/contributor-roles/supervision">supervision</ext-link></p>
+      </list-item>
+      <list-item>
+        <p><ext-link ext-link-type="uri" xlink:href="https://credit.niso.org/contributor-roles/validation">validation</ext-link></p>
+      </list-item>
+      <list-item>
+        <p><ext-link ext-link-type="uri" xlink:href="https://credit.niso.org/contributor-roles/visualization">visualization</ext-link></p>
+      </list-item>
+      <list-item>
+        <p><ext-link ext-link-type="uri" xlink:href="https://credit.niso.org/contributor-roles/writing-original-draft">writing-original-draft</ext-link></p>
+      </list-item>
+      <list-item>
+        <p><ext-link ext-link-type="uri" xlink:href="https://credit.niso.org/contributor-roles/writing-review-editing">writing-review-editing</ext-link></p>
+      </list-item>
+    </list>
+    <p>JATS also specifies three degrees which can be used to quantify
+    the impact of a contribution:</p>
+    <list list-type="order">
+      <list-item>
+        <p><monospace>Lead</monospace></p>
+      </list-item>
+      <list-item>
+        <p><monospace>Supporting</monospace></p>
+      </list-item>
+      <list-item>
+        <p><monospace>Equal</monospace> - for use if multiple equivalent
+        leads</p>
+      </list-item>
+    </list>
+    <p>Together, these can be used to identify which authors materially
+    contributed to the paper, such as through
+    <monospace>formal-analysis</monospace> or
+    <monospace>data-curation</monospace> and which authors contributed
+    immaterially, such as through <monospace>supervision</monospace>. It
+    also allows for saying if multiple people made the same kind of
+    contribution, who took the lead.</p>
+    <code language="yaml">authors:
+  - name: John Doe
+    affiliation: [ 1 ]
+    roles:
+      - credit: 'formal-analysis'
+        degree: 'lead'
+
+  - name: John Boss
+    affiliation: [ 1 ]
+    roles:
+      - credit: 'funding-acquisition'
+        degree: 'lead'
+      - credit: 'supervision'
+        degree: 'lead'</code>
+    <p>Roles are optional, and within roles, degrees are optional. It’s
+    possible to shorthand roles by using strings directly:</p>
+    <code language="yaml">authors:
+  - name: John Doe
+    affiliation: [ 1 ]
+    roles:
+      - 'formal-analysis'
+
+  - name: John Boss
+    affiliation: [ 1 ]
+    roles:
+      - 'funding-acquisition'
+      - 'supervision'</code>
+  </sec>
   <sec id="affiliations">
     <title>Affiliations</title>
     <p>Each affiliation requires an <monospace>index</monospace> and
diff --git a/test/expected-pub/paper.preprint.tex b/test/expected-pub/paper.preprint.tex
index f1d25d1..57e47fd 100644
--- a/test/expected-pub/paper.preprint.tex
+++ b/test/expected-pub/paper.preprint.tex
@@ -786,4 +786,11 @@ \section{Behind the scenes}\label{behind-the-scenes}}
 
 \end{CSLReferences}
 
+\section{Author Contributions}\label{author-contributions}
+\begin{enumerate}
+\item Albert Krewinkel - Software (Equal) & Methodology
+\item Juanjo Bazán - Software (Equal)
+\item Arfon M. Smith - Software (Equal) & Supervision (Lead)
+\end{enumerate}
+
 \end{document}
diff --git a/test/expected-pub/paper.tex b/test/expected-pub/paper.tex
index d1f7d9d..b9ecc13 100644
--- a/test/expected-pub/paper.tex
+++ b/test/expected-pub/paper.tex
@@ -843,6 +843,103 @@ \subsubsection{Example}\label{example}
 \end{Highlighting}
 \end{Shaded}
 
+\subsection{Contributor Roles}\label{contributor-roles}
+
+The \href{https://credit.niso.org/contributor-roles}{Contribution Role
+Taxonomy (CRediT)} defines fourteen standard roles of authors. Each
+author can be annotated with one or more contribution roles.
+
+\begin{enumerate}
+\def\labelenumi{\arabic{enumi}.}
+\tightlist
+\item
+  \href{https://credit.niso.org/contributor-roles/conceptualization}{conceptualization}
+\item
+  \href{https://credit.niso.org/contributor-roles/data-curation}{data-curation}
+\item
+  \href{https://credit.niso.org/contributor-roles/formal-analysis}{formal-analysis}
+\item
+  \href{https://credit.niso.org/contributor-roles/funding-acquisition}{funding-acquisition}
+\item
+  \href{https://credit.niso.org/contributor-roles/investigation}{investigation}
+\item
+  \href{https://credit.niso.org/contributor-roles/methodology}{methodology}
+\item
+  \href{https://credit.niso.org/contributor-roles/project-administration}{project-administration}
+\item
+  \href{https://credit.niso.org/contributor-roles/resources}{resources}
+\item
+  \href{https://credit.niso.org/contributor-roles/software}{software}
+\item
+  \href{https://credit.niso.org/contributor-roles/supervision}{supervision}
+\item
+  \href{https://credit.niso.org/contributor-roles/validation}{validation}
+\item
+  \href{https://credit.niso.org/contributor-roles/visualization}{visualization}
+\item
+  \href{https://credit.niso.org/contributor-roles/writing-original-draft}{writing-original-draft}
+\item
+  \href{https://credit.niso.org/contributor-roles/writing-review-editing}{writing-review-editing}
+\end{enumerate}
+
+JATS also specifies three degrees which can be used to quantify the
+impact of a contribution:
+
+\begin{enumerate}
+\def\labelenumi{\arabic{enumi}.}
+\tightlist
+\item
+  \texttt{Lead}
+\item
+  \texttt{Supporting}
+\item
+  \texttt{Equal} - for use if multiple equivalent leads
+\end{enumerate}
+
+Together, these can be used to identify which authors materially
+contributed to the paper, such as through \texttt{formal-analysis} or
+\texttt{data-curation} and which authors contributed immaterially, such
+as through \texttt{supervision}. It also allows for saying if multiple
+people made the same kind of contribution, who took the lead.
+
+\begin{Shaded}
+\begin{Highlighting}[]
+\FunctionTok{authors}\KeywordTok{:}
+\AttributeTok{  }\KeywordTok{{-}}\AttributeTok{ }\FunctionTok{name}\KeywordTok{:}\AttributeTok{ John Doe}
+\AttributeTok{    }\FunctionTok{affiliation}\KeywordTok{:}\AttributeTok{ }\KeywordTok{[}\AttributeTok{ }\DecValTok{1}\AttributeTok{ }\KeywordTok{]}
+\AttributeTok{    }\FunctionTok{roles}\KeywordTok{:}
+\AttributeTok{      }\KeywordTok{{-}}\AttributeTok{ }\FunctionTok{credit}\KeywordTok{:}\AttributeTok{ }\StringTok{\textquotesingle{}formal{-}analysis\textquotesingle{}}
+\AttributeTok{        }\FunctionTok{degree}\KeywordTok{:}\AttributeTok{ }\StringTok{\textquotesingle{}lead\textquotesingle{}}
+
+\AttributeTok{  }\KeywordTok{{-}}\AttributeTok{ }\FunctionTok{name}\KeywordTok{:}\AttributeTok{ John Boss}
+\AttributeTok{    }\FunctionTok{affiliation}\KeywordTok{:}\AttributeTok{ }\KeywordTok{[}\AttributeTok{ }\DecValTok{1}\AttributeTok{ }\KeywordTok{]}
+\AttributeTok{    }\FunctionTok{roles}\KeywordTok{:}
+\AttributeTok{      }\KeywordTok{{-}}\AttributeTok{ }\FunctionTok{credit}\KeywordTok{:}\AttributeTok{ }\StringTok{\textquotesingle{}funding{-}acquisition\textquotesingle{}}
+\AttributeTok{        }\FunctionTok{degree}\KeywordTok{:}\AttributeTok{ }\StringTok{\textquotesingle{}lead\textquotesingle{}}
+\AttributeTok{      }\KeywordTok{{-}}\AttributeTok{ }\FunctionTok{credit}\KeywordTok{:}\AttributeTok{ }\StringTok{\textquotesingle{}supervision\textquotesingle{}}
+\AttributeTok{        }\FunctionTok{degree}\KeywordTok{:}\AttributeTok{ }\StringTok{\textquotesingle{}lead\textquotesingle{}}
+\end{Highlighting}
+\end{Shaded}
+
+Roles are optional, and within roles, degrees are optional. It's
+possible to shorthand roles by using strings directly:
+
+\begin{Shaded}
+\begin{Highlighting}[]
+\FunctionTok{authors}\KeywordTok{:}
+\AttributeTok{  }\KeywordTok{{-}}\AttributeTok{ }\FunctionTok{name}\KeywordTok{:}\AttributeTok{ John Doe}
+\AttributeTok{    }\FunctionTok{affiliation}\KeywordTok{:}\AttributeTok{ }\KeywordTok{[}\AttributeTok{ }\DecValTok{1}\AttributeTok{ }\KeywordTok{]}
+\AttributeTok{    }\FunctionTok{roles}\KeywordTok{:}
+\AttributeTok{      }\KeywordTok{{-}}\AttributeTok{ }\StringTok{\textquotesingle{}formal{-}analysis\textquotesingle{}}
+
+\AttributeTok{  }\KeywordTok{{-}}\AttributeTok{ }\FunctionTok{name}\KeywordTok{:}\AttributeTok{ John Boss}
+\AttributeTok{    }\FunctionTok{affiliation}\KeywordTok{:}\AttributeTok{ }\KeywordTok{[}\AttributeTok{ }\DecValTok{1}\AttributeTok{ }\KeywordTok{]}
+\AttributeTok{    }\FunctionTok{roles}\KeywordTok{:}
+\AttributeTok{      }\KeywordTok{{-}}\AttributeTok{ }\StringTok{\textquotesingle{}funding{-}acquisition\textquotesingle{}}
+\AttributeTok{      }\KeywordTok{{-}}\AttributeTok{ }\StringTok{\textquotesingle{}supervision\textquotesingle{}}
+\end{Highlighting}
+\end{Shaded}
+
 \subsection{Affiliations}\label{affiliations}
 
 Each affiliation requires an \texttt{index} and \texttt{name}.
@@ -1024,4 +1121,11 @@ \section{Behind the scenes}\label{behind-the-scenes}
 
 \end{CSLReferences}
 
+\section{Author Contributions}\label{author-contributions}
+\begin{enumerate}
+\item Albert Krewinkel - Software (Equal) & Methodology
+\item Juanjo Bazán - Software (Equal)
+\item Arfon M. Smith - Software (Equal) & Supervision (Lead)
+\end{enumerate}
+
 \end{document}