我定义了以下命令:
\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
不会调用。这可以通过更改计数器来解决。\refstepcounter
secnumdepth
\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}