filecontents* 环境内的宏/命令不会扩展

filecontents* 环境内的宏/命令不会扩展

我希望就以下问题寻求您的帮助。

考虑以下 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逐字逐句地读,所以\commandzcommand几乎是相同的。

只需进行一些更改,就可以使 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它不能“简单地扩展”为文本。

相关内容