同时使用 multibbl 和 natbib?

同时使用 multibbl 和 natbib?

我在一本书中列出了多个参考书目(每章有几个),并且在戴博文的帮助下上一个问题,我通过使用multibbl包成功地克服了这个问题,但现在我面临着不兼容的问题natbib

Natbib 允许我正确地格式化文本,特别是使用绝对必要的选项[longnamesfirst]\citep、、、等命令。\citealp\citeauthor\citeyear

是否有一种解决方法可以使这些包共存,或者有什么想法我可以怎么做?

答案1

简短的回答是,不会,这些包不会自然共存multibblnatbib对不兼容的内部引用命令进行各种重新定义。

明智的答案是,对于多个书目,使用biblatex可能会容易得多,因为它可以轻松处理多个书目(例如这个答案) 和 (使用natbib包选项) 将定义所有命令,如\citeauthor等,因此具有两者的功能 multibblnatbib在一个封装中。

较长的回答是,似乎确实有可能让这两个包的元素一起工作,但这并不优雅,不幸的是,longnamesfirst到目前为止我还没有找到一种方法来工作。主要的不兼容性在于它们对 的重新定义\@citexmultibbl将其重新定义为

\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\citeauthornatbib不依赖\@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 所以这是一个不错的选择

相关内容