我想在枚举中标记一个项目,然后稍后引用项目编号 (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}
,那么您将收到有关已定义标签的警告,即使您自己选择了不同的名称。