在LaTeX环境中抑制缩进

时间:2010-04-29 15:44:11

标签: latex indentation latex-environment

我正在尝试在我的LaTeX文档中创建一个新环境,其中环境之后的下一段中的缩进被抑制。

我被告知(TeXbook和LaTeX来源)通过将\everypar设置为{\setbox0\lastbox},TeX排版机将在下一段的开头执行此操作,从而删除缩进:

\everypar{\setbox0\lastbox}

所以这就是我所做的,但没有效果(以下段落仍然缩进):

\newenvironment{example}
  {\begin{list}
     {}
     {\setlength\leftmargin{2em}}}
  {\end{list}\everypar{\setbox0\lastbox}}

我已经研究过LaTeX的内部结构以及我可以管理的内容。似乎\end例程在某些时候显示\endgroup\par,这可能是LaTeX忽略我的\everypar设置的原因。 \global也无济于事。我知道\noindent但想要自动执行此操作。

示例文档片段:

This is paragraph text. This is paragraph text, too.

\begin{example}
  \item This is the first item in the list.
  \item This is the second item in the list.
\end{example}

This is more paragraph text. I don't want this indented, please.

感兴趣的内部例程和开关似乎是\@endpetrue\@endparenv和其他。谢谢你的帮助。

9 个答案:

答案 0 :(得分:3)

如果不重新定义\end,我无法工作,但我当然不是专家。

以下是非常hacky,但在我的有限测试中工作。当然这会干扰嵌套环境(如果遇到问题,您应该能够重新定义\begin以恢复旧的\end。)

\newenvironment{example}{%
  \bgroup
  \let\oldend=\end
  \def\end##1{\oldend{##1}\csname @afterindentfalse\endcsname
                          \csname @afterheading\endcsname}
  \begin{list}{}
    {\setlength\leftmargin{2em}}
  }{%
  \end{list}
  \egroup
}

答案 1 :(得分:2)

你不能通过环境和下一行之间没有空行来避免这种情况吗?

This is paragraph text. This is paragraph text, too.

\begin{example}
  \item This is the first item in the list.
  \item This is the second item in the list.
\end{example}
% (No blank line)
This is more paragraph text. I don't want this indented, please.

答案 2 :(得分:2)

这对我来说很简单:

\makeatletter
\newenvironment{example}{%
  \bgroup
    \list{}{}
}{%
    \endlist
    \@afterindentfalse
    \@afterheading
  \egroup
}
\makeatother

但是,在调用第一个\ section(或者在“book”和“report”类的情况下为\ chapter)之前它不起作用。我不知道为什么。

答案 3 :(得分:1)

我尝试了Ivan's answer,但它对我不起作用。但我确实让它运转了!这是我做的:

\makeatletter
\renewenvironment{quotation}{% 
\bgroup%
\let\oldend=\end%
\def\end##1{\oldend{##1}\csname @afterindentfalse\endcsname%
                        \csname @afterheading\endcsname}%
\list{}{\listparindent 1.5em%
\itemindent    \listparindent%
\leftmargin 1.5em%               This controls the size of the indentation
\rightmargin   \leftmargin
\parsep        \z@ \@plus\p@}%      This line reduces inter-paragraph space to normal values.
\item\relax%
}{%
\endlist%%
\egroup%
}
\makeatother

这样做的好处是它可以很好地排版你的blockquotes,并在blockquote之后删除段落中的缩进。

答案 4 :(得分:1)

您可以在不重新定义\end

的情况下执行此操作
\makeatletter
\newenvironment{example}
   {\begin{list}
      {}
      {\setlength\leftmargin{2em}}}
   {\end{list}%
    \def\if@endpe{%
      \@doendpe
      \let\par\@@par
      \iffalse}}
\makeatother

说明

在展开\end之后,

\everypar更改了\endexample 。为了使事情变得更加复杂,设置\par以恢复\everypar{}。显然\@doendpe是确保如果段落在环境之后继续没有缩进,但是如果在环境之后存在\par(或空行)则恢复正常行为。

您可能希望避免更改\end,因为它必须在环境开始时更改,因此可能会干扰嵌套环境。幸运的是,\end的定义包含\expandafter\endgroup\if@endpe。我们可以使用\if@endpe作为钩子将我们的代码注入外部作用域。 \endgroup \if@endpe自动恢复后。

答案 5 :(得分:0)

在定义的末尾加上\ @afterindentfalse \ @afterheading。

答案 6 :(得分:0)

我遇到了同样的问题。我刚用过这个:

\noindent \newenvironment

答案 7 :(得分:-1)

除非您确切知道自己在做什么,否则不应该使用\everypar令牌列表。使用

\setlength{\parindent}{0pt}

摆脱整个文件中的缩进。

答案 8 :(得分:-2)

使用\ noindent结束您的环境可以帮助您