带章节名称的分段书目

带章节名称的分段书目

相关问题可参见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

biblatex3.13 修复了memoirKOMA-Script 类中的此问题。标准类中仍然存在结构类似的问题:https://github.com/plk/biblatex/issues/914

biblatex如果您正在使用memoir或其中一个 KOMA-Script 类,请更新您的 TeX 发行版以获取和 Biber 的当前版本。

下面提出的解决方法不再需要。

这可能被认为是 中的一个错误biblatex,但至少它是一种非常不幸的行为。https://github.com/plk/biblatex/pull/887包含针对此问题的修复memoirhttps://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的开头。这已经足够早,可以应用于标题文本,但实际上为时过早,无法为标签选择正确的值。这解释了为什么 的标签只是重复了前一个 的值。(顺便说一句, 似乎已经修补得足够早了……)\@startsectionmemoir\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}

反之则有效,因为命令名称不同,从而避免了无限循环。

相关内容