\thesection 的 LaTeX 内部定义

\thesection 的 LaTeX 内部定义

我正在使用方程编号的重新定义,如下面的 MWE 所示。

\documentclass{scrreprt}

\usepackage{chngcntr}
\renewcommand{\theequation}{\thesection.\arabic{equation}}
\counterwithin*{equation}{chapter}
\counterwithin*{equation}{section}

\begin{document}
\begin{equation}
1+1=2
\end{equation}

\chapter{First chapter}
\begin{equation}
1+1=2
\end{equation}

\section{First section}
\begin{equation}
1+1=2
\end{equation}
\end{document}

我注意到\thesection给出了"current chapter number"."current section number"。所有次要结构级别编号在它们自己的编号之前都有它们的主要级别编号。事实上这对我来说不是问题;这个 MWE 实现了我想要的行为。我只是想了解为什么 LaTeX 会这样做。这样做有什么好处吗(除了缩短这个重新定义命令)?有什么缺点?

附言:我怎样才能调用仅针对我当前部分的计数器?

答案1

最后一个问题,如何将节计数器与方程计数器结合使用:

\renewcommand{\theequation}{\arabic{section}.\arabic{equation}}

将仅打印带有章节编号作为前缀的公式编号,而不是完整的内容chapter.section.X

\thefoo现在关于类似命令的更通用的答案。

原则上,像这样的命令\thesection是递归定义的!

根据实际设置(使用chngcntr's\counterwithin等命令)和底层类,结构通常是

\def\thefooleveltwo{\thefoolevelone.\arabic{fooleveltwo}}
\def\thefoolevelthree{\thefooleveltwo.\arabic{foolevelthree}}

在这种情况下,foolevelone将是chapterfooleveltwosectionfoolevelthree将会是subsection等等。

精确的设置可能主要在使用\arabic\alph\Alph\roman时有所不同\Roman

为了获取当前章节编号,只需使用\arabic{section}\number\value{section}

这种编号方案的优点是定义映射哪个方程式/章节/图形等属于哪个章节或结构级别。

缺点是你不能使用类似

\setcounter{section}{\thesection}

在大多数情况下,因为\thesection其输出中可能有非数字(如句点或罗马数字)。

更多细节——来自latex.ltx

\newcounter{foo}\@definecounter有效调用,这里是它的定义:

\def\@definecounter#1{\expandafter\newcount\csname c@#1\endcsname
     \setcounter{#1}\z@
     \global\expandafter\let\csname cl@#1\endcsname\@empty
     \@addtoreset{#1}{@ckpt}%
     \global\expandafter\let\csname p@#1\endcsname\@empty
     \expandafter
     \gdef\csname the#1\expandafter\endcsname\expandafter
          {\expandafter\@arabic\csname c@#1\endcsname}}

最后\gdef\....将定义\thefoo为一个用阿拉伯数字打印计数器值的命令 - 这是默认设置,因此从一开始,任何\the...(只要与计数器相关)都会打印阿拉伯数字。

最终的输出行为由类定义(大多数情况下),就像这里article.cls

\setcounter{secnumdepth}{3}
\newcounter {part}
\newcounter {section}
\newcounter {subsection}[section]
\newcounter {subsubsection}[subsection]
\newcounter {paragraph}[subsubsection]
\newcounter {subparagraph}[paragraph]
\renewcommand \thepart {\@Roman\c@part}
\renewcommand \thesection {\@arabic\c@section}
\renewcommand\thesubsection   {\thesection.\@arabic\c@subsection}
\renewcommand\thesubsubsection{\thesubsection.\@arabic\c@subsubsection}
\renewcommand\theparagraph    {\thesubsubsection.\@arabic\c@paragraph}
\renewcommand\thesubparagraph {\theparagraph.\@arabic\c@subparagraph}

从宏的行可以看出\renewcommand{\the...},命令是递归定义的,其中\@arabic\c@foo是实际的内部表示\arabic{foo}\c@foo“真实”计数器宏名)

相关内容