在 `\ref` 内使用 `\ref`

在 `\ref` 内使用 `\ref`

我想定义一个引用\begin{enumerate}[resume] ... \end{enumerate}环境中的第一项和最后一项的命令。

以下是我目前所做的工作:

\documentclass{book}

\usepackage{enumitem}

\newcounter{groupcounter}

\newenvironment{enumgroup}{
  \stepcounter{groupcounter}
  \enumerate[resume]
  \refstepcounter{enumi}
  \label{groupstart:\thegroupcounter}
  \addtocounter{enumi}{-1}
  \addtocounter{groupcounter}{-1}
  \refstepcounter{groupcounter}
}{
  \label{groupend:\thegroupcounter}
  \endenumerate
}

\newcommand{\grouplabel}[1]{\label{group:#1}}
\newcommand{\groupref}[1]{\ref{groupstart:\ref{group:#1}}~--~\ref{groupend:\ref{group:#1}}}

\begin{document}

\begin{enumgroup} \grouplabel{A}
\item lorem
\item ipsum
\item dolor
\item sit
\end{enumgroup}

\begin{enumgroup} \grouplabel{B}
\item amet
\item etc.
\end{enumgroup}

% Uncomment to switch from MWE to MNWE
%First group : \groupref{A} % Should print First group : 1 -- 4
%Second group : \groupref{B} % 5 -- 6

\end{document}

实际上唯一有趣的行是定义\groupref宏的那一行。我相信其他一切都没问题,因为生成的 aux 文件:

\relax 
\newlabel{groupstart:1}{{1}{1}}
\newlabel{group:A}{{1}{1}}
\newlabel{groupend:1}{{4}{1}}
\newlabel{groupstart:2}{{5}{1}}
\newlabel{group:B}{{2}{1}}
\newlabel{groupend:2}{{6}{1}}

所以我唯一的问题是似乎我无法在 \ref 中使用 \ref。我想我必须以某种方式保护内部调用,但我没有这方面的经验...有人能告诉我如何修复这个宏吗?

答案1

我认为您不需要通过编号组进行间接寻址,这会导致您的nested\ref` 问题。

在此处输入图片描述

\documentclass{book}

\usepackage{enumitem}


\newenvironment{enumgroup}[1]{%
  \enumerate[resume]%
  \refstepcounter{enumi}%
  \def\thisgroup{#1}%
  \label{groupstart:\thisgroup}%
  \addtocounter{enumi}{-1}%
}{%
  \label{groupend:\thisgroup}%
  \endenumerate
}


\newcommand{\groupref}[1]{\ref{groupstart:#1}~--~\ref{groupend:#1}}

\begin{document}

\begin{enumgroup}{A}
\item lorem
\item ipsum
\item dolor
\item sit
\end{enumgroup}

\begin{enumgroup}{B}
\item amet
\item etc.
\end{enumgroup}

% Uncomment to switch from MWE to MNWE

First group : \groupref{A} % Should print First group : 1 -- 4

Second group : \groupref{B} % 5 -- 6

\end{document}

相关内容