![问题:](https://linux22.com/image/327492/%E9%97%AE%E9%A2%98%EF%BC%9A.png)
问题:
我正在使用\iffieldequals{pubstate}{str}
来测试pubstate
两个不同.bib
条目的。但即使如此pubstate={foo}
,它仍然表现得像pubstate={str}
。这是对这个问题的回答:
M(N)WE:
\documentclass{article}
\usepackage{filecontents}
\usepackage[backend=biber,firstinits=true]{biblatex}
\newbibmacro{ur}{under review}
\newbibmacro{ta}{to appear}
\renewbibmacro{in:}{%
\ifentrytype{article}
{\iffieldequals{pubstate}{ur}{\printtext{Under review at\intitlepunct}}{}\clearfield{pubstate}}
% {\iffieldequals{pubstate}{ur}{\printtext{Under review at\intitlepunct}}{\iffieldequals{pubstate}{ta}{\printtext{To appear in\intitlepunct}}{}}\clearfield{pubstate}}
{\printtext{\bibstring{in}\intitlepunct}}%
}
\begin{filecontents}{./pubs.bib}
@article{key1,
author = {Name AA and Name BB},
title = {Article title name one},
Year = {2016},
journal = {Journal Name One},
pubstate = {under review},
}
@article{key2,
author = {Name CC and Name DD},
title = {Article title name two},
Year = {2016},
journal = {Journal Name Two},
pubstate = {to appear},
}
\end{filecontents}
\bibliography{./pubs.bib}
\begin{document}
\fullcite{key1}
\fullcite{key2}
\end{document}
输出:
输出不应该有“审核中”,因为
key2
它有pubstate={to appear}
。
感谢您的帮助。
答案1
简短回答:使用
\iffieldequalstr{pubstate}{under review}
或者
\newcommand*\ur{under review}
\iffieldequals{pubstate}{\ur}
或者
\newcommand*\ur{under review}
\iffieldequalcs{pubstate}{ur}
我认为这里第一个选项是首选。
根据文档(第 182 页)
\iffieldequals{<field>}{<macro>}{<true>}{<false>}
扩展为 真的如果<field>
等于的定义宏, 并错误的否则。
您案例中的字段的值是under review
。
如果你发出\iffieldequals{pubstate}{ur}
ur
甚至不是一个宏,它的计算结果为错误的(事实上,在一种情况下我甚至遇到了一个错误)。
您需要的是一个能够精确扩展为 的宏under review
,最简单的方法是\def{\ur}{under review}
,但\newcommand*\ur{under review}
也可以;另一方面,\newcommand\ur{under review}
由于它定义了一个长宏,因此不起作用。在这种情况下,您可以使用
\iffieldequals{pubstate}{\ur}
更重要的是
\newbibmacro{ur}{under review}
实际上并没有定义一个名为的宏\ur
,而是定义了一个名为的长宏\abx@macro@ur
。\newbibmacro*{ur}{under review}
定义了一个名为的“普通”宏\abx@macro@ur
或者,你可以使用\iffieldequalcs
不提供宏但提供控制序列名称(不带反斜杠的宏)的地方
\iffieldequals{pubstate}{ur}
这样做的好处是不会产生额外宏的开销。而且它使条件在代码中更容易理解和阅读。这里最好的解决方案似乎是用来\iffieldequalstr
检查字段是否等于第二个参数中给出的字符串
\iffieldequalstr{pubstate}{under review}