Tengo una secuencia posiblemente muy larga de tokens que es analizada por una macro. Me gustaría poder leer partes de esta secuencia desde archivos externos, si es posible.
Creé un MWE para este problema. La macro \myparse
analiza una secuencia de tokens que consta de a
, b
y c
. El análisis finaliza con X
.
Ahora, agregué un token adicional i
seguido de un nombre de archivo. Me gustaría haber sido i{extern.inc}
reemplazado por elanalizadocontenido del archivo extern.inc
.
El archivo extern.inc
contiene:
aaaabcabcccc
Mi MWE es:
\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}
Esto da:
\nexti
¿Cómo podría modificarse la macro para obtener el resultado deseado: analizar el archivo externo o analizarlo? poner en la secuencia del token de entrada?
Respuesta1
La estrategia más sencilla es cargar el archivo \CatchFileDef
y expandir su contenido después de insertar un nuevo archivo \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}
Respuesta2
Hay una manera más sencilla sin el uso de catchfile
. Si está utilizando LaTeX, reemplace la línea \def\nexti#1{\input{#1}\myparse}
en su MWE por:
\def\nexti#1{\expandafter\expandafter\expandafter \myparse \csname @@input\endcsname #1 }
Si estás usando TeX simple, entonces la definición es más simple:
\def\nexti#1{\expandafter \myparse \input #1 }