带有可变参数的嵌套枚举的新命令

带有可变参数的嵌套枚举的新命令

我有一些文本想要转换成如下所示的模板:

Extensions: 
\begin{enumerate}
    \item[2.a] xyz
        \begin{enumerate}[i.]
            \item a
            \item b
            \item c
        \end{enumerate}
    \item[5.b] abc
        \begin{enumerate}[i.]
            \item x
            \item y
        \end{enumerate}
\end{enumerate}\\

我想创建一个新命令来模仿上面的文本,但它需要如下参数:

\ucextensions{[2.a] xyz, [5.b] abc}{{a, b, c}, {x, y}}

请注意,我将有可变数量的参数。我已经有:

\newcommand{\ucextensions}[2]{
Extensions: 
\begin{enumerate}
    \forcsvlist{\item}{#1 \extensionsteps{#2}}
\end{enumerate}\\
}

\newcommand{\extensionsteps}[1]{
\begin{enumerate}[i.]
    \forcsvlist{\item}{#1}
\end{enumerate}
}

输出如下:

  1. [2.a] XYZ
  2. [5.b] 美国广播公司
    • 一、二、三
    • x, y

(除了使用 i. 和 ii. 代替项目符号)。我希望得到如下输出:

  1. [2.a] XYZ
    • A
    • b
    • C
  2. [5.b] 美国广播公司
    • X

(再次使用 i 而不是项目符号)。我正在使用etoolbox包来执行此操作。有没有办法做类似的事情,需要使用嵌套的 csv 或一系列 csv 来创建所需的输出?

答案1

我会稍微重新排序输入:

在此处输入图片描述

\documentclass{article}

\usepackage{enumerate}

\makeatletter
\def\ucextensions#1{%
\begin{enumerate}%
\@for\tmp:=#1\do{\expandafter\ucext\tmp}%
\end{enumerate}}

\newcommand\ucext[2]{%
\item\relax#1\begin{enumerate}[i]%
\@for\tmpb:=#2\do{\item\tmpb}%
\end{enumerate}}

\makeatletter

\begin{document}

\ucextensions{{[2.a] xyz}{a, b, c},
              {[5.b] abc}{x, y}
             }

\end{document}

答案2

我发现这种输入容易出现错误,因为与项目相关的内部列表离它很远。

有可能得到你想要的,但也许不同的语法会更好。

\documentclass{article}

\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand\ucextensions{mm}
 {
  \jani_ucextensions:nn { #1 } { #2 }
 }

\seq_new:N \l__jani_ucext_outer_seq
\seq_new:N \l__jani_ucext_inner_seq
\seq_new:N \l__jani_ucext_temp_seq
\int_new:N \l__jani_ucext_step_int

\cs_new_protected:Npn \jani_ucextensions:nn #1 #2
 {
  \seq_set_split:Nnn \l__jani_ucext_outer_seq { , } { #1 }
  \seq_set_split:Nnn \l__jani_ucext_inner_seq { , } { #2 }
  \int_zero:N \l__jani_ucext_step_int
  \par Extensions:
  \begin{enumerate}
  \seq_map_inline:Nn \l__jani_ucext_outer_seq
   {
    \item {##1}
    \int_incr:N \l__jani_ucext_step_int
    \seq_set_split:Nnx \l__jani_ucext_temp_seq { , }
     { \seq_item:Nn \l__jani_ucext_inner_seq { \l__jani_ucext_step_int } }
    \begin{itemize}
    \item \seq_use:Nn \l__jani_ucext_temp_seq { \item }
    \end{itemize}
   }
  \end{enumerate}
 }
\cs_generate_variant:Nn \seq_set_split:Nnn { Nnx }
\ExplSyntaxOff

\begin{document}

\ucextensions{[2.a] xyz, [5.b] abc}{{a, b, c}, {x, y}}

\end{document}

我定义了两个序列,将项目存储在第一个和第二个参数中,以逗号分隔。

打开一个enumerate环境,然后我对第一个序列进行映射,使用第二个序列中的相应元素,我再次用逗号分隔以构建内部itemize

在此处输入图片描述

可以使用非常相似的宏来适应不同的语法来完成这项工作。

\documentclass{article}

\usepackage{xparse}

\ExplSyntaxOn

\NewDocumentCommand{\ucextensions}{m}
 {
  \group_begin:
  \jani_ucextensions:n { #1 }
  \group_end:
 }

\seq_new:N \l__jani_ucext_outer_seq
\seq_new:N \l__jani_ucext_inner_seq
\seq_new:N \l__jani_ucext_temp_seq
\int_new:N \l__jani_ucext_step_int

\keys_define:nn { jani/ucext }
 {
  ext  .code:n = \seq_put_right:Nn \l__jani_ucext_outer_seq { #1 },
  spec .code:n = \seq_put_right:Nn \l__jani_ucext_inner_seq { #1 },
 }

\cs_new_protected:Npn \jani_ucextensions:n #1
 {
  \keys_set:nn { jani/ucext } { #1 }
  \int_zero:N \l__jani_ucext_step_int
  \par Extensions:
  \begin{enumerate}
  \seq_map_inline:Nn \l__jani_ucext_outer_seq
   {
    \item {##1}
    \int_incr:N \l__jani_ucext_step_int
    \seq_set_split:Nnx \l__jani_ucext_temp_seq { \\ }
     { \seq_item:Nn \l__jani_ucext_inner_seq { \l__jani_ucext_step_int } }
    \begin{itemize}
    \item \seq_use:Nn \l__jani_ucext_temp_seq { \item }
    \end{itemize}
   }
  \end{enumerate}
 }
\cs_generate_variant:Nn \seq_set_split:Nnn { Nnx }
\ExplSyntaxOff

\begin{document}

\ucextensions{
  ext  = [2.a] xyz,
  spec =  a \\ b \\ c,
  ext  = [5.b] abc,
  spec = x \\ y
}

\end{document}

每个扩展都应遵循其规范,因此不可能忘记某些事情。

输出完全相同。

相关内容