enumitem:了解星号和感叹号在设置不同长度时的用法

enumitem:了解星号和感叹号在设置不同长度时的用法

enumitem 手册,我找不到关于leftmarginitemindentlabelseplabelwidth和中感叹号和星号的用法区别的清晰解释labelindent

例如,设置labelsep=*

在此处输入图片描述

labelsep=!

在此处输入图片描述

\documentclass{article}
\usepackage{enumitem}

\newcommand\litem[1]{\item{\bfseries#1.\space}}

\begin{document}

\begin{enumerate}[label=(\alph*),labelsep=!]
 \litem{Term one} First term description.
 \litem{Term two} Second term description.
\end{enumerate}

\end{document}

答案1

正如enumitemleftmargin文档中,列表中的水平间距由参数、itemindent、和组成,labelsep如下所示:labelwidthlabelindent

列表中的缩进

也就是说:

  1. 值服从关系

    leftmargin = labelindent + labelwidth + labelsep - itemindent
    
  2. 标签的右边缘\item将缩进labelindent + labelwidth

  3. 文本的第一行将\item缩进leftmargin + itemindent

  4. 后续行将以 缩进leftmargin

如您所见,有五个参数,但它们并非全部独立。给定其中任意四个,您就可以计算出第五个,这就是这些选项的!*值的作用所在。


为什么要有这种冗余?因为在标准 LaTeX 中,该参数labelindent并不存在;它由 引入enumitem。该包的作者认为,能够直接设置列表标签的缩进可能会很有用,而不必手动计算其他值来实现所需的缩进。

默认情况下,新参数labelindent总是根据其他参数计算得出。如果要直接设置labelindent,则必须指定enumitem应计算哪个参数。这就是该!值的用途。

*做同样的事情,但它也首先设置labelwidth。这很有用,因为正确的标签的边缘缩进为,因此,如果标签的实际宽度为,则labelindent + labelwidth标签的左边缘将仅缩进。尝试通过使用值测量标签的宽度来猜测最宽可能标签的宽度labelindentlabelwidthenumitem

  • 0如果label使用设置\arabic*
  • 如果label使用设置\roman*
  • 如果使用和label设置\alph*
  • 大写版本也类似。

因此,如果你设置label=(\alph*)enumitem将测量宽度(米)并设置labelwidth为该值。您可以使用该widest选项更改此行为。

请注意,这意味着labelwidth=!labelwidth=*做完全相同的事情。


好的,让我们看一个例子。enumitem承认这些值的行为可能会令人困惑,并提供\DrawEnumitemLabel可视化当前值,我将在下面使用它。它

[...] 从上到下绘制 4 条规则,, ,labelindentlabelwidth正则细,负则粗);用两条垂直规则标记。labelsepitemindentleftmargin

\documentclass{article}

\usepackage{enumitem}

\parindent=0pt
\newcommand*\printvalue[1]{\texttt{\string #1} : \the #1}

\begin{document}

% set some defaults:
\setlist{
        label=(\alph*),
        leftmargin=50pt,
        itemindent=10pt,
        labelsep=5pt,
        labelwidth=25pt,
        labelindent=10pt,
    }

By default, my definition of \verb|labelindent| is just ignored and it is calculated from the other values:
\begin{enumerate}
    \DrawEnumitemLabel
    \item \printvalue\leftmargin
    \item \printvalue\itemindent
    \item \printvalue\labelsep
    \item \printvalue\labelwidth
    \item \printvalue\labelindent
\end{enumerate}

I can change that using the \verb|!| value.
For example, I can instead calculate \verb|labelsep| from the other values:
\begin{enumerate}[labelindent=10pt, labelsep=!]
    \DrawEnumitemLabel
    \item \printvalue\leftmargin
    \item \printvalue\itemindent
    \item \printvalue\labelsep
    \item \printvalue\labelwidth
    \item \printvalue\labelindent
\end{enumerate}

The \verb|*| value does exactly the same, only it also set the value of \verb|labelwidth| first.
It tries to guess the widest possible label (\textsl{0} for \verb|\arabic*|, \textsl{viii} for \verb|\roman*|, \textsl{m} for \verb|\alph*|):
\begin{enumerate}[labelindent=10pt, labelsep=*]
    \DrawEnumitemLabel
    \item \printvalue\leftmargin
    \item \printvalue\itemindent
    \item \printvalue\labelsep
    \item \printvalue\labelwidth
    \item \printvalue\labelindent
\end{enumerate}

\end{document}

MWE 输出

相关内容