提问于:
浏览数:
2095
## 编译环境
操作系统
* [x] Windows 7/8/10
* [ ] macOS
* [ ] Linux
`若需勾选,请把[ ]改成[x]`
Tex发行版
* [x] TexLive `2020`
* [ ] MikTeX `版本号`
* [ ] CTeX
`若需勾选,请把[ ]改成[x]`
## 我的问题
在标准文档类 `article` 下,一个小节标题后至少跟有 2 行正文,代码如下:
```tex
\documentclass{article}
\usepackage{showframe}
\begin{document}
\section{Sec 1}
1\\2\\3\\4\\5\\6\\7\\8\\9\\10\\11\\12\\13\\14\\15\\16\\17\\18\\19\\20\\
21\\22\\23\\24\\25\\26\\27\\28\\29\\30\\31\\32\\33\\34\\35\\36\\37\\38
% \\39
\section{Sec2}
1\\2\\3\\4\\5
\end{document}
```
![](https://wenda.latexstudio.net/data/attach/200809/eTGgHFlR.png)
当 section 1 添加 1 行后,section 2 的标题将被挤到下一页去,即使当前页面仍排得下该标题 + 1 行正文。
```tex
\documentclass{article}
\usepackage{showframe}
\begin{document}
\section{Sec 1}
1\\2\\3\\4\\5\\6\\7\\8\\9\\10\\11\\12\\13\\14\\15\\16\\17\\18\\19\\20\\
21\\22\\23\\24\\25\\26\\27\\28\\29\\30\\31\\32\\33\\34\\35\\36\\37\\38
\\39
\section{Sec2}
1\\2\\3\\4\\5
\end{document}
```
![](https://wenda.latexstudio.net/data/attach/200809/FqVnpQbv.png)
请问这个 2 行的阈值是由哪个变量控制的?应如何调整。
2 回答
0
- `\section` 的前后间距其实是弹性的,不是固定值,你可以去看看 lshort-zh-cn 里介绍的“弹性长度”。
- 还可以看看这个《[[LaTeX 漫谈] 被无限拉伸的纵向间距,和页面纵向对齐方式](https://zhuanlan.zhihu.com/p/99672019)》
我建议就是别纠结,LaTeX 认为这么排比较美观,就随他去吧,如果要知道「为什么」、「每个长度怎么来的」,可能就要去了解底层的知识了
------------
那就不清楚了,建议去 [https://github.com/CTeX-org/forum](https://github.com/CTeX-org/forum) / [https://tex.stackexchange.com/](https://tex.stackexchange.com/) 提问
作者追问:2020-08-09 14:18
居然没显示完。
这个专栏文章和更底层的《The TeX Book》我都已经看过,可能是因为节标题命令不是 Plain TeX 的范畴,所以我未能在其中找到控制此垂直间距的变量。另外,您回答的第 1 点是不是跟我的问题有所出入。我关注的是“跟在节标题后的**正文的**最小垂直高度”,而非“节标题与其后正文**之间的**垂直高度”。
-
这个专栏文章和更底层的《The TeX Book》我都已经看过,可能是因为节标题命令不是 Plain TeX 的范畴,所以我未能在其中找到控制此垂直间距的变量。另外,您回答的第 1 点是不是跟我的问题 – zhaochongbin 2020-08-09 14:15 回复
0
我自问自答一下,经查询 `texdoc source2e` 需要修改内置命令 `\@xsect` 的定义, MWE 如下:
```tex
\documentclass{article}
\usepackage{showframe}
\makeatletter
\def\@xsect#1{%
\@tempskipa #1\relax
\ifdim \@tempskipa>\z@
\par \allowbreak% 这里将 \nobreak 改为 \allowbreak
\vskip \@tempskipa
\@afterheading
\else
\@nobreakfalse
\global\@noskipsectrue
\everypar{%
\if@noskipsec
\global\@noskipsecfalse
{\setbox\z@\lastbox}%
\clubpenalty\@M
\begingroup \@svsechd \endgroup
\unskip
\@tempskipa #1\relax
\hskip -\@tempskipa
\else
\clubpenalty \@clubpenalty
\everypar{}%
\fi}%
\fi
\ignorespaces}
\makeatother
\begin{document}
\section{Sec 1}
1\\2\\3\\4\\5\\6\\7\\8\\9\\10\\11\\12\\13\\14\\15\\16\\17\\18\\19\\20\\
21\\22\\23\\24\\25\\26\\27\\28\\29\\30\\31\\32\\33\\34\\35\\36\\37\\38
\\39
\section{Sec 2}
1\\2\\3\\4\\5
\end{document}
```
![](https://wenda.latexstudio.net/data/attach/200819/NM6StyxJ.png)
另外,如果用户使用 `titlesec` 宏包定制标题,那么需要重定义的就是该宏包内的 `\ttl@straight@ii` 命令,MWE 如下:
```tex
\documentclass{article}
\usepackage{showframe}
\usepackage{titlesec}
\makeatletter
\def\ttl@straight@ii#1#2#3#4#5#6#7{%
\ttl@assign\@tempskipa#3\relax\beforetitleunit
\@ifundefined{ttl@ps@#6}{}%
{\PackageWarning{titlesec}{Page style in straight class ignored}}%
\if@nobreak
\ttl@titlespace{\@tempskipa}%
\else
\@ifundefined{#6break}%
{\addpenalty{\@secpenalty}}%
{\csname#6break\endcsname}%
\addvspace{\@tempskipa}%
\ifdim\bottomtitlespace<\z@
\else
\begingroup
\@tempskipb\pagegoal
\@tempskipa\pagegoal
\ttl@addstretch % \relax if nobottomtitle*
\advance\@tempskipa-\bottomtitlespace\relax % not a register
\pagegoal\@tempskipa
\def\@textbottom{\vskip\z@\@plus.0001fil}%
\penalty9999
\pagegoal\@tempskipb
\endgroup
\fi
\fi
\@afterindenttrue
\ifcase#5 \@afterindentfalse\fi
\ttl@assign\@tempskipb#4\relax\aftertitleunit
\ttl@select{#6}{#1}{#2}{#7}%
\ttl@finmarks
\@ifundefined{ttlp@#6}{}{\ttlp@write{#6}}%
\if@noskipsec
\global\@nobreakfalse
\everypar{%
\if@noskipsec
\global\@noskipsecfalse
\clubpenalty\@M
\hskip-\parindent
\begingroup
\@svsechd\unskip{\hspace{\@tempskipb}}%
\endgroup
\else
\clubpenalty\@clubpenalty\everypar{}%
\fi}%
\else
\par\allowbreak% 这里将 \nobreak 改为 \allowbreak
\vspace{\@tempskipb}%
\@afterheading
\fi
\ignorespaces}
\makeatother
\begin{document}
\section{Sec 1}
1\\2\\3\\4\\5\\6\\7\\8\\9\\10\\11\\12\\13\\14\\15\\16\\17\\18\\19\\20\\
21\\22\\23\\24\\25\\26\\27\\28\\29\\30\\31\\32\\33\\34\\35\\36\\37\\38
\\39
\section{Sec 2}
1\\2\\3\\4\\5
\end{document}
```
你的回答
请登录后回答
你的回答将会帮助更多人,请务必认真回答问题。