Negando \ifeof

Negando \ifeof

Tentando compor linhas de um arquivo:

\openin0=MyFile

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

Claramente, quero testarnão\ifeof, mas não vejo um operador de negação booleano no Capítulo 20 do TeXBook. Posso fazer isso em TeX simples?

Responder1

Depende um pouco do que você entende por TeX simples.

Como cmhughes mencionado nos comentários, você pode usar o unlesscomando e-TeX para negar a expressão ou copiar a definição do LaTeX \loopque permitiria fazer isso

\openin0=MyFile

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

para que você possa trabalhar com um TeX não estendido.

A planície \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 usa a seguinte definição, então \elsefunciona.

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

Responder2

Se você gosta de teoria, aqui está \ifnota macro de David Kastrup:

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

Isto pode ser usado como

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

VerVictor Eijkhout, rebocador.

informação relacionada