[Tex/LaTex] Multiple references with \autoref

cross-referencinghyperref

I am currently using the \autoref command from the hyperref package to refer to my theorems etc. However, I want to be able to (easily) refer to two or more theorems/lemmas/…, e.g. by calling something like \autoref{lemma1,lemma2,lemma5} — where of course lemmas 1, 2 and 5 are labeled lemma1, lemma2 and lemma5 respectively — so that the reference shows: "Lemmas 1, 2 and 5".

Can anyone help me with this? It doesn't seem to me like the hyperref package provides this functionality.

Minimal example

\documentclass{memoir}
\usepackage{amsmath,amssymb}
\usepackage{mathtools}
\usepackage{cleveref}
\mathtoolsset{showonlyrefs,showmanualtags}
\begin{document}
This is the first equation
\begin{equation}
a^2 + b^2 = c^2
\end{equation}
and this is the second equation
\begin{equation}
\label{test}
\alpha^2 + \beta^2 = \gamma^2
\end{equation}
Referring to second equation here: \eqref{test}.
\end{document}

Best Answer

EDIT added a way to set the plural names, which in effect gives foreign language support

I decided that I needed this feature of \autoref today and then I was surprised that I was unable to find it...so here is one way to define an \Autoref command that will do it. Specifically,

\Autoref{ref1,ref2,...}

will expand into the plural of the first reference followed by hyperlinks for all of the references. Here's the sample output from the MWE below:

Sample for multiple <code>\autoref</code>'s

There are a few minor(?) limitations in that the macro assumes that:

  • all of the references are of the same "type" (so all lemmas, or all theorems etc)

  • doesn't handle the optional argument to \autoref or the *-form (would be easy to fix...)

  • it probably does not play well with equation references

  • by default the plural form is obtained simply by adding an s to the "singular" name (so it is English centric). This can be overridden by defining a plural version of the autorefname, for example \providecommand*{\lemmaautorefnameplural}{Lots of lemmas}. A more realistic application would be to define plurals for other languages. The ...autorefnameplural form is optional

The \Autoref macro behaves like \autoref when it is given one reference.

Anyway, here's the code:

\documentclass[a4paper]{amsart}
\usepackage[colorlinks=true]{hyperref}
\makeatletter

% define a macro \Autoref to allow multiple references to be passed to \autoref
\newcommand\Autoref[1]{\@first@ref#1,@}
\def\@throw@dot#1.#2@{#1}% discard everything after the dot
\def\@set@refname#1{%    % set \@refname to autoefname+s using \getrefbykeydefault
    \edef\@tmp{\getrefbykeydefault{#1}{anchor}{}}%
    \xdef\@tmp{\expandafter\@throw@dot\@tmp.@}%
    \ltx@IfUndefined{\@tmp autorefnameplural}%
         {\def\@refname{\@nameuse{\@tmp autorefname}s}}%
         {\def\@refname{\@nameuse{\@tmp autorefnameplural}}}%
}
\def\@first@ref#1,#2{%
  \ifx#2@\autoref{#1}\let\@nextref\@gobble% only one ref, revert to normal \autoref
  \else%
    \@set@refname{#1}%  set \@refname to autoref name
    \@refname~\ref{#1}% add autoefname and first reference
    \let\@nextref\@next@ref% push processing to \@next@ref
  \fi%
  \@nextref#2%
}
\def\@next@ref#1,#2{%
   \ifx#2@ and~\ref{#1}\let\@nextref\@gobble% at end: print and+\ref and stop
   \else, \ref{#1}% print  ,+\ref and continue
   \fi%
   \@nextref#2%
}

\makeatother
\newtheorem{lemma}{Lemma}
\providecommand*{\lemmaautorefname}{Lemma}
%\providecommand*{\lemmaautorefnameplural}{Lots of lemmas}
\parindent=0pt
\begin{document}

\begin{lemma}1+1=2\label{one}\end{lemma}
\begin{lemma}2+2=4\label{two}\end{lemma}
\begin{lemma}3+3=6\label{three}\end{lemma}

By \autoref{one}, \autoref{two} and \autoref{three} we are amazed.

By \Autoref{one} we are not amazed.

By \Autoref{one,two} we are a little amazed.

By \Autoref{one,two,three} we are quite amazed.

\end{document}

If you uncomment the line

\providecommand*{\lemmaautorefnameplural}{Lots of lemmas}

then the output is:

enter image description here

A more realistic use of this feature would be to add foreign language support.

Related Question