我对我的论文有以下要求:如果我引用多个引文,我应该首先引用我的论文。我所有的论文名称都以“ my:
”开头。
所以我想定义一个新的命令,其工作方式如下:
\newcite{paper1, my:paper2, paper3, my:paper4}
此命令应等效于以下命令
\cite{my:paper2, my:paper4}, \cite{paper1, paper3}
做到这一点最简单的方法是什么?
答案1
xparse
我们可以利用和的强大功能l3regex
:
\begin{filecontents*}{\jobname.bib}
@article{my:paper1,
author={BCP, X.},
title={My paper 1},
journal={J.},
year={2014},
}
@article{my:paper2,
author={BCP, X.},
title={My paper 2},
journal={J.},
year={2015},
}
@article{paper1,
author={Uthor, A.},
title={Not my paper 1},
journal={J.},
year={2014},
}
@article{paper2,
author={Riter, W.},
title={Not my paper 2},
journal={J.},
year={2015},
}
\end{filecontents*}
\documentclass{article}
%\usepackage{xparse} % only needed for LaTeX prior to 2020-10-01
\ExplSyntaxOn
\NewDocumentCommand{\mcite}{m}
{
\clist_clear:N \l_bcp_mycites_clist
\clist_clear:N \l_bcp_othercites_clist
\clist_map_inline:nn { #1 }
{
\regex_match:nnTF { \A my\: } { ##1 }
{
\clist_put_right:Nn \l_bcp_mycites_clist { ##1 }
}
{
\clist_put_right:Nn \l_bcp_othercites_clist { ##1 }
}
}
\clist_if_empty:NTF \l_bcp_mycites_clist
{
\bcp_cite:V \l_bcp_othercites_clist
}
{
\bcp_cite:V \l_bcp_mycites_clist
\clist_if_empty:NF \l_bcp_othercites_clist
{
, ~ \bcp_cite:V \l_bcp_othercites_clist
}
}
}
\cs_set_eq:NN \bcp_cite:n \cite
\cs_generate_variant:Nn \bcp_cite:n { V }
\ExplSyntaxOff
\begin{document}
Mixed citation: \mcite{paper1, my:paper1, paper2, my:paper2}
My citations only: \mcite{my:paper2,my:paper1}
Other citations only: \mcite{paper1,paper2}
\bibliographystyle{plain}
\bibliography{\jobname}
\end{document}
该mcite
命令扫描参数并根据下一个键是否以 开头构建两个不同的逗号分隔列表my:
。然后,这些列表作为参数传递给\cite
。当且仅当两个列表都不为空时,才会在两者之间插入逗号和空格。