구문 분석을 위해 외부 파일의 콘텐츠를 입력 토큰에 추가합니다.

구문 분석을 위해 외부 파일의 콘텐츠를 입력 토큰에 추가합니다.

매크로에 의해 구문 분석되는 매우 긴 일련의 토큰이 있습니다. 가능하다면 외부 파일에서 이 시퀀스의 일부를 읽을 수 있기를 바랍니다.

나는 이 문제에 대해 MWE를 구성했습니다. 매크로는 , 및 \myparse로 구성된 일련의 토큰을 구문 분석합니다 . 에 의해 구문 분석이 종료됩니다 .abcX

이제 추가 토큰 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 }

관련 정보