纯 TeX 错误。未定义控制序列。\pgfutil@

纯 TeX 错误。未定义控制序列。\pgfutil@

我正在尝试编译 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 的版本演变,所以我不能透露更多。

相关内容