我在 XeLaTeX 中创建了文档,文档末尾有签名行。有时这些签名会单独出现在页面上,即没有前面的内容。我希望避免出现这些“寡妇”签名,特别是签名前面至少有两行文本(即,可以识别签名可能附加到的文档的内容)。
文件的内容和签名的数量是可变的,所以我希望有一个尽可能自动化的解决方案。
下面是使用该类的文档示例memoir
:
\documentclass{memoir}
\usepackage{lipsum}
% signature
% ~~~~~~~~~
% _____________
% *Name* (1)
% Address (2)
%
\newcommand{\signature}[2]{%
\bigskip\par{}%
\begin{SingleSpace}%
\begin{tabular}{ p{6cm} p{8cm} }
& \rule{6cm}{0.5pt}\newline{}%
\textbf{#1}\\%
& #2 %
\end{tabular}%
\end{SingleSpace}%
\medskip%
}
\begin{document}
% some arbitrary number of lipsum
\lipsum[1-5]
% an arbitrary number of signatures
\signature{John Doe}{42 Wallaby Way, Sydney}
\signature{Jane Smith}{Bates Motel, California}
\end{document}
我考虑的是使用以下方法的组合来自动实现最佳结果(只要它们是可行的):
使页面尺寸稍微大一些,特别是当只有一页时;
增加段落之间的间距;
防止在签名列表之前分页。
我相信#1可以通过使用来实现\sloppybottom
。
我不确定如何实现#2,或者它是否在审美上可以接受。
\noprelistbreak
也许#3可以通过或来实现\nopagebreak
- 尽管我可能必须将签名转换为先前的列表环境。
我对这个有趣问题的想法非常感兴趣。
答案1
在签名代码真正开始之前,段落文本中就会形成寡妇线,因此您需要在该级别阻止它们(我只是在这里将 widowpenalty 设置为无限大)签名代码发出了过满框警告所以我修改了它一点,与问题无关。
\documentclass{memoir}
\usepackage{lipsum}
% signature
% ~~~~~~~~~
% _____________
% *Name* (1)
% Address (2)
%
\newcommand{\signature}[2]{%
\par\nobreak\bigskip
\begin{SingleSpace}%
\mbox{}\hfill\begin{tabular}{p{8cm} }
\rule{8cm}{0.5pt}\newline{}%
\textbf{#1}\\%
#2 %
\end{tabular}%
\end{SingleSpace}%
\medskip%
}
\begin{document}
\raggedbottom
% some arbitrary number of lipsum
\widowpenalty10000
\lipsum[1-5]
% an arbitrary number of signatures
\signature{John Doe}{42 Wallaby Way, Sydney}
\signature{Jane Smith}{Bates Motel, California}
\end{document}