如何在LaTeX中执行shell命令并将输出插入生成的PDF文件
问题原因及解决方法
空文件生成的核心原因
- LaTeX执行
\write18时的工作目录和你手动执行命令的终端目录不一致,找不到对应*.py文件,grep执行无输出 - grep匹配不到内容时返回非0退出码,会被
\write18判定为执行失败,截断输出 - 错误输出未被重定向,执行报错时无内容写入文件
完整修复方案
步骤1:修正shell命令写法
优先推荐导入currfile包自动获取当前tex文件所在目录,避免硬编码路径,导言区完整代码如下:
\usepackage{verbatim} \usepackage{currfile} % 用于自动获取当前tex文件目录 % 执行grep命令,写入输出文件 \immediate\write18{cd "\currfiledir" && grep -FIrn TODO *.py > scriptoutput.txt 2>&1 || echo "当前暂无待完成TODO项" > scriptoutput.txt}
命令各部分说明:
cd "\currfiledir":切换到当前tex文件所在目录,确保能找到同目录下的py文件2>&1:将grep的错误输出也重定向到目标文件,执行报错时也能看到错误信息排查问题|| echo ...:grep匹配不到内容或者执行出错时,兜底写入提示文本,避免完全空输出
步骤2:正文插入TODO内容
在「未来工作」章节插入如下代码即可将结果写入PDF:
\section{未来工作} \verbatiminput{scriptoutput.txt}
步骤3:确认编译参数
确认你的编译工具的pdflatex命令已正确添加--shell-escape参数,示例编译命令如下:
pdflatex --shell-escape -synctex=1 -interaction=nonstopmode 你的文件名.tex
如果使用TeXstudio等IDE,需要在构建配置的Pdflatex命令中添加该参数。
可选优化
如果需要更美观的带格式输出,可以替换verbatim包为listings包,自定义代码块样式展示TODO列表。
内容的提问来源于stack exchange,提问作者Joshua Snider
相关产品推荐
相关产品推荐

