我一直在研究一个命令,它可以排版段落中的代码片段。我知道有listings
公司,但我想要一个可以逐字排版代码并允许我使用它做其他事情(例如保存到外部文件然后执行)的命令。
我创建了一个宏,它使用 来排版其参数\verb
,并且还可以使其参数用于其他目的。但在创建它的过程中,我一直在阅读有关 verb 不应该接受参数的信息(尽管我似乎已经让它这样做了)。所以有两个问题:
- 这段代码有什么地方可能出现严重错误?有什么深层次的原因
\verb
不容篡改? - catcodes 是怎么回事?似乎 的分隔符必须处于活动状态。这会导致一些非常奇怪的行为。例如,我可以使用“=”作为分隔符,并排版包含“=”的代码,只要分隔符不是我的宏
\verb
中的最后一个字符。\createverb
最小工作示例:
\documentclass[11pt]{article}
\usepackage{xstring}
\makeatletter
\begingroup
\catcode`\==\active
\gdef\delimchar{=}
\gdef\delimchardetok{\detokenize{=}}
\endgroup
\verbtocs{\cmd}|\verb|
\def\createverb{%
\begingroup
\let\do\@makeother
\dospecials
%Reset the \, {, and } so they're special
\catcode`\\=0
\catcode`\{=1
\catcode`\}=2
%Obey spaces
\frenchspacing\@vobeyspaces
\createverb@finish}
\def\createverb@finish#1{%
%Deactiveate { and }
\catcode`\{=12
\catcode`\}=12
\tokenize{\verbtext}{\cmd\delimchardetok\detokenize{#1}}%
\endgroup
\verbtext\delimchar%
}%
\makeatother
\begin{document}
Pseudo-Perl:
\createverb{$f=$_[0]+$a{$b[2]}+$c*$d #Comment here}
\end{document}
答案1
根据 Bruno 的建议,以下是一个例子
\documentclass[a4paper]{article}
\usepackage{xparse}
\NewDocumentCommand{\createverb}{ov}{
\IfNoValueTF{#1}
{{\fontencoding{T1}\ttfamily#2}}
{\def#1{#2}}
}
\begin{document}
\createverb{$f=$_[0]+$a{$b[2]}+$c*$d #Comment here}
\createverb[\xyz]{$f=$_[0]+$a{$b[2]}+$c*$d #Comment here}
\xyz
\end{document}
我没有在您的代码中看到任何“危险”的东西;但它相当尴尬。