在自定义列表环境中枚举时控制 parindent

在自定义列表环境中枚举时控制 parindent

我正在尝试控制自定义列表环境中枚举列表中段落的缩进。我发现更改内部列表中的 \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包,另一方面又通过listLaTeX 环境定义自己的列表。该enumitem包不知道您的新列表,因此会感到困惑。

基本上发生的情况是以下代码\enit@preset做出了错误的选择:

   \ifnum\@listdepth=\@ne
     \enit@outerparindent\parindent
   \else
     \parindent\enit@outerparindent
   \fi

这段代码的思路是,当我们进入第一级列表时, 保存外部\parindent值,如果我们进入嵌套列表,则重用保存的值。现在不幸的是,您的新列表不知道这一点,所以什么都不会保存。但如果输入了,它实际上已经处于第 2 级,因此获取当前值,当然,当前值仍为零。\enit@outerparindentenumerate\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

相关内容