我想引用列表中的项目并获得压缩(不太重要)和排序的输出:
\documentclass{article}
\begin{document}
\begin{enumerate}
\item \label{a} Was.
\item \label{b} It.
\item \label{c} A.
\item \label{d} Cat.
\item \label{e} I.
\item \label{f} Saw.
\end{enumerate}
See points \ref{a, b, c, e, f}.
\end{document}
显然,这不会产生所需的结果,即“查看要点 1、2、3、5、6”。压缩版本“1-3”对我来说并不那么重要;但 hyperref 工作会很好。与 cite 包进行比较。它甚至允许/删除参数中的空格,非常好。
我知道 cleveref,但我不确定它是否可以在这里提供帮助,因为我不(想)定义一个新的环境 - 而且我不确定如何告诉 cleveref 它应该跟踪这个新环境,无论如何......
我想在另一个命令中使用它,所以“查看点 \ref{a}, \ref{b}”不是一个选项。而且无论如何都很糟糕。
搜索了互联网,没有找到。非常感谢。
答案1
Cleveref 提供了一种开箱即用的良好格式,并允许进行定制以满足您的要求。
\documentclass{article}
\usepackage{cleveref}
\crefname{enumi}{point}{points} % default is "item"
\crefrangelabelformat{enumi}{#3#1#4--#5#2#6} % default uses "to" instead of "--"
\begin{document}
\begin{enumerate}
\item \label{a} Was.
\item \label{b} It.
\item \label{c} A.
\item \label{d} Cat.
\item \label{e} I.
\item \label{f} Saw.
\end{enumerate}
See \cref{a,b,c,e,f}.
\end{document}
请注意,逗号后不允许有空格(标签中可以使用空格!)。
答案2
\documentclass{article}
\usepackage{xparse,hyperref}
\ExplSyntaxOn
\AtBeginDocument{
\let\oldref\ref
\RenewDocumentCommand{\ref}{ m }{
\def\@csvsep{\def\@csvsep{, ~}}% https://tex.stackexchange.com/a/89187/5764
\clist_map_inline:nn { #1 } { \@csvsep \oldref{##1}}% https://tex.stackexchange.com/a/159132/5764
}
}
\ExplSyntaxOff
\begin{document}
\begin{enumerate}
\item \label{a} Was.
\item \label{b} It.
\item \label{c} A.
\item \label{d} Cat.
\item \label{e} I.
\item \label{f} Saw.
\end{enumerate}
See points \ref{a, b, c, e, f} or~\ref{d}.
\end{document}