From f63b76e1698b0d7eba6b43ef45faaeee2b01b9ca Mon Sep 17 00:00:00 2001 From: Aner Lucero <4rgento@gmail.com> Date: Sat, 14 Nov 2020 20:09:44 -0300 Subject: Markdown writer: default to using ATX headings. Previously we used Setext (underlined) headings by default. The default is now ATX (`##` style). * Add the `--markdown-headings=atx|setext` option. * Deprecate `--atx-headers`. * Add constructor 'ATXHeadingInLHS` constructor to `LogMessage` [API change]. * Support `markdown-headings` in defaults files. * Document new options in MANUAL. Closes #6662. --- MANUAL.txt | 19 +++-- src/Text/Pandoc/App/CommandLineOptions.hs | 19 ++++- src/Text/Pandoc/App/Opt.hs | 8 +- src/Text/Pandoc/Logging.hs | 85 +++++++++++++--------- src/Text/Pandoc/Options.hs | 2 +- src/Text/Pandoc/Writers/Markdown.hs | 7 +- test/Tests/Old.hs | 6 +- test/Tests/Writers/Markdown.hs | 4 +- test/command/3674.md | 2 +- test/command/3736.md | 9 +-- test/command/4038.md | 2 +- test/command/4164.md | 12 +-- test/command/5121.md | 3 +- test/command/6723.md | 3 +- test/command/6837.md | 29 ++++++++ test/command/pandoc-citeproc-119.md | 3 +- test/command/pandoc-citeproc-14.md | 3 +- test/command/pandoc-citeproc-152.md | 6 +- test/command/pandoc-citeproc-160.md | 6 +- test/command/pandoc-citeproc-175.md | 6 +- test/command/pandoc-citeproc-213.md | 3 +- test/command/pandoc-citeproc-25.md | 3 +- test/command/pandoc-citeproc-27.md | 3 +- test/command/pandoc-citeproc-371.md | 3 +- test/command/pandoc-citeproc-416.md | 3 +- test/command/pandoc-citeproc-47.md | 3 +- test/command/pandoc-citeproc-57.md | 3 +- test/command/pandoc-citeproc-58.md | 3 +- test/command/pandoc-citeproc-61.md | 6 +- test/command/pandoc-citeproc-82.md | 3 +- test/command/pandoc-citeproc-87.md | 3 +- .../command/pandoc-citeproc-chicago-author-date.md | 6 +- ...andoc-citeproc-chicago-fullnote-bibliography.md | 6 +- test/command/pandoc-citeproc-ieee.md | 6 +- test/command/toc.md | 27 +++---- test/writer.markdown | 81 +++++++-------------- 36 files changed, 202 insertions(+), 194 deletions(-) create mode 100644 test/command/6837.md diff --git a/MANUAL.txt b/MANUAL.txt index 23ee62b5c..3af4aec58 100644 --- a/MANUAL.txt +++ b/MANUAL.txt @@ -963,21 +963,26 @@ header when requesting a document from a URL: placement of link references is affected by the `--reference-location` option. -`--reference-location = block`|`section`|`document` +`--reference-location=block`|`section`|`document` : Specify whether footnotes (and references, if `reference-links` is set) are placed at the end of the current (top-level) block, the current section, or the document. The default is `document`. Currently only affects the markdown writer. +`--markdown-headings=setext`|`atx + +: Specify whether to use ATX-style (`#`-prefixed) or + Setext-style (underlined) headings for level 1 and 2 + headings in Markdown output. (ATX is the default.) + ATX headings are always used for levels 3+. + This option also affects Markdown cells in `ipynb` output. + `--atx-headers` -: Use ATX-style headings in Markdown output. The default is - to use setext-style headings for levels 1 to 2, and then ATX headings. - (Note: for `gfm` output, ATX headings are always used.) - This option also affects markdown cells in `ipynb` output. +: *Deprecated synonym for `--markdown-headings=atx`.* -`--top-level-division=[default|section|chapter|part]` +`--top-level-division=default`|`section`|`chapter`|`part` : Treat top-level headings as the given division type in LaTeX, ConTeXt, DocBook, and TEI output. The hierarchy order is part, chapter, then section; @@ -1624,7 +1629,7 @@ epub-cover-image: cover.jpg reference-links: true # block, section, or document reference-location: block -atx-headers: false +markdown-headings: setext # accept, reject, or all track-changes: accept diff --git a/src/Text/Pandoc/App/CommandLineOptions.hs b/src/Text/Pandoc/App/CommandLineOptions.hs index a82d8380e..661c6e06d 100644 --- a/src/Text/Pandoc/App/CommandLineOptions.hs +++ b/src/Text/Pandoc/App/CommandLineOptions.hs @@ -529,9 +529,26 @@ options = , Option "" ["atx-headers"] (NoArg - (\opt -> return opt { optSetextHeaders = False } )) + (\opt -> do + deprecatedOption "--atx-headers" + "use --markdown-headings=atx" + return opt { optSetextHeaders = False } )) "" -- "Use atx-style headers for markdown" + , Option "" ["markdown-headings"] + (ReqArg + (\arg opt -> do + headingFormat <- case arg of + "setext" -> pure True + "atx" -> pure False + _ -> E.throwIO $ PandocOptionError $ T.pack + ("Unknown markdown heading format: " ++ arg ++ + ". Expecting atx or setext") + pure opt { optSetextHeaders = headingFormat } + ) + "setext|atx") + "" + , Option "" ["listings"] (NoArg (\opt -> return opt { optListings = True })) diff --git a/src/Text/Pandoc/App/Opt.hs b/src/Text/Pandoc/App/Opt.hs index 64c61fb74..7e15b2cb0 100644 --- a/src/Text/Pandoc/App/Opt.hs +++ b/src/Text/Pandoc/App/Opt.hs @@ -330,6 +330,12 @@ doOpt (k',v) = do parseYAML v >>= \x -> return (\o -> o{ optSlideLevel = x }) "atx-headers" -> parseYAML v >>= \x -> return (\o -> o{ optSetextHeaders = not x }) + "markdown-headings" -> + parseYAML v >>= \x -> return (\o -> + case (T.toLower x) of + "atx" -> o{ optSetextHeaders = False } + "setext" -> o{ optSetextHeaders = True } + _ -> o) "ascii" -> parseYAML v >>= \x -> return (\o -> o{ optAscii = x }) "default-image-extension" -> @@ -469,7 +475,7 @@ defaultOpts = Opt , optPdfEngine = Nothing , optPdfEngineOpts = [] , optSlideLevel = Nothing - , optSetextHeaders = True + , optSetextHeaders = False , optAscii = False , optDefaultImageExtension = "" , optExtractMedia = Nothing diff --git a/src/Text/Pandoc/Logging.hs b/src/Text/Pandoc/Logging.hs index 5c9330b7b..825fdaadb 100644 --- a/src/Text/Pandoc/Logging.hs +++ b/src/Text/Pandoc/Logging.hs @@ -31,6 +31,7 @@ import Data.Aeson.Encode.Pretty (Config (..), defConfig, encodePretty', import qualified Data.ByteString.Lazy as BL import Data.Data (Data, toConstr) import qualified Data.Text as Text +import Data.Text (Text) import Data.Typeable (Typeable) import GHC.Generics (Generic) import Text.Pandoc.Definition @@ -59,45 +60,46 @@ instance FromYAML Verbosity where _ -> mzero data LogMessage = - SkippedContent Text.Text SourcePos - | IgnoredElement Text.Text - | DuplicateLinkReference Text.Text SourcePos - | DuplicateNoteReference Text.Text SourcePos - | NoteDefinedButNotUsed Text.Text SourcePos - | DuplicateIdentifier Text.Text SourcePos - | ReferenceNotFound Text.Text SourcePos - | CircularReference Text.Text SourcePos - | UndefinedToggle Text.Text SourcePos - | ParsingUnescaped Text.Text SourcePos - | CouldNotLoadIncludeFile Text.Text SourcePos - | MacroAlreadyDefined Text.Text SourcePos + SkippedContent Text SourcePos + | IgnoredElement Text + | DuplicateLinkReference Text SourcePos + | DuplicateNoteReference Text SourcePos + | NoteDefinedButNotUsed Text SourcePos + | DuplicateIdentifier Text SourcePos + | ReferenceNotFound Text SourcePos + | CircularReference Text SourcePos + | UndefinedToggle Text SourcePos + | ParsingUnescaped Text SourcePos + | CouldNotLoadIncludeFile Text SourcePos + | MacroAlreadyDefined Text SourcePos | InlineNotRendered Inline | BlockNotRendered Block - | DocxParserWarning Text.Text - | IgnoredIOError Text.Text - | CouldNotFetchResource Text.Text Text.Text - | CouldNotDetermineImageSize Text.Text Text.Text - | CouldNotConvertImage Text.Text Text.Text - | CouldNotDetermineMimeType Text.Text - | CouldNotConvertTeXMath Text.Text Text.Text - | CouldNotParseCSS Text.Text - | Fetching Text.Text - | Extracting Text.Text - | NoTitleElement Text.Text + | DocxParserWarning Text + | IgnoredIOError Text + | CouldNotFetchResource Text Text + | CouldNotDetermineImageSize Text Text + | CouldNotConvertImage Text Text + | CouldNotDetermineMimeType Text + | CouldNotConvertTeXMath Text Text + | CouldNotParseCSS Text + | Fetching Text + | Extracting Text + | NoTitleElement Text | NoLangSpecified - | InvalidLang Text.Text - | CouldNotHighlight Text.Text - | MissingCharacter Text.Text - | Deprecated Text.Text Text.Text - | NoTranslation Text.Text - | CouldNotLoadTranslations Text.Text Text.Text - | UnusualConversion Text.Text - | UnexpectedXmlElement Text.Text Text.Text - | UnknownOrgExportOption Text.Text - | CouldNotDeduceFormat [Text.Text] Text.Text + | InvalidLang Text + | CouldNotHighlight Text + | MissingCharacter Text + | Deprecated Text Text + | NoTranslation Text + | CouldNotLoadTranslations Text Text + | UnusualConversion Text + | UnexpectedXmlElement Text Text + | UnknownOrgExportOption Text + | CouldNotDeduceFormat [Text] Text | RunningFilter FilePath | FilterCompleted FilePath Integer - | CiteprocWarning Text.Text + | CiteprocWarning Text + | ATXHeadingInLHS Int Text deriving (Show, Eq, Data, Ord, Typeable, Generic) instance ToJSON LogMessage where @@ -224,8 +226,11 @@ instance ToJSON LogMessage where ,"milliseconds" .= Text.pack (show ms) ] CiteprocWarning msg -> ["message" .= msg] + ATXHeadingInLHS lvl contents -> + ["level" .= lvl + ,"contents" .= contents] -showPos :: SourcePos -> Text.Text +showPos :: SourcePos -> Text showPos pos = Text.pack $ sn ++ "line " ++ show (sourceLine pos) ++ " column " ++ show (sourceColumn pos) where sn = if sourceName pos == "source" || sourceName pos == "" @@ -238,7 +243,7 @@ encodeLogMessages ms = keyOrder [ "type", "verbosity", "contents", "message", "path", "source", "line", "column" ] } ms -showLogMessage :: LogMessage -> Text.Text +showLogMessage :: LogMessage -> Text showLogMessage msg = case msg of SkippedContent s pos -> @@ -333,6 +338,13 @@ showLogMessage msg = FilterCompleted fp ms -> "Completed filter " <> Text.pack fp <> " in " <> Text.pack (show ms) <> " ms" CiteprocWarning ms -> "Citeproc: " <> ms + ATXHeadingInLHS lvl contents -> + "Rendering heading '" <> contents <> "' as a paragraph.\n" <> + "ATX headings cannot be used in literate Haskell, because " <> + "'#' is not\nallowed in column 1." <> + if lvl < 3 + then " Consider using --markdown-headings=setext." + else "" messageVerbosity :: LogMessage -> Verbosity messageVerbosity msg = @@ -378,3 +390,4 @@ messageVerbosity msg = RunningFilter{} -> INFO FilterCompleted{} -> INFO CiteprocWarning{} -> WARNING + ATXHeadingInLHS{} -> WARNING diff --git a/src/Text/Pandoc/Options.hs b/src/Text/Pandoc/Options.hs index f1d9d44b7..c7f1a56fa 100644 --- a/src/Text/Pandoc/Options.hs +++ b/src/Text/Pandoc/Options.hs @@ -289,7 +289,7 @@ instance Default WriterOptions where , writerTopLevelDivision = TopLevelDefault , writerListings = False , writerHighlightStyle = Just pygments - , writerSetextHeaders = True + , writerSetextHeaders = False , writerEpubSubdirectory = "EPUB" , writerEpubMetadata = Nothing , writerEpubFonts = [] diff --git a/src/Text/Pandoc/Writers/Markdown.hs b/src/Text/Pandoc/Writers/Markdown.hs index 0aca83ad0..6aec6b244 100644 --- a/src/Text/Pandoc/Writers/Markdown.hs +++ b/src/Text/Pandoc/Writers/Markdown.hs @@ -514,6 +514,7 @@ blockToMarkdown' opts b@(RawBlock f str) = do blockToMarkdown' opts HorizontalRule = return $ blankline <> literal (T.replicate (writerColumns opts) "-") <> blankline blockToMarkdown' opts (Header level attr inlines) = do + -- first, if we're putting references at the end of a section, we -- put them here. blkLevel <- asks envBlockLevel @@ -543,8 +544,12 @@ blockToMarkdown' opts (Header level attr inlines) = do isEnabled Ext_gutenberg opts then capitalize inlines else inlines + let setext = writerSetextHeaders opts - hdr = nowrap $ case level of + when (not setext && isEnabled Ext_literate_haskell opts) $ + report $ ATXHeadingInLHS level (render Nothing contents) + + let hdr = nowrap $ case level of 1 | variant == PlainText -> if isEnabled Ext_gutenberg opts then blanklines 3 <> contents <> blanklines 2 diff --git a/test/Tests/Old.hs b/test/Tests/Old.hs index d1d27d9a5..2eb9e9cb0 100644 --- a/test/Tests/Old.hs +++ b/test/Tests/Old.hs @@ -215,7 +215,8 @@ tests pandocPath = [ test' "reader" ["-f", "ipynb-raw_html-raw_tex+raw_attribute", "-t", "native", "-s"] "ipynb/simple.ipynb" "ipynb/simple.out.native" - , test' "writer" ["-f", "native", "-t", + , test' "writer" ["-f", "native", + "--markdown-headings=setext", "-t", "ipynb-raw_html-raw_tex+raw_attribute", "-s"] "ipynb/simple.in.native" "ipynb/simple.ipynb" ] @@ -241,7 +242,8 @@ lhsWriterTests pandocPath format ] where t n f = test pandocPath - n ["--wrap=preserve", "-r", "native", "-s", "-w", f] + n ["--wrap=preserve", "-r", "native", "-s", + "--markdown-headings=setext", "-w", f] "lhs-test.native" ("lhs-test" <.> f) lhsReaderTest :: FilePath -> String -> TestTree diff --git a/test/Tests/Writers/Markdown.hs b/test/Tests/Writers/Markdown.hs index 00f883ecb..4b819de24 100644 --- a/test/Tests/Writers/Markdown.hs +++ b/test/Tests/Writers/Markdown.hs @@ -12,7 +12,9 @@ import Text.Pandoc.Arbitrary () import Text.Pandoc.Builder defopts :: WriterOptions -defopts = def{ writerExtensions = pandocExtensions } +defopts = def + { writerExtensions = pandocExtensions + , writerSetextHeaders = True } markdown :: (ToPandoc a) => a -> String markdown = unpack . purely (writeMarkdown defopts) . toPandoc diff --git a/test/command/3674.md b/test/command/3674.md index 92ed4bed7..a24f6b46b 100644 --- a/test/command/3674.md +++ b/test/command/3674.md @@ -2,7 +2,7 @@ Make sure we don't get duplicate reference links, even with `--reference-location=section`. ``` -% pandoc --reference-links -t markdown --reference-location=section --atx-headers +% pandoc --reference-links -t markdown --reference-location=section # a  diff --git a/test/command/3736.md b/test/command/3736.md index b66e0a359..b7d75aa5d 100644 --- a/test/command/3736.md +++ b/test/command/3736.md @@ -3,8 +3,7 @@
-Header 2
---------
+## Header 2
```
diff --git a/test/command/6723.md b/test/command/6723.md
index f4455fcce..ce89c4b88 100644
--- a/test/command/6723.md
+++ b/test/command/6723.md
@@ -20,8 +20,7 @@ Blah [@doe].
^D
Blah.[^1]
-References {#references .unnumbered}
-==========
+# References {#references .unnumbered}
::: {#refs .references .csl-bib-body .hanging-indent}
::: {#ref-doe .csl-entry}
diff --git a/test/command/6837.md b/test/command/6837.md
new file mode 100644
index 000000000..cb35e19a1
--- /dev/null
+++ b/test/command/6837.md
@@ -0,0 +1,29 @@
+```
+% pandoc -t markdown --markdown-headings=setext
+## Hi
+
+### Ok
+^D
+Hi
+--
+
+### Ok
+```
+
+```
+% pandoc -t markdown+lhs
+# Hi
+^D
+[WARNING] Rendering heading 'Hi' as a paragraph.
+ ATX headings cannot be used in literate Haskell, because '#' is not
+ allowed in column 1. Consider using --markdown-headings=setext.
+Hi
+```
+
+```
+% pandoc -t markdown --markdown-headings=atx
+Hi
+--
+^D
+## Hi
+```
diff --git a/test/command/pandoc-citeproc-119.md b/test/command/pandoc-citeproc-119.md
index 8dfdfe421..34ffc93af 100644
--- a/test/command/pandoc-citeproc-119.md
+++ b/test/command/pandoc-citeproc-119.md
@@ -12,8 +12,7 @@ References {#references .unnumbered}
^D
Averroes (1982); Averroes (1892); Averroes (1869)
-References {#references .unnumbered}
-==========
+# References {#references .unnumbered}
::: {#refs .references .csl-bib-body .hanging-indent line-spacing="2"}
::: {#ref-averroes/hercz .csl-entry}
diff --git a/test/command/pandoc-citeproc-14.md b/test/command/pandoc-citeproc-14.md
index 18c3a91ee..feb944395 100644
--- a/test/command/pandoc-citeproc-14.md
+++ b/test/command/pandoc-citeproc-14.md
@@ -54,8 +54,7 @@ References {#references .unnumbered}
Foo (Pelikan 1971b, 1:12). Bar (Pelikan 1971c, 1:12). Baz (Pelikan
1971a, 12).
-References {#references .unnumbered}
-==========
+# References {#references .unnumbered}
::: {#refs .references .csl-bib-body .hanging-indent}
::: {#ref-CTv1c2 .csl-entry}
diff --git a/test/command/pandoc-citeproc-152.md b/test/command/pandoc-citeproc-152.md
index 3e7be2e93..1810de45f 100644
--- a/test/command/pandoc-citeproc-152.md
+++ b/test/command/pandoc-citeproc-152.md
@@ -43,13 +43,11 @@ I have two citations [@Feminism2013gf; @Feminism2011ces].
References
==========
^D
-Test
-====
+# Test
I have two citations ("Communities," 2011; "Geek Feminism," 2013).
-References {#references .unnumbered}
-==========
+# References {#references .unnumbered}
::: {#refs .references .csl-bib-body .hanging-indent line-spacing="2"}
::: {#ref-Feminism2011ces .csl-entry}
diff --git a/test/command/pandoc-citeproc-160.md b/test/command/pandoc-citeproc-160.md
index 9f2a29e2c..114116289 100644
--- a/test/command/pandoc-citeproc-160.md
+++ b/test/command/pandoc-citeproc-160.md
@@ -26,13 +26,11 @@ Expected
>
> \[Jane11\] Jane Doe. A book. 2011.
^D
-No citation-label
------------------
+## No citation-label
Foo \[Jane11\].
-Expected
---------
+## Expected
> Foo \[Jane11\].
>
diff --git a/test/command/pandoc-citeproc-175.md b/test/command/pandoc-citeproc-175.md
index 7fc50f2b1..b84fc2040 100644
--- a/test/command/pandoc-citeproc-175.md
+++ b/test/command/pandoc-citeproc-175.md
@@ -27,13 +27,11 @@ Expected
> Doe, Jane. 2011. "A Title." *A Magazine*, January--February.
^D
-Missing en-dash between months
-------------------------------
+## Missing en-dash between months
Foo (Doe 2011).
-Expected
---------
+## Expected
> Doe, Jane. 2011. "A Title." *A Magazine*, January--February.
diff --git a/test/command/pandoc-citeproc-213.md b/test/command/pandoc-citeproc-213.md
index 2ca2287a1..d718a442f 100644
--- a/test/command/pandoc-citeproc-213.md
+++ b/test/command/pandoc-citeproc-213.md
@@ -23,8 +23,7 @@ References {#references .unnumbered}
^D
Foo (Doe 1999).
-References {#references .unnumbered}
-==========
+# References {#references .unnumbered}
::: {#refs .references .csl-bib-body .hanging-indent}
::: {#ref-doe1 .csl-entry}
diff --git a/test/command/pandoc-citeproc-25.md b/test/command/pandoc-citeproc-25.md
index ab0b8c6f8..540745071 100644
--- a/test/command/pandoc-citeproc-25.md
+++ b/test/command/pandoc-citeproc-25.md
@@ -20,8 +20,7 @@ References {#references .unnumbered}
^D
Foo (Author 1998).
-References {#references .unnumbered}
-==========
+# References {#references .unnumbered}
::: {#refs .references .csl-bib-body .hanging-indent}
::: {#ref-item1 .csl-entry}
diff --git a/test/command/pandoc-citeproc-27.md b/test/command/pandoc-citeproc-27.md
index ce8c20eff..d9758d711 100644
--- a/test/command/pandoc-citeproc-27.md
+++ b/test/command/pandoc-citeproc-27.md
@@ -25,8 +25,7 @@ Minimal example
Here is some text that needs a citation [@AuthorOne2014].
^D
-Minimal example
-===============
+# Minimal example
Here is some text that needs a citation (*1*).
diff --git a/test/command/pandoc-citeproc-371.md b/test/command/pandoc-citeproc-371.md
index c080b25c1..572b0dbe4 100644
--- a/test/command/pandoc-citeproc-371.md
+++ b/test/command/pandoc-citeproc-371.md
@@ -26,8 +26,7 @@ References {#references .unnumbered}
^D
Foo (Doe 2018, in press).
-References {#references .unnumbered}
-==========
+# References {#references .unnumbered}
::: {#refs .references .csl-bib-body .hanging-indent}
::: {#ref-item2 .csl-entry}
diff --git a/test/command/pandoc-citeproc-416.md b/test/command/pandoc-citeproc-416.md
index e34401118..fe29ef75d 100644
--- a/test/command/pandoc-citeproc-416.md
+++ b/test/command/pandoc-citeproc-416.md
@@ -42,8 +42,7 @@ references:
^D
Blah blah (Doe 2010, 2007, 2008).
-References {#references .unnumbered}
-==========
+# References {#references .unnumbered}
::: {#refs .references .csl-bib-body .hanging-indent}
::: {#ref-item2 .csl-entry}
diff --git a/test/command/pandoc-citeproc-47.md b/test/command/pandoc-citeproc-47.md
index 478a54bf3..5936ee8c0 100644
--- a/test/command/pandoc-citeproc-47.md
+++ b/test/command/pandoc-citeproc-47.md
@@ -90,8 +90,7 @@ coauthors' last names (regardless of how many coauthors there are)." and
chronological order is maintained, regardless of the added abbreviation.
\[ed., trans., comp., or whatever\]"
-References {#references .unnumbered}
-==========
+# References {#references .unnumbered}
::: {#refs .references .csl-bib-body .hanging-indent}
::: {#ref-doe .csl-entry}
diff --git a/test/command/pandoc-citeproc-57.md b/test/command/pandoc-citeproc-57.md
index 4232e1ef8..f208feb59 100644
--- a/test/command/pandoc-citeproc-57.md
+++ b/test/command/pandoc-citeproc-57.md
@@ -25,8 +25,7 @@ References
^D
(Faraday, forthcoming)
-References {#references .unnumbered}
-==========
+# References {#references .unnumbered}
::: {#refs .references .csl-bib-body .hanging-indent}
::: {#ref-Faraday-forthcoming .csl-entry}
diff --git a/test/command/pandoc-citeproc-58.md b/test/command/pandoc-citeproc-58.md
index 764533173..b9287fe3c 100644
--- a/test/command/pandoc-citeproc-58.md
+++ b/test/command/pandoc-citeproc-58.md
@@ -22,8 +22,7 @@ References
In this item, the title replaces the (unknown) author (see 14.79)
(*Stanze in lode della donna brutta* 1547, 12).
-References {#references .unnumbered}
-==========
+# References {#references .unnumbered}
::: {#refs .references .csl-bib-body .hanging-indent}
::: {#ref-stanze .csl-entry}
diff --git a/test/command/pandoc-citeproc-61.md b/test/command/pandoc-citeproc-61.md
index e96e93be7..e99f7e5ef 100644
--- a/test/command/pandoc-citeproc-61.md
+++ b/test/command/pandoc-citeproc-61.md
@@ -41,8 +41,7 @@ Foo [@doe, CL, 89]
References
==========
^D
-Text
-====
+# Text
Foo[^1]
@@ -54,8 +53,7 @@ Foo[^4]
Foo[^5]
-References {#references .unnumbered}
-==========
+# References {#references .unnumbered}
::: {#refs .references .csl-bib-body .hanging-indent}
::: {#ref-doe .csl-entry}
diff --git a/test/command/pandoc-citeproc-82.md b/test/command/pandoc-citeproc-82.md
index 332140ed3..bdeffaeea 100644
--- a/test/command/pandoc-citeproc-82.md
+++ b/test/command/pandoc-citeproc-82.md
@@ -24,8 +24,7 @@ Some text.[^1]
[^1]: Comment regarding text, supported by citation [@OCLC_i1099].
^D
-Title
-=====
+# Title
Some text.[^1]
diff --git a/test/command/pandoc-citeproc-87.md b/test/command/pandoc-citeproc-87.md
index 1a736ca51..e0aeda0f9 100644
--- a/test/command/pandoc-citeproc-87.md
+++ b/test/command/pandoc-citeproc-87.md
@@ -120,8 +120,7 @@ Doe (2006e) -- article-newspaper
Doe (2006b) -- article-newspaper YM
-References {#references .unnumbered}
-==========
+# References {#references .unnumbered}
::: {#refs .references .csl-bib-body .hanging-indent}
::: {#ref-item2a .csl-entry}
diff --git a/test/command/pandoc-citeproc-chicago-author-date.md b/test/command/pandoc-citeproc-chicago-author-date.md
index c754387f0..ad49d2ca3 100644
--- a/test/command/pandoc-citeproc-chicago-author-date.md
+++ b/test/command/pandoc-citeproc-chicago-author-date.md
@@ -48,8 +48,7 @@ References {#references .unnumbered}
locator [-@item2 p. 44].
^D
[WARNING] Citeproc: citation nonexistent not found
-Pandoc with citeproc-hs
-=======================
+# Pandoc with citeproc-hs
([**nonexistent?**](#ref-nonexistent))
@@ -82,8 +81,7 @@ Now some modifiers.[^3]
With some markup (*see* [Doe 2005, 32](#ref-item1)).
-References {#references .unnumbered}
-==========
+# References {#references .unnumbered}
::: {#refs .references .csl-bib-body .hanging-indent}
::: {#ref-item1 .csl-entry}
diff --git a/test/command/pandoc-citeproc-chicago-fullnote-bibliography.md b/test/command/pandoc-citeproc-chicago-fullnote-bibliography.md
index 4dfa091c0..4536342c6 100644
--- a/test/command/pandoc-citeproc-chicago-fullnote-bibliography.md
+++ b/test/command/pandoc-citeproc-chicago-fullnote-bibliography.md
@@ -49,8 +49,7 @@ References {#references .unnumbered}
[-@item1], and now Doe with a locator [-@item2 p. 44].
^D
[WARNING] Citeproc: citation nonexistent not found
-Pandoc with citeproc-hs
-=======================
+# Pandoc with citeproc-hs
[^1]
@@ -80,8 +79,7 @@ Now some modifiers.[^13]
With some markup.[^14]
-References {#references .unnumbered}
-==========
+# References {#references .unnumbered}
::: {#refs .references .csl-bib-body .hanging-indent}
::: {#ref-item2 .csl-entry}
diff --git a/test/command/pandoc-citeproc-ieee.md b/test/command/pandoc-citeproc-ieee.md
index 17ade2aae..bdc7e7150 100644
--- a/test/command/pandoc-citeproc-ieee.md
+++ b/test/command/pandoc-citeproc-ieee.md
@@ -49,8 +49,7 @@ References {#references .unnumbered}
locator [-@item2 p. 44].
^D
[WARNING] Citeproc: citation nonexistent not found
-Pandoc with citeproc-hs
-=======================
+# Pandoc with citeproc-hs
[**nonexistent?**](#ref-nonexistent)
@@ -83,8 +82,7 @@ Now some modifiers.[^3]
With some markup *see* [\[1, p. 32\]](#ref-item1).
-References {#references .unnumbered}
-==========
+# References {#references .unnumbered}
::: {#refs .references .csl-bib-body}
::: {#ref-item1 .csl-entry}
diff --git a/test/command/toc.md b/test/command/toc.md
index 9185257de..794af7690 100644
--- a/test/command/toc.md
+++ b/test/command/toc.md
@@ -23,34 +23,25 @@
- [E](#e)
- [e](#e-1)
-A
-=
+# A
-b
--
+## b
-B
-=
+# B
-b
--
+## b
::: {.interior}
-C
-=
+# C
-cc
---
+## cc
-D
-=
+# D
:::
::: {.blue}
-E
-=
+# E
-e
--
+## e
:::
```
diff --git a/test/writer.markdown b/test/writer.markdown
index a56a7447c..6a149882c 100644
--- a/test/writer.markdown
+++ b/test/writer.markdown
@@ -11,11 +11,9 @@ markdown test suite.
------------------------------------------------------------------------------
-Headers
-=======
+# Headers
-Level 2 with an [embedded link](/url)
--------------------------------------
+## Level 2 with an [embedded link](/url)
### Level 3 with *emphasis*
@@ -23,25 +21,21 @@ Level 2 with an [embedded link](/url)
##### Level 5
-Level 1
-=======
+# Level 1
-Level 2 with *emphasis*
------------------------
+## Level 2 with *emphasis*
### Level 3
with no blank line
-Level 2
--------
+## Level 2
with no blank line
------------------------------------------------------------------------------
-Paragraphs
-==========
+# Paragraphs
Here's a regular paragraph.
@@ -56,8 +50,7 @@ here.
------------------------------------------------------------------------------
-Block Quotes
-============
+# Block Quotes
E-mail style:
@@ -86,8 +79,7 @@ And a following paragraph.
------------------------------------------------------------------------------
-Code Blocks
-===========
+# Code Blocks
Code:
@@ -107,11 +99,9 @@ And:
------------------------------------------------------------------------------
-Lists
-=====
+# Lists
-Unordered
----------
+## Unordered
Asterisks tight:
@@ -155,8 +145,7 @@ Minuses loose:
- Minus 3
-Ordered
--------
+## Ordered
Tight:
@@ -196,8 +185,7 @@ Multiple paragraphs:
3. Item 3.
-Nested
-------
+## Nested
- Tab
- Tab
@@ -224,8 +212,7 @@ Same thing but with paragraphs:
3. Third
-Tabs and spaces
----------------
+## Tabs and spaces
- this is a list item indented with tabs
@@ -235,8 +222,7 @@ Tabs and spaces
- this is an example list item indented with spaces
-Fancy list markers
-------------------
+## Fancy list markers
(2) begins with 2
@@ -270,8 +256,7 @@ B. Williams
------------------------------------------------------------------------------
-Definition Lists
-================
+# Definition Lists
Tight using spaces:
@@ -364,8 +349,7 @@ orange
1. sublist
2. sublist
-HTML Blocks
-===========
+# HTML Blocks
Simple block on one line:
@@ -525,8 +509,7 @@ Hr's:
------------------------------------------------------------------------------
-Inline Markup
-=============
+# Inline Markup
This is *emphasized*, and so *is this*.
@@ -555,8 +538,7 @@ spaces: a\^b c\^d, a\~b c\~d.
------------------------------------------------------------------------------
-Smart quotes, ellipses, dashes
-==============================
+# Smart quotes, ellipses, dashes
"Hello," said the spider. "'Shelob' is my name."
@@ -577,8 +559,7 @@ Ellipses...and...and....
------------------------------------------------------------------------------
-LaTeX
-=====
+# LaTeX
- `\cite[22-23]{smith.1899}`{=tex}
- $2+2=4$
@@ -610,8 +591,7 @@ Cat & 1 \\ \hline
------------------------------------------------------------------------------
-Special Characters
-==================
+# Special Characters
Here is some unicode:
@@ -665,11 +645,9 @@ Minus: -
------------------------------------------------------------------------------
-Links
-=====
+# Links
-Explicit
---------
+## Explicit
Just a [URL](/url/).
@@ -689,8 +667,7 @@ Just a [URL](/url/).
[Empty]().
-Reference
----------
+## Reference
Foo [bar](/url/).
@@ -712,8 +689,7 @@ Foo [bar](/url/ "Title with "quotes" inside").
Foo [biz](/url/ "Title with "quote" inside").
-With ampersands
----------------
+## With ampersands
Here's a [link with an ampersand in the URL](http://example.com/?foo=1&bar=2).
@@ -724,8 +700,7 @@ Here's an [inline link](/script?foo=1&bar=2).
Here's an [inline link in pointy braces](/script?foo=1&bar=2).
-Autolinks
----------
+## Autolinks
With an ampersand: