将宏参数传递给 \verb 的潜在问题

将宏参数传递给 \verb 的潜在问题

我一直在研究一个命令,它可以排版段落中的代码片段。我知道有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}

我没有在您的代码中看到任何“危险”的东西;但它相当尴尬。

相关内容