每章的参考书目和按字母顺序排列的全球参考书目

每章的参考书目和按字母顺序排列的全球参考书目

我一直在阅读有关此主题的其他一些问题,我知道有很多这样的问题。但是,我还没有找到解决我的具体问题的方法。

我的论文有多个章节,我希望每个章节都有一个参考书目,使用 refsection 很容易实现。但我还想要一个全局参考书目,然后用户会建议使用 refsegment 方式。

refsegment 的问题在于,现在的编号不是每个章节独有的,而是 biblatex 文档中提到的全局参考列表的集合。

因此,我也在其他问题上读到使用 defernumbers 选项的建议真的我这样做了,参考编号就变得一团糟,类似的问题如(Biblatex:延迟数字的问题),即使经过多次编译并删除 aux、bbl 等文件。

我最大的努力是为每个章节创建一个引用部分,然后使用 \nocite{*} 为全局书目创建另一个引用部分,但反向引用无法正常工作。

我还尝试将每个章节的 refsegments 嵌套到整个文档的整体 refsection 中,这在 biblatex 文档中是可能的,但引用数量链接到最终的参考书目而不是本地子书目。

因此我正在寻找类似的东西:

第 1 章 Foo 说 [1] 和 blabla 说 [2] 参考书目 [1] Foo(在第 XXX 页引用)。 [2] Blabla(在第 XXX 页引用)。

第 2 章 Foo 说 [1] 和 asd 说 [2] 参考书目 [1] Foo(在第 XXX 页引用) [2] Asd(在第 XXX 页引用)

然后是按字母顺序排列的全球书目(nyt):Asd(在第 XXX 页引用)Blabla(在第 XXX 页引用)Foo(在第 XXX 页引用)

因此,我进行了两次尝试,一次使用引用部分,效果很好,但全局参考书目中的 XXX 引用不起作用:

\documentclass[11pt, a4paper, showtrims]{memoir}

\usepackage[backend=biber, bibstyle=numeric-comp, citestyle=numeric-comp, backref=true]{biblatex}

\defbibenvironment{nolabelbib}
{\list
    {}
    {\setlength{\leftmargin}{\bibhang}%
        \setlength{\itemindent}{-\leftmargin}%
        \setlength{\itemsep}{\bibitemsep}%
        \setlength{\parsep}{\bibparsep}}}
{\endlist}
{\item}

\usepackage{filecontents}

\begin{filecontents}{\jobname.bib}
    @misc{A01,
        keywords = {foo,bar},
        author = {Author, A.},
        year = {2001},
        title = {Alpha},
    }
    @misc{B02x,
        keywords = {foo},
        author = {Buthor, B.},
        year = {2002},
        title = {Bravo},
    }
    @misc{B02y,
        keywords = {bar},
        author = {Buthor, B.},
        year = {2002},
        title = {Bravissimo},
    }
\end{filecontents}

\addbibresource{\jobname.bib}

\begin{document}

    \chapter{Chapter 1}
    \begin{refsection}
        This guy said blabla \autocite{A01}. And this other guy said blabla \autocite{B02x}.
        \printbibliography[heading=subbibliography]
    \end{refsection}

    \chapter{Chapter 2}
    \begin{refsection}
        This guy said blabla \autocite{A01}. And this other guy said blabla \autocite{B02y}.
        \printbibliography[heading=subbibliography]
    \end{refsection}

    \begin{refsection}
        \nocite{*}
        \newrefcontext[sorting=nyt]
        \printbibliography[env=nolabelbib]
    \end{refsection}

\end{document}

我尝试过的另一件事是将 refsegment 嵌套到 refsection 中,请注意我只是从 \begin{document} 复制的:

\begin{document}
    \begin{refsection}

        \chapter{Chapter 1}
            \begin{refsegment}
                This guy said blabla \autocite{A01}. And this other guy said blabla \autocite{B02x}.
                \printbibliography[segment=\therefsegment,heading=subbibliography]
            \end{refsegment}

        \chapter{Chapter 2}
            \begin{refsegment}
                This guy said blabla \autocite{A01}. And this other guy said blabla \autocite{B02y}.
                \printbibliography[segment=\therefsegment,heading=subbibliography]
            \end{refsegment}

        \newrefcontext[sorting=nyt]
        \printbibliography[env=nolabelbib]

    \end{refsection}

\end{document}

在最后一个示例中,引用 XXX 效果很好,但问题是编号与全局书目(按字母顺序排列)相关联,而不是与本地章节书目相关联。我还尝试将 defernumbers 设置为 true,但编号变得很乱。此外,在 printbibliography 中将 resetnumbers 选项设置为 true,但问题仍未解决。

我正在运行 MiKTeX-pdfTeX 2.9.6642 (1.40.19) (MiKTeX 2.9.6630 64 位) Biber 版本 2.11,根据 MikTex Console,我拥有 Biblatex 3.12

谢谢大家的帮助!

答案1

以下是古斯布斯回答这增加了极其丑陋的低级黑客行为以获得跨s 的“全局” pageref/backrefrefsection

通常,refsections 彼此完全独立,并且没有接口可以将多个refsections 的数据合并为一个或从一个 s 访问另一个 srefsection中的数据(这并不完全正确:人们可以在不同的 refsection 中打印一个 refsection 的参考书目,并且可以通过 hack 获取来自不同 refsection 的所有数据)。但由于是一个特殊字段,它由而不是pageref中的数据填充,因此我们实际上可以获得全局 pageref。.aux.bbl

