Beamer:biblatex apa 风格的参考文献中存在奇怪的间距

Beamer:biblatex apa 风格的参考文献中存在奇怪的间距

我偶然发现了这两个间距错误(用红色数字标记): 在此处输入图片描述

我猜第一个空格并不是真正的错误,而只是英语空格(\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

间距和标点符号问题与适用beamerbiblatex书目宏的补丁有关,这些补丁用于更改书目项内的颜色。这些可以在 中找到beamerbaselocalstructure.sty

第一个问题中的多余空格与 有关。这可以通过发出来\usebeamercolor解决。biblatex\unspace

为了解决第二个问题,我们可以在更改颜色之前设置标点符号。这将抑制现有驱动程序和参考书目宏中\newunit产生的任何虚假标点符号。\setunit

以下是一些经过修订的补丁,它们展示了这些想法。参考书目宏的新补丁处理了作者年份样式使用或作为 的后备的labeltitle情况。labellabeltitlelabelname

\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。这些包括没有任何数据来形成标签的条目(即labelnamelabellabeltitle全部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所使用的驱动程序。所以也许最好的办法是提供不添加任何颜色的选项。

相关内容