我以为我遵循的是 拆分分隔标记列表参数。唯一的区别是,我认为没有必要使用小写技巧。
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage{xparse}
\ExplSyntaxOn
\cs_new:Npn \__aedl_extract_first:w #1=#2<#3> \q_stop { #1 }
\cs_new:Npn \__aedl_extract_second:w #1=#2<#3> \q_stop { #2 }
\cs_new:Npn \__aedl_extract_third:w #1=#2<#3> \q_stop { #3 }
\tl_new:N \l_aedl_a_tl
\tl_new:N \l_aedl_b_tl
\tl_new:N \l_aedl_c_tl
\NewDocumentCommand{\showComponents}{ m }
{
\tl_set:Nn \l_aedl_a_tl \__aedl_extract_first:w #1 \q_stop
\tl_set:Nn \l_aedl_b_tl \__aedl_extract_second:w #1 \q_stop
\tl_set:Nn \l_aedl_c_tl \__aedl_extract_third:w #1 \q_stop
\begin{tabular}{ccc}
a & b & c \\
\l_aedl_a_tl & \l_aedl_b_tl & \l_aedl_c_tl
\end{tabular}
}
\ExplSyntaxOff
\usepackage{lipsum}
\begin{document}
\showComponents{headrulewidth=8pt<cmd>}
\end{document}
这是我打破无限循环后的消息:
! Interruption.
\showComponents ...aedl_extract_first:w #1\q_stop
\tl_set:Nn \l_aedl_b_tl \_...
l.32 \showComponents{headrulewidth=8pt<cmd>}
但是我的命令进入了无限循环:据我所知,我的命令只是不断扩大\q_stop
。
还有一点:\showComponents
应该传递一个逗号分隔的参数。也就是说,我希望它接受如下参数
\showComponents{headrulewidth=8pt<cmd>,fboxrule=2pt<dim>}
第三个参数旨在作为指令来确定是否应重新定义命令或设置长度。但为了这个 MWE 的目的,我删除了内容\clist_map_inline
。
我知道我可以按照@egreg 的做法做解决方案与上面发布的页面相同,但我想知道如何使第一次尝试使用奇怪的参数定义我自己的命令起作用。
答案1
你正在做的
\tl_set:Nn \l_aedl_a_tl \__aedl_extract_first:w
这根本没什么用:\tl_set:Nn
需要两个参数。然后是 token
headrulewidth=8pt<cmd> \q_stop
留在输入流中,而扩展是\q_stop
人们真正想要避免的。
你应该说
\tl_set:No \l_aedl_a_tl { \__aedl_extract_first:w #1 \q_stop }
对其他两行也同样操作。将o
括号后的第一个标记展开。
然而,有一个更简单的方法可以实现这一点:
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage{xparse}
\ExplSyntaxOn
\cs_new:Npn \__aedl_extract:w #1=#2<#3> \q_stop { #1 & #2 & #3 }
\NewDocumentCommand{\showComponents}{ m }
{
\begin{tabular}{ccc}
a & b & c \\
\__aedl_extract:w #1 \q_stop
\end{tabular}
}
\ExplSyntaxOff
\usepackage{lipsum}
\begin{document}
\showComponents{headrulewidth=8pt<cmd>}
\end{document}