\the vs. \value:有什么区别

\the vs. \value:有什么区别

我想了解 在 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}”被驳回。你真的想要那里的抽象数字,而不是它的某种表示。

相关内容