以下示例允许第二段不缩进。我试图复制 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 }
行。