## 编译环境 操作系统 * [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 回答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} ```

你的回答

请登录后回答

你的回答将会帮助更多人,请务必认真回答问题。