在信件类别中,抄送似乎不会跨分页符拆分。有什么方法可以实现这一点吗?
我在抄送中包含了地址,因此它会变得很长。如果它不跨页,就会浪费很多空间。
我们也欢迎替代方案/解决方法。
示例如下。输出占两页,第一页留有很大空白。注释掉最后两个(四个抄送中的两个)可使这封信适合一页。
\documentclass{letter}
\signature{(Someone)}
\address{Street \\ City \\ Country}
\newcommand\drd[1]{#1,\\
The Little House in the Big Garden,\\
Oxenthorpe Road,\\
Puddleby on the Marsh,\\
Slopshire\\
England,\\
UK}
\begin{document}
\begin{letter}{\drd{Dr. John Dolittle}}
\opening{Dear Dr. Dolittle,}
\dots
\closing{Sincerely,}
\cc{\drd{Jip}}
\cc{\drd{Gub-Gub}}
\cc{\drd{Dab-Dab}}
\cc{\drd{Polynesia}}
\end{letter}
\end{document}
注意:感谢@egreg 提供的解决方案。此解决方法对于 来说不是必需的scrlttr2
,它可以很好地处理 CC 中的中断。
答案1
如果您有多个\cc
命令并且想要允许它们之间中断,则必须覆盖\stopbreaks
发出的声明\closing
,以禁用分页符。
由于\par
comes 的意思是“结束段落和问题\nobreak
”,因此添加\penalty0
after\par
是一个很好的补救措施。
\documentclass{letter}
\makeatletter
\renewcommand*{\cc}[1]{%
\par\noindent
\parbox[t]{\textwidth}{%
\@hangfrom{\normalfont\ccname: }%
\ignorespaces #1\strut}\par\penalty\z@
}
\makeatother
\signature{(Someone)}
\address{Street \\ City \\ Country}
\newcommand\drd[1]{#1,\\
The Little House in the Big Garden,\\
Oxenthorpe Road,\\
Puddleby on the Marsh,\\
Slopshire\\
England,\\
UK}
\begin{document}
\begin{letter}{\drd{Dr. John Dolittle}}
\opening{Dear Dr. Dolittle,}
\dots
\closing{Sincerely,}
\cc{\drd{Jip}}
\cc{\drd{Gub-Gub}}
\cc{\drd{Dab-Dab}}
\cc{\drd{Polynesia}}
\end{letter}
\end{document}
解释
该\closing
命令定义为
\newcommand{\closing}[1]{\par\nobreak\vspace{\parskip}%
\stopbreaks
<...irrelevant code omitted...>
\par}
哪里\stopbreaks
\newcommand*{\stopbreaks}{%
\interlinepenalty\@M
\def\par{\@@par\nobreak}%
\let\\\@nobreakcr
\let\vspace\@nobreakvspace}
其基本含义是“从此处开始不跨页换行”。 的定义\cc
与上面的重新定义类似,只是缺少\penalty\z@
,所以也\par
缺少\@@par\nobreak
(其中\@@par
是原语\par
)并且不允许分页。 该命令\nobreak
是 的简写\penalty10000
。
但是,只要值小于 10000,TeX 就可以在垂直模式下以任何惩罚分页。所以,如果我们添加像\penalty0
after这样的“中性”惩罚\nobreak
,我们就会允许分页。
\penalty0
和之间有什么区别\penalty\z@
?如果我们处于 有效的上下文中,几乎没有区别\makeatletter
。代码可以有\penalty0
(但不 %
来掩盖行尾);使用\z@
可以避免对是否保护行尾产生任何疑问。