更新

更新

我正在尝试整理一个示例文档(更像是这里的一个(对于某种官方决定,我不会用细节来烦你)显示了参考文献如何随着参考书目样式的变化而变化。我计划使用相同的参考书目数据库,它将以不同的样式一次又一次地呈现。

我的最小工作示例是这样的。

\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 文件中的多个相似条目的键不同?(或者使用几个独立的主文件?)

解决方案完成后

完整的(非 MWE)一堆我的工作文件(与优秀的解决方案合并)可以找到这里对于那些可能需要它的人来说。

答案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}

一些简短的评论,因此它不仅仅是不透明的代码:

  1. 其中的关键是重新定义标签的使用方式。

  2. 通常\bibcite{x},与文件一起读入的bbl定义了一个标签b@<key>,这是您的问题。我们重新定义了两个内部命令\@bibitem和,\@lbibitem这样(相反)标签就变成了以下形式,b@<bibtype><key>其中是“键”参考书目正在被使用。

  3. 我们进行修补\bibliography...以便它重置\bibtype,以便在其中定义的标签是唯一的。

  4. 我们进行修补\citex,以便它使用的标签基于用于.aux该引用的特定文件。

这将产生以下内容:

输出

相关内容