如果没有“\global”,我们还能改变“\count0”吗?

如果没有“\global”,我们还能改变“\count0”吗?

正如书中第 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含义是,它会改变本组级别和每个更高组级别的值,因此globalgroup 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

正如命令注释中所预测的那样。

相关内容