itemindent 和嵌套列表

itemindent 和嵌套列表

LaTeX 列表有优点也有缺点。在左右边距和垂直间距方面,它们使生活变得简单得多。但它们确实有怪癖。

在以下 MWE 中,我有两个简单的列表环境:listalistb。我希望lista有缩进的段落。和listb没有缩进的段落。除非listb是中的第一个段落,否则设置工作正常lista。在这种情况下,由于中的设置,listb以缩进开始。\itemindentlista

无论是第一段还是后续段落,我必须修改哪些选项lista和/或listb获得一致的行为listblista

到目前为止我能想到的最好的办法是在环境参数#2中添加类似的内容:\listlistb

\if@newlist
  \if@minipagefalse
    \leavevmode
    \vspace{\glueexpr -\baselineskip - \parskip}%
  \fi
  \topsep 0pt
\else
  \topsep \listbdefaulttopsep
\fi

但我觉得它有点笨重,而且还需要在列表结束之前重新调整\topsep。我还担心这个代码不够健壮,会在太多意外情况下失败。

平均能量损失

\documentclass{article}
\usepackage{lipsum}
\newenvironment{lista}{%
  \list{}{%
    \topsep 0pt
    \partopsep 0pt
    \leftmargin 0pt
    \rightmargin 0pt
    \itemindent 1.333em
    \listparindent 1.333em
    \labelsep 0pt
    \parsep 0pt
  }%
  \item\relax
}{%
  \endlist
}
\newenvironment{listb}{%
  \list{}{%
    \topsep 0pt
    \partopsep 0pt
    \leftmargin 3em
    \rightmargin 3em
    \itemindent 0pt
    \listparindent 0pt
    \labelsep 0pt
    \parsep 0pt
  }%
  \item\relax
}{%
  \endlist
}
\begin{document}
\begin{lista}
  \textbf{Keep first line indent here.}
  \lipsum[1]
  \begin{listb}
    \lipsum[2]
  \end{listb}
\end{lista}

\bigskip

\begin{lista}
  \begin{listb}
    \textbf{Remove first line indent here.}
    \lipsum[2]
  \end{listb}
\end{lista}
\end{document}

输出

输出

答案1

您可以使用 确认\ifvmode您不在段落中,然后使用\noindentbefore强制水平模式listb。但这会产生垂直模式\baselineskip,应将其取消。

\ifvmode\noindent\vspace{-\baselineskip}\fi

完整示例:

\documentclass{article}
\usepackage{lipsum}
\newenvironment{lista}{%
  \list{}{%
    \topsep 0pt
    \partopsep 0pt
    \leftmargin 0pt
    \rightmargin 0pt
    \itemindent 1.333em
    \listparindent 1.333em
    \labelsep 0pt
    \parsep 0pt
  }%
  \item\relax
}{%
  \endlist
}
\newenvironment{listb}{%
  \ifvmode\noindent\vspace{-\baselineskip}\fi
  \list{}{%
    \topsep 0pt
    \partopsep 0pt
    \leftmargin 3em
    \rightmargin 3em
    \itemindent 0pt
    \listparindent 0pt
    \labelsep 0pt
    \parsep 0pt
  }%
  \item\relax
}{%
  \endlist
}
\begin{document}
\begin{lista}
  \textbf{Keep first line indent here.}
  \lipsum[1]
  \begin{listb}
    \lipsum[2]
  \end{listb}
\end{lista}

\bigskip

\begin{lista}
  \begin{listb}
    \textbf{Remove first line indent here.}
    \lipsum[2]
  \end{listb}
\end{lista}
\end{document}

在此处输入图片描述

请注意,\noindent\vspace{-\baselineskip}现在在垂直模式下创建的每个内容的开头都插入了lisb,即使listb它不是中的第一个材料lista(例如,如果您在之前添加换行符lisb)。但我不认为这会是个问题。

相关内容