重新排列 \cite 参数

重新排列 \cite 参数

我对我的论文有以下要求:如果我引用多个引文,我应该首先引用我的论文。我所有的论文名称都以“ 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。当且仅当两个列表都不为空时,才会在两者之间插入逗号和空格。

在此处输入图片描述

相关内容