Pandoc 用户手册
概要
pandoc
[选项] [输入文件]…
描述
Pandoc 是一个用于在不同标记格式之间转换的 Haskell 库,也是一个使用此库的命令行工具。
Pandoc 可以在多种标记和字处理格式之间进行转换,包括但不限于各种风格的 Markdown、HTML、LaTeX 和 Word docx。有关输入和输出格式的完整列表,请参阅下方 选项 中的 --from
和 --to
选项。Pandoc 还可以生成 PDF 输出:请参阅下方的 创建 PDF。
Pandoc 的增强版 Markdown 包含 表格、定义列表、元数据块、脚注、引用、数学公式 等多种语法。请参阅下方的 Pandoc 的 Markdown 部分。
Pandoc 采用模块化设计:它由一组读取器(用于解析给定格式的文本并生成文档的本机表示,即抽象语法树或 AST)和一组写入器(用于将此本机表示转换为目标格式)组成。因此,添加输入或输出格式仅需添加相应的读取器或写入器。用户还可以运行自定义的 pandoc 过滤器 来修改中间的 AST。
由于 Pandoc 的文档中间表示不如许多它所转换的格式富有表现力,因此不应期望所有格式之间的转换都能做到完美。Pandoc 试图保留文档的结构元素,但不会保留页边距大小等格式细节。并且某些文档元素,例如复杂的表格,可能不适合 Pandoc 的简单文档模型。虽然从 Pandoc 的 Markdown 到所有格式的转换都力求完美,但从比 Pandoc 的 Markdown 更具表现力的格式进行的转换可能会有信息损失。
使用 pandoc
如果未指定输入文件,则默认从 stdin 读取输入。输出默认发送到 stdout。要输出到文件,请使用 -o
选项。
pandoc -o output.html input.txt
默认情况下,Pandoc 生成一个文档片段。要生成一个独立文档(例如,包含 <head>
和 <body>
的有效 HTML 文件),请使用 -s
或 --standalone
标志。
pandoc -s -o output.html input.txt
有关如何生成独立文档的更多信息,请参阅下方的 模板。
如果给定多个输入文件,Pandoc 将在解析之前将它们全部连接起来(文件之间用空行分隔)。(使用 --file-scope
单独解析文件。)
指定格式
输入和输出的格式可以使用命令行选项明确指定。输入格式可以使用 -f/--from
选项指定,输出格式可以使用 -t/--to
选项指定。因此,要将 hello.txt
从 Markdown 转换为 LaTeX,您可以输入:
pandoc -f markdown -t latex hello.txt
要将 hello.html
从 HTML 转换为 Markdown:
pandoc -f html -t markdown hello.html
支持的输入和输出格式列在下方的 选项 部分(请参阅 -f
了解输入格式,-t
了解输出格式)。您也可以使用 pandoc --list-input-formats
和 pandoc --list-output-formats
来打印支持格式的列表。
如果未明确指定输入或输出格式,Pandoc 将尝试根据文件名的扩展名进行猜测。因此,例如:
pandoc -o hello.tex hello.txt
将把 hello.txt
从 Markdown 转换为 LaTeX。如果未指定输出文件(因此输出到 stdout),或者输出文件的扩展名未知,则输出格式将默认为 HTML。如果未指定输入文件(因此输入来自 stdin),或者输入文件的扩展名未知,则输入格式将假定为 Markdown。
字符编码
Pandoc 对输入和输出均使用 UTF-8 字符编码。如果您的本地字符编码不是 UTF-8,您应该通过 iconv
管道输入和输出。
iconv -t utf-8 input.txt | pandoc | iconv -f utf-8
请注意,在某些输出格式(如 HTML、LaTeX、ConTeXt、RTF、OPML、DocBook 和 Texinfo)中,字符编码信息包含在文档头部,只有在使用 -s/--standalone
选项时才会包含。
创建 PDF
要生成 PDF,请指定一个扩展名为 .pdf
的输出文件。
pandoc test.txt -o test.pdf
默认情况下,Pandoc 将使用 LaTeX 创建 PDF,这需要安装 LaTeX 引擎(请参阅下方的 --pdf-engine
)。另外,Pandoc 可以使用 ConTeXt、roff ms 或 HTML 作为中间格式。为此,像以前一样指定一个扩展名为 .pdf
的输出文件,但在命令行中添加 --pdf-engine
选项或 -t context
、-t html
或 -t ms
。用于从中间格式生成 PDF 的工具可以使用 --pdf-engine
指定。
您可以使用变量控制 PDF 样式,具体取决于所使用的中间格式:请参阅 LaTeX 变量、ConTeXt 变量、wkhtmltopdf
变量、ms 变量。当 HTML 用作中间格式时,输出可以使用 --css
进行样式设置。
为了调试 PDF 创建过程,查看中间表示会很有用:例如,不要使用 -o test.pdf
,而是使用 -s -o test.tex
来输出生成的 LaTeX。然后您可以使用 pdflatex test.tex
进行测试。
使用 LaTeX 时,需要提供以下宏包(它们包含在所有最新版本的 TeX Live 中):amsfonts
、amsmath
、lm
、unicode-math
、iftex
、listings
(如果使用 --listings
选项)、fancyvrb
、longtable
、booktabs
、[multirow
](如果文档包含带有跨多行的单元格的表格)、graphicx
(如果文档包含图像)、bookmark
、xcolor
、soul
、geometry
(设置了 geometry
变量时)、setspace
(设置了 linestretch
时),以及 babel
(设置了 lang
时)。如果设置了 CJKmainfont
,则在使用 xelatex
时需要 xeCJK
,否则在使用 lualatex
时需要 luatexja
。如果代码在具有彩色背景的方案中突出显示,则需要 framed
。使用 xelatex
或 lualatex
作为 PDF 引擎需要 fontspec
。lualatex
使用 selnolig
和 lua-ul
。xelatex
使用 bidi
(设置了 dir
变量时)。如果设置了 mathspec
变量,xelatex
将使用 mathspec
而不是 unicode-math
。如果可用,将使用 upquote
和 microtype
宏包;如果 csquotes
变量或元数据字段设置为真值,将使用 csquotes
进行 排版。可选地,natbib
、biblatex
、bibtex
和 biber
宏包可用于 引文渲染。如果存在以下宏包,它们将用于改善输出质量,但 Pandoc 不要求它们必须存在:upquote
(用于逐字环境中直引号)、microtype
(用于更好的间距调整)、parskip
(用于更好的段落间距)、xurl
(用于 URL 中更好的换行),以及 footnotehyper
或 footnote
(允许表格中脚注)。
从 Web 读取
除了输入文件,还可以提供一个绝对 URI。在这种情况下,Pandoc 将使用 HTTP 获取内容。
pandoc -f html -t markdown https://www.fsf.org
从 URL 请求文档时,可以提供自定义的 User-Agent 字符串或其他 HTTP 头。
pandoc -f html -t markdown --request-header User-Agent:"Mozilla/5.0" \
https://www.fsf.org
选项
退出代码
如果 pandoc 成功完成,它将返回退出代码 0。非零退出代码具有以下含义:
代码 | 错误 |
---|---|
1 | PandocIOError |
3 | PandocFailOnWarningError |
4 | PandocAppError |
5 | PandocTemplateError |
6 | PandocOptionError |
21 | PandocUnknownReaderError |
22 | PandocUnknownWriterError |
23 | PandocUnsupportedExtensionError |
24 | PandocCiteprocError |
25 | PandocBibliographyError |
31 | PandocEpubSubdirectoryError |
43 | PandocPDFError |
44 | PandocXMLError |
47 | PandocPDFProgramNotFoundError |
61 | PandocHttpError |
62 | PandocShouldNeverHappenError |
63 | PandocSomeError |
64 | PandocParseError |
66 | PandocMakePDFError |
67 | PandocSyntaxMapError |
83 | PandocFilterError |
84 | PandocLuaError |
89 | PandocNoScriptingEngine |
91 | PandocMacroLoop |
92 | PandocUTF8DecodingError |
93 | PandocIpynbDecodingError |
94 | PandocUnsupportedCharsetError |
97 | PandocCouldNotFindDataFileError |
98 | PandocCouldNotFindMetadataFileError |
99 | PandocResourceNotFound |
默认文件
可以使用 --defaults
选项来指定选项包,形式为 YAML 文件。
省略的字段将只保留其常规默认值。因此,默认文件可以像一行代码一样简单:
verbosity: INFO
在需要文件路径(或文件路径列表)的字段中,可以使用以下语法来插入环境变量:
csl: ${HOME}/mycsldir/special.csl
也可以使用 ${USERDATA}
;这总是解析为解析默认文件时当前的用户数据目录,无论环境变量 USERDATA
的设置如何。
${.}
将解析为包含默认文件本身的目录。这允许您引用该目录中包含的资源:
epub-cover-image: ${.}/cover.jpg
epub-metadata: ${.}/meta.xml
resource-path:
- . # the working directory from which pandoc is run
- ${.}/images # the images subdirectory of the directory
# containing this defaults file
这种环境变量插值语法只在需要文件路径的字段中起作用。
默认文件可以放置在用户数据目录的 defaults
子目录中,并从任何目录使用。例如,可以创建一个指定信件撰写默认值的文件,将其保存为用户数据目录的 defaults
子目录中的 letter.yaml
,然后从任何目录使用 pandoc --defaults letter
或 pandoc -dletter
调用这些默认值。
当使用多个默认值时,它们的内容将合并。
请注意,对于命令行参数可以重复的情况(--metadata-file
、--css
、--include-in-header
、--include-before-body
、--include-after-body
、--variable
、--metadata
、--syntax-definition
),命令行上指定的值将与默认文件中指定的值合并,而不是替换它们。
下表显示了命令行和默认文件条目之间的映射。
命令行 | 默认文件 |
---|---|
|
|
|
|
input-files
的值可以留空,表示从标准输入读取,也可以是空序列 []
,表示没有输入。
通用选项
命令行 | 默认文件 |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
默认文件本身中指定的选项始终优先于通过 defaults:
条目包含的其他文件中的选项。
verbosity
可以有 ERROR
、WARNING
或 INFO
值。
阅读器选项
命令行 | 默认文件 |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
默认文件中指定的元数据值被解析为字面字符串文本,而不是 Markdown。
如果过滤器具有 .lua
扩展名,则假定它们是 Lua 过滤器,否则是 JSON 过滤器。但过滤器类型也可以明确指定,如所示。过滤器按指定顺序运行。要包含内置的 citeproc 过滤器,请使用 citeproc
或 {type: citeproc}
。
通用写入器选项
命令行 | 默认文件 |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
影响特定写入器的选项
命令行 | 默认文件 |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
引文渲染
命令行 | 默认文件 |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
cite-method
可以是 citeproc
、natbib
或 biblatex
。这仅影响 LaTeX 输出。如果您想使用 citeproc 格式化引文,还应设置“citeproc: true”。
如果您需要控制 citeproc 处理相对于其他过滤器的执行时间,则应在 filters
列表中使用 citeproc
(参见 阅读器选项)。
HTML 中的数学渲染
命令行 | 默认文件 |
---|---|
|
|
|
|
|
|
|
|
|
|
除了上面列出的值,method
可以有值 plain
。
如果命令行选项接受 URL 参数,则可以将 url:
字段添加到 html-math-method:
中。
包装器脚本选项
命令行 | 默认文件 |
---|---|
|
|
|
|
模板
当使用 -s/--standalone
选项时,pandoc 使用模板添加独立文档所需的页眉和页脚材料。要查看使用的默认模板,只需输入:
pandoc -D *FORMAT*
其中 FORMAT 是输出格式的名称。可以使用 --template
选项指定自定义模板。您也可以通过将 templates/default.*FORMAT*
文件放置在用户数据目录中(参见上文 --data-dir
)来覆盖给定输出格式 FORMAT 的系统默认模板。例外:
- 对于
odt
输出,自定义default.opendocument
模板。 - 对于
docx
输出,自定义default.openxml
模板。 - 对于
pdf
输出,自定义default.latex
模板(如果使用-t context
,则自定义default.context
模板;如果使用-t ms
,则自定义default.ms
模板;如果使用-t html
,则自定义default.html
模板)。 pptx
没有模板。
请注意,docx
、odt
和 pptx
输出也可以使用 --reference-doc
进行自定义。使用参考文档调整文档中的样式;使用模板处理变量插值和自定义元数据的呈现、目录的位置、样板文本等。
模板包含变量,允许在文件的任何位置包含任意信息。它们可以使用 -V/--variable
选项在命令行上设置。如果未设置变量,pandoc 将在文档的元数据中查找键,元数据可以使用 YAML 元数据块 或 -M/--metadata
选项设置。此外,某些变量由 pandoc 赋予默认值。有关 pandoc 默认模板中使用的变量列表,请参见下文 变量。
如果您使用自定义模板,则可能需要随着 pandoc 的更改而修订它们。我们建议跟踪默认模板的更改,并相应地修改您的自定义模板。一个简单的方法是分叉 pandoc-templates 存储库并在每次 pandoc 发布后合并更改。
模板语法
分隔符
为了在模板中标记变量和控制结构,可以使用 $
…$
或 ${
…}
作为分隔符。同个模板中也可以混合使用这些样式,但开闭分隔符必须在每种情况下匹配。开分隔符后面可以跟一个或多个空格或制表符,这些将被忽略。闭分隔符前面可以跟一个或多个空格或制表符,这些将被忽略。
要在文档中包含字面量 $
,请使用 $$
。
插值变量
插值变量的槽位是被匹配分隔符包围的变量名。变量名必须以字母开头,可以包含字母、数字、_
、-
和 .
。关键字 it
、if
、else
、endif
、for
、sep
和 endfor
不能用作变量名。示例:
$foo$
$foo.bar.baz$
$foo_bar.baz-bim$
$ foo $
${foo}
${foo.bar.baz}
${foo_bar.baz-bim}
${ foo }
带点的变量名用于获取结构化变量值。例如,employee.salary
将返回作为 employee
字段值的对象的 salary
字段的值。
- 如果变量的值是简单值,它将按原样渲染。(请注意,不进行转义;假定调用程序将根据输出格式适当地转义字符串。)
- 如果值是列表,则这些值将连接起来。
- 如果值是映射,则将渲染字符串
true
。 - 所有其他值都将渲染为空字符串。
条件语句
条件语句以 if(variable)
(括在匹配的分隔符中)开始,以 endif
(括在匹配的分隔符中)结束。它可以选择包含一个 else
(括在匹配的分隔符中)。如果 variable
具有真值,则使用 if
部分,否则使用 else
部分(如果存在)。以下值被视为真:
- 任何映射
- 任何包含至少一个真值的数组
- 任何非空字符串
- 布尔真
请注意,在 YAML 元数据(以及使用 -M/--metadata
在命令行上指定的元数据)中,未引用的 true
和 false
将被解释为布尔值。但是,使用 -V/--variable
在命令行上指定的变量将始终被赋予字符串值。因此,如果您使用 -V foo=false
,条件 if(foo)
将被触发,但如果您使用 -M foo=false
,则不会。
示例
$if(foo)$bar$endif$
$if(foo)$
$foo$
$endif$
$if(foo)$
part one
$else$
part two
$endif$
${if(foo)}bar${endif}
${if(foo)}
${foo}
${endif}
${if(foo)}
${ foo.bar }
${else}
no foo!
${endif}
关键字 elseif
可用于简化复杂的嵌套条件语句:
$if(foo)$
XXX
$elseif(bar)$
YYY
$else$
ZZZ
$endif$
for 循环
for 循环以 for(variable)
(括在匹配的分隔符中)开始,以 endfor
(括在匹配的分隔符中)结束。
- 如果
variable
是一个数组,则循环内部的材料将重复评估,variable
依次设置为数组的每个值,并连接起来。 - 如果
variable
是一个映射,则内部的材料将设置为该映射。 - 如果关联变量的值不是数组或映射,则将对其值执行单次迭代。
示例
$for(foo)$$foo$$sep$, $endfor$
$for(foo)$
- $foo.last$, $foo.first$
$endfor$
${ for(foo.bar) }
- ${ foo.bar.last }, ${ foo.bar.first }
${ endfor }
$for(mymap)$
$it.name$: $it.office$
$endfor$
您可以选择使用 sep
(括在匹配的分隔符中)在连续值之间指定分隔符。sep
和 endfor
之间的材料是分隔符。
${ for(foo) }${ foo }${ sep }, ${ endfor }
在循环内部,可以使用特殊的指示性关键字 it
来代替 variable
。
${ for(foo.bar) }
- ${ it.last }, ${ it.first }
${ endfor }
局部模板
局部模板(存储在不同文件中的子模板)可以通过使用局部模板的名称,后跟 ()
来包含,例如:
${ styles() }
局部模板将在包含主模板的目录中查找。如果文件名没有扩展名,则假定其具有与主模板相同的扩展名。调用局部模板时,也可以使用包含文件扩展名的完整名称:
${ styles.html() }
(如果在模板目录中找不到局部模板,并且模板路径是相对路径,它还将在用户数据目录的 templates
子目录中查找。)
局部模板可以选择使用冒号应用于变量:
${ date:fancy() }
${ articles:bibentry() }
如果 articles
是一个数组,这将遍历其值,将局部模板 bibentry()
应用于每个值。因此,上面的第二个示例等同于:
${ for(articles) }
${ it:bibentry() }
${ endfor }
请注意,在遍历局部模板时必须使用指示性关键字 it
。在上述示例中,bibentry
局部模板应包含 it.title
(等等)而不是 articles.title
。
包含的局部模板中会省略末尾的换行符。
局部模板可以包含其他局部模板。
数组值之间的分隔符可以用方括号指定,紧跟在变量名或局部模板之后:
${months[, ]}
${articles:bibentry()[; ]}
在这种情况下,分隔符是字面量(与显式 for
循环中的 sep
不同),不能包含插值变量或其他模板指令。
嵌套
为确保内容“嵌套”,即后续行缩进,请使用 ^
指令:
$item.number$ $^$$item.description$ ($item.price$)
在此示例中,如果 item.description
有多行,它们都将缩进以与第一行对齐:
00123 A fine bottle of 18-year old
Oban whiskey. ($148)
要将多行嵌套到同一级别,请在模板中将它们与 ^
指令对齐。例如:
$item.number$ $^$$item.description$ ($item.price$)
(Available til $item.sellby$.)
将产生:
00123 A fine bottle of 18-year old
Oban whiskey. ($148)
(Available til March 30, 2020.)
如果一个变量单独出现在一行上,前面有空白字符,并且同一行上没有其他文本或指令,并且变量的值包含多行,它将自动嵌套。
可断行空格
通常,模板中的空格(与插值变量的值相反)是不可断行的,但它们可以通过使用 ~
关键字(以另一个 ~
结束)在模板的一部分中变为可断行。
$~$This long line may break if the document is rendered
with a short line length.$~$
管道
管道转换变量或局部变量的值。管道使用斜杠(/
)在变量名(或局部变量)和管道名之间指定。示例:
$for(name)$
$name/uppercase$
$endfor$
$for(metadata/pairs)$
- $it.key$: $it.value$
$endfor$
$employee:name()/uppercase$
管道可以链式调用:
$for(employees/pairs)$
$it.key/alpha/uppercase$. $it.name$
$endfor$
一些管道接受参数:
|----------------------|------------|
$for(employee)$
$it.name.first/uppercase/left 20 "| "$$it.name.salary/right 10 " | " " |"$
$endfor$
|----------------------|------------|
目前预定义了以下管道:
pairs
:将映射或数组转换为映射数组,每个映射具有key
和value
字段。如果原始值是数组,则key
将是数组索引,从 1 开始。uppercase
:将文本转换为大写。lowercase
:将文本转换为小写。length
:返回值的长度:文本值为字符数,映射或数组为元素数。reverse
:反转文本值或数组,对其他值无效。first
:如果应用于非空数组,则返回数组的第一个值;否则返回原始值。last
:如果应用于非空数组,则返回数组的最后一个值;否则返回原始值。rest
:如果应用于非空数组,则返回数组中除第一个值之外的所有值;否则返回原始值。allbutlast
:如果应用于非空数组,则返回数组中除最后一个值之外的所有值;否则返回原始值。chomp
:移除尾随的换行符(和可断行空格)。nowrap
:禁用可断行空格上的换行。alpha
:将可读作整数的文本值转换为小写字母a..z
(模 26)。这可用于从数组索引获取字母枚举。要获取大写字母,请与uppercase
链式调用。roman
:将可读作整数的文本值转换为小写罗马数字。这可用于从数组索引获取字母枚举。要获取大写罗马数字,请与uppercase
链式调用。left n "leftborder" "rightborder"
:以宽度n
的块形式渲染文本值,左对齐,可选带左边框和右边框。对其他值无效。这可用于在表格中对齐材料。宽度是正整数,表示字符数。边框是双引号内的字符串;字面量"
和\
字符必须进行反斜杠转义。right n "leftborder" "rightborder"
:以宽度n
的块形式渲染文本值,右对齐,对其他值无效。center n "leftborder" "rightborder"
:以宽度n
的块形式渲染文本值,居中对齐,对其他值无效。
变量
元数据变量
title
,author
,date
-
允许识别文档的基本方面。通过 LaTeX 和 ConTeXt 包含在 PDF 元数据中。这些可以通过 pandoc 标题块(允许多个作者)或 YAML 元数据块 设置。
--- author: - Aristotle - Peter Abelard ...
请注意,如果您只想设置 PDF 或 HTML 元数据,而不在文档本身包含标题块,则可以设置
title-meta
、author-meta
和date-meta
变量。(默认情况下,这些变量会根据title
、author
和date
自动设置。)HTML 中的页面标题由pagetitle
设置,默认情况下它等于title
。 subtitle
- 文档副标题,包含在 HTML、EPUB、LaTeX、ConTeXt 和 docx 文档中
abstract
- 文档摘要,包含在 HTML、LaTeX、ConTeXt、AsciiDoc 和 docx 文档中
abstract-title
- 摘要标题,目前仅用于 HTML、EPUB 和 docx。这会自动设置为本地化值,取决于
lang
,但可以手动覆盖。 keywords
- 要包含在 HTML、PDF、ODT、pptx、docx 和 AsciiDoc 元数据中的关键词列表;重复方式与上述
author
相同 subject
- 文档主题,包含在 ODT、PDF、docx、EPUB 和 pptx 元数据中
description
- 文档描述,包含在 ODT、docx 和 pptx 元数据中。某些应用程序将其显示为
Comments
元数据。 category
- 文档类别,包含在 docx 和 pptx 元数据中
此外,任何未包含在 ODT、docx 或 pptx 元数据中的根级字符串元数据都将作为自定义属性添加。例如,以下 YAML 元数据块:
---
title: 'This is the title'
subtitle: "This is the subtitle"
author:
- Author One
- Author Two
description: |
This is a long
description.
It consists of two paragraphs
...
在转换为 docx、ODT 或 pptx 时,将包含 title
、author
和 description
作为标准文档属性,并将 subtitle
作为自定义属性。
语言变量
lang
-
使用 IETF 语言标签(遵循 BCP 47 标准),例如
en
或en-GB
,标识文档的主要语言。语言子标签查找 工具可以查找或验证这些标签。这会影响大多数格式,并在使用 LaTeX(通过babel
和polyglossia
)或 ConTeXt 时控制 PDF 输出中的断字。使用带有
lang
属性的原生 pandoc Divs 和 Spans 来切换语言:--- lang: en-GB ... Text in the main document language (British English). ::: {lang=fr-CA} > Cette citation est écrite en français canadien. ::: More text in English. ['Zitat auf Deutsch.']{lang=de}
dir
-
基本脚本方向,可以是
rtl
(从右到左)或ltr
(从左到右)。对于双向文档,带有
dir
属性(值rtl
或ltr
)的原生 pandocspan
和div
可用于在某些输出格式中覆盖基本方向。如果最终渲染器(例如,生成 HTML 时的浏览器)支持 Unicode 双向算法,这可能并非总是必要的。在使用 LaTeX 处理双向文档时,仅完全支持
xelatex
引擎(使用--pdf-engine=xelatex
)。
HTML 变量
document-css
- 启用在
styles.html
局部模板 中包含大部分 CSS(可以使用pandoc --print-default-data-file=templates/styles.html
查看)。除非您使用--css
,否则此变量默认设置为true
。您可以通过例如pandoc -M document-css=false
禁用它。 mainfont
- 设置
html
元素的 CSSfont-family
属性。 fontsize
- 设置基本 CSS
font-size
,通常将其设置为例如20px
,但它也接受pt
(大多数浏览器中 12pt = 16px)。 fontcolor
- 设置
html
元素的 CSScolor
属性。 linkcolor
- 设置所有链接的 CSS
color
属性。 monofont
- 设置
code
元素的 CSSfont-family
属性。 monobackgroundcolor
- 设置
code
元素的 CSSbackground-color
属性并添加额外填充。 linestretch
- 设置
html
元素的 CSSline-height
属性,最好是无单位的。 maxwidth
- 设置 CSS
max-width
属性(默认值为 36em)。 backgroundcolor
- 设置
html
元素的 CSSbackground-color
属性。 margin-left
,margin-right
,margin-top
,margin-bottom
- 设置
body
元素对应的 CSSpadding
属性。
要为单个文档覆盖或扩展某些 CSS,例如包含:
---
header-includes: |
<style>
blockquote {
font-style: italic;
}
tr.even {
background-color: #f0f0f0;
}
td, th {
padding: 0.5em 2em 0.5em 0.5em;
}
tbody {
border-bottom: none;
}
</style>
---
HTML 数学变量
classoption
- 当使用
--katex
时,您可以使用 YAML 元数据 或-M classoption=fleqn
将显示数学方程左对齐渲染。
HTML 幻灯片变量
这些变量影响 使用 pandoc 制作幻灯片 时的 HTML 输出。
institute
- 作者单位:多作者时可为列表
revealjs-url
- reveal.js 文档的基本 URL(默认为
https://unpkg.com/reveal.js@^5
) s5-url
- S5 文档的基本 URL(默认为
s5/default
) slidy-url
- Slidy 文档的基本 URL(默认为
https://www.w3.org/Talks/Tools/Slidy2
) slideous-url
- Slideous 文档的基本 URL(默认为
slideous
) title-slide-attributes
- reveal.js 幻灯片标题页的额外属性。有关示例,请参见 reveal.js、beamer 和 pptx 中的背景。
所有 reveal.js 配置选项 都可以作为变量使用。要关闭 reveal.js 中默认为真的布尔标志,请使用 0
。
Beamer 幻灯片变量
这些变量改变使用 beamer
生成 PDF 幻灯片的外观。
aspectratio
- 幻灯片纵横比(
43
表示 4:3 [默认],169
表示 16:9,1610
表示 16:10,149
表示 14:9,141
表示 1.41:1,54
表示 5:4,32
表示 3:2) beameroption
- 使用
\setbeameroption{}
添加额外的 beamer 选项 institute
- 作者单位:多作者时可为列表
logo
- 幻灯片徽标图像
navigation
- 控制导航符号(默认为
empty
表示无导航符号;其他有效值为frame
、vertical
和horizontal
) section-titles
- 为新节启用“标题页”(默认为 true)
theme
,colortheme
,fonttheme
,innertheme
,outertheme
- beamer 主题
themeoptions
,colorthemeoptions
,fontthemeoptions
,innerthemeoptions
,outerthemeoptions
- LaTeX beamer 主题选项(列表)
titlegraphic
- 标题幻灯片图像:可以是一个列表
titlegraphicoptions
- 标题幻灯片图像选项
shorttitle
,shortsubtitle
,shortauthor
,shortinstitute
,shortdate
- 一些 beamer 主题使用标题、副标题、作者、机构、日期的短版本
PowerPoint 变量
这些变量控制幻灯片的视觉方面,而这些方面不易通过模板控制。
monofont
- 用于代码的字体。
LaTeX 变量
Pandoc 在使用 LaTeX 引擎 创建 PDF 时使用这些变量。
布局
block-headings
-
使
\paragraph
和\subparagraph
(第四级和第五级标题,或使用书本类时为第五级和第六级)成为独立而非行内;需要进一步格式化以与\subsubsection
(第三级或第四级标题)区分开来。除了使用此选项外,KOMA-Script 可以更广泛地调整标题。--- documentclass: scrartcl header-includes: | \RedeclareSectionCommand[ beforeskip=-10pt plus -2pt minus -1pt, afterskip=1sp plus -1sp minus 1sp, font=\normalfont\itshape]{paragraph} \RedeclareSectionCommand[ beforeskip=-10pt plus -2pt minus -1pt, afterskip=1sp plus -1sp minus 1sp, font=\normalfont\scshape, indent=0pt]{subparagraph} ...
classoption
-
文档类选项,例如
oneside
;多个选项重复。--- classoption: - twocolumn - landscape ...
documentclass
- 文档类:通常是标准类之一,
article
、book
和report
;KOMA-Script 等效类scrartcl
、scrbook
和scrreprt
(默认页边距较小);或memoir
geometry
-
geometry
包选项,例如margin=1in
;多个选项重复--- geometry: - top=30mm - left=20mm - heightrounded ...
hyperrefoptions
-
hyperref
包选项,例如linktoc=all
;多个选项重复--- hyperrefoptions: - linktoc=all - pdfwindowui - pdfpagemode=FullScreen ...
indent
- 如果为 true,pandoc 将使用文档类设置进行缩进(否则默认 LaTeX 模板会移除缩进并在段落之间添加空格)
linestretch
- 使用
setspace
包调整行间距,例如1.25
、1.5
margin-left
,margin-right
,margin-top
,margin-bottom
- 如果未使用
geometry
,则设置页边距(否则geometry
会覆盖这些设置) pagestyle
- 控制
\pagestyle{}
:默认的 article 类支持plain
(默认)、empty
(无页眉或页码)和headings
(页眉中的节标题) papersize
- 纸张大小,例如
letter
,a4
secnumdepth
- 章节编号深度(使用
--number-sections
选项或numbersections
变量) beamerarticle
- 从 Beamer 幻灯片生成文章。注意:如果您设置此变量,则必须指定 beamer writer,但使用默认的 LaTeX 模板:例如,
pandoc -Vbeamerarticle -t beamer --template default.latex
。 handout
- 生成 Beamer 幻灯片的讲义版本(将覆盖层浓缩为单张幻灯片)
csquotes
- 加载
csquotes
包并使用\enquote
或\enquote*
处理引用的文本。 csquotesoptions
- 用于
csquotes
包的选项(多个选项重复)。 babeloptions
- 传递给 babel 包的选项(可以重复以指定多个选项)。如果主语言不是用拉丁语、西里尔字母或越南语书写的欧洲语言,则默认为
provide=*
。大多数用户不需要调整默认设置。
字体
fontenc
- 允许通过
fontenc
包(与pdflatex
一起使用)指定字体编码;默认值为T1
(参见 LaTeX 字体编码指南) fontfamily
- 用于
pdflatex
的字体包:TeX Live 包含许多选项,在 LaTeX 字体目录 中有详细说明。默认是 Latin Modern。 fontfamilyoptions
-
用作
fontfamily
的包的选项;多个选项重复。例如,要使用 Libertine 字体和比例小写(旧式)数字通过libertinus
包:--- fontfamily: libertinus fontfamilyoptions: - osf - p ...
fontsize
- 正文的字体大小。标准类允许 10pt、11pt 和 12pt。要使用其他大小,请将
documentclass
设置为 KOMA-Script 类之一,例如scrartcl
或scrbook
。 mainfont
,sansfont
,monofont
,mathfont
,CJKmainfont
,CJKsansfont
,CJKmonofont
- 用于
xelatex
或lualatex
的字体系列:使用fontspec
包,接受任何系统字体的名称。如果使用xelatex
,CJKmainfont
使用xecjk
包;如果使用lualatex
,则使用luatexja
包。 mainfontoptions
,sansfontoptions
,monofontoptions
,mathfontoptions
,CJKoptions
,luatexjapresetoptions
-
与
xelatex
和lualatex
中的mainfont
,sansfont
,monofont
,mathfont
,CJKmainfont
一起使用的选项。允许通过fontspec
提供的任何选择;多个选项重复。例如,要使用带小写数字的 TeX Gyre 版本 Palatino:--- mainfont: TeX Gyre Pagella mainfontoptions: - Numbers=Lowercase - Numbers=Proportional ...
mainfontfallback
,sansfontfallback
,monofontfallback
-
如果在
mainfont
、sansfont
或monofont
中找不到字形时要尝试的字体。这些是列表。字体名称后必须跟一个冒号,并且可以选择一组选项,例如:--- mainfontfallback: - "FreeSans:" - "NotoColorEmoji:mode=harf" ...
字体回退目前仅适用于
lualatex
。 babelfonts
-
一个将 Babel 语言名称(例如
chinese
)映射到与该语言一起使用的字体的映射--- babelfonts: chinese-hant: "Noto Serif CJK TC" russian: "Noto Serif" ...
microtypeoptions
- 传递给 microtype 包的选项
链接
colorlinks
- 为链接文本添加颜色;如果设置了
linkcolor
、filecolor
、citecolor
、urlcolor
或toccolor
中的任何一个,则自动启用 boxlinks
- 在链接周围添加可见的框(如果设置了
colorlinks
则无效) linkcolor
,filecolor
,citecolor
,urlcolor
,toccolor
- 内链、外链、引文链接、链接 URL 和目录中链接的颜色:使用
xcolor
允许的选项,包括dvipsnames
、svgnames
和x11names
列表 links-as-notes
- 导致链接以脚注形式打印
urlstyle
- URL 的样式(例如,
tt
、rm
、sf
,以及默认的same
)
前言
lof
,lot
- 包含图表列表、表格列表(也可以使用
--lof/--list-of-figures
、--lot/--list-of-tables
设置) thanks
- 文档标题后的致谢脚注内容
toc
- 包含目录(也可以使用
--toc/--table-of-contents
设置) toc-depth
- 目录中包含的章节级别
BibLaTeX 参考文献
这些变量在使用 BibLaTeX 进行 引文渲染 时起作用。
biblatexoptions
- biblatex 选项列表
biblio-style
- 与
--natbib
和--biblatex
一起使用时的参考文献样式 biblio-title
- 与
--natbib
和--biblatex
一起使用时的参考文献标题 bibliography
- 用于解析引用的参考文献
natbiboptions
- natbib 选项列表
ConTeXt 变量
Pandoc 在使用 ConTeXt 创建 PDF 时使用这些变量。
fontsize
- 正文的字体大小(例如
10pt
,12pt
) headertext
,footertext
- 放置在运行页眉或页脚中的文本(参见 ConTeXt 页眉和页脚);最多重复四次以进行不同位置的放置
indenting
- 控制段落缩进,例如
yes,small,next
(参见 ConTeXt 缩进);多个选项重复 interlinespace
- 调整行间距,例如
4ex
(使用setupinterlinespace
);多个选项重复 layout
- 页面边距和文本排列选项(参见 ConTeXt 布局);多个选项重复
linkcolor
,contrastcolor
- 页面外部和内部链接的颜色,例如
red
,blue
(参见 ConTeXt 颜色) linkstyle
- 链接的字体样式,例如
normal
、bold
、slanted
、boldslanted
、type
、cap
、small
lof
,lot
- 包含图表列表、表格列表
mainfont
,sansfont
,monofont
,mathfont
- 字体系列:接受任何系统字体名称(参见 ConTeXt 字体切换)
mainfontfallback
,sansfontfallback
,monofontfallback
- 要尝试的字体列表,按顺序排列,如果主字体中未找到字形。使用
\definefallbackfamily
兼容的字体名称语法。不支持 Emoji 字体。 margin-left
,margin-right
,margin-top
,margin-bottom
- 设置页边距,如果未使用
layout
(否则layout
会覆盖这些设置) pagenumbering
- 页码样式和位置(使用
setuppagenumbering
);多个选项重复 papersize
- 纸张大小,例如
letter
、A4
、landscape
(参见 ConTeXt 纸张设置);多个选项重复 pdfa
- 在序言中添加生成指定类型 PDF/A 所需的设置,例如
1a:2005
、2a
。如果未指定类型(即,值设置为 True,例如通过--metadata=pdfa
或 YAML 元数据块中的pdfa: true
),出于向后兼容性原因,将默认使用1b:2005
。不支持在未指定值的情况下使用--variable=pdfa
。要成功生成 PDF/A,需要 ICC 颜色配置文件可用,并且内容和所有包含的文件(如图像)必须符合标准。ICC 配置文件和输出意图可以使用变量pdfaiccprofile
和pdfaintent
指定。另请参阅 ConTeXt PDFA 以获取更多详细信息。 pdfaiccprofile
- 与
pdfa
结合使用时,指定 PDF 中使用的 ICC 配置文件,例如default.cmyk
。如果未指定,则默认使用sRGB.icc
。可以重复以包含多个配置文件。请注意,配置文件必须在系统上可用。可以从 ConTeXt ICC Profiles 获取它们。 pdfaintent
- 与
pdfa
结合使用时,指定颜色的输出意图,例如ISO coated v2 300\letterpercent\space (ECI)
。如果未指定,则默认使用sRGB IEC61966-2.1
。 toc
- 包含目录(也可以使用
--toc/--table-of-contents
设置) urlstyle
- 无链接文本链接的字体样式,例如
normal
、bold
、slanted
、boldslanted
、type
、cap
、small
whitespace
- 段落之间的间距,例如
none
、small
(使用setupwhitespace
) includesource
- 将所有源文档作为文件附件包含在 PDF 文件中
wkhtmltopdf
变量
Pandoc 在使用 wkhtmltopdf
创建 PDF 时使用这些变量。--css
选项也会影响输出。
footer-html
,header-html
- 在页眉和页脚中添加信息
margin-left
,margin-right
,margin-top
,margin-bottom
- 设置页边距
papersize
- 设置 PDF 纸张大小
man 页面变量
adjusting
- 将文本调整到左(
l
)、右(r
)、居中(c
)或两边(b
)页边距 footer
- man 页面中的页脚
header
- man 页面中的页眉
section
- man 页面中的节号
Texinfo 变量
version
- 软件版本(用于标题和标题页)
filename
- 要生成的信息文件的名称(默认为基于 texi 文件名的名称)
Typst 变量
template
- 要使用的 Typst 模板。
margin
- 一个字典,包含 Typst 文档中定义的字段:
x
、y
、top
、bottom
、left
、right
。 papersize
- 纸张大小:
a4
,us-letter
等。 mainfont
- 用于主字体的系统字体名称。
fontsize
- 字体大小(例如,
12pt
)。 section-numbering
- 用于节编号的方案,例如
1.A.1
。 page-numbering
- 用于页码编号的方案,例如
1
或i
,或空字符串以省略页码编号。 columns
- 正文的列数。
ms 变量
fontfamily
-
A
(Avant Garde),B
(Bookman),C
(Helvetica),HN
(Helvetica Narrow),P
(Palatino), 或T
(Times New Roman)。此设置不影响源代码,源代码始终使用等宽 Courier 显示。这些内置字体在字符覆盖方面有限。可以使用 Peter Schaffter 提供的脚本install-font.sh
安装额外字体,其详细文档可在 他的网站 上找到。 indent
- 段落缩进(例如
2m
) lineheight
- 行高(例如
12p
) pointsize
- 磅值(例如
10p
)
自动设置的变量
Pandoc 会根据 选项 或文档内容自动设置这些变量;用户也可以修改它们。这些变量因输出格式而异,包括以下内容:
body
- 文档正文
date-meta
- 转换为 ISO 8601 YYYY-MM-DD 格式的
date
变量,包含在所有基于 HTML 的格式中(dzslides, epub, html, html4, html5, revealjs, s5, slideous, slidy)。date
可识别的格式有:mm/dd/yyyy
,mm/dd/yy
,yyyy-mm-dd
(ISO 8601),dd MM yyyy
(例如02 Apr 2018
或02 April 2018
),MM dd, yyyy
(例如Apr. 02, 2018
或April 02, 2018
),yyyy[mm[dd]]
(例如20180402
,201804
或2018
)。 header-includes
- 由
-H/--include-in-header
指定的内容(可以有多个值) include-before
- 由
-B/--include-before-body
指定的内容(可以有多个值) include-after
- 由
-A/--include-after-body
指定的内容(可以有多个值) meta-json
- 文档所有元数据的 JSON 表示。字段值会转换为所选的输出格式。
numbersections
- 如果指定了
-N/--number-sections
,则为非空值 sourcefile
,outputfile
-
源文件和目标文件名,如命令行所示。如果输入来自多个文件,
sourcefile
也可以是列表;如果输入来自标准输入,则为空。您可以在模板中使用以下片段来区分它们:$if(sourcefile)$ $for(sourcefile)$ $sourcefile$ $endfor$ $else$ (stdin) $endif$
同样,如果输出到终端,
outputfile
可以是-
。如果需要绝对路径,请使用例如
$curdir$/$sourcefile$
。 pdf-engine
- 如果使用
--pdf-engine
提供了 PDF 引擎名称,或者如果请求 PDF 输出,则为该格式的默认引擎。 curdir
- 运行 pandoc 的工作目录。
pandoc-version
- pandoc 版本。
toc
- 如果指定了
--toc/--table-of-contents
,则为非空值 toc-title
- 目录标题(仅适用于 EPUB、HTML、revealjs、opendocument、odt、docx、pptx、beamer、LaTeX)。请注意,在 docx 和 pptx 中,自定义的
toc-title
将从元数据中获取,但不能设置为变量。
扩展
可以通过启用或禁用各种扩展来调整某些阅读器和写入器的行为。
可以通过在格式名称后添加 +EXTENSION
来启用扩展,通过添加 -EXTENSION
来禁用扩展。例如,--from markdown_strict+footnotes
是启用了脚注的严格 Markdown,而 --from markdown-footnotes-pipe_tables
是不带脚注或管道表格的 pandoc Markdown。
Markdown 阅读器和写入器对扩展的使用最多。因此,仅它们使用的扩展在下文的 Pandoc 的 Markdown 部分介绍(commonmark
和 gfm
的 Markdown 变体)。接下来,将介绍也适用于其他格式的扩展。
请注意,添加到 ipynb
格式的 Markdown 扩展会影响 Jupyter 笔记本中的 Markdown 单元格(就像命令行选项如 --markdown-headings
一样)。
排版
smart
扩展:将直引号解释为花引号,---
解释为长破折号,--
解释为短破折号,...
解释为省略号。在某些缩写后插入不间断空格,例如“Mr.”
此扩展可以为以下格式启用/禁用:
- 输入格式
-
markdown
,commonmark
,latex
,mediawiki
,org
,rst
,twiki
,html
- 输出格式
-
markdown
,latex
,context
,rst
- 默认启用:
-
markdown
,latex
,context
(输入和输出均是)
注意:如果您正在编写 Markdown,则 smart
扩展具有相反的效果:本应是花引号的会变为直引号。
在 LaTeX 中,smart
表示使用标准的 TeX 连字来表示引号(``
和 ''
用于双引号,`
和 '
用于单引号)和破折号(--
用于短破折号,---
用于长破折号)。如果禁用 smart
,则在读取 LaTeX 时,pandoc 将按字面意义解析这些字符。在编写 LaTeX 时,启用 smart
告诉 pandoc 在可能的情况下使用连字;如果禁用 smart
,pandoc 将使用 Unicode 引号和破折号字符。
标题和章节
auto_identifiers
扩展:没有明确指定标识符的标题将根据标题文本自动分配唯一的标识符。
此扩展可以为以下格式启用/禁用:
- 输入格式
-
markdown
,latex
,rst
,mediawiki
,textile
- 输出格式
-
markdown
,muse
- 默认启用:
-
markdown
,muse
用于从标题文本派生标识符的默认算法是:
- 删除所有格式、链接等。
- 删除所有脚注。
- 删除所有非字母数字字符,下划线、连字符和句点除外。
- 将所有空格和换行符替换为连字符。
- 将所有字母字符转换为小写。
- 删除第一个字母之前的所有内容(标识符不能以数字或标点符号开头)。
- 如果在此之后什么都没有剩下,则使用标识符
section
。
因此,例如:
标题 | 标识符 |
---|---|
HTML 中的标题标识符 |
heading-identifiers-in-html |
Maître d'hôtel |
maître-dhôtel |
*Dogs*?--in *my* house? |
dogs--in-my-house |
[HTML], [S5], or [RTF]? |
html-s5-or-rtf |
3. Applications |
applications |
33 |
section |
在大多数情况下,这些规则应该允许从标题文本确定标识符。例外情况是当几个标题具有相同的文本时;在这种情况下,第一个将获得如上所述的标识符;第二个将获得相同的标识符,并附加 -1
;第三个附加 -2
;依此类推。
(然而,如果启用了 gfm_auto_identifiers
,则使用不同的算法;参见下文。)
这些标识符用于为 --toc|--table-of-contents
选项生成的目录提供链接目标。它们还方便了从文档的一个部分链接到另一个部分。例如,指向此部分的链接可能如下所示:
See the section on
[heading identifiers](#heading-identifiers-in-html-latex-and-context).
然而,请注意,这种提供章节链接的方法仅适用于 HTML、LaTeX 和 ConTeXt 格式。
如果指定了 --section-divs
选项,那么每个节将被包裹在一个 section
标签中(如果指定了 html4
,则为 div
标签),并且标识符将附加到封闭的 <section>
(或 <div>
)标签,而不是标题本身。这允许使用 JavaScript 操作整个节,或在 CSS 中以不同方式处理。
ascii_identifiers
扩展:使 auto_identifiers
生成的标识符为纯 ASCII。带重音的拉丁字母会去除重音,非拉丁字母会被省略。
gfm_auto_identifiers
扩展:将 auto_identifiers
使用的算法更改为符合 GitHub 的方法。空格转换为连字符(-
),大写字符转换为小写字符,除了 -
和 _
之外的标点符号字符被移除。表情符号被替换为其名称。
数学输入
扩展 tex_math_dollars
、tex_math_gfm
、tex_math_single_backslash
和 tex_math_double_backslash
在 Pandoc 的 Markdown 部分有详细描述。
但是,它们也可以与 HTML 输入一起使用。这对于读取使用 MathJax 格式化的网页非常方便,例如。
原始 HTML/TeX
以下扩展在 Pandoc 的 Markdown 各自部分中进行了更详细的描述:
raw_html
允许将 pandoc 的 AST 中无法表示的 HTML 元素解析为原始 HTML。默认情况下,此功能对 HTML 输入禁用。raw_tex
允许将原始 LaTeX、TeX 和 ConTeXt 包含在文档中。此扩展可以为以下格式启用/禁用(除了markdown
):- 输入格式
-
latex
,textile
,html
(仅环境,\ref
和\eqref
),ipynb
- 输出格式
-
textile
,commonmark
注意:应用于
ipynb
时,raw_html
和raw_tex
不仅影响 Markdown 单元格中的原始 TeX,还影响输出单元格中 MIME 类型为text/html
的数据。由于ipynb
阅读器在给定多个选项时会尝试保留最丰富的输出,因此在转换为docx
等不允许原始html
或tex
的格式时,禁用raw_html
和raw_tex
将获得最佳效果。native_divs
使 HTMLdiv
元素被解析为原生 pandoc Div 块。如果您希望它们被解析为原始 HTML,请使用-f html-native_divs+raw_html
。native_spans
使 HTMLspan
元素被解析为原生 pandoc Span 内联元素。如果您希望它们被解析为原始 HTML,请使用-f html-native_spans+raw_html
。如果您想在将 HTML 转换为 Markdown 时删除所有div
和span
,可以使用pandoc -f html-native_divs-native_spans -t markdown
。
Haskell 文学编程支持
literate_haskell
扩展:将文档视为 Haskell 文学编程源文件。
此扩展可以为以下格式启用/禁用:
- 输入格式
-
markdown
,rst
,latex
- 输出格式
-
markdown
,rst
,latex
,html
如果您在上述格式之一后附加 +lhs
(或 +literate_haskell
),pandoc 会将文档视为 Haskell 文学编程源文件。这意味着:
在 Markdown 输入中,“鸟足迹”部分将被解析为 Haskell 代码而不是块引用。
\begin{code}
和\end{code}
之间的文本也将被视为 Haskell 代码。对于 ATX 风格的标题,将使用字符“=”代替“#”。在 Markdown 输出中,带有
haskell
和literate
类的代码块将使用鸟足迹渲染,块引用将缩进一个空格,因此它们不会被视为 Haskell 代码。此外,标题将以 setext 风格(带下划线)而非 ATX 风格(带“#”字符)渲染。(这是因为 ghc 将第 1 列中的“#”字符视为行号的引入。)在 restructured text 输入中,“鸟迹”部分将被解析为 Haskell 代码。
在 restructured text 输出中,带有
haskell
类的代码块将使用鸟迹渲染。在 LaTeX 输入中,
code
环境中的文本将被解析为 Haskell 代码。在 LaTeX 输出中,带有
haskell
类的代码块将在code
环境内渲染。在 HTML 输出中,带有
haskell
类的代码块将使用literatehaskell
类和鸟迹渲染。
示例
pandoc -f markdown+lhs -t html
读取采用 Markdown 约定格式化的 Literate Haskell 源代码,并写入普通的 HTML(不带鸟迹)。
pandoc -f markdown+lhs -t html+lhs
写入带有 Haskell 代码(以鸟迹表示)的 HTML,以便它可以作为 Literate Haskell 源代码进行复制和粘贴。
请注意,GHC 要求鸟迹位于第一列,因此,缩进的 Literate 代码块(例如,在条目化环境内部)将不会被 Haskell 编译器识别。
其他扩展
empty_paragraphs
扩展:允许空段落。默认情况下,空段落会被省略。
此扩展可以为以下格式启用/禁用:
- 输入格式
-
docx
,html
- 输出格式
-
docx
,odt
,opendocument
,html
,latex
native_numbering
扩展:启用图表和表格的本地编号。枚举从 1 开始。
此扩展可以为以下格式启用/禁用:
- 输出格式
-
odt
,opendocument
,docx
xrefs_name
扩展:文档内部指向标题、图表和表格的链接将替换为交叉引用,这些交叉引用将使用引用项目的名称或标题。生成的文档刷新后,原始链接文本将被替换。此扩展可以与 xrefs_number
结合使用,在这种情况下,数字将出现在名称之前。
交叉引用中的文本仅在文档刷新后才能与引用的项目保持一致。
此扩展可以为以下格式启用/禁用:
- 输出格式
-
odt
,opendocument
xrefs_number
扩展:文档内部指向标题、图表和表格的链接将替换为交叉引用,这些交叉引用将使用引用项目的编号。原始链接文本将被丢弃。此扩展可以与 xrefs_name
结合使用,在这种情况下,名称或标题编号将出现在数字之后。
为了使 xrefs_number
有用,生成的文档中必须启用标题编号,并且还必须使用例如 native_numbering
扩展来启用表格和图表的标题。
交叉引用中的数字仅在最终文档中可见,并且只有在刷新后才可见。
此扩展可以为以下格式启用/禁用:
- 输出格式
-
odt
,opendocument
styles
扩展:从 docx 转换时,为所有 docx 样式添加 custom-styles
属性,无论 pandoc 是否理解这些样式的含义。因为属性不能直接添加到 pandoc AST 中的段落或文本中,段落样式将导致创建 Div 元素,字符样式将导致创建 Span 元素来保存属性。(表格样式将直接添加到 Table 元素中。)此扩展可与 docx 自定义样式一起使用。
- 输入格式
-
docx
amuse
扩展:在 muse
输入格式中,这将启用 Text::Amuse 对 Emacs Muse 标记的扩展。
raw_markdown
扩展:在 ipynb
输入格式中,这会导致 Markdown 单元格作为原始 Markdown 块(允许无损往返转换)而非被解析地包含进来。仅当您以 ipynb
或基于 Markdown 的输出格式为目标时才使用此功能。
citations
(typst)
扩展:当 citations
扩展在 typst
中启用时(默认情况下启用),typst
引用将被解析为原生的 pandoc 引用,原生的 pandoc 引用将渲染为 typst
引用。
citations
(org)
扩展:当 citations
扩展在 org
中启用时,org-cite 和 org-ref 样式的引用将被解析为原生的 pandoc 引用,并且 org-cite 引用将用于渲染原生的 pandoc 引用。
citations
(docx)
扩展:当 citations
在 docx
中启用时,Zotero、Mendeley 或 EndNote 插件插入的引用将被解析为原生的 pandoc 引用。(否则,由文献软件生成的格式化引用将作为普通文本解析。)
fancy_lists
(org)
扩展:Pandoc Markdown 的花式列表的某些方面在 org
输入中也受支持,模仿 Emacs 中的选项 org-list-allow-alphabetical
。与 Org Mode 中一样,启用此扩展允许有序列表除了阿拉伯数字外,还可以解析小写和大写字母标记。请注意,对于 Org,这不包括罗马数字或 Pandoc Markdown 中由扩展启用的 #
占位符。
element_citations
扩展:在 jats
输出格式中,这会导致引用项被替换为 <element-citation>
元素。这些元素不受 CSL 样式的影响,但项目的全部信息都包含在标签中。
ntb
扩展:在 context
输出格式中,这将启用 自然表格 (TABLE) 的使用,而非默认的 极限表格 (xtables)。自然表格允许更细粒度的全局定制,但与极限表格相比会带来性能损失。
tagging
扩展:在 context
输出中启用此扩展将生成适合制作带标签 PDF 的标记。这包括段落的附加标记和强调文本的替代标记。如果启用此扩展,emphasis-command
模板变量将被设置。
Pandoc 的 Markdown
Pandoc 理解 John Gruber 的 Markdown 语法的扩展和略微修订版本。本文档解释了该语法,并指出了与原始 Markdown 的差异。除非另有说明,否则这些差异可以通过使用 markdown_strict
格式而不是 markdown
来抑制。扩展可以启用或禁用,以更精细地指定行为。它们在下文中描述。另请参见上面的扩展,了解也适用于其他格式的扩展。
设计理念
Markdown 的设计宗旨是易于书写,更重要的是易于阅读
一个 Markdown 格式的文档应该能够直接以纯文本形式发布,而不需要看起来像是被标签或格式指令标记过。
—— John Gruber
这一原则指导了 pandoc 在为表格、脚注和其他扩展寻找语法方面的决策。
然而,在某一方面,pandoc 的目标与 Markdown 的原始目标不同。Markdown 最初设计时考虑的是 HTML 生成,而 pandoc 旨在支持多种输出格式。因此,虽然 pandoc 允许嵌入原始 HTML,但它不鼓励这样做,并提供了其他非 HTML 的方式来表示重要的文档元素,如定义列表、表格、数学公式和脚注。
段落
一个段落是由一行或多行文本以及其后的一行或多行空行组成的。换行符被视为空格,因此您可以根据需要重新排布段落。如果您需要强制换行,请在行末添加两个或更多空格。
escaped_line_breaks
扩展:反斜杠后跟换行符也是一个强制换行符。注意:在多行和网格表格单元格中,这是创建强制换行的唯一方法,因为单元格中的尾随空格会被忽略。
标题
标题有两种:Setext 样式和 ATX 样式。
Setext 样式标题
Setext 样式标题是一行文本,通过一行 =
符号(用于一级标题)或 -
符号(用于二级标题)“加下划线”
A level-one heading
===================
A level-two heading
-------------------
标题文本可以包含行内格式,例如强调(参见下面的行内格式)。
ATX 样式标题
ATX 样式标题由一到六个 #
符号和一行文本组成,可选地后跟任意数量的 #
符号。行开头的 #
符号数量即为标题级别
## A level-two heading
### A level-three heading ###
与 Setext 样式标题一样,标题文本可以包含格式。
# A level-one heading with a [link](/url) and *emphasis*
blank_before_header
扩展:原始 Markdown 语法不要求标题前有空行。Pandoc 则要求有空行(当然,文档开头除外)。这样要求的原因是,#
符号很容易因意外(可能是换行)而出现在行首。例如,考虑以下情况
I like several of their flavors of ice cream:
#22, for example, and #5.
space_in_atx_header
扩展:许多 Markdown 实现不要求 ATX 标题开头的 #
符号与标题文本之间有空格,因此 #5 bolt
和 #hashtag
都被算作标题。启用此扩展后,pandoc 要求有空格。
标题标识符
另请参见上面的auto_identifiers
扩展。
header_attributes
扩展:标题可以在包含标题文本的行末使用此语法来分配属性
{#identifier .class .class key=value key=value}
因此,例如,以下标题都将被分配标识符 foo
# My heading {#foo}
## My heading ## {#foo}
My other heading {#foo}
---------------
(此语法与 PHP Markdown Extra 兼容。)
请注意,虽然此语法允许分配类和键/值属性,但通常编写器不会使用所有这些信息。标识符、类和键/值属性用于 HTML 和基于 HTML 的格式,例如 EPUB 和 slidy。标识符用于 LaTeX、ConTeXt、Textile、Jira 标记和 AsciiDoc 编写器中的标签和链接锚点。
带有 unnumbered
类的标题将不会被编号,即使指定了 --number-sections
。在属性上下文中,单个连字符(-
)等同于 .unnumbered
,在非英语文档中更受欢迎。因此,
# My heading {-}
与...相同
# My heading {.unnumbered}
如果除了 unnumbered
之外还存在 unlisted
类,该标题将不会包含在目录中。(目前此功能仅针对某些格式实现:基于 LaTeX 和 HTML 的格式、PowerPoint 和 RTF。)
implicit_header_references
扩展:Pandoc 的行为就好像为每个标题都定义了引用链接一样。因此,要链接到一个标题
# Heading identifiers in HTML
您可以简单地写
[Heading identifiers in HTML]
或者
[Heading identifiers in HTML][]
或者
[the section on heading identifiers][heading identifiers in
HTML]
而不是显式地给出标识符
[Heading identifiers in HTML](#heading-identifiers-in-html)
如果有多个文本相同的标题,相应的引用将仅链接到第一个,您需要使用显式链接来链接到其他标题,如上所述。
与常规引用链接一样,这些引用不区分大小写。
显式链接引用定义始终优先于隐式标题引用。因此,在以下示例中,链接将指向 bar
,而不是 #foo
# Foo
[foo]: bar
See [foo]
块引用
Markdown 使用电子邮件约定来引用文本块。块引用是一个或多个段落或其他块级元素(如列表或标题),每行前面都有一个 >
字符和可选的空格。(>
不必从左边距开始,但其缩进不能超过三个空格。)
> This is a block quote. This
> paragraph has two lines.
>
> 1. This is a list inside a block quote.
> 2. Second item.
一种“懒惰”形式,即仅在每个块的第一行要求 >
字符,也受允许
> This is a block quote. This
paragraph has two lines.
> 1. This is a list inside a block quote.
2. Second item.
块引用中可以包含的块元素包括其他块引用。也就是说,块引用可以嵌套
> This is a block quote.
>
> > A block quote within a block quote.
如果 >
字符后面跟着一个可选的空格,该空格将被视为块引用标记的一部分,而不是内容缩进的一部分。因此,要在块引用中放置缩进的代码块,您需要在 >
之后添加五个空格
> code
blank_before_blockquote
扩展:原始 Markdown 语法不要求块引用前有空行。Pandoc 则要求有空行(当然,文档开头除外)。这样要求的原因是,>
符号很容易因意外(可能是换行)而出现在行首。因此,除非使用 markdown_strict
格式,否则以下内容在 pandoc 中不会生成嵌套块引用
> This is a block quote.
>> Not nested, since `blank_before_blockquote` is enabled by default
逐字(代码)块
缩进代码块
缩进四个空格(或一个制表符)的文本块被视为逐字文本:也就是说,特殊字符不会触发特殊格式,所有空格和换行符都将保留。例如,
if (a > 3) {
moveShip(5 * gravity, DOWN);
}
初始的(四个空格或一个制表符)缩进不被视为逐字文本的一部分,并在输出中被移除。
注意:逐字文本中的空行不必以四个空格开头。
围栏式代码块
fenced_code_blocks
扩展:除了标准缩进代码块外,pandoc 还支持围栏式代码块。这些代码块以一排三个或更多波浪线(~
)开头,并以一排波浪线结尾,且结尾的波浪线长度必须至少与开头的波浪线一样长。这些行之间的所有内容都将被视为代码。无需缩进
~~~~~~~
if (a > 3) {
moveShip(5 * gravity, DOWN);
}
~~~~~~~
与普通代码块一样,围栏式代码块必须与周围文本用空行分隔。
如果代码本身包含一排波浪线或反引号,只需在开头和结尾使用更长一排的波浪线或反引号
~~~~~~~~~~~~~~~~
~~~~~~~~~~
code including tildes
~~~~~~~~~~
~~~~~~~~~~~~~~~~
backtick_code_blocks
扩展:与 fenced_code_blocks
相同,但使用反引号(`
)而不是波浪线(~
)。
fenced_code_attributes
扩展:您可以选择使用此语法将属性附加到围栏式或反引号代码块
~~~~ {#mycode .haskell .numberLines startFrom="100"}
qsort [] = []
qsort (x:xs) = qsort (filter (< x) xs) ++ [x] ++
qsort (filter (>= x) xs)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
这里 mycode
是一个标识符,haskell
和 numberLines
是类,startFrom
是一个值为 100
的属性。某些输出格式可以使用此信息进行语法高亮显示。目前,唯一使用此信息的输出格式是 HTML、LaTeX、Docx、Ms 和 PowerPoint。如果您的输出格式和语言支持高亮显示,则上述代码块将显示为高亮,并带有行号。(要查看支持哪些语言,请键入 pandoc --list-highlight-languages
。)否则,上述代码块将显示如下
<pre id="mycode" class="haskell numberLines" startFrom="100">
<code>
...
</code>
</pre>
numberLines
(或 number-lines
)类将使代码块的行带上编号,从 1
或 startFrom
属性的值开始。lineAnchors
(或 line-anchors
)类将使行在 HTML 输出中成为可点击的锚点。
还可以使用快捷形式来指定代码块的语言
```haskell
qsort [] = []
```
这等同于
``` {.haskell}
qsort [] = []
```
这种快捷形式可以与属性结合使用
```haskell {.numberLines}
qsort [] = []
```
这等同于
``` {.haskell .numberLines}
qsort [] = []
```
如果 fenced_code_attributes
扩展被禁用,但输入包含代码块的类属性,则第一个类属性将在起始围栏之后作为裸词打印。
若要阻止所有高亮显示,请使用 --no-highlight
标志。若要设置高亮样式,请使用 --highlight-style
。有关高亮显示的更多信息,请参见下面的语法高亮。
行块
line_blocks
扩展:行块是一系列以竖线(|
)和随后的一个空格开头的行。行的划分将在输出中保留,任何前导空格也将保留;否则,这些行将按 Markdown 格式化。这对于诗歌和地址很有用
| The limerick packs laughs anatomical
| In space that is quite economical.
| But the good ones I've seen
| So seldom are clean
| And the clean ones so seldom are comical
| 200 Main St.
| Berkeley, CA 94718
如果需要,行可以强制换行,但续行必须以一个空格开头。
| The Right Honorable Most Venerable and Righteous Samuel L.
Constable, Jr.
| 200 Main St.
| Berkeley, CA 94718
内容中允许使用行内格式(例如强调),但不能跨行。不识别块级格式(例如块引用或列表)。
此语法借鉴自 reStructuredText。
列表
无序列表
无序列表是项目符号列表项的列表。项目符号列表项以项目符号(*
、+
或 -
)开头。这是一个简单示例
* one
* two
* three
这将生成一个“紧凑”列表。如果您想要一个“松散”列表,其中每个项目都格式化为一个段落,请在项目之间留出空格
* one
* two
* three
项目符号不必与左边距齐平;它们可以缩进一、二或三个空格。项目符号后面必须有空格。
如果后续行与第一行(在项目符号之后)齐平,列表项看起来最佳
* here is my first
list item.
* and my second.
但 Markdown 也允许“懒惰”格式
* here is my first
list item.
* and my second.
列表项中的块内容
一个列表项可以包含多个段落和其他块级内容。但是,后续段落必须以空行开头,并缩进以与列表标记后的第一个非空白内容对齐。
* First paragraph.
Continued.
* Second paragraph. With a code block, which must be indented
eight spaces:
{ code }
例外:如果列表标记后跟一个缩进代码块(该代码块必须在列表标记后空出 5 个空格开始),则后续段落必须在列表标记的最后一个字符之后两列开始
* code
continuation paragraph
列表项可以包含其他列表。在这种情况下,前面的空行是可选的。嵌套列表必须缩进,以与包含列表项的列表标记后的第一个非空白字符对齐。
* fruits
+ apples
- macintosh
- red delicious
+ pears
+ peaches
* vegetables
+ broccoli
+ chard
如上所述,Markdown 允许您“懒惰”地编写列表项,而不是缩进续行。但是,如果列表项中有多个段落或其他块,则每个段落或块的第一行必须缩进。
+ A lazy, lazy, list
item.
+ Another one; this looks
bad but is legal.
Second paragraph of second
list item.
有序列表
有序列表的工作方式与无序列表相同,只是项目以编号符而不是项目符号开头。
在原始 Markdown 中,编号符是十进制数字,后跟句点和空格。数字本身被忽略,因此此列表之间没有区别
1. one
2. two
3. three
和这个列表
5. one
7. two
1. three
fancy_lists
扩展:与原始 Markdown 不同,pandoc 允许有序列表项除了阿拉伯数字外,还可以用大写和小写字母以及罗马数字标记。列表标记可以括在括号中,或后跟单个右括号或句点。它们必须与后面的文本至少间隔一个空格;如果列表标记是带句点的大写字母,则必须至少间隔两个空格。1
fancy_lists
扩展还允许使用“#
”作为有序列表标记来代替数字
#. one
#. two
注意:‘#
’ 有序列表标记不适用于 commonmark
。
startnum
扩展:Pandoc 还关注所使用的列表标记类型和起始编号,并且在输出格式中尽可能保留这两者。因此,以下内容生成一个列表,其中数字后跟单个括号,从 9 开始,以及一个带有小写罗马数字的子列表
9) Ninth
10) Tenth
11) Eleventh
i. subone
ii. subtwo
iii. subthree
每当使用不同类型的列表标记时,Pandoc 都会开始一个新的列表。因此,以下内容将创建三个列表
(2) Two
(5) Three
1. Four
* Five
如果需要默认列表标记,请使用 #.
#. one
#. two
#. three
task_lists
扩展:Pandoc 支持任务列表,使用 GitHub-Flavored Markdown 的语法。
- [ ] an unchecked task list item
- [x] checked item
定义列表
definition_lists
扩展:Pandoc 支持定义列表,使用 PHP Markdown Extra 的语法,并带有一些扩展。2
Term 1
: Definition 1
Term 2 with *inline markup*
: Definition 2
{ some code, part of Definition 2 }
Third paragraph of definition 2.
每个术语必须在一行内,后面可以有一个空行(可选),并且必须后跟一个或多个定义。定义以冒号或波浪线开头,可以缩进一到两个空格。
一个术语可以有多个定义,并且每个定义可以包含一个或多个块元素(段落、代码块、列表等),每个缩进四个空格或一个制表符。定义的主体(不包括第一行)应该缩进四个空格。然而,与其他 Markdown 列表一样,您可以“懒惰地”省略缩进,但段落或其他块元素的开头除外
Term 1
: Definition
with lazy continuation.
Second paragraph of the definition.
如果您在定义前留有空格(如上例所示),定义文本将被视为一个段落。在某些输出格式中,这意味着术语/定义对之间会有更大的间距。要获得更紧凑的定义列表,请省略定义前的空格
Term 1
~ Definition 1
Term 2
~ Definition 2a
~ Definition 2b
请注意,定义列表中的项目之间需要有空格。(一个放宽此要求但禁止“懒惰”强制换行的变体,可以通过compact_definition_lists
扩展激活。)
编号示例列表
example_lists
扩展:特殊的列表标记 @
可用于按顺序编号的示例。文档中第一个带有 @
标记的列表项将被编号为“1”,下一个为“2”,依此类推。编号的示例不必出现在单个列表中;每个使用 @
的新列表将从上一个列表停止的地方继续。因此,例如
(@) My first example will be numbered (1).
(@) My second example will be numbered (2).
Explanation of examples.
(@) My third example will be numbered (3).
编号的示例可以在文档的其他地方被标记和引用
(@good) This is a good example.
As (@good) illustrates, ...
标签可以是任何由字母数字字符、下划线或连字符组成的字符串。
示例列表中的续段落必须始终缩进四个空格,无论列表标记的长度如何。也就是说,示例列表始终表现为已设置 four_space_rule
扩展。这是因为示例标签通常较长,将内容缩进到标签后的第一个非空格字符会很尴尬。
您可以通过重复使用其标签来重复之前的编号示例
(@foo) Sample sentence.
Intervening text...
This theory can explain the case we saw earlier (repeated):
(@foo) Sample sentence.
然而,这只有在重复项单独位于一个列表中时才能可靠地工作,因为每个编号示例列表都将从其起始编号连续编号。
结束列表
如果您想在列表后放置一个缩进的代码块怎么办?
- item one
- item two
{ my code block }
麻烦了!在这里,pandoc(像其他 Markdown 实现一样)会将 { my code block }
视为第二项的第二个段落,而不是一个代码块。
要在第二项后“截断”列表,您可以插入一些非缩进内容,例如 HTML 注释,这在任何格式中都不会产生可见输出
- item one
- item two
<!-- end of list -->
{ my code block }
如果您想要两个连续的列表而不是一个大列表,您可以使用相同的技巧
1. one
2. two
3. three
<!-- -->
1. uno
2. dos
3. tres
水平分隔线
包含三个或更多 *
、-
或 _
字符(可选地由空格分隔)的行会生成一条水平分隔线
* * * *
---------------
我们强烈建议水平分隔线与周围文本用空行分隔。如果水平分隔线后面没有空行,pandoc 可能会尝试将后面的行解释为 YAML 元数据块或表格。
表格
可以使用四种表格。前三种表格预设使用固定宽度字体,例如 Courier。第四种表格可与比例字体一起使用,因为它不要求对齐列。
table_captions
扩展:所有四种表格都可以选择提供标题(如下例所示)。标题是一个以字符串 Table:
(或 table:
或仅 :
)开头的段落,该字符串将被剥离。它可以出现在表格之前或之后。
simple_tables
扩展:简单表格如下所示
Right Left Center Default
------- ------ ---------- -------
12 12 12 12
123 123 123 123
1 1 1 1
Table: Demonstration of simple table syntax.
表头和表格行必须各占一行。列对齐方式由表头文本相对于其下方虚线的位置决定:3
- 如果虚线右侧与表头文本对齐,但左侧超出表头文本,则该列右对齐。
- 如果虚线左侧与表头文本对齐,但右侧超出表头文本,则该列左对齐。
- 如果虚线在两侧都超出表头文本,则该列居中对齐。
- 如果虚线在两侧都与表头文本齐平,则使用默认对齐方式(在大多数情况下,这将是左对齐)。
表格必须以空行结束,或者以一行虚线后跟空行结束。
列标题行可以省略,但前提是使用虚线来结束表格。例如
------- ------ ---------- -------
12 12 12 12
123 123 123 123
1 1 1 1
------- ------ ---------- -------
当省略表头行时,列对齐方式将根据表格主体的第一行确定。因此,在上面的表格中,列将分别右对齐、左对齐、居中对齐和右对齐。
multiline_tables
扩展:多行表格允许表头和表格行跨越多行文本(但不支持跨多列或多行的单元格)。这是一个示例
-------------------------------------------------------------
Centered Default Right Left
Header Aligned Aligned Aligned
----------- ------- --------------- -------------------------
First row 12.0 Example of a row that
spans multiple lines.
Second row 5.0 Here's another one. Note
the blank line between
rows.
-------------------------------------------------------------
Table: Here's the caption. It, too, may span
multiple lines.
它们的工作方式与简单表格类似,但有以下不同之处
- 它们必须在表头文本之前以一行虚线开头(除非省略表头行)。
- 它们必须以一行虚线,然后一个空行结束。
- 行必须用空行分隔。
在多行表格中,表格解析器会关注列的宽度,并且写入器会尝试在输出中重现这些相对宽度。因此,如果您发现输出中的某一列太窄,请尝试在 Markdown 源中加宽它。
多行表格和简单表格都可以省略表头
----------- ------- --------------- -------------------------
First row 12.0 Example of a row that
spans multiple lines.
Second row 5.0 Here's another one. Note
the blank line between
rows.
----------- ------- --------------- -------------------------
: Here's a multiline table without a header.
多行表格可能只有一行,但该行后应跟一个空行(然后是结束表格的虚线行),否则表格可能被解释为简单表格。
grid_tables
扩展:网格表格如下所示
: Sample grid table.
+---------------+---------------+--------------------+
| Fruit | Price | Advantages |
+===============+===============+====================+
| Bananas | $1.34 | - built-in wrapper |
| | | - bright color |
+---------------+---------------+--------------------+
| Oranges | $2.10 | - cures scurvy |
| | | - tasty |
+---------------+---------------+--------------------+
=
行将表头与表格主体分隔开,对于无表头的表格可以省略。网格表格的单元格可以包含任意块元素(多个段落、代码块、列表等)。
单元格可以跨多列或多行
+---------------------+----------+
| Property | Earth |
+=============+=======+==========+
| | min | -89.2 °C |
| Temperature +-------+----------+
| 1961-1990 | mean | 14 °C |
| +-------+----------+
| | max | 56.7 °C |
+-------------+-------+----------+
表格的表头可以包含多行
+---------------------+-----------------------+
| Location | Temperature 1961-1990 |
| | in degree Celsius |
| +-------+-------+-------+
| | min | mean | max |
+=====================+=======+=======+=======+
| Antarctica | -89.2 | N/A | 19.8 |
+---------------------+-------+-------+-------+
| Earth | -89.2 | 14 | 56.7 |
+---------------------+-------+-------+-------+
对齐方式可以像管道表格一样指定,通过在表头后的分隔线边界放置冒号
+---------------+---------------+--------------------+
| Right | Left | Centered |
+==============:+:==============+:==================:+
| Bananas | $1.34 | built-in wrapper |
+---------------+---------------+--------------------+
对于无表头的表格,冒号则位于顶行
+--------------:+:--------------+:------------------:+
| Right | Left | Centered |
+---------------+---------------+--------------------+
可以通过使用 =
而不是 -
的分隔线来定义表尾
+---------------+---------------+
| Fruit | Price |
+===============+===============+
| Bananas | $1.34 |
+---------------+---------------+
| Oranges | $2.10 |
+===============+===============+
| Sum | $3.44 |
+===============+===============+
表尾必须始终放置在表格的最底部。
网格表格可以使用 Emacs 的 table-mode (M-x table-insert
) 轻松创建。
pipe_tables
扩展:管道表格如下所示
| Right | Left | Default | Center |
|------:|:-----|---------|:------:|
| 12 | 12 | 12 | 12 |
| 123 | 123 | 123 | 123 |
| 1 | 1 | 1 | 1 |
: Demonstration of pipe table syntax.
语法与 PHP Markdown Extra 表格相同。起始和结束的管道字符是可选的,但所有列之间都必须有管道。冒号指示如所示的列对齐方式。表头不能省略。要模拟无表头的表格,请包含一个带有空白单元格的表头。
由于管道指示列边界,列不必像上述示例那样垂直对齐。因此,这是一个完全合法(尽管丑陋)的管道表格
fruit| price
-----|-----:
apple|2.05
pear|1.37
orange|3.09
管道表格的单元格不能包含段落和列表等块元素,也不能跨多行。如果 Markdown 源的任何行长于列宽(参见 --columns
),则表格将占据整个文本宽度,并且单元格内容将自动换行,相对单元格宽度由分隔表头和表格主体的行中虚线的数量决定。(例如,---|-
将使第一列占整个文本宽度的 3/4,第二列占 1/4。)另一方面,如果没有行宽于列宽,则单元格内容将不会换行,并且单元格将根据其内容调整大小。
注意:pandoc 也识别以下形式的管道表格,这种形式可以通过 Emacs 的 orgtbl-mode 生成
| One | Two |
|-----+-------|
| my | table |
| is | nice |
区别在于使用 +
代替 |
。其他 orgtbl 功能不受支持。特别地,要获得非默认的列对齐方式,您需要如上所述添加冒号。
元数据块
pandoc_title_block
扩展:如果文件以标题块开头
% title
% author(s) (separated by semicolons)
% date
它将被解析为书目信息,而不是常规文本。(例如,它将用于独立 LaTeX 或 HTML 输出的标题。)该块可以只包含标题、日期和作者,或者这三个元素。如果您想包含作者但没有标题,或者有标题和日期但没有作者,您需要一个空行
%
% Author
% My title
%
% June 15, 2006
标题可以占据多行,但续行必须以开头空格开始,因此
% My title
on multiple lines
如果文档有多个作者,作者可以放在单独的行上,带有前导空格,或者用分号分隔,或者两者兼有。因此,以下所有内容都是等效的
% Author One
Author Two
% Author One; Author Two
% Author One;
Author Two
日期必须在一行内。
所有三个元数据字段都可以包含标准行内格式(斜体、链接、脚注等)。
标题块将始终被解析,但它们仅在选择 --standalone
(-s
) 选项时才会影响输出。在 HTML 输出中,标题将出现两次:一次在文档头部——这是浏览器窗口顶部显示的标题——另一次在文档主体开头。文档头部标题可以附加一个可选前缀(--title-prefix
或 -T
选项)。主体中的标题显示为带有“title”类的 H1 元素,因此可以使用 CSS 抑制或重新格式化。如果使用 -T
指定了标题前缀,并且文档中没有标题块,则标题前缀将单独用作 HTML 标题。
man 页面编写器从标题行中提取标题、man 页面节号以及其他页眉和页脚信息。标题被认为是标题行的第一个单词,它可能可选地以括号中的(一位数字)节号结尾。(标题和括号之间不应有空格。)此后的任何内容都被视为额外的页脚和页眉文本。应使用单个管道字符(|
)来分隔页脚文本和页眉文本。因此,
% PANDOC(1)
将生成一个标题为 PANDOC
且节号为 1 的 man 页面。
% PANDOC(1) Pandoc User Manuals
页脚也将包含“Pandoc User Manuals”。
% PANDOC(1) Pandoc User Manuals | Version 4.0
页眉也将包含“Version 4.0”。
yaml_metadata_block
扩展:一个 YAML 元数据块是一个有效的 YAML 对象,顶部由一行三个连字符(---
)分隔,底部由一行三个连字符(---
)或三个点(...
)分隔。初始行 ---
后不能有空行。YAML 元数据块可以出现在文档的任何位置,但如果它不在开头,则必须在其前面有一个空行。
请注意,由于 pandoc 在提供多个输入文件时连接文件的方式,您也可以将元数据保存在单独的 YAML 文件中,并将其作为参数与您的 Markdown 文件一起传递给 pandoc
pandoc chap1.md chap2.md chap3.md metadata.yaml -s -o book.html
只需确保 YAML 文件以 ---
开头并以 ---
或 ...
结尾。或者,您可以使用 --metadata-file
选项。然而,使用这种方法,您无法从主 Markdown 输入文档中引用内容(例如脚注)。
元数据将从 YAML 对象的字段中获取,并添加到任何现有文档元数据中。元数据可以包含列表和对象(任意嵌套),但所有字符串标量都将被解释为 Markdown。名称以下划线结尾的字段将被 pandoc 忽略。(它们可能由外部处理器赋予角色。)字段名不能被解释为 YAML 数字或布尔值(因此,例如,yes
、True
和 15
不能用作字段名)。
一个文档可以包含多个元数据块。如果两个元数据块尝试设置相同的字段,则将采用第二个块中的值。
每个元数据块在内部都被视为独立的 YAML 文档。这意味着,例如,在一个块中定义的任何 YAML 锚点都不能在另一个块中引用。
当 pandoc 与 -t markdown
一起用于创建 Markdown 文档时,只有在使用 -s/--standalone
选项时才会生成 YAML 元数据块。所有元数据将以一个单独的块出现在文档的开头。
请注意,必须遵循 YAML 转义规则。因此,例如,如果标题包含冒号,则必须加引号;如果它包含反斜杠转义,则必须确保它不会被视为 YAML 转义序列。管道字符(|
)可以用于开始一个缩进块,该块将被字面解释,无需转义。当字段包含空行或块级格式时,此形式是必需的
---
title: 'This is the title: it contains a colon'
author:
- Author One
- Author Two
keywords: [nothing, nothingness]
abstract: |
This is the abstract.
It consists of two paragraphs.
...
|
后面的字面块必须相对于包含 |
的行进行缩进。否则,YAML 将无效,pandoc 也不会将其解释为元数据。有关 YAML 复杂规则的概述,请参阅 维基百科上的 YAML 语法条目。
模板变量将从元数据中自动设置。因此,例如,在编写 HTML 时,变量 abstract
将设置为 abstract
字段中 Markdown 的 HTML 等效内容
<p>This is the abstract.</p>
<p>It consists of two paragraphs.</p>
变量可以包含任意 YAML 结构,但模板必须与此结构匹配。默认模板中的 author
变量需要一个简单的列表或字符串,但可以更改以支持更复杂的结构。例如,以下组合将在给定作者的情况下为其添加隶属关系
---
title: The document title
author:
- name: Author One
affiliation: University of Somewhere
- name: Author Two
affiliation: University of Nowhere
...
要使用上述示例中的结构化作者,您需要一个自定义模板
$for(author)$
$if(author.name)$
$author.name$$if(author.affiliation)$ ($author.affiliation$)$endif$
$else$
$author$
$endif$
$endfor$
可以使用 header-includes
指定要包含在文档头部中的原始内容;但是,重要的是使用 raw_attribute
扩展将此内容标记为特定输出格式的原始代码,否则它将被解释为 Markdown。例如
header-includes:
- |
```{=latex}
\let\oldsection\section
\renewcommand{\section}[1]{\clearpage\oldsection{#1}}
```
注意:yaml_metadata_block
扩展适用于 commonmark
和 markdown
(并且在 gfm
和 commonmark_x
中默认启用)。然而,在这些格式中,适用以下限制
YAML 元数据块必须出现在文档的开头(并且只能有一个)。如果将多个文件作为参数提供给 pandoc,则只有第一个文件可以是 YAML 元数据块。
YAML 结构的叶节点彼此独立解析,也与文档的其余部分独立解析。因此,例如,如果链接定义位于文档的其他位置,则不能在这些上下文中使用引用链接。
反斜杠转义
all_symbols_escapable
扩展:除了在代码块或行内代码中,任何前面有反斜杠的标点符号或空格字符都将被字面处理,即使它通常表示格式。因此,例如,如果有人写
*\*hello\**
将得到
<em>*hello*</em>
而不是
<strong>hello</strong>
这个规则比原始 Markdown 的规则更容易记住,原始 Markdown 只允许以下字符进行反斜杠转义
\`*_{}[]()>#+-.!
(但是,如果使用 markdown_strict
格式,则将使用原始 Markdown 规则。)
反斜杠转义的空格被解析为不间断空格。在 TeX 输出中,它将显示为 ~
。在 HTML 和 XML 输出中,它将显示为字面 Unicode 不间断空格字符(请注意,因此它在生成的 HTML 源中实际上看起来是“不可见的”;您仍然可以使用 --ascii
命令行选项使其显示为显式实体)。
反斜杠转义的换行符(即行末出现的反斜杠)被解析为强制换行。它在 TeX 输出中显示为 \\
,在 HTML 中显示为 <br />
。这是 Markdown 通过行末两个尾随空格来指示强制换行的“不可见”方式的一个很好的替代方案。
反斜杠转义在逐字上下文中不起作用。
行内格式
强调
要强调某些文本,请用 *
或 _
将其包围,像这样
This text is _emphasized with underscores_, and this
is *emphasized with asterisks*.
双重 *
或 _
会产生强强调
This is **strong emphasis** and __with underscores__.
被空格包围或反斜杠转义的 *
或 _
字符不会触发强调
This is * not emphasized *, and \*neither is this\*.
intraword_underscores
扩展:因为 _
有时用于单词和标识符内部,所以 pandoc 不会将受字母数字字符包围的 _
解释为强调标记。如果您只想强调单词的一部分,请使用 *
feas*ible*, not feas*able*.
删除线
strikeout
扩展:要用横线划掉一段文本,请用 ~~
将其包围。因此,例如,
This ~~is deleted text.~~
上标和下标
superscript
, subscript
扩展:上标可以通过用 ^
字符包围上标文本来书写;下标可以通过用 ~
字符包围下标文本来书写。因此,例如,
H~2~O is a liquid. 2^10^ is 1024.
^...^
或 ~...~
之间的文本不能包含空格或换行符。如果上标或下标文本包含空格,这些空格必须用反斜杠转义。(这是为了防止通过普通使用 ~
和 ^
导致意外上标和下标,以及与脚注的不良交互。)因此,如果您想要字母 P 带“a cat”的下标,请使用 P~a\ cat~
,而不是 P~a cat~
。
逐字
要使一小段文本逐字显示,请将其放在反引号内
What is the difference between `>>=` and `>>`?
如果逐字文本包含反引号,请使用双反引号
Here is a literal backtick `` ` ``.
(起始反引号后的空格和结束反引号前的空格将被忽略。)
一般规则是,逐字跨度以一串连续的反引号(可选地后跟一个空格)开始,并以相同数量的反引号(可选地前跟一个空格)结束。
请注意,反斜杠转义(以及其他 Markdown 构造)在逐字上下文中不起作用
This is a backslash followed by an asterisk: `\*`.
inline_code_attributes
扩展:属性可以附加到逐字文本上,就像围栏式代码块一样
`<$>`{.haskell}
下划线
要为文本添加下划线,请使用 underline
类
[Underline]{.underline}
或者,不使用 bracketed_spans
扩展(但使用 native_spans
)
<span class="underline">Underline</span>
这将在所有支持下划线的输出格式中生效。
小型大写字母
要书写小型大写字母,请使用 smallcaps
类
[Small caps]{.smallcaps}
或者,不使用 bracketed_spans
扩展
<span class="smallcaps">Small caps</span>
为了与其他 Markdown 风格兼容,也支持 CSS
<span style="font-variant:small-caps;">Small caps</span>
这将在所有支持小型大写字母的输出格式中生效。
高亮
要高亮文本,请使用 mark
类
[Mark]{.mark}
或者,不使用 bracketed_spans
扩展(但使用 native_spans
)
<span class="mark">Mark</span>
这将在所有支持高亮显示的输出格式中生效。
数学
tex_math_dollars
扩展:两个 $
字符之间的任何内容都将被视为 TeX 数学公式。开头的 $
必须在其右侧紧跟着一个非空格字符,而结尾的 $
必须在其左侧紧跟着一个非空格字符,并且不能紧跟着一个数字。因此,$20,000 and $30,000
不会被解析为数学公式。如果由于某种原因您需要将文本包含在字面 $
字符中,请用反斜杠对其进行转义,这样它们就不会被视为数学分隔符。
对于显示数学,请使用 $$
分隔符。(在这种情况下,分隔符可以与公式之间用空格分隔。但是,起始和结束 $$
分隔符之间不能有空行。)
TeX 数学公式将打印在所有输出格式中。它的渲染方式取决于输出格式
- LaTeX
- 它将逐字显示,并由
\(...\)
(用于行内数学公式)或\[...\]
(用于显示数学公式)包围。 - Markdown, Emacs Org mode, ConTeXt, ZimWiki
- 它将逐字显示,并由
$...$
(用于行内数学公式)或$$...$$
(用于显示数学公式)包围。 - XWiki
- 它将逐字显示,并由
{{formula}}..{{/formula}}
包围。 - reStructuredText
- 它将使用解释文本角色
:math:
进行渲染。 - AsciiDoc
- 对于 AsciiDoc 输出,数学公式将逐字显示,并由
latexmath:[...]
包围。对于asciidoc_legacy
,方括号内的内容还将包括行内或显示数学分隔符。 - Texinfo
- 它将在
@math
命令内部渲染。 - roff man, Jira markup
- 它将逐字渲染,不带
$
符号。 - MediaWiki, DokuWiki
- 它将在
<math>
标签内部渲染。 - Textile
- 它将在
<span class="math">
标签内部渲染。 - RTF, OpenDocument
- 如果可能,它将使用 Unicode 字符渲染,否则将逐字显示。
- ODT
- 如果可能,它将使用 MathML 渲染。
- DocBook
- 如果使用
--mathml
标志,它将使用 MathML 在inlineequation
或informalequation
标签中渲染。否则,如果可能,它将使用 Unicode 字符渲染。 - Docx and PowerPoint
- 它将使用 OMML 数学标记渲染。
- FictionBook2
- 如果使用
--webtex
选项,公式将使用 CodeCogs 或其他兼容的 Web 服务渲染为图像,下载并嵌入到电子书中。否则,它们将逐字显示。 - HTML, Slidy, DZSlides, S5, EPUB
- 数学公式在 HTML 中的渲染方式将取决于所选的命令行选项。因此,请参见上面的HTML 中的数学公式渲染。
原始 HTML
raw_html
扩展:Markdown 允许您在文档中的任何位置插入原始 HTML(或 DocBook)(除了逐字上下文,在其中 <
、>
和 &
会被字面解释)。(从技术上讲,这不是一个扩展,因为标准 Markdown 允许它,但为了可以根据需要禁用,它已被设置为一个扩展。)
原始 HTML 在 HTML、S5、Slidy、Slideous、DZSlides、EPUB、Markdown、CommonMark、Emacs Org mode 和 Textile 输出中会原样传递,而在其他格式中会被抑制。
要以更明确的方式在 Markdown 文档中包含原始 HTML,请参见raw_attribute
扩展。
在 CommonMark 格式中,如果启用 raw_html
,上标、下标、删除线和小型大写字母将以 HTML 形式表示。否则,将使用纯文本回退。请注意,即使 raw_html
被禁用,如果表格不能使用管道语法,它们也将以 HTML 语法渲染。
markdown_in_html_blocks
扩展:原始 Markdown 允许您包含 HTML“块”:位于平衡标签之间,与周围文本用空行分隔,并从左边距开始和结束的 HTML 块。在这些块中,所有内容都被解释为 HTML,而不是 Markdown;因此(例如),*
不表示强调。
当使用 markdown_strict
格式时,Pandoc 的行为方式与此相同;但默认情况下,pandoc 会将 HTML 块标签之间的内容解释为 Markdown。因此,例如,pandoc 将把
<table>
<tr>
<td>*one*</td>
<td>[a link](https://google.com)</td>
</tr>
</table>
转换为
<table>
<tr>
<td><em>one</em></td>
<td><a href="https://google.com">a link</a></td>
</tr>
</table>
而 Markdown.pl
将保持原样。
这条规则有一个例外:<script>
、<style>
、<pre>
和 <textarea>
标签之间的文本不会被解释为 Markdown。
这种与原始 Markdown 的背离应该使得 Markdown 与 HTML 块元素混合使用变得更容易。例如,可以用 <div>
标签包围 Markdown 文本块,而不会阻止它被解释为 Markdown。
native_divs
扩展:在 <div>
标签内部的内容使用原生的 pandoc Div
块。在大多数情况下,这应该产生与 markdown_in_html_blocks
相同的输出,但它使得编写 pandoc 过滤器来操作块组变得更容易。
native_spans
扩展:在 <span>
标签内部的内容使用原生的 pandoc Span
块。在大多数情况下,这应该产生与 raw_html
相同的输出,但它使得编写 pandoc 过滤器来操作行内元素组变得更容易。
raw_tex
扩展:除了原始 HTML,pandoc 还允许在文档中包含原始 LaTeX、TeX 和 ConTeXt。行内 TeX 命令将被保留并原样传递给 LaTeX 和 ConTeXt 编写器。因此,例如,您可以使用 LaTeX 来包含 BibTeX 引用
This result was proved in \cite{jones.1967}.
请注意,在 LaTeX 环境中,例如
\begin{tabular}{|l|l|}\hline
Age & Frequency \\ \hline
18--25 & 15 \\
26--35 & 33 \\
36--45 & 22 \\ \hline
\end{tabular}
begin 和 end 标签之间的内容将被解释为原始 LaTeX,而不是 Markdown。
要以更明确和灵活的方式在 Markdown 文档中包含原始 TeX,请参见raw_attribute
扩展。
行内 LaTeX 在 Markdown、LaTeX、Emacs Org mode 和 ConTeXt 之外的输出格式中会被忽略。
通用原始属性
raw_attribute
扩展:行内 span 和带有特殊属性的围栏式代码块将被解析为指定格式的原始内容。例如,以下内容会生成一个原始的 roff ms
块:
```{=ms}
.MYMACRO
blah blah
```
以下内容会生成一个原始的 html
行内元素:
This is `<a>html</a>`{=html}
这对于将原始 XML 插入 docx
文档非常有用,例如插入一个分页符:
```{=openxml}
<w:p>
<w:r>
<w:br w:type="page"/>
</w:r>
</w:p>
```
格式名称应与目标格式名称匹配(有关列表,请参阅上面的-t/--to
选项,或使用pandoc --list-output-formats
)。对于 docx
输出,请使用 openxml
;对于 odt
输出,请使用 opendocument
;对于 epub3
输出,请使用 html5
;对于 epub2
输出,请使用 html4
;对于 pdf
输出,请使用 latex
、beamer
、ms
或 html5
(取决于您用于--pdf-engine
的引擎)。
此扩展假设启用了相关类型的行内代码或围栏式代码块。因此,例如,要将原始属性与反引号代码块一起使用,必须启用 backtick_code_blocks
。
原始属性不能与常规属性结合使用。
LaTeX 宏
latex_macros
扩展:当启用此扩展时,Pandoc 将解析 LaTeX 宏定义,并将生成的宏应用于所有 LaTeX 数学和原始 LaTeX 内容。因此,例如,以下内容将在所有输出格式中生效,而不仅仅是 LaTeX:
\newcommand{\tuple}[1]{\langle #1 \rangle}
$\tuple{a, b, c}$
请注意,如果 LaTeX 宏出现在标有raw_attribute
扩展的原始 span 或块中,则不会应用它们。
当 latex_macros
被禁用时,原始 LaTeX 和数学内容将不会应用宏。当您以 LaTeX 或 PDF 为目标时,这通常是一种更好的方法。
LaTeX 中的宏定义只有在未启用 latex_macros
时才作为原始 LaTeX 内容传递。Markdown 源(或其他允许 raw_tex
的格式)中的宏定义无论是否启用 latex_macros
都会被传递。
链接
Markdown 允许以多种方式指定链接。
自动链接
如果您将 URL 或电子邮件地址用尖括号括起来,它将成为一个链接:
<https://google.com>
<[email protected]>
行内链接
行内链接由方括号中的链接文本,后跟圆括号中的 URL 组成。(可选地,URL 后面可以跟一个用引号括起来的链接标题。)
This is an [inline link](/url), and here's [one with
a title](https://fsf.org "click here for a good time!").
方括号部分和圆括号部分之间不能有空格。链接文本可以包含格式(例如强调),但标题不能。
行内链接中的电子邮件地址不会被自动检测,因此必须以 mailto
为前缀:
[Write me!](mailto:[email protected])
引用链接
一个显式引用链接由两部分组成:链接本身和链接定义,链接定义可以出现在文档的其他地方(在链接之前或之后)。
链接由方括号中的链接文本,后跟方括号中的标签组成。(除非启用了 spaced_reference_links
扩展,否则两者之间不能有空格。)链接定义由方括号中的标签,后跟一个冒号和一个空格,再后跟 URL,可选地(在一个空格之后)一个用引号或括号括起来的链接标题组成。标签不能被解析为引用(假设启用了 citations
扩展):引用优先于链接标签。
以下是一些示例:
[my label 1]: /foo/bar.html "My title, optional"
[my label 2]: /foo
[my label 3]: https://fsf.org (The Free Software Foundation)
[my label 4]: /bar#special 'A title in single quotes'
URL 可以选择用尖括号括起来:
[my label 5]: <http://foo.bar.baz>
标题可以放在下一行:
[my label 3]: https://fsf.org
"The Free Software Foundation"
请注意,链接标签不区分大小写。因此,以下内容将生效:
Here is [my link][FOO]
[Foo]: /bar/baz
在隐式引用链接中,第二对方括号是空的:
See [my website][].
[my website]: http://foo.bar.baz
注意:在 Markdown.pl
和大多数其他 Markdown 实现中,引用链接定义不能出现在嵌套结构中,例如列表项或块引用。Pandoc 取消了这种任意的限制。因此,以下内容在 Pandoc 中是允许的,但在大多数其他实现中则不允许:
> My block [quote].
>
> [quote]: /foo
shortcut_reference_links
扩展:在快捷方式引用链接中,第二对方括号可以完全省略:
See [my website].
[my website]: http://foo.bar.baz
内部链接
要链接到同一文档的另一个部分,请使用自动生成的标识符(参阅标题标识符)。例如:
See the [Introduction](#introduction).
或者
See the [Introduction].
[Introduction]: #introduction
内部链接目前支持 HTML 格式(包括 HTML 幻灯片和 EPUB)、LaTeX 和 ConTeXt。
图像
紧跟在 !
之后的链接将被视为图像。链接文本将用作图像的替代文本(alt text):

![movie reel]
[movie reel]: movie.gif
implicit_figures
扩展:一个带有非空替代文本的图像,如果单独出现在一个段落中,将作为带标题的图渲染。图像的替代文本将用作标题。

如何渲染取决于输出格式。某些输出格式(例如 RTF)尚不支持图。在这些格式中,您只会得到一个单独在段落中的图像,没有标题。
如果您只是想要一个常规的行内图像,只需确保它不是段落中唯一的内容。一种方法是在图像后插入一个不间断空格:
\
请注意,在 reveal.js 幻灯片中,如果段落中单独存在的图像带有 r-stretch
类,它将填满屏幕,并且将省略标题和图标签。
link_attributes
扩展:可以在链接和图像上设置属性:
An inline {#id .class width=30 height=20px}
and a reference ![image][ref] with attributes.
[ref]: foo.jpg "optional title" {#id .class key=val key2="val 2"}
(当仅使用 #id
和 .class
时,此语法与 PHP Markdown Extra 兼容。)
对于 HTML 和 EPUB,除 width
和 height
之外的所有已知 HTML5 属性(包括 srcset
和 sizes
)都将原样传递。未知属性将作为自定义属性传递,并加上 data-
前缀。其他写入器将忽略其输出格式不支持的属性。
图像上的 width
和 height
属性将进行特殊处理。当不带单位使用时,单位假定为像素。但是,可以使用以下任何单位标识符:px
、cm
、mm
、in
、inch
和 %
。数字和单位之间不能有空格。例如:
{ width=50% }
- 尺寸可能会被转换为与输出格式兼容的形式(例如,当将 HTML 转换为 LaTeX 时,以像素为单位的尺寸将被转换为英寸)。像素和物理测量之间的转换受
--dpi
选项的影响(默认情况下,假定为 96 dpi,除非图像本身包含 dpi 信息)。 %
单位通常相对于可用空间。例如,上面的示例将渲染为以下内容:- HTML:
<img href="file.jpg" style="width: 50%;" />
- LaTeX:
\includegraphics[width=0.5\textwidth,height=\textheight]{file.jpg}
(如果您使用自定义模板,则需要像默认模板那样配置graphicx
。) - ConTeXt:
\externalfigure[file.jpg][width=0.5\textwidth]
- HTML:
- 某些输出格式具有类的概念(ConTeXt)或唯一标识符(LaTeX
\caption
),或两者兼有(HTML)。 - 当未指定
width
或height
属性时,默认会查看图像分辨率和图像文件中嵌入的 dpi 元数据。
Divs 和 Spans
使用 native_divs
和 native_spans
扩展(请参阅上文),HTML 语法可以作为 Markdown 的一部分使用,以在 Pandoc AST 中创建原生的 Div
和 Span
元素(而不是原始 HTML)。但是,也有更简洁的语法可用:
fenced_divs
扩展:允许对原生 Div
块使用特殊的围栏式语法。一个 Div 以一个包含至少三个连续冒号加上一些属性的围栏开始。属性后面可以选择性地跟一个连续冒号的字符串。
注意:commonmark
解析器不允许属性后面有冒号。
属性语法与围栏式代码块中的属性语法完全相同(请参阅扩展:fenced_code_attributes
)。与围栏式代码块一样,可以使用花括号中的属性或单个不带花括号的单词,该单词将被视为类名。Div 以另一行结束,该行包含一个至少三个连续冒号的字符串。围栏式 Div 应与前后块之间用空行分隔。
示例:
::::: {#special .sidebar}
Here is a paragraph.
And another.
:::::
围栏式 Div 可以嵌套。开围栏的特点是它们必须有属性:
::: Warning ::::::
This is a warning.
::: Danger
This is a warning within a warning.
:::
::::::::::::::::::
没有属性的围栏总是闭围栏。与围栏式代码块不同,闭围栏中的冒号数量不需要与开围栏中的数量匹配。但是,使用不同长度的围栏来区分嵌套 div 与其父 div,有助于提高视觉清晰度。
bracketed_spans
扩展:一个用方括号括起来的行内序列,就像开始一个链接一样,如果后面紧跟着属性,将被视为一个带有属性的 Span
:
[This is *some text*]{.class key="val"}
脚注
footnotes
扩展:Pandoc 的 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.
脚注引用中的标识符不能包含空格、制表符、换行符或字符 ^
、[
或 ]
。这些标识符仅用于将脚注引用与脚注本身关联起来;在输出中,脚注将按顺序编号。
脚注本身不必放在文档的末尾。它们可以出现在任何地方,除了其他块元素内部(列表、块引用、表格等)。每个脚注应与周围内容(包括其他脚注)用空行分隔。
inline_notes
扩展:也允许行内脚注(尽管与常规脚注不同,它们不能包含多个段落)。语法如下:
Here is an inline note.^[Inline notes are easier to write, since
you don't have to pick an identifier and move down to type the
note.]
行内脚注和常规脚注可以自由混合使用。
引用语法
citations
扩展:要引用一个带有标识符 foo 的书目项,请使用语法 @foo
。正常引用应包含在方括号中,并用分号分隔不同的项:
Blah blah [@doe99; @smith2000; @smith2004].
其渲染方式取决于引用样式。在作者-日期样式中,它可能渲染为:
Blah blah (Doe 1999, Smith 2000, 2004).
在脚注样式中,它可能渲染为:
Blah blah.[^1]
[^1]: John Doe, "Frogs," *Journal of Amphibians* 44 (1999);
Susan Smith, "Flies," *Journal of Insects* (2000);
Susan Smith, "Bees," *Journal of Insects* (2004).
有关 CSL 样式及其如何影响渲染的更多信息,请参阅CSL 用户文档。
除非引用键以字母、数字或 _
开头,并且只包含字母数字和单个内部标点符号(:.#$%&-+?<>~/
),否则它必须用花括号括起来,花括号不被视为键的一部分。在 @Foo_bar.baz.
中,键是 Foo_bar.baz
,因为最后一个句点不是内部标点,所以它不包含在键中。在 @{Foo_bar.baz.}
中,键是 Foo_bar.baz.
,包括最后一个句点。在 @Foo_bar--baz
中,键是 Foo_bar
,因为重复的内部标点符号终止了键。如果您使用 URL 作为键,建议使用花括号:[@{https://example.com/bib?name=foobar&date=2000}, p. 33]
。
引用项可以选择包含前缀、定位符和后缀。在
Blah blah [see @doe99, pp. 33-35 and *passim*; @smith04, chap. 1].
第一个条目(doe99
)有前缀 see
,定位符 pp. 33-35
,和后缀 and *passim*
。第二个条目(smith04
)有定位符 chap. 1
,没有前缀或后缀。
Pandoc 使用一些启发式方法将定位符与其余部分分开。它对 CSL 区域设置文件中定义的定位符术语敏感。缩写形式和非缩写形式都可接受。在 en-US
区域设置中,定位符术语可以写成单数或复数形式,如 book
, bk.
/bks.
; chapter
, chap.
/chaps.
; column
, col.
/cols.
; figure
, fig.
/figs.
; folio
, fol.
/fols.
; number
, no.
/nos.
; line
, l.
/ll.
; note
, n.
/nn.
; opus
, op.
/opp.
; page
, p.
/pp.
; paragraph
, para.
/paras.
; part
, pt.
/pts.
; section
, sec.
/secs.
; sub verbo
, s.v.
/s.vv.
; verse
, v.
/vv.
; volume
, vol.
/vols.
; ¶
/¶¶
; §
/§§
。如果没有使用定位符术语,则假定为“page”。
在复杂情况下,您可以通过用花括号括起来强制将其视为定位符,或者通过在前面加上花括号来防止将后缀解析为定位符:
[@smith{ii, A, D-Z}, with a suffix]
[@smith, {pp. iv, vi-xi, (xv)-(xvii)} with suffix here]
[@smith{}, 99 years later]
@
前面的减号(-
)将抑制引用中作者的提及。当作者已在文本中提及时,这会很有用:
Smith says blah [-@smith04].
您还可以通过省略方括号来编写文本内作者引用:
@smith04 says blah.
@smith04 [p. 33] says blah.
这将导致作者姓名被渲染,后跟书目详细信息。当您想将引用作为句子的主语时,请使用此形式。
当您使用注释样式时,通常最好让 citeproc 从引用创建脚注,而不是手动编写显式注释。如果您确实编写了包含引用的显式注释,请注意,正常引用将放在括号中,而文本内引用则不会。因此,在使用注释样式时,有时最好在注释内部使用文本内样式。
非默认扩展
以下 Markdown 语法扩展在 Pandoc 中默认不启用,但可以通过在格式名称后添加 +EXTENSION
来启用,其中 EXTENSION
是扩展的名称。因此,例如,markdown+hard_line_breaks
是带有硬换行的 Markdown。
rebase_relative_paths
扩展:根据包含链接或图像链接的文件路径,重写 Markdown 链接和图像的相对路径。对于每个链接或图像,pandoc 将计算包含文件的目录相对于工作目录的路径,并将生成的路径添加到链接或图像路径的前面。
此扩展的使用最好通过示例来理解。假设您为书的每个章节都有一个子目录,chap1
、chap2
、chap3
。每个子目录都包含一个 text.md
文件和章节中使用的许多图像。您希望 chap1/text.md
中的 
指向 chap1/spider.jpg
,而 chap2/text.md
中的 
指向 chap2/spider.jpg
。为此,请使用:
pandoc chap*/*.md -f markdown+rebase_relative_paths
如果没有此扩展,您将不得不在 chap1/text.md
中使用 
,并在 chap2/text.md
中使用 
。带有相对路径的链接将以与图像相同的方式重写。
绝对路径和 URL 不会被更改。空路径或完全由片段组成的路径(例如 #foo
)也不会改变。
请注意,引用链接和图像中的相对路径将相对于包含链接引用定义的文件重写,而不是相对于包含引用链接或图像本身的文件,如果它们不同。
mark
扩展:要突出显示文本部分,请以 ==
开始和结束。例如:
This ==is deleted text.==
attributes
扩展:在解析 commonmark
时,允许将属性附加到任何行内或块级元素。属性的语法与 header_attributes
中使用的语法相同。
- 紧跟在行内元素后的属性会影响该元素。如果它们后面跟着空格,则它们属于该空格。(因此,此选项包含了
inline_code_attributes
和link_attributes
。) - 紧接在块元素之前,单独一行上的属性会影响该元素。
- 可以连续使用属性说明符,无论是用于块还是用于行内。它们的属性将合并。
- 出现在 Setext 或 ATX 标题文本末尾(与文本用空格分隔)的属性会影响标题元素。(因此,此选项包含了
header_attributes
。) - 出现在围栏式代码块开围栏后的属性会影响代码块元素。(因此,此选项包含了
fenced_code_attributes
。) - 出现在引用链接定义末尾的属性会影响引用该定义的链接。
请注意,Pandoc 的 AST 目前不允许将属性附加到任意元素。因此,如果需要,将添加一个 Span 或 Div 容器。
old_dashes
扩展:选择 Pandoc <= 1.8.2.1 版本的智能破折号解析行为:数字前的 -
是半破折号(en-dash),--
是全破折号(em-dash)。此选项仅在启用 smart
时有效。对于 textile
输入,它会自动选择。
angle_brackets_escapable
扩展:允许 <
和 >
使用反斜杠转义,就像在 GitHub flavored Markdown 中可以那样,但原始 Markdown 不行。这由 Pandoc 的默认 all_symbols_escapable
暗示。
lists_without_preceding_blankline
扩展:允许列表紧跟在段落后面出现,中间没有空白。
four_space_rule
扩展:选择 Pandoc <= 2.0 版本的列表解析行为,因此列表项延续段落需要四个空格缩进。
spaced_reference_links
扩展:允许引用链接的两个组成部分之间有空格,例如:
[foo] [bar].
hard_line_breaks
扩展:使段落内的所有换行符都被解释为硬换行而不是空格。
ignore_line_breaks
扩展:使段落内的换行符被忽略,而不是被视为空格或硬换行。此选项旨在用于词语之间不使用空格,但文本为了可读性而分行的东亚语言。
east_asian_line_breaks
扩展:使段落内的换行符在两个东亚宽字符之间出现时被忽略,而不是被视为空格或硬换行。对于包含东亚宽字符和其他字符混合的文本,这是比 ignore_line_breaks
更好的选择。
emoji
扩展:将文本表情符号(如 :smile:
)解析为 Unicode 表情符号。
tex_math_gfm
扩展:支持两种 GitHub 特定的数学格式。行内数学:$`e=mc^2`$
。
显示数学:
``` math
e=mc^2
```
tex_math_single_backslash
扩展:使 \(
和 \)
之间的任何内容被解释为行内 TeX 数学,\[
和 \]
之间的任何内容被解释为显示 TeX 数学。注意:此扩展的一个缺点是它排除了转义 (
和 [
的可能性。
tex_math_double_backslash
扩展:使 \\(
和 \\)
之间的任何内容被解释为行内 TeX 数学,\\[
和 \\]
之间的任何内容被解释为显示 TeX 数学。
markdown_attribute
扩展:默认情况下,Pandoc 将块级标签内的内容解释为 Markdown。此扩展改变了行为,只有当标签具有属性 markdown=1
时,Markdown 才会在块级标签内被解析。
mmd_title_block
扩展:在文档顶部启用 MultiMarkdown 风格的标题块,例如:
Title: My title
Author: John Doe
Date: September 1, 2008
Comment: This is a sample mmd title block, with
a field spanning multiple lines.
详情请参阅 MultiMarkdown 文档。如果 pandoc_title_block
或 yaml_metadata_block
启用,它将优先于 mmd_title_block
。
abbreviations
扩展:解析 PHP Markdown Extra 的缩写键,例如:
*[HTML]: Hypertext Markup Language
请注意,Pandoc 文档模型不支持缩写,因此如果启用此扩展,缩写键将被简单跳过(而不是被解析为段落)。
alerts
扩展:支持 GitHub 风格的 Markdown 警报,例如:
> [!TIP]
> Helpful advice for doing things better or more easily.
注意:此扩展目前仅适用于 commonmark:commonmark
、gfm
、commonmark_x
。
autolink_bare_uris
扩展:使所有绝对 URI 都成为链接,即使它们未被尖括号 <...>
括起来。
mmd_link_attributes
扩展:解析 MultiMarkdown 风格的链接和图像引用上的键值属性。此扩展不应与link_attributes
扩展混淆。
This is a reference ![image][ref] with MultiMarkdown attributes.
[ref]: https://path.to/image "Image title" width=20px height=30px
id=myId class="myClass1 myClass2"
mmd_header_identifiers
扩展:解析 MultiMarkdown 风格的标题标识符(在标题后、ATX 标题中的任何尾随 #
之前,用方括号括起来)。
compact_definition_lists
扩展:激活 Pandoc 1.12.x 及更早版本的定义列表语法。此语法与上文定义列表中描述的语法在几个方面有所不同:
- 定义列表的连续项目之间不需要空行。
- 要获得“紧凑”列表,请省略连续项目之间的空格;术语与其定义之间的空格不影响任何内容。
- 不允许段落的惰性换行:整个定义必须缩进四个空格。4
gutenberg
扩展:对 plain
输出使用 古腾堡计划约定:全大写表示强强调,用下划线括起来表示常规强调,标题周围添加额外的空白。
sourcepos
扩展:解析 commonmark
时包含源位置属性。对于接受属性的元素,会添加一个 data-pos
属性;其他元素则放在带有 data-pos
属性的 Div 或 Span 元素中。
short_subsuperscripts
扩展:解析 MultiMarkdown 风格的下标和上标,它们分别以“~”或“^”字符开头,并包含后面的字母数字序列。例如:
x^2 = 4
或者
Oxygen is O~2.
wikilinks_title_after_pipe
扩展:Pandoc 支持多种 Markdown wiki 链接语法,无论标题是在竖线之前还是之后。
使用 --from=markdown+wikilinks_title_after_pipe
会得到:
[[URL|title]]
而使用 --from=markdown+wikilinks_title_before_pipe
会得到:
[[title|URL]]
Markdown 变体
除了 Pandoc 的扩展 Markdown,还支持以下 Markdown 变体:
markdown_phpextra
(PHP Markdown Extra)markdown_github
(已废弃的 GitHub-Flavored Markdown)markdown_mmd
(MultiMarkdown)markdown_strict
(Markdown.pl)commonmark
(CommonMark)gfm
(Github-Flavored Markdown)commonmark_x
(CommonMark with many pandoc extensions)
要查看给定格式支持哪些扩展以及默认启用哪些扩展,可以使用以下命令:
pandoc --list-extensions=FORMAT
其中 FORMAT
替换为格式名称。
请注意,commonmark
、gfm
和 commonmark_x
的扩展列表是相对于默认 commonmark 定义的。因此,例如,backtick_code_blocks
不会显示为扩展,因为它默认启用且无法禁用。
引用
当使用 --citeproc
选项时,Pandoc 可以自动生成多种样式的引文和参考文献。基本用法是:
pandoc --citeproc myinput.txt
要使用此功能,您需要具备:
指定书目数据
您可以使用 YAML 元数据部分中的 bibliography
元数据字段或 --bibliography
命令行参数来指定外部书目。如果您想使用多个书目文件,可以提供多个 --bibliography
参数或将 bibliography
元数据字段设置为 YAML 数组。书目可以是以下任何一种格式:
格式 | 文件扩展名 |
---|---|
BibLaTeX | .bib |
BibTeX | .bibtex |
CSL JSON | .json |
CSL YAML | .yaml |
RIS | .ris |
请注意,.bib
可用于 BibTeX 和 BibLaTeX 文件;使用扩展名 .bibtex
可强制将其解释为 BibTeX。
在 BibTeX 和 BibLaTeX 数据库中,Pandoc 会解析 title
等字段内的 LaTeX 标记;在 CSL YAML 数据库中,解析 Pandoc Markdown;在 CSL JSON 数据库中,解析类似 HTML 的标记:HTML-like markup
<i>...</i>
- 斜体
<b>...</b>
- 粗体
<span style="font-variant:small-caps;">...</span>
或<sc>...</sc>
- 小型大写字母
<sub>...</sub>
- 下标
<sup>...</sup>
- 上标
<span class="nocase">...</span>
- 阻止短语在标题大小写中大写
作为使用 --bibliography
或 YAML 元数据字段 bibliography
指定书目文件的替代方案,您可以直接在文档 YAML 元数据的 references
字段中包含引文数据。该字段应包含一个 YAML 编码的引用数组,例如:
---
references:
- type: article-journal
id: WatsonCrick1953
author:
- family: Watson
given: J. D.
- family: Crick
given: F. H. C.
issued:
date-parts:
- - 1953
- 4
- 25
title: 'Molecular structure of nucleic acids: a structure for
deoxyribose nucleic acid'
title-short: Molecular structure of nucleic acids
container-title: Nature
volume: 171
issue: 4356
page: 737-738
DOI: 10.1038/171737a0
URL: https://www.nature.com/articles/171737a0
language: en-GB
...
如果同时提供了外部书目和行内(YAML 元数据)引用,两者都将使用。如果 id
冲突,行内引用将优先。
请注意,Pandoc 可以用于从 BibTeX、BibLaTeX 或 CSL JSON 书目生成此类 YAML 元数据部分:
pandoc chem.bib -s -f biblatex -t markdown
pandoc chem.json -s -f csljson -t markdown
实际上,Pandoc 可以在任何这些引用格式之间进行转换:
pandoc chem.bib -s -f biblatex -t csljson
pandoc chem.yaml -s -f markdown -t biblatex
使用 --citeproc
选项在书目文件上运行 Pandoc 将以您选择的格式创建格式化书目:
pandoc chem.bib -s --citeproc -o chem.html
pandoc chem.bib -s --citeproc -o chem.pdf
标题中的大写
如果您正在使用 bibtex 或 biblatex 书目,请遵守以下规则:
英文标题应采用标题大小写。非英文标题应采用句子大小写,并且 biblatex 中的
langid
字段应设置为相关语言。(以下值被视为英文:american
,british
,canadian
,english
,australian
,newzealand
,USenglish
, 或UKenglish
。)按照 bibtex/biblatex 的标准,专有名词应受花括号保护,以免在要求句子大小写的样式中被小写。例如:
title = {My Dinner with {Andre}}
此外,应保护应保持小写(或驼峰式)的单词:
title = {Spin Wave Dispersion on the {nm} Scale}
虽然在 bibtex/biblatex 中这不是必需的,但在 citeproc 中是必需的,citeproc 内部以句子大小写存储标题,并在需要时转换为标题大小写。在这里,我们保护“nm”,使其在此阶段不会转换为“Nm”。
如果您使用 CSL 书目(JSON 或 YAML),请遵守以下规则:
所有标题都应采用句子大小写。
对于非英文标题,请使用
language
字段以防止其在需要时转换为标题大小写。(仅当language
以en
开头或为空时才发生转换。)使用此语法保护不应转换为标题大小写的单词:
Spin wave dispersion on the <span class="nocase">nm</span> scale
会议论文,已发表 vs. 未发表
对于正式发表的会议论文,请使用 biblatex 条目类型 inproceedings
(将映射到 CSL paper-conference
)。
对于未发表的手稿,请使用不带 eventtitle
字段的 biblatex 条目类型 unpublished
(此条目类型将映射到 CSL manuscript
)。
对于演讲、未发表的会议论文或海报展示,请使用带有 eventtitle
字段的 biblatex 条目类型 unpublished
(此条目类型将映射到 CSL speech
)。使用 biblatex type
字段指示类型,例如“Paper”或“Poster”。venue
和 eventdate
也可能有用,尽管大多数 CSL 样式不会渲染 eventdate
。请注意,venue
是指活动地点,与描述出版商地点的 location
不同;未发表的会议论文不要使用后者。
指定引用样式
引用和参考文献可以使用 引文样式语言 (Citation Style Language) 支持的任何样式进行格式化,这些样式列在 Zotero 样式库中。这些文件使用 --csl
选项或 csl
(或 citation-style
)元数据字段指定。默认情况下,Pandoc 将使用 芝加哥大学出版物格式手册 (Chicago Manual of Style) 的作者-日期格式。(您可以通过将所选 CSL 样式复制到用户数据目录中的 default.csl
来覆盖此默认设置。)CSL 项目提供了有关查找和编辑样式的更多信息。
可以使用 --citation-abbreviations
选项(或 citation-abbreviations
元数据字段)指定一个 JSON 文件,其中包含在指定 form="short"
时,格式化书目中应使用的期刊缩写。该文件的格式可以通过示例说明:
{ "default": {
"container-title": {
"Lloyd's Law Reports": "Lloyd's Rep",
"Estates Gazette": "EG",
"Scots Law Times": "SLT"
}
}
}
注释样式中的引用
Pandoc 的引用处理旨在让您在作者-日期、数字和注释样式之间切换,而无需修改 Markdown 源。当您使用注释样式时,请避免手动插入脚注。相反,像在作者-日期样式中一样插入引用——例如:
Blah blah [@foo, p. 33].
脚注将自动创建。Pandoc 会根据 notes-after-punctuation
的设置(如下文其他相关元数据字段所述),负责删除空格并将注释移到句号之前或之后。
在某些情况下,您可能需要将引用放在常规脚注中。脚注中的正常引用(如 [@foo, p. 33]
)将以括号形式呈现。文本内引用(如 @foo [p. 33]
)将不带括号呈现。(如果合适,将添加逗号。)因此:
[^1]: Some studies [@foo; @bar, p. 33] show that
frubulicious zoosnaps are quantical. For a survey
of the literature, see @baz [chap. 1].
书目位置
如果样式要求列出引用的作品,它将被放置在一个 id 为 refs
的 div 中(如果存在的话):
::: {#refs}
:::
否则,它将被放置在文档的末尾。可以通过在 YAML 元数据中设置 suppress-bibliography: true
来抑制书目的生成。
如果您希望书目有一个章节标题,您可以在元数据中设置 reference-section-title
,或者将标题放在 id 为 refs
的 div(如果您正在使用它)的开头或文档的末尾:
last paragraph...
# References
书目将插入在此标题之后。请注意,unnumbered
类将被添加到此标题中,因此该章节将不编号。
如果您想将书目放入模板中的变量,一种方法是将 id 为 refs
的 div 放入元数据字段,例如:
---
refs: |
::: {#refs}
:::
...
然后您可以将变量 $refs$
放入您的模板中,放在您希望书目放置的位置。
在书目中包含未引用的条目
如果您想在书目中包含项目而不在正文中实际引用它们,您可以定义一个虚拟的 nocite
元数据字段并将引用放在那里:
---
nocite: |
@item1, @item2
...
@item3
在此示例中,文档将只包含 item3
的引用,但书目将包含 item1
、item2
和 item3
的条目。
可以使用通配符创建包含所有引用的书目,无论它们是否出现在文档中:
---
nocite: |
@*
...
对于 LaTeX 输出,您还可以使用 natbib
或 biblatex
来渲染书目。为此,请按照上述说明指定书目文件,并向 Pandoc 调用添加 --natbib
或 --biblatex
参数。请记住,书目文件必须是 BibTeX(用于 --natbib
)或 BibLaTeX(用于 --biblatex
)格式。
其他相关元数据字段
还有几个元数据字段会影响书目格式:
link-citations
- 如果为 true,引用将超链接到相应的书目条目(仅适用于作者-日期和数字样式)。默认为 false。
link-bibliography
- 如果为 true,书目中的 DOI、PMCID、PMID 和 URL 将呈现为超链接。(如果条目包含 DOI、PMCID、PMID 或 URL,但样式未渲染这些字段,则标题或在没有标题的情况下,整个条目将超链接。)默认为 true。
lang
-
lang
字段将影响样式的本地化方式,例如标签的翻译、引号的使用以及项目的排序方式。(为了向后兼容,可以使用locale
代替lang
,但此用法已弃用。)期望使用 BCP 47 语言标签:例如
en
、de
、en-US
、fr-CA
、ug-Cyrl
。Unicode 扩展语法(在-u-
之后)可用于更精确地指定排序选项。以下是一些示例:zh-u-co-pinyin
:带拼音排序的中文。es-u-co-trad
:带传统排序的西班牙语(Ch
在C
之后排序)。fr-u-kb
:带“反向”重音排序的法语(coté
在côte
之后排序)。en-US-u-kf-upper
:英文,大写字母排在小写字母之前(默认是小写字母排在大写字母之前)。
notes-after-punctuation
- 如果为 true(注释样式的默认值),Pandoc 会将脚注引用或上标数字引用放在其后的标点符号之后。例如,如果源包含
blah blah [@jones99].
,结果将看起来像blah blah.[^1]
,其中注释移到了句号之后并且空格折叠。如果为 false,空格仍将被折叠,但脚注不会移到标点符号之后。此选项也可用于使用上标数字作为引用数字的数字样式(但对于这些样式,默认是不移动引用的)。
幻灯片演示
您可以使用 Pandoc 生成 HTML + JavaScript 幻灯片演示文稿,并通过网络浏览器查看。有五种方法可以实现此目的,分别使用 S5、DZSlides、Slidy、Slideous 或 reveal.js。您还可以使用 LaTeX beamer
生成 PDF 幻灯片演示文稿,或生成 Microsoft PowerPoint 格式的幻灯片演示文稿。
以下是一个简单幻灯片演示 habits.txt
的 Markdown 源文件:
% Habits
% John Doe
% March 22, 2005
# In the morning
## Getting up
- Turn off alarm
- Get out of bed
## Breakfast
- Eat eggs
- Drink coffee
# In the evening
## Dinner
- Eat spaghetti
- Drink wine
------------------

## Going to sleep
- Get in bed
- Count sheep
要生成 HTML/JavaScript 幻灯片演示,只需键入:
pandoc -t FORMAT -s habits.txt -o habits.html
其中 FORMAT
是 s5
、slidy
、slideous
、dzslides
或 revealjs
之一。
对于 Slidy、Slideous、reveal.js 和 S5,Pandoc 使用 -s/--standalone
选项生成的文件会嵌入 JavaScript 和 CSS 文件的链接,这些文件假定可在相对路径 s5/default
(S5)、slideous
(Slideous)、reveal.js
(reveal.js)或 Slidy 网站 w3.org
(Slidy)上找到。(这些路径可以通过设置 slidy-url
、slideous-url
、revealjs-url
或 s5-url
变量来更改;请参阅上面的HTML 幻灯片变量。)对于 DZSlides,默认情况下,(相对较短的)JavaScript 和 CSS 已包含在文件中。
对于所有 HTML 幻灯片格式,可以使用 --self-contained
选项来生成一个包含显示幻灯片演示所需所有数据(包括链接的脚本、样式表、图像和视频)的单个文件。
要使用 beamer 生成 PDF 幻灯片演示,请键入:
pandoc -t beamer habits.txt -o habits.pdf
请注意,reveal.js 幻灯片演示也可以通过从浏览器打印到文件来转换为 PDF。
要生成 PowerPoint 幻灯片演示,请键入:
pandoc habits.txt -o habits.pptx
幻灯片演示的结构
默认情况下,幻灯片级别是文档中某处紧跟内容(而不是另一个标题)的层次结构中最高的标题级别。在上面的示例中,级别 1 标题后面总是跟着级别 2 标题,而级别 2 标题后面跟着内容,因此幻灯片级别是 2。此默认值可以使用 --slide-level
选项覆盖。
文档根据以下规则被分割成幻灯片:
水平线始终开始一个新幻灯片。
幻灯片级别的标题始终开始一个新幻灯片。
层次结构中低于幻灯片级别的标题在幻灯片内部创建标题。(在 beamer 中,将创建一个“块”。如果标题具有
example
类,将使用exampleblock
环境;如果它具有alert
类,将使用alertblock
;否则将使用常规的block
。)层次结构中高于幻灯片级别的标题会创建“标题幻灯片”,其中只包含章节标题,有助于将幻灯片演示文稿分成若干部分。这些标题下的非幻灯片内容将包含在标题幻灯片中(对于 HTML 幻灯片演示文稿)或后续具有相同标题的幻灯片中(对于 beamer)。
如果存在文档的标题块,则会自动构建一个标题页。(对于 beamer,可以通过注释掉默认模板中的某些行来禁用此功能。)
这些规则旨在支持多种不同风格的幻灯片演示。如果您不关心将幻灯片结构化为章节和小节,则可以只对所有幻灯片使用一级标题(在这种情况下,一级将是幻灯片级别),或者将 --slide-level=0
。
注意:在 reveal.js 幻灯片演示中,如果幻灯片级别为 2,将生成二维布局,其中级别 1 标题水平构建,级别 2 标题垂直构建。不建议您在 reveal.js 中使用更深的节级别嵌套,除非您设置 --slide-level=0
(这允许 reveal.js 生成一维布局,并且只将水平线解释为幻灯片边界)。
PowerPoint 布局选择
创建幻灯片时,pptx 写入器根据幻灯片内容从多个预定义布局中选择:
- 标题幻灯片
- 此布局用于初始幻灯片,如果存在
date
、author
和title
元数据字段,则从中生成并填充。 - 节标题
- 此布局用于 Pandoc 所称的“标题幻灯片”,即以层次结构中高于幻灯片级别的标题开头的幻灯片。
- 两栏内容
- 此布局用于双列幻灯片,即包含一个类为
columns
的 div,且该 div 中包含至少两个类为column
且带有width
属性的 div 的幻灯片。 - 比较
- 此布局用于任何至少有一列包含文本后跟非文本(例如图像或表格)的双列幻灯片,替代“Two Content”布局。
- 带标题内容
- 此布局用于任何非双列幻灯片,其中包含文本后跟非文本(例如图像或表格)。
- 空白
- 此布局用于任何只包含空白内容的幻灯片,例如只包含演讲者备注的幻灯片,或只包含不间断空格的幻灯片。
- 标题和内容
- 此布局用于所有不符合其他布局标准的幻灯片。
这些布局选自 Pandoc 附带的默认 pptx 引用文档,除非使用 --reference-doc
指定了替代引用文档。
增量列表
默认情况下,这些写入器生成的列表会“一次性”显示。如果您希望列表增量显示(一次显示一个项目),请使用 -i
选项。如果您希望某个特定列表偏离默认设置,请将其放在类为 incremental
或 nonincremental
的 div
块中。因此,例如,使用 fenced div
语法,以下内容将是增量的,无论文档默认设置如何:
::: incremental
- Eat spaghetti
- Drink wine
:::
或者
::: nonincremental
- Eat spaghetti
- Drink wine
:::
虽然使用 incremental
和 nonincremental
div 是按情况设置增量列表的推荐方法,但也支持一种较旧的方法:将列表放在块引用中将偏离文档默认设置(即,在没有 -i
选项时增量显示,在有 -i
选项时一次性显示):
> - Eat spaghetti
> - Drink wine
两种方法都允许在单个文档中混合使用增量列表和非增量列表。
如果您想包含一个块引用的列表,您可以通过将列表放在一个围栏式 div 中来解决此行为,这样它就不是块引用的直接子元素:
> ::: wrapper
> - a
> - list in a quote
> :::
插入停顿
您可以通过包含一个包含三个点(用空格分隔)的段落来在幻灯片中添加“停顿”:
# Slide with a pause
content before the pause
. . .
content after the pause
注意:此功能尚未在 PowerPoint 输出中实现。
幻灯片样式
您可以通过将自定义 CSS 文件放置在 $DATADIR/s5/default
(用于 S5)、$DATADIR/slidy
(用于 Slidy)或 $DATADIR/slideous
(用于 Slideous)中来更改 HTML 幻灯片的样式,其中 $DATADIR
是用户数据目录(请参阅上文的--data-dir
)。原始文件可以在 Pandoc 的系统数据目录中找到(通常是 $CABALDIR/pandoc-VERSION/s5/default
)。Pandoc 将在那里查找在用户数据目录中找不到的任何文件。
对于 dzslides,CSS 包含在 HTML 文件本身中,可以在那里修改。
所有 reveal.js 配置选项都可以通过变量设置。例如,可以通过设置 theme
变量来使用主题:
-V theme=moon
或者您可以使用 --css
选项指定自定义样式表。
要设置 beamer 幻灯片的样式,可以使用 -V
选项指定 theme
、colortheme
、fonttheme
、innertheme
和 outertheme
:
pandoc -t beamer habits.txt -V theme:Warsaw -o habits.pdf
请注意,在 HTML 幻灯片格式中,标题属性将转换为幻灯片属性(在 <div>
或 <section>
上),允许您为单个幻灯片设置样式。在 beamer 中,许多标题类和属性被识别为帧选项,并将作为选项传递给帧:请参阅下面的beamer 中的帧属性。
演讲者备注
演讲者备注支持 reveal.js、PowerPoint (pptx) 和 beamer 输出。您可以在 Markdown 文档中添加备注,如下所示:
::: notes
This is my note.
- It can contain Markdown
- like this list
:::
要在 reveal.js 中显示备注窗口,请在查看演示文稿时按 s
。PowerPoint 中的演讲者备注将像往常一样在讲义和演示者视图中可用。
其他幻灯片格式尚不支持备注,但备注不会出现在幻灯片本身上。
列
要将内容并排放置在列中,可以使用类为 columns
的原生 div 容器,其中包含两个或更多类为 column
并带有 width
属性的 div 容器:
:::::::::::::: {.columns}
::: {.column width="40%"}
contents...
:::
::: {.column width="60%"}
contents...
:::
::::::::::::::
注意:目前,指定列宽对 PowerPoint 无效。
beamer 中的附加列属性
类为 columns
和 column
的 div 容器可以选择具有 align
属性。类为 columns
可以选择具有 totalwidth
属性或 onlytextwidth
类。
:::::::::::::: {.columns align=center totalwidth=8em}
::: {.column width="40%"}
contents...
:::
::: {.column width="60%" align=bottom}
contents...
:::
::::::::::::::
columns
和 column
上的 align
属性可与 top
、top-baseline
、center
和 bottom
值一起使用,以垂直对齐列。在 columns
中,它默认为 top
。
totalwidth
属性将列的宽度限制为给定值。
:::::::::::::: {.columns align=top .onlytextwidth}
::: {.column width="40%" align=center}
contents...
:::
::: {.column width="60%"}
contents...
:::
::::::::::::::
onlytextwidth
类将 totalwidth
设置为 \textwidth
。
有关更多详细信息,请参阅 Beamer 用户指南的第 12.7 节。
beamer 中的帧属性
有时需要在 beamer 中为帧添加 LaTeX [fragile]
选项(例如,在使用 minted
环境时)。这可以通过将 fragile
类添加到引入幻灯片的标题来强制实现:
# Fragile slide {.fragile}
《Beamer 用户指南》第 8.1 节中描述的所有其他帧属性也可以使用:allowdisplaybreaks
、allowframebreaks
、b
、c
、s
、t
、environment
、label
、plain
、shrink
、standout
、noframenumbering
、squeeze
。特别推荐 allowframebreaks
用于参考文献,因为它允许在内容溢出帧时创建多个幻灯片:
# References {.allowframebreaks}
此外,frameoptions
属性可用于将任意帧选项传递给 beamer 幻灯片:
# Heading {frameoptions="squeeze,shrink,customoption=foobar"}
reveal.js、beamer 和 pptx 中的背景
背景图像可以添加到独立的 reveal.js 幻灯片、beamer 幻灯片和 pptx 幻灯片中。
所有幻灯片上(beamer、reveal.js、pptx)
对于 beamer 和 reveal.js,background-image
配置选项可以在 YAML 元数据块中或作为命令行变量使用,以便在每张幻灯片上获得相同的图像。
请注意,对于 reveal.js,background-image
将用作 parallaxBackgroundImage
(见下文)。
对于 pptx,您可以使用一个 --reference-doc
,其中已在相关布局上设置了背景图像。
parallaxBackgroundImage
(reveal.js)
对于 reveal.js,还有一个 reveal.js 原生选项 parallaxBackgroundImage
,它生成一个视差滚动背景。您还必须设置 parallaxBackgroundSize
,并且可以选择设置 parallaxBackgroundHorizontal
和 parallaxBackgroundVertical
来配置滚动行为。有关这些选项含义的更多详细信息,请参阅 reveal.js 文档。
在 reveal.js 的概览模式下,视差背景图像将仅在第一张幻灯片上显示。
在单个幻灯片上(reveal.js、pptx)
要为特定的 reveal.js 或 pptx 幻灯片设置图像,请将 {background-image="/path/to/image"}
添加到幻灯片上的第一个幻灯片级别标题(甚至可以是空的)。
由于 HTML 写入器会透传未知属性,其他 reveal.js 背景设置也适用于单个幻灯片,包括 background-size
、background-repeat
、background-color
、transition
和 transition-speed
。(data-
前缀将自动添加。)
注意:为了与 reveal.js 保持一致,pptx 也支持 data-background-image
– 如果找不到 background-image
,将检查 data-background-image
。
在标题幻灯片上(reveal.js、pptx)
要为 reveal.js 自动生成的标题幻灯片添加背景图像,请在 YAML 元数据块中使用 title-slide-attributes
变量。它必须包含属性名称和值的映射。(请注意,此处需要 data-
前缀,因为它不会自动添加。)
对于 pptx,请传递一个设置了“标题幻灯片”布局背景图像的 --reference-doc
。
示例 (reveal.js)
---
title: My Slide Show
parallaxBackgroundImage: /path/to/my/background_image.png
title-slide-attributes:
data-background-image: /path/to/title_image.png
data-background-size: contain
---
## Slide One
Slide 1 has background_image.png as its background.
## {background-image="/path/to/special_image.jpg"}
Slide 2 has a special image for its background, even though the heading has no content.
EPUBs
EPUB 元数据
有两种方法可以为 EPUB 指定元数据。第一种是使用 --epub-metadata
选项,该选项以包含 都柏林核心元素 的 XML 文件作为参数。
第二种方法是使用 YAML,可以在 Markdown 文档中的 YAML 元数据块中,也可以在用 --metadata-file
指定的单独 YAML 文件中。以下是一个带有 EPUB 元数据的 YAML 元数据块示例:
---
title:
- type: main
text: My Book
- type: subtitle
text: An investigation of metadata
creator:
- role: author
text: John Smith
- role: editor
text: Sarah Jones
identifier:
- scheme: DOI
text: doi:10.234234.234/33
publisher: My Press
rights: © 2007 John Smith, CC BY-NC
ibooks:
version: 1.3.4
...
识别以下字段:
identifier
- 字符串值或具有
text
和scheme
字段的对象。scheme
的有效值为ISBN-10
,GTIN-13
,UPC
,ISMN-10
,DOI
,LCCN
,GTIN-14
,ISBN-13
,Legal deposit number
,URN
,OCLC
,ISMN-13
,ISBN-A
,JP
,OLCC
。 标题
- 字符串值,或带有
file-as
和type
字段的对象,或此类对象的列表。type
的有效值为main
,subtitle
,short
,collection
,edition
,extended
。 creator
- 字符串值,或包含
role
、file-as
和text
字段的对象,或此类对象的列表。role
的有效值为 MARC 关系者,但 Pandoc 会尝试将人类可读的版本(如“author”和“editor”)转换为相应的 MARC 关系者。 contributor
- 格式与
creator
相同。 日期
- 格式为
YYYY-MM-DD
的字符串值。(只需要年份。)Pandoc 会尝试转换其他常见的日期格式。 lang
(或旧版:language
)- 符合 BCP 47 格式的字符串值。如果未指定,Pandoc 将默认为本地语言。
subject
- 字符串值,或具有
text
、authority
和term
字段的对象,或此类对象的列表。authority
的有效值是 保留的权威值(目前有AAT
、BIC
、BISAC
、CLC
、DDC
、CLIL
、EuroVoc
、MEDTOP
、LCSH
、NDC
、Thema
、UDC
和WGS
)或标识自定义方案的绝对 IRI。term
的有效值由方案定义。 description
- 一个字符串值。
类型
- 一个字符串值。
format
- 一个字符串值。
relation
- 一个字符串值。
coverage
- 一个字符串值。
rights
- 一个字符串值。
belongs-to-collection
- 一个字符串值。标识 EPUB 出版物所属的集合名称。
group-position
group-position
字段表示 EPUB 出版物相对于属于同一belongs-to-collection
字段的其他作品的数字位置。封面图片
- 字符串值(封面图片路径)。
css
(或 legacy:stylesheet
)- 字符串值(CSS 样式表路径)。
页面阅读方向
ltr
或rtl
。指定spine
元素的page-progression-direction
属性。访问模式
- 字符串数组(schema)。默认为
["textual"]
。 足够的访问模式
- 字符串数组(schema)。默认为
["textual"]
。 无障碍危害
- 字符串数组(schema)。默认为
["none"]
。 无障碍特性
-
字符串数组(schema)。默认为
- "alternativeText" - "readingOrder" - "structuralNavigation" - "tableOfContents"
无障碍摘要
- 一个字符串值。
iBooks
-
iBooks 专用元数据,包含以下字段
version
: (字符串)specified-fonts
:true
|false
(默认false
)ipad-orientation-lock
:portrait-only
|landscape-only
iphone-orientation-lock
:portrait-only
|landscape-only
binding
:true
|false
(默认true
)scroll-axis
:vertical
|horizontal
|default
epub:type
属性
对于 epub3
输出,您可以使用 epub:type
属性来标记与 EPUB 章对应的标题。例如,要将属性设置为 prologue
值,请使用以下 Markdown
# My chapter {epub:type=prologue}
结果将是
<body epub:type="frontmatter">
<section epub:type="prologue">
<h1>My chapter</h1>
Pandoc 将输出 <body epub:type="bodymatter">
,除非您使用以下值之一,在这种情况下将输出 frontmatter
或 backmatter
。
第一个部分的 epub:type |
正文的 epub:type |
---|---|
序言 | 扉页 |
abstract | 扉页 |
致谢 | 扉页 |
版权页 | 扉页 |
献词 | 扉页 |
鸣谢 | 扉页 |
keywords | 扉页 |
版权说明 | 扉页 |
贡献者 | 扉页 |
其他鸣谢 | 扉页 |
勘误表 | 扉页 |
修订历史 | 扉页 |
标题页 | 扉页 |
副标题页 | 扉页 |
系列页 | 扉页 |
前言 | 扉页 |
序 | 扉页 |
卷首插画 | 扉页 |
附录 | 尾页 |
结语 | 尾页 |
bibliography | 尾页 |
索引 | 尾页 |
链接媒体
默认情况下,pandoc 会下载生成的 EPUB 中任何 <img>
、<audio>
、<video>
或 <source>
元素引用的媒体,并将其包含在 EPUB 容器中,从而生成一个完全自包含的 EPUB。如果您想链接外部媒体资源,请在源中使用原始 HTML,并在带有 src
属性的标签中添加 data-external="1"
。例如
<audio controls="1">
<source src="https://example.com/music/toccata.mp3"
data-external="1" type="audio/mpeg">
</source>
</audio>
如果输入格式已经是 HTML,那么 data-external="1"
将对 <img>
元素按预期工作。类似地,对于 Markdown,可以使用 {external=1}
声明外部图片。请注意,这仅适用于图片;其他媒体元素在 pandoc 的 AST 中没有原生表示,需要使用原始 HTML。
EPUB 样式
默认情况下,pandoc 会包含其 epub.css
数据文件中所含的一些基本样式。(要查看此内容,请使用 pandoc --print-default-data-file epub.css
。)要使用不同的 CSS 文件,只需使用--css
命令行选项。此外还定义了一些内联样式;这些对于 pandoc 的 HTML 输出的正确格式化至关重要。
如果需要 pandoc 默认 HTML 模板中更具主观性的样式,可以设置 document-css
变量(在这种情况下,HTML 变量中定义的变量可用于微调样式)。
分块 HTML
pandoc -t chunkedhtml
将生成一个包含链接 HTML 文件的 zip 存档,原始文档的每个部分对应一个文件。内部链接将自动调整以指向正确的位置,工作目录下链接的图片将被包含在内,并且将添加导航链接。此外,还将包含一个 sitemap.json
JSON 文件,描述文件的层次结构。
如果指定了不带扩展名的输出文件,则它将被解释为一个目录,并且 zip 存档将自动解压缩到其中(除非它已经存在,在这种情况下将引发错误)。否则将生成一个 .zip
文件。
导航链接可以通过调整模板进行自定义。默认情况下,目录仅包含在首页上。要在每个页面上包含它,请手动设置 toc
变量。
Jupyter 笔记
创建 Jupyter 笔记时,pandoc 将尝试推断笔记结构。带有 code
类的代码块将被视为代码单元格,而中间内容将被视为 Markdown 单元格。Markdown 单元格中的图片将自动创建附件。元数据将从 jupyter
元数据字段中获取。例如
---
title: My notebook
jupyter:
nbformat: 4
nbformat_minor: 5
kernelspec:
display_name: Python 2
language: python
name: python2
language_info:
codemirror_mode:
name: ipython
version: 2
file_extension: ".py"
mimetype: "text/x-python"
name: "python"
nbconvert_exporter: "python"
pygments_lexer: "ipython2"
version: "2.7.15"
---
# Lorem ipsum
**Lorem ipsum** dolor sit amet, consectetur adipiscing elit. Nunc luctus
bibendum felis dictum sodales.
``` code
print("hello")
```
## Pyout
``` code
from IPython.display import HTML
HTML("""
<script>
console.log("hello");
</script>
<b>HTML</b>
""")
```
## Image
This image  will be
included as a cell attachment.
如果您想添加单元格属性、以不同方式分组单元格或向代码单元格添加输出,则需要包含 div
来指示结构。您可以使用围栏式 div
或 原生 div
来实现此目的。这是一个例子
:::::: {.cell .markdown}
# Lorem
**Lorem ipsum** dolor sit amet, consectetur adipiscing elit. Nunc luctus
bibendum felis dictum sodales.
::::::
:::::: {.cell .code execution_count=1}
``` {.python}
print("hello")
```
::: {.output .stream .stdout}
```
hello
```
:::
::::::
:::::: {.cell .code execution_count=2}
``` {.python}
from IPython.display import HTML
HTML("""
<script>
console.log("hello");
</script>
<b>HTML</b>
""")
```
::: {.output .execute_result execution_count=2}
```{=html}
<script>
console.log("hello");
</script>
<b>HTML</b>
hello
```
:::
::::::
如果您在输出单元格中包含原始 HTML 或 TeX,请使用原始属性,如上例的最后一个单元格所示。尽管 pandoc 可以处理“裸”原始 HTML 和 TeX,但结果通常是原始元素和普通文本元素交错,而在输出单元格中,pandoc 期望一个单一的、连续的原始块。为了避免使用原始 HTML 或 TeX,除非使用原始属性明确标记,我们建议在 Markdown 和 ipynb
笔记之间转换时指定扩展 -raw_html-raw_tex+raw_attribute
。
请注意,影响 Markdown 读取和写入的选项和扩展也将影响 ipynb
笔记中的 Markdown 单元格。例如,--wrap=preserve
将保留 Markdown 单元格中的软换行符;--markdown-headings=setext
将导致使用 Setext 样式标题;而 --preserve-tabs
将阻止制表符转换为空格。
语法高亮
Pandoc 会自动高亮显示用语言名称标记的围栏代码块中的语法。Haskell 库 skylighting 用于高亮显示。目前,高亮显示仅支持 HTML、EPUB、Docx、Ms、Man 和 LaTeX/PDF 输出。要查看 pandoc 能识别的语言名称列表,请键入 pandoc --list-highlight-languages
。
颜色方案可以使用--highlight-style
选项选择。默认颜色方案是 pygments
,它模仿了 Python 库 pygments 使用的默认颜色方案(尽管 pygments 实际上并未用于高亮显示)。要查看高亮样式列表,请键入 pandoc --list-highlight-styles
。
如果您不满意预定义的样式,可以使用--print-highlight-style
生成一个 JSON .theme
文件,该文件可以修改并用作--highlight-style
的参数。例如,要获取 pygments
样式的 JSON 版本
pandoc -o my.theme --print-highlight-style pygments
然后编辑 my.theme
并像这样使用它
pandoc --highlight-style my.theme
如果您不满意内置的高亮显示,或者您想高亮显示不支持的语言,可以使用--syntax-definition
选项加载一个 KDE 风格的 XML 语法定义文件。在编写自己的文件之前,请查看 KDE 的语法定义仓库。
如果您收到 pandoc “无法读取高亮主题”的错误,请检查 JSON 文件是否使用 UTF-8 编码且没有字节顺序标记(BOM)。
要禁用高亮显示,请使用--no-highlight
选项。
自定义样式
自定义样式可用于 docx、odt 和 ICML 格式。
输出
默认情况下,pandoc 的 odt、docx 和 ICML 输出会为段落和块引用等块应用一组预定义样式,并为内联元素主要使用默认格式(斜体、粗体)。这适用于大多数用途,特别是与参考文档文件一起使用时。但是,如果您需要将自己的样式应用于块,或匹配一组预先存在的样式,pandoc 允许您分别使用 div
和 span
为块和文本定义自定义样式。
如果您定义了一个带有 custom-style
属性的 Div、Span 或 Table,pandoc 将把您指定的样式应用于包含的元素(除了其功能依赖于样式的元素,如标题、代码块、块引用或链接)。因此,例如,使用 bracketed_spans
语法,
[Get out]{custom-style="Emphatically"}, he said.
将生成一个文件,其中“Get out”使用字符样式 Emphatically
进行了样式设置。类似地,使用 fenced_divs
语法,
Dickinson starts the poem simply:
::: {custom-style="Poetry"}
| A Bird came down the Walk---
| He did not know I saw---
:::
将使用 Poetry
段落样式设置包含的两行的样式。
如果样式尚未在您的参考文档中定义,则样式将在输出文件中定义为继承自普通文本 (docx) 或默认段落样式 (odt)。如果它们已经定义,pandoc 将不会更改定义。
此功能与 pandoc 过滤器结合使用时,可实现最大程度的自定义。如果您希望块引用后的所有段落都缩进,您可以编写一个过滤器来应用必要的样式。如果您希望所有斜体都转换为 Emphasis
字符样式(可能为了改变它们的颜色),您可以编写一个过滤器,将所有斜体内联元素转换为 Emphasis
自定义样式 span
内的内联元素。
对于 docx 或 odt 输出,您无需启用任何扩展即可使自定义样式生效。
输入
默认情况下,docx 阅读器仅读取可以通过直接转换或解释输入文档样式派生来转换为 pandoc 元素的样式。
通过在 docx 阅读器中启用styles
扩展(-f docx+styles
),您可以生成保留输入文档样式、使用 custom-style
类的输出。每个样式都将添加一个 custom-style
属性。将创建 Div 以容纳段落样式,Span 以容纳字符样式。表格样式将直接应用于 Table。
例如,使用测试目录中的 custom-style-reference.docx
文件,我们有以下不同的输出
没有 +styles
扩展
$ pandoc test/docx/custom-style-reference.docx -f docx -t markdown
This is some text.
This is text with an *emphasized* text style. And this is text with a
**strengthened** text style.
> Here is a styled paragraph that inherits from Block Text.
并带有扩展
$ pandoc test/docx/custom-style-reference.docx -f docx+styles -t markdown
::: {custom-style="First Paragraph"}
This is some text.
:::
::: {custom-style="Body Text"}
This is text with an [emphasized]{custom-style="Emphatic"} text style.
And this is text with a [strengthened]{custom-style="Strengthened"}
text style.
:::
::: {custom-style="My Block Style"}
> Here is a styled paragraph that inherits from Block Text.
:::
有了这些自定义样式,您可以在创建 docx 输出时(见下文)使用输入文档作为参考文档,并在输入和输出文件中保持相同的样式。
自定义读取器和写入器
Pandoc 可以通过用 Lua 编写的自定义读取器和写入器进行扩展。(Pandoc 包含一个 Lua 解释器,因此无需单独安装 Lua。)
要使用自定义读取器或写入器,只需指定 Lua 脚本的路径来代替输入或输出格式。例如
pandoc -t data/sample.lua
pandoc -f my_custom_markup_language.lua -t latex -s
如果脚本在工作目录中找不到,它将在用户数据目录的 custom
子目录中查找(参见--data-dir
)。
自定义读取器是一个 Lua 脚本,它定义了一个函数 Reader
,该函数以字符串作为输入并返回一个 Pandoc AST。有关可用于创建 pandoc AST 元素的函数的文档,请参阅 Lua 过滤器文档。对于解析,默认情况下提供了 lpeg 解析库。要查看自定义读取器示例
pandoc --print-default-data-file creole.lua
如果您希望自定义读取器能够访问读取器选项(例如制表位设置),则可以为您的 Reader
函数提供第二个 options
参数。
自定义写入器是一个 Lua 脚本,它定义了一个函数,用于指定如何渲染 Pandoc AST 中的每个元素。有关功能齐全的示例,请参阅 djot-writer.lua。
请注意,自定义写入器没有默认模板。如果您想将--standalone
与自定义写入器一起使用,您需要使用--template
手动指定模板,或者将一个名为 default.NAME_OF_CUSTOM_WRITER.lua
的新默认模板添加到用户数据目录的 templates
子目录中(参见Templates)。
可复现构建
Pandoc 目标的一些文档格式(例如 EPUB、docx 和 ODT)在生成的文档中包含构建时间戳。这意味着即使源文件没有改变,连续构建生成的文件也会不同。为避免此问题,请设置 SOURCE_DATE_EPOCH
环境变量,时间戳将从中获取而不是当前时间。SOURCE_DATE_EPOCH
应包含一个整数 Unix 时间戳(指定自协调世界时 1970 年 1 月 1 日午夜以来的秒数)。
某些文档格式还包含唯一标识符。对于 EPUB,可以通过设置 identifier
元数据字段明确设置此项(参见上文EPUB 元数据)。
无障碍 PDF 和 PDF 归档标准
PDF 是一种灵活的格式,在特定上下文中使用 PDF 需要遵循额外的约定。例如,PDF 默认情况下不可访问;它们定义了字符如何在页面上放置,但不包含内容的语义信息。然而,可以生成可访问的 PDF,它们使用标签为文档添加语义信息。
Pandoc 默认使用 LaTeX 生成 PDF。LaTeX 中的标签支持正在开发中,尚未完全可用,因此以这种方式生成的 PDF 将始终未加标签且不可访问。这意味着必须使用其他引擎来生成可访问的 PDF。
PDF 标准 PDF/A 和 PDF/UA 定义了旨在优化 PDF 以进行归档和可访问性的进一步限制。标签通常与这些标准结合使用以确保最佳结果。
但请注意,标准合规性取决于许多因素,包括嵌入图像的色彩空间。Pandoc 无法检查此项,必须使用外部程序来确保生成的 PDF 符合标准。
ConTeXt
ConTeXt 总是生成带标签的 PDF,但质量取决于输入。Pandoc 生成的默认 ConTeXt 标记针对可读性和重用进行了优化,而不是标签。启用tagging
格式扩展以强制生成针对标签优化的标记。例如
pandoc -t context+tagging doc.md -o doc.pdf
应使用最新版本的 context
,因为旧版本包含导致 PDF 元数据无效的错误。
WeasyPrint
基于 HTML 的引擎 WeasyPrint 自 57 版本起包含了对 PDF/A 和 PDF/UA 的实验性支持。可以创建带标签的 PDF:
pandoc --pdf-engine=weasyprint \
--pdf-engine-opt=--pdf-variant=pdf/ua-1 ...
该功能是实验性的,不应假定其符合标准。
Prince XML
非免费的 HTML-to-PDF 转换器 prince
对各种 PDF 标准和标签都有广泛的支持。例如:
pandoc --pdf-engine=prince \
--pdf-engine-opt=--tagged-pdf ...
有关更多信息,请参阅 prince
文档。
Typst
Typst 0.12 可以生成 PDF/A-2b
pandoc --pdf-engine=typst --pdf-engine-opt=--pdf-standard=a-2b ...
文字处理器
LibreOffice 和 MS Word 等文字处理器也可用于生成标准化和带标签的 PDF 输出。Pandoc 不支持通过这些工具进行直接转换。但是,pandoc 可以将文档转换为 docx
或 odt
文件,然后可以使用相应的文字处理器打开并转换为 PDF。有关更多信息,请参阅 Word 和 LibreOffice 的文档。
将 pandoc 作为 Web 服务器运行
如果您将 pandoc 可执行文件重命名(或创建符号链接)为 pandoc-server
,或者在调用 pandoc 时将 server
作为第一个参数,它将启动一个带有 JSON API 的 Web 服务器。此服务器暴露了 pandoc 的大部分转换功能。有关完整文档,请参阅 pandoc-server 手册页。
如果您将 pandoc 可执行文件重命名(或创建符号链接)为 pandoc-server.cgi
,它将作为一个 CGI 程序运行,暴露与 pandoc-server
相同的 API。
pandoc-server
旨在实现最大限度的安全性;它使用 Haskell 的类型系统来提供强大的保证,即在 pandoc 转换期间不会在服务器上执行任何 I/O。
将 pandoc 作为 Lua 解释器运行
以 pandoc-lua
名称或将 lua
作为第一个参数调用 pandoc 可执行文件,将使其作为独立的 Lua 解释器运行。其行为与版本 5.4 的独立 lua
可执行文件基本相同。所有 pandoc.*
包,以及 re
和 lpeg
包,都通过全局变量可用。此外,全局变量 PANDOC_VERSION
、PANDOC_STATE
和 PANDOC_API_VERSION
在启动时设置。有关完整文档,请参阅 pandoc-lua 手册页。
安全注意事项
尽管 pandoc 本身不会创建或修改您明确要求它创建的文件(用于生成 PDF 的临时文件除外),但过滤器或自定义写入器原则上可以在您的文件系统上执行任何操作。在使用过滤器和自定义写入器之前,请非常仔细地审计它们。
几种输入格式(包括 LaTeX、Org、RST 和 Typst)支持
include
指令,允许将文件内容包含在输出中。不受信任的攻击者可能会利用这些指令查看文件系统上的文件内容。(使用--sandbox
选项可以防止这种威胁。)几种输出格式(包括 RTF、FB2、带有
--self-contained
的 HTML、EPUB、Docx 和 ODT)会将编码或原始图像嵌入到输出文件中。不受信任的攻击者可能会利用此漏洞查看文件系统上非图像文件的内容。(使用--sandbox
选项可以防止这种威胁,但也会阻止在这些格式中包含图像。)在读取 HTML 文件时,pandoc 将尝试通过从本地文件或
src
指定的 URL 获取内容来包含iframe
元素的内容。如果在服务器上处理不受信任的 HTML,这可能会暴露运行服务器的进程可读取的任何内容。使用-f html+raw_html
将导致整个iframe
被解析为原始 HTML 块,从而减轻此威胁。使用--sandbox
也可以防止这种威胁。如果您的应用程序将 pandoc 作为 Haskell 库使用(而不是通过执行外部命令),则可以通过在
PandocPure
monad 中运行 pandoc 操作,以完全隔离 pandoc 与您的文件系统的方式使用它。有关更多详细信息,请参阅文档使用 pandoc API。(这对应于命令行上使用--sandbox
选项。)Pandoc 的解析器在某些极端情况下可能会表现出病态性能。将任何 pandoc 操作置于超时控制下是明智的,以避免利用这些问题的 DOS 攻击。如果您正在使用 pandoc 可执行文件,可以添加命令行选项
+RTS -M512M -RTS
(例如)以将堆大小限制为 512MB。请注意,commonmark
解析器(包括commonmark_x
和gfm
)比markdown
解析器更不容易出现病态性能问题,因此在处理不受信任的输入时是更好的选择。Pandoc 生成的 HTML 不保证安全。如果 Markdown 输入启用了
raw_html
,用户可以注入任意 HTML。即使禁用了raw_html
,用户也可以在 URL 和属性中包含危险内容。为了安全起见,您应该通过 HTML 清理器处理所有从不受信任的用户输入生成的 HTML。
此规则的目的是确保以人名首字母开头的普通段落,例如:
B. Russell won a Nobel Prize (but not for "On Denoting").
不被视为列表项。
此规则不会阻止
(C) 2007 Joe Smith
被解释为列表项。在这种情况下,可以使用反斜杠转义:
↩︎(C\) 2007 Joe Smith
我受到了 David Wheeler 建议的影响。↩︎
该方案由 Michel Fortin 提出,他在 Markdown 讨论列表上提出了此方案。↩︎
要了解为什么惰性与放宽项目之间空行要求不兼容,请考虑以下示例
bar : definition foo : definition
这到底是一个包含“bar”的两个定义(其中第一个是惰性换行)的单个列表项,还是两个列表项?为了消除歧义,我们必须要么禁止惰性换行,要么要求列表项之间有一个空行。↩︎
注释
序列
$--
和行尾之间的任何内容都将被视为注释并从输出中省略。