无换行符的环境

无换行符的环境

我已经读过了如何防止自定义环境中断?但这似乎无法解决我的问题。我想定义一个环境,该环境定义了一个标题,然后有一行文本和一个巨大的 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&#1&\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}

(我假设您已经注意到,使用小型大写字母,您会得到<>但却|呈现为破折号。我希望您知道自己在那里做什么:-)。)

相关内容