我正在尝试控制自定义列表环境中枚举列表中段落的缩进。我发现更改内部列表中的 \parindent 不起作用。
以下是重现该问题的示例:
\documentclass{report}
\usepackage{lipsum}
\usepackage{enumitem}
\newlength{\exlabelwidth}
\settowidth{\exlabelwidth}{\small 99.99}
\newlength{\exlabelsep}
\setlength{\exlabelsep}{0.5em}
\newlength{\exsymbolwidth}
\settowidth{\exsymbolwidth}{\small\ensuremath{*}}
\newcounter{exercise}[chapter]
\renewcommand{\theexercise}{\thechapter.\arabic{exercise}}
\newcommand{\exitem}{}
\newenvironment{exercises}%
{\begin{list}{\exitem}{%
\usecounter{exercise}%
\small%
\setlength{\itemindent}{\exlabelwidth}%
\addtolength{\itemindent}{\labelsep}%
\setlength{\labelwidth}{\exlabelwidth}%
\addtolength{\labelwidth}{\exsymbolwidth}%
\addtolength{\labelwidth}{\exlabelsep}%
\setlength{\leftmargin}{0.0cm}%
\setlength{\itemsep}{0.0cm}%
\setlength{\parsep}{0.0cm}%
\setlength{\listparindent}{\parindent}%
}%
}%
{\end{list}%
}
\newcommand{\ex}[1][]{%
\renewcommand{\exitem}{%
\makebox[\exsymbolwidth][r]{#1}\hspace{\exlabelsep}%
\makebox[\exlabelwidth][r]{\bfseries\theexercise}}\item%
}
\begin{document}
\begin{exercises}
\ex
\lipsum[1]
\lipsum[2]
\ex
\lipsum[3]
\begin{enumerate}[parsep=0pt,listparindent=\parindent]
\item
\lipsum[1]
\lipsum[2]
\end{enumerate}
\end{exercises}
\end{document}
该环境基于我在 tex.stackexchange 上收到的建议。我尝试缩短代码,但出现错误。我希望能够缩进枚举环境中的第二段。现在,无论我是否使用 enumitem 包并将 parsep 设置为零,它都会从左对齐开始。
谢谢您的任何建议。
答案1
您的问题是由于您一方面使用该enumitem
包,另一方面又通过list
LaTeX 环境定义自己的列表。该enumitem
包不知道您的新列表,因此会感到困惑。
基本上发生的情况是以下代码\enit@preset
做出了错误的选择:
\ifnum\@listdepth=\@ne
\enit@outerparindent\parindent
\else
\parindent\enit@outerparindent
\fi
这段代码的思路是,当我们进入第一级列表时, 保存外部\parindent
值,如果我们进入嵌套列表,则重用保存的值。现在不幸的是,您的新列表不知道这一点,所以什么都不会保存。但如果输入了,它实际上已经处于第 2 级,因此获取当前值,当然,当前值仍为零。\enit@outerparindent
enumerate
\parindent
\enit@outerparindent
因此,您可以listparindent
在调用枚举时简单地给出明确的值,例如
\begin{enumerate}[parsep=0pt,listparindent=15pt]
或者,如果您喜欢正确修复它,您可以\enit@outerparindent
在定义中设置exercises
它是否存在(即,是否enumitem
已加载),例如,
\makeatletter
\newenvironment{exercises}%
{\begin{list}{\exitem}{%
\@ifundefined{enit@outerparindent}{}% if this command exists set it, otherwise do nothing
{\ifnum\@listdepth=\@ne
\enit@outerparindent\parindent
\else
\parindent\enit@outerparindent
\fi
}%
\usecounter{exercise}%
\small%
\setlength{\itemindent}{\exlabelwidth}%
\addtolength{\itemindent}{\labelsep}%
\setlength{\labelwidth}{\exlabelwidth}%
\addtolength{\labelwidth}{\exsymbolwidth}%
\addtolength{\labelwidth}{\exlabelsep}%
\setlength{\leftmargin}{0.0cm}%
\setlength{\itemsep}{0.0cm}%
\setlength{\parsep}{0.0cm}%
\setlength{\listparindent}{\parindent}%
}%
}%
{\end{list}}
\makeatother
因为@
你需要这些标志\makeatletter ...\makeatother
。