使用标题在文本中添加随机空白行

使用标题在文本中添加随机空白行

每当我使用标题时(即使是像包含fancyhdr包这样简单的事情,而不设置任何内容),我的文档中就会开始出现随机的空白行,似乎是在占据整个页面宽度的行之后。以下是一个例子:

\documentclass[oneside]{book}

\usepackage[left=2in, right=2in]{geometry}
\usepackage{titlesec, titleps, fancyhdr}

\setcounter{secnumdepth}{-1}
\titleformat{\section}[runin]{\normalfont\bfseries}{\thesection}{}{}
\titlespacing*{\section}{0pt}{0.5ex plus .1ex minus .2ex}{1ex}

\begin{document}
\section{thing} this is an example of a line that is longer than the page width and does not cause any issues
\section{thing 2} this line is close to the page width and creates an extra blank line
\section{thing 3} this line is shorter than the page width
\end{document}

在此处输入图片描述

但是,如果我添加一个\usepackage{fancyhdr},它看起来会像这样:

在此处输入图片描述

我该如何去掉事物 2 和事物 3 之间的那条多余的线?

答案1

首先,不要同时加载titlepsfancyhdr互相攻击同一目标,即页眉和页脚。

如果省略titleps,则输出将符合预期:

\documentclass[oneside]{book}

\usepackage[left=2in, right=2in]{geometry}
\usepackage{titlesec, fancyhdr}

\setcounter{secnumdepth}{-1}
\titleformat{\section}[runin]{\normalfont\bfseries}{\thesection}{}{}
\titlespacing*{\section}{0pt}{0.5ex plus .1ex minus .2ex}{1ex}

\begin{document}
\section{thing} this is an example of a line that is longer than the page width and does not cause any issues
\section{thing 2} this line is close to the page width and creates an extra blank line
\section{thing 3} this line is shorter than the page width
\end{document}

在此处输入图片描述

如果你保留titleps,你会得到

\documentclass[oneside]{book}

\usepackage[left=2in, right=2in]{geometry}
\usepackage{titlesec, titleps}

\setcounter{secnumdepth}{-1}
\titleformat{\section}[runin]{\normalfont\bfseries}{\thesection}{}{}
\titlespacing*{\section}{0pt}{0.5ex plus .1ex minus .2ex}{1ex}

\begin{document}
\section{thing} this is an example of a line that is longer than the page width and does not cause any issues
\section{thing 2} this line is close to the page width and creates an extra blank line
\section{thing 3} this line is shorter than the page width
\end{document}

在此处输入图片描述

在这种情况下,必须配置标题,因为titleps其默认值与不同fancyhdr

无论如何,我不会像你一样打包输入:这会变得难以阅读和维护。

wipet 所做的分析是准确的;然而我的例子表明不是LaTeX 错误,但软件包之间存在冲突。无论如何,问题可能出现在titlesec和之间的交互中titleps。如果您确实喜欢这样打包输入,请添加

\AddToHook{cmd/section/before}{\par}

问题就会消失。

答案2

您刚刚创建了一个示例基础,说明如何通过添加额外的空白行来删除额外的空白行!:-)

\documentclass[oneside]{book}

\usepackage[left=2in, right=2in]{geometry}
\usepackage{titlesec, titleps, fancyhdr}

\setcounter{secnumdepth}{-1}
\titleformat{\section}[runin]{\normalfont\bfseries}{\thesection}{}{}
\titlespacing*{\section}{0pt}{0.5ex plus .1ex minus .2ex}{1ex}

\begin{document}
\section{thing} this is an example of a line that is longer than the page width and does not cause any issues
\section{thing 2} this line is close to the page width and creates an extra blank line

\section{thing 3} this line is shorter than the page width
\end{document}

在此处输入图片描述

说实话,\par在部分末尾添加也会产生同样的效果。

答案3

我描述了问题的原因。

源文件中每行的末尾通常由 TeX 的标记处理器转换为空格。因此,代码片段如下:

... end of line
\par

被转换为“end” “space” “of” “space” “line” “space” “\par”。更典型的情况是,取而代之的是空行,\par而 token 处理器会将空行转换为\par

如果例程开始时水平行的最后一项是空格,TeX 会将其删除\par。然后这些例程会将水平列表拆分为结果段落的行。这是正常行为。因此,段落末尾的空格通常会被删除。

但在您的示例中,\section宏首先插入\marks水平列表,然后\par在此之后进行处理。因此,水平列表以“空格”标记结束,并且\par不会从行尾删除最后一个空格,因为水平列表中的最后一项不是空格。提到的空格现在是断行的对象,段落有两行,因为水平列表在此空格处断开。第一行包括所有可见材料,第二行包括\marks

您可以看到这是正确的。将\tracingall第 12 行末尾的单词“line”插入到您的代码中,即

... and creates an extra blank \tracingall line

然后查看日志文件。你可以在第 142 行看到:

{the letter l}
{blank space  }

这表示l插入一个以 开头的单词,并且还插入空格(从行尾开始)。然后您可以在第 2013 行看到:

{\marks}

因此\marks将 插入到水平列表中。然后您可以在第 3210 行看到:

{\par}

{\par}这是日志文件中的第一个。因此,\par在插入后,例程就开始了\marks

此外,您可以看到日志文件非常混乱,因为 LaTeX 使用了 expl3 宏,并且无法读取此类宏的完整跟踪。日志表明\marks之前已处理过\par,这是 LaTeX 错误。正确的宏应该先处理,然后在垂直模式下\section处理(或在下一个水平模式下处理,并带有章节标题)。\par\marks

相关内容