通过 创建的计数器\newcounter{<counter>}
在内部存储为\c@<counter>
,就像使用 进行的引用\label{<label>}
在内部存储为 一样。和\r@<label>
有什么用? 与其使用相关的宏包括(来自\cl@<counter>
\p@<counter>
latex.ltx
):
\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}}
%...
\def\refstepcounter#1{\stepcounter{#1}%
\protected@edef\@currentlabel
{\csname p@#1\endcsname\csname the#1\endcsname}%
}
%...
\def\stepcounter#1{%
\addtocounter{#1}\@ne
\begingroup
\let\@elt\@stpelt
\csname cl@#1\endcsname
\endgroup}
%...
\def\@addtoreset#1#2{\expandafter\@cons\csname cl@#2\endcsname {{#1}}}
答案1
答案是LaTeX 源文档:
\p@foo
扩展为计数器 foo 的打印“引用前缀”的宏。任何由计数器 foo 创建的值都会在执行命令时\ref
产生扩展。请参阅文件以了解此机制的扩展。\p@foo\thefoo
\label
ltxref.dtx
\cl@foo
当 foo 执行时要重置的计数器列表。格式为\@elt{countera}\@elt{counterb}\@elt{counterc}
。
例如,
\newcounter{subsubsection}[subsection]
调用
\@newctr{subsubsection}[subsection]
其定义为
\def\@newctr#1[#2]{%
\@ifundefined{c@#2}{\@nocounterr{#2}}{\@addtoreset{#1}{#2}}}
因此,当调用时,计数器subsection
会自动重置,因此包含。\subsubsection
\cl@subsubsection
\@elt{subsection}
正如文档所述,该p@
功能可用于“扩展”计数器的标签。例如,article.cls
包含
\renewcommand\p@enumii{\theenumi}
\renewcommand\p@enumiii{\theenumi(\theenumii)}
\renewcommand\p@enumiv{\p@enumiii\theenumiii}
其效果是
\documentclass{article}
\begin{document}
\begin{enumerate}
\item foo
\begin{enumerate}
\item bar
\begin{enumerate}
\item\label{itembaz} baz
\end{enumerate}
\end{enumerate}
\end{enumerate}
\ref{itembaz}
\end{document}
将导致
而不只是“我”。