\itemize 与 \begin{itemize} 的表现不符合预期

\itemize 与 \begin{itemize} 的表现不符合预期

我想为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}

在此处输入图片描述

相关内容