我的目标是从主输入文件中自动编译参数化模板。对于每个编译,都会将唯一的作业名称和参数传递给编译器。问题是,传递参数需要我以正确的顺序管理扩展和取消扩展。
考虑 MWE 的重要部分,
\immediate\write18{pdflatex -jobname=\outputfilename\space "\def\name{\target} \input{template}"}
必须\target
扩大,而\def\name
必须不扩大。
\documentclass[preview,border=12pt]{standalone}
\usepackage{filecontents}
\begin{filecontents*}{template.tex}
\documentclass[preview,border=12pt]{standalone}
\begin{document}
Hello \name
\end{document}
\end{filecontents*}
\usepackage{pgffor,graphicx}
\foreach \outputfilename/\target in {a/Andy,b/Bill,c/Charlie}{\immediate\write18{pdflatex -jobname=\outputfilename\space "\def\name{\target} \input{template}"}}
\begin{document}
The files we created automatically are:
\foreach \outputfilename in {a,b,c}{\fbox{\includegraphics[scale=2]{\outputfilename}}\endgraf}
\end{document}
我还没有学过 token 扩展,所以这种情况对我日常使用 TeX 来说非常麻烦。如何管理这些扩展?
答案1
该\write
操作执行扩展,类似于\edef
。因此,您需要\noexpand
保护任何需要“单独保留”的标记。你有:
\outputfilename
\target
\space
扩大和
\def
\name
\input
不受干扰。其中,\def
无论如何都是不可扩展的原语,因此您只需要两个\noexpand
:
\documentclass[preview,border=12pt]{standalone}
\usepackage{filecontents}
\begin{filecontents*}{template.tex}
\documentclass[preview,border=12pt]{standalone}
\begin{document}
Hello \name
\end{document}
\end{filecontents*}
\usepackage{pgffor,graphicx}
\foreach \outputfilename/\target in {a/Andy,b/Bill,c/Charlie}
{\immediate\write18{pdflatex -jobname=\outputfilename\space
"\def\noexpand\name{\target} \noexpand\input{template}"}}
\begin{document}
The files we created automatically are:
\foreach \outputfilename in {a,b,c}{\fbox{\includegraphics[scale=2]{\outputfilename}}\endgraf}
\end{document}
答案2
\foreach \outputfilename/\target in {a/Andy,b/Bill,c/Charlie}{%
\immediate\write18{pdflatex -jobname=\outputfilename\space
"\def \string\name {\target} \string\input{template}"}}