如何一次交叉引用子图列表?

如何一次交叉引用子图列表?

\ref我如何定义类似于一次引用子图列表的命令?就像cite包对引用所做的那样。

可以调整类似的命令\myref{a,c,d}来为以下 MWE 生成以下输出: 1a,c,d1(a,c,d)

如果它可以将标签组合在一起,那就太好了,例如\myref{a,b,c,d}将生成1a--d

是否有任何包可以实现这种交叉引用?

\documentclass{article}
\usepackage{subfig}
\usepackage{hyperref}
\begin{document}
\begin{figure}
\subfloat[][]{Plot 1 \label{a}} 
\subfloat[][]{Plot 2 \label{b}}  \\
\subfloat[][]{Plot 3 \label{c}} 
\subfloat[][]{Plot 4 \label{d}} 
\end{figure}

\noindent Note: \\
Fig.~\ref{a} \\ 
Fig.~\ref{a},b \\
How to generate the following cross-references? \\    
Fig.~1a,b \\ 
Fig.~1a,b \\
Fig.~1a,c,d \\
Fig.~1a--d \\

\end{document}

答案1

cleveref您的示例与 Toby Cubitt (的作者)提供的代码相结合参考范围中的交叉引用 [(1a-1e) 至 (1a-e)] 可以作为开胃菜:

\documentclass{article}
\usepackage{subfig}
\usepackage{hyperref}
\usepackage{cleveref}
\makeatletter
\newcommand\crefstripprefix[2]{%
  \begingroup%
    \edef\@toksa{#1}%
    \edef\@toksb{#2}%
    \def\@accum{}%
    \@crefstripprefix%
    \@result%
  \endgroup}

\def\@crefstripprefix{%
  \let\@iterate\relax%
  \def\accum@flag{0}%
  \let\@tempc\@tempb%
  \cref@poptok{\@toksa}{\@tempa}%
  \cref@poptok{\@toksb}{\@tempb}%
  \ifx\@tempa\@tempb\relax%
    \def\@iterate{\@crefstripprefix}%
    \ifx\@accum\@empty\relax%
      \let\@accum\@tempb%
    \else%
      \ifcat\@tempb\@tempc\relax%
        \ifcat\@tempb a\relax%
          \def\accum@flag{1}%
        \else%
          \expandafter\chardef\expandafter\@tempa%
            \expandafter=\expandafter`\@tempb\relax%
          \ifnum\@tempa>`/\relax%
            \expandafter\ifnum\@tempb<`:\relax%
              \def\accum@flag{1}%
            \fi%
          \fi%
        \fi%
      \fi%
      \def\@tempa{1}%
      \ifx\accum@flag\@tempa%
        \edef\@accum{\@accum\@tempb}%
      \else%
        \let\@accum\@empty%
      \fi%
    \fi%
  \else%
    \ifcat\@tempb\@tempc\relax\else%
      \let\@accum\@empty%
    \fi%
    \edef\@result{\@accum\@tempb\@toksb}%
  \fi%
  \@iterate}

\def\cref@poptok#1#2{%
  \expandafter\expandafter\expandafter\def%
    \expandafter\expandafter\expandafter#2%
    \expandafter\expandafter\expandafter{%
      \expandafter\@cref@firsttok#1\@nil}%
  \expandafter\expandafter\expandafter\def%
    \expandafter\expandafter\expandafter#1%
    \expandafter\expandafter\expandafter{%
      \expandafter\@cref@poptok#1\@nil}}
\def\@cref@firsttok#1#2\@nil{#1}
\def\@cref@poptok#1#2\@nil{#2}
\makeatother

\crefrangelabelformat{figure}{#3#1#4--#5\crefstripprefix{#1}{#2}#6}

\begin{document}
\begin{figure}
\subfloat[][]{Plot 1 \label{a}} 
\subfloat[][]{Plot 2 \label{b}}  \\
\subfloat[][]{Plot 3 \label{c}} 
\subfloat[][]{Plot 4 \label{d}} 
\end{figure}

\noindent Note: \\
\Cref{a} \\ 
\Cref{a,b} \\
\Cref{a,c,d} \\
\Crefrange{a}{d} \\

\end{document}

在此处输入图片描述

从现在开始,您应该可以根据您的需要进一步定制输出。

相关内容