我正在尝试编译 egreg 在此线程中提到的修复程序:PGF/TikZ 和 Plain TeX 输出程序的奇怪行为
代码如下:
\input pgf
\catcode`@=11
\newbox\pgfutil@@Output@Box
\def\shipout{%
\ifhmode\hskip\else\vskip\fi 1sp
\afterassignment\pgfutil@@Delayed@EveryShipout@Test
\setbox\pgfutil@@Output@Box=}
\def\pgfutil@@Delayed@EveryShipout@Test{%
\ifdim\lastskip=\z@ % it was \shipout\vbox or \shipout\hbox
\expandafter\aftergroup
\fi
\pgfutil@@EveryShipout@Test}
\def\pgfutil@@EveryShipout@Test{%
\unskip % remove the skip used as signal
\ifvoid\pgfutil@@Output@Box
\expandafter\aftergroup
\fi
\pgfutil@EveryShipout@Output}
\def\pgfutil@EveryShipout@Output{%
\setbox\pgfutil@@Output@Box=\vbox{
\setbox\z@=\hbox{%
\pgfutil@abe
\unhbox\pgfutil@abb
\pgfutil@abc
\global\let\pgfutil@abc\pgfutil@empty
}%
\wd\z@=\z@\ht\z@=\z@\dp\z@=\z@\box\z@
\ifhbox\pgfutil@@Output@Box\unhbox\else\unvbox\fi\pgfutil@@Output@Box
}%
\pgfutil@@EveryShipout@Org@Shipout\box\pgfutil@@Output@Box
}
\catcode`@=12
%\def\bxxx{\box255}\output={\shipout\bxxx}
%\output={\shipout\relax\box255}
\setbox0=\hbox{A}
\shipout\box0
Hello world
\bye
我每次尝试时都会收到此错误消息:
! Undefined control sequence.
\pgfutil@EveryShipout@Output ...ipout@Org@Shipout
\box \pgfutil@@Output@Box
\plainoutput ...headline \pagebody \makefootline }
\advancepageno \ifnum \out...
<output> {\plainoutput
}
<to be read again>
\pgfutil@origend
l.42 \bye
?
! Output loop---25 consecutive dead cycles.
<to be read again>
\pgfutil@origend
l.42 \bye
我不知道哪里出了问题。
答案1
简单文件
\input pgf
\show\shipout
使用 TeX Live 2012 和 PGF 版本 2.10 进行编译时,或在 TeX Live 2014 和 PGF 版本 3.0.0 下进行编译时,会产生不同的结果
版本 2.1.0
> \shipout=macro:
->\afterassignment \pgfutil@@EveryShipout@Test \setbox 255= .
版本 3.0.0
> \shipout=macro:
->\edef \AtBegShi@GroupLevel {\number \currentgrouplevel }\afterassignment \AtBegShi@Test \setbox \AtBeginShipoutBox =.
我们可以从这段代码中得出的结论是,PGF 2.10 中的主要错误\setbox255=...
已经得到修复。在我的实验中,您显示的示例文件(从添加的代码中清除)
\input pgf
\setbox0=\hbox{A}
\shipout\box0
Hello world
\bye
编译完美并产生预期结果。
答案2
@egreg 答案中的代码假设存在
\let\pgfutil@@EveryShipout@Org@Shipout=\shipout
在 的宏中pgf.tex
。您的帖子中显示的错误消息表明上面的行未被处理。也许,新版或旧版 PGF 使用了另一个控制序列名称或做了不同的事情,而 @egreg 的代码与此不兼容,因为代码中缺少上面的行。但是从主要原因来看,此行不能位于路径本身中:我们不知道 是否\shipout
仍然是原始的。只有\shipout
是原始的,上面的行才有效。
建议:如果不知道 PGF 版本是否与讨论的版本相同,请不要使用此路径这里。我不知道 PGF 的版本演变,所以我不能透露更多。