我可以这样做吗bibtex
?我和其他一些合作者有几份不同的手稿,如果我能制作\cite{foo}
并\cite{bar}
指向同一件事,对我来说会更容易。当然,有办法解决这个问题,比如在手稿的任何地方都更改\cite{foo}
为\cite{bar}
,或者在文件中复制bibtex
条目.bib
,但我宁愿不这样做。
答案1
我不知道是否有可能重新映射.bib
文件中的键;如果这是真的(我认为是真的)那么这确实是一个缺点。
因此,我的解决方案是基于在 LaTeX 前言中进行重新映射,而且这些天我经常使用prop
LaTeX3 的数据类型,因为它在这种情况下非常有用。
基本思想是使用一个属性列表,将引用键存储为键,将目标键存储为值。然后,每当运行引用命令时,我们都会查找键,如果存在映射,则使用映射。这样,文件最终.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}