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
,当键相同时,它将按照描述用新的值替换存储的值。