Biblatex:DeclareFieldFormat 中的 ifx

Biblatex:DeclareFieldFormat 中的 ifx

我在 biblatex (v1.6) 中使用块\ifx内的命令时运气不佳。我是不是漏掉了什么?一个最小(非)工作示例:\DeclareFieldFormat

\documentclass{article}
\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
@misc{ref1,
    title = {Title1},
    eprint = {MR001},
    eprinttype = {mrnumber}}
@misc{ref2,
    title = {Title},
    eprint = {002},
    eprinttype = {mrnumber}}
@misc{ref3,
    title = {Title},
    eprint = {MR003 (aa)},
    eprinttype = {mrnumber}}
@misc{ref4,
    title = {Title},
    eprint = {004 (bb)},
    eprinttype = {mrnumber}}
\end{filecontents}
\usepackage{biblatex}
\addbibresource{\jobname.bib}

% based on code from http://tex.stackexchange.com/q/1856/245
\def\checkMR MR#1#2#3 #4\relax%
  {\ifx#1M%
     \ifx#2R%
     #3%
     \else%
     #1#2#3%
     \fi
   \else
     #1#2#3%
   \fi}
\def\MR#1{\checkMR MR#1 \relax}

\DeclareFieldFormat{eprint:mrnumber}{%
  \MR{#1}}

\begin{document}
It works here \MR{MR001}, \MR{002}, \MR{MR003 (aa)}, \MR{004 (bb)}

\cite{ref1}, \cite{ref2}, \cite{ref3}, \cite{ref4}
\printbibliography
\end{document}

它在正文中的评估正确,但在参考书目字段中的评估为错误。

答案1

发生这种情况是因为您正在使用\ifx测试,只有当M和的类别代码为R“字母”时,测试才会成立。biblatex将参数作为去标记化字符串传递,因此测试失败。您在这里想要的是按字符代码进行比较:使用测试\if

\def\checkMR MR#1#2#3 #4\relax
  {%
    \if#1M%
      \if#2R%
        #3%
      \else
        #1#2#3%
      \fi
    \else
      #1#2#3%
    \fi
  }

答案2

也可以避免条件:

\def\checkMR MR#1#2#3 #4\relax%
  {\ifnum\pdfstrcmp{#1#2}{MR}=0
     #3%
   \else
     #1#2#3%
   \fi}

如果想要与 XeLaTeX 和 LuaLaTeX 兼容,那么

\usepackage{pdftexcmds}
\makeatletter
\def\checkMR MR#1#2#3 #4\relax%
  {\ifnum\pdf@strcmp{#1#2}{MR}=\z@
     #3%
   \else
     #1#2#3%
   \fi}
\makeatother

\pdfstrcmp{<A>}{<B>}如果两个字符串<A><B>相等(扩展后),则扩展为 0。不幸的是,它\strcmp在 XeTeX 中被调用,而在 LuaTeX 中缺失,但 H. Oberdiek 的pdftex命令包来救援。

相关内容