![我怎样才能仅通过改变前言来将“\colorbox”包裹在“\Verb[commandchars=\\\{\}]”周围?](https://linux22.com/image/387990/%E6%88%91%E6%80%8E%E6%A0%B7%E6%89%8D%E8%83%BD%E4%BB%85%E9%80%9A%E8%BF%87%E6%94%B9%E5%8F%98%E5%89%8D%E8%A8%80%E6%9D%A5%E5%B0%86%E2%80%9C%5Ccolorbox%E2%80%9D%E5%8C%85%E8%A3%B9%E5%9C%A8%E2%80%9C%5CVerb%5Bcommandchars%3D%5C%5C%5C%7B%5C%7D%5D%E2%80%9D%E5%91%A8%E5%9B%B4%EF%BC%9F.png)
这是如何使用 `\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}