两个看似相同的 l3seq 导致传递给函数的行为不同

两个看似相同的 l3seq 导致传递给函数的行为不同

我有两个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。

相关内容