我的 TeX 文档中定义了一些方便的命令:
\newcommand{\figref}[2][\ref]{Fig.~#1{#2}} % Figure
\newcommand{\tabref}[2][\ref]{Table~#1{#2}} % Table
\newcommand{\equref}[2][\eqref]{Eq.~#1{#2}} % Equation
\newcommand{\algref}[2][\ref]{Algorithm~#1{#2}} % Algorithm (Pseudocode)
\newcommand{\secref}[2][\ref]{Section~#1{#2}} % Section
\newcommand{\chapref}[2][\ref]{Chapter~#1{#2}} % Chapter
这些命令允许我根据需要轻松地在缩短(图)和未缩短(图)引用之间切换,它们甚至在以下情况下也能发挥作用:
\caption{This is a figure with multiple subfigures. In \figref[\subref]{fig:first_subfigure} we see X, while in \figref[\subref]{fig:second_subfigure} we see Y.}
然而有时在我的文章中我会引用类似
In Figs.~\ref{fig:1}, \ref{fig:2}, and \ref{fig:3} we can see that ...
有没有办法让这些命令处理任意数量的参数,这样就\figref{fig:1}
可以扩展到Fig.~\ref{fig:1}
\figref{fig:1,fig:2}
将扩展为Figs.~\ref{fig:1} and \ref{fig:2}
并\figref{fig:1,fig:2,fig:3,fig:4}
会扩大到Figs.~\ref{fig:1}, \ref{fig:2}, \ref{fig:3}, and \ref{fig:4}
然后可以用相同的方式处理任意数量的参数。
答案1
我建议你熟悉一下聪明人包及其二主要用户宏:\cref
和\crefrange
。它们使得无需定义单独的宏来交叉引用图形、表格、节、公式、章节等。
\documentclass{article}
\usepackage[capitalise]{cleveref}
\newcommand\creflastconjunction{, and } % Oxford comma
\begin{document}
\refstepcounter{figure}\label{fig:a}
\refstepcounter{figure}\label{fig:bb}
\refstepcounter{figure}\label{fig:ccc}
\refstepcounter{figure}\label{fig:dddd}
\refstepcounter{equation}\label{eq:a}
\refstepcounter{equation}\label{eq:b}
\refstepcounter{equation}\label{eq:c}
\cref{fig:bb}
\cref{fig:a,fig:bb,fig:dddd,fig:ccc}
\cref{fig:bb,fig:dddd,fig:a}
\crefrange{eq:a}{eq:c}
\cref{eq:b,fig:ccc}
\end{document}
答案2
\documentclass{article}
\ExplSyntaxOn
\NewDocumentCommand\figref{m}
{
\tl_if_blank:nF{#1}
{
\seq_set_from_clist:Nn \l_tmpa_seq {#1}
\seq_set_map:NNn\l_tmpa_seq\l_tmpa_seq{\ref{##1}}
\int_compare:nNnTF {\seq_count:N \l_tmpa_seq}={1}
{Fig.\nobreakspace}{Figs.\nobreakspace}
\seq_use:Nnnn\l_tmpa_seq{~and~}{,~}{~and~}
}
}
\ExplSyntaxOff
\begin{document}
\figref{a}
\figref{a,b}
\figref{a,b,c,d}
\refstepcounter{figure}\label{a}
\refstepcounter{figure}\label{b}
\refstepcounter{figure}\label{c}
\refstepcounter{figure}\label{d}
\end{document}
(\seq_use:Nnnn\l_tmpa_seq{~and~}{,~}{,~and~}
最后一个逗号)