我有一些文本想要转换成如下所示的模板:
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}
}
输出如下:
- [2.a] XYZ
- [5.b] 美国广播公司
- 一、二、三
- x, y
(除了使用 i. 和 ii. 代替项目符号)。我希望得到如下输出:
- [2.a] XYZ
- A
- b
- C
- [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}
每个扩展都应遵循其规范,因此不可能忘记某些事情。
输出完全相同。