我正在重构 biblatex 样式以适应最近引入 biber 的更改。所以我有以下代码:
\DeclareNameFormat{labelname}{%
\nameparts{#1}%
\ifcase\value{uniquename}%
{\usebibmacro{name:first-last}{\namepartfamily}{\namepartprefixi}{}{\namepartsuffix}}%
\or
\ifuseprefix
{\usebibmacro{name:first-last}{\namepartfamily}{\namepartgiveni}{\namepartprefix}{\namepartsuffixi}}
{\usebibmacro{name:first-last-init}{\namepartfamily}{\namepartgiveni}{\namepartprefixi}{\namepartsuffixi}}%
\or
\usebibmacro{name:first-last-init}{\namepartfamily}{\namepartgiven}{\namepartprefix}{\namepartsuffix}%
\fi%
\usebibmacro{name:andothers}%
}%
但是这段代码总是给我错误“extra \or”(对于 \or s)和“extra \fi”。调试时,我发现,在{}
第一个分支中填写任何内容都可以使代码正常工作。但我需要在那里有一个空参数。为什么对于 if 结构来说,参数是否为空会有区别?而且,更重要的是:我如何在其中提交一个空参数?
答案1
您没有提供足够的上下文来运行代码,但是您已经
\ifcase\value{uniquename}%
这里\ifcase
需要一个<number>
,并且假设的标准 latex 定义\value
将\value{uniquename}
是一个数字,如果uniquename
是一个 latex 计数器,也就是说,如果\c@uniquename
被定义为计数寄存器。
如果\c@uniqename
未定义,\value
则将其定义\let
为\relax
。您没有说明想要什么非错误行为,但例如您可以使其充当 -1,在这种情况下\ifcase
不会执行任何分支。
\ifcase\expandafter\ifx\csname c@uniquename\endcsname\relax-1 \else\value{uniquename}\fi