我正在使用该类memoir
,需要确保 quote 环境不会跨页拆分。在我使用该环境的其中一种情况下,它有两行,第一行位于页面底部,第二行位于下一页开头。
我环顾四周,看到一个线程\interlinepenalty
声明直接在环境中设置可以解决问题:
\newenvironment{nbquote}
{\quote\interlinepenalty=10000 }
{\endquote}
但是,我希望重新定义quote
环境而不是创建新环境。我不确定如何正确地重新定义它。在文件中memoir.dtx
,环境定义如下:
\newenvironment{quote}%
{\list{}{\rightmargin\leftmargin}%
\item[]}%
{\endlist}
\begin{document}
我在编写文档之前曾尝试过以下操作:
\renewenvironment{quote}%
{\list{}{\rightmargin\leftmargin}%
\item[]}%
{\endlist}
{\quote\interlinepenalty=10000}{\endquote}
编译时会产生以下错误:
! LaTeX Error: Missing \begin{document}.
See the LaTeX manual or LaTeX Companion for explanation.
Type H <return> for immediate help.
...
l.51 {\quote
\interlinepenalty=10000}
我并不确信正确的方法是将代码放在后面\begin{document}
,但如果我这样做,结果如下:
! LaTeX Error: Something's wrong--perhaps a missing \item.
See the LaTeX manual or LaTeX Companion for explanation.
Type H <return> for immediate help.
...
l.59 {\endquote
}
?
我不确定如何进一步调试。如能得到任何帮助我将不胜感激。
答案1
你的 OP 中的代码\interlinepenalty=10000
应用到了错误的位置。语法\renewenvironment
是
\renewenvironment{<environment name>}%
{stuff to expand from \<environment name>}%
{stuff to expand from \end<environment name>}
编辑:\interlinepenalty
是 TeX 在其分页算法中使用的众多参数之一。也许,在您的示例中,更好的命令是 \samepage
LaTeX 提供的。该\samepage
命令设置\interlinepenalty
为 10000
,但还设置其他相关参数以真正抑制分页。因此,让我们应用\interlinepenalty=10000
\samepage
紧接着\item[]
:
\documentclass{memoir}
\usepackage[english]{babel}
\usepackage{blindtext}
\renewenvironment{quote}%
{\list{}{\rightmargin\leftmargin}%
\item[]\samepage}% <- The effect of \samepage is local!!!
{\endlist}
\begin{document}
\blindtext[5]
\begin{quote}
\blindtext[2]
\end{quote}
\end{document}
在这个 MWE 中,的效果\samepage
是局部的。但是,值得指出的是,在上面的 MWE 中,我在环境中使用了不合理的长文本quote
。一个好的做法是将短引文放入 中 quote
,将长引文放入 中 quotation
。