我正在尝试在我的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
和其他。谢谢你的帮助。
答案 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结束您的环境可以帮助您