使用 \def 或 \newcommand 扩展键值?

使用 \def 或 \newcommand 扩展键值?

我有多次重复

\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

您可以定义新的键:

\documentclass{article}
\usepackage{enumitem}
\SetEnumitemKey{alph}{label=#1\alph*), ref=#1\alph*}
\begin{document}
\begin{enumerate}[alph=A]
\item abc\label{test}
\end{enumerate}

\ref{test}

\begin{enumerate}[alph=B]
\item abc
\end{enumerate}

\end{document}

在此处输入图片描述

答案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}

在此处输入图片描述

相关内容