我想定义一个命令来接收环境名称列表(和其他参数来控制环境的行为,我删除它们以简化)并定义这些环境,但它的行为并不按预期。
正如 Ulrike Fischer 评论的那样,我应该传递##1
给\__test:nnnn
,但如果\NewDocumentEnvironment
嵌套更深,####1
等等########1
太长而无法使用,还有什么办法可以用来#1
表示的参数吗\NewDocumentEnvironment
?
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\cs_new_protected:Nn \__test:nnnn
{
\typeout{#3}% ##1
\clist_map_inline:nn { #1 }
{
\typeout{#3}% 'a', 'b', 'c'
\NewDocumentEnvironment { test##1 } { #2 }
{ #3 } { #4 }
}
}
\__test:nnnn { a, b, c } { m } { #1 } { }
% cause error
% Illegal parameter number in definition of \__clist_map_1:w.
% \__test:nnnn { e, f } { m +b } { #1 #2 } { }
\ExplSyntaxOff
\begin{document}
% output 'a' which should be 'test'
\begin{testa}{test}
\end{testa}
\end{document}
答案1
我不确定这有多大用处。无论如何,您可以#
通过在进行映射之前将参数存储在标记列表变量中来避免第三和第四个参数重复。
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\cs_new_protected:Nn \__zhiyuan_test_defenv:nnnn
{
\tl_set:Nn \l__zhiyuan_scratch_a_tl { #3 }
\tl_set:Nn \l__zhiyuan_scratch_b_tl { #4 }
\clist_map_inline:nn { #1 }
{
\__zhiyuan_newenv:nnVV { ##1 } { #2 } \l__zhiyuan_scratch_a_tl \l__zhiyuan_scratch_b_tl
}
}
\cs_new_protected:Nn \__zhiyuan_newenv:nnnn
{
\NewDocumentEnvironment { test#1 } { #2 } { #3 } { #4 }
}
\cs_generate_variant:Nn \__zhiyuan_newenv:nnnn { nnVV }
\__zhiyuan_test_defenv:nnnn { a, b, c } { m } { #1 } { }
\ExplSyntaxOff
\begin{document}
% output 'a' which should be 'test'
\begin{testa}{test}
\end{testa}
\end{document}