Biblatex 在未定义的引用后吞噬标点符号

Biblatex 在未定义的引用后吞噬标点符号

我正在尝试使用biblatexauthoryear样式,但是当我有未定义的引用时,它会“吞噬”下一个标点符号。

\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;它已被合并并且修复包含在biblatexv3.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}

给出

MWE 输出

答案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}

相关内容