biblatex 和 `\ifblank{}`

biblatex 和 `\ifblank{}`

我想更改的输出格式,\citeauthor{}以便显示全名(“givenname familyname”)而不是仅显示姓氏。因此,我必须定义一种特殊格式并进行更改,\citeauthor以便它在其输出例程中使用此格式。

就像手册中的示例所示biblatex(第 4.2.3 节,第 146 页;biblatex版本 3.9),我使用 来\ifblank{\namepartgiven}检查当前名称是否具有非空字段namepartgiven。逻辑看起来很简单:如果测试成功,\namepartgiven\space将在 之前打印\namepartfamily;如果字段为空,\namepartfamily则应立即打印,而没有任何前置\space。但是,我想知道\ifblank应该在什么时候触发。

请考虑以下示例:

\documentclass{article}

\usepackage[backend=biber,bibstyle=authoryear, citestyle=authoryear-icomp]{biblatex}
\addbibresource{test.bib}

\usepackage{filecontents}
\begin{filecontents*}{test.bib}
@book{test,
  author = {John Doe and Smith},
  title = {How to write an extraordinary book},
  date = {2018}
}%    
\end{filecontents*}

\DeclareNameFormat{citeauthor}{%
%  \iffieldundef{\namepartgiven}{}%
    {\ifblank{\namepartgiven}{}{\namepartgiven\space}}%
  \namepartfamily%
  \ifnumgreater{\value{liststop}}{\value{listcount}}%
    {\ifnumgreater{\value{liststop}-1}{\value{listcount}}%
      {\multinamedelim}%
      {\finalnamedelim}%
    }%
    {\ifmorenames{\usebibmacro{name:andothers}}{}}%
}

\DeclareCiteCommand{\citeauthor}
  {\boolfalse{citetracker}%
   \usebibmacro{prenote}}%
  {\usebibmacro{citeindex}%
   \printnames[citeauthor]{author}}%
  {}
  {\midsentence*}

\begin{document}
\printbibliography

\citeauthor{test}\par\cite{test}
\end{document}

如果 不为空,此代码将按预期工作\namepartgiven。但是,数据库不包含第二位作者(Smith)的名字。显然,\ifblank由于该字段不存在,因此不会触发;因此,它会分支以打印不存在的名字,后跟一个空格:

未设置字段 <code>namepartgiven</code> 不会触发 <code>\ifblank</code>,因此会插入额外的空格。

那么,在检查字段是否为空之前,先检查该字段是否被使用怎么样namepartgiven?只需激活第一行\DeclareNameFormat{citeauthor},然后再次编译文档!您将看到以下内容:

当没有名字时,使用 <code>\iffieldundef{namepartgiven} 会给出正确的结果 - 但是,如果设置了该字段,则不会显示名字。

毫不奇怪,“Smith”前面的错误空格消失了。但是等一下,John Doe 怎么了?为什么“John”也消失了?

有人知道这里发生了什么吗?一定是我理解错了什么——或者这可能是一个错误biblatex

答案1

标准样式使用\ifdefvoid而不是\ifblank\ifblank文档中的 是旧名称格式方案的残余(请参阅Biblatex 3.3 名称格式),其中部分名称不是作为宏传递,而是作为参数传递。文档已在 3.12 版中修复(提交7f470c1)。

你想要做什么的答案甚至更简单

\DeclareNameAlias{citeauthor}{given-family}

在此处输入图片描述

答案2

\ifblank不对其参数进行扩展,因此\ifblank{\namepartgive}永远不会返回 true。

展开\namepartgiven\ifblank

\DeclareNameFormat{citeauthor}{%
  \expandafter\ifblank\expandafter{\namepartgiven}{}{\namepartgiven\space}%
  \namepartfamily 
  \ifnumgreater{\value{liststop}}{\value{listcount}}%
    {\ifnumgreater{\value{liststop}-1}{\value{listcount}}%
      {\multinamedelim}%
      {\finalnamedelim}%
    }%
    {\ifmorenames{\usebibmacro{name:andothers}}{}}%
}

在此处输入图片描述

如果你担心参数\ifblank需要多个扩展步骤才能得出最终结果,你可以定义

\newcommand{\ifblankx}[1]{%
  \expandafter\ifblank\expandafter{\romannumeral-`Q#1}%
}

并使用\ifblankx{\namepartgiven}{<true>}{<false>}。另一方面,如果你确信\namepartgiven只需要一个扩展步骤,你可以使用

\ifdefvoid{\namepartgiven}{<true>}{<false>}

相关内容