在一个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
的值为\@enumdepth
1)被放在后面\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}