我一直在阅读有关此主题的其他一些问题,我知道有很多这样的问题。但是,我还没有找到解决我的具体问题的方法。
我的论文有多个章节,我希望每个章节都有一个参考书目,使用 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
/backref
refsection
通常,refsection
s 彼此完全独立,并且没有接口可以将多个refsection
s 的数据合并为一个或从一个 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}
将几个部分书目收集到一个全局书目中更自然的方式是通过refsegment
s。但在这种情况下,refsegment
s 是不可行的,因为所有 s 中的条目数据都是相同的refsegment
。因此,标签编号不能在每个段中从 1 重新开始(或者至少不能以您希望的方式重新开始),因为在多个段中引用了条目必须在所有段中保留其唯一编号。
答案2
在同一文档中混合参考书目样式往往有些复杂,并且有一些限制。特别是,如您所要求的那样,混合标记(数字/字母)和非标记样式。但是,如果您对细节不太挑剔,您所描述的是可行的。
由于您希望每个章节都有独立的编号,因此您需要refsection
。refsegment
不会这样做。收集其他refsection
s 中引用的作品的传统方法是将它们添加到一个类别中,比如说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}