纯 TeX 中再次出现奇怪的错误

纯 TeX 中再次出现奇怪的错误

抱歉大家……又出现了“缺失数字,视为零”的错误。我通常都能找到并修复它,但这次我需要帮助。

我有一个宏 \twoup,用于在 A4 纸上生成由两页 A5 页面组成的输出。它工作正常。

我现在正尝试编写一个宏 \notatable(即,能够被标注……与表格无关),其目的是在 A4 纸张的左侧输出单个 A5 页面,右侧留空用于注释。它有点起作用。运行 TeX 时出现错误,但我仍然得到我想要的输出……但在第 1 页的脚注下方有一条细小的垂直线。

每页的错误似乎都标记在下一页第一个完整段落的开头。

有什么建议吗?实施方法很简单,在文本开头加上 \notatable。代码如下(包括 \twoup 代码供参考,尽管它没有造成问题),以及输出示例 - 注意页码左下方的垂直线。

\newcount\finalpageno \newtoks\normalfootline
\def\nomorepagenumbers{\finalpageno=\pageno \normalfootline=\footline
  \footline={\ifnum\pageno>\finalpageno \else \the\normalfootline \fi}}
\newbox\leftpage
\def\twoup{\special{papersize=297mm,210mm}%
  \hoffset-6truemm\voffset-7.5truemm\hsize=120truemm\vsize=170truemm%
  \let\lr=L
  \output={\if L\lr \global\setbox\leftpage=\pagebox
               \global\let\lr=R\advancepageno
           \else \doubleformat \global\let\lr=L\advancepageno \fi
           \ifnum \outputpenalty>-2000\else \dosupereject \fi}%
  \def\doubleformat{\setbox1=\hbox to26truecm{\box\leftpage\kern2truecm%
                    \pagebox\hss}\shipout\box1}%
  \def\pagebox{\leftline{\vbox{\makeheadline\pagebody\makefootline}}}}
%
\def\notatable{\special{papersize=297mm,210mm}% like \twoup but leaves right page blank for notes
  \hoffset-6truemm\voffset-7.5truemm\hsize=120truemm\vsize=170truemm%
  \output={\doubleformat \advancepageno \ifnum \outputpenalty>-2000\else \dosupereject \fi}%
  \def\doubleformat{\setbox1=\hbox to26truecm{\box\pagebox\kern14truecm\hss}\shipout\box1}%
  \def\pagebox{\leftline{\vbox{\makeheadline\pagebody\makefootline}}}}

在此处输入图片描述

答案1

\box\pagebox第一次尝试编写代码时,您的代码\pagebox定义为

\def\pagebox{\leftline{\vbox{\makeheadline\pagebody\makefootline}}}

\leftline在 Plain TeX 中由 定义。\hbox to\hsize{#1\hss}宏扩展为

\box\hbox to\hsize{...}

但该原语\box仅期望数字作为其参数,没有\hbox。因此出现“缺少数字”错误。

如果你想把盒子构造成这样\hbox to\hsize...,那么你可以直接把它放进去

\def\doubleformat{\setbox1=\hbox to26truecm{\pagebox\kern14truecm\hss}\shipout\box1}%

\box也就是说,在 之前没有原语\pagebox。此外,您的\doubleformat过于复杂。它只是简单地输出\pagebox。它被封装到 中是无关紧要的,\hbox to26cm因为我们看不到 处理的框的正确边界\shipout。更简单的定义具有相同的功能:

\def\doubleformat{\shipout\pagebox}%

您的代码在更多地方过于复杂,但我不对此进行评论,因为这不是您的问题的主题。

答案2

我认为我已经解决了这个问题。我会留下问题和答案,以防其他人遇到。也许更了解这些事情的人可以确认(或不确认)我的解释。这是我的新代码。

\def\notatable{\special{papersize=297mm,210mm}% like \twoup but leaves right page blank for notes
  \hoffset-6truemm\voffset-7.5truemm\hsize=120truemm\vsize=170truemm%
  \output={\global\setbox\leftpage=\pagebox \doubleformat \advancepageno \ifnum \outputpenalty>-2000\else \dosupereject \fi}%
  \def\doubleformat{\setbox1=\hbox to26truecm{\box\leftpage\kern14truecm\hss}\shipout\box1}%
  \def\pagebox{\leftline{\vbox{\makeheadline\pagebody\makefootline}}}}

请注意我已添加\global\setbox\leftpage=\pagebox\box\leftpage

我猜这意味着当我在之前的代码中设置 \pagebox 时,它没有传达给“外界”。我猜它产生了一个“缺少数字”错误,因为我的 \box 后面跟着一些无法识别的东西,而这些东西被解析为 \box 后面没有数字。

相关内容