这个问题导致了一个新的方案的出现:
noindentafter
在许多环境中,我永远不想用缩进的段落来跟进。,,,,等等itemize
。我知道有些人enumerate
theorem
definition
思考这不是好的风格。但这是个人喜好。这些环境对我来说基本上总是结束一个段落,所以对我来说不需要视觉线索。
我发现了几个类似的问题,但没有一个能满足我的需要:
第三个实际上是最有用的,但似乎不太可靠,无法修补现有环境。它似乎无法在我的memoir
文档中工作。
需要明确的是,我并不想删除实际的段落分隔符。这是一个语义概念。我只是想修补文档样式,以便遵循某些环境的段落保持不缩进。
我尝试了以下两种“解决方案”(用于etoolbox
修补):
\newcommand*{\noindentnext}{\everypar{{\setbox\z@\lastbox}\everypar{}}}
\newcommand*{\NoIndentAfterEnv}[1]{\AfterEndEnvironment{#1}{\noindentnext}}
\newcommand*{\NoIndentAfterCmd}[1]{\apptocmd{#1}{\noindentnext}{}{}}
\NoIndentAfterEnv{itemize}
\NoIndentAfterEnv{theorem}
...
这篇文章大致基于上面列表中的第三篇文章。它有时有效。有时什么也不做。我无法预测它什么时候会失败。第二篇:
\let\old@par\par
\newcommand*{\noindentnextpar}{\def\par{\let\par\old@par\par\noindent}}
\newcommand*{\NoParIndentAfterEnv}[1]{\AfterEndEnvironment{#1}{\noindentnextpar}}
\newcommand*{\NoParIndentAfterCmd}[1]{\apptocmd{#1}{\noindentnextpar}{}{}}
我自己发明了这个。当修补的环境不是后面跟着一个段落。在其他情况下,它也莫名其妙地失败了。
一劳永逸地,我希望有一个可靠的方法来做到这一点。
为了清楚起见,让我举一个例子来说明我需要什么:
\NoIndentAfterEnv{itemize}
\begin{itemize}
\item ...
\end{itemize}
This starts a new paragraph. Note the empty line. But it should not be indented.
But this paragraph \emph{should} be indented.
答案1
\@afterindentfalse\@afterheading
您可以通过在环境结束后附加内容,让以下段落相信它遵循没有缩进的标题。包etoolbox
提供了方便的\AfterEndEnvironment
,使这项任务变得简单。但\@afterheading
也暂时设置\clubpenalty
为\@M
(10000)。如果您在修补环境后不想要这个,可以插入一个改编版本\@afterheading
。
\documentclass{article}
% environment hooks and patching:
\usepackage{etoolbox}
\makeatletter
% uncomment the following if you don't want \clubpenalty\@M ...
% \let\nearly@afterheading\@afterheading
% \patchcmd\nearly@afterheading
% {\@M}% original temporary setting for \clubpenalty replaced by ...
% {\@clubpenalty}% ... or whichever value you deem right
% {}{}
% ... and use \nearly@afterheading instead of \@afterheading here:
\newcommand*\NoIndentAfterEnv[1]{%
\AfterEndEnvironment{#1}{\par\@afterindentfalse\@afterheading}}
\makeatother
\NoIndentAfterEnv{itemize}
% treat other environments you want to patch accordingly
% dummy text:
\usepackage{lipsum}
\begin{document}
\lipsum[1]
\begin{itemize}
\item foo
\item bar
\end{itemize}
\lipsum[1-2]
\end{document}
答案2
无条件删除列表环境后的缩进的正确方法(请注意,引号和定理也基于list
)似乎是更改的定义\@doendpe
,具体来说,删除以下代码:“\par
被重新定义为恢复\everypar
”(来源2e)。 看\@doendpe 到底起什么作用?了解详情。
\documentclass{article}
\newtheorem{theorem}{Theorem}
\newcommand*{\sometext}{Hello, here is some text without a meaning. This
text should show, how a printed text will look like at this place.
If you read this text, you will get no information.}
\makeatletter
\def\@doendpe{%
\@endpetrue
% \def\par{% REMOVED
% \@restorepar% REMOVED
% \everypar{}% REMOVED
% \par% REMOVED
% \@endpefalse% REMOVED
% }% REMOVED
\everypar{%
{\setbox\z@\lastbox}%
\everypar{}%
\@endpefalse
}%
}
\makeatother
\begin{document}
\sometext
\begin{itemize}
\item \sometext
\end{itemize}
\sometext
\begin{quote}
\sometext
\end{quote}
\sometext
\begin{theorem}
\sometext
\end{theorem}
\sometext
\end{document}
如果您只想在特定的基于列表(!)的环境之后删除缩进,您可以合并一个新的\noindentafter
开关\@doendpe
并使用etoolbox
'\BeforeBeginEnvironment
将开关设置为针对相应环境的 true。
\documentclass{article}
\newcommand*{\sometext}{Hello, here is some text without a meaning. This
text should show, how a printed text will look like at this place.
If you read this text, you will get no information.}
\newif\ifnoindentafter
\noindentafterfalse
\makeatletter
\def\@doendpe{%
\@endpetrue
\ifnoindentafter% ADDED
\else% ADDED
\def\par{%
\@restorepar
\everypar{}
\par
\@endpefalse
\noindentafterfalse% ADDED
}%
\fi% ADDED
\everypar{%
{\setbox\z@\lastbox}%
\everypar{}%
\@endpefalse
\noindentafterfalse% ADDED
}%
}
\makeatother
\usepackage{etoolbox}
\BeforeBeginEnvironment{itemize}{\noindentaftertrue}
\begin{document}
\sometext
\begin{itemize}
\item \sometext
\end{itemize}
\sometext
\begin{enumerate}
\item \sometext
\end{enumerate}
\sometext
\end{document}