我偶然发现了这两个间距错误(用红色数字标记):
我猜第一个空格并不是真正的错误,而只是英语空格(\nonfrenchspacing
)。可以关闭它吗(不更改语言)?\frenchspacing
似乎对参考文献没有影响。
但我不明白第二个间距错误是从哪里来的。有人知道吗?
以下是代码:
\documentclass{beamer}
\usepackage[american]{babel}
\usepackage[utf8]{inputenc}
\usepackage{csquotes}
\usepackage[style=apa, backend=biber,doi,url]{biblatex}
\DeclareLanguageMapping{american}{american-apa}
\begin{filecontents}{literature.bib}
@article {Thomas1975,
author = {Thomas, Ewart and Weaver, Wanda},
title = {Cognitive processing and time perception},
journal = {Attention, Perception, \& Psychophysics},
issn = {1943-3921},
pages = {363--367},
volume = {17},
doi = {10.3758/BF03199347},
year = {1975}
}
\end{filecontents}
\addbibresource{literature.bib}
\begin{document}
\frame{\textcite{Thomas1975}}
\frame{\printbibliography}
\end{document}
没有 beamer ( \documentclass{article}
) 一切看起来都很好:
答案1
间距和标点符号问题与适用beamer
于biblatex
书目宏的补丁有关,这些补丁用于更改书目项内的颜色。这些可以在 中找到beamerbaselocalstructure.sty
。
第一个问题中的多余空格与 有关。这可以通过发出来\usebeamercolor
解决。biblatex
\unspace
为了解决第二个问题,我们可以在更改颜色之前设置标点符号。这将抑制现有驱动程序和参考书目宏中\newunit
产生的任何虚假标点符号。\setunit
以下是一些经过修订的补丁,它们展示了这些想法。参考书目宏的新补丁处理了作者年份样式使用或作为 的后备的labeltitle
情况。label
labeltitle
labelname
\AtBeginDocument{%
\@ifpackageloaded{biblatex}
{\apptocmd{\blx@env@bibliography}
{\let\makelabel\beamer@biblabeltemplate}{}{}
\apptocmd{\abx@macro@begentry}
{\let\bbx@tempa\@empty%
\usebeamercolor[fg]{bibliography entry author}}{}{}
\pretocmd{\abx@macro@labeltitle}
{\ifboolexpr{ test {\ifcsundef{abx@field@label}}
and test {\ifcsundef{abx@field@labeltitle}} }{}{\let\bbx@tempa\labelnamepunct}}{}{}
\pretocmd{\abx@macro@title}
{\ifcsundef{abx@name@labelname}{}{\let\bbx@tempa\labelnamepunct}%
\bbx@tempa\newblock\unspace\usebeamercolor[fg]{bibliography entry title}}{}{}
\apptocmd{\abx@macro@title}
{\ifcsundef{abx@field@title}{}{\newunitpunct}%
\newblock\unspace\usebeamercolor[fg]{bibliography entry note}}{}{}}
{}}
您无需编辑beamer
样式文件,而是可以在之后修改现有补丁\begin{document}
。
...
\addbibresource{biblatex-examples.bib}
\begin{document}
\makeatletter
\pretocmd{\abx@macro@begentry}{\let\bbx@tempa\@empty}{}{}
\pretocmd{\abx@macro@labeltitle}
{\ifboolexpr{ test {\ifcsundef{abx@field@label}}
and test {\ifcsundef{abx@field@labeltitle}} }{}{\let\bbx@tempa\labelnamepunct}}{}{}
\patchcmd{\abx@macro@title}
{\ifcsundef{abx@name@labelname}{}{\blx@unitpunct\blx@postpunct}}
{\ifcsundef{abx@name@labelname}{}{\let\bbx@tempa\labelnamepunct}}{}{}
\patchcmd{\abx@macro@title}
{\newblock\usebeamercolor[fg]{bibliography entry title}}
{\bbx@tempa\newblock\unspace\usebeamercolor[fg]{bibliography entry title}}{}{}
\patchcmd{\abx@macro@title}
{\ifcsundef{abx@field@title}{}{\blx@unitpunct\blx@postpunct}}
{\ifcsundef{abx@field@title}{}{\newunitpunct}}{}{}
\patchcmd{\abx@macro@title}
{\newblock\usebeamercolor[fg]{bibliography entry note}}
{\newblock\unspace\usebeamercolor[fg]{bibliography entry note}}{}{}
\makeatother
\nocite{Thomas1975,ctan,cms,companion,britannica,kant:ku}
\frame[allowframebreaks]{\printbibliography}
\end{document}
这是你的参赛作品,上面印着一些不同的书目边距。
这些补丁似乎达到了标准样式所需的效果biblatex
,但需要进行彻底的测试。该解决方案无法解决 中的一些(希望是边缘)情况的问题biblatex-apa
。这些包括没有任何数据来形成标签的条目(即labelname
、label
和labeltitle
全部labelyear
缺失)以及biblatex-apa
覆盖useeditor
和 friends 每个条目选项设置(例如britannica
在上述文档中)。
对于其他一些贡献的样式,未解决的问题可能更严重。当然beamer
无法解释所有问题。也许最好的方法是让样式作者根据需要定制补丁。
答案2
我怀疑这里的问题是可能发生的:在参考书目中添加颜色是一种黑客行为,而且比传统的 BibTeX 样式beamer
更具风险。biblatex
在添加biblatex
样式时,我们必须在格式化期间定位驱动程序:使用传统的 BibTeX,它基本上是在格式化之后完成的。这是一个问题,因为生成的格式取决于biblatex
输出,但颜色控制插入会影响它。例如,标准biblatex
设置是
\newbibmacro*{title}{%
\ifboolexpr{
test {\iffieldundef{title}}
and
test {\iffieldundef{subtitle}}
}
{}
{\printtext[title]{%
\printfield[titlecase]{title}%
\setunit{\subtitlepunct}%
\printfield[titlecase]{subtitle}}%
\newunit}%
\printfield{titleaddon}}
而就apa
风格而言
\renewbibmacro*{title}{%
\ifthenelse{\iffieldundef{title}\AND\iffieldundef{subtitle}}
{}
{\iffieldundef{origtitle}
{\printtext[title]{%
\printfield[apacase]{title}%
\setunit{\subtitlepunct}%
\printfield[apacase]{subtitle}}}%
{\printfield{origtitle}%
\setunit{\addspace}%
\printtext[brackets]{%
\printfield[apacase]{title}%
\setunit{\subtitlepunct}%
\printfield[apacase]{subtitle}}}
\setunit{\addspace}%
\printfield{titleaddon}%
\iffieldequalstr{entrytype}{book}%
{\setunit{\addspace}\usebibmacro{bookaddinfo}}%
{}%
\ifthenelse{%
\ifnameundef{author}\AND%
\(\ifnameundef{editor}\AND\NOT\boolean{bbx:editorinauthpos}\)\AND%
\ifnameundef{namea}\AND%
\ifnameundef{nameb}}
{\newunit\newblock
\usebibmacro{labelyear+extrayear}}
{}}}
此处最重要的一行是\setunit{\addspace}
:它将在当前材料“之后”插入一个空格。不幸的是,颜色代码被视为“输出” biblatex
(输出流中有一个什么内容,阻止biblatex
“看到”正在发生的事情)。
现在,问题是该怎么做。我不确定是否有通用的解决方案,因为插入颜色代码的适当位置取决于biblatex
所使用的驱动程序。所以也许最好的办法是提供不添加任何颜色的选项。