我正在尝试整理一个示例文档(更像是这里的一个(对于某种官方决定,我不会用细节来烦你)显示了参考文献如何随着参考书目样式的变化而变化。我计划使用相同的参考书目数据库,它将以不同的样式一次又一次地呈现。
我的最小工作示例是这样的。
\documentclass{article}
\usepackage{multibbl}
\begin{document}
\section{ACM Format}
\newbibliography{ACM}
We can cite an article in journal~\cite{ACM}{artjournal}
\bibliographystyle{ACM}{acm}
\bibliography{ACM}{mybibdb}{References}
\section{IEEE Format}
\newbibliography{IEEE}
We can cite an article in journal~\cite{IEEE}{artjournal}
\bibliographystyle{IEEE}{ieeetr}
\bibliography{IEEE}{mybibdb}{References}
\end{document}
这里是,mybibdb.bib
。
@Article{artjournal,
author = {Author Name},
title = {Article name in Journal},
journal = {Journal Name},
year = {2012}
}
问题是,编译时,我收到 的多重定义标签消息artjournal
。这是我无法忽略的事情,因为当我添加更多引用时,分配的引用编号将变得不正确。
有没有办法可以反复使用同一个数据库,而不必经过艰苦的过程,使 bib 文件中的多个相似条目的键不同?(或者使用几个独立的主文件?)
解决方案完成后
答案1
更新
我认为现在这个功能正是你想要的。基本上,它的作用是确保每个单独的引用都“附加”一个唯一的标签。
\documentclass{article}
\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
@Article{artjournal,
author = {Author Name},
title = {Article name in Journal},
journal = {Journal Name},
year = {2012}
}
\end{filecontents}
\usepackage{multibbl}
\makeatletter
\def\@citex[#1]#2#3{%
\let\@citea\@empty
\@cite{\@for\@citeb:=#3\do
{\@citea\def\@citea{,\penalty\@m\ }%
\edef\@citeb{\@firstofone\@citeb\@empty}%
\@ifundefined{#2@auxfile}{}{\expandafter\immediate%
\write\csname #2@auxfile\endcsname{\string\citation{\@citeb}}}%
\@ifundefined{b@#2\@citeb}{\mbox{\reset@font\bfseries ?}%
\G@refundefinedtrue
\@latex@warning
{Citation ‘\@citeb’ on page \thepage \space undefined for style #2 }}%
{\hbox{\csname b@#2\@citeb\endcsname}}}}{#1}}
\def\@bibitem#1{\item\if@filesw \immediate\write\@auxout
{\string\bibcite{\bibtype#1}{\the\value{\@listctr}}}\fi\ignorespaces}
\def\@lbibitem[#1]#2{\item[\@biblabel{#1}\hfill]\if@filesw
{\let\protect\noexpand
\immediate
\write\@auxout{\string\bibcite{\bibtype#2}{#1}}}\fi\ignorespaces}
\def\bibliography#1#2#3{%
\@ifundefined{#1@auxfile}{}{\expandafter\immediate%
\write\csname #1@auxfile\endcsname{\string\bibdata{#2}}}%
\def\bibname{#3}%
\def\refname{#3}%
\def\bibtype{#1}%
\@input@{#1.bbl}}
\makeatother
\begin{document}
\section{ACM Format}
\newbibliography{ACM}
We can cite an article in journal~\cite{ACM}{artjournal}
\bibliographystyle{ACM}{acm}
\bibliography{ACM}{\jobname}{References}
\section{IEEE Format}
\newbibliography{IEEE}
We can cite an article in journal~\cite{IEEE}{artjournal}
\bibliographystyle{IEEE}{ieeetr}
\bibliography{IEEE}{\jobname}{References}
\end{document}
一些简短的评论,因此它不仅仅是不透明的代码:
其中的关键是重新定义标签的使用方式。
通常
\bibcite{x}
,与文件一起读入的bbl
定义了一个标签b@<key>
,这是您的问题。我们重新定义了两个内部命令\@bibitem
和,\@lbibitem
这样(相反)标签就变成了以下形式,b@<bibtype><key>
其中是“键”参考书目正在被使用。我们进行修补
\bibliography...
以便它重置\bibtype
,以便在其中定义的标签是唯一的。我们进行修补
\citex
,以便它使用的标签基于用于.aux
该引用的特定文件。
这将产生以下内容: