我希望能够创建一个 TeX 文件,只需一次编译即可输出多个 PDF 文件。我甚至不确定这是否可行。以下是设置:
我正在写几十封求职信,希望它们看起来都“个性化”。所以我定义了一个函数,它调用多个变量,例如地址、机构名称、空缺职位等,并为每个函数调用输出一封“个性化”求职信。问题是 TeX 文件的编译只输出一个文件。由于我最终会在线提交所有这些文件,我希望每封信都在自己的文件中。有没有办法在 TeX 级别做到这一点?
答案1
您如何存储这些信息?您可以为每个字母创建一个信息文件
% letter1.adr
\def\toname{Foo}
和
% letter2.adr
\def\toname{Bar}
然后有一个主文件
% main.tex
\documentclass[addrfield]{scrlttr2}
\input \jobname.adr
\begin{document}
\begin{letter}{\toname}
\opening{Dear \toname, }
A nice letter.
\end{letter}
\end{document}
然后你可以用类似下面的命令从命令行编译所有字母
对于(*.adr)中的%i,请执行pdflatex -jobname =%i main.tex
这科玛束还提供了用于更复杂的地址文件的工具。
答案2
\write18
是的,如果您启用(例如pdflatex --shell-escape
使用 MiKTeX),这是可能的。然后您可以pdflatex
在文档中再次调用。举个例子(代码不是我写的)。它将生成三个文档\jobname1
- \jobname3
:
不区分大小写的操作系统(例如 Windows/MacOS)
\documentclass{article}
\ifx\conditionmacro\undefined
\immediate\write18{%
pdfLaTeX --jobname="\jobname1"
\gdef\string\conditionmacro{1}\string\input\space\jobname
}%
\immediate\write18{%
pdfLaTeX --jobname="\jobname2"
\gdef\string\conditionmacro{2}\string\input\space\jobname
}%
\immediate\write18{%
pdfLaTeX --jobname="\jobname3"
\gdef\string\conditionmacro{3}\string\input\space\jobname
}%
\expandafter\stop
\fi
\begin{document}
\ifnum\conditionmacro=1 Condition is 1\fi
\ifnum\conditionmacro=2 Condition is 2\fi
\ifnum\conditionmacro=3 Condition is 3\fi
\verb|\conditionmacro| is \texttt{\meaning\conditionmacro}.
\end{document}
区分大小写的操作系统(例如 Linux)
正如 Martin Heller 的评论中所述,您需要针对区分大小写的操作系统将此代码更改为:
\documentclass{article}
\ifx\conditionmacro\undefined
\immediate\write18{%
pdflatex --jobname="\jobname1"
"\gdef\string\conditionmacro{1}\string\input\space\jobname"
}%
\immediate\write18{%
pdflatex --jobname="\jobname2"
"\gdef\string\conditionmacro{2}\string\input\space\jobname"
}%
\immediate\write18{%
pdflatex --jobname="\jobname3"
"\gdef\string\conditionmacro{3}\string\input\space\jobname"
}%
\expandafter\stop
\fi
\begin{document}
\ifnum\conditionmacro=1 Condition is 1\fi
\ifnum\conditionmacro=2 Condition is 2\fi
\ifnum\conditionmacro=3 Condition is 3\fi
\verb|\conditionmacro| is \texttt{\meaning\conditionmacro}.
\end{document}
针对 lualatex 进行编辑
在较新的 luatex 版本中,\write18 不再具有特殊含义,不能像这样使用。然后您需要重载的 shellesc 包\write
。它还提供了一个\ShellEscape
可用于(也用于 pdflatex)代替原始命令的包。示例如下所示。
\documentclass{article}
\usepackage{shellesc}
\ifx\conditionmacro\undefined
\ShellEscape{%
lualatex --jobname="\jobname1"
"\gdef\string\conditionmacro{1}\string\input\space\jobname"
}%
\ShellEscape{%
lualatex --jobname="\jobname2"
"\gdef\string\conditionmacro{2}\string\input\space\jobname"
}%
\ShellEscape{%
lualatex --jobname="\jobname3"
"\gdef\string\conditionmacro{3}\string\input\space\jobname"
}%
\expandafter\stop
\fi
\begin{document}
\ifnum\conditionmacro=1 Condition is 1\fi
\ifnum\conditionmacro=2 Condition is 2\fi
\ifnum\conditionmacro=3 Condition is 3\fi
\verb|\conditionmacro| is \texttt{\meaning\conditionmacro}.
\end{document}
答案3
答案4
您可以按照 Patrick 所说的去做,也可以从脚本语言(例如,Perl + Template Toolkit)生成 TeX 文件,然后使用环境变量传递参数。
例如在 Linux 上使用 bash,你可以这样做
$ PARAM1=VALUE1 PARAM2=VALUE2 perl ./compile.pl