当我尝试这个时:
\documentclass{article}
\usepackage{fancyvrb}
\usepackage{xcolor}
\begin{document}
\begin{Verbatim}[commandchars=\\\{\}]
\textcolor[RGB]{255,0,0}{test}
\end{Verbatim}
\end{document}
... 我得到的不是红色的“测试”,而是难以理解的\unhbox\voidb@x\kern,\z@,\char,‘\protect,\relax,\kern,.16667em,0\unhbox,\voidb@x,\kern,\z@,\...
我怀疑这与“活跃”角色有关......
我要做什么才能让它成功?
理想情况下,这应该只通过改变事物来实现里面环境Verbatim
,因为我的用例,环境是由我无法控制的外部模板提供的。
答案1
是的,你是对的:逗号被激活是为了打破连字(,,
是在 T1 编码字体中定义的连字)。
由于这是作为逐字环境初始化的一部分完成的,因此无法用 撤消codes={\catcode`,=12 }
,而需要不同的处理(参见检查逐字环境中的特殊字符)
由于不希望全局重新定义\verbatim@nolig@list
,因此这里有一个“局部”解决方案。
\documentclass{article}
\usepackage{fancyvrb}
\usepackage{xcolor}
\makeatletter
\newenvironment{Cverbatim}% C for "commands"
{\VerbatimEnvironment
\def\verbatim@nolig@list{\do\`\do\<\do\>\do\'\do\-}% no comma
\fvset{commandchars=\\\{\}}%
\begin{Verbatim}}
{\end{Verbatim}}
\makeatother
\begin{document}
\begin{Cverbatim}
\textcolor[RGB]{255,0,0}{test}
\end{Cverbatim}
\end{document}
,,
但是,如果你不打算在逐字文本中打破连字符,那么
\makeatletter
\def\verbatim@nolig@list{\do\`\do\<\do\>\do\'\do\-}% no comma
\makeatother
在序言中就可以了。
如果你可以控制辅助程序如何编写逐字文本,你可以这样做
\documentclass{article}
\usepackage{fancyvrb}
\usepackage{xcolor}
\usepackage{xparse}
\NewDocumentCommand{\verbatimtextcolor}{o>{\SplitArgument{2}{/}}mm}{%
\makeverbatimtextcolor#2{#3}%
}
\NewDocumentCommand{\makeverbatimtextcolor}{mmmm}{%
\textcolor[RGB]{#1,#2,#3}{#4}%
}
\begin{document}
\begin{Verbatim}[commandchars=\\\{\}]
\verbatimtextcolor{255/0/0}{test}
\end{Verbatim}
\end{document}
也可以进行超载\textcolor
,但是独立的宏似乎更好。
实际上,无需外部代码就可以做到这一点,只要您使用非常笨拙的输入:
\documentclass{article}
\usepackage{fancyvrb}
\usepackage{xcolor}
\begin{document}
\begin{Verbatim}[commandchars=\\\{\}]
\def\tcRGB{\textcolor[RGB]}\expandafter\tcRGB\expandafter{\detokenize{255,0,0}}{test}
\end{Verbatim}
\end{document}