如何为 \autoref 引用的段落定义名称

如何为 \autoref 引用的段落定义名称

我定义了以下命令:

\newcommand*{\namerefLabeled}[1]{\nameref{#1} (\autoref{#1})}

它基本上做了它应该做的事情,即将以下内容转换为:

For further details, see \namerefLabeled{sec:cleancode}.

进入

有关更多详细信息,请参阅清洁代码(第 1.2.3 节)。

然而,如果我引用一个标签在一个段落内,它没有选择所需的部分命名。请参阅此 MWE:

\documentclass{article}
\usepackage{hyperref}

\newcommand*{\namerefLabeled}[1]{\nameref{#1} (\autoref{#1})}

\begin{document}
    \section{A}
    \label{A}
        \subsection{B}
        \label{B}
            \subsubsection{C}
            \label{C}
                \paragraph{D}
                \label{D}
    \section{where stuff is referenced}
    For reference, see \namerefLabeled{A}, \namerefLabeled{B}, \namerefLabeled{C} or \namerefLabeled{D}.
\end{document}

输出:

输出

有人知道如何解决这个问题吗?例如,如果可能的话,为段落定义一个 autoref-name?我猜是没有为其设置值,所以它选择(我认为是)默认标签名称“section”。

使用\renewcommand\paragraphautorefname{paragraph}并没有解决。

答案1

问题不是paragraph,你会遇到同样的问题,例如\subsection*。当分段命令没有编号时,它总是被注册为未编号的节。要改变这种情况,你必须修补一些内部宏:在你的序言中插入

\makeatletter
\newcommand\currenthrefautoname{}
\newcommand\criticalhrefautoname{section*}
\newcommand\currentsectioningcommand{section}
\let\@StartSection\@startsection
\def\@startsection#1{%
  \edef\currentsectioningcommand{#1}%
  \@StartSection{#1}%
}
\let\HY@MakeCurrentHrefAuto\Hy@MakeCurrentHrefAuto
\def\Hy@MakeCurrentHrefAuto#1{%
  \long\edef\currenthrefautoname{#1}%
  \ifx\currenthrefautoname\criticalhrefautoname%
    \edef\currenthrefautoname{\currentsectioningcommand*}%
  \fi%
  \expandafter\HY@MakeCurrentHrefAuto\expandafter{\currenthrefautoname}%
}
\makeatother

答案2

问题是\paragraph(或者更准确地说)当目录不包含这些条目时\@sect不会调用。这可以通过更改计数器来解决。\refstepcountersecnumdepth

\documentclass{article}
\usepackage{hyperref}

\newcommand*{\namerefLabeled}[1]{\nameref{#1} (\autoref{#1})}

\setcounter{secnumdepth}{4}

\begin{document}
    \section{A}
    \label{A}
        \subsection{B}
        \label{B}
            \subsubsection{C}
            \label{C}
                \paragraph{D}
                \label{D}
    \section{where stuff is referenced}
    For reference, see \namerefLabeled{A}, \namerefLabeled{B}, \namerefLabeled{C} or \namerefLabeled{D}.
\end{document}

相关内容