Negierung von \ifeof

Negierung von \ifeof

Versuch, Zeilen aus einer Datei zu setzen:

\openin0=MyFile

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

Natürlich möchte ich testen,nicht\ifeof, aber ich sehe in Kapitel 20 des TeXBook keinen Booleschen Negationsoperator. Kann ich das in reinem TeX machen?

Antwort1

Es hängt ein wenig davon ab, was Sie mit einfachem TeX meinen.

Wie cmhughes gerade in den Kommentaren erwähnt hat, können Sie den e-TeX- unlessBefehl verwenden, um den Ausdruck zu negieren, oder Sie können die LaTeX-Definition kopieren, \loopwas Ihnen Folgendes ermöglichen würde

\openin0=MyFile

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

damit Sie mit einem nicht erweiterten TeX arbeiten können.

Die Ebene \loopist

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

LaTeX verwendet die folgende Definition, damit \elsees funktioniert.

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

Antwort2

Wenn Sie Theorie mögen, hier ist David Kastrups \ifnotMakro:

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

Dies kann verwendet werden als

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

SehenVictor Eijkhout, TUGBoat.

verwandte Informationen