Pandoc中.sty文件无法解析模板变量的解决方案咨询
Pandoc官方LaTeX模板中自定义.sty调用元数据变量的解决方案
问题核心
官方LaTeX模板里的$title$、$classification$这类是Pandoc模板语法,仅在Pandoc处理模板文件时会被解析替换;直接在自定义.sty文件中写这些变量,Pandoc不会处理,只会原样输出。而之前用\@title的方式失效,是因为.sty加载时机早于Pandoc在模板中设置\@title的时机,此时\@title还未被赋值。
可行方案(无需Lua过滤器)
通过在header-includes中用Pandoc模板语法预定义LaTeX宏,再在.sty中调用这些宏即可解决。
步骤1:修改metadata.yml,预定义LaTeX宏
在header-includes中先基于Pandoc元数据定义宏,再加载自定义.sty:
documentclass: article lang: english fontsize: 12pt papersize: a4 toc: true header-includes: - \newcommand{\doctitle}{$title$} - \newcommand{\docclassification}{$classification$} - \usepackage{mystyle} # 先定义宏再加载样式文件 geometry: - headheight=2cm - footskip=4cm
Pandoc会先将$title$、$classification$替换为Markdown元数据中的实际值,生成对应的LaTeX命令,再加载.sty。
步骤2:修改mystyle.sty,调用预定义宏
将原文件中的变量替换为预定义的LaTeX命令:
\usepackage{fancyhdr} \pagestyle{fancy} \fancyhead{} \fancyfoot{} \fancyhead[L]{\doctitle} % 调用预定义的标题宏 \fancyfoot[R]{Page \thepage} \fancyfoot[C]{Classification: \docclassification} % 调用预定义的分类宏
验证执行
运行原转换命令即可生成正确解析变量的PDF:
pandoc --defaults pandoc.yml input.md
补充说明
如果需要调用更多元数据(如author、version等),只需在header-includes中添加对应的宏定义即可,例如:
header-includes: - \newcommand{\doctitle}{$title$} - \newcommand{\docclassification}{$classification$} - \newcommand{\docauthor}{$author$} - \usepackage{mystyle}
然后在.sty中调用\docauthor即可。
内容的提问来源于stack exchange,提问作者Christoph Pelzer
相关产品推荐
相关产品推荐

