柜台和他们的“伙伴”

柜台和他们的“伙伴”

通过 创建的计数器\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\labelltxref.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}

将导致

p@ 示例

而不只是“我”。

相关内容