我再次尝试实现一个看似微不足道的目标。我想用它 \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}
。
您可能希望使用适当的框架包来提供背景颜色……这样,您就不必担心自己想出分页符的解决方案,并且可以使用更多功能。您可能想看看mdframed
或tcolorbox
。下面是一个例子mdframed
。 tcolorbox
为许多用例提供了内置解决方案;其中一个可能会为您提供大部分或全部所需的功能。
\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}