我有一个可能很长的标记序列,由宏解析。如果可能的话,我希望能够从外部文件中读取此序列的部分内容。
我为这个问题编写了一个 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 }