\def\p@figure{Figure~} 究竟是如何工作的?

\def\p@figure{Figure~} 究竟是如何工作的?

我从我的论文风格中取出这一行,并将它添加到我的文档中(前面是\makeatletter),它的作用是,每当我使用它\ref{figureid}而不是只放图号时,它都会放“图 1”。

我可以对表格做同样的事情,\def\p@table{Table~)但我不知道具体是什么:

\p@figure
\p@table

我假设它们是由 ref 内部使用的,但还有其他什么吗(例如\p@(object)总是用作某事物的开头......)

答案1

这些是与环境相关的 LaTeX 内核宏。简单来说,任何被 包围的东西\begin{foo}...\end{foo}都是环境。例如图形或表格。

每次插入表时,计数器都会递增。这个计数器(我们称之为)foo有一个名为的关联宏\p@foo。这个宏扩展为计数器 foo 的打印“引用前缀”。

当命令执行时,任何\ref由计数器创建的值foo都会产生扩展。justs打印计数器“foo”的值。\p@foo\thefoo\label\thefoo

改为foo或就会更有意义了figuretable

\def部分定义宏。例如,您可以说\def\milan{Milan Ramaiyan},并且每次输入时\milan它也会扩展。Milan Ramaiyan。@符号只是 TeX 和 LaTeX 使用的特殊符号,以避免意外覆盖命令。它需要特殊处理,这就是为什么需要makeatletter和的原因。makeatother

答案2

除了 Yiannis 的精细解释之外:你甚至可以扩展这些\p@宏,使其\p@figure不仅仅是一个前缀。source2e.pdf在部分中给出提示53.2 反向引用的扩展

本次修改

\makeatletter
\renewcommand*\refstepcounter[1]{\stepcounter{#1}%
\protected@edef\@currentlabel
{\csname p@#1\expandafter\endcsname\csname the#1\endcsname}}
\makeatother

允许您\p@figure使用参数进行定义,从而实现更复杂的格式。并且它仍然向后兼容原始版本。任意示例:

\renewcommand*{\p@figure}[1]{\emph{figure~(#1)}}

给出见图(1)。这样,您可以添加前缀和后缀以及格式。

答案3

Stefan 的答案的一个打包替代方案是使用包fncylab,它进行了他提到的更改,还定义了一个\labelformat宏来轻松操作\p@counters。例如,当应用于方程式上的标签时,\labelformat{equation}{(#1)}使s\ref的行为像\eqref。(实际上,我在我的文档中默认激活了此功能。裸露的数字很少有用。)

答案4

我使用了\usepackage{hyperref}并应用了\autoref{tab:minimum-cut-set}。它将生成我们想要看到的“表 1.2”(例如)。但是,对于算法,虽然“算法”大写,但它显示“算法 2.1”(例如)。

标题表、图片均显示正常。只有算法出现了我上面提到的问题。

相关内容