如何在Pandoc命令行元数据标题中嵌入LaTeX符号?
Pandoc命令行传递LaTeX标题被转义的解决办法
问题背景
通过Makefile批量调用Pandoc生成笔记,命令示例如下:
pandoc foo.md -o foo.tex -M title='Some Notes on $x^{y^z}\pi$' --template=mytemplate.pandoc
模板通过$title$插入标题,但Pandoc会自动转义标题中的LaTeX代码(例如将$x^{y^z}\pi$转为\$x\^{}\{y\^{}z\}\textbackslash\textbackslash pi\$),导致LaTeX编译时无法正确渲染数学公式。已确认Makefile中的转义逻辑正确,但Pandoc的转义处理破坏了原有格式,需找到无需单独生成模板的解决方案。
可行解决方案
方案1:用原始属性标记LaTeX代码
在传递标题参数时,用{=latex}标记告诉Pandoc这是原生LaTeX代码,跳过转义处理。Makefile中命令修改如下:
main: ./foo1.tex ./foo2.tex ./foo1.tex: ./foo.md pandoc $< -o $@ -M title='Some Notes on the `\[x^{y^z}\pi\]`{=latex}' --template=foo.pandoc echo '\[x^{y^z}\pi\]' ./foo2.tex: ./foo.md pandoc $< -o $@ -M title='Some Notes on the `$$x^{y^z}\pi$$`{=latex}' --template=foo.pandoc echo '$$x^{y^z}\pi$$'
方案2:修改模板使用未转义变量
Pandoc模板默认会对变量进行转义,可直接使用未转义版本的变量$title.raw$替代$title$,这样Pandoc会原样插入变量内容。
修改foo.pandoc模板的标题行:
\title{$title.raw$}
此方法无需修改命令行参数,适合确定标题始终包含LaTeX代码的场景。
方案3:环境变量传递内容避免Shell转义
若Makefile中的引号转义过于繁琐,可将标题内容存入环境变量,再传递给Pandoc,同时配合$title.raw$使用:
main: ./foo1.tex ./foo2.tex ./foo1.tex: ./foo.md export TITLE='Some Notes on the \[x^{y^z}\pi\]'; pandoc $< -o $@ -M title="$$TITLE" --template=foo.pandoc echo '\[x^{y^z}\pi\]' ./foo2.tex: ./foo.md export TITLE='Some Notes on the $$x^{y^z}\pi$$'; pandoc $< -o $@ -M title="$$TITLE" --template=foo.pandoc echo '$$x^{y^z}\pi$$'
内容的提问来源于stack exchange,提问作者Kensmosis
相关产品推荐
相关产品推荐

