\newcommand 具有任意数量的参数

\newcommand 具有任意数量的参数

我的 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~}最后一个逗号)

在此处输入图片描述

相关内容