我想让我的引文更简单。我从事理论物理学,其中的引文都是编号的,因此\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
一个更复杂的接口,允许获取
形式为\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}