我怎样才能仅通过改变前言来将“\colorbox”包裹在“\Verb[commandchars=\\\{\}]”周围?

我怎样才能仅通过改变前言来将“\colorbox”包裹在“\Verb[commandchars=\\\{\}]”周围?

这是如何使用 `\renewcommand` 将 `\colorbox` 包裹在 `\Verb` 周围?

我有包含如下代码的 TeX 文件:

\Verb|print("Hello World", end="")|

内容\Verb应该有背景颜色。但是,我无法修改 TeX 文件的主体 - 只能修改前言。使用newverbs上面链接的问题中的包的解决方案可以很好地解决这个问题。

但它不适用于\Verb[commandchars=\\\{\}],例如:

\Verb[commandchars=\\\{\}]|print("Hello World", end="")|

麦格维:

\documentclass[12pt]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{lmodern}
\usepackage{xcolor}
\usepackage{fancyvrb}

\usepackage{newverbs}
\renewcommand{\Verb}{\collectverb{\colorbox{lightgray}}}

\begin{document}

This works: \Verb|print("Hello World", end="")|

%This doesn't work: \Verb[commandchars=\\\{\}]|print("Hello World", end="")|

\end{document}

答案1

您上一个问题中建议的方法与fancyvrb的键值系统不兼容。当您执行 时\renewcommand{\Verb}{...},此命令将不再属于fancyvrb

我建议采用不同的方法:我们重新定义\FVC@Verb(中的底层宏\Verb)并\FV@CMD在其周围添加一个,这样我们就可以使用键更改的含义,\FV@CMD并用我们想要的任何内容包装逐字内容。简单地说,我们将这样做:

\FV@CMD{<verbatim stuff>}

这正是该\collectverb方法所要做的。

首先我们确保\FV@CMD存在:

\let\FV@CMD\relax

然后我们创建一个可以改变其值的键:

\define@key{FV}{wrapwith}[\relax]{\def\FV@CMD{#1}}

最后我们将其合并到\FVC@Verb宏中:

\begingroup
\catcode`\^^M=\active%
\gdef\FVC@Verb#1{%
  \begingroup%
    \FV@UseKeyValues%
    \FV@FormattingPrep%
    \FV@CatCodes%
    \outer\def^^M{}%
    \catcode`#1=12%
    \def\@tempa{\def\FancyVerbGetVerb####1####2}%
    \expandafter\@tempa\string#1{\mbox{\FV@CMD{##2}}\endgroup}%
    \FancyVerbGetVerb\FV@EOL}%          ^^^^^^^   ^ Added this
\endgroup

然后我们要做的就是重新定义\FV@CMD\colorbox{lightgray}

\fvset{wrapwith=\colorbox{lightgray}}

这将具有全局效果,因此您可以根据需要在前言中使用它。但是,如果您将其用作\Verb命令的参数,它也会起作用,但只会具有局部效果。

完整代码:

\documentclass[12pt]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{lmodern}
\usepackage{xcolor}
\usepackage{fancyvrb}

\makeatletter
\let\FV@CMD\relax
\define@key{FV}{wrapwith}[\relax]{\def\FV@CMD{#1}}
\begingroup
\catcode`\^^M=\active%
\gdef\FVC@Verb#1{%
  \begingroup%
    \FV@UseKeyValues%
    \FV@FormattingPrep%
    \FV@CatCodes%
    \outer\def^^M{}%
    \catcode`#1=12%
    \def\@tempa{\def\FancyVerbGetVerb####1####2}%
    \expandafter\@tempa\string#1{\mbox{\FV@CMD{##2}}\endgroup}%
    \FancyVerbGetVerb\FV@EOL}%
\endgroup
\makeatother

\fvset{wrapwith=\colorbox{lightgray}}

\begin{document}

This works: \Verb|print("Hello World", end="")|

This does work: \Verb[commandchars=\\\{\}]|print("Hello World", end="")|

\end{document}

相关内容