鉴于以下情况一段代码:
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{fancyvrb}
\DefineVerbatimEnvironment{shell}{Verbatim}{
commandchars=\%\{\},
label=\shelltitle,
frame=single,
samepage=true,
formatcom=\setcounter{prompt}{0}\start
}
\newcommand{\shelltitle}{This is a shell}
\makeatletter
\def\start{\let\FV@FV@ProcessLine\FV@ProcessLine
\def\FV@ProcessLine{\noindent\vrule height3ex depth2ex
\hbox to\hsize{\kern\FV@FrameSep This is the shell prompt\hfil}%
\kern-.8pt\vrule\par
\let\FV@ProcessLine\FV@FV@ProcessLine
\FV@ProcessLine}%
}
\makeatother
\newcounter{prompt}
\newcommand{\prompt}{\stepcounter{prompt}\theprompt>}
\begin{document}
\begin{shell}
%prompt echo foo{}
foo
%prompt echo bar
bar
\end{shell}
\end{document}
该samepage=true
选项不会影响标题行(“这是 shell 提示符”),并且分页符会立即出现在该行之后。如何确保标题行与列表的其余部分位于同一页上?
答案1
\nobreak
正如 egreg 在他的评论中提到的那样,在 之后立即使用就足够了\kern-.8pt\vrule\par
。在下面的例子中,如果你删除命令\nobreak
并处理生成的代码,你会看到提到的不良效果(在“这是 shell 提示符”行之后立即出现分页符);按原样处理文档(使用\nobreak
),你会看到环境内的分页符被抑制,并且整个文本被移动到第二页:
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{fancyvrb}
\DefineVerbatimEnvironment{shell}{Verbatim}{
commandchars=\%\{\},
label=\shelltitle,
frame=single,
samepage=true,
formatcom=\setcounter{prompt}{0}\start
}
\newcommand{\shelltitle}{This is a shell}
\makeatletter
\def\start{\let\FV@FV@ProcessLine\FV@ProcessLine
\def\FV@ProcessLine{\noindent\vrule height3ex depth2ex
\hbox to\hsize{\kern\FV@FrameSep This is the shell prompt\hfil}%
\kern-.8pt\vrule\par\nobreak
\let\FV@ProcessLine\FV@FV@ProcessLine
\FV@ProcessLine}%
}
\makeatother
\newcounter{prompt}
\newcommand{\prompt}{\stepcounter{prompt}\theprompt>}
\begin{document}
\vspace*{18cm}
\begin{shell}
%prompt echo foo{}
foo
%prompt echo bar
bar
\end{shell}
\end{document}