\def\hcAuxText{}
\newread\hcInputStream
\immediate\openin\hcInputStream=myfile.tmp
\loop\unless\ifeof\hcInputStream
\read\hcInputStream to \hcAuxLine
\let\hcAuxAcumm\hcAuxText
\edef\hcAuxText{\hcAuxAcumm \hcAuxLine}
\repeat
\closein\hcInputStream
我正在尝试将文件内容读入变量。我需要读取整个文件,因为该文件稍后会被修改(如目录)。
运行上述代码时,我收到以下消息:
! TeX capacity exceeded, sorry [input stack size=5000].
\@ifundefined #1->\expandafter \ifx \csname #1
\endcsname \relax \expandafter..
我想知道 i) 为什么该代码会导致堆栈溢出,以及 ii) 有没有更好的方法将整个文件读入变量?
%%%%%%%%%% 编辑 %%%%%%%%%%
此代码的真正目的是将文件加载到变量中,然后每次使用时都可以“粘贴”。文件在 \AtBeginDocument 读取,但在处理源时会进行修改。因此,我想将文件的“初始状态”保留在内存中。这可能有助于解决我上面的问题 (ii)。
至于第 (i) 部分,我对上面的代码不起作用感到困惑。毕竟,我读取了一行并将其存储在 \hcAuxLine 中,将 \hcAuxAcumm 的先前状态复制到 \hcAuxText,最后将 {\hcAuxAcumm \hcAuxLine} 连接到 \hcAuxText。
答案1
考虑到这里的主题是 LaTeX,我会看看catchfile
包。至于您收到的消息,如果没有更多上下文,很难确定。\edef
不过,我确实想知道在这里使用。它将完全展开刚刚从文件中读取的行,这可能是一个坏主意。这是一个一般性观点,我至少会考虑使用\protected@edef
。如果您不想扩展,我建议您最好完全避免它。由于您使用的是 e-TeX,因此最好使用
\edef\hcAuxText{\unexpand\expandafter{\hcAuxText}\unexpand\expandafter{\hcAuxLine}}
\hcAuxText
顺便说一句,此步骤无需复制\edef
。例如
\edef\hcAuxText{\hcAuxText <extra stuff}
\hcAuxText
将在分配之前的定义内扩展。