如何不缩进 LaTeX 中页面的第一行?

如何不缩进 LaTeX 中页面的第一行?

如果页面的第一行恰好是段落的第一行,我不希望缩进它(就像它是章节的第一行一样)。有没有办法自动执行此操作?我不想使用\noindent命令,因为如果此行移动到其他地方,我希望缩进它。

在此先谢谢您的帮助!

答案1

首先,我认为这不是一个好主意。一个问题是,如果前一个段落以整行结束,则没有任何线索表明存在段落中断(我想您可以通过设置\parfillskip=3em plus1fil以确保最后一行不填满来避免这种情况)。

无论如何,回答你的问题,这将非常棘手,因为 TeX 在查看分页符之前会生成段落,因此当它知道第一行从新页面开始时,已经太晚了。你需要在每个段落的开头将一些内容写入辅助文件(使用\everypar),你可以在后续运行时读取这些内容以确定此段落是否开始新页面,如果是,则删除缩进。不幸的是,新的换行符现在可能会改变分页符,你可能需要反复重新编码,并且不能保证这个过程会收敛。

编辑:这是解决方案的核心,以表明它是可行的。第一次编译时会产生一堆错误,并且它不能\everypar以与其他软件包很好地配合的方式进行重新定义,但它展示了基本思想。

编辑 2:稍微修复了代码(以前的版本删除了页面第一段的缩进,无论它是否从页面第一行开始)

\documentclass{article}
\raggedbottom % to allow short pages
\addtolength{\topskip}{0pt plus 10pt} % to help allow short pages
\newcounter{parno}
\makeatletter
\newcommand{\newparb}[2]{\global\@namedef{mypar@b#1}{#2}}
\newcommand{\newpare}[2]{\global\@namedef{mypar@e#1}{#2}}
\newpare{0}{0}
\let\oldpar\par
\def\par{\oldpar\protected@write\@auxout{}{\string\newpare{\theparno}{\thepage}}}
\makeatother
\usepackage{lipsum} % for dummy text
\begin{document}
\interlinepenalty=1000 % just for example, to encourage paragraphs to start on new pages
\makeatletter
\everypar={%
    \stepcounter{parno}%
    \ifnum \@nameuse{mypar@b\theparno}=\@nameuse{mypar@e\@arabic{\numexpr\value{parno}-1}}%
    \else\setbox0\lastbox\fi
    \protected@write\@auxout{}{\string\newparb{\theparno}{\thepage}}%
}
\makeatother
\lipsum[1-60]% dummy text
\end{document} 

答案2

在您不想缩进的行的开头输入:

\noindent

例如:

\section{Introduction}
\noindent
This is the introduction.

答案3

ConTeXt 提供了一个\beforeeverypagebody在页面主体构建之前执行的标记列表。还有一个\aftereverypagebody在页面主体构建之后执行的标记列表;以及\beforeeveryshipout\aftereveryshipout在页面交付之前和之后执行的标记列表。

要做你想做的事,你只需要添加

\appendtoks \noindentation \to \everybeforepagebody

由于某种原因,这在第一页不起作用。但是,您只需添加一个即可\noindentation消除第一页的缩进。因此,以下内容可以满足您的要求:

\appendtoks \noindentation \to \everybeforepagebody

\setupindenting[big,yes]

\starttext \noindentation

\input knuth 

\page
\input knuth

\stoptext

相关内容