每当我使用标题时(即使是像包含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
首先,不要同时加载titleps
并fancyhdr
互相攻击同一目标,即页眉和页脚。
如果省略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