我在 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命令包来救援。