Adicione conteúdo de um arquivo externo aos tokens de entrada para análise

Adicione conteúdo de um arquivo externo aos tokens de entrada para análise

Eu tenho uma sequência possivelmente muito longa de tokens que é analisada por uma macro. Gostaria de poder ler partes desta sequência de arquivos externos, se isso for possível.

Eu criei um MWE para esse problema. A macro \myparseanalisa uma sequência de tokens que consiste em a, be c. A análise é finalizada por X.

Agora, adicionei mais um token iseguido por um nome de arquivo. Eu gostaria de ter sido i{extern.inc}substituído peloanalisadoconteúdo do arquivo extern.inc.

O arquivo extern.inccontém:

aaaabcabcccc

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

Isto dá:

insira a descrição da imagem aqui

Como a macro poderia \nextiser modificada para obter o resultado desejado de que o arquivo externo seja analisado respectivamente. colocado na sequência do token de entrada?

Responder1

A estratégia mais simples é carregar o arquivo \CatchFileDefe expandir seu conteúdo após inserir um novo arquivo \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}

insira a descrição da imagem aqui

Responder2

Existe uma maneira mais simples sem o uso de catchfile. Se você estiver usando LaTeX, substitua a linha \def\nexti#1{\input{#1}\myparse}em seu MWE por:

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

Se você estiver usando TeX simples, a definição é mais simples:

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

informação relacionada