如何避免Pandoc导出PDF时代码块内出现分页?
解决Pandoc导出PDF时代码块内分页的问题
全局生效方案
方法1:命令行嵌入LaTeX预处理代码
直接在导出命令中添加LaTeX规则,强制所有代码块禁止内部分页:
pandoc input.md -o output.pdf --pdf-engine=xelatex -V preamble="\usepackage{etoolbox}\AtBeginEnvironment{Shaded}{\vspace*{0pt}\nobreak\interlinepenalty=10000}\AtEndEnvironment{Shaded}{\nobreak\vspace*{0pt}}\AtBeginEnvironment{verbatim}{\vspace*{0pt}\nobreak\interlinepenalty=10000}\AtEndEnvironment{verbatim}{\nobreak\vspace*{0pt}}"
Shaded是Pandoc带语法高亮时的代码块环境,verbatim是无高亮时的环境\interlinepenalty=10000大幅提升代码行间的分页惩罚值,阻止分页触发\nobreak确保代码块前后不会触发分页
如果命令行过长,可将LaTeX代码写入单独文件(如no-code-pagebreak.tex),再通过参数引入:
% no-code-pagebreak.tex 内容 \usepackage{etoolbox} \AtBeginEnvironment{Shaded}{\vspace*{0pt}\nobreak\interlinepenalty=10000} \AtEndEnvironment{Shaded}{\nobreak\vspace*{0pt}} \AtBeginEnvironment{verbatim}{\vspace*{0pt}\nobreak\interlinepenalty=10000} \AtEndEnvironment{verbatim}{\nobreak\vspace*{0pt}}
执行导出命令:
pandoc input.md -o output.pdf --pdf-engine=xelatex -H no-code-pagebreak.tex
方法2:修改自定义LaTeX模板
若需长期使用该设置,可修改Pandoc默认模板:
- 导出默认模板:
pandoc -D latex > my-custom-template.tex
- 在模板的
\usepackage{...}代码块末尾,添加上述LaTeX设置代码 - 导出时指定自定义模板:
pandoc input.md -o output.pdf --pdf-engine=xelatex --template=my-custom-template.tex
单个代码块生效方案
方法1:用LaTeX作用域包裹代码块
通过{}限制分页规则的作用范围,仅对目标代码块生效:
{\interlinepenalty=10000
# 此代码块不会被分页打断 def calculate_sum(numbers): total = 0 for num in numbers: total += num return total
}
方法2:代码块前后添加分页禁止标记
在目标代码块的前后插入LaTeX命令,直观控制分页:
\vspace*{0pt}\nobreak
// 无分页的代码块示例 const arr = [1, 2, 3, 4, 5]; const doubled = arr.map(item => item * 2); console.log(doubled);
\nobreak\vspace*{0pt}
\vspace*{0pt}确保命令正常触发,避免与周围内容的排版冲突
内容的提问来源于stack exchange,提问作者J. Mini
相关产品推荐
相关产品推荐

