將外部文件中的內容新增至輸入標記以進行解析

將外部文件中的內容新增至輸入標記以進行解析

我有一個可能很長的標記序列,由巨集解析。如果可能的話,我希望能夠從外部文件中讀取該序列的部分內容。

我為這個問題寫了一個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 }

相關內容