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 \myparse
analisa uma sequência de tokens que consiste em a
, b
e c
. A análise é finalizada por X
.
Agora, adicionei mais um token i
seguido por um nome de arquivo. Eu gostaria de ter sido i{extern.inc}
substituído peloanalisadoconteúdo do arquivo extern.inc
.
O arquivo extern.inc
conté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á:
Como a macro poderia \nexti
ser 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 \CatchFileDef
e 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}
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 }