У меня есть, возможно, очень длинная последовательность токенов, которая анализируется макросом. Я хотел бы иметь возможность читать части этой последовательности из внешних файлов, если это возможно.
Я составил MWE для этой проблемы. Макрос \myparse
анализирует последовательность токенов, состоящую из a
, b
, и c
. Анализ завершается X
.
Теперь я добавил еще один токен, i
за которым следует имя файла. Я хотел бы заменить i{extern.inc}
его напроанализированосодержимое файла extern.inc
.
Файл extern.inc
содержит:
aaaabcabcccc
Мой 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}
Это дает:
Как можно изменить макрос, \nexti
чтобы получить желаемый результат, при котором внешний файл анализируется и помещается во входную последовательность токенов?
решение1
Самая простая стратегия — загрузить файл \CatchFileDef
и развернуть его содержимое после вставки нового \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}
решение2
Есть более простой способ без использования catchfile
. Если вы используете LaTeX, то замените строку \def\nexti#1{\input{#1}\myparse}
в вашем MWE на:
\def\nexti#1{\expandafter\expandafter\expandafter \myparse \csname @@input\endcsname #1 }
Если вы используете простой TeX, то определение будет проще:
\def\nexti#1{\expandafter \myparse \input #1 }