否定 \ifeof

否定 \ifeof

嘗試排版文件中的行:

\openin0=MyFile

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

顯然,我想測試不是\ifeof,但我在 TeXBook 第 20 章中沒有看到布林否定運算子。我可以用純 TeX 來做這個嗎?

答案1

這在某種程度上取決於你所說的 plain TeX 的意思。

正如 cmhughes 剛剛在評論中提到的,您可以使用 e-TeXunless命令來否定表達式,或者您可以複製 LaTeX 定義,\loop該定義將允許您執行以下操作

\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 Eijkout,拖船

相關內容