问题:

问题:

问题:

我正在使用\iffieldequals{pubstate}{str}来测试pubstate两个不同.bib条目的。但即使如此pubstate={foo},它仍然表现得像pubstate={str}。这是对这个问题的回答:

Biblatex 用替代字段替换标题

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}

相关内容