使用 biblatex 将“\thechapter”作为参考书目的前缀数字

使用 biblatex 将“\thechapter”作为参考书目的前缀数字

我有一个巨大的文档,想用 biblatex 执行以下操作:

  1. 为每个章节提供一个(实际上是几个)单独的参考书目。
  2. 在每个引用编号前添加前缀,以便于区分。
  3. 将该前缀作为(单独的)章节标记。

这对于参考书目本身来说相对顺利,但对于引用却不起作用,因为在生成这些标记时,变量\thechapter似乎为零。

最小工作示例:

\documentclass{report}

\usepackage{filecontents}
\usepackage[backend=biber,defernumbers=true,citestyle=numeric]{biblatex}

\begin{filecontents}{bibliography.bib}
@book{citation,
    title = {Title},
    author = {Author, Some},
    location = {The City},
    publisher = {Publisher},
    date = {2005}
}
\end{filecontents}

\addbibresource{bibliography.bib}

\begin{document}

\renewcommand{\thechapter}{A.7}
\section{Text}

This~\cite{citation} is a citation.

\printbibliography[heading=subbibliography,prefixnumbers={\thechapter-}]

\end{document}

将给我:

代码结果

答案1

问题在于 biblatex 无法完全扩展 prefixnumbers 的参数,因此\thechapter会直接写入 aux 文件。您可以将其添加到您的序言中:

\makeatletter      
\def\blx@addprefixnumber{%
  \nottoggle{blx@skiplab}
    {\ifdef\blx@prefixnumbers
       {\ifundef\abx@field@shorthand
          {\edef\abx@field@prefixnumber{\expandonce\blx@prefixnumbers}%
           \ifundef\abx@field@prefixnumber
             {\blx@bbl@addentryfield{\abx@field@entrykey}{\the\c@refsection}%
                {prefixnumber}{\expandonce\abx@field@prefixnumber}}
             {}%
           \blx@auxwrite\@mainaux{}{%
              \string\blx@aux@numprefix{\abx@field@entrykey}%
                {\the\c@refsection}{\abx@field@prefixnumber}}}%<-- removed \expandonce
          {}}
       {}}
    {}}      
\makeatother    

另一种方法是更改\cite​​宏,使其不使用前缀数字,而是使用 \thechapter:

\renewbibmacro*{cite}{%
  \printtext[bibhyperref]{%
    \printtext{\thechapter-}% added
    %\printfield{prefixnumber}% removed
    \printfield{labelnumber}%
    \ifbool{bbx:subentry}
      {\printfield{entrysetcount}}
      {}}}

在这两种情况下,我都没有测试如果有更多章节并且某些引用出现在多个章节中会发生什么。

第三种选择是改变密钥定义:

\makeatletter
\define@key{blx@bib2}{prefixnumbers}{%
  \edef\blx@prefixnumbers{#1}%edef instead of def
  \iftoggle{blx@defernumbers}
    {\csnumdef{blx@labelnumber@\the\c@refsection}{0}}
    {\iftoggle{blx@labelnumber}
       {\blx@warning{%
          Option 'prefixnumbers' requires global\MessageBreak
          'defernumbers=true'}}
       {}}}
\makeatother

相关内容