Latex - 如何在enumitem中引用项目的文本

时间:2015-12-10 21:40:14

标签: latex enumerate

我使用enumitem来枚举我的变量列表。

我有一个变量列表,如:

\begin{enumerate}
\item My First Cool Variable \label{var:myvar1}
\item My Second not so Cool Variable \label{var:myvar2}
\item My Third so so \label{var:myvar3}
\end{enumerate}

当我交叉引用其中一个项目时,我会得到列表键。例如,

Let us reference \ref{var:myvar2} and then my other variable \ref{var:myvar3}

给出:

Let us reference 2 and then my other variable 3

我想要的是不仅能够获得列表键,还能获得整个项目文本,因此输出可能如下:

Let us reference My Second not so Cool Variable and then my other variable My Third so so

目标是只能将变量名称写入一次,并且如果变量名称被修改为更具体的名称,则不会在任何地方进行更改。

有什么想法吗?我已经看过enumitem-zref,但我找不到我想要的东西:/

1 个答案:

答案 0 :(得分:0)

使用Macro to capture until end-of-line as argument中的一些提示,您可以捕获\item后面的内容:

enter image description here

\documentclass{article}

\usepackage{environ}

% https://tex.stackexchange.com/q/127005/5764
\makeatletter
\NewEnviron{wordenumerate}{%
  \begin{enumerate}
    \let\olditem\item
    \def\item##1\item{\dosomething{##1}}%
    \expandafter\@empty\BODY\item
  \end{enumerate}%
}

\let\oldlabel\label
\newcommand{\dosomething}[1]{%
  \def\elvitaluz@arg{#1}%
  \ifx\elvitaluz@arg\elvitaluz@stop
    \end{enumerate}
    \expandafter\env@ignore   % to end the recursion
  \else
    \def\label##1{\def\@textlabel{##1}\let\label\relax}% Capture \label
    \olditem #1
    \ifx\label\relax
      \def\label##1{\@bsphack\@esphack}%
      \edef\@currentlabel{#1}% % what to do with #1
      \expandafter\oldlabel\expandafter{\@textlabel}%
    \fi
    \expandafter\item         % to continue the recursion
  \fi}

\edef\elvitaluz@stop{\noexpand\end{enumerate}\noexpand\env@ignore\space}
\makeatother

\begin{document}

\begin{wordenumerate}
  \item First
  \item Second\label{second}
  \item \label{third}Last
\end{wordenumerate}

Item~2 is \ref{second}. Item~3 is \ref{third}.

\end{document}

建议使用新环境wordenumerate,因为完全不同的\label - \ref正在发挥作用。我不建议将此环境嵌套在其他任何东西中(也是因为使用了environ)。