我确信我完全搞错了,但我也确信这曾经与以前的版本一起使用latex3
:
\documentclass{article}
\ExplSyntaxOn
\NewExpandableDocumentCommand{\myifstreq}{ m m m m }
{
\str_if_eq:eeTF { #1 } { #2 } { #3 } { #4 }
}
\ExplSyntaxOff
\begin{document}
\myifstreq{Müller}{Müller}{equal}{not equal}
\myifstreq{M\"uller}{Müller}{equal}{not equal}
\end{document}
我如何让这个测试在比较之前充分扩展两个参数?
答案1
您正在检查扩展,但它们并不相等
考虑
\documentclass{article}
\begin{document}
\expanded{\def\noexpand\qqq{{M\"uller}{Müller}}}\show\qqq
\end{document}
显示了扩展。
使用 pdflatex (OT1) 你会得到
> \qqq=macro:
->{M\unhbox \voidb@x \bgroup \let \unhbox \voidb@x \setbox \@tempboxa \hbox {u\
global \mathchardef \accent@spacefactor \spacefactor }\let \begingroup \let \ty
peout \protect \begingroup \def \MessageBreak {
(Font) }\let \protect \immediate\write \m@ne {LaTeX Font Info:
on input line 5.}\endgroup \endgroup \relax \let \ignorespaces \relax \accent
127 u\egroup \spacefactor \accent@spacefactor ller}{Müller}.
l.5 ...noexpand\qqq{{M\"uller}{Müller}}}\show\qqq
?
使用 lualatex (TU) 您将获得
> \qqq=macro:
->{Müller}{Müller}.
l.5 ...f\noexpand\qqq{{M\"uller}{Müller}}}\show\qqq
?
如您所见,在 pdflatex 中这两个词不会扩展为同一件事。
您可以使用\text_purify:n
删除重音标记
\documentclass{article}
\begin{document}
\ExplSyntaxOn
\expanded{\def\noexpand\qqq{{\text_purify:n{M\"uller}}{\text_purify:n{Müller}}}}\show\qqq
\ExplSyntaxOff
\end{document}
生产
> \qqq=macro:
->{Müller}{Müller}.
l.5 ...uller}}{\text_purify:n{Müller}}}}\show\qqq
?
使用 pdflatex 和 lualatex
在 2022 年 latex 版本之前,inputenc 非 ASCII 字符并不同样稳健,在仅扩展的上下文中会中断。因此,实际上您会得到一个“真实”测试,但两个相等的“字符串”在每种情况下都是“意外中断的废话”。上面的第一个表格在 2020 年给出
> \qqq=macro:
->{M\unhbox \voidb@x \bgroup \let \unhbox \voidb@x \setbox \@tempboxa \hbox {u\
global \mathchardef \accent@spacefactor \spacefactor }\let \begingroup \endgrou
p \relax \let \ignorespaces \relax \accent 127 u\egroup \spacefactor \accent@sp
acefactor ller}{M\unhbox \voidb@x \bgroup \let \unhbox \voidb@x \setbox \@tempb
oxa \hbox {u\global \mathchardef \accent@spacefactor \spacefactor }\let \beging
roup \endgroup \relax \let \ignorespaces \relax \accent 127 u\egroup \spacefact
or \accent@spacefactor ller}.
l.5 ...noexpand\qqq{{M\"uller}{Müller}}}\show\qqq
?
这两种形式确实都有相同的扩展,但可能不是要测试的预期字符串。