跨页面按字母类别拆分抄送

跨页面按字母类别拆分抄送

在信件类别中,抄送似乎不会跨分页符拆分。有什么方法可以实现这一点吗?

我在抄送中包含了地址,因此它会变得很长。如果它不跨页,就会浪费很多空间。

我们也欢迎替代方案/解决方法。

示例如下。输出占两页,第一页留有很大空白。注释掉最后两个(四个抄送中的两个)可使这封信适合一页。

\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,以禁用分页符。

由于\parcomes 的意思是“结束段落和问题\nobreak”,因此添加\penalty0after\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 就可以在垂直模式下以任何惩罚分页。所以,如果我们添加像\penalty0after这样的“中性”惩罚\nobreak,我们就会允许分页。

\penalty0和之间有什么区别\penalty\z@?如果我们处于 有效的上下文中,几乎没有区别\makeatletter。代码可以有\penalty0(但 %来掩盖行尾);使用\z@可以避免对是否保护行尾产生任何疑问。

相关内容