为什么 \str_if_eq_p:nn 没有被评估为真?

为什么 \str_if_eq_p:nn 没有被评估为真?

在以下 MWE 中,当设置为时,\str_if_eq_p:nn不计算为真。为什么?\l_aepoly_presentation_style_tlABC

\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\tl_new:N \l_aepoly_presentation_style_tl
\NewDocumentCommand{\mqpoly}{ D(){ABC} m }
  {\aepoly_parse_polynomial:nn {#1} {#2} }
\cs_new:Npn \aepoly_parse_polynomial:nn #1#2 {
  \tl_set:Nn \l_aepoly_presentation_style_tl {#1}
  \bool_if:nTF {
      %% other possible boolean expressions to evaluate
      \str_if_eq_p:nn { \tl_to_str:N \l_aepoly_presentation_style_tl } { ABC }
    }
      { \iow_term:n { string ~ is ~ "ABC" } }
      { \iow_term:x { NOT ~ EQUAL -> ~ "\l_aepoly_presentation_style_tl" } }
}

\ExplSyntaxOff
\pagestyle{empty}
\begin{document}

\mqpoly(MNP){hello}

\mqpoly{hello}

\end{document}

答案1

您有两种解决方法:

  1. 使用\str_if_eq_x_p:nn以强制完全扩展
  2. 用于\str_if_eq_p:Vn访问令牌列表变量的值

选择哪一个只是一个偏好问题,但我会选择第二个,因为它避免了第二个参数的扩展。

\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn

\NewDocumentCommand{\mqpoly}{ D(){ABC} m }
  {\aepoly_parse_polynomial:nn {#1} {#2} }

\tl_new:N \l_aepoly_presentation_style_tl

\cs_new_protected:Npn \aepoly_parse_polynomial:nn #1#2
 {
  \tl_set:Nn \l_aepoly_presentation_style_tl {#1}
  \bool_if:nTF
   {
    %% other possible boolean expressions to evaluate
    \str_if_eq_p:Vn \l_aepoly_presentation_style_tl { ABC }
   }
   { \iow_term:n { string ~ is ~ "ABC" } }
   { \iow_term:x { NOT ~ EQUAL ~ -> ~ "\l_aepoly_presentation_style_tl" } }
 }

\ExplSyntaxOff

\pagestyle{empty}

\begin{document}

\mqpoly(MNP){hello}

\mqpoly{hello}

\end{document}

不要忘记使用\cs_new_protected:Npn,因为您正在函数中进行分配。

输出为

NOT EQUAL -> "MNP"
string is "ABC"

相关内容