\documentclass{book}

\usepackage[refsection=chapter, backref]{biblatex}

\addbibresource{biblatex-examples.bib}

\DeclareBibliographyCategory{cited}
\AtEveryCitekey{\addtocategory{cited}{\thefield{entrykey}}}

\makeatletter
\newcount\c@globalpageref

\defbibenvironment{globalbibliography}
  {\list
     {}
     {\setlength{\leftmargin}{\bibhang}%
      \setlength{\itemindent}{-\leftmargin}%
      \setlength{\itemsep}{\bibitemsep}%
      \setlength{\parsep}{\bibparsep}}}
  {\endlist}
  {\item
   \iflistundef{globalpageref}
     {}
     {\savelist{globalpageref}{\tmpblx@pageref}%
      \c@pageref\c@globalpageref
      \restorelist{pageref}{\tmpblx@pageref}}}


\protected\def\blx@aux@backref#1#2#3#4#5{%
  \ifcsundef{blx@pref@#3@\detokenize{#2}}
    {\global\cslet{blx@pref@#3@\detokenize{#2}}\@empty
     \expandafter\blx@onlypreamble\csname blx@pref@#3@\detokenize{#2}\endcsname}
    {}%
  \ifinlistcs{#4}{blx@pref@#3@\detokenize{#2}}
    {}
    {\listcsgadd{blx@pref@#3@\detokenize{#2}}{#4}}%
  \ifcsundef{blx@pref@global@\detokenize{#2}}
    {\global\cslet{blx@pref@global@\detokenize{#2}}\@empty}
    {}%
  \ifinlistcs{#4}{blx@pref@global@\detokenize{#2}}
    {}
    {\listcsgadd{blx@pref@global@\detokenize{#2}}{#4}}%
  \blx@addpagesum{#1}{#5}}
\let\abx@aux@backref\blx@aux@backref


\AtDataInput{%
  \ifcsundef{blx@pref@global@\abx@field@entrykey}
    {}
    {\blx@addpagerefglobal{\abx@field@entrykey}}}

\def\blx@addpagerefglobal#1{%
  \begingroup
  \blx@tempcnta\z@
  \let\blx@tempa\@empty
  \def\do##1{%
    \appto\blx@tempa{{##1}}%
    \advance\blx@tempcnta\@ne}%
  \dolistcsloop{blx@pref@global@#1}%
  \edef\blx@tempa{\endgroup\noexpand\blx@bbl@listdef
    {globalpageref}{\the\blx@tempcnta}{\blx@tempa}}%
  \blx@tempa
}
\makeatother


\begin{document}
\chapter{Chapter 1}
\autocite{sigfridsson}
\autocite{cotton}
\printbibliography[heading=subbibliography]

\chapter{Chapter 2}
\autocite{sigfridsson}
\autocite{bertram}
\printbibliography[heading=subbibliography]

\newrefsection
\nocite{*}
\newrefcontext[sorting=nyt]
\printbibliography[env=globalbibliography, title={Global Bibliography}, category=cited]
\end{document}

最后的全球书目的截图,反向引用表明所有引用的参考部分。


将几个部分书目收集到一个全局书目中更自然的方式是通过refsegments。但在这种情况下,refsegments 是不可行的,因为所有 s 中的条目数据都是相同的refsegment。因此,标签编号不能在每个段中从 1 重新开始(或者至少不能以您希望的方式重新开始),因为在多个段中引用了条目必须在所有段中保留其唯一编号。

答案2

在同一文档中混合参考书目样式往往有些复杂,并且有一些限制。特别是,如您所要求的那样,混合标记(数字/字母)和非标记样式。但是,如果您对细节不太挑剔,您所描述的是可行的。

由于您希望每个章节都有独立的编号,因此您需要refsectionrefsegment不会这样做。收集其他refsections 中引用的作品的传统方法是将它们添加到一个类别中,比如说cited,然后仅打印此类别的全局书目。需要每个章节都有编号的书目和非编号的全局书目,这要求我们定义一个适当的 bibenvironment 来删除条目的标签。

\documentclass{book}

\usepackage[refsection=chapter]{biblatex}

\addbibresource{biblatex-examples.bib}

\DeclareBibliographyCategory{cited}
\AtEveryCitekey{\addtocategory{cited}{\thefield{entrykey}}}
\defbibenvironment{globalbibliography}
  {\list
     {}
     {\setlength{\leftmargin}{\bibhang}%
      \setlength{\itemindent}{-\leftmargin}%
      \setlength{\itemsep}{\bibitemsep}%
      \setlength{\parsep}{\bibparsep}}}
  {\endlist}
  {\item}

\begin{document}

\chapter{Chapter 1}

\autocite{sigfridsson}

\autocite{cotton}

\printbibliography

\chapter{Chapter 2}

\autocite{sigfridsson}

\autocite{bertram}

\printbibliography

\chapter{Global Bibliography}

\nocite{*}
\newrefcontext[sorting=nyt]
\printbibliography[env=globalbibliography, title={Global Bibliography}, category=cited]

\end{document}

相关内容