我碰巧一遍又一遍地写下下面的代码。
{\color{blue}\verb|>|} {\footnotesize\verb|HI|}
因此,我想出了下面的代码来使其成为命令。
\newcommand{\result}[2]{%
{\color{#1}\verb|>|} {\footnotesize\verb|#2|}
}
问题是结果不是我所期望的,有|
附加的字符。
可能出了什么问题?我需要保留verbatim
环境,因为结果可能包含一些字符,例如$
,\
...
\documentclass{article}
\newcommand{\result}[2]{%
{\color{#1}$>$} {\footnotesize \verb|#2|}
}
\usepackage{color}
\begin{document}
{\color{blue}\verb|>|} {\footnotesize\verb|HI|}
\result{red}{HI}
\end{document}
添加
- 对于原始来源,
\verb|>|
应该是$>$
。我更新了源示例。 根据 Willie 的回答,我修改了命令
\newcommand{\result}[2]{{\color{#1}$>$} {\footnotesize\texttt{#2}}}
看起来不错,但是multicols
环境,footnotesize
字体,在打印字符之前留下一些空白。我附上了屏幕截图和源代码。
看来换行符导致了这个问题,通过\mbox
在里面添加\texttt
,我可以删除空白。
\newcommand{\result}[2]{{\color{#1}$>$} {\footnotesize\texttt{\mbox{#2}}}}
\documentclass{article}
\usepackage{multicol}
\usepackage{tikz}
\newcommand{\result}[2]{{\color{#1}$>$} {\footnotesize\texttt{\mbox{#2}}}}
\newcommand{\resultp}[2]{{\color{#1}$>$} {\small\texttt{\mbox{#2}}}}
\usepackage{color}
\begin{document}
\begin{multicols*}{2}
\noindent\result{green}{Welcome to my project! These are your args: (a b c)}\\ \result{green}{hello}\\ \result{green}{HI my\string_name}
\vskip 2ex
\noindent\resultp{green}{Welcome to my project! These are your args: (a b c)}\\ \resultp{green}{hello}\\ \resultp{green}{HI}
\end{multicols*}
\end{document}
答案1
我很惊讶它甚至为你编译了(你的测试示例)。在我的安装中
This is pdfTeX, Version
3.1415926-1.40.10 (Web2C 2009) entering extended mode
(./test.tex
LaTeX2e <2009/09/24>
Babel <v3.8l> and hyphenation patterns for english, usenglishmax, dumylang, noh yphenation, pinyin, bulgarian, russian, ukrainian, basque, french, loaded.
(/usr/share/texmf-dist/tex/latex/base/article.cls
Document Class: article 2007/10/19 v1.4h Standard LaTeX document class
(/usr/share/texmf-dist/tex/latex/base/size10.clo))
(/usr/share/texmf-dist/tex/latex/graphics/color.sty
(/usr/share/texmf-dist/tex/latex/latexconfig/color.cfg)
(/usr/share/texmf-dist/tex/latex/graphics/dvips.def)
(/usr/share/texmf-dist/tex/latex/graphics/dvipsnam.def)) (./test.aux)
! LaTeX Error: \verb illegal in command argument.
See the LaTeX manual or LaTeX Companion for explanation. Type
H <return> for immediate help. ...
l.12 \result{red}{HI}
原因是\verb
是一个非常脆弱的命令。我链接到的 TeX faq 中的建议是用 替换\verb
,当您按上述定义\texttt
向 键入参数时,使用来转义有问题的字符。另请参阅\result
\string
‘字符串命令’。
答案2
您还可以\verb
使用以下命令定义自己的类似命令xparse
:
\documentclass{article}
\usepackage{xparse,xcolor}
\NewDocumentCommand\myvrb{O{blue}v}{%
\textcolor{#1}{\(>\)} \texttt{\footnotesize#2}}
\begin{document}
\myvrb|HI|
\myvrb[red]|HI|
\myvrb|&$#|
\end{document}
答案3
通过一些胁迫手段,逐字可以制作成几乎做你想做的事。“几乎”是因为你必须使用环境而不是命令。
\documentclass{article}
\usepackage{verbatim}
\usepackage{xcolor}
\makeatletter
\newenvironment{result}[1]{%
\def\verbatim@processline{\the\verbatim@line\ }%
\def\@verbatim{\the\every@verbatim
\obeylines
\let\do\@makeother \dospecials
\verbatim@font
}%
\def\endverbatim{\endgroup}%
\noindent
{\color{#1}\texttt{>}}
\footnotesize
\verbatim}{\endverbatim}
\makeatother
\begin{document}
Here are your results:
\begin{result}{red}
greetings
\end{result}
\begin{result}{green}
A load of *@&$!)%*#$
\end{result}
\end{document}
简而言之,我查看了包中的定义verbatim
,删除了所有可能插入换行符的内容,从而使 verbatim 环境在一行而不是多行上工作,这意味着它不会以换行符开始或结束。然后我将其放入新环境中,以便旧\begin{verbatim} ... \end{verbatim}
构造仍能正常工作。
警告:行上任何多余的内容都会被丢弃(LaTeX 会对此发出警告)。因此,如果您想从环境中\end{result}
取出并使输入更像问题中的示例,则代码必须是:\noindent
result
\noindent\begin{result}{red}
greetings
\end{result}
\\
\begin{result}{green}
A load of *@&$!)%*#$
\end{result}
答案4
与 Martin Scharrer 一起灵活实施newverbs
:
\documentclass{article}
\usepackage{newverbs}
\usepackage{xcolor}
\makeatletter
\newverbcommand{\colorverb@verb}{}{\endgroup}
\newcommand{\colorverb}[2][]{%
\leavevmode\begingroup
\if\relax\detokenize{#1}\relax
\expandafter\@firstoftwo
\else
\expandafter\@secondoftwo
\fi
{\color{#2}}%
{\color[#1]{#2}}%
\colorverb@verb
}
\makeatother
\begin{document}
\colorverb{green}|abc{\}|
\colorverb{red!20}?abc|}?
\colorverb[HTML]{A021C2}|abc{\}|
\end{document}
如果您需要使用其用户级功能(如或 ) ,则使用expl3
; 加载是可选的。xcolor
\definecolor
\colorlet
\documentclass{article}
\ExplSyntaxOn
\keys_define:nn { prosseek/flexiverb }
{
color .tl_set:N = \l__prosseek_flexiverb_color_tl,
model .tl_set:N = \l__prosseek_flexiverb_model_tl,
font .tl_set:N = \l__prosseek_flexiverb_font_tl,
}
\NewDocumentCommand{\flexiverb}{O{}v}
{
\mbox
{
\keys_set:nn { prosseek/flexiverb } { #1 }
\tl_if_empty:VTF \l__prosseek_flexiverb_model_tl
{
\color_select:V \l__prosseek_flexiverb_color_tl
}
{
\color_select:VV \l__prosseek_flexiverb_model_tl \l__prosseek_flexiverb_color_tl
}
\use:c { verbatim@font }
\l__prosseek_flexiverb_font_tl
#2
}
}
\cs_generate_variant:Nn \color_select:n { V }
\cs_generate_variant:Nn \color_select:nn { VV }
\ExplSyntaxOff
% how to define a command based on \flexiverb
\NewDocumentCommand{\redverb}{}{\flexiverb[color=red!80]}
\begin{document}
\flexiverb[color=red!80]|abc}|
\redverb|abc}|
\flexiverb[color=A021C2,model=HTML,font=\footnotesize]|abc{\}|
\end{document}