bibtex 具有同一参考文献的多个别名

bibtex 具有同一参考文献的多个别名

我可以这样做吗bibtex?我和其他一些合作者有几份不同的手稿,如果我能制作\cite{foo}\cite{bar}指向同一件事,对我来说会更容易。当然,有办法解决这个问题,比如在手稿的任何地方都更改\cite{foo}\cite{bar},或者在文件中复制bibtex条目.bib,但我宁愿不这样做。

答案1

我不知道是否有可能重新映射.bib文​​件中的键;如果这是真的(我认为是真的)那么这确实是一个缺点。

因此,我的解决方案是基于在 LaTeX 前言中进行重新映射,而且这些天我经常使用propLaTeX3 的数据类型,因为它在这种情况下非常有用。

基本思想是使用一个属性列表,将引用键存储为键,将目标键存储为值。然后,每当运行引用命令时,我们都会查找键,如果存在映射,则使用映射。这样,文件最终.aux将只包含重新映射的键,BibTeX 只会找到这些键。

\documentclass{article}

\usepackage{expl3}

\ExplSyntaxOn
\prop_new:N \g_cite_map_prop
\tl_new:N \l_citekey_result_tl

\cs_new:Npn \mapcitekey #1#2 {
  \clist_map_inline:nn {#2}
       {  \prop_gput:Nnn  \g_cite_map_prop  {##1} {#1}   }
}

\cs_new:Npn \getcitekey #1 {
   \prop_get:NoN \g_cite_map_prop{#1}  \l_citekey_result_tl
   \quark_if_no_value:NF \l_citekey_result_tl
       {  \tl_set_eq:NN #1  \l_citekey_result_tl  }
}

\cs_new:Npn \showcitekeymaps {\prop_show:N  \g_cite_map_prop }
\ExplSyntaxOff

这给了我们\mapcitekey两个参数:第一个是我们想要与 BibTeX 一起使用的主键,第二个是我们要重新映射的备用键。事实上,第二个参数也可以是一个逗号分隔的列表,例如,

\mapcitekey{hello}{world}
\mapcitekey{foo}{bar,baz,foobar}

\showcitekeymaps

这将给我们

The property list \g_cite_map_prop contains the pairs (without outer braces):
>  {world}  =>  {hello}
>  {bar}  =>  {foo}
>  {baz}  =>  {foo}
>  {foobar}  =>  {foo}.

现在要查找我们已经知道的内容\getcitekey,剩下要做的就是修补引用命令以使用此密钥。我已在下面针对标准 LaTeX 执行了此操作\cite\nocite如果使用其他引用包,则需要修补其引用命令。基本上,您需要查找将命令写入文件natbib的位置,并且在参数中使用的命令是需要更改密钥的命令。\citation.aux\citation

因此需要以下补丁:

\usepackage{etoolbox}
\makeatletter
\patchcmd{\@citex}{\if@filesw}{\getcitekey\@citeb \if@filesw}%
    {\typeout{*** SUCCESS ***}}{\typeout{*** FAIL ***}}
\patchcmd{\nocite}{\if@filesw}{\getcitekey\@citeb \if@filesw}%
    {\typeout{*** SUCCESS ***}}{\typeout{*** FAIL ***}}
\makeatletter

通过上述定义和重新映射,输入

\cite{foo} \cite{bar} \cite{world} \cite{baz}

将在 aux 文件中为我们提供以下引用:

\citation{foo}
\citation{foo}
\citation{hello}
\citation{foo}

顺便说一句,使用不同的键复制 BibTeX 条目是不是开始工作(如问题所建议的那样)。这将导致两次获得相同的引用。

答案2

您可以切换到biblatex。那里有一个输入字段IDS,可以满足您的要求。

@Article{hier,
  IDS = {da},
  author    = {Vorname Nachname AND Maximilian Mustermann},
  title     = {Dies ist ein testtitel},
  journal   = {Testjournal},
  year      = {2001},
  timestamp = {2018-01-08},
}

现在您可以引用此条目\cite{hier}以及\cite{da}

(不知道 as as 部分是否是正确的英语,但听起来不错。)

答案3

这有点像黑客手段,但它可能对你有用。

\newcommand\OurCite[2]{\cite{#1}}% In the source for author 1

或者

\newcommand\OurCite[2]{\cite{#2}}% In the source for author 2

并在文件中:

(...) see e.g.{} \OurCite{foo}{bar}

相关内容