Добавить содержимое внешнего файла к входным токенам для анализа

Добавить содержимое внешнего файла к входным токенам для анализа

У меня есть, возможно, очень длинная последовательность токенов, которая анализируется макросом. Я хотел бы иметь возможность читать части этой последовательности из внешних файлов, если это возможно.

Я составил 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 }

Связанный контент