看似微不足道:verbatim、newenvironment 和 colorbox

看似微不足道:verbatim、newenvironment 和 colorbox

我再次尝试实现一个看似微不足道的目标。我想用它 \newenvironment来定义一个逐字环境背景颜色。我需要定义自己的环境,因为打开环境时我需要运行额外的命令。

以下是我目前所掌握的信息:

\newenvironment{response}{%
  % here, run extra commands, mostly related to \tikzmark and other extra legwork
  \verbatim
}{
  \endverbatim
}

这很好用。我尝试了以下方法来添加背景颜色。

  • 为 FancyVrb 定义背景颜色(fancyvrb 的背景颜色),但如果我用\begin{Verbatim}\end{Verbatim}代替\verbatim\endverbatim,这就不再起作用了,
  • 自己玩了一下\color@setgroup和,\color@endroup但是这些似乎并没有被 xcolor 包公开。
  • 使用 lrbox,但同样,任何一对\begin{foo}\end{foo}穿过环境被拒绝(可能是因为\verbatim?)

我现在很困惑,希望得到任何指点。谢谢!

更新:第一条评论有解决方案,即我没有使用\VerbatimEnvironment!

答案1

对于fancyvrb,需要\VerbatimEnvironment在 之前使用\begin{Verbatim}。这告诉fancyvrb检测当前环境的名称,并查找该环境的结尾,而不是查找文字\end{Verbatim}

您可能希望使用适当的框架包来提供背景颜色……这样,您就不必担心自己想出分页符的解决方案,并且可以使用更多功能。您可能想看看mdframedtcolorbox。下面是一个例子mdframedtcolorbox为许多用例提供了内置解决方案;其中一个可能会为您提供大部分或全部所需的功能。

\documentclass{article}

\usepackage{fancyvrb}
\usepackage{mdframed}
\usepackage{xcolor}

\newenvironment{response}%
  {\VerbatimEnvironment
    \begin{mdframed}[backgroundcolor=green]
    \begin{Verbatim}}
  {\end{Verbatim}%
    \end{mdframed}}

\begin{document}

\begin{response}
<Text>
\end{response}

\end{document}

答案2

xcolor首先,这是一个仅使用包和标准环境的解决方案verbatim。但它本身并不是一个新的环境,因此不能直接回答 OP 的问题(有关答案,请参阅下文)。

\documentclass{article}
\usepackage{xcolor}
\fboxrule=1pt
\begin{document}
\setbox0=\hbox{\begin{minipage}{3in}
\color{red!90}
\begin{verbatim}
\verbatim <Text>
Here
%$#@&^* \macros
\end{verbatim}
\end{minipage}}
\fcolorbox{cyan}{blue!10}{\box0}
\end{document}

在此处输入图片描述


为了创建 OP 所需的环境,我将颜色调整为verbatimbox包使用的语法,并创建了cverbbox环境,它将您的逐字内容存储在与内容宽度完全相同的用户名框中(加上 boxsep 和 boxrule)。它带有一个可选参数和 4 个强制参数:

\begin{cverbbox}[options]{boxname}{text color}{box color}{frame color}
...
\end{cverbbox}

其中的选项与环境中已经使用的选项相同verbatimbox(在此 MWE 中,我使用选项进行逐字复制\tiny并在每行前添加项目符号)。它以标准方式使用\fboxsep和来设置框架偏移和规则厚度。\fboxrule

\documentclass{article}
\usepackage{xcolor}
\usepackage{verbatimbox}
\makeatletter
\newenvironment{cverbbox}[5][]{%
  \setcounter{VerbboxLineNo}{0}%
  \def\verbatim@processline{%
% THE FIRST #1 ACCOUNTS FOR NON-PRINTING COMMANDS; THE SECOND #1 IS FOR
% PRINTED OPTIONAL MATERIAL
    {\addtocounter{VerbboxLineNo}{1}%
    #1\setbox0=\hbox{#1\the\verbatim@line}%
    \hsize=\wd0 \the\verbatim@line\par}}%
  \@minipagetrue%
  \@tempswatrue%
  \global\edef\sv@name{\@macro@name{#2}}%
  \global\edef\cverbboxColor{#4}%
  \global\edef\cverbboxFColor{#5}%
  \@ifundefined{\sv@name content}{%
    \expandafter\newsavebox\expandafter{\csname\sv@name content\endcsname}%
  }%
  \expandafter\global\expandafter\edef\csname\sv@name\endcsname{\usebox{%
  \csname\sv@name content\endcsname}}%
  \setbox0=\vbox\bgroup\color{#3} \verbatim
}
{%
  \endverbatim%
  \unskip\setbox0=\lastbox %
  \egroup%
  \setbox1=\hbox{%
    \colorbox{\cverbboxColor}{\box0}}%
  \global\sbox{\csname\sv@name content\endcsname}%
    {\fboxsep=\fboxrule\colorbox{\cverbboxFColor}{\box1}}%
}
\makeatother
\fboxrule=1pt\fboxsep=3pt\relax
\begin{document}
\begin{cverbbox}[\tiny\textcolor{black}{$\bullet$}]{\mycvbox}{red!80}{blue!10}{cyan}
\verbatim <Text>
Here
%$#@&^* \macros
xa
\end{cverbbox}
x\fbox{a}\mycvbox\fbox{b}x
\end{document}

在此处输入图片描述

相关内容