为什么 \tl_if_in:VnTF 会根据位置给出不同的答案?

为什么 \tl_if_in:VnTF 会根据位置给出不同的答案?

prop我正在尝试使用replacements 结构构建一个简单的替换字典old=new。当我通过映射时prop,我找不到任何替换。当我没有(即硬编码)时,我会找到。这是怎么回事?

平均能量损失

\nonstopmode
\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn

\prop_put:Nnn \l_tmpa_prop {sean} {patrick}
\msg_term:n {resolving}

\tl_set:Nn \l_tmpa_tl {hello,~sean}
\prop_map_inline:Nn \l_tmpa_prop
{
  \tl_show:N \l_tmpa_tl
  \tl_show:n {#1}
  \tl_if_in:VnTF \l_tmpa_tl {#1}
    { \msg_term:n {`#1'~found~in~`\l_tmpa_tl'} }
    { \msg_term:n {`#1'~not~found~in~`\l_tmpa_tl'} }
}

\msg_term:n {contrived}
\tl_show:N \l_tmpa_tl
\tl_show:n {sean}
\tl_if_in:VnTF \l_tmpa_tl {sean}
  { \msg_term:n {oh,~yes~it~is!} }
  { \msg_term:n {nope} }

\ExplSyntaxOff

\begin{document}
hello
\end{document}

输出

* resolving
*************************************************
> \l_tmpa_tl=hello, sean.
<recently read> }

l.18     }

> sean.
<recently read> }

l.18     }

*************************************************
* `sean' not found in `hello, sean'
*************************************************
*************************************************
* contrived
*************************************************
> \l_tmpa_tl=hello, sean.
<recently read> }

l.21     \tl_show:N \l_tmpa_tl

> sean.
<recently read> }

l.22     \tl_show:n {sean}

*************************************************
* oh, yes it is!

答案1

您在这里忘记的是类别代码:是的,两个标记列表包含相同的字符,但如果您使用,\tl_show_analysis:N您会发现它们具有不同的类别代码。这是因为键被去标记化了:正如文档所述

⟨keys⟩ 以字符串为基础进行比较,使用与 相同的方法 \str_if_eq:nn

(我们或许可以明确地表明它们已被去标记化。)

如果你想用新的值替换 prop 中的值,正确的方法是使用\prop_put:Nnn,当键相同时,它将按照描述用新的值替换存储的值。

相关内容