相关问题可参见biblatex:带有章节名称的分段参考书目。
如果你允许的话,我将从一个(不那么)简单的例子开始如何使用 biblatex chapter+?它使用 biblatex 的 refsegment=chapter+ 并对其进行轻微更改refsegment=subsection+
并添加\section{A Section}
:
\documentclass{memoir}
\usepackage{lipsum}
\usepackage[american]{babel}
\usepackage[utf8]{inputenc}
\usepackage{csquotes}
\makeatletter
\renewcommand{\@chapapp}{Segment}
\makeatother
\usepackage{nameref}
\usepackage[T1]{fontenc}
\usepackage[
backend=biber,
%bibencoding=utf8,
% refsection=chapter,
refsegment=subsection+,
url=false,
sorting=none,
sortcites=true,
sorting=nyt,
style=apa
%style=numeric
]{biblatex}
% \DeclareLanguageMapping{american}{american-apa}
\makeatletter
%\newcommand*{\currentname}{\@currentlabelname}
\makeatother
% segmented bibliography
\defbibheading{subbibliography}{\subsection*{References for Segment~\ref{refsegment:\therefsection\therefsegment}: \nameref{refsegment:\therefsection\therefsegment} }}
% \DefineBibliographyStrings{english}{%
% references = {Works Cited},
% }
\addbibresource{biblatex-examples.bib}
\usepackage[]{hyperref}
\hypersetup{
colorlinks=false,
}
\begin{document}
\author{John Doe}
\title{Bla bla}
\tableofcontents
\chapter{First, there was light}
% \label{chapter1}
\lipsum[0-1]
Cite an author not previously cited~\cite{cicero}.
Note: Alphabetcially, K comes before S.
\section{A Section}
\lipsum[0-1]
Cite an author not previously cited~\cite{cicero}.
Note: Alphabetcially, K comes before S.
\chapter{Then, there was a power outage}
% \label{chapter2}
\lipsum[0-1]
And then again cite some authoprs cited previously~\cite{kastenholz}.
At vero eos et accusam et justo duo dolores et ea rebum~\cite{sigfridsson}.
\printbibheading
% \bibbysection[heading=subbibliography]
\bibbysegment[heading=subbibliography]
\end{document}
所以我得到:
不过,我想要的是这个:
看到章节名称了吗?我这样做了:
\section{A Section}
\newrefsegment
这难道不应该自动发生吗?因为refsegment=subsection+
?还是需要添加\newrefsegment
?
作为一种替代方法,我发现有帮助的是:
\newcommand*{\segtion}[1]{\section{#1}\newrefsegment}
另一种选择可能是重新定义它,但我的尝试没有成功:
\renewcommand{\section}[1]{\section{#1}\newrefsegment}
答案1
biblatex
3.13 修复了memoir
KOMA-Script 类中的此问题。标准类中仍然存在结构类似的问题:https://github.com/plk/biblatex/issues/914
biblatex
如果您正在使用memoir
或其中一个 KOMA-Script 类,请更新您的 TeX 发行版以获取和 Biber 的当前版本。下面提出的解决方法不再需要。
这可能被认为是 中的一个错误biblatex
,但至少它是一种非常不幸的行为。https://github.com/plk/biblatex/pull/887包含针对此问题的修复memoir
:https://github.com/plk/biblatex/pull/887/commits/9a617ad88d6dd6cf84cad6d9e2b5216622b668ed。
问题的核心是补丁biblatex
应用的时间问题。当您说refsection=section
biblatex
要修补命令的内部结构时\section
,每次执行\section
命令时也会调用。内部调用\newrefsegment
的确切时间在这里起着重要作用。\newrefsegment
\section
您可以利用它\newrefsegment
自动定义一个标签\label{refsegment:\the\c@refsection\the\c@refsegment}%
。s\label
通常附加到最后一个增加的计数器\refstepcounter
。显然,您希望标签附加到刚刚触发的分段命令\newrefsegment
。这意味着\newrefsegment
必须调用后命令的内部\section
已经发出\refstepcounter{section}
。另一方面,我们通常希望\newrefsegment
尽早执行,以确保节标题的内容已经在新段中(如果标题中的引用被视为前一个引用段的一部分,则会令人困惑)。
对于\section
和 的朋友,biblatex
直到版本 3.12 才会添加到内部命令(或它们的/KOMA-Script 等效命令)\newrefsegment
的开头。这已经足够早,可以应用于标题文本,但实际上为时过早,无法为标签选择正确的值。这解释了为什么 的标签只是重复了前一个 的值。(顺便说一句, 似乎已经修补得足够早了……)\@startsection
memoir
\refstepcounter
\section
\chapter
\chapter
幸运的是,KOMA-Script 作者(最近)和memoir
作者(很久以前)都开始提供“钩子”机制,可用于\newrefsegment
在 中的正确位置执行和朋友\section
。这些钩子的使用是在 中实现的https://github.com/plk/biblatex/pull/8873.13中出现biblatex
。目前尚无标准类的解决方案。目前看来,人们不得不求助于更精确的\patchcmd
而不是简单的\pretocmd
。
如果你被困在旧版本中,biblatex
你可以删除
refsegment=subsection+,
并做它应该做的事
\apptocmd\memchapinfo{\newrefsegment}{}{}
\apptocmd\memchapstarinfo{\newrefsegment}{}{}
\makeatletter
\apptocmd\memsecinfo{%
\ifstrequal{#1}{section}
{\@firstoftwo}
{\ifstrequal{#1}{subsection}
{\@firstoftwo}
{\@secondoftwo}}
{\newrefsegment}
{}%
}{}{}
\apptocmd\memsecstarinfo{%
\ifstrequal{#1}{section}
{\@firstoftwo}
{\ifstrequal{#1}{subsection}
{\@firstoftwo}
{\@secondoftwo}}
{\newrefsegment}
{}%
}{}{}
\makeatother
这有点笨重,但我想总比没有好。
顺便提一句
\renewcommand{\section}[1]{\section{#1}\newrefsegment}
会导致无限循环,因为 LaTeX 是一种宏替换语言。通过该定义,您可以告诉 LaTeX 用 替换每个出现的\section{<argument>}
。\section{<argument>}\newrefsegment
您可以轻松看到当 LaTeX 尝试再次替换 时,这会导致循环\section{<argument>}
。
\newcommand*{\segtion}[1]{\section{#1}\newrefsegment}
反之则有效,因为命令名称不同,从而避免了无限循环。