我有一个宏的 LaTeX3 代码,该宏以复杂的方式处理其参数并构建树状结构。为了表示此结构,它构造了一个逗号分隔的字符串列表和逗号分隔的列表(例如a,{b,c}
)。它不使用 clist 接口,但将括号和字符串添加到稍后处理的标记列表中\clist_new:NV
。
我的问题是:我不知道如何在不破坏代码平衡的情况下将单个花括号添加到标记列表中。我尝试使用\c_group_begin_token
和,\c_group_end_token
但它们没有扩展为括号。
如何将 clist-grouping 括号添加到 tokenlist 中?
梅威瑟:
\documentclass{article}
\usepackage{expl3}
\usepackage{xparse}
\ExplSyntaxOn
\DeclareDocumentCommand{\foo}{mmm}{
\cs_new:Nn \__begin_bracket: {[}
\cs_new:Nn \__end_bracket: {]}
%\cs_new:Nn \__begin_bracket: {\c_group_begin_token}
%\cs_new:Nn \__end_bracket: {\c_group_begin_token}
% This processing is more complicated in reality.
\tl_clear:N \l_tmpa_tl
\tl_put_right:Nn \l_tmpa_tl {#1 , }
\tl_put_right:Nx \l_tmpa_tl {\__begin_bracket:}
\tl_put_right:Nn \l_tmpa_tl {#2 , }
\tl_put_right:Nn \l_tmpa_tl {#3}
\tl_put_right:Nx \l_tmpa_tl {\__end_bracket:}
\tl_log:N \l_tmpa_tl
\clist_set:NV \l_tmpa_clist \l_tmpa_tl
\clist_map_inline:Nn \l_tmpa_clist {
\tl_log:n {##1}
}
}
\ExplSyntaxOff
\begin{document}
\foo{a}{b}{c}
\end{document}
当改变时\__begin_bracket:
,\__end_bracket:
日志文件中的输出应该是:
\l_tmpa_tl=a,{b,c}.
a.
b,c.
笔记:在此问题的先前版本中,我使用括号括住了整个列表。这不适用于\clist_set:NV
(它假设我想用括号转义逗号)。
答案1
您不能拥有不平衡的标记列表;不过,您可以使用一个小技巧:
\documentclass{article}
\usepackage{expl3}
\usepackage{xparse}
\ExplSyntaxOn
\cs_new:Nn \khb_left_brace: { { \if_false: } \fi: }
\cs_new:Nn \khb_right_brace: { \if_false: { \fi: } }
\NewDocumentCommand{\foo}{mmm}{
% This processing is more complicated in reality.
\tl_clear:N \l_tmpa_tl
\tl_put_right:Nn \l_tmpa_tl {\exp_not:n {#1 ,} }
\tl_put_right:Nn \l_tmpa_tl {\khb_left_brace:}
\tl_put_right:Nn \l_tmpa_tl {\exp_not:n {#2 ,} }
\tl_put_right:Nn \l_tmpa_tl {\exp_not:n {#3} }
\tl_put_right:Nn \l_tmpa_tl {\khb_right_brace:}
\tl_set:Nx \l_tmpa_tl { \l_tmpa_tl }
\tl_log:N \l_tmpa_tl
\clist_set:NV \l_tmpa_clist \l_tmpa_tl
\clist_map_inline:Nn \l_tmpa_clist {
\tl_log:n {##1}
}
}
\ExplSyntaxOff
\begin{document}
\foo{a}{b}{c}
\end{document}
日志文件有
> \l_tmpa_tl=a,{b,c}.
> a.
> b,c.
符合预期