特定环境后自动 \noindent 的可靠代码?

特定环境后自动 \noindent 的可靠代码?

这个问题导致了一个新的方案的出现:
noindentafter

在许多环境中,我永远不想用缩进的段落来跟进。,,,,等等itemize。我知道有些人enumeratetheoremdefinition思考这不是好的风格。但这是个人喜好。这些环境对我来说基本上总是结束一个段落,所以对我来说不需要视觉线索。

我发现了几个类似的问题,但没有一个能满足我的需要:

第三个实际上是最有用的,但似乎不太可靠,无法修补现有环境。它似乎无法在我的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}

在此处输入图片描述

相关内容