如何修改标题下方至少出现正文行数(垂直间距)的阈值

2020-08-09 12:25发布

## 编译环境 操作系统 * [x] Windows 7/8/10 * [ ] macOS * [ ] Linux `若需勾选,请把[ ]改成[x]` Tex发行版 * [x] TexLive `2...

## 编译环境 操作系统 * [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条回答
zhaochongbin
2020-08-19 15:34
我自问自答一下,经查询 `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} ```