\ref
我如何定义类似于一次引用子图列表的命令?就像cite
包对引用所做的那样。
可以调整类似的命令\myref{a,c,d}
来为以下 MWE 生成以下输出:
1a,c,d
,1(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}
从现在开始,您应该可以根据您的需要进一步定制输出。