Отрицание \ifeof

Отрицание \ifeof

Попытка набрать строки из файла:

\openin0=MyFile

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

Очевидно, я хочу проверитьнет\ifeof, но я не вижу булевского оператора отрицания в главе 20 TeXBook. Могу ли я сделать это в простом TeX?

решение1

Это немного зависит от того, что вы подразумеваете под простым TeX.

Как только что упомянул cmhughes в комментариях, вы можете использовать unlessкоманду e-TeX для отрицания выражения или вы можете скопировать определение 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

Если вам нравится теория, вот \ifnotмакрос Дэвида Каструпа:

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

Это можно использовать как

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

ВидетьВиктор Эйхаут, TUGBoat.

Связанный контент