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*verbatim のように動作すると理解しています。) そうでない場合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

\ifthenelseMWE3 は、テキストに「単純に展開」されないため、(少なくとも、相当な労力をかけて)不可能です。

関連情報