当我在枚举列表中定义标签时,我会获得对项目编号的引用。
是否可以获取该部分的参考?
例子:
\documentclass[english]{scrartcl}
\usepackage{babel}
\usepackage{blindtext}
\newcommand\secref[1]{[section of label '#1']}%<-- I ask for this function.
\begin{document}
%Should be: The 2nd item point on page 3 is in section 2.3.1
The \ref{mylabel}nd item point on page \pageref{mylabel} is in section \secref{mylabel}
%Should be: The 2nd item point on page 3 is in section 2.3.1
The \ref{mylabel}nd item point on page \pageref{mylabel} is in section \ref{sec:mylabel}
\blinddocument%create some (sub)sections
\label{sec:mylabel}
\begin{enumerate}
\item point 1
\item \label{mylabel} here is a label
\end{enumerate}
\end{document}
备注 I:我不想总是\ref
显示部分引用。我希望可以选择获取项目引用或部分引用。
备注二:我例子中的第二句显示了我想要的结果。但我想避免定义帮助标签 sec:mylabel
。
答案1
发出两个\label
命令:
\documentclass{article}
\makeatletter
\newcommand{\seclabel}[1]{{%
\label{#1}%
\edef\@currentlabel{\thesection}%
\label{sec:#1}}}
\makeatother
\begin{document}
\section{A}
\begin{enumerate}
\item X
\item\seclabel{mylabel} Y
\item Z
\end{enumerate}
This is a reference to item~\ref{mylabel} in section~\ref{sec:mylabel}
on page~\pageref{mylabel}.
\end{document}
这给出
这是对第 1 页第 1 节第 2 项的引用。
当然,如果hyperref
已加载,单击创建的链接\ref{sec:mylabel}
将会转到enumerate
环境中的项目。
答案2
zref
是对 LaTeX 提供的传统 2 件\label
式\ref
系统的扩展,该系统产生 (1) 标签和 (2) 页码。相反,它基于所谓的属性列表运行,支持使用相同标签的多个引用:
\documentclass{article}
\usepackage{zref}% http://ctan.org/pkg/zref
\makeatletter
\zref@newlist{allref}% Reference details stored in list 'allref'
\zref@newprop*{section}[??]{\thesection}% Create new 'section' property
\zref@addprops{allref}{section, page, default}% allref reference (or property list) has section, page and default
\newcommand{\mylabel}[1]{%
\zref@labelbylist{#1}{allref}% Write allref list to .aux (using zref)
}
\newcommand{\myref}[2][default]{\zref@extract{#2}{#1}\zref@refused{#2}}%
\makeatother
\begin{document}
\section{A}
\begin{enumerate}
\item X
\item Y \mylabel{mylabel}
\item Z
\end{enumerate}
This is a reference to item~\myref{mylabel} in section~\myref[section]{mylabel}
on page~\myref[page]{mylabel}.
\end{document}
上述 MWE 提供了\mylabel
与 类似的功能以及的\label
附带功能。如果按原样使用,则相当于。但是,要得出与 关联的部分编号,请使用。这将提取存储在列表中的属性值。可以添加任意数量的可以提取的附加属性。\myref
\ref
\mylabel{<label>}
\label{<label>}
\myref{<label>}
\ref{<label>}
<label>
\myref[section]{<label>}
上述方法的一个注意事项是标签存储在页面发货处(原因显而易见,与异步发货例程有关)。而且,除属性之外的其他值page
可能会在被\mylabel
编辑和被\myref
编辑之间发生变化。必须做一些工作来克服这个问题,可能使用双标签。
当然,也可以覆盖\label
和\ref
本身的含义来使用这个,但这意味着全局的变化。
答案3
我的方法是重新定义命令,并通过使用针对当前节计数器\label
创建一个以 为前缀的同名引用,确保通过使用命令撤消之前的操作。sec:
\refstepcounter{section}
step
\addtocounter{section}{-1}
\documentclass[english]{article}
\usepackage{lipsum}
%Redefine commands.
\let\oldlabel\label
\makeatletter
\renewcommand{\label}[1]{%
\oldlabel{#1}%
\edef\@currentlabel{\thesection}
\oldlabel{sec:#1}%
}
\makeatother
\begin{document}
\section{Section A}
\lipsum[2]
\section{Section B}
\lipsum[2]
\section{Section C}
\begin{enumerate}
\item Point 1
\item Point 2\label{mylabel} here is a label
\end{enumerate}
\section{Section D}
The \ref{mylabel}nd item point on page \pageref{mylabel} is in section \ref{sec:mylabel}
\end{document}
如果您想创建secref
类似的命令pageref
,则可以通过以下方式轻松创建:
\newcommand{\secref}[1]{\ref{sec:#1}}
输出:
同样,如果书籍类正在使用,可以进一步扩展以包含chpref
章节引用:
%Redefine commands.
\let\oldlabel\label
\makeatletter
\renewcommand{\label}[1]{%
\oldlabel{#1}%
\edef\@currentlabel{\thesection}
\oldlabel{sec:#1}%
\edef\@currentlabel{\thechapter}
\oldlabel{chp:#1}%
}
\makeatother
\newcommand{\secref}[1]{\ref{sec:#1}}
\newcommand{\chpref}[1]{\ref{chp:#1}}
答案4
@egreg 的回答很棒。但是如果您使用 hyperref 包,则该部分的标签会链接到定理而不是部分标题。我的解决方案解决了这个问题:
\documentclass{article}
%\usepackage[hyperref]{waynemath}
\usepackage{hyperref}
\makeatletter
\newcommand{\mylabel}[1]{{%
\label{#1}%
\edef\@currentlabel{\thesection}%
\label{sec-redirect:#1}}}
\makeatother
\newcommand{\seclabel}{\label{sec-auto:\thesection}}
\newcommand{\secref}[1]{\ref{sec-auto:\getrefnumber{sec-redirect:#1}}}
\begin{document}
\section{A}\seclabel{}
content
\section{B}\seclabel{}
content
\begin{enumerate}
\item X
\item\mylabel{mylabel} Y
\item Z
\end{enumerate}
\section{C}\seclabel{}
See item \ref{mylabel} in Section \secref{mylabel} on page \pageref{mylabel}.
\end{document}