\everypar直接使用手动方法

\everypar直接使用手动方法

以下示例允许第二段不缩进。我试图复制 section 命令的效果,该命令可以在空行后添加“noindent-effect”。对我来说,重要的是它可以被替换为单个命令。

paragraph

\section*{}

paragraph
paragraph

\noindent
paragraph

不起作用的是:

paragraph

\noindent

paragraph

从 startsection 的定义中,我不清楚这种“空行吃掉”是如何实现的。

答案1

LaTeX 分段命令使用\@afterheading宏,它执行三项操作:

  • 它说\@nobreaktrue,其定义为 ,并在 LaTeX 内核的许多地方使用,\global\let\if@nobreak\iftrue以防止分页: 在中用于、和其他地方\@esphack的末尾; 在中用于大多数文件写入操作; 在 中,这是 的基础;在和 中,等等;\label\index\vspace\protected@write\@item\item\markboth\markright

  • 如果开关为假,则在下一个段落开始时删除缩进框\if@afterindent

  • \clubpenalty通过临时设置为 10000,可以防止在下一个段落(可能是列表的第一个项目)的第一行之后出现分页符。

最后两个是通过修改来完成的\everypar,但由于这种改变只对下一段有效,因此\if@nobreak使用开关来实现“一次性”行为。

\everypar直接使用手动方法

下面的例子实现了宏中的“删除下一段落的缩进框”部分\removeNextIndent

\documentclass{article}

\makeatletter
\newtoks\my@saved@everypar

\newcommand*{\my@removeIndentBox}{{\setbox\z@\lastbox}}

\newcommand*{\removeNextIndent}{%
  \my@saved@everypar=\expandafter{\the\everypar}%
  %
  \everypar=\expandafter{%
    \expandafter\my@removeIndentBox
    \the\everypar
    \everypar=\expandafter{\the\my@saved@everypar}% restore previous \everypar
  }%
}
\makeatother

\begin{document}

% \everypar={AAA }% see below
The indentation box of the next paragraph will be removed.%
\removeNextIndent

There we are.

The indentation box is back.

\end{document}

在此处输入图片描述

如果取消注释\everypar={AAA },输出将变为:

在此处输入图片描述

使用\@afterheading

正如@DavidCarlisle提及,如果您想要所有的功能\@afterheading(如本答案开头所总结的),最简单的方法就是使用它:

\documentclass{article}

\makeatletter
\newcommand*{\removeNextIndentPreventPageBreakEtc}{%
  \par\nobreak % use \vspace here if you want
  \@afterindentfalse\@afterheading
}
\makeatother

\begin{document}

% \everypar={AAA }% see below
The indentation box of the next paragraph will be removed.%
\removeNextIndentPreventPageBreakEtc

There we are.

The indentation box is back.

\end{document}

在此处输入图片描述

请注意,与我上面的手动方法相反,\@afterheading不会尝试与现有的非空\everypar设置配合使用,因此如果您取消注释\everypar={AAA },则输出将变为:

在此处输入图片描述

使用ltpara段落挂钩

如果你正在使用最近发布了足够多的预览版本LaTeX(例如,如果您的 TeX 发行版从 2021-06-01 或更高版本进行了更新,则编译时使用pdflatex-dev)并且只想删除下一段的缩进框,则以下技术可能是最好的。它使用全新的ltpara钩子,这是添加到 LaTeX 的段落钩子(请参阅lthooks文档了解有关底层钩子框架的一般信息)。

\documentclass{article}

\newcommand*{\removeNextIndent}{%
  \AddToHookNext{para/begin}{\OmitIndent}%
}

\begin{document}

% \everypar={AAA }%
The indentation box of the next paragraph will be removed.%
\removeNextIndent

There we are.

The indentation box is back.

\end{document}

输出与我上面的“手动方法”相同,包括取消注释该\everypar={AAA }行。

相关内容