我只是按照 LaTeX 教程创建了第一个“Hello World!”.tex
文件,并将其转换为 PDF 文件。
然后我浏览.log
文件并看到以下内容,
("C:\Program Files\MikTeX\tex\latex\base\size10.clo"
File: size10.clo 2014/09/29 v1.4h Standard LaTeX file (size option)
)
\c@part=\count79
\c@section=\count80
\c@subsection=\count81
\c@subsubsection=\count82
\c@paragraph=\count83
\c@subparagraph=\count84
\c@figure=\count85
\c@table=\count86
\abovecaptionskip=\skip41
\belowcaptionskip=\skip42
\bibindent=\dimen102
) (hello_world.aux)
我对以下陈述感到困惑:
\c@part=\count79
有人可以解释一下吗?
答案1
您可能编译了以下最小示例:
\documentclass{article}
\begin{document}
Hello World!
\end{document}
提供以下内容(部分).log
:
...
\c@part=\count79
\c@section=\count80
\c@subsection=\count81
\c@subsubsection=\count82
\c@paragraph=\count83
\c@subparagraph=\count84
\c@figure=\count85
\c@table=\count86
...
上述输出源自默认article
文档类中的计数器定义。更具体地说,以下命令集(只需\newcounter
在 中搜索article.cls
):
...
\newcounter {part}
\newcounter {section}
\newcounter {subsection}[section]
\newcounter {subsubsection}[subsection]
\newcounter {paragraph}[subsubsection]
\newcounter {subparagraph}[paragraph]
...
\newcounter{figure}
...
\newcounter{table}
...
每个都\newcounter{<newcntr>}[<oldcntr>]
定义一个新的计数器作为宏 \c@<newcntr>
- 注意前缀。以下是LaTeX 内核中c@
的 的定义:\newcounter
\def\newcounter#1{%
\expandafter\@ifdefinable \csname c@#1\endcsname
{\@definecounter{#1}}%
\@ifnextchar[{\@newctr{#1}}{}}
首先检查宏是否\c@<newcntr>
已经存在,然后通过 定义它\@definecounter{<newcntr>}
。
\def\@definecounter#1{\expandafter\newcount\csname c@#1\endcsname
...}
\@definecounter
发出 TeX 原语来创建指向的\newcount
实际计数寄存器。\c@<newcntr>
使用c@
前缀纯粹是一种常规选择。类似地,计数器前缀有一个p@
宏前缀,而\label
LaTeX 内核中的引用(或 s)有一个r@
前缀。它试图避免最终用户乱用计数器,但仍然允许他们创建自己的类似名称的宏。也就是说,使以下内容毫无问题地工作:
\newcounter{something}% <------- Creates \c@something
\newcommand{\something}{..}% <-- Creates \something
如果c@
前缀不是由插入的\newcounter
,那么\newcounter{something}
很可能已经创建了一个计数器宏 \something
,当您想要创建一个真正的宏时,这就会有问题\something
。