newcommand:根据参数的数量有不同的行为吗?

newcommand:根据参数的数量有不同的行为吗?

我想让我的引文更简单。我从事理论物理学,其中的引文都是编号的,因此\cite{citation}只需拉出“[1]”(例如)。常见用法是写“Ref. [1]”。我创建了一个新命令来处理这个问题:

\newcommand{\rcite}[1]{Ref.~\cite{#1}}

我想做的是扩展它以了解我是否传递了 2 个或更多参数,在这种情况下,将 Ref. 更改为 Refs。但我一点也不知道该怎么做,而且我查看了文档却一无所获。有什么想法吗?

答案1

这是一个简单的界面:

\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand{\rcite}{m}
 {
  \tl_if_in:nnTF { #1 } { , }
   { Refs.\nobreakspace\cite{#1} } % a comma in the argument
   { Ref.\nobreakspace\cite{#1} }  % no comma
 }
\ExplSyntaxOff

\begin{document}
\rcite{a}

\rcite{a,b}

\begin{thebibliography}{9}
\bibitem{a} A citation

\bibitem{b} Another

\end{thebibliography}
\end{document}

它不包括可选参数(仅对单个引用有意义),但可以轻松添加。

在此处输入图片描述

“经典”的做法可以是

\makeatletter
\DeclareRobustCommand{\rcite}[1]{%
  \rcite@aux#1,\@nil{#1}%
}
\def\rcite@aux#1,#2\@nil#3{%
  \if\relax#2\relax
    % just one key
    Ref.~\cite{#3}%
  \else
    Refs.~\cite{#3}%
  \fi
}
\makeatother

一个更复杂的接口,允许获取

参考文献12

形式为\rcite*。还允许使用可选参数,但假定只引用一个项目。

\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand{\rcite}{som}
 {
  \IfValueTF{#2}
   { Ref.\nobreakspace\cite[#2]{#3} }
   {
    \IfBooleanTF{#1}
     { \adam_rcite_sep:n { #3 } }
     { \adam_rcite_simple:n { #3 } }
   }
 }

\seq_new:N \l__adam_rcite_items_seq
\cs_new_protected:Npn \adam_rcite_simple:n #1
 {
  \tl_if_in:nnTF { #1 } { , } { Refs } { Ref }
  .\nobreakspace
  \cite{#1}
 }
\cs_new_protected:Npn \adam_rcite_sep:n #1
 {
  \seq_clear:N \l__adam_rcite_items_seq
  \int_compare:nTF { \clist_count:n { #1 } > 1 }
   { Refs }
   { Ref }
  .\nobreakspace
  \clist_map_inline:nn { #1 }
   {
    \seq_put_right:Nn \l__adam_rcite_items_seq { \cite{##1} }
   }
  \seq_use:Nnnn \l__adam_rcite_items_seq { ~and~ } { ,~ } { ,~and~ }
 }
\ExplSyntaxOff

\begin{document}
Optional argument: \rcite[p.~3]{a}

One: \rcite{a}; two: \rcite{a,b}; three: \rcite{a,b,c}

One: \rcite*{a}; two: \rcite*{a,b}; three: \rcite*{a,b,c}

\begin{thebibliography}{9}
\bibitem{a} A citation

\bibitem{b} Another

\bibitem{c} Again

\end{thebibliography}
\end{document}

在此处输入图片描述

答案2

这是针对(无限)数量引用的解决方案,只需使用带有包的逗号分隔列表即可etoolbox

\documentclass[paper=a4,12pt]{scrbook}

\usepackage{etoolbox}%
\usepackage[backend=biber]{biblatex}%

\listgadd{\myreferencelist}{}%

\newcounter{listcounter}


\newcommand{\rcite}[1]{%
\undef\myreferencelist%
\setcounter{listcounter}{0}
\forcsvlist{\listgadd{\myreferencelist}}{#1}
\renewcommand*{\do}[1]{%
\stepcounter{listcounter}%
}%
\dolistloop{\myreferencelist}%
\ifnumgreater{\number\value{listcounter}}{1}{%
  Refs. 
}{%
  Ref.
}%
\edef\mytemp{\number\value{listcounter}}%
\setcounter{listcounter}{0}%
\renewcommand*{\do}[1]{%
  \stepcounter{listcounter}%
  \cite{##1}%
  \ifnumequal{\mytemp}{1}{%
  }{%
    \ifnumequal{\number\value{listcounter}}{\mytemp}{
      }{%
        ,
      }%
    }%  
  }%
  \dolistloop{\myreferencelist}%
}%



\bibliography{biblio}

\begin{document}

% CSV - List
\rcite{Lam94, GSM97,Lam94}

% Just one reference
\rcite{Lam94}

\printbibliography%


\end{document}

在此处输入图片描述

相关内容