v2.9.0 (2020/09/14)
The Markdown package converts markdown markup to TeX commands. The functionality is provided both as a Lua module and as plain TeX, LaTeX, and ConTeXt macro packages that can be used to directly typeset documents containing markdown markup. Unlike other convertors, the Markdown package does not require any external programs, and makes it easy to redefine how each and every markdown element is rendered. Creative abuse of the markdown syntax is encouraged.
This document is a user manual for the Markdown package. It provides tutorials and code examples. For an in-depth description of the package requirements, interfaces, and implementation, please refer to the technical documentation.
The package requires a working TeX distribution. TeX Live ≥ 2013 is known to work and so are recent installation of MikTeX. If you are using a minimal installation of a TeX distribution, please consult the technical documentation for a detailed list of required packages.
The package comes pre-installed with TeX Live ≥ 2016 and with recent installations of MikTeX. Unless you explicitly wish to use the latest version of the package, you are encouraged to skip this step.
To install the package, first download the package from the repository using Git:
Next, enter the directory named markdown
and interpret the file named markdown.ins
file using a Unicode-aware TeX engine, such as XeTeX or LuaTeX:
This should produce the following files:
markdown.lua
, the Lua module,markdown-cli.lua
, the Lua command-line interface,markdown.tex
, the plain TeX macro package,markdown.sty
, the LaTeX package, andt-markdown.tex
, the ConTeXt module.To perform a local installation, place the above files into your TeX directory structure. This is generally where the individual files should be placed:
<TEXMF>/tex/luatex/markdown/markdown.lua
<TEXMF>/scripts/markdown/markdown-cli.lua
<TEXMF>/tex/generic/markdown/markdown.tex
<TEXMF>/tex/latex/markdown/markdown.sty
<TEXMF>/tex/context/third/markdown/t-markdown.tex
where <TEXMF>
corresponds to a root of your TeX distribution, such as /usr/share/texmf
and ~/texmf
on UN*X systems or C:\Users\
⟨Your username⟩\texmf
on Windows systems. When in doubt, consult the manual of your TeX distribution.
Alternatively, you can also store the above files in the same folder as your TeX document and distribute them together. This way your document can be portably typeset on legacy TeX distributions.
In this section, we will take the necessary steps to typeset our first markdown document in TeX. This will serve as our first hands-on experience with the package and also as a reassurance that the package has been correctly installed.
Using a text editor, create a text document named document.tex
with the following content:
Using a text editor, create a text document named hello.lua
with the following content:
#!/usr/bin/env texlua
local kpse = require("kpse")
kpse.set_program_name("luatex")
local markdown = require("markdown")
local convert = markdown.new()
print(convert("Hello *world*!"))
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the text “Hello world!” Invoking pdfTeX should have the same effect:
Using a text editor, create a text document named hello.md
with the following content:
Next, invoke LuaTeX from the terminal:
where ⟨CLI pathname⟩ corresponds to the location of the Lua CLI script file, such as ~/texmf/scripts/markdown/markdown-cli.lua
on UN*X systems or C:\Users\
⟨Your username⟩\texmf\scripts\markdown\markdown-cli.lua
on Windows systems. Use the command kpsewhich -a markdown-cli.lua
to locate the Lua CLI script file using Kpathsea.
A PDF document named document.pdf
should be produced and contain the text “Hello world!” Invoking pdfTeX should have the same effect:
Using a text editor, create a text document named document.tex
with the following content:
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the text “Hello world!” Invoking pdfTeX should have the same effect:
Using a text editor, create a text document named document.tex
with the following content:
\documentclass{article}
\usepackage{markdown}
\begin{document}
\begin{markdown}
Hello *world*!
\end{markdown}
\end{document}
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the text “Hello world!” Invoking pdfTeX should have the same effect:
As the next step, try typesetting the example documents distributed along with the Markdown package:
A PDF document named latex.pdf
should be produced. Open the text documents latex.tex
and example.md
in a text editor to see how the example documents are structured. Try changing the documents and typesetting them as follows:
to see the effect of your changes.
Using a text editor, create a text document named document.tex
with the following content:
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the text “Hello world!” Invoking pdfTeX should have the same effect:
As the next step, try typesetting the example documents distributed along with the Markdown package:
A PDF document named context.pdf
should be produced. Open the text documents context.tex
and example.md
in a text editor to see how the example documents are structured. Try changing the documents and typesetting them as follows:
to see the effect of your changes.
In this section, I will describe the individual parts of the Markdown package. Each part will be shown by example, leaving the implementation details to the technical documentation.
In this section, I will describe the individual interfaces exposed by the Markdown package starting with the low-level Lua interfaces and all the way up to the LaTeX and ConTeXt interfaces intended for the ordinary user.
The Lua programming language is what drives the conversion from markdown to TeX in the Markdown package. Based on the Lunamark Lua library by John MacFarlane, the Lua implementation is largely independent on TeX, and can be used separately from typesetting a document. Lua provides two interfaces: a Lua module and a command-line interface (CLI).
A Lua module is a software library that can be used from in other programs. The markdown
Lua module makes it possible to convert markdown to TeX from within LuaTeX documents and Lua scripts.
The markdown
Lua module exposes the new(
⟨options⟩)
method, which creates a converter function from markdown to TeX. The properties of the converter function are specified by the Lua table options
. The parameter is optional; when unspecified, the behaviour will be the same as if ⟨options⟩ were an empty table.
Using a text editor, create a text document named document.tex
with the following content:
Using a text editor, create a text document named example.lua
with the following content:
#!/usr/bin/env texlua
local kpse = require("kpse")
kpse.set_program_name("luatex")
local markdown = require("markdown")
local input, convert_safe, convert_unsafe, paragraph
input = [[$\sqrt{-1}$ *equals* $i$.]]
convert_safe = markdown.new()
convert_unsafe = markdown.new({hybrid = true})
paragraph = [[\par]]
print(
convert_safe(input) .. paragraph ..
convert_unsafe(input)
)
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
$\sqrt{-1}$ equals $i$.
√-̅1̅ equals i.
Invoking pdfTeX should have the same effect:
Rather than use the texlua
interpreter, we can also access the markdown
Lua module directly from our document. Using a text editor, create a text document named document.tex
with the following content:
\input markdown
\input lmfonts
\directlua{
local markdown = require("markdown")
local input, convert_safe, convert_unsafe, paragraph
input = [[$\string\sqrt{-1}$ *equals* $i$.]]
convert_safe = markdown.new()
convert_unsafe = markdown.new({hybrid = true})
paragraph = [[\par]]
tex.sprint(
convert_safe(input) .. paragraph ..
convert_unsafe(input)
)
}
\bye
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
$\sqrt{-1}$ equals $i$.
√-̅1̅ equals i.
In this case, we cannot use pdfTeX, because pdfTeX does not define the \directlua
TeX command.
The Lua command-line interface (CLI) of the Markdown package makes the functionality of the Lua module accessible from the command line. This makes it possible to convert documents from markdown to TeX manually without any knowledge of the Lua programming language.
The Lua command-line interface accepts the same options as the markdown
Lua module, but now the options are specified as command-line parameters.
Using a text editor, create a text document named document.tex
with the following content:
Using a text editor, create a text document named example.md
with the following content:
Next, invoke LuaTeX from the terminal:
texlua ⟨CLI pathname⟩ -- example.md safe.tex
texlua ⟨CLI pathname⟩ hybrid=true -- example.md unsafe.tex
luatex document.tex
where ⟨CLI pathname⟩ corresponds to the location of the Lua CLI script file, such as ~/texmf/scripts/markdown/markdown-cli.lua
on UN*X systems or C:\Users\
⟨Your username⟩\texmf\scripts\markdown\markdown-cli.lua
on Windows systems. Use the command kpsewhich -a markdown-cli.lua
to locate the Lua CLI script file using Kpathsea.
A PDF document named document.pdf
should be produced and contain the following text:
$\sqrt{-1}$ equals $i$.
√-̅1̅ equals i.
Invoking pdfTeX should have the same effect:
texlua ⟨CLI pathname⟩ -- example.md safe.tex
texlua ⟨CLI pathname⟩ hybrid=true -- example.md unsafe.tex
pdftex document.tex
The plain TeX interface provides TeX commands that typeset markdown documents by using the Lua interface behind the scenes. Unlike the Lua interface, the plain TeX interface does not provide low-level tools for converting markdown to TeX. Instead, its goal is to provide high-level typesetting capabilities.
The plain TeX interface accepts the same options as the markdown
Lua module, in addition to its own options, but now the options are specified as TeX commands.
Using a text editor, create a text document named document.tex
with the following content:
\input markdown
\input lmfonts
\markdownBegin
$\sqrt{-1}$ *equals* $i$.
\markdownEnd
\def\markdownOptionHybrid{true}
\markdownBegin
$\sqrt{-1}$ *equals* $i$.
\markdownEnd
\bye
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
$\sqrt{-1}$ equals $i$.
√-̅1̅ equals i.
Invoking pdfTeX should have the same effect:
The LaTeX interface provides the same level of functionality as the plain TeX interface by using the plain TeX interface behind the scenes. Unlike the plain TeX interface, the LaTeX interface uses familiar LaTeX idioms, such as package options and environments.
The LaTeX interface accepts the same options as the plain TeX interface, but now the options are specified as ⟨key⟩ = ⟨value⟩ pairs and they are passed either as package options, in the \markdownSetup
command, or as parameters for the markdown*
LaTeX environment.
Using a text editor, create a text document named document.tex
with the following content:
\documentclass{article}
\usepackage{markdown}
\begin{document}
\begin{markdown}
$\sqrt{-1}$ *equals* $i$
\end{markdown}
\begin{markdown*}{hybrid}
$\sqrt{-1}$ *equals* $i$
\end{markdown*}
\end{document}
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
$\sqrt{-1}$ equals $i$.
√-̅1̅ equals i.
Invoking pdfTeX should have the same effect:
The ConTeXt interface provides the same level of functionality as the plain TeX interface by using the plain TeX interface behind the scenes. Unlike the plain TeX interface, the ConTeXt interface uses familiar ConTeXt idioms, such as environments.
The ConTeXt interface accepts the same options as the plain TeX interface.
Using a text editor, create a text document named document.tex
with the following content:
\usemodule[t][markdown]
\starttext
\startmarkdown
$\sqrt{-1}$ *equals* $i$.
\stopmarkdown
\def\markdownOptionHybrid{true}
\startmarkdown
$\sqrt{-1}$ *equals* $i$.
\stopmarkdown
\stoptext
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
$\sqrt{-1}$ equals $i$.
√-̅1̅ equals i.
Invoking pdfTeX should have the same effect:
In this section, I will describe all the options recognized by the Markdown package.
Lua options control the conversion from markdown to TeX. They are supported by all interfaces of the Markdown package starting with the low-level Lua interfaces and all the way up to the LaTeX and ConTeXt interfaces.
cacheDir
cacheDir
(default value: "."
)A path to the directory containing auxiliary cache files. If the last segment of the path does not exist, it will be created by the Lua command-line and plain TeX implementations. The Lua implementation expects that the entire path already exists.
When iteratively writing and typesetting a markdown document, the cache files are going to accumulate over time. You are advised to clean the cache directory every now and then, or to set it to a temporary filesystem (such as /tmp
on UN*X systems), which gets periodically emptied.
Using a text editor, create a text document named document.tex
with the following content:
\input markdown
\directlua{
local markdown = require("markdown")
local convert = markdown.new({cacheDir = "cache"})
local input = "Hello *world*!"
tex.sprint(convert(input)) }
\bye
Create an empty directory named cache
next to our text document. Then, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the text “Hello world!” Several cache files of the Markdown package will also be produced in the cache
directory as we requested using the cacheDir
option.
Using a text editor, create a text document named document.tex
with the following content:
Using a text editor, create a text document named hello.md
with the following content:
Next, invoke LuaTeX from the terminal:
where ⟨CLI pathname⟩ corresponds to the location of the Lua CLI script file, such as ~/texmf/scripts/markdown/markdown-cli.lua
on UN*X systems or C:\Users\
⟨Your username⟩\texmf\scripts\markdown\markdown-cli.lua
on Windows systems. Use the command kpsewhich -a markdown-cli.lua
to locate the Lua CLI script file using Kpathsea.
A PDF document named document.pdf
should be produced and contain the text “Hello world!” A directory named cache
containing several cache files of the Markdown package will also be produced as we requested using the cacheDir
option.
Using a text editor, create a text document named document.tex
with the following content:
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the text “Hello world!” A directory named cache
containing several cache files of the Markdown package will also be produced as we requested using the cacheDir
option.
Using a text editor, create a text document named document.tex
with the following content:
\documentclass{article}
\usepackage[cacheDir=cache]{markdown}
\begin{document}
\begin{markdown}
Hello *world*!
\end{markdown}
\end{document}
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the text “Hello world!” A directory named cache
containing several cache files of the Markdown package will also be produced as we requested using the cacheDir
option.
Using a text editor, create a text document named document.tex
with the following content:
\usemodule[t][markdown]
\def\markdownOptionCacheDir{cache}
\starttext
\startmarkdown
Hello *world*!
\stopmarkdown
\stoptext
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the text “Hello world!” A directory named cache
containing several cache files of the Markdown package will also be produced as we requested using the cacheDir
option.
frozenCacheFileName
frozenCacheFileName
(default value: "frozenCache.tex"
)A path to an output file (frozen cache) that will be created when the finalizeCache
option is enabled and will contain a mapping between an enumeration of markdown documents and their auxiliary cache files.
The frozen cache makes it possible to later typeset a plain TeX document that contains markdown documents without invoking Lua using the \markdownOptionFrozenCache
plain TeX option. As a result, the plain TeX document becomes more portable, but further changes in the order and the content of markdown documents will not be reflected.
Using a text editor, create a text document named document.tex
with the following content:
\input markdown
\directlua{
local markdown = require("markdown")
local convert = markdown.new({finalizeCache = true, frozenCacheFileName = "cache.tex"})
local input = "Hello *world*!"
tex.sprint(convert(input)) }
\bye
Then, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the text “Hello world!” A frozen cache will also be produced in the cache.tex
output file as we requested using the finalizeCache
and frozenCacheFileName
options.
Using a text editor, create a text document named document.tex
with the following content:
Using a text editor, create a text document named hello.md
with the following content:
Next, invoke LuaTeX from the terminal:
texlua ⟨CLI pathname⟩ finalizeCache=true frozenCacheFileName=cache.tex -- hello.md hello.tex
luatex document.tex
where ⟨CLI pathname⟩ corresponds to the location of the Lua CLI script file, such as ~/texmf/scripts/markdown/markdown-cli.lua
on UN*X systems or C:\Users\
⟨Your username⟩\texmf\scripts\markdown\markdown-cli.lua
on Windows systems. Use the command kpsewhich -a markdown-cli.lua
to locate the Lua CLI script file using Kpathsea.
A PDF document named document.pdf
should be produced and contain the text “Hello world!” A frozen cache will also be produced in the cache.tex
output file as we requested using the finalizeCache
and frozenCacheFileName
options.
Using a text editor, create a text document named document.tex
with the following content:
\input markdown
\def\markdownOptionFinalizeCache{true}
\def\markdownOptionFrozenCacheFileName{cache.tex}
\markdownBegin
Hello *world*!
\markdownEnd
\bye
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the text “Hello world!” A frozen cache will also be produced in the cache.tex
output file as we requested using the finalizeCache
and frozenCacheFileName
options.
Next, create a new text document frozen-document.tex
with the following content:
\input markdown
\def\markdownOptionFrozenCache{true}
\def\markdownOptionFrozenCacheFileName{cache.tex}
\markdownBegin
Hi *world*!
\markdownEnd
\bye
Last, invoke pdfTeX without shell access from the terminal:
A PDF document named frozen-document.pdf
should be produced and contain the text “Hello world!” Since we used the contents of the frozen cache using the \markdownOptionFrozenCache
option, we were able to typeset the document without accessing the shell or invoking Lua, but the change in the content of the markdown document from “Hello world!” to “Hi world!” was not reflected.
Using a text editor, create a text document named document.tex
with the following content:
\documentclass[finalizecache]{article}
\usepackage[frozenCacheFileName=cache.tex]{markdown}
\begin{document}
\begin{markdown}
Hello *world*!
\end{markdown}
\end{document}
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the text “Hello world!” A frozen cache will also be produced in the cache.tex
output file as we requested using the finalizecache
and frozenCacheFileName
options.
Next, create a new text document frozen-document.tex
with the following content:
\documentclass[frozencache]{article}
\usepackage[frozenCacheFileName=cache.tex]{markdown}
\begin{document}
\begin{markdown}
Hi *world*!
\end{markdown}
\end{document}
Last, invoke pdfTeX without shell access from the terminal:
A PDF document named frozen-document.pdf
should be produced and contain the text “Hello world!” Since we used the contents of the frozen cache using the frozencache
option, we were able to typeset the document without accessing the shell or invoking Lua, but the change in the content of the markdown document from “Hello world!” to “Hi world!” was not reflected.
Using a text editor, create a text document named document.tex
with the following content:
\usemodule[t][markdown]
\def\markdownOptionFinalizeCache{true}
\def\markdownOptionFrozenCacheFileName{cache.tex}
\starttext
\startmarkdown
Hello *world*!
\stopmarkdown
\stoptext
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the text “Hello world!” A frozen cache will also be produced in the cache.tex
output file as we requested using the finalizeCache
and frozenCacheFileName
options.
Next, create a new text document frozen-document.tex
with the following content:
\usemodule[t][markdown]
\def\markdownOptionFrozenCache{true}
\def\markdownOptionFrozenCacheFileName{cache.tex}
\starttext
\startmarkdown
Hi *world*!
\stopmarkdown
\stoptext
Last, invoke pdfTeX without shell access from the terminal:
A PDF document named frozen-document.pdf
should be produced and contain the text “Hello world!” Since we used the contents of the frozen cache using the \markdownOptionFrozenCache
option, we were able to typeset the document without accessing the shell or invoking Lua, but the change in the content of the markdown document from “Hello world!” to “Hi world!” was not reflected.
blankBeforeBlockquote
blankBeforeBlockquote
(default value: false
)Require a blank line between a paragraph and the following blockquote.
Do not require a blank line between a paragraph and the following blockquote.
Using a text editor, create a text document named document.tex
with the following content:
\input markdown
\input lmfonts
\directlua{
local markdown = require("markdown")
local newline = [[^^J^^J]]
local convert, input
convert = markdown.new()
input = "A paragraph." .. newline ..
"> A quote." .. newline
tex.sprint(convert(input))
convert = markdown.new({blankBeforeBlockquote = true})
input = "A paragraph." .. newline ..
"> Not a quote." .. newline
tex.sprint(convert(input)) }
\bye
Then, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
A paragraph.
A quote.
A paragraph > Not a quote.
Using a text editor, create a text document named document.tex
with the following content:
Using a text editor, create a text document named content.md
with the following content:
Next, invoke LuaTeX from the terminal:
texlua ⟨CLI pathname⟩ -- content.md optionfalse.tex
texlua ⟨CLI pathname⟩ blankBeforeBlockquote=true -- content.md optiontrue.tex
luatex document.tex
where ⟨CLI pathname⟩ corresponds to the location of the Lua CLI script file, such as ~/texmf/scripts/markdown/markdown-cli.lua
on UN*X systems or C:\Users\
⟨Your username⟩\texmf\scripts\markdown\markdown-cli.lua
on Windows systems. Use the command kpsewhich -a markdown-cli.lua
to locate the Lua CLI script file using Kpathsea.
A PDF document named document.pdf
should be produced and contain the following text:
A paragraph.
A quote?
A paragraph. > A quote?
Using a text editor, create a text document named document.tex
with the following content:
\input markdown
\markdownBegin
A paragraph.
> A quote.
\markdownEnd
\def\markdownOptionBlankBeforeBlockquote{true}
\markdownBegin
A paragraph.
> Not a quote.
\markdownEnd
\bye
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
A paragraph.
A quote.
A paragraph > Not a quote.
Using a text editor, create a text document named document.tex
with the following content:
\documentclass{article}
\usepackage{markdown}
\begin{document}
\begin{markdown}
A paragraph.
> A quote.
\end{markdown}
\begin{markdown*}{blankBeforeBlockquote}
A paragraph.
> Not a quote.
\end{markdown*}
\end{document}
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
A paragraph.
A quote.
A paragraph > Not a quote.
Using a text editor, create a text document named document.tex
with the following content:
\usemodule[t][markdown]
\starttext
\startmarkdown
A paragraph.
> A quote.
\stopmarkdown
\def\markdownOptionBlankBeforeBlockquote{true}
\startmarkdown
A paragraph.
> Not a quote.
\stopmarkdown
\stoptext
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
A paragraph.
A quote.
A paragraph > Not a quote.
blankBeforeCodeFence
blankBeforeCodeFence
(default value: false
)Require a blank line between a paragraph and the following fenced code block.
Do not require a blank line between a paragraph and the following fenced code block.
Using a text editor, create a text document named document.tex
with the following content:
\input markdown
\input lmfonts
\directlua{
local markdown = require("markdown")
local newline = [[^^J^^J]]
local convert, input
convert = markdown.new({fencedCode = true})
input = "A paragraph." .. newline ..
"```" .. newline ..
"A code fence." .. newline ..
"```" .. newline
tex.sprint(convert(input))
convert = markdown.new({
fencedCode = true, blankBeforeCodeFence = true})
input = "A paragraph." .. newline ..
"```" .. newline ..
"Not a code fence." .. newline ..
"```" .. newline
tex.sprint(convert(input)) }
\bye
Then, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
A paragraph.
A code fence.
A paragraph.
Not a code fence.
Using a text editor, create a text document named document.tex
with the following content:
Using a text editor, create a text document named content.md
with the following content:
Next, invoke LuaTeX from the terminal:
texlua ⟨CLI pathname⟩ fencedCode=true -- content.md optionfalse.tex
texlua ⟨CLI pathname⟩ fencedCode=true blankBeforeCodeFence=true -- content.md optiontrue.tex
luatex document.tex
where ⟨CLI pathname⟩ corresponds to the location of the Lua CLI script file, such as ~/texmf/scripts/markdown/markdown-cli.lua
on UN*X systems or C:\Users\
⟨Your username⟩\texmf\scripts\markdown\markdown-cli.lua
on Windows systems. Use the command kpsewhich -a markdown-cli.lua
to locate the Lua CLI script file using Kpathsea.
A PDF document named document.pdf
should be produced and contain the following text:
A paragraph.
A code fence?
A paragraph.
A code fence?
Using a text editor, create a text document named document.tex
with the following content:
\input markdown
\def\markdownOptionFencedCode{true}
\markdownBegin
A paragraph.
```
A code fence.
```
\markdownEnd
\def\markdownOptionBlankBeforeCodeFence{true}
\markdownBegin
A paragraph.
```
Not a code fence.
```
\markdownEnd
\bye
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
A paragraph.
A code fence.
A paragraph.
Not a code fence.
Using a text editor, create a text document named document.tex
with the following content:
\documentclass{article}
\usepackage[fencedCode]{markdown}
\begin{document}
\begin{markdown}
A paragraph.
```
A code fence.
```
\end{markdown}
\begin{markdown*}{blankBeforeCodeFence}
A paragraph.
```
Not a code fence.
```
\end{markdown*}
\end{document}
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
A paragraph.
A code fence.
A paragraph.
Not a code fence.
Using a text editor, create a text document named document.tex
with the following content:
\usemodule[t][markdown]
\def\markdownOptionFencedCode{true}
\starttext
\startmarkdown
A paragraph.
```
A code fence.
```
\stopmarkdown
\def\markdownOptionBlankBeforeCodeFence{true}
\startmarkdown
A paragraph.
```
Not a code fence.
```
\stopmarkdown
\stoptext
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
A paragraph.
A code fence.
A paragraph.
Not a code fence.
blankBeforeHeading
blankBeforeHeading
(default value: false
)Require a blank line between a paragraph and the following header.
Do not require a blank line between a paragraph and the following header.
Using a text editor, create a text document named document.tex
with the following content:
\input markdown
\input lmfonts
\def\markdownRendererHeadingOne#1{{\bf #1}\par}
\directlua{
local markdown = require("markdown")
local newline = [[^^J^^J]]
local convert, input
convert = markdown.new()
input = "A paragraph." .. newline ..
"A heading." .. newline ..
"==========" .. newline
tex.sprint(convert(input))
convert = markdown.new({blankBeforeHeading = true})
input = "A paragraph." .. newline ..
"Not a heading." .. newline ..
"==============" .. newline
tex.sprint(convert(input)) }
\bye
Then, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
A paragraph.
A heading.
A paragraph. Not a heading. ==============
Using a text editor, create a text document named document.tex
with the following content:
Using a text editor, create a text document named content.md
with the following content:
Next, invoke LuaTeX from the terminal:
texlua ⟨CLI pathname⟩ -- content.md optionfalse.tex
texlua ⟨CLI pathname⟩ blankBeforeHeading=true -- content.md optiontrue.tex
luatex document.tex
where ⟨CLI pathname⟩ corresponds to the location of the Lua CLI script file, such as ~/texmf/scripts/markdown/markdown-cli.lua
on UN*X systems or C:\Users\
⟨Your username⟩\texmf\scripts\markdown\markdown-cli.lua
on Windows systems. Use the command kpsewhich -a markdown-cli.lua
to locate the Lua CLI script file using Kpathsea.
A PDF document named document.pdf
should be produced and contain the following text:
A paragraph.
A heading?
A paragraph. A heading? ==========
Using a text editor, create a text document named document.tex
with the following content:
\input markdown
\markdownBegin
A paragraph.
A heading.
==========
\markdownEnd
\def\markdownOptionBlankBeforeHeading{true}
\markdownBegin
A paragraph.
Not a heading.
==============
\markdownEnd
\bye
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
A paragraph.
A heading.
A paragraph. Not a heading. ==============
Using a text editor, create a text document named document.tex
with the following content:
\documentclass{article}
\usepackage{markdown}
\begin{document}
\begin{markdown}
A paragraph.
A heading.
==========
\end{markdown}
\begin{markdown*}{blankBeforeHeading}
A paragraph.
Not a heading.
==============
\end{markdown*}
\end{document}
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
A paragraph.
A heading.
A paragraph. Not a heading. ==============
Using a text editor, create a text document named document.tex
with the following content:
\usemodule[t][markdown]
\starttext
\startmarkdown
A paragraph.
A heading.
==========
\stopmarkdown
\def\markdownOptionBlankBeforeHeading{true}
\startmarkdown
A paragraph.
Not a heading.
==============
\stopmarkdown
\stoptext
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
A paragraph.
A heading.
A paragraph. Not a heading. ==============
breakableBlockquotes
breakableBlockquotes
(default value: false
)A blank line separates block quotes.
Blank lines in the middle of a block quote are ignored.
Using a text editor, create a text document named document.tex
with the following content:
\input markdown
\input lmfonts
\def\markdownRendererHeadingOne#1{{\bf #1}\par}
\directlua{
local markdown = require("markdown")
local newline = [[^^J^^J]]
local convert, input
convert = markdown.new()
input = "> A single" .. newline .. newline ..
"> block quote." .. newline
tex.sprint(convert(input))
convert = markdown.new({breakableBlockquotes = true})
input = "> A block quote." .. newline .. newline ..
"> Another block quote." .. newline
tex.sprint(convert(input)) }
\bye
Then, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
A single block quote.
A block quote.
Another block quote.
Using a text editor, create a text document named document.tex
with the following content:
Using a text editor, create a text document named content.md
with the following content:
Next, invoke LuaTeX from the terminal:
texlua ⟨CLI pathname⟩ -- content.md optionfalse.tex
texlua ⟨CLI pathname⟩ breakableBlockquotes=true -- content.md optiontrue.tex
luatex document.tex
where ⟨CLI pathname⟩ corresponds to the location of the Lua CLI script file, such as ~/texmf/scripts/markdown/markdown-cli.lua
on UN*X systems or C:\Users\
⟨Your username⟩\texmf\scripts\markdown\markdown-cli.lua
on Windows systems. Use the command kpsewhich -a markdown-cli.lua
to locate the Lua CLI script file using Kpathsea.
A PDF document named document.pdf
should be produced and contain the following text:
A single block quote or two block quotes?
A single block quote
or two block quotes?
Using a text editor, create a text document named document.tex
with the following content:
\input markdown
\markdownBegin
> A single
> block quote.
\markdownEnd
\def\markdownOptionBreakableBlockquotes{true}
\markdownBegin
> A block quote.
> Another block quote.
\markdownEnd
\bye
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
A single block quote.
A block quote.
Another block quote.
Using a text editor, create a text document named document.tex
with the following content:
\documentclass{article}
\usepackage{markdown}
\begin{document}
\begin{markdown}
> A single
> block quote.
\end{markdown}
\begin{markdown*}{breakableBlockquotes}
> A block quote.
> Another block quote.
\end{markdown*}
\end{document}
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
A single block quote.
A block quote.
Another block quote.
Using a text editor, create a text document named document.tex
with the following content:
\usemodule[t][markdown]
\starttext
\startmarkdown
> A single
> block quote.
\stopmarkdown
\def\markdownOptionBreakableBlockquotes{true}
\startmarkdown
> A block quote.
> Another block quote.
\stopmarkdown
\stoptext
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
A single block quote.
A block quote.
Another block quote.
citationNbsps
citationNbsps
(default value: true
)Replace regular spaces with non-breakable spaces inside the prenotes and postnotes of citations produced via the pandoc citation syntax extension.
Do not replace regular spaces with non-breakable spaces inside the prenotes and postnotes of citations produced via the pandoc citation syntax extension.
Using a text editor, create a text document named document.bib
with the following content:
@book{knuth:tex,
author = "Knuth, Donald Ervin",
title = "The \TeX book, volume A of Computers and typesetting",
publisher = "Addison-Wesley",
year = "1984"
}
Using a text editor, create a text document named document.tex
with the following content:
\documentclass{article}
\usepackage[citations]{markdown}
\begin{document}
\begin{markdown}
The TeXbook [@knuth:tex, p. 123 and 130] is good.
\end{markdown}
\begin{markdown*}{citationNbsps = false}
The TeXbook [@knuth:tex, p. 123 and 130] is good.
\end{markdown*}
\bibliographystyle{plain}
\bibliography{document.bib}
\end{document}
Next, invoke LuaTeX and BibTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text, where the middot (·
) denotes a non-breakable space:
The TeXbook [1, p.·123·and·130] is good.
The TeXbook [1, p. 123 and 130] is good.
References
[1] Donald·Ervin Knuth. The TeXbook, volume A of Computers and typesetting. Addison-Wesley, 1984.
citations
citations
(default value: false
)Enable the pandoc citation syntax extension:
Here is a simple parenthetical citation [@doe99] and here
is a string of several [see @doe99, pp. 33-35; also
@smith04, chap. 1].
A parenthetical citation can have a [prenote @doe99] and
a [@smith04 postnote]. The name of the author can be
suppressed by inserting a dash before the name of an
author as follows [-@smith04].
Here is a simple text citation @doe99 and here is
a string of several @doe99 [pp. 33-35; also @smith04,
chap. 1]. Here is one with the name of the author
suppressed -@doe99.
Disable the pandoc citation syntax extension.
Using a text editor, create a text document named document.bib
with the following content:
@book{knuth:tex,
author = "Knuth, Donald Ervin",
title = "The \TeX book, volume A of Computers and typesetting",
publisher = "Addison-Wesley",
year = "1984"
}
Using a text editor, create a text document named document.tex
with the following content:
\documentclass{article}
\usepackage[backend=biber]{biblatex}
\addbibresource{document.bib}
\usepackage[citations]{markdown}
\begin{document}
\begin{markdown}
The TeXbook [@knuth:tex, p. 123 and 130] was written by @knuth:tex.
\end{markdown}
\printbibliography
\end{document}
Next, invoke LuaTeX and Biber from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
The TeXbook [1, p.·123 and 130] was written by Knuth [1].
References
[1] Donald Ervin Knuth. The TeXbook, volume A of Computers and typesetting. Addison-Wesley, 1984.
codeSpans
codeSpans
(default value: true
)Enable the code span syntax:
Disable the code span syntax. This allows you to easily use the quotation mark ligatures in texts that do not contain code spans:
``This is a quote.''
Using a text editor, create a text document named document.tex
with the following content:
\input markdown
\input lmfonts
\directlua{
local markdown = require("markdown")
local convert = markdown.new()
local input =
"``This is a code span.'' " ..
"``This is no longer a code span.''"
tex.sprint(convert(input)) }
\par
\directlua{
local markdown = require("markdown")
local convert = markdown.new({codeSpans = false})
local input =
"``This is a quote.'' " ..
"``This is another quote.''"
tex.sprint(convert(input)) }
\bye
Then, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
This is a code span.''
This is no longer a code span.’’“This is a quote.” “This is another quote.”
Using a text editor, create a text document named document.tex
with the following content:
Using a text editor, create a text document named content.md
with the following content:
Next, invoke LuaTeX from the terminal:
texlua ⟨CLI pathname⟩ codeSpans=false -- content.md optionfalse.tex
texlua ⟨CLI pathname⟩ -- content.md optiontrue.tex
luatex document.tex
where ⟨CLI pathname⟩ corresponds to the location of the Lua CLI script file, such as ~/texmf/scripts/markdown/markdown-cli.lua
on UN*X systems or C:\Users\
⟨Your username⟩\texmf\scripts\markdown\markdown-cli.lua
on Windows systems. Use the command kpsewhich -a markdown-cli.lua
to locate the Lua CLI script file using Kpathsea.
A PDF document named document.pdf
should be produced and contain the following text:
“Is this a code span?” “Or a quote?”
Is this a code span?''
Or a quote?’’
Using a text editor, create a text document named document.tex
with the following content:
\input markdown
\markdownBegin
``This is a code span.''
``This is no longer a code span.''
\markdownEnd
\def\markdownOptionCodeSpans{false}
\markdownBegin
``This is a quote.''
``This is another quote.''
\markdownEnd
\bye
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
This is a code span.''
This is no longer a code span.’’“This is a quote.” “This is another quote.”
Using a text editor, create a text document named document.tex
with the following content:
\documentclass{article}
\usepackage{markdown}
\begin{document}
\begin{markdown}
``This is a code span.''
``This is no longer a code span.''
\end{markdown}
\begin{markdown*}{codeSpans=false}
``This is a quote.''
``This is another quote.''
\end{markdown*}
\end{document}
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
This is a code span.''
This is no longer a code span.’’“This is a quote.” “This is another quote.”
Using a text editor, create a text document named document.tex
with the following content:
\usemodule[t][markdown]
\starttext
\startmarkdown
``This is a code span.''
``This is no longer a code span.''
\stopmarkdown
\def\markdownOptionCodeSpans{false}
\startmarkdown
``This is a quote.''
``This is another quote.''
\stopmarkdown
\stoptext
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
This is a code span.''
This is no longer a code span.’’“This is a quote.” “This is another quote.”
contentBlocks
contentBlocks
(default value: false
)Enable the iA Writer content blocks syntax extension:
Disable the iA Writer content blocks syntax extension.
Using a text editor, create a text document named table.csv
with the following content:
Name,Surname,Born
Albert,Einstein,1879
Marie,Curie,1867
Thomas,Edison,1847
Create also a text document named markdown-languages.json
with the following content:
Create also a text document named code.tex
with the following content:
Create also a text document named part.md
with the following content:
Create also a text document named document.tex
with the following content:
\documentclass{article}
\usepackage{minted}
\usepackage[contentBlocks]{markdown}
\begin{document}
\begin{markdown}
/table.csv (An example table)
/code.tex (An example code listing)
/part.md (A file transclusion example)
\end{markdown}
\end{document}
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
Name Surname Born Albert Einstein 1879 Marie Curie 1867 Thomas Edison 1847 Table 1: An example table
This is a transcluded markdown document.
Using a text editor, create a text document named table.csv
with the following content:
Name,Surname,Born
Albert,Einstein,1879
Marie,Curie,1867
Thomas,Edison,1847
Create also a text document named markdown-languages.json
with the following content:
Create also a text document named code.tex
with the following content:
Create also a text document named part.md
with the following content:
Create also a text document named document.tex
with the following content:
\usemodule[t][markdown]
\def\markdownOptionContentBlocks{true}
\definetyping [ConTeXt]
\setuptyping [ConTeXt] [option=TEX]
\starttext
\startmarkdown
/table.csv (An example table)
/code.tex (An example code listing)
/part.md (A file transclusion example)
\stopmarkdown
\stoptext
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
Name Surname Born Albert Einstein 1879 Marie Curie 1867 Thomas Edison 1847 Table 1: An example table
This is a transcluded markdown document.
contentBlocksLanguageMap
contentBlocksLanguageMap
(default value: "markdown-languages.json"
)The filename of the JSON file that maps filename extensions to programming language names in the iA Writer content blocks.
Using a text editor, create a text document named table.csv
with the following content:
Name,Surname,Born
Albert,Einstein,1879
Marie,Curie,1867
Thomas,Edison,1847
Create also a text document named language-map.json
with the following content:
Create also a text document named code.tex
with the following content:
Create also a text document named part.md
with the following content:
Create also a text document named document.tex
with the following content:
\documentclass{article}
\usepackage{minted}
\usepackage[contentBlocks]{markdown}
\markdownSetup{
contentBlocksLanguageMap = {language-map.json},
}
\begin{document}
\begin{markdown}
/table.csv (An example table)
/code.tex (An example code listing)
/part.md (A file transclusion example)
\end{markdown}
\end{document}
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
Name Surname Born Albert Einstein 1879 Marie Curie 1867 Thomas Edison 1847 Table 1: An example table
This is a transcluded markdown document.
Using a text editor, create a text document named table.csv
with the following content:
Name,Surname,Born
Albert,Einstein,1879
Marie,Curie,1867
Thomas,Edison,1847
Create also a text document named language-map.json
with the following content:
Create also a text document named code.tex
with the following content:
Create also a text document named part.md
with the following content:
Create also a text document named document.tex
with the following content:
\usemodule[t][markdown]
\def\markdownOptionContentBlocks{true}
\def\markdownOptionContentBlocksLanguageMap{language-map.json}
\definetyping [ConTeXt]
\setuptyping [ConTeXt] [option=TEX]
\starttext
\startmarkdown
/table.csv (An example table)
/code.tex (An example code listing)
/part.md (A file transclusion example)
\stopmarkdown
\stoptext
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
Name Surname Born Albert Einstein 1879 Marie Curie 1867 Thomas Edison 1847 Table 1: An example table
This is a transcluded markdown document.
definitionLists
definitionLists
(default value: false
)Enable the pandoc definition list syntax extension:
Disable the pandoc definition list syntax extension.
Using a text editor, create a text document named document.tex
with the following content:
\documentclass{article}
\usepackage[definitionLists]{markdown}
\begin{document}
\begin{markdown}
Term 1
: Definition 1
Term 2 with *inline markup*
: Definition 2
{ some code, part of Definition 2 }
Third paragraph of definition 2.
\end{markdown}
\end{document}
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
- Term 1
Definition 1
- Term 2 with inline markup
Definition 2
{ some code, part of Definition 2 }
Third paragraph of definition 2.
Using a text editor, create a text document named document.tex
with the following content:
\usemodule[t][markdown]
\def\markdownOptionDefinitionLists{true}
\starttext
\startmarkdown
Term 1
: Definition 1
Term 2 with *inline markup*
: Definition 2
{ some code, part of Definition 2 }
Third paragraph of definition 2.
\stopmarkdown
\stoptext
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
- Term 1
Definition 1
- Term 2 with inline markup
Definition 2
{ some code, part of Definition 2 }
Third paragraph of definition 2.
fencedCode
fencedCode
(default value: false
)Enable the commonmark fenced code block extension:
Disable the commonmark fenced code block extension.
Using a text editor, create a text document named document.tex
with the following content:
\documentclass{article}
\usepackage{minted}
\usepackage[fencedCode]{markdown}
\begin{document}
\begin{markdown}
~~~ js
if (a > 3) {
moveShip(5 * gravity, DOWN);
}
~~~~~~
``` html
<pre>
<code>
// Some comments
line 1 of code
line 2 of code
line 3 of code
</code>
</pre>
```
\end{markdown}
\end{document}
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
Using a text editor, create a text document named document.tex
with the following content:
\usemodule[t][markdown]
\def\markdownOptionFencedCode{true}
\definetyping [js]
\definetyping [html]
\setuptyping [html] [option=XML]
\starttext
\startmarkdown
~~~ js
if (a > 3) {
moveShip(5 * gravity, DOWN);
}
~~~~~~
``` html
<pre>
<code>
// Some comments
line 1 of code
line 2 of code
line 3 of code
</code>
</pre>
```
\stopmarkdown
\stoptext
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
finalizeCache
finalizeCache
(default value: false
)Whether an output file specified with the frozenCacheFileName
option (frozen cache) that contains a mapping between an enumeration of markdown documents and their auxiliary cache files will be created.
The frozen cache makes it possible to later typeset a plain TeX document that contains markdown documents without invoking Lua using the \markdownOptionFrozenCache
plain TeX option. As a result, the plain TeX document becomes more portable, but further changes in the order and the content of markdown documents will not be reflected.
Using a text editor, create a text document named document.tex
with the following content:
\input markdown
\def\markdownOptionFinalizeCache{true}
\markdownBegin
Hello *world*!
\markdownEnd
\bye
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the text “Hello world!” A frozen cache will also be produced as we requested using the finalizeCache
option.
Next, change the content of document.tex
as follows:
Last, invoke pdfTeX without shell access from the terminal:
A new PDF document named document.pdf
should be produced and contain the same text “Hello world!” Since we used the contents of the frozen cache using the \markdownOptionFrozenCache
option, we were able to typeset the document without accessing the shell or invoking Lua, but the change in the content of the markdown document from “Hello world!” to “Hi world!” was not reflected.
Using a text editor, create a text document named document.tex
with the following content:
\documentclass[finalizecache]{article}
\usepackage{markdown}
\begin{document}
\begin{markdown}
Hello *world*!
\end{markdown}
\end{document}
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the text “Hello world!” A frozen cache will also be produced as we requested using the finalizecache
option.
Next, change the content of document.tex
as follows:
\documentclass[frozencache]{article}
\usepackage{markdown}
\begin{document}
\begin{markdown}
Hi *world*!
\end{markdown}
\end{document}
Last, invoke pdfTeX without shell access from the terminal:
A new PDF document named document.pdf
should be produced and contain the same text “Hello world!” Since we used the contents of the frozen cache using the \markdownOptionFrozenCache
option, we were able to typeset the document without accessing the shell or invoking Lua, but the change in the content of the markdown document from “Hello world!” to “Hi world!” was not reflected.
Using a text editor, create a text document named document.tex
with the following content:
\usemodule[t][markdown]
\def\markdownOptionFinalizeCache{true}
\starttext
\startmarkdown
Hello *world*!
\stopmarkdown
\stoptext
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the text “Hello world!” A frozen cache will also be produced in the cache.tex
output file as we requested using the finalizeCache
option.
Next, change the content of document.tex
as follows:
\usemodule[t][markdown]
\def\markdownOptionFrozenCache{true}
\starttext
\startmarkdown
Hi *world*!
\stopmarkdown
\stoptext
Last, invoke pdfTeX without shell access from the terminal:
A new PDF document named document.pdf
should be produced and contain the same text “Hello world!” Since we used the contents of the frozen cache using the \markdownOptionFrozenCache
option, we were able to typeset the document without accessing the shell or invoking Lua, but the change in the content of the markdown document from “Hello world!” to “Hi world!” was not reflected.
footnotes
footnotes
(default value: false
)Enable the pandoc footnote syntax extension:
Here is a footnote reference,[^1] and another.[^longnote]
[^1]: Here is the footnote.
[^longnote]: Here's one with multiple blocks.
Subsequent paragraphs are indented to show that they
belong to the previous footnote.
{ some.code }
The whole paragraph can be indented, or just the
first line. In this way, multi-paragraph footnotes
work like multi-paragraph list items.
This paragraph won't be part of the note, because it
isn't indented.
Disable the pandoc footnote syntax extension.
Using a text editor, create a text document named document.tex
with the following content:
\documentclass{article}
\usepackage[footnotes]{markdown}
\begin{document}
\begin{markdown}
Here is a footnote reference,[^1] and another.[^longnote]
[^1]: Here is the footnote.
[^longnote]: Here's one with multiple blocks.
Subsequent paragraphs are indented to show that they
belong to the previous footnote.
{ some.code }
The whole paragraph can be indented, or just the
first line. In this way, multi-paragraph footnotes
work like multi-paragraph list items.
This paragraph won't be part of the note, because it
isn't indented.
\end{markdown}
\end{document}
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
Here is a footnote reference,1 and another.2
This paragraph won’t be part of the note, because it isn’t indented.
Using a text editor, create a text document named document.tex
with the following content:
\usemodule[t][markdown]
\def\markdownOptionFootnotes{true}
\starttext
\startmarkdown
Here is a footnote reference,[^1] and another.[^longnote]
[^1]: Here is the footnote.
[^longnote]: Here's one with multiple blocks.
Subsequent paragraphs are indented to show that they
belong to the previous footnote.
{ some.code }
The whole paragraph can be indented, or just the
first line. In this way, multi-paragraph footnotes
work like multi-paragraph list items.
This paragraph won't be part of the note, because it
isn't indented.
\stopmarkdown
\stoptext
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
Here is a footnote reference,3 and another.4
This paragraph won’t be part of the note, because it isn’t indented.
frozenCacheCounter
frozenCacheCounter
(default value: 0
)The number of the current markdown document that will be stored in an output file (frozen cache) when the finalizeCache
is enabled. When the document number is 0, then a new frozen cache will be created. Otherwise, the frozen cache will be appended.
Each frozen cache entry will define a TeX macro \markdownFrozenCache
⟨number⟩ that will typeset markdown document number ⟨number⟩.
Using a text editor, create a text document named document.tex
with the following content:
\input markdown
\directlua{
local markdown = require("markdown")
local firstConvert = markdown.new({finalizeCache = true, frozenCacheCounter = 0})
local firstInput = "Hello"
local secondConvert = markdown.new({finalizeCache = true, frozenCacheCounter = 1})
local secondInput = "*world*!"
tex.sprint(firstConvert(firstInput) .. [[ ]] .. secondConvert(secondInput)) }
\bye
Then, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the text “Hello world!” A frozen cache with two entries will also be produced as we requested using the frozenCacheCounter
option.
hashEnumerators
hashEnumerators
(default value: false
)Enable the use of hash symbols (#
) as ordered item list markers:
Disable the use of hash symbols (#
) as ordered item list markers.
Using a text editor, create a text document named document.tex
with the following content:
\documentclass{article}
\usepackage{markdown}
\begin{document}
\begin{markdown}
. Bird
. McHale
. Parish
\end{markdown}
\begin{markdown*}{hashEnumerators}
. Bird
. McHale
. Parish
\end{markdown*}
\end{document}
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
. Bird
. McHale
. Parish
- Bird
- McHale
- Parish
Using a text editor, create a text document named document.tex
with the following content:
\usemodule[t][markdown]
\starttext
\startmarkdown
. Bird
. McHale
. Parish
\stopmarkdown
\def\markdownOptionHashEnumerators{true}
\startmarkdown
. Bird
. McHale
. Parish
\stopmarkdown
\stoptext
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
. Bird
. McHale
. Parish
- Bird
- McHale
- Parish
headerAttributes
headerAttributes
(default value: false
)Enable the assignment of HTML attributes to headings:
# My first heading {#foo}
## My second heading ## {#bar .baz}
Yet another heading {key=value}
===================
These HTML attributes have currently no effect other than enabling content slicing.
Disable the assignment of HTML attributes to headings.
html
html
(default value: false
)Enable the recognition of HTML tags, block elements, comments, HTML instructions, and entities in the input. Tags, block elements (along with contents), HTML instructions, and comments will be ignored and HTML entities will be replaced with the corresponding Unicode codepoints.
Disable the recognition of HTML markup. Any HTML markup in the input will be rendered as plain text.
Using a text editor, create a text document named document.tex
with the following content:
\input markdown
\input lmfonts
\directlua{
local markdown = require("markdown")
local convert = markdown.new()
local newline = [[^^J^^J]]
local input =
"<div>*There is no block tag support.*</div>" .. newline ..
"*There is no <inline tag="tag"></inline> support.*" .. newline ..
"_There is no <!-- comment --> support._" .. newline ..
"_There is no <? HTML instruction ?> support._"
tex.sprint(convert(input)) }
\par
\directlua{
local markdown = require("markdown")
local convert = markdown.new({html = true})
local input =
"<div>*There is block tag support.*</div>" .. newline ..
"*There is <inline tag="tag"></inline> support.*" .. newline ..
"_There is <!-- comment --> support._" .. newline ..
"_There is <? HTML instruction ?> support._"
tex.sprint(convert(input)) }
\bye
Then, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
<div>There is no block tag support.</div> There is no <inline tag=”tag”></inline> support. There is no <!– comment –> support. There is no <? HTML instruction ?> support.
There is support. There is support. There is support.
Using a text editor, create a text document named document.tex
with the following content:
Using a text editor, create a text document named content.md
with the following content:
<div>
*Is there block tag support?*
</div>
*Is there <inline tag="tag"></inline> support?*
_Is there <!-- comment --> support?_
_Is there <? HTML instruction ?> support?_
Next, invoke LuaTeX from the terminal:
texlua ⟨CLI pathname⟩ -- content.md optionfalse.tex
texlua ⟨CLI pathname⟩ html=true -- content.md optiontrue.tex
luatex document.tex
where ⟨CLI pathname⟩ corresponds to the location of the Lua CLI script file, such as ~/texmf/scripts/markdown/markdown-cli.lua
on UN*X systems or C:\Users\
⟨Your username⟩\texmf\scripts\markdown\markdown-cli.lua
on Windows systems. Use the command kpsewhich -a markdown-cli.lua
to locate the Lua CLI script file using Kpathsea.
A PDF document named document.pdf
should be produced and contain the following text:
<div>Is there block tag support?</div> Is there <inline tag=”tag”></inline> support? Is there <!– comment –> support? Is there <? HTML instruction ?> support?
Is there support? Is there support? Is there support?
Using a text editor, create a text document named document.tex
with the following content:
\input markdown
\input lmfonts
\markdownBegin
<div>
*There is no block tag support.*
</div>
*There is no <inline tag="tag"></inline> support.*
_There is no <!-- comment --> support._
_There is no <? HTML instruction ?> support._
\markdownEnd
\def\markdownOptionHtml{true}
\markdownBegin
<div>
*There is block tag support.*
</div>
*There is <inline tag="tag"></inline> support.*
_There is <!-- comment --> support._
_There is <? HTML instruction ?> support._
\markdownEnd
\bye
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
<div>There is no block tag support.</div> There is no <inline tag=”tag”></inline> support. There is no <!– comment –> support. There is no <? HTML instruction ?> support.
There is support. There is support. There is support.
Using a text editor, create a text document named document.tex
with the following content:
\documentclass{article}
\usepackage{markdown}
\begin{document}
\begin{markdown}
<div>
*There is no block tag support.*
</div>
*There is no <inline tag="tag"></inline> support.*
_There is no <!-- comment --> support._
_There is no <? HTML instruction ?> support._
\end{markdown}
\begin{markdown*}{html}
<div>
*There is block tag support.*
</div>
*There is <inline tag="tag"></inline> support.*
_There is <!-- comment --> support._
_There is <? HTML instruction ?> support._
\end{markdown*}
\end{document}
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
<div>There is no block tag support.</div> There is no <inline tag=”tag”></inline> support. There is no <!– comment –> support. There is no <? HTML instruction ?> support.
There is support. There is support. There is support.
Using a text editor, create a text document named document.tex
with the following content:
\usemodule[t][markdown]
\starttext
\startmarkdown
<div>
*There is no block tag support.*
</div>
*There is no <inline tag="tag"></inline> support.*
_There is no <!-- comment --> support._
_There is no <? HTML instruction ?> support._
\stopmarkdown
\def\markdownOptionHtml{true}
\startmarkdown
<div>
*There is block tag support.*
</div>
*There is <inline tag="tag"></inline> support.*
_There is <!-- comment --> support._
_There is <? HTML instruction ?> support._
\stopmarkdown
\stoptext
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
<div>There is no block tag support.</div> There is no <inline tag=”tag”></inline> support. There is no <!– comment –> support. There is no <? HTML instruction ?> support.
There is support. There is support. There is support.
hybrid
hybrid
(default value: true
)Disable the escaping of special plain TeX characters, which makes it possible to intersperse your markdown markup with TeX code. The intended usage is in documents prepared manually by a human author. In such documents, it can often be desirable to mix TeX and markdown markup freely.
Enable the escaping of special plain TeX characters outside verbatim environments, so that they are not interpretted by TeX. This is encouraged when typesetting automatically generated content or markdown documents that were not prepared with this package in mind.
Using a text editor, create a text document named document.tex
with the following content:
\input markdown
\input lmfonts
\directlua{
local markdown = require("markdown")
local input, convert_safe, convert_unsafe, paragraph
input = [[$\string\sqrt{-1}$ *equals* $i$.]]
convert_safe = markdown.new()
convert_unsafe = markdown.new({hybrid = true})
paragraph = [[\par]]
tex.sprint(
convert_safe(input) .. paragraph ..
convert_unsafe(input)
)
}
\bye
Then, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
$\sqrt {-1}$ equals $i$.
√-̅1̅ equals i.
Using a text editor, create a text document named document.tex
with the following content:
Using a text editor, create a text document named content.md
with the following content:
Next, invoke LuaTeX from the terminal:
texlua ⟨CLI pathname⟩ -- content.md optionfalse.tex
texlua ⟨CLI pathname⟩ hybrid=true -- content.md optiontrue.tex
luatex document.tex
where ⟨CLI pathname⟩ corresponds to the location of the Lua CLI script file, such as ~/texmf/scripts/markdown/markdown-cli.lua
on UN*X systems or C:\Users\
⟨Your username⟩\texmf\scripts\markdown\markdown-cli.lua
on Windows systems. Use the command kpsewhich -a markdown-cli.lua
to locate the Lua CLI script file using Kpathsea.
A PDF document named document.pdf
should be produced and contain the following text:
$\sqrt {-1}$ equals $i$.
√-̅1̅ equals i.
Using a text editor, create a text document named document.tex
with the following content:
\input markdown
\input lmfonts
\markdownBegin
$\sqrt{-1}$ *equals* $i$.
\markdownEnd
\def\markdownOptionHybrid{true}
\markdownBegin
$\sqrt{-1}$ *equals* $i$.
\markdownEnd
\bye
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
$\sqrt {-1}$ equals $i$.
√-̅1̅ equals i.
Using a text editor, create a text document named document.tex
with the following content:
\documentclass{article}
\usepackage{markdown}
\begin{document}
\begin{markdown}
$\sqrt{-1}$ *equals* $i$.
\end{markdown}
\begin{markdown*}{hybrid}
$\sqrt{-1}$ *equals* $i$.
\end{markdown*}
\end{document}
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
$\sqrt {-1}$ equals $i$.
√-̅1̅ equals i.
Using a text editor, create a text document named document.tex
with the following content:
\usemodule[t][markdown]
\starttext
\startmarkdown
$\sqrt{-1}$ *equals* $i$.
\stopmarkdown
\def\markdownOptionHybrid{true}
\startmarkdown
$\sqrt{-1}$ *equals* $i$.
\stopmarkdown
\stoptext
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
$\sqrt {-1}$ equals $i$.
√-̅1̅ equals i.
inlineFootnotes
inlineFootnotes
(default value: false
)Enable the pandoc inline footnote syntax extension:
Disable the pandoc inline footnote syntax extension.
Using a text editor, create a text document named document.tex
with the following content:
\documentclass{article}
\usepackage[footnotes, inlineFootnotes]{markdown}
\begin{document}
\begin{markdown}
Here is an inline note.^[Inlines notes are easier to
write, since you don't have to pick an identifier and
move down to type the note.]
\end{markdown}
\end{document}
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
Here is an inline note.5
Using a text editor, create a text document named document.tex
with the following content:
\usemodule[t][markdown]
\def\markdownOptionFootnotes{true}
\def\markdownOptionInlineFootnotes{true}
\starttext
\startmarkdown
Here is an inline note.^[Inlines notes are easier to
write, since you don't have to pick an identifier and
move down to type the note.]
\stopmarkdown
\stoptext
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
Here is an inline note.6
pipeTables
pipeTables
(default value: false
)Enable the PHP Markdown table syntax extension:
Disable the PHP Markdown table syntax extension.
Using a text editor, create a text document named document.tex
with the following content:
\documentclass{article}
\usepackage[pipeTables]{markdown}
\begin{document}
\begin{markdown}
| Right | Left | Default | Center |
|------:|:-----|---------|:------:|
| 12 | 12 | 12 | 12 |
| 123 | 123 | 123 | 123 |
| 1 | 1 | 1 | 1 |
\end{markdown}
\end{document}
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
Right Left Default Center 12 12 12 12 123 123 123 123 1 1 1 1
Using a text editor, create a text document named document.tex
with the following content:
\usemodule[t][markdown]
\def\markdownOptionPipeTables{true}
\starttext
\startmarkdown
| Right | Left | Default | Center |
|------:|:-----|---------|:------:|
| 12 | 12 | 12 | 12 |
| 123 | 123 | 123 | 123 |
| 1 | 1 | 1 | 1 |
\stopmarkdown
\stoptext
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
Right Left Default Center 12 12 12 12 123 123 123 123 1 1 1 1
preserveTabs
preserveTabs
(default value: false
)Preserve tabs in code block and fenced code blocks.
Convert any tabs in the input to spaces.
shiftHeadings
shiftHeadings
(default value: 0
)All headings will be shifted by ⟨shift amount⟩, which can be both positive and negative. Headings will not be shifted beyond level 6 or below level 1. Instead, those headings will be shifted to level 6, when ⟨shift amount⟩ is positive, and to level 1, when ⟨shift amount⟩ is negative.
Using a text editor, create a text document named example.md
with the following content:
Using a text editor, create a text document named document.tex
with the following content:
\input markdown
\font\normal=cmr10\normal
\font\big=cmr10 at 12pt
\def\markdownRendererHeadingTwo#1{{\big #1\par}}
\font\bigger=cmr10 scaled 1440
\def\markdownRendererHeadingOne#1{{\bigger #1\par}}
\def\markdownOptionShiftHeadings{-1}
\markdownInput{example.md}
\def\markdownOptionShiftHeadings{0}
\markdownInput{example.md}
\def\markdownOptionShiftHeadings{+1}
\markdownInput{example.md}
\bye
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
A section
A section
A section
Using a text editor, create a text document named document.tex
with the following content:
\documentclass{article}
\usepackage{markdown}
\usepackage{filecontents}
\begin{filecontents*}{example.md}
## A section
\end{filecontents*}
\begin{document}
\markdownInput[shiftHeadings=-1]{example.md}
\markdownInput{example.md}
\markdownInput[shiftHeadings=+1]{example.md}
\end{document}
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
A section
A section
A section
Using a text editor, create a text document named example.md
with the following content:
Using a text editor, create a text document named document.tex
with the following content:
\usemodule[t][markdown]
\starttext
\def\markdownOptionShiftHeadings{-1}
\markdownInput{example.md}
\def\markdownOptionShiftHeadings{0}
\markdownInput{example.md}
\def\markdownOptionShiftHeadings{+1}
\markdownInput{example.md}
\stoptext
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
A section
A section
A section
slice
slice
(default value: ^ $
)Two space-separated selectors that specify the slice of a document that will be processed, whereas the remainder of the document will be ignored. The following selectors are recognized:
^
) selects the beginning of a document.$
) selects the end of a document.^
⟨identifier⟩ selects the beginning of a section with the HTML attribute #
⟨identifier⟩.$
⟨identifier⟩ selects the end of a section with the HTML attribute #
⟨identifier⟩.^
⟨identifier⟩ for the first selector and to $
⟨identifier⟩ for the second selector.Specifying only a single selector, ⟨identifier⟩, is equivalent to specifying the two selectors ⟨identifier⟩ ⟨identifier⟩, which is equivalent to ^
⟨identifier⟩ $
⟨identifier⟩, i.e. the entire section with the HTML attribute #
⟨identifier⟩ will be selected.
Using a text editor, create a text document named hamlet.md
with the following content:
# The Tragedy of Hamlet
Shakespeare's longest play.
## Act III {#act-3}
Hamlet kills Polonius.
## Act V {#act-5}
Hamlet dies.
## Act I {#act-1}
Hamlet talks to ghost.
Using a text editor, create a text document named document.tex
with the following content:
\input markdown
\def\markdownOptionHeaderAttributes{true}
\font\normal=cmr10\normal
\font\big=cmr10 at 12pt
\def\markdownRendererHeadingTwo#1{{\big #1\par}}
\font\bigger=cmr10 scaled 1440
\def\markdownRendererHeadingOne#1{{\bigger #1\par}}
\def\markdownOptionSlice{^ ^act-3}
\markdownInput{hamlet.md}
\def\markdownOptionSlice{act-1}
\markdownInput{hamlet.md}
\def\markdownOptionSlice{act-3 act-5}
\markdownInput{hamlet.md}
\bye
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
The Tragedy of Hamlet
Shakespeare’s longest play.
Act I
Hamlet talks to ghost.
Act III
Hamlet kills Polonius.
Act V
Hamlet dies.
Using a text editor, create a text document named document.tex
with the following content:
\documentclass{article}
\usepackage[headerAttributes]{markdown}
\usepackage{filecontents}
\begin{filecontents*}{hamlet.md}
# The Tragedy of Hamlet
Shakespeare's longest play.
## Act III {#act-3}
Hamlet kills Polonius.
## Act V {#act-5}
Hamlet dies.
## Act I {#act-1}
Hamlet talks to ghost.
\end{filecontents*}
\begin{document}
\markdownInput[slice=^ ^act-3]{hamlet.md}
\markdownInput[slice=act-1]{hamlet.md}
\markdownInput[slice=act-3 act-5]{hamlet.md}
\end{document}
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
The Tragedy of Hamlet
Shakespeare’s longest play.
Act I
Hamlet talks to ghost.
Act III
Hamlet kills Polonius.
Act V
Hamlet dies.
Using a text editor, create a text document named hamlet.md
with the following content:
# The Tragedy of Hamlet
Shakespeare's longest play.
## Act III {#act-3}
Hamlet kills Polonius.
## Act V {#act-5}
Hamlet dies.
## Act I {#act-1}
Hamlet talks to ghost.
Using a text editor, create a text document named document.tex
with the following content:
\usemodule[t][markdown]
\def\markdownOptionHeaderAttributes{true}
\starttext
\def\markdownOptionSlice{^ ^act-3}
\markdownInput{hamlet.md}
\def\markdownOptionSlice{act-1}
\markdownInput{hamlet.md}
\def\markdownOptionSlice{act-3 act-5}
\markdownInput{hamlet.md}
\stoptext
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
The Tragedy of Hamlet
Shakespeare’s longest play.
Act I
Hamlet talks to ghost.
Act III
Hamlet kills Polonius.
Act V
Hamlet dies.
smartEllipses
smartEllipses
(default value: false
)Convert any ellipses in the input to the \markdownRendererEllipsis
TeX macro.
Preserve all ellipses in the input.
Using a text editor, create a text document named document.tex
with the following content:
\input markdown
\def\markdownRendererEllipsis{. . .}
\input lmfonts
\directlua{
local markdown = require("markdown")
local convert = markdown.new()
local input = "These are just three regular dots ..."
tex.sprint(convert(input)) }
\par
\directlua{
local markdown = require("markdown")
local convert = markdown.new({smartEllipses = true})
local input = "... and this is a victorian ellipsis."
tex.sprint(convert(input)) }
\bye
Then, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
These are just three regular dots …
. . . and this is a victorian ellipsis.
Using a text editor, create a text document named document.tex
with the following content:
\input markdown
\def\markdownRendererEllipsis{. . .}
\input lmfonts
\input optionfalse
\par
\input optiontrue
\bye
Using a text editor, create a text document named content.md
with the following content:
Next, invoke LuaTeX from the terminal:
texlua ⟨CLI pathname⟩ -- content.md optionfalse.tex
texlua ⟨CLI pathname⟩ smartEllipses=true -- content.md optiontrue.tex
luatex document.tex
where ⟨CLI pathname⟩ corresponds to the location of the Lua CLI script file, such as ~/texmf/scripts/markdown/markdown-cli.lua
on UN*X systems or C:\Users\
⟨Your username⟩\texmf\scripts\markdown\markdown-cli.lua
on Windows systems. Use the command kpsewhich -a markdown-cli.lua
to locate the Lua CLI script file using Kpathsea.
A PDF document named document.pdf
should be produced and contain the following text:
Are these just three regular dots, a victorian ellipsis, or … ?
Are these just three regular dots, a victorian ellipsis, or . . . ?
Using a text editor, create a text document named document.tex
with the following content:
\input markdown
\def\markdownRendererEllipsis{. . .}
\markdownBegin
These are just three regular dots ...
\markdownEnd
\def\markdownOptionSmartEllipses{true}
\markdownBegin
... and this is a victorian ellipsis.
\markdownEnd
\bye
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
These are just three regular dots …
. . . and this is a victorian ellipsis.
Using a text editor, create a text document named document.tex
with the following content:
\documentclass{article}
\usepackage{markdown}
\markdownSetup{
renderers = {
ellipsis = {. . .} }}
\begin{document}
\begin{markdown}
These are just three regular dots ...
\end{markdown}
\begin{markdown*}{smartEllipses}
... and this is a victorian ellipsis.
\end{markdown*}
\end{document}
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
These are just three regular dots …
. . . and this is a victorian ellipsis.
Using a text editor, create a text document named document.tex
with the following content:
\usemodule[t][markdown]
\def\markdownRendererEllipsis{. . .}
\starttext
\startmarkdown
These are just three regular dots ...
\stopmarkdown
\def\markdownOptionSmartEllipses{true}
\startmarkdown
... and this is a victorian ellipsis.
\stopmarkdown
\stoptext
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
These are just three regular dots …
. . . and this is a victorian ellipsis.
startNumber
startNumber
(default value: true
)Make the number in the first item of an ordered lists significant. The item numbers will be passed to the \markdownRendererOlItemWithNumber
TeX macro.
Ignore the numbers in the ordered list items. Each item will only produce a \markdownRendererOlItem
TeX macro.
Using a text editor, create a text document named document.tex
with the following content:
\documentclass{article}
\usepackage{markdown}
\begin{document}
\begin{markdown}
The following list respects the numbers specified in the markup:
3. third item
4. fourth item
5. fifth item
\end{markdown}
\begin{markdown*}{startNumber=false}
The following list does not respect the numbers specified in the
markup:
3. third item
4. fourth item
5. fifth item
\end{markdown*}
\end{document}
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
The following list respects the numbers specified in the markup:
- third item
- fourth item
- fifth item
The following list does not respect the numbers specified in the markup:
- third item
- fourth item
- fifth item
Using a text editor, create a text document named document.tex
with the following content:
\usemodule[t][markdown]
\starttext
\startmarkdown
The following list respects the numbers specified in the markup:
3. third item
4. fourth item
5. fifth item
\stopmarkdown
\def\markdownOptionStartNumber{false}
\startmarkdown
The following list respects the numbers specified in the markup:
3. third item
4. fourth item
5. fifth item
\stopmarkdown
\stoptext
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
The following list respects the numbers specified in the markup:
- third item
- fourth item
- fifth item
The following list does not respect the numbers specified in the markup:
- third item
- fourth item
- fifth item
tableCaptions
tableCaptions
(default value: false
)Enable the Pandoc table_captions
syntax extension for pipe tables.
Enable the Pandoc table_captions
syntax extension.
Using a text editor, create a text document named document.tex
with the following content:
\documentclass{article}
\usepackage[pipeTables, tableCaptions]{markdown}
\begin{document}
\begin{markdown}
| Right | Left | Default | Center |
|------:|:-----|---------|:------:|
| 12 | 12 | 12 | 12 |
| 123 | 123 | 123 | 123 |
| 1 | 1 | 1 | 1 |
: Demonstration of pipe table syntax.
\end{markdown}
\end{document}
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
Demonstration of pipe table syntax. Right Left Default Center 12 12 12 12 123 123 123 123 1 1 1 1
Using a text editor, create a text document named document.tex
with the following content:
\usemodule[t][markdown]
\def\markdownOptionPipeTables{true}
\def\markdownOptionTableCaptions{true}
\starttext
\startmarkdown
| Right | Left | Default | Center |
|------:|:-----|---------|:------:|
| 12 | 12 | 12 | 12 |
| 123 | 123 | 123 | 123 |
| 1 | 1 | 1 | 1 |
: Demonstration of pipe table syntax.
\stopmarkdown
\stoptext
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
Demonstration of pipe table syntax. Right Left Default Center 12 12 12 12 123 123 123 123 1 1 1 1
tightLists
tightLists
(default value: true
)Lists whose bullets do not consist of multiple paragraphs will be passed to the \markdownRendererOlBeginTight
, \markdownRendererOlEndTight
, \markdownRendererUlBeginTight
, \markdownRendererUlEndTight
, \markdownRendererDlBeginTight
, and \markdownRendererDlEndTight
TeX macros.
Lists whose bullets do not consist of multiple paragraphs will be treated the same way as lists that do consist of multiple paragraphs.
Using a text editor, create a text document named document.tex
with the following content:
\documentclass{article}
\usepackage{markdown}
\begin{document}
\begin{markdown}
The following list is tight:
- first item
- second item
- third item
The following list is loose:
- first item
- second item that spans
multiple paragraphs
- third item
\end{markdown}
\begin{markdown*}{tightLists=false}
The following list is now also loose:
- first item
- second item
- third item
\end{markdown*}
\end{document}
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
The following list is tight:
- first item
- second item
- third item
The following list is loose:
- first item
second item that spans
multiple paragraphsthird item
The following list is now also loose:
first item
second item
third item
underscores
underscores
(default value: true
)Both underscores and asterisks can be used to denote emphasis and strong emphasis:
Only asterisks can be used to denote emphasis and strong emphasis. This makes it easy to write math with the hybrid
option without the need to constantly escape subscripts.
Using a text editor, create a text document named document.tex
with the following content:
\input markdown
\def\markdownOptionHybrid{true}
\markdownBegin
This is _emphasized text_ and this is a math subscript: $m\_n$.
\markdownEnd
\def\markdownOptionUnderscores{false}
\markdownBegin
This is *emphasized text* and this is a math subscript: $m_n$.
\markdownEnd
\bye
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
This is emphasized text and this is a math subscript: mₙ.
This is emphasized text and this is a math subscript: mₙ.
Using a text editor, create a text document named document.tex
with the following content:
\documentclass{article}
\usepackage[hybrid]{markdown}
\begin{document}
\begin{markdown}
This is _emphasized text_ and this is a math subscript: $m\_n$.
\end{markdown}
\begin{markdown*}{underscores=false}
This is *emphasized text* and this is a math subscript: $m_n$.
\end{markdown*}
\end{document}
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
This is emphasized text and this is a math subscript: mₙ.
This is emphasized text and this is a math subscript: mₙ.
Using a text editor, create a text document named document.tex
with the following content:
\usemodule[t][markdown]
\def\markdownOptionHybrid{true}
\starttext
\startmarkdown
This is _emphasized text_ and this is a math subscript: $m\_n$.
\stopmarkdown
\def\markdownOptionUnderscores{false}
\startmarkdown
This is *emphasized text* and this is a math subscript: $m_n$.
\stopmarkdown
\stoptext
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
This is emphasized text and this is a math subscript: mₙ.
This is emphasized text and this is a math subscript: mₙ.
Plain TeX options control the communication between the TeX interface and the markdown
Lua module. They are supported by all higher-level interfaces of the Markdown package, i.e. the plain TeX, LaTeX and ConTeXt interfaces.
The \markdownOptionFrozenCache
option uses the mapping previously created by the Lua interface finalizeCache
option, and uses it to typeset the plain TeX document without invoking Lua. As a result, the plain TeX document becomes more portable, but further changes in the order and the content of markdown documents will not be reflected. It defaults to false
.
The standard usage of the finalizeCache
and \markdownOptionFrozenCache
options is as follows:
cacheDir
cache directory with stale auxiliary cache files.finalizeCache
option.\markdownOptionFrozenCache
option.cacheDir
directory.For more information, see the examples for the finalizeCache
option.
The plain TeX interface provides the following commands that you can use to specify the location of temporary files produced during the conversion from Markdown to TeX:
\markdownOptionHelperScriptFileName
,\markdownOptionInputTempFileName
,\markdownOptionOutputTempFileName
,\markdownOptionErrorTempFileName
,\markdownOptionOutputDir
,\markdownOptionCacheDir
, and\markdownOptionFrozenCacheFileName
.Using a text editor, create a folder named output-directory
and a text document named document.tex
with the following content:
\input lmfonts
\input markdown
\def\markdownOptionHelperScriptFileName{helper-script.lua}
\def\markdownOptionInputTempFileName{temporary-input.md}
\def\markdownOptionOutputTempFileName{temporary-output.tex}
\def\markdownOptionErrorTempFileName{error-output.txt}
\def\markdownOptionOutputDir{output-directory}
\def\markdownOptionCacheDir{output-directory/cache-directory}
\markdownOptionFinalizeCachetrue
\def\markdownOptionFrozenCacheFileName{output-directory/cache-directory/frozen-cache.tex}
\markdownBegin
Hello *world*!
\markdownEnd
\bye
Next, invoke LuaTeX from the terminal:
A text document named temporary-input.md
should be produced in the folder named output-directory
and contain the following text:
Hello *world*!
A folder named output-directory/cache-directory
should also be produced and contain fragments of the converted markdown document. LuaTeX does not need other temporary files to perform the conversion from markdown to TeX. To produce the remaining temporary files, invoke pdfTeX from the terminal:
Text documents named helper-script.lua
, and temporary-output.md
should be produced in the folder named output-directory
. The document named helper-script.lua
will contain Lua code that was executed to convert markdown to plain TeX. The document named temporary-output.tex
will contain the input markdown document converted to TeX.
No document named error-output.txt
should be produced in the folder named output-directory
. This document would only be produced if an error had occured while executing the Lua code. If this happens, please file a bug.
The \markdownOptionStripPercentSigns
macro controls whether a percent sign (%
) at the beginning of a line will be discarded when reading Markdown input from a TeX document. This enables the use of markdown when writing TeX package documentation using the Doc LaTeX package by Frank Mittelbach. The recognized values of the macro are true
(discard) and false
(retain). It defaults to false
.
Using a text editor, create a text document named document.dtx
with the following content:
% \iffalse
\documentclass{ltxdoc}
\usepackage[stripPercentSigns]{markdown}
\begin{document}
\DocInput{document.dtx}
\end{document}
% \fi
%
% \begin{markdown}
% Hello *world*!
% \end{markdown}
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the text “Hello world!”
A key feature of the Markdown package is the support for manipulating markdown tokens, such as headings, emphasized text, links, and lists, in TeX. Instead of reducing TeX to a PDF document producer, the Markdown package allows the user to specify how every markdown token should be processed and rendered.
Token renderers are user-defined TeX macros, which render markdown tokens. In this section, I will describe the individual token renderers.
The \markdownRendererInterblockSeparator
macro represents a separator between two markdown block elements. The macro receives no arguments.
Using a text editor, create a text document named document.tex
with the following content:
\input markdown
\def\markdownRendererInterblockSeparator{%
\par
{\it(The end of a block)}%
\par
}
\markdownBegin
Hello *world*!
_Foo_ bar!
\markdownEnd
\bye
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
Hello world!
(The end of a block)
Foo bar!
Using a text editor, create a text document named document.tex
with the following content:
\documentclass{article}
\usepackage{markdown}
\markdownSetup{
renderers = {
interblockSeparator = {%
\par
\emph{(The end of a block)}%
\par
},
},
}
\begin{document}
\begin{markdown}
Hello *world*!
_Foo_ bar!
\end{markdown}
\end{document}
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
Hello world!
(The end of a block)
Foo bar!
Using a text editor, create a text document named document.tex
with the following content:
\usemodule[t][markdown]
\def\markdownRendererInterblockSeparator{%
\par
\emph{(The end of a block)}%
\par
}
\starttext
\startmarkdown
Hello *world*!
_Foo_ bar!
\stopmarkdown
\stoptext
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
Hello world!
(The end of a block)
Foo bar!
The \markdownRendererLineBreak
macro represents a forced line break. The macro receives no arguments.
Using a text editor, create a text document named document.tex
with the following content:
\input markdown
\def\markdownRendererLineBreak{%
\par
{\it(A forced linebreak)}%
\par
}
\markdownInput{example.md}
\bye
Using a text editor, create a text document named example.md
with the following content. Note the two spaces at the end of the first line, which specify a hard linebreak. Due to the limitations of the TeX input processor, hard linebreaks would be ignored if we typed them directly into the document.tex
document.
Hello world!
_Foo_ bar!
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
Hello world!
(A forced linebreak)
Foo bar!
Using a text editor, create a text document named document.tex
with the following content:
\documentclass{article}
\usepackage{markdown}
\markdownSetup{
renderers = {
lineBreak = {%
\par
\emph{(A forced linebreak)}%
\par
},
},
}
\begin{document}
\markdownInput{example.md}
\end{document}
Using a text editor, create a text document named example.md
with the following content. Note the two spaces at the end of the first line, which specify a hard linebreak. Due to the limitations of the TeX input processor, hard linebreaks would be ignored if we typed them directly into the document.tex
document.
Hello world!
_Foo_ bar!
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
Hello world!
(A forced linebreak)
Foo bar!
Using a text editor, create a text document named document.tex
with the following content:
\usemodule[t][markdown]
\def\markdownRendererLineBreak{%
\par
\emph{(A forced linebreak)}%
\par
}
\starttext
\markdownInput{example.md}
\stoptext
Using a text editor, create a text document named example.md
with the following content. Note the two spaces at the end of the first line, which specify a hard linebreak. Due to the limitations of the TeX input processor, hard linebreaks would be ignored if we typed them directly into the document.tex
document.
Hello world!
_Foo_ bar!
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
Hello world!
(A forced linebreak)
Foo bar!
The \markdownRendererEllipsis
macro replaces any occurance of ASCII ellipses in the input text. This macro will only be produced, when the smartEllipses
option is enabled. The macro receives no arguments.
Using a text editor, create a text document named document.tex
with the following content:
\input markdown
\def\markdownOptionSmartEllipses{true}
\def\markdownRendererEllipsis{{\it SHAZAM}!}
\markdownBegin
The secret word is ...
\markdownEnd
\bye
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
The secret word is SHAZAM!
Using a text editor, create a text document named document.tex
with the following content:
\documentclass{article}
\usepackage[smartEllipses]{markdown}
\markdownSetup{
renderers = {
ellipsis = \emph{SHAZAM}!,
},
}
\begin{document}
\begin{markdown}
The secret word is ...
\end{markdown}
\end{document}
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
The secret word is SHAZAM!
Using a text editor, create a text document named document.tex
with the following content:
\usemodule[t][markdown]
\def\markdownOptionSmartEllipses{true}
\def\markdownRendererEllipsis{\emph{SHAZAM}!}
\starttext
\startmarkdown
The secret word is ...
\stopmarkdown
\stoptext
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
Hello world!
(The end of a block)
Foo bar!
The \markdownRendererNbsp
macro represents a non-breaking space.
Using a text editor, create a text document named document.bib
with the following content:
@book{knuth:tex,
author = "Knuth, Donald Ervin",
title = "The \TeX book, volume A of Computers and typesetting",
publisher = "Addison-Wesley",
year = "1984"
}
Using a text editor, create a text document named document.tex
with the following content:
\documentclass{article}
\usepackage[
citations,
citationNbsps,
]{markdown}
\markdownSetup{
renderers = {
nbsp = {$\cdot$},
},
}
\begin{document}
\begin{markdown}
The TeXbook [@knuth:tex, p. 123 and 130] is good.
\end{markdown}
\bibliographystyle{plain}
\bibliography{document.bib}
\end{document}
Next, invoke LuaTeX and BibTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
The TeXbook [1, p.·123·and·130] is good.
References
[1] Donald Ervin Knuth. The TeXbook, volume A of Computers and typesetting. Addison-Wesley, 1984.
The following macros replace any special plain TeX characters, including the active pipe character (|
) of ConTeXt, in the input text:
\markdownRendererAmpersand
replaces the ampersand (&
).\markdownRendererBackslash
replaces the backslash (\
).\markdownRendererCircumflex
replaces the circumflex (^
).\markdownRendererDollarSign
replaces the dollar sign ($
).\markdownRendererHash
replaces the hash sign (#
).\markdownRendererLeftBrace
replaces the left brace ({
).\markdownRendererPercentSign
replaces the percent sign (%
).\markdownRendererPipe
replaces the pipe character (|
).\markdownRendererRightBrace
replaces the right brace (}
).\markdownRendererTilde
replaces the tilde (~
).\markdownRendererUnderscore
replaces the underscore (_
).Using a text editor, create a text document named document.tex
with the following content. We will make the tilde behave as if it were written in TeX, where it represents a non-breaking space.
\input markdown
\def\markdownRendererTilde{~}
\markdownBegin
Bartel~Leendert van~der~Waerden
\markdownEnd
\bye
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text, where the middot (·
) denotes a non-breakable space:
Bartel·Leendert van·der·Waerden
Using a text editor, create a text document named document.tex
with the following content. We will make the tilde behave as if it were written in TeX, where it represents a non-breaking space.
\documentclass{article}
\usepackage{markdown}
\markdownSetup{
renderers = {
tilde = ~,
},
}
\begin{document}
\begin{markdown}
Bartel~Leendert van~der~Waerden
\end{markdown}
\end{document}
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text, where the middot (·
) denotes a non-breakable space:
Bartel·Leendert van·der·Waerden
Using a text editor, create a text document named document.tex
with the following content. We will make the tilde behave as if it were written in TeX, where it represents a non-breaking space.
\usemodule[t][markdown]
\def\markdownRendererTilde{~}
\starttext
\startmarkdown
Bartel~Leendert van~der~Waerden
\stopmarkdown
\stoptext
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text, where the middot (·
) denotes a non-breakable space:
Bartel·Leendert van·der·Waerden
The \markdownRendererCodeSpan
macro represents inlined code span in the input text. It receives a single argument that corresponds to the inlined code span.
Using a text editor, create a text document named document.tex
with the following content:
\input markdown
\input lmfonts
\def\markdownRendererCodeSpan#1{#1}
\markdownBegin
`$\sqrt{-1}$ *equals* $i$`
$\sqrt{-1}$ *equals* $i$
\markdownEnd
\def\markdownOptionHybrid{true}
\markdownBegin
$\sqrt{-1}$ *equals* $i$
\markdownEnd
\bye
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
$\sqrt{-1}$ *equals* $i$.
$\sqrt{-1}$ equals $i$.
√-̅1̅ equals i.
Using a text editor, create a text document named document.tex
with the following content:
\documentclass{article}
\usepackage[smartEllipses]{markdown}
\markdownSetup{
renderers = {
codeSpan = {#1},
},
}
\begin{document}
\begin{markdown}
`$\sqrt{-1}$ *equals* $i$`
$\sqrt{-1}$ *equals* $i$
\end{markdown}
\begin{markdown*}{hybrid}
$\sqrt{-1}$ *equals* $i$
\end{markdown*}
\end{document}
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
$\sqrt{-1}$ *equals* $i$.
$\sqrt{-1}$ equals $i$.
√-̅1̅ equals i.
Using a text editor, create a text document named document.tex
with the following content:
\usemodule[t][markdown]
\def\markdownRendererCodeSpan#1{#1}
\starttext
\startmarkdown
`$\sqrt{-1}$ *equals* $i$`
$\sqrt{-1}$ *equals* $i$
\stopmarkdown
\def\markdownOptionHybrid{true}
\startmarkdown
$\sqrt{-1}$ *equals* $i$
\stopmarkdown
\bye
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
$\sqrt{-1}$ *equals* $i$.
$\sqrt{-1}$ equals $i$.
√-̅1̅ equals i.
The \markdownRendererLink
macro represents a hyperlink. It receives four arguments: the label, the fully escaped uri that can be directly typeset, the raw uri that can be used outside typesetting, and the title of the link.
Using a text editor, create a text document named document.tex
with the following content:
\input markdown
\def\markdownRendererLink#1#2#3#4{%
#1 {\tt#2} titled {\it#4}%
}
\markdownBegin
Please visit [the link][ctan].
[ctan]: https://ctan.org/
(the Comprehensive TeX Archive Network)
\markdownEnd
\bye
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
Please visit the link https://ctan.org/ titled the Comprehensive TeX Archive Network.
Using a text editor, create a text document named document.tex
with the following content:
\documentclass{article}
\usepackage{markdown}
\markdownSetup{
renderers = {
link = {%
#1 \texttt{#2} titled \emph{#4}%
},
},
}
\begin{document}
\begin{markdown}
Please visit [the link][ctan].
[ctan]: https://ctan.org/
(the Comprehensive TeX Archive Network)
\end{markdown}
\end{document}
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
Please visit the link https://ctan.org/ titled the Comprehensive TeX Archive Network.
Using a text editor, create a text document named document.tex
with the following content:
\usemodule[t][markdown]
\def\markdownRendererLink#1#2#3#4{%
#1 {\tt#2} titled \emph{#4}%
}
\starttext
\startmarkdown
Please visit [the link][ctan].
[ctan]: https://ctan.org/
(the Comprehensive TeX Archive Network)
\stopmarkdown
\stoptext
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
Please visit the link https://ctan.org/ titled the Comprehensive TeX Archive Network.
The \markdownRendererImage
macro represents an image. It receives four arguments: the label, the fully escaped uri that can be directly typeset, the raw uri that can be used outside typesetting, and the title of the link.
Using a text editor, create a text document named document.tex
with the following content:
\documentclass{article}
\usepackage{markdown}
\begingroup
\catcode`\@=11
\catcode`\%=12
\catcode`\^^A=14
\global\def\markdownRendererImage#1#2#3#4{^^A
\immediate\write18{^^A
if printf '%s' "#3" | grep -q ^http; then
OUTPUT="$(printf '%s' "#3" | md5sum | cut -d' ' -f1).^^A
$(printf '%s' "#3" | sed 's/.*[.]//')";
if ! [ -e "$OUTPUT" ]; then
wget -O "$OUTPUT" '#3' || rm "$OUTPUT";
convert "$OUTPUT" png:"$OUTPUT";
fi;
printf '%s%%' "$OUTPUT" > \jobname.fetched;
else
printf '%s%%' "#3" > \jobname.fetched;
fi^^A
}^^A
{^^A
\everyeof={\noexpand}^^A
\edef\filename{\@@input"\jobname.fetched" }^^A
\includegraphics[width=\textwidth]{\filename}^^A
}^^A
}
\endgroup
\begin{document}
\begin{markdown}
![TUGboat](https://tug.org/tugboat/noword.jpg)
\end{markdown}
\end{document}
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following content. This assumes that you use a Unix-like operating system with Bourne or Bourne again shell as the default shell of the current user. It also assumes that the md5sum
, wget
, and convert
binaries are installed and that the TeX engine has shell access.
The \markdownRendererContentBlock
macro represents an iA Writer content block. It receives four arguments: the local file or online image filename extension cast to the lower case, the fully escaped uri that can be directly typeset, the raw uri that can be used outside typesetting, and the title of the content block.
The \markdownRendererContentBlockOnlineImage
macro represents an iA Writer online image content block. The macro receives the same arguments as \markdownRendererContentBlock
.
The \markdownRendererContentBlockCode
macro represents an iA Writer content block that was recognized as a file in a known programming language by its filename extension s. If any markdown-languages.json
file found by contains a record (k, v), then a non-online-image content block with the filename extension s, s:lower()
= k is considered to be in a known programming language v. The macro receives five arguments: the local file name extension s cast to the lower case, the language v, the fully escaped uri that can be directly typeset, the raw uri that can be used outside typesetting, and the title of the content block.
Note that you will need to place place a markdown-languages.json
file inside your working directory or inside your local TeX directory structure. In this file, you will define a mapping between filename extensions and the language names recognized by your favorite syntax highlighter; there may exist other creative uses beside syntax highlighting. The Languages.json
file provided by Anton Sotkov is a good starting point.
Using a text editor, create a text document named document.tex
with the following content:
\input markdown
\def\markdownOptionContentBlocks{true}
\def\markdownRendererContentBlock#1#2#3#4{%
This is {\tt #2}, #4.
}
\def\markdownRendererContentBlockOnlineImage#1#2#3#4{%
This is the image {\tt #2}, #4.
}
\def\markdownRendererContentBlockCode#1#2#3#4#5{%
This is the #2 (\uppercase{#1}) document {\tt #3}, #5.
}
\markdownBegin
/document.tex (the document that we are currently typesetting)
/markdown-languages.json (the mapping between filename extensions
and programming language names)
https://tug.org/tugboat/noword.jpg (the logotype of TUGboat)
\markdownEnd
\bye
Create also a text document named markdown-languages.json
with the following content:
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
This is
document.tex
, the document that we are currently typesetting.This is the JavaScript Object Notation (JSON) document
markdown-languages.json
, the mapping between filename extensions and programming language names.This is the image
https://tug.org/tugboat/noword.jpg
, the logotype of TUGboat.
Using a text editor, create a text document named document.tex
with the following content:
\documentclass{article}
\usepackage{filecontents}
\begin{filecontents*}{markdown-languages.json}
{
"json": "JavaScript Object Notation",
}
\end{filecontents*}
\usepackage[contentBlocks]{markdown}
\markdownSetup{
renderers = {
contentBlock = {This is \texttt{#2}, #4.},
contentBlockOnlineImage = {This is the image \texttt{#2}, #4.},
contentBlockCode = {%
This is the #2 (\MakeUppercase{#1}) document \texttt{#3}, #5.
},
},
}
\begin{document}
\begin{markdown}
/document.tex (the document that we are currently typesetting)
/markdown-languages.json (the mapping between filename extensions
and programming language names)
https://tug.org/tugboat/noword.jpg (the logotype of TUGboat)
\end{markdown}
\end{document}
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
This is
document.tex
, the document that we are currently typesetting.This is the JavaScript Object Notation (JSON) document
markdown-languages.json
, the mapping between filename extensions and programming language names.This is the image
https://tug.org/tugboat/noword.jpg
, the logotype of TUGboat.
Using a text editor, create a text document named document.tex
with the following content:
\usemodule[t][markdown]
\def\markdownOptionContentBlocks{true}
\def\markdownRendererContentBlock#1#2#3#4{%
This is {\tt #2}, #4.
}
\def\markdownRendererContentBlockOnlineImage#1#2#3#4{%
This is the image {\tt #2}, #4.
}
\def\markdownRendererContentBlockCode#1#2#3#4#5{%
This is the #2 (\uppercase{#1}) document {\tt #3}, #5.
}
\starttext
\startmarkdown
/document.tex (the document that we are currently typesetting)
/markdown-languages.json (the mapping between filename extensions
and programming language names)
https://tug.org/tugboat/noword.jpg (the logotype of TUGboat)
\stopmarkdown
\stoptext
Create also a text document named markdown-languages.json
with the following content:
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
This is
document.tex
, the document that we are currently typesetting.This is the JavaScript Object Notation (JSON) document
markdown-languages.json
, the mapping between filename extensions and programming language names.This is the image
https://tug.org/tugboat/noword.jpg
, the logotype of TUGboat.
The \markdownRendererUlBegin
macro represents the beginning of a bulleted list that contains an item with several paragraphs of text (the list is not tight). The macro receives no arguments.
The \markdownRendererUlBeginTight
macro represents the beginning of a bulleted list that contains no item with several paragraphs of text (the list is tight). This macro will only be produced, when the tightLists
option is false
. The macro receives no arguments.
The \markdownRendererUlItem
macro represents an item in a bulleted list. The macro receives no arguments.
The \markdownRendererUlItemEnd
macro represents the end of an item in a bulleted list. The macro receives no arguments.
The \markdownRendererUlEnd
macro represents the end of a bulleted list that contains an item with several paragraphs of text (the list is not tight). The macro receives no arguments.
The \markdownRendererUlEndTight
macro represents the end of a bulleted list that contains no item with several paragraphs of text (the list is tight). This macro will only be produced, when the tightLists
option is false
. The macro receives no arguments.
Using a text editor, create a text document named document.tex
with the following content:
\input markdown
\def\markdownOptionTightLists{true}
\def\markdownRendererInterblockSeparator{}
\def\markdownRendererUlBeginTight{ (}
\def\markdownRendererUlItem{%
\def\markdownRendererUlItem{%
,
\def\markdownRendererUlItem{, and }%
}%
}
\def\markdownRendererUlItemEnd{}
\def\markdownRendererUlEndTight{).}
\markdownBegin
This is a tight list
- the first item
- the second item
- the third item
\markdownEnd
\def\markdownRendererInterblockSeparator{%
:\par
\def\markdownRendererInterblockSeparator{\par}%
}
\def\markdownRendererUlBegin{}
\def\markdownRendererUlItem{--\kern 0.5em}
\def\markdownRendererUlItemEnd{.\par}
\def\markdownRendererUlEnd{}
\markdownBegin
This is a loose list
- This is the first item
- This is the second item
- This is the third item
\markdownEnd
\bye
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
This is a tight list (the first item, the second item, and the third item).
This is a loose list:
This is the first item.
This is the second item.
This is the third item.
Using a text editor, create a text document named document.tex
with the following content:
\documentclass{article}
\usepackage[tightLists]{markdown}
\begin{document}
\begin{markdown*}{
renderers = {
interblockSeparator = {},
ulBeginTight = { (},
ulItem = {%
\def\markdownRendererUlItem{%
,
\def\markdownRendererUlItem{, and }%
}%
},
ulItemEnd = {},
ulEndTight = {).},
},
}
This is a tight list
- the first item
- the second item
- the third item
\end{markdown*}
\begin{markdown*}{
renderers = {
interblockSeparator = {%
:\par
\def\markdownRendererInterblockSeparator{\par}%
},
ulBeginTight = {\begin{itemize}},
ulItem = {\item},
ulItemEnd = {.},
ulEnd = {\end{itemize}},
},
}
This is a loose list
- This is the first item
- This is the second item
- This is the third item
\end{markdown*}
\end{document}
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
This is a tight list (the first item, the second item, and the third item).
This is a loose list:
This is the first item.
This is the second item.
This is the third item.
Using a text editor, create a text document named document.tex
with the following content:
\usemodule[t][markdown]
\def\markdownOptionTightLists{true}
\starttext
\def\markdownRendererInterblockSeparator{}
\def\markdownRendererUlBeginTight{ (}
\def\markdownRendererUlItem{%
\def\markdownRendererUlItem{%
,
\def\markdownRendererUlItem{, and }%
}%
}
\def\markdownRendererUlItemEnd{}
\def\markdownRendererUlEndTight{).}
\startmarkdown
This is a tight list
- the first item
- the second item
- the third item
\stopmarkdown
\def\markdownRendererInterblockSeparator{%
:\par
\def\markdownRendererInterblockSeparator{\par}%
}
\def\markdownRendererUlBegin{\startitemize}
\def\markdownRendererUlItem{\item}
\def\markdownRendererUlItemEnd{.}
\def\markdownRendererUlEnd{\stopitemize}
\startmarkdown
This is a loose list
- This is the first item
- This is the second item
- This is the third item
\stopmarkdown
\stoptext
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
This is a tight list (the first item, the second item, and the third item).
This is a loose list:
This is the first item.
This is the second item.
This is the third item.
The \markdownRendererOlBegin
macro represents the beginning of an ordered list that contains an item with several paragraphs of text (the list is not tight). The macro receives no arguments.
The \markdownRendererOlBeginTight
macro represents the beginning of an ordered list that contains no item with several paragraphs of text (the list is tight). This macro will only be produced, when the tightLists
option is false
. The macro receives no arguments.
The \markdownRendererOlItem
macro represents an item in an ordered list. This macro will only be produced, when the startNumber
option is false
. The macro receives no arguments.
The \markdownRendererOlItemEnd
macro represents the end of an item in an ordered list. The macro receives no arguments.
The \markdownRendererOlItemWithNumber
macro represents an item in an ordered list. This macro will only be produced, when the startNumber
option is enabled. The macro receives no arguments.
The \markdownRendererOlEnd
macro represents the end of an ordered list that contains an item with several paragraphs of text (the list is not tight). The macro receives no arguments.
The \markdownRendererOlEndTight
macro represents the end of an ordered list that contains no item with several paragraphs of text (the list is tight). This macro will only be produced, when the tightLists
option is false
. The macro receives no arguments.
Using a text editor, create a text document named document.tex
with the following content:
\input markdown
\def\markdownOptionTightLists{true}
\def\markdownOptionStartNumber{true}
\def\markdownRendererInterblockSeparator{}
\def\markdownRendererOlBeginTight{ (}
\def\markdownRendererOlItemWithNumber#1{%
\ifnum #1=1\relax
the first
\else
\ifnum #1=2\relax
, the second
\else
, and the third
\fi
\fi
}
\def\markdownRendererOlItemEnd{}
\def\markdownRendererOlEndTight{).}
\markdownBegin
This is a tight list
1. item
2. item
3. item
\markdownEnd
\def\markdownRendererInterblockSeparator{%
:\par
\def\markdownRendererInterblockSeparator{\par}%
}
\def\markdownRendererOlBegin{}
\def\markdownRendererOlItemWithNumber#1{%
#1.\kern 0.5em%
This is the
\ifnum #1=1\relax
first
\else
\ifnum #1=2\relax
second
\else
third
\fi
\fi
}
\def\markdownRendererOlItemEnd{.\par}
\def\markdownRendererOlEnd{}
\markdownBegin
This is a loose list
1. item
2. item
3. item
\markdownEnd
\bye
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
This is a tight list (the first item, the second item, and the third item).
This is a loose list:
This is the first item.
This is the second item.
This is the third item.
Using a text editor, create a text document named document.tex
with the following content:
\documentclass{article}
\usepackage[tightLists, startNumber]{markdown}
\begin{document}
\begin{markdown*}{
renderers = {
interblockSeparator = {},
olBeginTight = { (},
olItemWithNumber = {%
\ifnum #1=1\relax
the first
\else
\ifnum #1=2\relax
, the second
\else
, and the third
\fi
\fi
},
olItemEnd = {},
olEndTight = {).},
},
}
This is a tight list
1. item
2. item
3. item
\end{markdown*}
\begin{markdown*}{
renderers = {
interblockSeparator = {%
:\par
\def\markdownRendererInterblockSeparator{\par}%
},
olBeginTight = {\begin{enumerate}},
olItemWithNumber = {%
\item This is the
\ifnum #1=1\relax
first
\else
\ifnum #1=2\relax
second
\else
third
\fi
\fi
},
olItemEnd = {.},
olEnd = {\end{enumerate}},
},
}
This is a loose list
1. item
2. item
3. item
\end{markdown*}
\end{document}
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
This is a tight list (the first item, the second item, and the third item).
This is a loose list:
This is the first item.
This is the second item.
This is the third item.
Using a text editor, create a text document named document.tex
with the following content:
\usemodule[t][markdown]
\def\markdownOptionTightLists{true}
\def\markdownOptionStartNumber{true}
\starttext
\def\markdownRendererInterblockSeparator{}
\def\markdownRendererOlBeginTight{ (}
\def\markdownRendererOlItemWithNumber#1{%
\ifnum #1=1\relax
the first
\else
\ifnum #1=2\relax
, the second
\else
, and the third
\fi
\fi
}
\def\markdownRendererOlItemEnd{}
\def\markdownRendererOlEndTight{).}
\startmarkdown
This is a tight list
1. item
2. item
3. item
\stopmarkdown
\def\markdownRendererInterblockSeparator{%
:\par
\def\markdownRendererInterblockSeparator{\par}%
}
\def\markdownRendererOlBegin{\startitemize}
\def\markdownRendererOlItemWithNumber#1{%
\sym{#1.}
This is the
\ifnum #1=1\relax
first
\else
\ifnum #1=2\relax
second
\else
third
\fi
\fi
}
\def\markdownRendererOlItemEnd{.\par}
\def\markdownRendererOlEnd{\stopitemize}
\startmarkdown
This is a loose list
1. item
2. item
3. item
\stopmarkdown
\stoptext
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
This is a tight list (the first item, the second item, and the third item).
This is a loose list:
This is the first item.
This is the second item.
This is the third item.
The following macros are only produced, when the definitionLists
option is enabled.
The \markdownRendererDlBegin
macro represents the beginning of a definition list that contains an item with several paragraphs of text (the list is not tight). The macro receives no arguments.
The \markdownRendererDlBeginTight
macro represents the beginning of a definition list that contains an item with several paragraphs of text (the list is not tight). This macro will only be produced, when the tightLists
option is false
. The macro receives no arguments.
The \markdownRendererDlItem
macro represents a term in a definition list. The macro receives a single argument that corresponds to the term being defined.
The \markdownRendererDlItemEnd
macro represents the end of a list of definitions for a single term.
The \markdownRendererDlDefinitionBegin
macro represents the beginning of a definition in a definition list. There can be several definitions for a single term.
The \markdownRendererDlDefinitionEnd
macro represents the end of a definition in a definition list. There can be several definitions for a single term.
The \markdownRendererDlEnd
macro represents the end of a definition list that contains an item with several paragraphs of text (the list is not tight). The macro receives no arguments.
The \markdownRendererDlEndTight
macro represents the end of a definition list that contains no item with several paragraphs of text (the list is tight). This macro will only be produced, when the tightLists
option is false
. The macro receives no arguments.
Using a text editor, create a text document named document.tex
with the following content:
\input markdown
\def\markdownOptionDefinitionLists{true}
\def\markdownOptionTightLists{true}
\def\markdownRendererInterblockSeparator{%
:%
\def\markdownRendererInterblockSeparator{\par}%
}
\def\markdownRendererDlBeginTight{%
\begingroup
\parindent=0pt
}
\def\markdownRendererDlItem#1{%
\par{\bf#1}%
\def\markdownRendererDlDefinitionEnd{%
,
\def\markdownRendererDlDefinitionEnd{%
, and
\def\markdownRendererDlDefinitionEnd{.}%
}%
}%
}
\def\markdownRendererDlItemEnd{}
\def\markdownRendererDlDefinitionBegin{\par--\kern 0.5em}
\def\markdownRendererDlEndTight{\endgroup}
\markdownBegin
This is a tight definition list
Coffee
: black hot drink
: prepared from roasted coffee beans
: one of the most traded agricultural commodities in the world
Milk
: white cold drink
: nutrient-rich
: produced on an industrial scale
\markdownEnd
\def\markdownRendererInterblockSeparator{%
\def\markdownRendererInterblockSeparator{\par}%
}
\def\markdownRendererDlBegin{}
\def\markdownRendererDlItem#1{%
. #1 is a
\def\markdownRendererDlDefinitionBegin{%
\def\markdownRendererDlDefinitionBegin{%
,
\def\markdownRendererDlDefinitionBegin{, and }%
}%
}%
}
\def\markdownRendererDlItemEnd{}
\def\markdownRendererDlDefinitionEnd{}
\def\markdownRendererDlEnd{.}
\markdownBegin
This is a loose definition list
Coffee
: black hot drink
: prepared from roasted coffee beans
: one of the most traded agricultural commodities in the world
Milk
: white cold drink
: nutrient-rich
: produced on an industrial scale
\markdownEnd
\bye
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
This is a tight definition list:
Coffee
- black hot drink,
- prepared from roasted coffee beans, and
- one of the most traded agricultural commodities in the world.
Milk
- white cold drink,
- nutrient-rich, and
- produced on an industrial scale.
This is a loose definition list. Coffee is a black hot drink, prepared from roasted coffee beans, and one of the most traded agricultural commodities in the world. Milk is a white cold drink, nutrient-rich, and produced on an industrial scale.
Using a text editor, create a text document named document.tex
with the following content:
\documentclass{article}
\usepackage[definitionLists, tightLists]{markdown}
\begin{document}
\begin{markdown*}{
renderers = {
interblockSeparator = {%
:%
\def\markdownRendererInterblockSeparator{\par}%
},
dlBeginTight = {\begin{description}},
dlItem = {%
\item[#1]
\begin{itemize}
\def\markdownRendererDlDefinitionEnd{%
,
\def\markdownRendererDlDefinitionEnd{%
, and
\def\markdownRendererDlDefinitionEnd{.}%
}%
}%
},
dlItemEnd = {\end{itemize}},
dlDefinitionBegin = \item,
dlEndTight = {\end{description}},
},
}
This is a tight definition list
Coffee
: black hot drink
: prepared from roasted coffee beans
: one of the most traded agricultural commodities in the world
Milk
: white cold drink
: nutrient-rich
: produced on an industrial scale
\end{markdown*}
\begin{markdown*}{
renderers = {
interblockSeparator = {%
\def\markdownRendererInterblockSeparator{\par}%
},
dlBegin = {},
dlItem = {%
. #1 is a
\def\markdownRendererDlDefinitionBegin{%
\def\markdownRendererDlDefinitionBegin{%
,
\def\markdownRendererDlDefinitionBegin{, and }%
}%
}%
},
dlItemEnd = {},
dlDefinitionEnd = {},
dlEnd = {.},
},
}
This is a loose definition list
Coffee
: black hot drink
: prepared from roasted coffee beans
: one of the most traded agricultural commodities in the world
Milk
: white cold drink
: nutrient-rich
: produced on an industrial scale
\end{markdown*}
\end{document}
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
This is a tight definition list:
Coffee
- black hot drink,
- prepared from roasted coffee beans, and
- one of the most traded agricultural commodities in the world.
Milk
- white cold drink,
- nutrient-rich, and
- produced on an industrial scale.
This is a loose definition list. Coffee is a black hot drink, prepared from roasted coffee beans, and one of the most traded agricultural commodities in the world. Milk is a white cold drink, nutrient-rich, and produced on an industrial scale.
Using a text editor, create a text document named document.tex
with the following content:
\usemodule[t][markdown]
\def\markdownOptionDefinitionLists{true}
\def\markdownOptionTightLists{true}
\starttext
\def\markdownRendererInterblockSeparator{%
:%
\def\markdownRendererInterblockSeparator{\par}%
}
\def\markdownRendererDlBeginTight{}
\def\markdownRendererDlItem#1{%
\par{\bf#1}%
\startitemize
\def\markdownRendererDlDefinitionEnd{%
,
\def\markdownRendererDlDefinitionEnd{%
, and
\def\markdownRendererDlDefinitionEnd{.}%
}%
}%
}
\def\markdownRendererDlItemEnd{\stopitemize}
\def\markdownRendererDlDefinitionBegin{\item}
\def\markdownRendererDlEndTight{}
\startmarkdown
This is a tight definition list
Coffee
: black hot drink
: prepared from roasted coffee beans
: one of the most traded agricultural commodities in the world
Milk
: white cold drink
: nutrient-rich
: produced on an industrial scale
\stopmarkdown
\def\markdownRendererInterblockSeparator{%
\def\markdownRendererInterblockSeparator{\par}%
}
\def\markdownRendererDlBegin{}
\def\markdownRendererDlItem#1{%
. #1 is a
\def\markdownRendererDlDefinitionBegin{%
\def\markdownRendererDlDefinitionBegin{%
,
\def\markdownRendererDlDefinitionBegin{, and }%
}%
}%
}
\def\markdownRendererDlItemEnd{}
\def\markdownRendererDlDefinitionEnd{}
\def\markdownRendererDlEnd{.}
\startmarkdown
This is a loose definition list
Coffee
: black hot drink
: prepared from roasted coffee beans
: one of the most traded agricultural commodities in the world
Milk
: white cold drink
: nutrient-rich
: produced on an industrial scale
\stopmarkdown
\stoptext
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
This is a tight definition list:
Coffee
- black hot drink,
- prepared from roasted coffee beans, and
- one of the most traded agricultural commodities in the world.
Milk
- white cold drink,
- nutrient-rich, and
- produced on an industrial scale.
This is a loose definition list. Coffee is a black hot drink, prepared from roasted coffee beans, and one of the most traded agricultural commodities in the world. Milk is a white cold drink, nutrient-rich, and produced on an industrial scale.
The \markdownRendererEmphasis
macro represents an emphasized span of text. The macro receives a single argument that corresponds to the emphasized span of text.
Using a text editor, create a text document named document.tex
with the following content:
\input markdown
\def\markdownRendererEmphasis#1{{\it#1}}
\def\markdownRendererStrongEmphasis#1{{\bf#1}}
\markdownBegin
This is *emphasis*.
This is **strong emphasis**.
\markdownEnd
\bye
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
This is emphasis.
This is strong emphasis.
Using a text editor, create a text document named document.tex
with the following content:
\documentclass{article}
\usepackage{markdown}
\markdownSetup{
renderers = {
emphasis = {\emph{#1}},
strongEmphasis = {\textbf{#1}},
},
}
\begin{document}
\begin{markdown}
This is *emphasis*.
This is **strong emphasis**.
\end{markdown}
\end{document}
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
This is emphasis.
This is strong emphasis.
Using a text editor, create a text document named document.tex
with the following content:
\usemodule[t][markdown]
\def\markdownRendererEmphasis#1{\emph{#1}}
\def\markdownRendererStrongEmphasis#1{\bold{#1}}
\starttext
\startmarkdown
This is *emphasis*.
This is **strong emphasis**.
\stopmarkdown
\stoptext
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
This is emphasis.
This is strong emphasis.
The \markdownRendererStrongEmphasis
macro represents a strongly emphasized span of text. The macro receives a single argument that corresponds to the emphasized span of text.
The \markdownRendererBlockQuoteBegin
macro represents the beginning of a block quote. The macro receives no arguments.
Using a text editor, create a text document named document.tex
with the following content:
\input markdown
\def\markdownRendererBlockQuoteBegin{%
\begingroup
\vskip\parindent
\leftskip=2\parindent
\parindent=0pt
}
\def\markdownRendererBlockQuoteEnd{%
\par
\vskip\parindent
\endgroup
}
\markdownBegin
A quote from William Shakespeare's King Lear:
> This is the excellent foppery of the world that when we are
> sick in fortune---often the surfeit of our own behavior---we
> make guilty of our disasters the sun, the moon, and the
> stars [...]
\markdownEnd
\bye
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
A quote from William Shakespeare’s King Lear:
This is the excellent foppery of the world that when we are sick in fortune—often the surfeit of our own behavior—we make guilty of our disasters the sun, the moon, and the stars […]
Using a text editor, create a text document named document.tex
with the following content:
\documentclass{article}
\usepackage{markdown}
\markdownSetup{
renderers = {
blockQuoteBegin = {\begin{quote}},
blockQuoteEnd = {\end{quote}},
},
}
\begin{document}
\begin{markdown}
A quote from William Shakespeare's King Lear:
> This is the excellent foppery of the world that when we are
> sick in fortune---often the surfeit of our own behavior---we
> make guilty of our disasters the sun, the moon, and the
> stars [...]
\end{markdown}
\end{document}
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
A quote from William Shakespeare’s King Lear:
This is the excellent foppery of the world that when we are sick in fortune—often the surfeit of our own behavior—we make guilty of our disasters the sun, the moon, and the stars […]
Using a text editor, create a text document named document.tex
with the following content:
\usemodule[t][markdown]
\def\markdownRendererBlockQuoteBegin{\startquotation}
\def\markdownRendererBlockQuoteEnd{\stopquotation}
\starttext
\startmarkdown
A quote from William Shakespeare's King Lear:
> This is the excellent foppery of the world that when we are
> sick in fortune---often the surfeit of our own behavior---we
> make guilty of our disasters the sun, the moon, and the
> stars [...]
\stopmarkdown
\stoptext
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
A quote from William Shakespeare’s King Lear:
This is the excellent foppery of the world that when we are sick in fortune—often the surfeit of our own behavior—we make guilty of our disasters the sun, the moon, and the stars […]
The \markdownRendererBlockQuoteEnd
macro represents the end of a block quote. The macro receives no arguments.
The \markdownRendererInputVerbatim
macro represents a code block. The macro receives a single argument that corresponds to the filename of a file contaning the code block contents.
The \markdownRendererInputFencedCode
macro represents a fenced code block. This macro will only be produced, when the fencedCode
option is enabled. The macro receives two arguments that correspond to the filename of a file contaning the code block contents and to the code fence infostring.
Using a text editor, create a text document named document.tex
with the following content:
\documentclass{article}
\usepackage{verbatim}
\usepackage[hyphens]{url}
\usepackage[fencedCode]{markdown}
\markdownSetup{
renderers = {
interblockSeparator = {
\def\markdownRendererInterblockSeparator{%
\par
\def\markdownRendererInterblockSeparator{%
\def\markdownRendererInterblockSeparator{%
\par
}%
}%
}%
},
inputVerbatim = {
is contained in file \url{#1}:%
\verbatiminput{#1}%
},
inputFencedCode = {
in #2 \markdownRendererInputVerbatim{#1}%
},
},
}
\begin{document}
\begin{markdown}
The following code
def foo(bar):
if len(bar) <= 1:
return bar[0]
elif len(bar) == 2:
return sorted(bar)
else:
baz = len(bar) // 2
return foo(bar[baz:], bar[:baz])
The following code
~~~ Python
>>> foo([4, 2, 1, 3])
[1, 2, 3, 4]
~~~~~~~~~~
\end{markdown}
\end{document}
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text except for the filename, which may differ:
The following code is contained in file
./_markdown_document/882453149edcf288976647f6fe147ada.verbatim
:def foo(bar): if len(bar) <= 1: return bar[:1] elif len(bar) == 2: return sorted(bar) else: baz = bar[len(bar) // 2] return ( foo([qux for qux in bar if qux < baz]) + [baz] + foo([qux for qux in bar if qux > baz]) )
The following code in Python contained in file
./_markdown_document/cf2a96e2120cef5b1fae5fea36fcc27b.verbatim
:
The \markdownRendererHeadingOne
macro represents a first level heading. The macro receives a single argument that corresponds to the heading text.
The \markdownRendererHeadingTwo
macro represents a second level heading. The macro receives a single argument that corresponds to the heading text.
The \markdownRendererHeadingThree
macro represents a third level heading. The macro receives a single argument that corresponds to the heading text.
The \markdownRendererHeadingFour
macro represents a fourth level heading. The macro receives a single argument that corresponds to the heading text.
The \markdownRendererHeadingFive
macro represents a fifth level heading. The macro receives a single argument that corresponds to the heading text.
The \markdownRendererHeadingSix
macro represents a sixth level heading. The macro receives a single argument that corresponds to the heading text.
Using a text editor, create a text document named document.tex
with the following content:
\input markdown
\def\markdownRendererInterblockSeparator{}
\def\markdownRendererHeadingOne{1}
\def\markdownRendererHeadingTwo{2}
\def\markdownRendererHeadingThree{3}
\def\markdownRendererHeadingFour{4}
\def\markdownRendererHeadingFive{5}
\def\markdownRendererHeadingSix{6}
\markdownBegin
######
#####
#####
###
######
\markdownEnd
\bye
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
65536
Using a text editor, create a text document named document.tex
with the following content:
\documentclass{article}
\usepackage{markdown}
\markdownSetup{
renderers = {
interblockSeparator = {},
headingOne = 1,
headingTwo = 2,
headingThree = 3,
headingFour = 4,
headingFive = 5,
headingSix = 6,
},
}
\begin{document}
\begin{markdown}
######
#####
#####
###
######
\end{markdown}
\end{document}
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
65536
Using a text editor, create a text document named document.tex
with the following content:
\usemodule[t][markdown]
\def\markdownRendererInterblockSeparator{}
\def\markdownRendererHeadingOne{1}
\def\markdownRendererHeadingTwo{2}
\def\markdownRendererHeadingThree{3}
\def\markdownRendererHeadingFour{4}
\def\markdownRendererHeadingFive{5}
\def\markdownRendererHeadingSix{6}
\starttext
\startmarkdown
######
#####
#####
###
######
\stopmarkdown
\stoptext
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
65536
The \markdownRendererHorizontalRule
macro represents a horizontal rule. The macro receives no arguments.
Using a text editor, create a text document named document.tex
with the following content:
\input markdown
\def\markdownRendererHorizontalRule{\vfil\break}
\markdownBegin
This is the first page.
***
This is the second page.
\markdownEnd
\bye
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
This is the first page.
This is the second page.
Using a text editor, create a text document named document.tex
with the following content:
\documentclass{article}
\usepackage{markdown}
\markdownSetup{
renderers = {
horizontalRule = \newpage,
},
}
\begin{document}
\begin{markdown}
This is the first page.
***
This is the second page.
\end{markdown}
\end{document}
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
This is the first page.
This is the second page.
Using a text editor, create a text document named document.tex
with the following content:
\usemodule[t][markdown]
\def\markdownRendererHorizontalRule{\page[yes]}
\starttext
\startmarkdown
This is the first page.
***
This is the second page.
\stopmarkdown
\stoptext
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
This is the first page.
This is the second page.
The \markdownRendererFootnote
macro represents a footnote. This macro will only be produced, when the footnotes
option is enabled. The macro receives a single argument that corresponds to the footnote text.
Using a text editor, create a text document named document.tex
with the following content:
\input markdown
\def\markdownOptionFootnotes{true}
\def\markdownRendererFootnote#1{ (and \lowercase{#1})}
\markdownBegin
This is some text[^1] and this is some other text[^2].
[^1]: this is a footnote
[^2]: this is some other footnote
\markdownEnd
\bye
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
This is some text (and this is a footnote) and this is some other text (and this is some other footnote).
Using a text editor, create a text document named document.tex
with the following content:
\documentclass{article}
\usepackage[footnotes]{markdown}
\markdownSetup{
renderers = {
footnote = { (and \MakeLowercase{#1})},
},
}
\begin{document}
\begin{markdown}
This is some text[^1] and this is some other text[^2].
[^1]: this is a footnote
[^2]: this is some other footnote
\end{markdown}
\end{document}
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
This is some text (and this is a footnote) and this is some other text (and this is some other footnote).
Using a text editor, create a text document named document.tex
with the following content:
\usemodule[t][markdown]
\def\markdownOptionFootnotes{true}
\def\markdownRendererFootnote#1{ (and \lowercase{#1})}
\starttext
\startmarkdown
This is some text[^1] and this is some other text[^2].
[^1]: this is a footnote
[^2]: this is some other footnote
\stopmarkdown
\stoptext
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
This is some text (and this is a footnote) and this is some other text (and this is some other footnote).
The \markdownRendererCite
macro represents a string of one or more parenthetical citations. This macro will only be produced, when the citations
option is enabled. The macro receives the parameter {
⟨number of citations⟩}
followed by ⟨suppress author⟩ {
⟨prenote⟩}{
⟨postnote⟩}{
⟨name⟩}
repeated ⟨number of citations⟩ times. The ⟨suppress author⟩ parameter is either the token -
, when the author’s name is to be suppressed, or +
otherwise.
Using a text editor, create a text document named document.tex
with the following content:
\documentclass{article}
\usepackage[citations]{markdown}
\newcount\citationsCounter
\newcount\citationsTotal
\makeatletter
\def\citations#1#2#3#4{%
a parenthesized citation \emph{#4}
\advance\citationsCounter by 1\relax
\ifx\relax#2\relax
\ifx\relax#3\relax\else
with a postfix \emph{#3}%
\fi
\else
with a prefix \emph{#2}%
\ifx\relax#3\relax\else
\ and a postfix \emph{#3}%
\fi
\fi
\ifnum\citationsCounter>\citationsTotal\relax
.%
\expandafter\@gobble
\else
, and
\fi\citations}
\makeatother
\markdownSetup{
renderers = {
cite = {%
\citationsCounter=1%
\citationsTotal=#1%
This is
\expandafter\citations
},
},
}
\begin{document}
\begin{markdown}
[see @abrahams90, pp. 12; @eijkhout91, pp. 34]
\end{markdown}
\end{document}
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
This is a parenthesized citation abrahams90 with a prefix see and a postfix pp. > 12, and a citation eijkhout91 with a postfix pp. 34.
The \markdownRendererTextCite
macro represents a string of one or more text citations. This macro will only be produced, when the citations
option is enabled. The macro receives parameters in the same format as the \markdownRendererCite
macro.
Using a text editor, create a text document named document.tex
with the following content:
\documentclass{article}
\usepackage[citations]{markdown}
\newcount\citationsCounter
\newcount\citationsTotal
\makeatletter
\def\citations#1#2#3#4{%
a text citation \emph{#4}
\advance\citationsCounter by 1\relax
\ifx\relax#2\relax
\ifx\relax#3\relax\else
with a postfix \emph{#3}%
\fi
\else
with a prefix \emph{#2}%
\ifx\relax#3\relax\else
\ and a postfix \emph{#3}%
\fi
\fi
\ifnum\citationsCounter>\citationsTotal\relax
.%
\expandafter\@gobble
\else
, and
\fi\citations}
\makeatother
\markdownSetup{
renderers = {
textCite = {%
\citationsCounter=1%
\citationsTotal=#1%
This is
\expandafter\citations
},
},
}
\begin{document}
\begin{markdown}
@abrahams90 [pp. 12; also @eijkhout91]
\end{markdown}
\end{document}
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
This is a text citation abrahams90 with a postfix pp. 12, and a citation eijkhout91 with a prefix also.
The \markdownRendererTable
macro represents a table. This macro will only be produced, when the pipeTables
option is enabled. The macro receives the parameters {
⟨caption⟩}{
⟨number of rows⟩}{
⟨number of columns⟩}
followed by {
⟨alignments⟩}
and then by {
⟨row⟩}
repeated ⟨number of rows⟩ times, where ⟨row⟩ is {
⟨column⟩}
repeated ⟨number of columns⟩ times, ⟨alignments⟩ is ⟨alignment⟩ repeated ⟨number of columns⟩ times, and ⟨alignment⟩ is one of the following:
d
– The corresponding column has an unspecified (default) alignment.l
– The corresponding column is left-aligned.c
– The corresponding column is centered.r
– The corresponding column is right-aligned.Using a text editor, create a text document named document.tex
with the following content:
\documentclass{article}
\usepackage[pipeTables, tableCaptions]{markdown}
\newcount\rowCounter
\newcount\columnCounter
\makeatletter
\def\processRow#1{%
\columnCounter=1%
\ifnum\rowCounter=0\relax
As for the alignment,
\else
In row \the\rowCounter,
\fi
\processColumn#1
\advance\rowCounter by 1\relax
\ifnum\rowCounter>\rowTotal\relax
\expandafter\@gobble
\fi\processRow}%
\def\processColumn#1{%
column number \the\columnCounter{}
\ifnum\rowCounter=0\relax
\if#1d{}has default alignment\fi
\if#1l{}is left-aligned\fi
\if#1c{}is centered\fi
\if#1r{}is right-aligned\fi
\else
says \emph{#1}%
\fi
\advance\columnCounter by 1\relax
\ifnum\columnCounter<\columnTotal\relax, \fi
\ifnum\columnCounter=\columnTotal\relax, and \fi
\ifnum\columnCounter>\columnTotal\relax
.\expandafter\@gobble
\fi\processColumn}%
\makeatother
\markdownSetup{
renderers = {
table = {%
This is a table with caption \emph{#1} that is #3 colums wide
and #2 rows long.
\rowCounter=0%
\def\rowTotal{#2}%
\def\columnTotal{#3}%
\processRow
},
},
}
\begin{document}
\begin{markdown}
| Right | Left | Default | Center |
|------:|:-----|---------|:------:|
| 12 | 12 | 12 | 12 |
| 123 | 123 | 123 | 123 |
| 1 | 1 | 1 | 1 |
: Demonstration of pipe table syntax
\end{markdown}
\end{document}
\end{markdown}
\end{document}
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
This is a table with caption Demonstration of pipe table syntax that is 4 colums wide and 4 rows long. As for the alignment, column number 1 is right-aligned, column number 2 is left-aligned, column number 3 has default alignment, and column number 4 is centered. In row 1, column number 1 says Right, column number 2 says Left, column number 3 says Default, and column number 4 says Center. In row 2, column number 1 says 12, column number 2 says 12, column number 3 says 12, and column number 4 says 12. In row 3, column number 1 says 123, column number 2 says 123, column number 3 says 123, and column number 4 says 123. In row 4, column number 1 says 1, column number 2 says 1, column number 3 says 1, and column number 4 says 1.
By default, token renderers point to package-defined TeX macros, further referred to as prototypes, which provide useful default definitions.
Using a text editor, create a text document named document.tex
with the following content:
\input markdown
\def\markdownRendererTildePrototype{%
Packages can specify token renderer prototypes.%
}
\markdownBegin
~
\markdownEnd
\def\markdownRendererTilde{%
User-defined token renderers take precedence.%
}
\markdownBegin
~
\markdownEnd
\bye
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
Packages can specify token renderer prototypes.
User-defined token renderers take precedence.
Using a text editor, create a text document named document.tex
with the following content:
\documentclass{article}
\usepackage{markdown}
\markdownSetup{
rendererPrototypes = {
tilde = {Packages can specify token renderer prototypes.},
},
}
\begin{document}
\begin{markdown}
~
\end{markdown}
\begin{markdown*}{
renderers = {
tilde = {User-defined token renderers take precedence.},
},
}
~
\end{markdown*}
\end{document}
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
Packages can specify token renderer prototypes.
User-defined token renderers take precedence.
Using a text editor, create a text document named document.tex
with the following content:
\usemodule[t][markdown]
\def\markdownRendererTildePrototype{%
Packages can specify token renderer prototypes.%
}
\starttext
\startmarkdown
~
\stopmarkdown
\def\markdownRendererTilde{%
User-defined token renderers take precedence.%
}
\startmarkdown
~
\stopmarkdown
\stoptext
Next, invoke LuaTeX from the terminal:
A PDF document named document.pdf
should be produced and contain the following text:
Packages can specify token renderer prototypes.
User-defined token renderers take precedence.
Here is the footnote.↩
Here’s one with multiple blocks.
Subsequent paragraphs are indented to show that they belong to the previous footnote.
{ some.code }
The whole paragraph can be indented, or just the first line. In this way, multi-paragraph footnotes work like multi-paragraph list items.↩
Here is the footnote.↩
Here’s one with multiple blocks.
Subsequent paragraphs are indented to show that they belong to the previous footnote.
{ some.code }
The whole paragraph can be indented, or just the first line. In this way, multi-paragraph footnotes work like multi-paragraph list items.↩
Inlines notes are easier to write, since you don’t have to pick an identifier and move down to type the note.↩
Inlines notes are easier to write, since you don’t have to pick an identifier and move down to type the note.↩