Fügen Sie den Eingabetoken zum Parsen Inhalt aus einer externen Datei hinzu

Fügen Sie den Eingabetoken zum Parsen Inhalt aus einer externen Datei hinzu

Ich habe eine möglicherweise sehr lange Token-Sequenz, die von einem Makro analysiert wird. Ich möchte Teile dieser Sequenz aus externen Dateien lesen können, wenn dies möglich ist.

Ich habe für dieses Problem ein MWE erstellt. Das Makro \myparseanalysiert eine Token-Sequenz bestehend aus a, b, und c. Die Analyse wird durch beendet X.

Nun habe ich ein weiteres Token hinzugefügt, igefolgt von einem Dateinamen. Ich möchte i{extern.inc}es durch das ersetzenanalysiertInhalt der Datei extern.inc.

Die Datei extern.incenthält:

aaaabcabcccc

Mein MWE ist:

\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}

Das gibt:

Bildbeschreibung hier eingeben

Wie könnte das Makro \nextigeändert werden, um das gewünschte Ergebnis zu erzielen, nämlich dass die externe Datei analysiert bzw. in die Eingabe-Token-Sequenz eingefügt wird?

Antwort1

Die einfachste Strategie besteht darin, die Datei mit zu laden \CatchFileDefund ihren Inhalt nach dem Einfügen eines neuen zu erweitern \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}

Bildbeschreibung hier eingeben

Antwort2

Es gibt einen einfacheren Weg ohne Verwendung von catchfile. Wenn Sie LaTeX verwenden, ersetzen Sie die Zeile \def\nexti#1{\input{#1}\myparse}in Ihrem MWE durch:

\def\nexti#1{\expandafter\expandafter\expandafter \myparse \csname @@input\endcsname #1 }

Wenn Sie reines TeX verwenden, ist die Definition einfacher:

\def\nexti#1{\expandafter \myparse \input #1 }

verwandte Informationen