使用 enumitem 缩进自定义列表

使用 enumitem 缩进自定义列表

考虑以下示例,使用枚举项包裹。

\newlist{foolist}{itemize}{1}
\setlist[foolist]{label = \textbullet, labelindent = 1em, leftmargin = *, align = left}

...

\begin{foolist}
    \item[Abc] Aute esse ut qui est id veniam qui consectetur aute sit quis reprehenderit.
    \item[Def] Tempor qui ullamco anim nisi occaecat pariatur ullamco duis sit non occaecat exercitation qui.
    \item[Ghi] Ullamco consequat velit fugiat quis.
\end{foolist}

(截屏)

这并不像人们预期的那样显示:

  • 列表项的缩进每行都不一样;
  • 悬挂缩进在某种程度上小于首行缩进。

标签宽度当然应该是任何标签的最大宽度的默认值。请注意,这里的标签缩进是正确的。

答案1

我认为您正在寻找的是widest确定使用最广泛的标签的关键:

\begin{foolist}[widest={Abc}]

得出的结果是:

在此处输入图片描述

代码:

\documentclass{article}

\usepackage{enumitem}
\newlist{foolist}{itemize}{1}
\setlist[foolist]{
    label = \textbullet, 
    labelindent = 1em, 
    leftmargin = *, 
    align = left,
}

\begin{document}
\begin{foolist}[widest={Abc}]
    \item[Abc] Aute esse ut qui est id veniam qui consectetur aute sit quis reprehenderit.
    \item[Def] Tempor qui ullamco anim nisi occaecat pariatur ullamco duis sit non occaecat exercitation qui.
    \item[Ghi] Ullamco consequat velit fugiat quis.
\end{foolist}
\end{document}

答案2

据我理解您的问题,您想自动将labelwidth某个列表的设置为该列表的最宽标签,该标签是通过设置的\item[<label>]

目前,这还没有在enumitem包中实现。你实际上要做的是检查的长度最后的标签并设置labelwidth为此宽度。另一种方法是由@Peter Grill 提议,是您使用widest选项明确设置长度,但这并不像您希望的那样自动。

解决此问题的可能方法已在这个问题。我想出了以下替代解决方案:

首先,我使用了description环境,因为我认为这更适合您的需求。

然后,我重新定义了\item命令,以便对于列表中的每个项目,代码现在检查当前标签是否比前一个标签宽(或者比第一个标签的 0pt 宽),如果是,则将内部长度(\maxlabeltempwidth)设置为该值。

在列表的末尾,这个值被存储\setwidestlabel在 .aux 文件中(感谢@egreg很好的答案)。最后,对于文档中的每个列表,.aux 文件都会存储一个具有最大标签宽度的值。

在列表设置中,最终使用该值(通过\getwidestlabel)来设置labelwidth

\documentclass{article}
\usepackage{enumitem, calc}

\newlength{\maxlabeltempwidth}
\setlength{\maxlabeltempwidth}{0pt}

\let\descItem\item
\renewcommand\item[1][]{%
    \descItem[#1]%
    \setlength{\maxlabeltempwidth}{\maxof{\maxlabeltempwidth}{\widthof{\textbf{#1}}}}}
  
\makeatletter
\newcommand{\setwidestlabel}[2]{%
  \immediate\write\@auxout{%
    \string\global\string\@namedef{descwidestlabel\romannumeral#1}{\the#2}%
  }
}
\makeatother

\newcommand{\getwidestlabel}[1]{%
  \ifcsname descwidestlabel\romannumeral#1\endcsname
    \csname descwidestlabel\romannumeral#1\endcsname
  \else
    0pt%
  \fi
}

\newlist{foolist}{description}{1}
\setlist[foolist]{
    after = \setwidestlabel{\EnumitemId}{\maxlabeltempwidth},
    labelwidth = \getwidestlabel{\EnumitemId},
    leftmargin = !
}

\begin{document}

\begin{foolist}
    \item[Abc] Aute esse ut qui est id veniam qui consectetur aute sit quis reprehenderit.
    \item[Def] Tempor qui ullamco anim nisi occaecat pariatur ullamco duis sit non occaecat exercitation qui.
    \item[Ghi] Ullamco consequat velit fugiat quis. 
\end{foolist}

\begin{foolist}
    \item[Abcdefghi] Aute esse ut qui est id veniam qui consectetur aute sit quis reprehenderit.
    \item[Def] Tempor qui ullamco anim nisi occaecat pariatur ullamco duis sit non occaecat exercitation qui.  
    \item[Ghi] Ullamco consequat velit fugiat quis. 
\end{foolist}

\begin{foolist}
    \item[Abc] Aute esse ut qui est id veniam qui consectetur aute sit quis reprehenderit.
    \item[Def] Tempor qui ullamco anim nisi occaecat pariatur ullamco duis sit non occaecat exercitation qui.
    \item[Ghi jkl] Ullamco consequat velit fugiat quis.
\end{foolist}

\end{document}

输出结果如下:

在此处输入图片描述

相关内容