我使用常见的方法,即对新段落进行缩进,而标题后面不进行缩进。我有一个“信息框”环境,定义如下:
\newenvironment{sectionbox}[2][]{\begin{shaded}\refstepcounter{sectionbox}\par\medski\noindent%
\textbf{Box~\thesectionbox #1: #2
\vspace{0.1cm} \hrule \vspace{0.1cm}}\rmfamily}
{\medskip \end{shaded}}
问题是我不想在这些框的开头有缩进——它们有一个标题,因此它们不应该有缩进......
我尝试过\noindent
但那不是正确的方法因为它只有直接放在不缩进的文本之前才有效并且环境的用户可能会以空行开始......
谷歌带我这一页但是他们的建议“ \@afterindentfalse
”显然不是我能使用的,因为我处于错误的模式,正如 LaTeX 向我指出的那样:
You can't use `\spacefactor' in internal vertical mode.
那么,我可以使用什么来解决这个问题?
答案1
如何使用\noindent\ignorespaces
?请参阅http://en.wikibooks.org/wiki/LaTeX/Customizing_LaTeX#Extra_space
如果您使用以下
\newenvironment{myEnv}%
{\noindent\ignorespaces\endlinechar=-1}%
{\endlinechar=13}
它将解决首行缩进的问题。但是环境中的所有行尾字符都将被吞噬,因此您无法以通常的方式在环境中创建段落。
另一种选择是使用一个简单的列表(从amsthm
证明环境中窃取)
\newenvironment{myEnv}%
{\noindent\trivlist\item\ignorespaces}%
{\endtrivlist}
我认为,只要它与环境配合良好,它应该能满足您shaded
的要求。当然,这两种方法是否合适取决于您的需求。
答案2
您引用的 stackoverflow 答案不是建议使用 吗\@afterindentfalse \@afterheading
?仅使用前者是行不通的。当为 false时,\@afterheading
使用\everypar
token 寄存器删除第一段的缩进。\@if@afterindent
(我本来想将此作为对您对 Ulrike 的回答的评论的评论,但我还没有得到评论的代表。)
答案3
\@afterindentfalse
包含@
,因此您应该@
在定义前写一个字母。\makeatletter\newenvironment ...