为什么下面的代码会无限循环运行?

为什么下面的代码会无限循环运行?
\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将在分配之前的定义内扩展。

相关内容