我想了解 在 LaTeX 中使用计数器时\the
和的区别。\value{}
答案1
\thecounter
排版计数器的结果,可以是阿拉伯语、罗马语等,而\value{counter}
提供整数值作为回报。在很多情况下(但并非所有情况),这种差异不会被察觉。
规则是,如果您正在寻找一个字符,请使用\the...
;如果您正在寻找一个整数,请使用\value{...}
。
下面是一个很重要的例子。通过以罗马字体排版页码(通过\pagenumbering{roman}
),选项\romannumeral\thepage
不再是一个选项,因为它将尝试\romannumeral i
,而\romannumeral\value{page}
工作正常。
\documentclass{article}
\pagenumbering{roman}
\begin{document}
\romannumeral\value{page}
% \romannumeral\thepage will break
\end{document}
这是另一个例子...你不能排版\value
\documentclass{article}
\begin{document}
\newcounter{Q}
\setcounter{Q}{2}
%\value{Q} will break
\theQ
\end{document}
差异也会影响比较,因为\if
比较的是标记,而不是整数:
\documentclass{article}
\begin{document}
\newcounter{Q}
\setcounter{Q}{2}
\if\value{Q}2 T\else F\fi is false
\if\theQ2 T\else F\fi is true
\end{document}
\if
如果将 s 改为s ,则上述示例将显示匹配,\ifnum
因为\ifnum
会将字符解释/转换2
为整数。但是,即使这样,在更复杂的情况下也会给您带来麻烦。
这里,我可以\theQ
和结合起来3
表示23
。但对于则不行\value{Q}3
。
\documentclass{article}
\begin{document}
\newcounter{Q}
\setcounter{Q}{2}
%\ifnum\value{Q}3=23 T\else F\fi will break
\ifnum\theQ3=23 T\else F\fi is true
\end{document}
现在,最后一个相当不寻常。即使用\value
尝试提供长度规范的数值部分。如果您仅指定 ,它会按预期工作\value{Q} pt
。但是,如果您尝试2\value{Q} pt
,它会将2
作为乘数并将\value{Q}
作为sp
机器单位指定的长度!尾随pt
成为多余的残差,甚至不是长度的一部分。
出现这种行为的原因是,在 TeX 深处,长度实际上是以机器单位的整数计数存储的。TeX 使用什么值作为其最小单位
\documentclass{article}
\def\q{\rule{2pt}{10pt}}
\begin{document}
\newcounter{Q}
\setcounter{Q}{2}
\q\hspace{\theQ pt}\q{} skips 2pt
\q\hspace{\value{Q} pt}\q{} skips 2pt
\q\hspace{1\theQ pt}\q{} skips 12pt
\setcounter{Q}{100000}
\q\hspace{2\value{Q} pt}\q{} skips 200000sp before reaching the ``pt''
\q\hspace{200000 sp}\q{} skips 200000sp for comparison
\end{document}
答案2
这是一个有趣的数学问题。数字 275 可以用不同的方式表示:
- 275 用“西方数字”表示的十进制数,
- ٢٧٥ 用“阿拉伯数字”表示十进制数,
- 罗马数字 CCLXXV,
- 113(十六进制数字),
- 二进制表示为 100010011,
以及许多其他(意大利语:duecentosettantacinque)。
当你在 LaTeX 中用 定义一个新的计数器时,\newcounter{foo}
命令也会\thefoo
被定义,它将扩展为存储在计数器中的值的表示形式;该命令被初始化为提供计数器的十进制表示形式,但也可以这样说
\renewcommand{\thefoo}{\roman{foo}}
然后,\thefoo
当计数器存储数字 275 时调用将产生
第五十五节
(宏扩展后)。初始定义本质上等同于
\newcommand{\thefoo}{\arabic{foo}}
一个常见的情况是计数器page
:在课堂上book
,计数器的表示\roman
在前文、\arabic
正文和后文中使用。
然而,存储在的数字foo
与其表示无关:在某种意义上,计数器存储抽象的数字,与其表示没有特别关联的事物。此抽象值可通过 访问\value{foo}
。
假设你有一个应用程序,其中的计数器只包含 0 到 3 之间的值,而你想用非数字对象表示这些值;例如,你可以定义
\renewcommand{\thefoo}{%
\ifcase\value{foo}%
apple% case 0
\or
orange% case 1
\or
apricot% case 2
\or
strawberry% case 3
\else
bummer% wrong setting found
\fi
}
条件\ifcase
根据其后的数字进行分支,在本例中是存储在计数器中的抽象值。
你不能\value{foo}
在文档中说为了打印值,因为抽象的数字只能是代表你必须指定哪种方式。相反,当 TeX看着对于数字(例如之后\ifcase
),则\value{foo}
是正确的代码。
反对意见“但我们可以\arabic{foo}
使用\value{foo}
”被驳回。你真的想要那里的抽象数字,而不是它的某种表示。