更改描述列表中的悬挂缩进

更改描述列表中的悬挂缩进

我正在尝试让描述列表的悬挂缩进与第一行文本齐平。我有一个描述列表,如下所示:

\begin{description}
 \item[Label the first] Lorem ipsum dolor sit amet, consectetur adipisicing
                        elit, sed do eiusmod tempor incididunt ut labore et
                        dolore magna aliqua.
 \item[The longest label] Ut enim ad minim veniam, quis nostrud exercitation
                          ullamco laboris nisi ut aliquip ex ea commodo
                          consequat.
 \item[Shrtlbl] Duis aute irure dolor in reprehenderit in voluptate velit esse
                cillum dolore eu fugiat nulla pariatur.
\end{description}

这将产生以下输出:

悬挂缩进不良。

我希望每个段落都缩进,以便以下行与列表项文本的首字母齐平,就像在我的 TeX 中布局一样。例如,“sectetur”的“s”应该位于“Lorem”的“L”正下方。我尝试查看enumitem 包,但我似乎找不到一个好的选择。我尝试指定[leftmargin=3cm, style=sameline],但结果如下:

悬挂缩进略有改善。

这不太对:我正试图让每件物品都排好不同地,因此“Lorem”中的“L”不一定与“Ut”中的“U”或“Duis”中的“D”对齐。有人知道这样做的好方法吗?

答案1

这是一个解决方案,您只需编写

\begin{DESCRIPTION}
 \item[Label the first] Lorem ipsum dolor sit amet, consectetur adipisicing
                        elit, sed do eiusmod tempor incididunt ut labore et
                        dolore magna aliqua.
 \item[The longest label] Ut enim ad minim veniam, quis nostrud exercitation
                          ullamco laboris nisi ut aliquip ex ea commodo
                          consequat.
 \item[Shrtlbl] Duis aute irure dolor in reprehenderit in voluptate velit esse
                cillum dolore eu fugiat nulla pariatur.
\end{DESCRIPTION}

并得到

代码结果

它可以处理其中的任意文本,{DESCRIPTION}并且可以与其他列表嵌套。

\documentclass{article}

\usepackage{calc}

\makeatletter
\newcommand{\DESCRIPTION@original@item}{}
\let\DESCRIPTION@original@item\item
\newcommand*{\DESCRIPTION@envir}{DESCRIPTION}
\newlength{\DESCRIPTION@totalleftmargin}
\newlength{\DESCRIPTION@linewidth}
\newcommand{\DESCRIPTION@makelabel}[1]{\llap{#1}}%
\newcommand{\DESCRIPTION@item}[1][]{%
  \setlength{\@totalleftmargin}%
       {\DESCRIPTION@totalleftmargin+\widthof{\textbf{#1 }}-\leftmargin}%
  \setlength{\linewidth}
       {\DESCRIPTION@linewidth-\widthof{\textbf{#1 }}+\leftmargin}%
  \par\parshape \@ne \@totalleftmargin \linewidth
  \DESCRIPTION@original@item[\textbf{#1}]%
}
\newenvironment{DESCRIPTION}
  {\list{}{\setlength{\labelwidth}{0cm}%
           \let\makelabel\DESCRIPTION@makelabel}%
   \setlength{\DESCRIPTION@totalleftmargin}{\@totalleftmargin}%
   \setlength{\DESCRIPTION@linewidth}{\linewidth}%
   \renewcommand{\item}{\ifx\@currenvir\DESCRIPTION@envir
                           \expandafter\DESCRIPTION@item
                        \else
                           \expandafter\DESCRIPTION@original@item
                        \fi}}
  {\endlist}
\makeatother

\begin{document}

\begin{DESCRIPTION}
 \item[Label the first] Lorem ipsum dolor sit amet, consectetur adipisicing
                        elit, sed do eiusmod tempor incididunt ut labore et
                        dolore magna aliqua.
 \item[The longest label] Ut enim ad minim veniam, quis nostrud exercitation
                          ullamco laboris nisi ut aliquip ex ea commodo
                          consequat.
 \item[Shrtlbl] Duis aute irure dolor in reprehenderit in voluptate velit esse
                cillum dolore eu fugiat nulla pariatur.
\end{DESCRIPTION}

\end{document}

代码通过重置每个列表的相关设置(\item而不是仅在列表的开头重置)来工作。

答案2

普通版本可能会有所帮助,也可能没有帮助:

\def\tabdesc#1: #2\cr{% notice the space.
  \setbox0=\hbox{\bf#1:\enspace}% take note about the width of the label.
  \global\dimen0=\wd0% why it needs to be global, I've no clue.
  \box0\cleartabs&\vtop{% clear the tab-position after the label.
    \hsize=.5\hsize% imaginary desclistwidth.
    \advance\hsize by-\dimen0% substract the width of the label from hsize.
    \raggedright\noindent#2}% raggedright when paragraphs are narrower.
  \cr\medskip% a little skip after an entry.
}
\settabs2\columns
\+ \tabdesc Label the first: Lorem ipsum dolor sit amet, consectetur
  adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna
  aliqua.\cr
\+ \tabdesc The longest label: Ut enim ad minim veniam, quis nostrud
  exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.\cr
\+ \tabdesc Shrtlbl: Duis aute irure dolor in reprehenderit in voluptate
  velit esse cillum dolore eu fugiat nulla pariatur.\cr
\bye

代码输出

答案3

以下解决方案直接复制自LaTeX 伴侣(第二版)。这不会给你你想要的;它将每个项目与相同的边距对齐,但它可以使用:

\usepackage{calc}
\newenvironment{altDescription}[1][\quad]
  {\begin{列表}{}{
   \renewcommand\makelabel[1]{\hfil\textsf{##1}}
   \settowidth\labelwidth{\makelabel{#1}}
   \setlength\leftmargin{\labelwidth+\labelsep}}}
  {\end{列表}}

每个项目的默认缩进是\quad。通过将列表中最宽的条目作为可选参数传递\begin{altDescription},例如 ,\begin{altDescription}[The longest label]您可以将所有项目对齐,标题对齐正确的\hfil从当前位置移动到紧随其后\textsf{##1}将对齐您的标题左边

然而,作者(Mittelbach、Goosens 等,第 149 页)认为上述方法不是印刷上可接受的解决方案,因为多个列表的列表缩进各不相同可能会很不方便。因此,如果您想将项目对齐到固定宽度,您可以相应地调整\labelwidth和 ,\leftmargin例如,添加额外的长度,\setlength\leftmargin{\labelwidth+\labelsep + 2em}}}然后[Return values]在 之后作为可选参数传递\begin{altDescription}

但是,如果您仍然想要一个将每个项目与标题宽度对齐的解决方案,您可能需要一个\hangindent修复程序,但我已经尝试过了,但还是想不出来。另一种选择是修改我给出的示例。一定有某种方法可以将可选的宽度参数作为由每个标题的宽度决定的变量传递,但目前我还不知道。

答案4

您是否尝试过仅使用表格环境?只需将每个 [描述] 输入为第一列,将每个段落字段输入为第二列。

例如 \begin{tabular}{l p{5.5in}}

只是一个想法。

相关内容