如何在精美的 Verbatim 环境之前/之后抑制多余的垂直空间?

如何在精美的 Verbatim 环境之前/之后抑制多余的垂直空间?

我正在使用 fancyvrbDefineVerbatimEnvironment为用户输入和输出创建不同风格的逐字环境。当两个或多个这样的环境相互连接时,它们之间会有额外的垂直空间。根据控制逐字环境之前和之后的垂直空间?,可以通过重新设置\topsep\partopsetp常规来抑制额外的空间verbatim。对于使用定义的环境,我该如何/应该抑制它DefineVerbatimEnvironment

示例显示了我想要抑制的额外块间间距:

\documentclass{book}

\usepackage{fancyvrb}
\usepackage{relsize}
\DefineVerbatimEnvironment{VerbIn}{Verbatim}{fontsize=\relsize{-1}}
\DefineVerbatimEnvironment{VerbOut}{Verbatim}{fontshape=it,fontsize=\relsize{-1}}

\begin{document}

\begin{VerbIn}
This is user input.
\end{VerbIn}
\begin{VerbOut}
This is user output.
\end{VerbOut}

\end{document}

显示额外块间间距的屏幕截图

后来:egreg的解决方案有时有效:

VerbInX 解决方案正在发挥作用

但有时却不行:

VerbInX 解决方案不起作用

史蒂文的verbatimbox解决方案是可行的,但在实践中会很笨重:通常会有立即连续的进-出-进-出-进-出的序列,所有这些都应该抑制空格,并且必须为每个序列提供一个唯一的标记以便以后调用,这将容易在编辑时出错。

稍后:如果您习惯使用 Git,我已在一个分支中提交了 egreg 的解决方案:

$ git clone [email protected]:gvwilson/bc.git
$ cd bc
$ git checkout book
$ cd book
$ make # or 'pdflatex book' a couple of times
$ open book.pdf # and go to the bottom of pg 8 or the top of pg 10

软件包加载于packages.tex,命令定义于commands.tex

答案1

有一个未记录的fancyvrb选项,称为listparameters。您可以将列表维度更改代码传递给此选项。这里是列表维度及其角色的完整列表。要抑制上方和下方的垂直空格,您可以使用

listparameters=\setlength{\topsep}{0pt}\setlength{\partopsep}{0pt}

完整示例:

\documentclass{book}

\usepackage{fancyvrb}
\usepackage{relsize}

\fvset{listparameters=\setlength{\topsep}{0pt}\setlength{\partopsep}{0pt}}
\DefineVerbatimEnvironment{VerbIn}{Verbatim}{fontsize=\relsize{-1}}
\DefineVerbatimEnvironment{VerbOut}{Verbatim}{fontshape=it,fontsize=\relsize{-1}}

\begin{document}

\noindent normal text
\begin{VerbIn}
This is user input.
\end{VerbIn}
normal text
\begin{VerbOut}
This is user output.
\end{VerbOut}
normal text

\end{document}

使用选项“listparameters”删除垂直跳过

答案2

如果您想在VerbOut环境紧随 之后时抑制垂直空间VerbIn,则应该这样做:

\documentclass{book}

\usepackage{fancyvrb}
\usepackage{relsize}
\usepackage{lipsum} % just for the example

\DefineVerbatimEnvironment{VerbInX}{Verbatim}{fontsize=\relsize{-1}}
\DefineVerbatimEnvironment{VerbOutX}{Verbatim}{fontshape=it,fontsize=\relsize{-1}}
\newenvironment{VerbIn}
  {\VerbatimEnvironment
   \par\VerbInX}
  {\endVerbInX\vskip1sp }
\newenvironment{VerbOut}
  {\VerbatimEnvironment
   \par\ifdim\lastskip=1sp\vspace{\dimexpr-2\topsep-2\partopsep\relax}\fi
   \VerbOutX}
  {\endVerbOutX}


\begin{document}

\lipsum[2]
\begin{VerbIn}
This is user input.
\end{VerbIn}
\begin{VerbOut}
This is user output.
\end{VerbOut}
\lipsum[3]
\begin{VerbIn}
This is user input.
\end{VerbIn}
\lipsum[4]

\end{document}

在 的末尾,VerbIn我添加了一个特殊的不可见垂直跳跃,其长度仅为 1sp(TeX 中最小的正长度)。在 的开头,我检查是否存在这样的垂直跳跃,只有在刚刚结束VerbOut时才会出现这种情况。VerbIn

在此处输入图片描述

答案3

您可以使用verbatimbox包作为替代方案。通过将逐字内容放入框中,然后输出框,可以避免多余的行。

我已编辑了我的答案,以展示使用包实现结果的两种方法。在第一种情况下,myverbbox环境要求将令牌名称与创建的框相关联。这样,可以在实际使用之前提前创建逐字材料(除非重新使用令牌)。

在第二种情况下,verbbox环境不使用唯一的标记名称来存储逐字框;相反,内容存储在使用 调用的通用框中\theverbbox。如果框在创建后即可使用,则此技术更加高效。

\documentclass{book}
\usepackage{verbatimbox}
\usepackage{relsize}
\begin{document}
\begin{myverbbox}[\relsize{-1}]{\VerbIn}
This is user input.
\end{myverbbox}
\begin{myverbbox}[\itshape\relsize{-1}]{\VerbOut}
This is user output.
\end{myverbbox}
\noindent\VerbIn\\\VerbOut

\begin{verbbox}[\relsize{-1}]
This is user input.
\end{verbbox}
\noindent\theverbbox\\
\begin{verbbox}[\itshape\relsize{-1}]
This is user output.
\end{verbbox}
\theverbbox
\end{document}

在此处输入图片描述

相关内容