否定 \ifeof

否定 \ifeof

尝试排版文件中的行:

\openin0=MyFile

\loop
  \read0to\linein
  \linein
  \ifeof0              % Fails here
\repeat

显然,我想测试不是\ifeof,但我在 TeXBook 第 20 章中没有看到布尔否定运算符。我可以在纯 TeX 中执行此操作吗?

答案1

这有点取决于你所说的纯 TeX 是什么意思。

正如 cmhughes 在评论中提到的,您可以使用 e-TeXunless命令来否定表达式,或者您可以复制\loop允许您执行的 LaTeX 定义

\openin0=MyFile

\loop
  \read0to\linein
  \linein
  \ifeof0              % Fails here
  \else
\repeat

这样您就可以使用未扩展的 TeX。

平原\loop

\def\loop#1\repeat{\def\body{#1}\iterate}
\def\iterate{\body \let\next\iterate \else\let\next\relax\fi \next}
\let\repeat=\fi 

LaTeX 使用以下定义,因此\else可以工作。

\def\loop#1\repeat{\def\iterate{#1\relax\expandafter\iterate\fi}%
  \iterate \let\iterate\relax}
\let\repeat\fi

答案2

如果你喜欢理论,这里是 David Kastrup 的\ifnot宏:

\def\ifnot#1{#1\else\expandafter\expandafter\fi\iffalse\iftrue\fi}

这可以用作

\loop ... \ifnot{\ifeof\stream} ... \repeat

Victor Eijkhout,TUGBoat

相关内容