![两个看似相同的 l3seq 导致传递给函数的行为不同](https://linux22.com/image/429258/%E4%B8%A4%E4%B8%AA%E7%9C%8B%E4%BC%BC%E7%9B%B8%E5%90%8C%E7%9A%84%20l3seq%20%E5%AF%BC%E8%87%B4%E4%BC%A0%E9%80%92%E7%BB%99%E5%87%BD%E6%95%B0%E7%9A%84%E8%A1%8C%E4%B8%BA%E4%B8%8D%E5%90%8C.png)
我有两个seq
,一个由 构成clist
,另一个由 构成prop
,它们的扩展(,
项目之间有 )看起来相同。它们应该包含 的选项\newwatermark
。使用prop
是为了确保选项(和其他要求)中没有重复。第一个按预期工作,第二个编译失败。为什么,如何修复?我用 代替 时没有出现此includepdf
错误newwatermark
。
PS:这是这个帖子。
\documentclass{article}
\usepackage{mwe}
\usepackage{pdfpages}
\usepackage{xparse}
\usepackage{xwatermark}
\ExplSyntaxOn
\cs_new_protected:Nn\__erw_pass_option:Nn{#1[#2]}
\cs_generate_variant:Nn \__erw_pass_option:Nn {Ne}
\ExplSyntaxOff
\begin{document}
\ExplSyntaxOn
\tl_set:Nn\l__Foo_tl{angle=45, scale=0.15}
%\tl_set:Nn\l__Baz_tl{page=\thepage,xpos=-20}
\seq_set_from_clist:Nn \l__a_seq{page=\thepage,xpos=-20}
\prop_set_from_keyval:Nn \l__prop{page=\thepage,xpos=-20}
\seq_new:N \l__b_seq
\prop_map_inline:Nn \l__prop{\seq_put_right:Nn\l__b_seq{#1=#2}}
a:\seq_use:Nn \l__a_seq{,}\\
b:\seq_use:Nn \l__b_seq{,}.
\newpage
\__erw_pass_option:Ne \newwatermark{\seq_use:Nn\l__a_seq {,}}{DRAFT} % OK
%\__erw_pass_option:Ne \newwatermark{\seq_use:Nn\l__b_seq {,}}{DRAFT} %File ended while scanning use of \xwm@
\__erw_pass_option:Ne \includepdf{\l__Foo_tl}{example-image-a}
\ExplSyntaxOff
\end{document}
答案1
这些序列并不相同,因为在通过属性列表构建的序列中,键被转换为str
(即字符串expl3
)。标记的 catcode 并不相同。
正如文档中所说interface3.pdf
:
TEX 字符串(因此也是 expl3 字符串)是一系列字符,这些字符的类别代码为 12(“其他”),但空格字符除外,空格字符的类别代码为 10(“空格”)。因此,从技术层面上讲,TEX 字符串是具有相应类别代码的标记列表。
\documentclass{article}
\begin{document}
\ExplSyntaxOn
{
\seq_set_from_clist:Nn \l_tmpa_seq { key = smth }
\prop_set_from_keyval:Nn \l_tmpa_prop { key = smth }
\prop_map_inline:Nn \l_tmpa_prop { \seq_put_right:Nn \l_tmpb_seq { #1 = #2 } }
\tl_set:Nf \l_tmpa_tl { \seq_use:Nn \l_tmpa_seq { } }
\tl_set:Nf \l_tmpb_tl { \seq_use:Nn \l_tmpb_seq { } }
\tl_if_eq:NNTF \l_tmpa_tl \l_tmpb_tl { TRUE } { FALSE } % return FALSE
}
--
{
\str_set:Nn \l_tmpa_str { key }
\exp_args:NNx \seq_set_from_clist:Nn \l_tmpa_seq { \l_tmpa_str = smth }
\exp_args:NNx \prop_set_from_keyval:Nn \l_tmpa_prop { \l_tmpa_str = smth }
\prop_map_inline:Nn \l_tmpa_prop { \seq_put_right:Nn \l_tmpb_seq { #1 = #2 } }
\tl_set:Nf \l_tmpa_tl { \seq_use:Nn \l_tmpa_seq { } }
\tl_set:Nf \l_tmpb_tl { \seq_use:Nn \l_tmpb_seq { } }
\tl_if_eq:NNTF \l_tmpa_tl \l_tmpb_tl { TRUE } { FALSE } % return TRUE
}
\ExplSyntaxOff
\end{document}
该代码的第一部分与您的编程相对应,结果为 FALSE。在第二种情况下,键在构造上仍然是字符串,结果为 TRUE。