LaTeX 列表有优点也有缺点。在左右边距和垂直间距方面,它们使生活变得简单得多。但它们确实有怪癖。
在以下 MWE 中,我有两个简单的列表环境:lista
和listb
。我希望lista
有缩进的段落。和listb
没有缩进的段落。除非listb
是中的第一个段落,否则设置工作正常lista
。在这种情况下,由于中的设置,listb
以缩进开始。\itemindent
lista
无论是第一段还是后续段落,我必须修改哪些选项lista
和/或listb
获得一致的行为listb
?lista
到目前为止我能想到的最好的办法是在环境参数#2
中添加类似的内容:\list
listb
\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
您不在段落中,然后使用\noindent
before强制水平模式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
)。但我不认为这会是个问题。