我在一本书中列出了多个参考书目(每章有几个),并且在戴博文的帮助下上一个问题,我通过使用multibbl
包成功地克服了这个问题,但现在我面临着不兼容的问题natbib
。
Natbib 允许我正确地格式化文本,特别是使用绝对必要的选项[longnamesfirst]
和\citep
、、、等命令。\citealp
\citeauthor
\citeyear
是否有一种解决方法可以使这些包共存,或者有什么想法我可以怎么做?
答案1
简短的回答是,不会,这些包不会自然共存multibbl
和natbib
对不兼容的内部引用命令进行各种重新定义。
明智的答案是,对于多个书目,使用biblatex
可能会容易得多,因为它可以轻松处理多个书目(例如这个答案) 和 (使用natbib
包选项) 将定义所有命令,如\citeauthor
等,因此具有两者的功能 multibbl
和natbib
在一个封装中。
较长的回答是,似乎确实有可能让这两个包的元素一起工作,但这并不优雅,不幸的是,longnamesfirst
到目前为止我还没有找到一种方法来工作。主要的不兼容性在于它们对 的重新定义\@citex
,multibbl
将其重新定义为
\def\@citex[#1]#2#3{%
\let\@citea\@empty
\@cite{\@for\@citeb:=#3\do
{\@citea\def\@citea{,\penalty\@m\ }%
\edef\@citeb{\expandafter\@firstofone\@citeb\@empty}%
\@ifundefined{#2@auxfile}{}{\expandafter\immediate%
\write\csname #2@auxfile\endcsname{\string\citation{\@citeb}}}%
\@ifundefined{b@\@citeb}{\mbox{\reset@font\bfseries ?}%
\G@refundefinedtrue
\@latex@warning
{Citation `\@citeb' on page \thepage \space undefined}}%
{\hbox{\csname b@\@citeb\endcsname}}}}{#1}}
插入一个额外的参数并交换默认值
\if@filesw\immediate\write\@auxout{\string\citation{\@citeb}}\fi
为了
\@ifundefined{#2@auxfile}{}{\expandafter\immediate%
\write\csname #2@auxfile\endcsname{\string\citation{\@citeb}}}%
尽管natbib
是否\let\@citex\NAT@citex
或\let\@citex\NAT@citexnum
取决于包选项。因此,我们需要在这两个命令中插入额外的文件.aux
名参数\citeyear
。\citeauthor
natbib
不依赖\@citex
而是有自己的调用,它也必须调整为接受两个参数,第一个是.aux
文件名,第二个是引用键。
打包成一个文件,一些必要的更改似乎
\begin{filecontents}{bibexample.bib}
@book{goossens93,
author = "Michel Goossens and Frank Mittelbach and Alexander Samarin",
title = "The LaTeX Companion",
year = "1993",
publisher = "Addison-Wesley",
address = "Reading, Massachusetts"
}
\end{filecontents}
\documentclass{article}
\usepackage{multibbl}
\newbibliography{biblio1}
\usepackage[longnamesfirst]{natbib}
\makeatletter
\def\NAT@citex%
[#1][#2]#3#4{\let\@citea\@empty
\@cite{\let\NAT@nm\@empty\let\NAT@year\@empty
\@for\@citeb:=#4\do
{\edef\@citeb{\expandafter\@firstofone\@citeb}%
\@ifundefined{#3@auxfile}{}{\expandafter\immediate%
\write\csname #3@auxfile\endcsname{\string\citation{\@citeb}}}%
\@ifundefined{b@\@citeb\@extra@b@citeb}{\@citea%
{\reset@font\bfseries ?}\NAT@citeundefined
\PackageWarning{natbib}%
{Citation `\@citeb' on page \thepage \space undefined}}%
{\hyper@natlinkstart{\@citeb}%
\let\NAT@last@nm=\NAT@nm\let\NAT@last@yr=\NAT@year
\NAT@parse{\@citeb}\ifNAT@full\let\NAT@nm\NAT@all@names\else
\let\NAT@nm\NAT@name\fi
\ifNAT@swa
\ifx\NAT@last@nm\NAT@nm\NAT@yrsep
\ifx\NAT@last@yr\NAT@year \NAT@exlab\else\unskip\ \NAT@date\fi
\else\@citea{\NAT@nm}\NAT@aysep
\ \NAT@date \fi \def\@citea{\NAT@sep\ }%
\else
\ifx\NAT@last@nm\NAT@nm\NAT@yrsep\ifx\NAT@last@yr\NAT@year
\NAT@exlab\else \unskip\ \NAT@date\fi
\else\@citea{\NAT@nm}\ \NAT@open\if\relax#1\relax\else#1\ \fi
\NAT@date\fi
\def\@citea{\NAT@close\NAT@sep\ }%
\fi \hyper@natlinkend
}}\ifNAT@swa\else\if\relax#2\relax\else\NAT@cmt\ #2\fi
\NAT@close\fi}{#1}{#2}}
\def\NAT@citexnum[#1][#2]#3#4{\let\@citea\@empty
\@cite{\@for\@citeb:=#4\do
{\@citea\def\@citea{\NAT@sep\penalty\@m\NAT@space}%
\edef\@citeb{\expandafter\@firstofone\@citeb}%
\@ifundefined{#3@auxfile}{}{\expandafter\immediate%
\write\csname #3@auxfile\endcsname{\string\citation{\@citeb}}}%A
\@ifundefined{b@\@citeb\@extra@b@citeb}{%
{\reset@font\bfseries?}
\NAT@citeundefined\PackageWarning{natbib}%
{Citation `\@citeb' on page \thepage \space undefined}}%
{\NAT@parse{\@citeb}\hbox{\hyper@natlinkstart{\@citeb}%
\NAT@num\hyper@natlinkend}}}}{#1}{#2}}
\renewcommand\citeauthor[2]{%
\@ifundefined{#1@auxfile}{}{\expandafter\immediate%
\write\csname #1@auxfile\endcsname{\string\citation{#2}}}%
\@ifundefined{b@#2\@extra@b@citeb}{%
{\reset@font\bfseries ?}\NAT@citeundefined
\PackageWarning{natbib}%
{Citation `#2' on page \thepage \space undefined}}%
{\NAT@parse{#2}\ifx\NAT@noname\NAT@name
{\reset@font\bfseries(author?)}\PackageWarning{natbib}
{Author undefined for citation `#2'
\MessageBreak
on page \thepage}\else
{\hyper@natlinkstart{#2}\NAT@name\hyper@natlinkend}\fi}%
}
\renewcommand\citeyear[2]{%
\@ifundefined{#1@auxfile}{}{\expandafter\immediate%
\write\csname #1@auxfile\endcsname{\string\citation{#2}}}%
\@ifundefined{b@#2\@extra@b@citeb}{%
{\reset@font\bfseries ?}\NAT@citeundefined
\PackageWarning{natbib}%
{Citation `#2' on page \thepage \space undefined}}%
{\NAT@parse{#2}\if\relax\NAT@date\relax
{\reset@font\bfseries(year?)}\PackageWarning{natbib}
{Year undefined for citation `#2'
\MessageBreak
on page \thepage}\else
{\hyper@natlinkstart{#2}\NAT@date\hyper@natlinkend}\fi}%
}
\renewcommand\citefullauthor[2]{%
\@ifundefined{#1@auxfile}{}{\expandafter\immediate%
\write\csname #1@auxfile\endcsname{\string\citation{#2}}}%
\@ifundefined{b@#2\@extra@b@citeb}{%
{\reset@font\bfseries ?}\NAT@citeundefined
\PackageWarning{natbib}%
{Citation `#2' on page \thepage \space undefined}}%
{\NAT@parse{#2}\ifx\NAT@noname\NAT@all@names
{\reset@font\bfseries(author?)}\PackageWarning{natbib}
{Author undefined for citation `#2'
\MessageBreak
on page \thepage}\else
{\hyper@natlinkstart{#2}\NAT@all@names\hyper@natlinkend}\fi}%
}
\makeatother
\begin{document}
\cite{biblio1}{goossens93}
\citet{biblio1}{goossens93}
\citep{biblio1}{goossens93}
\citealp{biblio1}{goossens93}
\citeauthor{biblio1}{goossens93}
\citeyear{biblio1}{goossens93}
\citefullauthor{biblio1}{goossens93}
\bibliographystyle{biblio1}{plainnat}
\bibliography{biblio1}{bibexample}{References}
\end{document}
答案2
Multibbl
并且natbib
不共存。Biblatex
不允许自定义风格。
因此,我最终选择了chapterbib
最符合我的主要要求(多个书目,使用 natbib 和自定义样式)的方法,即使它也有一些缺点(我特别喜欢书目“标签”为Multibbl
或两个标签\begin{refsection}
和\end{refsection}
为Biblatex
)
编辑:我刚刚发现Chapterbib
还允许使用标签(\begin{cbunit}
和\end{cbunit}
)而不是\include
所以这是一个不错的选择