空行后不缩进

空行后不缩进

可以使用 KOMA 文档类选项选择性地抑制\noindent或完全抑制缩进parindent=full。书籍(小说)通常使用段落来构造,缩进是 LaTeX 的默认设置。此外,较大的更改会用一个空行表示,后面跟着一个非缩进的段落,就像某一节中的第一个段落一样。

是否有可能在 LaTeX 文档中插入这样的换行符或自动省略空行后的缩进?

答案1

首先是 Werner 解决方案的一个变体,它允许在之后留空行\changebreak

\documentclass{scrreprt}
\usepackage{lipsum}

\makeatletter
\newcommand*{\changebreak}{%
  \par
  \vspace{\baselineskip}%
  \changebreak@skippar
}
\def\changebreak@skippar{%
  \@ifnextchar\par{%
    \expandafter\changebreak@skippar\@gobble
  }{%
    \noindent
    \ignorespaces
  }%
}
\makeatother

\begin{document}
\lipsum[1-3]
\changebreak
\lipsum[4-6]

\changebreak

\lipsum[7-9]
\end{document}

如果中间有某些东西,如宏定义、赋值(但注释不会干扰),空行检测很快就会失败。

LaTeX 的节标题也存在同样的问题。它使用宏\@afterheading\everypar获取下一个段落的开头,并使用技巧取消段落缩进\lastbox,因为段落缩进设置为框。\@afterindentfalse告诉宏\@afterheading不需要下一个段落的缩进。另一个任务是\@afterheading将起始段落的前两行保持在一起,这里也欢迎。

\documentclass{scrreprt}
\usepackage{lipsum}

\makeatletter
\newcommand*{\changebreak}{%
  \par
  \vspace{\baselineskip}%
  \@afterindentfalse
  \@afterheading
}
\makeatother

\begin{document}
\lipsum[1-2]
\changebreak
\lipsum[3-4]

\changebreak

\lipsum[5-6]
\changebreak
\typeout{Last changebreak}

\lipsum[7-8]
\end{document}

对于应该避免分页符碰到分页符的情况(可能不太可能),以下操作可防止在分页符处分页。如果前一段尚未完成,也可以禁止最后一行。LaTeX 会\@afterheading尝试对接下来的两行进行同样的操作。

\documentclass{scrreprt}
\usepackage[nopar]{lipsum}
% Option `nopar' suppresses the
% paragraph ends in lipsum paragraphs

\makeatletter
\newcount\chgbrk@widowpenalty
\newcommand*{\changebreak}{%
  % If we are happy and the previous paragraph
  % is not yet finished, we can change
  % the widowpenalty to prevent a previous
  % lonely line.
  \chgbrk@widowpenalty\widowpenalty
  \widowpenalty\@M
  \par
  \widowpenalty\chgbrk@widowpenalty
  \nobreak
  \vspace{\baselineskip}%
  \@afterindentfalse
  \@afterheading
}
\makeatother

%\setlength{\textheight}{\baselineskip}% stress test

\begin{document}
\lipsum[1]

\lipsum[2]
\changebreak
\lipsum[3]

\lipsum[4]

\changebreak

\lipsum[5]

\lipsum[6]
\end{document}

答案2

我建议定义一个命令来执行此操作,原因有二:

  1. 这可以以临时的方式进行;并且
  2. 无论如何,LaTeX 都会将空行解释为段落分隔符,因此构建某些东西(比如说)来计算空行的数量以产生“更改分隔符”可能会很困难。

我的建议是\changebreak类似于\bigskip

在此处输入图片描述

\documentclass{scrreprt}
\usepackage{lipsum}% http://ctan.org/pkg/lipsum
\def\changebreak{\par\vspace{\baselineskip}\noindent}
\showthe\baselineskip
\begin{document}
\lipsum[1-3]
\changebreak
\lipsum[4-10]
\end{document}

传统的\bigskip插入\bigskipamount固定在。由于您需要一个空行,因此12pt plus 4pt minus 4pt我已将其修改为使用。会自动插入以删除后续段落中的缩进。\baselineskip\noindent

答案3

该类memoir(当然)提供了多种“匿名”分隔符。最简单的是\plainbreak{<num>}产生一个间隙,<num> * \baselineskip然后抑制下一行的缩进(而带星号的版本缩进下一行:

\newcommand{\fancybreak}{\@ifstar{\@sfbreak}{\@fbreak}}
\newcommand{\@fbreak}[1]{\par
  \penalty -100
  \noindent\parbox{\linewidth}{\centering #1}%%\null
  \par
  \@afterindentfalse
  \@afterheading}
\newcommand{\@sfbreak}[1]{\par
  \penalty -100
  \noindent\parbox{\linewidth}{\centering #1}%%\null
\par                                                 
  \@afterindenttrue
  \@afterheading}

还有其他几个相关命令,其中一些命令会打印任意符号或文本(\fancybreak),其他命令会根据它们出现在页面顶部还是底部给出简单或花哨的分隔符(\plainfancybreak\pfbreak)。如果您有兴趣,请查阅手册;请注意,如果您出于某种原因无法使用memoir这些命令,则可以轻松“窃取”这些命令的代码。(如上例所示,尽管我确实删除了一些注释。)memoir.clsmemoir

相关内容