![filecontents* 环境内的宏/命令不会扩展](https://linux22.com/image/410269/filecontents*%20%E7%8E%AF%E5%A2%83%E5%86%85%E7%9A%84%E5%AE%8F%2F%E5%91%BD%E4%BB%A4%E4%B8%8D%E4%BC%9A%E6%89%A9%E5%B1%95.png)
我希望就以下问题寻求您的帮助。
考虑以下 MWE1:
\documentclass{article}
\usepackage{filecontents}
\begin{document}
Hi
\begin{filecontents*}{dummy.tex}
some text and math here $A=s^2$
\end{filecontents*}
\end{document}
运行正常。创建了一个外部文件“dummy.tex”,其内容为“此处的一些文本和数学 $A=s^2$”。
现在,考虑以下 MWE2:
\documentclass{article}
\usepackage{filecontents}
\newcommand*{\somecommand}{some text and math here $A=s^2$}%
\begin{document}
Hi
\begin{filecontents*}{dummy.tex}
\somecommand
\end{filecontents*}
\end{document}
还创建了一个外部文件“dummy.tex”,但内容为“\somecommand”。我希望该文件包含“此处的一些文本和数学 $A=s^2$”。
现在,考虑以下 MWE3:
\documentclass{article}
\usepackage{ifthen}
\usepackage{filecontents}
\newcommand*{\somecommandA}{some text and math here $A=s^2$}%
\newcommand*{\somecommandB}{5}%
\begin{document}
Hi
\begin{filecontents*}{dummy.tex}
\somecommandA
\\
\ifthenelse{\equal{\somecommandB}{5}}{5}{4}
\end{filecontents*}
\end{document}
还会创建一个外部文件“dummy.tex”,但内容为
\somecommandA
\\
\ifthenelse{\equal{\somecommandB}{5}}{5}{4}
我想要的是文件包含
some text and math here $A=s^2$
5
有没有办法我们可以将命令和宏放入filecontents*
环境中,并让外部文件包含扩展的命令和宏?(我理解filecontents*
行为就像逐字一样。)如果没有filecontents*
,是否有其他包/环境可以实现这一点?
恳请您的帮助。谢谢。
答案1
正如你对自己的诊断一样,filecontents
逐字逐句地读,所以\command
和zcommand
几乎是相同的。
只需进行一些更改,就可以使 MWE2 正常工作,因为它\somecommand
是一个简单的宏,可以扩展为文本。例如,这是一个\filecontentsspecials<esc><bgroup><egroup>
宏,它使下一个filecontents
环境使用字符<esc>
作为转义字符(通常为\
),<bgroup>
作为开始和<egroup>
结束组字符(通常分别为{
和}
)。重要的: \filecontentsspecials\\\{\}
将要不是有效。所选字符不能是\\\{\}
。|[]
,例如 是有效的。
使用 后\filecontentsspecials
,下一个(且只有下一个)filecontents
将执行其内容的填充扩展,扩展宏。事情不是要扩展的应该以 为前缀|noexpand
或包裹在 中|unexpanded[...]
。以下是代码:
\def\filecontentsspecials#1#2#3{
\global\let\ltxspecials\dospecials
\gdef\dospecials{\ltxspecials
\catcode`#1=0
\catcode`#2=1
\catcode`#3=2
\global\let\dospecials\ltxspecials
}
}
\documentclass{article}
\newcommand*{\somecommand}{some text and math here $A=s^2$}%
\begin{document}
Hi
\filecontentsspecials|[]
\begin{filecontents*}[overwrite]{dummy.tex}
|somecommand % this expands
\somecommand % this does not
\end{filecontents*}
\end{document}
该文件将包含:
some text and math here $A=s^2$ % this expands
\somecommand % this does not
MWE3 是不可能的(至少在付出合理努力的情况下),因为\ifthenelse
它不能“简单地扩展”为文本。