使用时biblatex-chicago
,如果使用\postnotedelim
类似命令更改
\renewcommand*{\postnotedelim}{\addcolon\space}
并使用 TeX Live 2021 在 Overleaf 上进行编译,结果不太好。在 TeX Live 2020 或更早版本上编译相同的代码效果很好。
考虑以下 MWE:
\documentclass{article}
\usepackage[authordate]{biblatex-chicago}
\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
@book{Jones2016,
author = {Jones, John},
title = {Title},
date = {2016},
}
@book{Smith2018,
author = {Smith, Sam},
title = {Title},
date = {2018},
}
\end{filecontents}
\addbibresource{\jobname.bib}
\renewcommand*{\postnotedelim}{\addcolon\space}
\begin{document}
\textcite[9]{Jones2016} discusses cool things.
Some have commented that he's the best \autocite[40]{Smith2018}.
But later in his work, Jones really goes off the rails \autocite[100]{Jones2016}.
And by the end of the book, he's talking complete nonsense \autocite[500]{Jones2016}
\end{document}
但是,使用 TeX Live 2021 进行编译时会出现以下结果:
标准的 first-mention\autocite
命令可以很好地与后记配合使用,但\textcite
呈现为Jones (2016: ), 9
,并且\autocite
带有后记的命令紧跟在同一作品的引用之后,会在括号中的页码前打印后记分隔符,而不是在没有分隔符的情况下在括号中打印页码。请注意,\renewcommand*{\postnotedelim}{\addcolon\addspace}
无论我使用哪个版本的 TeX Live 进行编译,注释掉后的一切看起来都符合预期:
我不介意使用 2020 版 TeX Live 进行编译,但是\postnotedelim
在较新的 TeX Live 发行版和/或上,是否有一种新的“正确方法”来为 biblatex-chicago声明全局变量biblatex-chicago
?
答案1
的当前版本中\postnotedelim
for的实际定义比核心中的简单定义稍微复杂一些。authordate
biblatex-chicago
\DeclareDelimFormat{postnotedelim}{\addcomma\space}
biblatex
chicago-dates-common.cbx
\renewcommand*{\postnotedelim}{% Cf. N&B style
\ifboolexpr{%
test {\ifciteibid}%
and
(
test {\ifentrytype{jurisdiction}}%
or
test {\ifentrytype{legal}}%
or
test {\ifentrytype{legislation}}%
)
}%
{\addspace}%
{\iftoggle{cms@inlineibid}%
{\togglefalse{cms@inlineibid}%
\iffieldundef{prenote}% Bug fix
{}%
{\setunit{\cms@testspace}}}%
{\iffieldequalstr{entrysubtype}{classical}% For Notes+Bib, too?
{\DeclareNumChars*{abcdeABCDE:}%
\iffieldpages{postnote}%
{\setunit{\cms@testspace}}%
{\newcunit}}%
{\newcunit}\DeclareNumChars{.}}}}
其中\newcunit
本质上是\setunit{\addcomma\space}
。因此,如果我们想要冒号,我们需要用\newcunit
替换\setunit{\addcolon\space}
。
\documentclass{article}
\usepackage[authordate]{biblatex-chicago}
\addbibresource{biblatex-examples.bib}
\makeatletter
\renewcommand*{\postnotedelim}{% Cf. N&B style
\ifboolexpr{%
test {\ifciteibid}%
and
(
test {\ifentrytype{jurisdiction}}%
or
test {\ifentrytype{legal}}%
or
test {\ifentrytype{legislation}}%
)
}%
{\addspace}%
{\iftoggle{cms@inlineibid}%
{\togglefalse{cms@inlineibid}%
\iffieldundef{prenote}% Bug fix
{}%
{\setunit{\cms@testspace}}}%
{\iffieldequalstr{entrysubtype}{classical}% For Notes+Bib, too?
{\DeclareNumChars*{abcdeABCDE:}%
\iffieldpages{postnote}%
{\setunit{\cms@testspace}}%
{\setunit{\addcolon\space}}}%
{\setunit{\addcolon\space}}\DeclareNumChars{.}}}}
\makeatother
\begin{document}
\textcite[9]{sigfridsson} discusses cool things.
Some have commented that he's the best \autocite[40]{worman}.
But later in his work, Jones really goes off the rails \autocite[100]{sigfridsson}.
And by the end of the book, he's talking complete nonsense \autocite[500]{sigfridsson}
\end{document}
答案2
查看chicago-dates-common.cbx
文件moewe 的回答特别提到了\newcunit
命令,看来的文本部分\newcunit
由以下方式定义\newcunitpunct
:
\protected\def\blx@newcunit{%
\iftoggle{blx@keepunit}%
{}%
{\global\let\blx@unitpunct\newcunitpunct
\global\toggletrue{blx@unit}}}%
\appto\blx@blxinit{%
\let\newcunit\blx@newcunit}%
\newcommand*{\newcunitpunct}{\addcomma\space}
添加\renewcommand*{\newcunitpunct}{\addcolon\space}
我的序言正是我想要的。
再次感谢 moewe 向我指出适当的文件和适当的变量,使我能够到达我想要的地方。
更新:上述解决方案会产生意想不到的后果(正如@moewe 正确指出的那样),因此我的最终解决方案基本上是用regexpatch
just 来实现 @moewe 的答案,这样它占用的行数更少(尽管它可能会带来不必要的复杂性)。我把它放在这里只是为了完整性,但@moewe 的答案似乎是正确的做法。
\usepackage{regexpatch}
\makeatletter
\xpatchcmd*{\postnotedelim}{\newcunit }{\setunit{\addcolon \addspace} }{}{}
\makeatother
\newcunit
(请注意,由于命令中有两个 实例,带星号的版本\xpatchcmd
将替换两个\newcunit
。)
我会将@moewe 的答案标记为正确,因为它不依赖于任何其他包,而只是明确的重新定义。