如何识别自定义环境中的枚举短标签?

如何识别自定义环境中的枚举短标签?

如何创建一个枚举列表并在每个项目编号前添加自定义前缀?我学会了如何创建自定义环境来创建标签。但现在,它缺少enumitem短标签功能:

通过采用原始示例,我设法将分隔符类型传递给嵌套的环境列表: 在此处输入图片描述

\documentclass{scrbook}

\usepackage{enumitem}
\usepackage{xparse}
\newcounter{enumerateoptionalcount}

\NewDocumentEnvironment{enumerateoptional}{O{)}}{%
    \setcounter{enumerateoptionalcount}{0}%
    \renewcommand*\descriptionlabel[1]{%
      \stepcounter{enumerateoptionalcount}%
      \normalfont\bfseries ##1~\arabic{enumerateoptionalcount}#1%
    }%
    \description%
  }%
  {\enddescription}

\begin{document}

\begin{enumerateoptional}[)]
   \item[Some first] item one
   \item[Some second] item two
   \item[Some third] item three
   \item[Some fourth] item four
   \item[Some Fifth] item five
\end{enumerateoptional}

\end{document}

但是我怎样才能像环境一样传递数字类型enumerate,即

  1. 如果我打电话\begin{enumdescript}[1)],那么号码是1) ..., 2) ...
  2. 如果我打电话\begin{enumdescript}[i)],那么号码是i) ..., ii) ...
  3. 如果我打电话\begin{enumdescript}[I)],那么号码是I) ..., II) ...
  4. ...

我试着看看enumitem软件包源代码,但我对此一无所知。例如,\ifx\enit@b\enit@c\else ... \enit@elt{##1}{##2}是什么enit? 是什么意思? ,,正在做elt什么?enit@aenit@benit@c

\newcommand\SetEnumerateShortLabel[2]{%
  \let\enit@a\@empty
  \def\enit@elt##1##2{%
    \def\enit@b{#1}\def\enit@c{##1}%
    \ifx\enit@b\enit@c\else
      \expandafter\def\expandafter\enit@a\expandafter{%
        \enit@a
        \enit@elt{##1}{##2}}%
    \fi}%
  \enit@marklist
  \expandafter\def\expandafter\enit@a\expandafter{%
    \enit@a
    \enit@elt{#1}{#2}}%
  \let\enit@marklist\enit@a}

\SetEnumerateShortLabel{a}{\alph*}
\SetEnumerateShortLabel{A}{\Alph*}
\SetEnumerateShortLabel{i}{\roman*}
\SetEnumerateShortLabel{I}{\Roman*}
\SetEnumerateShortLabel{1}{\arabic*}

答案1

您可以使用以下工具简化 OP 中的代码:枚举项包来创建自定义枚举环境。如果您这样做,那么您可以按照标准方式更改枚举中的标签,该标准方式由枚举项包裹:

\begin{enumerateoptional}[label=\alph*]
   \item[Some first] item one
   \item[Some second] item two
   \item[Some third] item three
   \item[Some fourth] item four
   \item[Some Fifth] item five
\end{enumerateoptional}

生产:

在此处输入图片描述

而默认情况下,当你省略时[label=\alph*],你会得到:

在此处输入图片描述

诀窍是重新定义\item命令以执行您想要的操作。为此,我制作了真实项目命令的“副本”,然后定义一个\optionalItem提供您格式的自定义命令。然后在自定义枚举环境的规范中添加before=\let\item\optionalItem使用自定义项目命令。

完整代码如下:

\documentclass{scrbook}

\usepackage{enumitem}
\newlist{enumerateoptional}{enumerate}{1}
\setlist[enumerateoptional]{
    before=\let\item\optionalItem,
    label=\arabic*,
    nosep,
    labelindent=20mm,
    leftmargin=*
}
\let\realItem\item

\newcommand\optionalItem[1][]{%
  \refstepcounter{enumerateoptionali}% increment the counter
  \realItem[\bfseries#1~\theenumerateoptionali)]%
}

\begin{document}

\begin{enumerateoptional}
   \item[Some first] item one
   \item[Some second] item two
   \item[Some third] item three
   \item[Some fourth] item four
   \item[Some Fifth] item five
\end{enumerateoptional}

\begin{enumerateoptional}[label=\alph*]
   \item[Some first] item one
   \item[Some second] item two
   \item[Some third] item three
   \item[Some fourth] item four
   \item[Some Fifth] item five
\end{enumerateoptional}

\end{document}

相关内容