修改部分枚举项目的标签

修改部分枚举项目的标签

在一个enumerate环境中,我希望一些(不是全部)项目有星号出现数字(我不太在意数字或星号是否与其他数字水平对齐)。有没有比使用多个列表(或 — 可怕的 — 手动编号)更简单的方法来实现这一点?

如果有帮助的话,我已经将其用于enumitem不相关的目的,尽管快速浏览其手册后我没有找到解决方案。

答案1

这个怎么样

在此处输入图片描述

\documentclass{article}
\newcommand{\myitem}{\refstepcounter{enumi}\item[$*$\theenumi.]}

\begin{document}
\begin{enumerate}
 \myitem first 
 \item second
 \item third
 \myitem fourth
\end{enumerate}
\end{document}

答案2

暂时重新定义\labelenumi(如果要将其用于任何嵌套级别,则有点困难)。它也适用于\label,但星号不会成为引用的一部分。

\documentclass{article}
\def\asteriskitem{*\,}
\def\sitem{%
  \let\originallabelenumi\labelenumi
  \expandafter\def\expandafter\labelenumi\expandafter{%
    \expandafter\asteriskitem\labelenumi}%
  \item
  \let\labelenumi\originallabelenumi
}

\begin{document}
\begin{enumerate}
\item a
\sitem b
\item c
\end{enumerate}
\end{document}

在此处输入图片描述

仅供参考,这里有一些适用于每个嵌套级别的东西:

\makeatletter
\def\sitem{%
  \expandafter\let\expandafter\originallabel\csname labelenum\romannumeral\@enumdepth\endcsname
  \expandafter\def\csname labelenum\romannumeral\@enumdepth\expandafter\endcsname\expandafter{%
    \expandafter\asteriskitem\originallabel}%
  \item
  \expandafter\let\csname labelenum\romannumeral\@enumdepth\endcsname\originallabel
}
\makeatother

解释

让我们看看更简单的解决方案是如何工作的。首先,我们必须知道用于\item排版\labelenumi第一级数字的宏,并且它是一个无参数的宏。

我们想改变 的含义,\labelenumi以便它也排版星号,所以我们为星号和一个小空格定义一个宏;然后我们定义一个命令\sitem来更改定义,发出\item并恢复原始\labelenumi。执行此操作的“简单”方法,即在组中更改定义,不幸的是不起作用。所以我们将原始含义保存在 中\originallabelenumi并执行

\expandafter\def\expandafter\labelenumi\expandafter{%
  \expandafter\asteriskitem\labelenumi}%

第一个激活所有后面的,从而得到\expandafter扩展\labelenumi \def行为(这里没有参数的事实\labelenumi非常重要)。

通用解决方案非常相似,但需要了解更多有关 的信息enumerate。嵌套级别可通过 的值访问\@enumdepth,该值是“TeX 计数器”;因此,\romannumeral\@enumdepth我们可以引用正确的 LaTeX 宏\labelenumi\labelenumii或。\labelenumiii\labelenumiv\csname labelenum\romannumeral\@enumdepth\endcsname

因此我们用以下方法保存正确宏的含义

\expandafter\let\expandafter\originallabel\csname labelenum\romannumeral\@enumdepth\endcsname

etoolbox可能会成为

\letcs\originallabel{labelenum\romannumeral\@enumdepth}

获得扩展的\originallabel方法基本与前面相同:

\expandafter\def\csname labelenum\romannumeral\@enumdepth\expandafter\endcsname\expandafter{%
  \expandafter\asteriskitem\originallabel}

但使用了一个巧妙的技巧。第一个\expandafter触发\csname,它将找到的所有内容扩展到匹配的\endcsname,包括内部的\expandafter,这将触发以下命令。最后,正确的标记(假设\labelenumi的值为\@enumdepth1)被放在后面\def,TeX 会在其中看到正确的命令

\def\labelenumi{\asterisk<expansion of \originallabel>}
\def\labelenumii{\asterisk<expansion of \originallabel>}
\def\labelenumiii{\asterisk<expansion of \originallabel>}
\def\labelenumiv{\asterisk<expansion of \originallabel>}

根据 的值\@enumdepth,根据需要。发出 后\item, 的含义\labelenum??将恢复。

答案3

这是一个更简单的方法。

大量借鉴回答,定义一个命令 ( \difficult),将星号放到位:

\documentclass{article}

\newcommand{\difficult}{%
  \leavevmode\makebox[0pt][r]{\large$\ast$\hspace{1.5em}}}

\begin{document}
\begin{enumerate}
\item a 
\item \difficult b 
\item c
\end{enumerate}

\end{document}

在此处输入图片描述

请注意,这将表现良好\label(但是不会出现星号)。

答案4

以下更新可与或\item配合使用(前者为新更新,后者为默认更新):\item*\item[..]

在此处输入图片描述

\documentclass{article}

\let\olditem\item
\makeatletter
\renewcommand{\item}{\@ifstar\@sitem\olditem}
\newcommand{\@sitem}{%
  \refstepcounter{\@enumctr}%
  \olditem[\textbullet~\csname label\@enumctr\endcsname]}
\makeatother

\begin{document}

\begin{enumerate}
  \item item no.1
  \item item no.2
  \item[$\bullet$~3.] item no.3
  \item item no.4
\end{enumerate}

\begin{enumerate}
  \item item no.1
  \item item no.2
  \item* item no.3
  \item item no.4
\end{enumerate}

\end{document}  

相关内容