对于特定的 biblatex 样式,我声明了一个采用名称的参考书目选项,例如
\DeclareBibliographyOption{myname}{\edef\somename{#1}}
现在,如果此选项的值由括号组成,则 LaTeX 会产生错误,例如myname=M{\"u}ller
:
! You can't use `macro parameter character #' in horizontal mode.
\@removeelement #1#2#3->\def \reserved@a ##1,#1,##
2\reserved@a {##1,##2\rese...
l.59 \ProcessOptions\relax
有没有办法解决这个问题?如果没有,有没有办法扩展宏,使括号消失?我的目标是通过 测试字符串等效性,如果与 进行比较,\ifdefstring
则测试返回 false ,如下所示M{\"u}ller
M\"uller
\edef\x{M{\"u}ller}
\edef\y{M\"uller}
\ifdefstrequal{\x}{\y}{TRUE}{FALSE}
它将返回FALSE
。
答案1
你不能\edef
在这个上下文中使用:\edef\x{...\"u...}
will总是失败。
如果你的文件使用 UTF-8 编码,并且作者可以出现在三种格式中
M{\"u}ller
M\"uller
Müller
那么这些宏就可以是你想要的:
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{etoolbox}
\makeatletter
\def\stripbraces#1#2{%
\begingroup
\def\IeC##1{##1}%
\protected@edef\@tempa{#1}%
\gdef\@gtempa{}%
\expandafter\@stripbraces\@tempa\@nil
\endgroup
\let#2\@gtempa
}
\def\@stripbraces#1{%
\ifx#1\@nil\else
\expandafter\gdef\expandafter\@gtempa\expandafter{\@gtempa#1}%
\expandafter\@stripbraces
\fi
}
\makeatother
\begin{document}
\stripbraces{M\"uller}{\x}
\stripbraces{M{\"u}ller}{\y}
\stripbraces{Müller}{\z}
\ifdefstrequal{\x}{\y}{TRUE}{FALSE}
\ifdefstrequal{\x}{\z}{TRUE}{FALSE}
\ifdefstrequal{\y}{\z}{TRUE}{FALSE}
\stripbraces{Øre}{\x}
\stripbraces{{\O}re}{\y}
\stripbraces{\O re}{\z}
\ifdefstrequal{\x}{\y}{TRUE}{FALSE}
\ifdefstrequal{\x}{\z}{TRUE}{FALSE}
\ifdefstrequal{\y}{\z}{TRUE}{FALSE}
\stripbraces{Gauß}{\x}
\stripbraces{Gau{\ss}}{\y}
\stripbraces{Gau\ss}{\z}
\ifdefstrequal{\x}{\y}{TRUE}{FALSE}
\ifdefstrequal{\x}{\z}{TRUE}{FALSE}
\ifdefstrequal{\y}{\z}{TRUE}{FALSE}
\end{document}
所有测试结果均为“TRUE”。
Fran{\c{c}}ais
但是这对于和来说会失败Fran{\c c}ais
。因此最终答案取决于您的需求。
答案2
尝试使用 unicode bib 选项
\newcommand\testuni{}
\DeclareBibliographyOption[boolean]{test-unicode}[false]{
\ifstrequal{#1}{