引文中有重复的关键字

引文中有重复的关键字

使用 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}

代码工作原理如下:

  1. \cs_set_eq:Nc \adp_orig_citex:wwn { @citex }保存一份副本\@citex,这是natbib

  2. 代码

     \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为第三个参数(键列表)的扩展内容,然后从中删除重复项并将其提供给以下指令

  3. \adp_orig_citex:nnV { #1 } { #2 } \l_tmpa_clist相当于

    \adp_orig_citex:nnn { #1 } { #2 } {<contents of \l_tmpa_clist>}
    

    因为\cs_generate_variant:Nn下面的命令

  4. \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只在最后一行出现一次。

相关内容