我想为itemize
环境编写一个包装器宏。我想使用该enumitem
包(尽管这里的 MWE 不使用或不需要此包)。问题是我传递给环境的参数itemize
本身可能被编码在另一个宏内。
因此,对于包装器宏,我想写类似的东西
\expandafter\itemize\expandafter[\anothermacro]
来处理这个问题。但我得到了意想不到的结果。
由于某种原因,在包装器宏中嵌入环境的以下两种样式itemize
并不完全相同。
第一种风格只是使用 ,\begin{itemize}
后面跟着内容,然后是结束语\end{itemize}
。
第二种风格使用的\itemize
内容,然后是结束\enditemize
。但是在第二种风格中,我得到了嵌套环境。这不是我所期望的。
\documentclass{article}
\pagestyle{empty}
\usepackage{xparse}
\ExplSyntaxOn
\clist_new:N \l_ae_itemize_clist
%%--------------------------------------------------------------------------------
%% Style A
\cs_new:Npn \_ae_itemize_a:nn #1#2
{
\clist_set:Nn \l_ae_itemize_clist { #2 }
\begin{itemize}
\clist_map_inline:Nn \l_ae_itemize_clist
{ \item ##1 }
\end{itemize}
}
\NewDocumentCommand{\aefooda}{ O{}mm }
{ \par\textbf{#2:}
\_ae_itemize_a:nn {#1}{#3}
}
%%--------------------------------------------------------------------------------
%% Style B
\cs_new:Npn \_ae_itemize_b:nn #1#2
{
\clist_set:Nn \l_ae_itemize_clist { #2 }
\itemize
\clist_map_inline:Nn \l_ae_itemize_clist
{ \item ##1 }
\enditemize
}
\NewDocumentCommand{\aefoodb}{ O{}mm }
{ \par\textbf{#2:}
\_ae_itemize_b:nn {#1}{#3}
}
\ExplSyntaxOff
\begin{document}
\textbf{Style A} works fine:
\aefooda{first}{a,b,c}
\aefooda{second}{a,b,c}
\aefooda{third}{a,b,c}
%%--------------------------------------------------------------------------------
%% Changing from style A to style B
%%--------------------------------------------------------------------------------
\textbf{Style B} doesn't work:
\aefoodb{first}{a,b,c}
\aefoodb{second}{a,b,c}
\aefoodb{third}{a,b,c}
\end{document}
更新
我也尝试过类似以下的事情:
\edef\aeBeginItemize[#1]{\noexpand\begin{itemize}[#1]}
\cs_new:Npn \_ae_itemize_c:nn #1#2
{
\clist_set:Nn \l_ae_itemize_clist { #2 }
\aeBeginItemize[#1]
\clist_map_inline:Nn \l_ae_itemize_clist
{ \item ##1 }
\end{itemize}
}
但是当我尝试使用它时,我从enumitem
包中收到一个错误:它似乎enumitem
不再能够正确处理密钥。
答案1
itemize
需要知道它的嵌套级别,因此它会(本地)增加一个计数器。在\begin{itemize}
和\end{itemize}
内有\begingroup
和,\endgroup
使该分配保持本地状态。您当然可以通过将\group_begin:
和添加\group_end:
到您的函数来模拟它;在样式 A 或 B 之间进行选择,其中我还展示了如何扩展的选项列表itemize
:
\documentclass{article}
\usepackage{enumitem}
\usepackage{xparse}
\pagestyle{empty}
\ExplSyntaxOn
\clist_new:N \l_ae_itemize_clist
%%--------------------------------------------------------------------------
%% Style A
\cs_new:Npn \_ae_itemize_a:nn #1#2
{
\clist_set:Nn \l_ae_itemize_clist { #2 }
\use:x { \exp_not:n { \begin{itemize} } [\exp_not:o {#1}] }
\clist_map_inline:Nn \l_ae_itemize_clist { \item ##1 }
\end{itemize}
}
\NewDocumentCommand{\aefooda}{ O{}mm }
{ \par\textbf{#2:}
\_ae_itemize_a:nn {#1}{#3}
}
%%--------------------------------------------------------------------------
%% Style B
\cs_new:Npn \_ae_itemize_b:nn #1#2
{
\group_begin:
\clist_set:Nn \l_ae_itemize_clist { #2 }
\use:x { \exp_not:N \itemize [ \exp_not:o { #1 } ] }
\clist_map_inline:Nn \l_ae_itemize_clist { \item ##1 }
\enditemize
\group_end:
}
\NewDocumentCommand{\aefoodb}{ O{}mm }
{ \par\textbf{#2:}
\_ae_itemize_b:nn {#1}{#3}
}
\ExplSyntaxOff
\begin{document}
\textbf{Style A} works fine:
\aefooda{first}{a,b,c}
\aefooda{second}{a,b,c}
\aefooda{third}{a,b,c}
%%--------------------------------------------------------------------------
%% Changing from style A to style B
%%--------------------------------------------------------------------------
\textbf{Style B} works too:
\aefoodb{first}{a,b,c}
\aefoodb[label=+]{second}{a,b,c}
\newcommand{\test}{label=X,font=\textbf}
\aefoodb[\test]{third}{a,b,c}
\end{document}