`--shift-heading-level-by=-1` turns reference section title into a non-heading
Closed this issue · 2 comments
I have seen the related discussion at #9664, which refers to the behaviour that was then changed in 3d90234.
I use the latest pandoc version:
$ pandoc --version
pandoc 3.5
Features: +server +lua
Scripting engine: Lua 5.4
User data directory: /home/benjamin/.local/share/pandoc
Copyright (C) 2006-2024 John MacFarlane. Web: https://pandoc.org
This is free software; see the source for copying conditions. There is no
warranty, not even for merchantability or fitness for a particular purpose.
My problem happens when I use --citeproc
with --shift-heading-level-by=-1
: the section title set in metadata ends up as just a <p>
instead of any heading at all.
To reproduce:
#!/usr/bin/env bash
params=(
--from=markdown
--to=html
--shift-heading-level-by=-1
--citeproc
--standalone
)
cat << 'EOF' | pandoc "${params[@]}"
---
references:
- id: Ritchie1974
type: article-journal
author:
- family: Ritchie
given: Dennis M.
- family: Thompson
given: Ken
issued:
- year: 1974
month: 7
title: The unix time-sharing system
container-title: Commun. ACM
reference-section-title: Bibliography
---
# A post title
Some text, with [@Ritchie1974]
## A section title
Some section text.
EOF
produces
<body>
<header id="title-block-header">
<h1 class="title">A post title</h1>
</header>
<p>Some text, with <span class="citation"
data-cites="Ritchie1974">(Ritchie and Thompson 1974)</span></p>
<h1 id="a-section-title">A section title</h1>
<p>Some section text.</p>
<p>Bibliography</p>
<div id="refs" class="references csl-bib-body hanging-indent"
data-entry-spacing="0" role="list">
<div id="ref-Ritchie1974" class="csl-entry" role="listitem">
Ritchie, Dennis M., and Ken Thompson. 1974. <span>“The Unix Time-Sharing
System.”</span> <em>Commun. ACM</em>, July.
</div>
</div>
</body>
with <p>Bibliography</p>
.
If I remove --shift-heading-level-by=-1
, the output becomes
<body>
<h1 id="a-post-title">A post title</h1>
<p>Some text, with <span class="citation"
data-cites="Ritchie1974">(Ritchie and Thompson 1974)</span></p>
<h2 id="a-section-title">A section title</h2>
<p>Some section text.</p>
<h1 class="unnumbered" id="bibliography">Bibliography</h1>
<div id="refs" class="references csl-bib-body hanging-indent"
data-entry-spacing="0" role="list">
<div id="ref-Ritchie1974" class="csl-entry" role="listitem">
Ritchie, Dennis M., and Ken Thompson. 1974. <span>“The Unix Time-Sharing
System.”</span> <em>Commun. ACM</em>, July.
</div>
</div>
</body>
with <h1 class="unnumbered" id="bibliography">Bibliography</h1>
.
I'd expect the behaviour in the first case to be a bibliography <h1>
heading just like in the second case.
Complete outputs:
Buggy case
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" lang="" xml:lang="">
<head>
<meta charset="utf-8" />
<meta name="generator" content="pandoc" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
<title>A post title</title>
<style>
html {
color: #1a1a1a;
background-color: #fdfdfd;
}
body {
margin: 0 auto;
max-width: 36em;
padding-left: 50px;
padding-right: 50px;
padding-top: 50px;
padding-bottom: 50px;
hyphens: auto;
overflow-wrap: break-word;
text-rendering: optimizeLegibility;
font-kerning: normal;
}
@media (max-width: 600px) {
body {
font-size: 0.9em;
padding: 12px;
}
h1 {
font-size: 1.8em;
}
}
@media print {
html {
background-color: white;
}
body {
background-color: transparent;
color: black;
font-size: 12pt;
}
p, h2, h3 {
orphans: 3;
widows: 3;
}
h2, h3, h4 {
page-break-after: avoid;
}
}
p {
margin: 1em 0;
}
a {
color: #1a1a1a;
}
a:visited {
color: #1a1a1a;
}
img {
max-width: 100%;
}
svg {
height: auto;
max-width: 100%;
}
h1, h2, h3, h4, h5, h6 {
margin-top: 1.4em;
}
h5, h6 {
font-size: 1em;
font-style: italic;
}
h6 {
font-weight: normal;
}
ol, ul {
padding-left: 1.7em;
margin-top: 1em;
}
li > ol, li > ul {
margin-top: 0;
}
blockquote {
margin: 1em 0 1em 1.7em;
padding-left: 1em;
border-left: 2px solid #e6e6e6;
color: #606060;
}
code {
font-family: Menlo, Monaco, Consolas, 'Lucida Console', monospace;
font-size: 85%;
margin: 0;
hyphens: manual;
}
pre {
margin: 1em 0;
overflow: auto;
}
pre code {
padding: 0;
overflow: visible;
overflow-wrap: normal;
}
.sourceCode {
background-color: transparent;
overflow: visible;
}
hr {
background-color: #1a1a1a;
border: none;
height: 1px;
margin: 1em 0;
}
table {
margin: 1em 0;
border-collapse: collapse;
width: 100%;
overflow-x: auto;
display: block;
font-variant-numeric: lining-nums tabular-nums;
}
table caption {
margin-bottom: 0.75em;
}
tbody {
margin-top: 0.5em;
border-top: 1px solid #1a1a1a;
border-bottom: 1px solid #1a1a1a;
}
th {
border-top: 1px solid #1a1a1a;
padding: 0.25em 0.5em 0.25em 0.5em;
}
td {
padding: 0.125em 0.5em 0.25em 0.5em;
}
header {
margin-bottom: 4em;
text-align: center;
}
#TOC li {
list-style: none;
}
#TOC ul {
padding-left: 1.3em;
}
#TOC > ul {
padding-left: 0;
}
#TOC a:not(:hover) {
text-decoration: none;
}
code{white-space: pre-wrap;}
span.smallcaps{font-variant: small-caps;}
div.columns{display: flex; gap: min(4vw, 1.5em);}
div.column{flex: auto; overflow-x: auto;}
div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}
/* The extra [class] is a hack that increases specificity enough to
override a similar rule in reveal.js */
ul.task-list[class]{list-style: none;}
ul.task-list li input[type="checkbox"] {
font-size: inherit;
width: 0.8em;
margin: 0 0.8em 0.2em -1.6em;
vertical-align: middle;
}
.display.math{display: block; text-align: center; margin: 0.5rem auto;}
/* CSS for citations */
div.csl-bib-body { }
div.csl-entry {
clear: both;
margin-bottom: 0em;
}
.hanging-indent div.csl-entry {
margin-left:2em;
text-indent:-2em;
}
div.csl-left-margin {
min-width:2em;
float:left;
}
div.csl-right-inline {
margin-left:2em;
padding-left:1em;
}
div.csl-indent {
margin-left: 2em;
} </style>
</head>
<body>
<header id="title-block-header">
<h1 class="title">A post title</h1>
</header>
<p>Some text, with <span class="citation"
data-cites="Ritchie1974">(Ritchie and Thompson 1974)</span></p>
<h1 id="a-section-title">A section title</h1>
<p>Some section text.</p>
<p>Bibliography</p>
<div id="refs" class="references csl-bib-body hanging-indent"
data-entry-spacing="0" role="list">
<div id="ref-Ritchie1974" class="csl-entry" role="listitem">
Ritchie, Dennis M., and Ken Thompson. 1974. <span>“The Unix Time-Sharing
System.”</span> <em>Commun. ACM</em>, July.
</div>
</div>
</body>
</html>
Second case
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" lang="" xml:lang="">
<head>
<meta charset="utf-8" />
<meta name="generator" content="pandoc" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
<title>-</title>
<style>
html {
color: #1a1a1a;
background-color: #fdfdfd;
}
body {
margin: 0 auto;
max-width: 36em;
padding-left: 50px;
padding-right: 50px;
padding-top: 50px;
padding-bottom: 50px;
hyphens: auto;
overflow-wrap: break-word;
text-rendering: optimizeLegibility;
font-kerning: normal;
}
@media (max-width: 600px) {
body {
font-size: 0.9em;
padding: 12px;
}
h1 {
font-size: 1.8em;
}
}
@media print {
html {
background-color: white;
}
body {
background-color: transparent;
color: black;
font-size: 12pt;
}
p, h2, h3 {
orphans: 3;
widows: 3;
}
h2, h3, h4 {
page-break-after: avoid;
}
}
p {
margin: 1em 0;
}
a {
color: #1a1a1a;
}
a:visited {
color: #1a1a1a;
}
img {
max-width: 100%;
}
svg {
height: auto;
max-width: 100%;
}
h1, h2, h3, h4, h5, h6 {
margin-top: 1.4em;
}
h5, h6 {
font-size: 1em;
font-style: italic;
}
h6 {
font-weight: normal;
}
ol, ul {
padding-left: 1.7em;
margin-top: 1em;
}
li > ol, li > ul {
margin-top: 0;
}
blockquote {
margin: 1em 0 1em 1.7em;
padding-left: 1em;
border-left: 2px solid #e6e6e6;
color: #606060;
}
code {
font-family: Menlo, Monaco, Consolas, 'Lucida Console', monospace;
font-size: 85%;
margin: 0;
hyphens: manual;
}
pre {
margin: 1em 0;
overflow: auto;
}
pre code {
padding: 0;
overflow: visible;
overflow-wrap: normal;
}
.sourceCode {
background-color: transparent;
overflow: visible;
}
hr {
background-color: #1a1a1a;
border: none;
height: 1px;
margin: 1em 0;
}
table {
margin: 1em 0;
border-collapse: collapse;
width: 100%;
overflow-x: auto;
display: block;
font-variant-numeric: lining-nums tabular-nums;
}
table caption {
margin-bottom: 0.75em;
}
tbody {
margin-top: 0.5em;
border-top: 1px solid #1a1a1a;
border-bottom: 1px solid #1a1a1a;
}
th {
border-top: 1px solid #1a1a1a;
padding: 0.25em 0.5em 0.25em 0.5em;
}
td {
padding: 0.125em 0.5em 0.25em 0.5em;
}
header {
margin-bottom: 4em;
text-align: center;
}
#TOC li {
list-style: none;
}
#TOC ul {
padding-left: 1.3em;
}
#TOC > ul {
padding-left: 0;
}
#TOC a:not(:hover) {
text-decoration: none;
}
code{white-space: pre-wrap;}
span.smallcaps{font-variant: small-caps;}
div.columns{display: flex; gap: min(4vw, 1.5em);}
div.column{flex: auto; overflow-x: auto;}
div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}
/* The extra [class] is a hack that increases specificity enough to
override a similar rule in reveal.js */
ul.task-list[class]{list-style: none;}
ul.task-list li input[type="checkbox"] {
font-size: inherit;
width: 0.8em;
margin: 0 0.8em 0.2em -1.6em;
vertical-align: middle;
}
.display.math{display: block; text-align: center; margin: 0.5rem auto;}
/* CSS for citations */
div.csl-bib-body { }
div.csl-entry {
clear: both;
margin-bottom: 0em;
}
.hanging-indent div.csl-entry {
margin-left:2em;
text-indent:-2em;
}
div.csl-left-margin {
min-width:2em;
float:left;
}
div.csl-right-inline {
margin-left:2em;
padding-left:1em;
}
div.csl-indent {
margin-left: 2em;
} </style>
</head>
<body>
<h1 id="a-post-title">A post title</h1>
<p>Some text, with <span class="citation"
data-cites="Ritchie1974">(Ritchie and Thompson 1974)</span></p>
<h2 id="a-section-title">A section title</h2>
<p>Some section text.</p>
<h1 class="unnumbered" id="bibliography">Bibliography</h1>
<div id="refs" class="references csl-bib-body hanging-indent"
data-entry-spacing="0" role="list">
<div id="ref-Ritchie1974" class="csl-entry" role="listitem">
Ritchie, Dennis M., and Ken Thompson. 1974. <span>“The Unix Time-Sharing
System.”</span> <em>Commun. ACM</em>, July.
</div>
</div>
</body>
</html>
Well, you've told pandoc to lift level-2 headings to level-1, and promote level-1 to title. If your document has a level-1 heading (and that's what pandoc will insert for reference-section-title
), it won't end up as a level-1 heading. An easy workaround is to put an empty section heading (level 2!) for references at the end of your document, instead of using reference-section-title
.
Perhaps we should change the behavior in one of the following ways:
- Do the shift-heading-level transformation before citeproc transformations (and hence before the section heading is added in), instead of after
- Change the shift-heading-level transformation so that level-1 headings after the first one are left as they are.
Ah, that's actually a workaround I can live with very well. I was using the metadata setting to automate the heading for a pandoc wrapper I use, but I can inject a section heading instead. Happy to close this as "not really a bug".