我有多次重复
\begin{enumerate}[label=A\alph*), ref=A\alph*]
并且我想减少代码重复。如果可能的话,我还想避免创建新的环境。我只想要一种简单的方法(如果有的话)来做这样的事情:
\newcommand{\enumopts}[1]{label={#1}\alph*), ref={#1}\alph*}
\begin{enumerate}[\enumopts{A}]
上面的例子不起作用。如果相关的话,我指的是包enumitem
。
我应该注意以下工作:
\newcommand{\elabel}[1]{{#1}\alph*)}
\newcommand{\eref}[1]{{#1}\alph*}
\begin{enumerate}[label=\elabel, ref=\eref]
我该怎么做?
答案1
答案2
虽然我强烈推荐@UlrikeFischer 为手头的问题提供的答案,但对于如何在键列表内扩展宏这个更一般的问题,下面使用定义了这样的预处理器expkv
。
这允许使用expkv
扩展符号来指定单个列表元素的精确扩展。
在下面的例子中我使用了这些扩展规则:
o\r
扩展第一个 token 一次 (o
) 并将结果重新插入为 key=value 输入 (\r
)R
扩大单身的token 一次(或者如果它是一个寄存器,则扩展为寄存器的内容),然后将结果重新插入为 key=value 输入(不适用于带参数的宏\enumopts
)。
\documentclass{article}
\usepackage{expkv}
\makeatletter
\newcommand\kvpreproc[2]
{%
\expanded
{\unexpanded{#1}{\expanded{\ekvparse\kvpreproc@k\kvpreproc@kv{#2}}}}%
}
\newcommand\kvpreproc@k[1]{, {\unexpanded{#1}}}
\newcommand\kvpreproc@kv[2]{, {\unexpanded{#1}}= {\unexpanded{#2}}}
\makeatother
\usepackage{enumitem}
\newcommand{\enumopts}[1]{label={#1}\alph*), ref={#1}\alph*}
\newcommand\moreopts{labelsep=1em}
\begin{document}
\kvpreproc{\begin{enumerate}[}{nosep, o\r: \enumopts{A}, R: \moreopts}]
\item foo
\item bar
\item baz
\end{enumerate}
\kvpreproc{\begin{enumerate}[}{nosep, o\r: \enumopts{A}}]
\item foo
\item bar
\item baz
\end{enumerate}
\end{document}