我正在写一个剧本,格式规则相当严格。如果页面末尾少于三行,我需要强制换页和参数的行数多于一行。
宏是:
\newcommand{\dialogue}[2]{%
\begin{center}#1\end{center}
#2
}
我想要的一个不起作用的说明:
\newcommand{\dialogue}[2]{%
\iflinesleftonpageis{<3}{%
\iflinesinargument#1is{>1}{%
\newpage}{}
}{}
}
\begin{center}#1\end{center}
#2
}
关于如何实现这一点有什么想法吗?
编辑
@DavidCarlisle 建议使用该needspace
包。通过将我的宏修改为以下内容,我能够产生正确的结果:
\newcommand{\dialogue}[2]{%
\needspace{3em}%
\begin{center}#1\end{center}%
#2
}
3em 大约代表三行文本;如果该空间不存在,它会在下一页打印宏。
非常感谢大卫!
答案1
TeX 实际上并不是按照“剩余行数”来工作的,分页(概念上)发生在稍后,在所有宏都已扩展之后,并且在所有行都已换行之后,因此首先将文本设置在一个长的无限滚动上,然后将其切成页面。
如果你指定页面可以留短,并且页面不能在居中标题后或段落第一行后断开,那么你的要求是,如果没有空间容纳至少一行以下文本,标题将移动到下一页,因此
\raggedbottom
\clubpenalty=10000
\newcommand{\dialogue}[2]{%
\begin{center}#1\end{center}%
\nopagebreak
#2%
}
如果你更愿意考虑“页面上的空间量”,这个needspace
包提供了一个命令来提供这个功能,尽管它与 TeX 的工作模型不太吻合。如果你添加类似
\needspace{3cm}
在您的标题之前,如果您(可能)距离页面底部不到 3 厘米,则会强制分页。(未经测试,因为您没有提供测试文件)