使用 bibtex、natbib,考虑以下内容:
\def\grpA{key1,key2,key3}
\def\grpB{key3,key4,key5}
The first set\citep{\grpA} and the second set\citep{\grpB} discuss XYZ.
In total\citep{\grpA,\grpB}, the bla bla bla is in common.
问题在于,由于key3
对 grpA 和 grpB 来说是共同的,所以总引用集实际上将 key3 放入了两次,这不仅破坏了sort&compress
的选项natbib
,而且实际上将相同的引用放入了两次,而没有将它们识别为相同的。
有没有办法检测并丢弃重复项?我正在尝试总结大约 500 多篇论文,像这样定义组很方便,但有些键会很常见。
答案1
\cite?
以下是使用以下所有命令删除重复项的方法natbib
:
\begin{filecontents*}{\jobname.bib}
@article{key1,
author={A. Author},
title={Title},
journal={Journal},
year={2000},
}
@article{key2,
author={A. Buthor},
title={Title},
journal={Journal},
year={2000},
}
@article{key3,
author={A. Cuthor},
title={Title},
journal={Journal},
year={2000},
}
@article{key4,
author={A. Duthor},
title={Title},
journal={Journal},
year={2000},
}
@article{key5,
author={A. Euthor},
title={Title},
journal={Journal},
year={2000},
}
\end{filecontents*}
\documentclass{article}
\usepackage[sort&compress]{natbib}
\usepackage{expl3}
\ExplSyntaxOn
\AtBeginDocument{
\cs_set_eq:Nc \adp_orig_citex:wwn { @citex }
\cs_set:cpn { @citex } [ #1 ] [ #2 ] #3
{
\clist_set:Nx \l_tmpa_clist { #3 }
\clist_remove_duplicates:N \l_tmpa_clist
\adp_orig_citex:nnV { #1 } { #2 } \l_tmpa_clist
}
} % end of \AtBeginDocument
\cs_new:Npn \adp_orig_citex:nnn #1 #2 #3
{
\adp_orig_citex:wwn [ #1 ] [ #2 ] { #3 }
}
\cs_generate_variant:Nn \adp_orig_citex:nnn { nnV }
\ExplSyntaxOff
\begin{document}
\def\grpA{key1,key2,key3}
\def\grpB{key3,key4,key5}
The first set \citep{\grpA} and the second set \citep{\grpB} discuss XYZ.
In total \citep{\grpA,\grpB}, the bla bla bla is in common.
\bibliographystyle{plainnat}
\bibliography{\jobname}
\end{document}
代码工作原理如下:
\cs_set_eq:Nc \adp_orig_citex:wwn { @citex }
保存一份副本\@citex
,这是natbib
代码
\cs_set:cpn { @citex } [ #1 ] [ #2 ] #3 { \clist_set:Nx \l_tmpa_clist { #3 } \clist_remove_duplicates:N \l_tmpa_clist \adp_orig_citex:nnV { #1 } { #2 } \l_tmpa_clist }
重新定义
\@citex
以执行更多步骤;它将变量设置\l_tmpa_clist
为第三个参数(键列表)的扩展内容,然后从中删除重复项并将其提供给以下指令\adp_orig_citex:nnV { #1 } { #2 } \l_tmpa_clist
相当于\adp_orig_citex:nnn { #1 } { #2 } {<contents of \l_tmpa_clist>}
因为
\cs_generate_variant:Nn
下面的命令\adp_orig_citex:nnn
只需拨打原件即可\@citex
答案2
删除重复项的一种方法是:
\usepackage{natbib}
\begin{document}
\def\grpA{key1,key2,key3}
\def\grpB{key3,key4,key5}
\def\merge#1{\mergexx#1,\relax,}
\def\mergexx{\expandafter\mergex}
\def\mergex#1,{%
\ifx\relax#1\else
\ifcsname @??#1\endcsname\else
#1,\expandafter\ifx\csname @??#1\endcsname\relax\fi
\fi
\expandafter\mergexx
\fi}
\let\oldcitep\citep
\protected\def\citep#1{{\xdef\tmp{\noexpand\oldcitep{\merge{#1}}}}\tmp}
The first set\citep{\grpA} and the second set\citep{\grpB} discuss XYZ.
In total\citep{\grpA,\grpB}, the bla bla bla is in common.
\end{document}
留下一个辅助文件
\relax
\citation{key1,key2,key3,}
\citation{key3,key4,key5,}
\citation{key1,key2,key3,key4,key5,}
注释key3
只在最后一行出现一次。