全面扩展 \str_if_eq 测试

全面扩展 \str_if_eq 测试

我确信我完全搞错了,但我也确信这曾经与以前的版本一起使用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
                                                  
? 

这两种形式确实都有相同的扩展,但可能不是要测试的预期字符串。

相关内容