
Попытка набрать строки из файла:
\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.