pandoc 处理部分
翻译一段 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
将返回salary
对象字段的值,即employee
字段的值。
- 如果变量的值为简单值,则将逐字呈现。(请注意,没有进行转义;假定调用程序将为输出格式适当地对字符串进行转义。)
- 如果值是列表,则将这些值连接在一起。
- 如果该值为地图,
true
则将呈现字符串。- 每隔一个值将被呈现为空字符串。
条件
条件以
if(variable)
开始(用匹配的分隔符括起来),以endif
结束(用匹配的分隔符括起来)。它可以选择包含一个else
(包含在匹配的分隔符中)。如果variable
有非空值,则使用if
部分,否则使用else
部分(如果存在)。例子:
$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
可以用来简化复杂的嵌套条件:
XXX
YYY
ZZZ
到了这里,基本可以制作一个自己的(较为简单的)模板了。
pandoc 默认模板
pandoc 默认模板的地址为 https://github.com/jgm/pandoc-templates/blob/master/default.latex,基本上对照着 pandoc 官网的手册,是能够读懂的。
pandoc 提供如此多的选项可能是考虑用户不需要学会如何编写 文件,这种考虑对于 用户可能是多余的。甚至于默认模板的中文处理方式是不太好的(提供了 xeCJK
的选项,不如直接 ctex
宏集,见《处理中文时应该用ctex宏包还是应该用xeCJK宏包?》)。
因此我们可以直接删除大部分内容,只留下我们需要的,再编写自己的模板。
例子
我自己随便弄了个例子:
这是模板文件
% templatex.latex |
这是 markdown 文件
<!-- test.md --> |
命令行执行
pandoc test.md --template=templatex.latex --pdf-engine=xelatex -o test.pdf |
即可完成转换。
优缺点
优点:
- 输入方便
- 只需要编写一个模板就能满足自己的需求(通过添加选项来控制加载的宏包、使用的样式)
缺点:
- 精细控制还是得靠
- 运行速度慢,比直接纯 编译慢太多