正如书中第 21 页所述TeXbook,如果我们需要更改页码以添加 1,我们需要使用\global\advance\count0 by 1
,因为在其他组中\advance\count0 by 1
无法更改。但是,\count0
hello
\advance\count0 by 1
\bye % end the document
还是可以把页码改成+1,也就是现在的2。那么\global
这里的 应该怎么理解呢,不管有没有\global
,页码都是2。什么情况下,没有\global
,页码就改不了了?
这个问题是关于另一道题的,在那本书的第21页,练习5.6说:
如果您认为您理解了局部和全局定义,请进行一个小测试以确保:假设 \c 代表“\count1=”,\g 代表“\global\count1=”,\s 代表“\showthe\count1”。将显示什么值?
{\c1\s\g2{\s\c3\s\g4\s\c5\s}\s\c6\s}\s
结果是{1 {2 3 4 5}4 6} 4
。为什么?
\def\c{\count1=}
\def\g{\global\count1=}
\def\s{\showthe\count1}
{\c1\s\g2{\s\c3\s\g4\s\c5\s}\s\c6\s}\s
\bye% end the document
这段代码为什么不正确?
答案1
\count0
在这个问题的第一部分中,您正在更改顶层的值(您不在任何组内 - 或者如果您愿意这样想,您处于组级别 0),所以实际上这具有与您完成的结果相同的结果\global
,因为没有更广的范围,因此您的页码确实发生了变化。
对于问题的第二部分,我希望以下内容有助于理解:
{% start of group level 1
\c1 % local value 1
\s % shows 1
\g2 % local and global value 2
{% start of group level 2
\s % shows 2
\c3 % local value 3
\s % shows 3
\g4 % local and global value 4
\s % shows 4
\c5 % local value 5
\s % shows 5
}% end of group level 2, restores to last active value valid above level 2 -> global 4
\s % shows 4
\c6 % local value 6
\s % shows 6
}% end of group level 1, restores to last active value valid above level 1 -> global 4
\s % shows 4
其global
含义是,它会改变本组级别和每个更高组级别的值,因此global
会group level 2
改变该组中的值,并且group level 1
,和group level 0
,从而改变全局的值。
答案2
\count0
通常, (在纯 TeX 中别名为)的值\pageno
在输出例程中被修改,其命令在组内执行。因此纯输出例程\advancepageno
具有
\def\advancepageno{\ifnum\pageno<\z@ \global\advance\pageno\m@ne
\else\global\advance\pageno\@ne \fi} % increase |pageno|
因为纯 TeX 的惯例是 的负值\count0
将导致将罗马数字打印为页码。实际上,页码是这样打印的\folio
:
\def\folio{\ifnum\pageno<\z@ \romannumeral-\pageno \else\number\pageno \fi}
完整报价:
输出例程总是通过将它们括在组中来保护,这样它们就不会无意中弄乱 TeX 的其余部分;但
\count0
如果将对 的更改保留在输出组中,它将消失。命令\global\advance\count0 by 1
解决了这个问题;它会增加
\count0
并使该值在输出例程结束时保持不变。通常,\global
使紧随其后的定义适用于所有现有组,而不仅仅是最里面的组。
这是一个具体的的功能\count0
,您不应将其“导出”到其他计数器。当然,如果您\count0
在顶层进行更改,则不需要\global
。
当你这样做时\showthe\count1
,你会看到计数器的当前值:
{% open a group
\count1=1
\showthe\count1 % << 1
\global\count1=2
{
\showthe\count1 % << 2
\count1=3
\showthe\count1 % << 3
\global\count1=4
\showthe\count1 % << 4
\count1=5
\showthe\count1 % << 5
}
\showthe\count1 % << 4
\count1=6
\showthe\count1 % << 6
}
\showthe\count1 % << 4
你可能希望通过运行pdftex
以下命令来更好地了解正在发生\tracingassigns
的事情
\tracingrestores=1
\tracingassigns=1
{% group level 1
\count1=1
\immediate\write20{\the\count1} % << 1
\global\count1=2
{% group level 2
\immediate\write20{\the\count1} % << 2
\count1=3
\immediate\write20{\the\count1} % << 3
\global\count1=4
\immediate\write20{\the\count1} % << 4
\count1=5
\immediate\write20{\the\count1} % << 5
}% group level 1
\immediate\write20{\the\count1} % << 4
\count1=6
\immediate\write20{\the\count1} % << 6
}% group level 0
\immediate\write20{\the\count1} % << 4
\end
日志文件将是
This is pdfTeX, Version 3.141592653-2.6-1.40.25 (TeX Live 2023) (preloaded format=pdftex 2023.9.21) 8 NOV 2023 09:17
entering extended mode
restricted \write18 enabled.
%&-line parsing enabled.
**counters
(./counters.tex{into \tracingassigns=1}
{changing \count1=0}
{into \count1=1}
1
{globally changing \count1=1}
{into \count1=2}
2
{changing \count1=2}
{into \count1=3}
3
{globally changing \count1=3}
{into \count1=4}
4
{changing \count1=4}
{into \count1=5}
5
{restoring \count1=4}
{retaining \count1=4}
4
{changing \count1=4}
{into \count1=6}
6
{restoring \count1=4}
{retaining \count1=4}
4
)
No pages of output.
PDF statistics:
0 PDF objects out of 1000 (max. 8388607)
0 named destinations out of 1000 (max. 500000)
1 words of extra memory for PDF output out of 10000 (max. 10000000)
控制台会打印
1
2
3
4
5
4
6
4
正如命令注释中所预测的那样。