マクロによって解析されるトークンのシーケンスが非常に長い可能性があります。可能であれば、このシーケンスの一部を外部ファイルから読み取れるようにしたいと思います。
この問題に対して、MWE を作成しました。マクロは、、、および\myparse
で構成されるトークンのシーケンスを解析します。解析は で終了します。a
b
c
X
ここで、さらにトークンを追加し、i
その後にファイル名を追加しましたi{extern.inc}
。解析されたファイルの内容extern.inc
。
ファイルextern.inc
には次の内容が含まれます。
aaaabcabcccc
私のMWEは次のとおりです:
\documentclass{article}
\def\myparse{%
\afterassignment\myhandle\let\mytoken=%
}
\def\myhandle{%
\ifx\mytoken X%
\let\next=\nextX%
\else%
\ifx\mytoken a%
\let\next=\nexta%
\else%
\ifx\mytoken b%
\let\next=\nextb%
\else%
\ifx\mytoken c%
\let\next=\nextc%
\else%
\ifx\mytoken i%
\let\next=\nexti%
\fi%
\fi%
\fi%
\fi%
\fi%
\next%
}
\def\nextX{}
\def\nexta{(A)\myparse}
\def\nextb{(B)\myparse}
\def\nextc{(C)\myparse}
\def\nexti#1{\input{#1}\myparse}
\begin{document}
\myparse abccbbaaabi{extern.inc}bcX
\bigskip
I would like to have it identical to:
\myparse abccbbaaabaaaabcabccccbcX
\end{document}
これは与える:
\nexti
外部ファイルが解析され、入力トークン シーケンスに配置されるという望ましい結果を得るには、マクロをどのように変更すればよいでしょうか。
答え1
\CatchFileDef
最も単純な戦略は、新しい を挿入した後でファイルを読み込み、その内容を展開することです\myparse
。
\begin{filecontents*}{extern.inc}
aaaabcabcccc
\end{filecontents*}
\documentclass{article}
\usepackage{catchfile}
\def\myparse{%
\afterassignment\myhandle\let\mytoken=%
}
\def\myhandle{%
\ifx\mytoken X%
\let\next=\nextX%
\else%
\ifx\mytoken a%
\let\next=\nexta%
\else%
\ifx\mytoken b%
\let\next=\nextb%
\else%
\ifx\mytoken c%
\let\next=\nextc%
\else%
\ifx\mytoken i%
\let\next=\nexti%
\fi%
\fi%
\fi%
\fi%
\fi%
\next%
}
\def\nextX{}
\def\nexta{(A)\myparse}
\def\nextb{(B)\myparse}
\def\nextc{(C)\myparse}
\def\nexti#1{\CatchFileDef\temp{#1}{\endlinechar=-1 }\expandafter\myparse\temp}
\begin{document}
\myparse abccbbaaabi{extern.inc}bcX
\bigskip
I would like to have it identical to:
\myparse abccbbaaabaaaabcabccccbcX
\end{document}
答え2
を使用しないより簡単な方法があります。LaTeX を使用している場合は、 MWE 内のcatchfile
行を次のように置き換えます。\def\nexti#1{\input{#1}\myparse}
\def\nexti#1{\expandafter\expandafter\expandafter \myparse \csname @@input\endcsname #1 }
プレーン TeX を使用している場合、定義はより単純になります。
\def\nexti#1{\expandafter \myparse \input #1 }