在如何创建一个枚举列表并在每个项目编号前添加自定义前缀?我学会了如何创建自定义环境来创建标签。但现在,它缺少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
,即
- 如果我打电话
\begin{enumdescript}[1)]
,那么号码是1) ..., 2) ...
- 如果我打电话
\begin{enumdescript}[i)]
,那么号码是i) ..., ii) ...
- 如果我打电话
\begin{enumdescript}[I)]
,那么号码是I) ..., II) ...
- ...
我试着看看enumitem
软件包源代码,但我对此一无所知。例如,\ifx\enit@b\enit@c\else ... \enit@elt{##1}{##2}
是什么enit
? 是什么意思? ,,正在做elt
什么?enit@a
enit@b
enit@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}