我已经读过了如何防止自定义环境中断?但这似乎无法解决我的问题。我想定义一个环境,该环境定义了一个标题,然后有一行文本和一个巨大的 AVM。所有这些都必须保留在同一页上。我尝试了 samepage,但 LaTeX 很顽固,无论如何都会中断。我尝试了 minipage,但环境前后的空间消失了。
\documentclass{article}
\usepackage{array}
\newcounter{schema}
\newenvironment{schema}[1][]
{% \begin{schema}[<title>]
\goodbreak%
\refstepcounter{schema}%
\begin{list}{}{\setlength{\labelwidth}{0pt}\setlength{\labelsep}{0pt}\setlength{\rightmargin}{0pt}\setlength{\leftmargin}{0pt}}%
\item[{\textbf{Schema~\theschema}}]\hspace{.5em}\textbf{(#1)}\nopagebreak[4]\par\nobreak}%
{\end{list}}% \end{schema}
\newcommand{\onems}[2][]{%
\mbox{%
\delimiterfactor=1000 \delimitershortfall=0pt
\tabcolsep=0pt
$\left[%
\begin{tabular}{>{\upshape\scshape}l}
\if\relax\detokenize{#1}\relax\else
{\normalfont\itshape #1}%
\\
\fi
#2%
\end{tabular}%
\right]$%
}%
\vspace{1mm}%
}
\begin{document}
\begin{schema}[Head-Complement Schema]
\label{schema-hc-flat}
\textit{head-complement-phrase}\\*
\onems{
synsem|loc|cat|comps <>\\
head-dtr \onems{ synsem|loc|cat|comps 1\\
}\\
non-head-dtrs synsem2signs(1)\\
}
\end{schema}
\end{document}
编辑:这是带有 minipage 包装器(注释掉)的代码版本。minipage 版本占用了环境前后的空间。我不知道如何修复这个问题。
\documentclass{article}
\usepackage{array,lipsum}
\newcounter{schema}
\newenvironment{schema}[1][]
{% \begin{schema}[<title>]
\goodbreak%
\refstepcounter{schema}%
\begin{list}{}{\setlength{\labelwidth}{0pt}\setlength{\labelsep}{0pt}\setlength{\rightmargin}{0pt}\setlength{\leftmargin}{0pt}}%
\item[{\textbf{Schema~\theschema}}]\hspace{.5em}\textbf{(#1)}\nopagebreak[4]\par\nobreak}%
{\end{list}}% \end{schema}
%% \newenvironment{schema}[1][]
%% {% \begin{schema}[<title>]
%% \goodbreak%
%% \refstepcounter{schema}%
%% \begin{minipage}{\linewidth}%
%% \begin{list}{}{\setlength{\rightmargin}{\leftmargin}}%
%% \item[{\textbf{Schema~\theschema:}}]#1\par\nobreak}%
%% {\end{list}\end{minipage}}% \end{schema}
\newcommand{\onems}[2][]{%
\mbox{%
\delimiterfactor=1000 \delimitershortfall=0pt
\tabcolsep=0pt
$\left[%
\begin{tabular}{>{\upshape\scshape}l}
\if\relax\detokenize{#1}\relax\else
{\normalfont\itshape #1}%
\\
\fi
#2%
\end{tabular}%
\right]$%
}%
\vspace{1mm}%
}
\begin{document}
\lipsum[2]
\begin{schema}[Head-Complement Schema]
\label{schema-hc-flat}
\textit{head-complement-phrase}\\*
\onems{
synsem|loc|cat|comps <>\\
head-dtr \onems{ synsem|loc|cat|comps 1\\
}\\
non-head-dtrs synsem2signs(1)\\
}
\end{schema}
\lipsum[2]
\end{document}
答案1
正如我在评论中所说,在我看来,不惜一切代价避免分页的唯一明智方法是将内容放在 或 中minipage
。\parbox
前后的间距可以用明确的(或,或任何您觉得合适的)minipage
添加。 需要稍微注意一下间距\bigskip
\medskip
后环境,但是这里内核宏\@endparenv
就派上用场了。
\documentclass{article}
\usepackage{array,lipsum}
\newcounter{schema}
\makeatletter
\newenvironment{schema}[1][]
{%
\refstepcounter{schema}%
\par\bigskip\noindent
\minipage{\linewidth}%
\textbf{Schema~\theschema: \ifx&\else(#1)\fi}\par
}{\endminipage\par\bigskip\@endparenv}%
\makeatother
\newcommand{\onems}[2][]{%
\mbox{%
\delimiterfactor=1000 \delimitershortfall=0pt
\tabcolsep=0pt
$\left[%
\begin{tabular}{>{\upshape\scshape}l}
\if\relax\detokenize{#1}\relax\else
{\normalfont\itshape #1}%
\\
\fi
#2%
\end{tabular}%
\right]$%
}%
\vspace{1mm}%
}
\begin{document}
\lipsum[66]
\begin{schema}[Foo]
\label{foo}
\textit{head-complement-phrase}\\*
\onems{
synsem|loc|cat|comps <>\\
head-dtr \onems{ synsem|loc|cat|comps 1\\
}\\
non-head-dtrs synsem2signs(1)\\
}
\end{schema}
See schemes \ref{foo} and \ref{baz}.
\lipsum[66]
\begin{schema}[Baz]
\label{baz}
\textit{head-complement-phrase}\\*
\onems{
synsem|loc|cat|comps <>\\
head-dtr \onems{ synsem|loc|cat|comps 1\\
}\\
non-head-dtrs synsem2signs(1)\\
}
\end{schema}
\lipsum[66]
\end{document}
用 关闭环境的优点是,除非您留下明确的空行,否则\@endparenv
后面的缩进会被抑制。\end{schema}
(我假设您已经注意到,使用小型大写字母,您会得到<>
但却|
呈现为破折号。我希望您知道自己在那里做什么:-)
。)