Agregue contenido de un archivo externo a los tokens de entrada para su análisis.

Agregue contenido de un archivo externo a los tokens de entrada para su análisis.

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 \myparseanaliza una secuencia de tokens que consta de a, by c. El análisis finaliza con X.

Ahora, agregué un token adicional iseguido de un nombre de archivo. Me gustaría haber sido i{extern.inc}reemplazado por elanalizadocontenido del archivo extern.inc.

El archivo extern.inccontiene:

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:

ingrese la descripción de la imagen aquí

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

ingrese la descripción de la imagen aquí

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 }

información relacionada