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 \myparse
analysiert eine Token-Sequenz bestehend aus a
, b
, und c
. Die Analyse wird durch beendet X
.
Nun habe ich ein weiteres Token hinzugefügt, i
gefolgt von einem Dateinamen. Ich möchte i{extern.inc}
es durch das ersetzenanalysiertInhalt der Datei extern.inc
.
Die Datei extern.inc
enthä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:
Wie könnte das Makro \nexti
geä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 \CatchFileDef
und 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}
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 }