我正在尝试使用biblatex
该authoryear
样式,但是当我有未定义的引用时,它会“吞噬”下一个标点符号。
\documentclass{article}
\usepackage[style = authoryear]{biblatex}
\addbibresource{biblatex-examples.bib}
\begin{document}
\textcite{UNDEFINED}A
\textcite{UNDEFINED}:
\textcite{aksin}:
\end{document}
我该如何修补\textcite
(或 bib 驱动程序)以使其不吞噬标点符号?
答案1
已在 3.8 版中修复
biblatex
(第630章)
我花了一些时间来调查此事。
在\cite
-like 命令中,第一次处理引用列表时\blx@citeadd
, 这发生在\blx@citeloop
. 该命令区分在文件中找到的引用.bib
和未找到的引用(即未定义)。找到的引用将保存在宏中以供进一步处理,未找到的键会立即以粗体显示出来。然后传递定义的引用到\blx@citeprint
. 执行后续操作的命令\blx@postcode
- 如果需要的话,还可以执行更多操作 -\blx@citeprint
仅在处理完最后一件物品后才会被叫来。
如果我们的 cite 命令中只有未定义的引用,我们就永远不会调用,\blx@postcode
因为宏链仅使用定义的引用列表执行,而如果此列表为空,则根本不会执行。
因此,如果没有定义引用,我们需要直接进行\blx@citeloop
调用。事实证明,由于可能包含的附加代码的性质,在那里执行它是不安全的。我们需要将后置点保存在新命令中并使用它。\blx@postcode
\blx@postcode
我的解决方案是将后标部分从 拆分\blx@postcode
为一个新的\blx@postpunct@saved
(遗憾的是,这个名字已经被占用,但很高兴接受更好的名字的建议)。如果没有定义的引用,\blx@postpunct
则可以调用这个新的宏,否则将与 一起调用。\blx@citeloop
\blx@postcode
\blx@citeprint
必要的修改并不多,但更改的宏的性质不允许简短的 MWE。可以在拉取请求中找到必要的更改https://github.com/plk/biblatex/pull/630;它已被合并并且修复包含在biblatex
v3.8 中。
现在
\listfiles
\documentclass[american]{article}
\usepackage{babel}
\usepackage[style = authortitle]{biblatex}
\addbibresource{biblatex-examples.bib}
\begin{document}
\textcite{UNDEFINED}A
\textcite{fghgvjh}:
\textcite{UNDEFINED}:
\textcite{aksin}:
\textcite{UNDEFINED,aksin}:
\cite{UNDEFINED,aksin}.
\textcite{aksin,UNDEFINED,gundf}:
\textcite{UNDEFINED,FLUNDF}A
\textcite{UNDEFINED,FLUNDF}:
\textcite{aksin,sigfridsson}:
\cite[14]{UNDEFINED,aksin}:
\cite[14]{UNDEFINED,aksin}A
\end{document}
给出
答案2
我最终决定修补\blx@citeadd
。我不确定这是否是修补的最佳宏。似乎“吞噬”的标点符号保留在 中\abx@field@postpunct
。
\documentclass{article}
\usepackage{xpatch}
\usepackage[style = authoryear]{biblatex}
\addbibresource{biblatex-examples.bib}
\makeatletter
\xpatchcmd{\blx@citeadd}{%
\expandafter\abx@missing\expandafter{\blx@realkey}%
}{%
\expandafter\abx@missing\expandafter{\blx@realkey}%
\ifundef{\abx@field@postpunct}{}{\abx@field@postpunct}%
}{}{}%
\makeatother
\begin{document}
\textcite{UNDEFINED}A
\textcite{UNDEFINED}:
\textcite{aksin}:
\end{document}