CTAN update: markdown
Date: March 28, 2026 8:12:24 PM CET
Vít Starý Novotný submitted an update to the
markdown
package.
Version: 3.14.1-0-g68371ac4 2026-03-27
License: lppl1.3c
Summary description: Converting and rendering markdown documents inside TeX
Announcement text:
## 3.14.1 (2026-03-27) ### Fixes This version of the Markdown package has fixed the following issues: - Collapse spaces at the end of a line, even if these spaces originate from HTML entities. (reported by @jonathan-gruber-jg in #618, fixed in #624) - Do not consume blank lines following a line from a line block. (#627, #629) This prevents bad interactions between a preceding line block and a following pipe table when the `lineBlocks` and `pipeTables` options are enabled. - Distinguish pure comment lines from partial comment lines. (#628, #630) This prevents pure comment lines from being treated as extra blank lines for the purpose of distinguishing between inter-block and paragraph separators. - Strip trailing spaces from table captions with attributes. (reported by @lostenderman in #638, fixed in #639) - Fix acronyms breaking various elements. (reported in #625, fixed by @lostenderman in #626) ### Continuous integration This version of the Markdown package has made the following changes to our continuous integration: - Bump `crazy-max/ghaction-github-pages` from 4 to 5. (added by @dependabot in #632) - Bump `actions/upload-artifact` from 6 to 7. (added by @dependabot in #633) - Bump `docker/login-action` from 3 to 4. (added by @dependabot in #634) - Migrate from deprecated `TeX-Live/setup-texlive-action@v3` to `zauguin/install-texlive@v4`. (#636, 3c4c6bb0) - Test the package on both TeX Live 2025 and 2026. (#631, ff23b28..81928d7, 1a98fa99..c7ef926a) ### Miscellaneous This version of the Markdown package has made the following other changes: - Replace `mtxrun --luatex --generate` with `context --generate --luatex` in the user manual and `Dockerfile`. (@hanshagen and @gucci-on-fleek in #637) ## 3.14.0 (2026-02-26) ### Enhancements This version of the Markdown package has made the following new enhancements: - Support the new prepending (`^=`) and appending (`$=`) operators for renderers and renderer prototypes. (#232, #617) - Support the prepending and appending operators (`^=`, `+=`, and `$=`) for comma-list options like `extensions`. (#232, #621) - In theme `witiko/diagrams`, add parameter `command` for Mermaid diagrams. (#616, #622) For example, you can use different icon packs as follows: ```` tex \documentclass{article} \usepackage[import=witiko/diagrams@v2]{markdown} \begin{document} \begin{markdown} ``` mermaid {command = "mmdc --iconPacks '@iconify-json/logos'"} architecture-beta group api(logos:aws-lambda)[API] service db(logos:aws-aurora)[Database] in api service disk1(logos:aws-glacier)[Storage] in api service disk2(logos:aws-s3)[Storage] in api service server(logos:aws-ec2)[Server] in api db:L -- R:server disk1:T -- B:server disk2:T -- B:db ``` \end{markdown} \end{document} ```` - Recognize acronyms, initialisms, and other all-caps sequences. (suggested by @witiko, @michal-h21, and @TeXhackse in #615 and at [matrix.org][matrix-615], implemented in #623 and e2747530..3e14fa11) For example, you can automatically format acronyms in your LaTeX documents as follows: ``` tex \documentclass{article} \usepackage[plain]{markdown} \markdownSetup { % Format the following words as acronyms. acronyms = {HTML, YAML}, % We can also easily fill this list from e.g. YAML and other external sources. renderers = { % Format acronyms as small caps. acronym = \textsc{\MakeLowercase{#1}}, }, } \begin{document} \begin{markdown} HTML and YAML are two staples of modern tooling that often get mentioned in the same breath, even though they live in very different layers of the stack. \end{markdown} \end{document} ``` The default definitions for LaTeX also provide support for explicit markup for acronyms, as well as an integration with the `glossaries` package: ``` tex \documentclass{article} \usepackage{microtype, hyperref} \usepackage[acronym]{glossaries} \makeglossaries \newacronym{html}{HTML}{hypertext markup language} \newacronym{yaml}{YAML}{yet another markup language} \usepackage[bracketed_spans]{markdown} \begin{document} \begin{markdown} HTML and YAML are two staples of modern tooling that often get mentioned in the same breath, even though they live in very different layers of the stack. You may also use explicit markup: [HTML]{.acronym}. This works even if the acronym hasn't been registered with the glossaries package: [JSON]{.acronym}. \end{markdown} \printacronyms \end{document} ``` Compile the above example document `⟨filename⟩.tex` with the following commands: ``` lualatex ⟨filename⟩.tex makeglossaries ⟨filename⟩ lualatex ⟨filename⟩.tex ``` If you are not using the default definitions for LaTeX (for example, when loading the package with the `plain` or `noDefaults` options), you can import the `glossaries` acronyms manually as follows: ``` tex \markdownSetup { import = witiko/glossaries@v1, snippet = witiko/glossaries/import-acronyms, } ``` - Allow absolute snippet names in `\markdownSetupSnippet { ... }` and `\markdownSetup { snippet = ... }`. (#623) Absolute snippet names are prefixed with a slash (`/`). The leading slash is stripped, and the remaining name is used as-is. In contrast, relative snippet names are prefixed with the name of the currently processed theme, if any. For consistency, a leading slash may also be used in `\markdownSetup { theme = ... }` and `{ import = ... }`. Theme names, however, are currently always absolute, so the slash is only a syntactic normalization and has no semantic effect. For example, the following code also imports the `glossaries` acronyms: ``` tex \markdownSetup { import = /witiko/glossaries@v1, snippet = /witiko/glossaries/import-acronyms, } ``` The slash before `witiko/glossaries/import-acronyms` ensures that the correct snippet is loaded even when used from within another theme. Without the leading slash, the snippet name would instead be resolved as `⟨current theme name⟩/witiko/glossaries/import-acronyms`. By contrast, the slash before `witiko/glossaries@v1` is optional and provided only for consistency. Therefore, the following code would have the same effect: ``` tex \markdownSetup { import = witiko/glossaries@v1, snippet = /witiko/glossaries/import-acronyms, } ``` [matrix-615]: https://matrix.to/#/!pznomuvubVyxElflTe:matrix.org/$PSrg2dlpGUMastZzUGOpm08HfM3wHpQryZCIyepuZoA?via=matrix.org&via=im.f3l.de
The package’s Catalogue entry can be viewed at https://ctan.org/pkg/markdown The package’s files themselves can be inspected at https://mirrors.ctan.org/macros/generic/markdown/
Thanks for the upload. For the CTAN Team Vincent Goulet
CTAN is run entirely by volunteers and supported by TeX user groups. Please join a user group or donate to one, see https://ctan.org/lugs
## 3.14.1 (2026-03-27) ### Fixes This version of the Markdown package has fixed the following issues: - Collapse spaces at the end of a line, even if these spaces originate from HTML entities. (reported by @jonathan-gruber-jg in #618, fixed in #624) - Do not consume blank lines following a line from a line block. (#627, #629) This prevents bad interactions between a preceding line block and a following pipe table when the `lineBlocks` and `pipeTables` options are enabled. - Distinguish pure comment lines from partial comment lines. (#628, #630) This prevents pure comment lines from being treated as extra blank lines for the purpose of distinguishing between inter-block and paragraph separators. - Strip trailing spaces from table captions with attributes. (reported by @lostenderman in #638, fixed in #639) - Fix acronyms breaking various elements. (reported in #625, fixed by @lostenderman in #626) ### Continuous integration This version of the Markdown package has made the following changes to our continuous integration: - Bump `crazy-max/ghaction-github-pages` from 4 to 5. (added by @dependabot in #632) - Bump `actions/upload-artifact` from 6 to 7. (added by @dependabot in #633) - Bump `docker/login-action` from 3 to 4. (added by @dependabot in #634) - Migrate from deprecated `TeX-Live/setup-texlive-action@v3` to `zauguin/install-texlive@v4`. (#636, 3c4c6bb0) - Test the package on both TeX Live 2025 and 2026. (#631, ff23b28..81928d7, 1a98fa99..c7ef926a) ### Miscellaneous This version of the Markdown package has made the following other changes: - Replace `mtxrun --luatex --generate` with `context --generate --luatex` in the user manual and `Dockerfile`. (@hanshagen and @gucci-on-fleek in #637) ## 3.14.0 (2026-02-26) ### Enhancements This version of the Markdown package has made the following new enhancements: - Support the new prepending (`^=`) and appending (`$=`) operators for renderers and renderer prototypes. (#232, #617) - Support the prepending and appending operators (`^=`, `+=`, and `$=`) for comma-list options like `extensions`. (#232, #621) - In theme `witiko/diagrams`, add parameter `command` for Mermaid diagrams. (#616, #622) For example, you can use different icon packs as follows: ```` tex \documentclass{article} \usepackage[import=witiko/diagrams@v2]{markdown} \begin{document} \begin{markdown} ``` mermaid {command = "mmdc --iconPacks '@iconify-json/logos'"} architecture-beta group api(logos:aws-lambda)[API] service db(logos:aws-aurora)[Database] in api service disk1(logos:aws-glacier)[Storage] in api service disk2(logos:aws-s3)[Storage] in api service server(logos:aws-ec2)[Server] in api db:L -- R:server disk1:T -- B:server disk2:T -- B:db ``` \end{markdown} \end{document} ```` - Recognize acronyms, initialisms, and other all-caps sequences. (suggested by @witiko, @michal-h21, and @TeXhackse in #615 and at [matrix.org][matrix-615], implemented in #623 and e2747530..3e14fa11) For example, you can automatically format acronyms in your LaTeX documents as follows: ``` tex \documentclass{article} \usepackage[plain]{markdown} \markdownSetup { % Format the following words as acronyms. acronyms = {HTML, YAML}, % We can also easily fill this list from e.g. YAML and other external sources. renderers = { % Format acronyms as small caps. acronym = \textsc{\MakeLowercase{#1}}, }, } \begin{document} \begin{markdown} HTML and YAML are two staples of modern tooling that often get mentioned in the same breath, even though they live in very different layers of the stack. \end{markdown} \end{document} ``` The default definitions for LaTeX also provide support for explicit markup for acronyms, as well as an integration with the `glossaries` package: ``` tex \documentclass{article} \usepackage{microtype, hyperref} \usepackage[acronym]{glossaries} \makeglossaries \newacronym{html}{HTML}{hypertext markup language} \newacronym{yaml}{YAML}{yet another markup language} \usepackage[bracketed_spans]{markdown} \begin{document} \begin{markdown} HTML and YAML are two staples of modern tooling that often get mentioned in the same breath, even though they live in very different layers of the stack. You may also use explicit markup: [HTML]{.acronym}. This works even if the acronym hasn't been registered with the glossaries package: [JSON]{.acronym}. \end{markdown} \printacronyms \end{document} ``` Compile the above example document `⟨filename⟩.tex` with the following commands: ``` lualatex ⟨filename⟩.tex makeglossaries ⟨filename⟩ lualatex ⟨filename⟩.tex ``` If you are not using the default definitions for LaTeX (for example, when loading the package with the `plain` or `noDefaults` options), you can import the `glossaries` acronyms manually as follows: ``` tex \markdownSetup { import = witiko/glossaries@v1, snippet = witiko/glossaries/import-acronyms, } ``` - Allow absolute snippet names in `\markdownSetupSnippet { ... }` and `\markdownSetup { snippet = ... }`. (#623) Absolute snippet names are prefixed with a slash (`/`). The leading slash is stripped, and the remaining name is used as-is. In contrast, relative snippet names are prefixed with the name of the currently processed theme, if any. For consistency, a leading slash may also be used in `\markdownSetup { theme = ... }` and `{ import = ... }`. Theme names, however, are currently always absolute, so the slash is only a syntactic normalization and has no semantic effect. For example, the following code also imports the `glossaries` acronyms: ``` tex \markdownSetup { import = /witiko/glossaries@v1, snippet = /witiko/glossaries/import-acronyms, } ``` The slash before `witiko/glossaries/import-acronyms` ensures that the correct snippet is loaded even when used from within another theme. Without the leading slash, the snippet name would instead be resolved as `⟨current theme name⟩/witiko/glossaries/import-acronyms`. By contrast, the slash before `witiko/glossaries@v1` is optional and provided only for consistency. Therefore, the following code would have the same effect: ``` tex \markdownSetup { import = witiko/glossaries@v1, snippet = /witiko/glossaries/import-acronyms, } ``` [matrix-615]: https://matrix.to/#/!pznomuvubVyxElflTe:matrix.org/$PSrg2dlpGUMastZzUGOpm08HfM3wHpQryZCIyepuZoA?via=matrix.org&via=im.f3l.de
The package’s Catalogue entry can be viewed at https://ctan.org/pkg/markdown The package’s files themselves can be inspected at https://mirrors.ctan.org/macros/generic/markdown/
Thanks for the upload. For the CTAN Team Vincent Goulet
CTAN is run entirely by volunteers and supported by TeX user groups. Please join a user group or donate to one, see https://ctan.org/lugs
markdown – Converting and rendering markdown documents inside TeX
The package provides facilities for the conversion of markdown and YAML markup to plain TeX. These are provided both in form of a Lua module and in form of plain TeX, LaTeX, and ConTeXt macro packages that enable the direct inclusion of markdown and YAML documents inside TeX documents.
| Package | markdown |
| Version | 3.14.1-0-g68371ac4 2026-03-27 |
| Copyright | 2009–2016 John MacFarlane, Hans Hagen 2016–2026 Vít Starý Novotný, Andrej Genčur |
| Maintainer | Vít Starý Novotný |