使项目上 \label 中的 \ref 引用章节/子章节,而不是项目编号

使项目上 \label 中的 \ref 引用章节/子章节,而不是项目编号

我想在枚举中标记一个项目,然后稍后引用项目编号 (i)-(iv),但有时也引用它所在的部分?有什么办法吗?以下是 MWE:

\documentclass{article}
\usepackage{enumitem}
\usepackage{hyperref}



\begin{document}

\section{Test}\label{sec}

\subsection{test1}\label{subsec}

\subsubsection{test2}

\begin{enumerate}[(i)]
  \item
    one \label{item}
  \item
    two
\end{enumerate}


This \ref{sec} should say (1), this \ref{subsec} should say (1.1) and this \ref{item} should say (1.1.1)


\end{document}

答案1

下面实现了两种方法:一种方法\ref{X}是引用原始产品编号并\ref{secX}引用产品所在的部分,另一种方法是\ref{X}引用产品所在的部分并\ref{itemX}引用原始产品编号。

对于这两种变体,我定义了一个辅助命令,\secref{X}它可以扩展为\ref{secX},并且\refitem{X}可以扩展为\ref{itemX}

我没有重新定义,\label因为那样会产生不必要的后果,而是为这两种方法定义了新的\labelwithsec命令\labelwithitem

它的工作原理是将当前标签号\@currentlabel(由所有标签感知命令定义,例如\item\section)存储在临时命令中,然后将当前标签更改为当前节号(取自https://tex.stackexchange.com/a/141369/),然后调用\label,以便所需的数字与.aux文件中的标签相关联。最后将标签名称恢复为原始名称,以允许后续\label命令正常运行。

梅威瑟:

\documentclass{article}
\usepackage[shortlabels]{enumitem}
\usepackage{hyperref}

\makeatletter
% command \getCurrentSectionNumber adapted from https://tex.stackexchange.com/a/141369/
\newcommand{\getCurrentSectionNumber}{%
  \ifnum\c@subsection=0 %
  \thesection
  \else
  \ifnum\c@subsubsection=0 %
  \thesubsection
  \else
  \thesubsubsection
  \fi
  \fi
}

% Approach 1: \ref{X} is the original item label,
% \ref{secX} and \secref{X} are the section for item X
\newcommand{\labelwithsec}[1]{%
\label{#1}%
\edef\prevlabel{\@currentlabel}%
\edef\@currentlabel{\getCurrentSectionNumber}%
\label{sec#1}%
\edef\@currentlabel{\prevlabel}%
}

\newcommand{\secref}[1]{%
\ref{sec#1}%
}

% Approach 2: \ref{X} is the section for item X,
% \ref{itemX} and \refitem{X} are the original item label
\newcommand{\labelwithitem}[1]{%
\label{item#1}%
\edef\prevlabel{\@currentlabel}%
\edef\@currentlabel{\getCurrentSectionNumber}%
\label{#1}%
\edef\@currentlabel{\prevlabel}%
}

\newcommand{\refitem}[1]{%
\ref{item#1}%
}
\makeatother

\begin{document}

\section{Test}\label{sec}

\subsection{test1}\label{subsec}

\subsubsection{test2}

\begin{enumerate}[(i)]
  \item
    one \labelwithsec{itemone}
  \item
    two \labelwithitem{itemtwo}
\end{enumerate}


This \ref{sec} should say (1), this \ref{subsec} should say (1.1) and \ref{itemone} is in section \ref{secitemone}, also accessible with \secref{itemone}.

There is another item in section \ref{itemtwo} with item number \refitem{itemtwo}.

\end{document}

结果:

在此处输入图片描述

请注意,超链接仍然指向实际项目,而不是部分。这可能被视为可取的,但如果您想链接到部分,那么事情会变得有点复杂,因为您还需要跟踪部分锚点(etc.\thesection不这样做,它们只存储数字)。

还请注意,这可能会导致您自己未定义的重复标签。\section{Introduction}\label{secintro}例如,如果您有一个部分和一个项目\item xyz \labelwithsec{intro},那么您将收到有关已定义标签的警告,即使您自己选择了不同的名称。

相关内容