文件內容*環境中的巨集/命令不會擴展

文件內容*環境中的巨集/命令不會擴展

我想就以下問題尋求您的協助。

考慮以下 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它不能「簡單地擴展到」文本。

相關內容