解析のために外部ファイルからコンテンツを入力トークンに追加する

解析のために外部ファイルからコンテンツを入力トークンに追加する

マクロによって解析されるトークンのシーケンスが非常に長い可能性があります。可能であれば、このシーケンスの一部を外部ファイルから読み取れるようにしたいと思います。

この問題に対して、MWE を作成しました。マクロは、、、および\myparseで構成されるトークンのシーケンスを解析します。解析は で終了します。abcX

ここで、さらにトークンを追加し、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 }

関連情報