对于这种情况,如何管理扩展?

对于这种情况,如何管理扩展?

我的目标是从主输入文件中自动编译参数化模板。对于每个编译,都会将唯一的作业名称和参数传递给编译器。问题是,传递参数需要我以正确的顺序管理扩展和取消扩展。

考虑 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}"}}

相关内容