我想更改的输出格式,\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
由于该字段不存在,因此不会触发;因此,它会分支以打印不存在的名字,后跟一个空格:
那么,在检查字段是否为空之前,先检查该字段是否被使用怎么样namepartgiven
?只需激活第一行\DeclareNameFormat{citeauthor}
,然后再次编译文档!您将看到以下内容:
毫不奇怪,“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>}