如何从枚举列表内的标签获取部分标签?

如何从枚举列表内的标签获取部分标签?

当我在枚举列表中定义标签时,我会获得对项目编号的引用。

是否可以获取该部分的参考?

例子:

\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}

latex 代码的结果

相关内容