如何在自定义 Verbatim 命令中获取直单引号?

如何在自定义 Verbatim 命令中获取直单引号?

我使用\Verb来自fancyvrb 包用于文本内逐字片段。为了获得直单引号,我还加载了upquote 包。不幸的是,当我使用以下形式的自定义命令时,这不起作用

\newcommand\textcode[1]{\Verb[<options>]|#1|}

我尝试将@egreg的解决方案改编为如何在 Verbatim 环境中更改字形?,但这并不成功。如何创建一个\textcode产生直单引号的宏(而不必\textquotesingle每次都输入)?

\documentclass[a4paper]{article}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage{upquote}
\usepackage{fancyvrb}

\newcommand\textcode[1]{\Verb|#1|}

\newcommand\makequotestraight{% 
  \begingroup\lccode`~=`'
  \lowercase{\endgroup\let~}\textquotesingle
  \catcode`'=\active
}
\newcommand\textcodeii[1]{\Verb[codes={\makequotestraight},]|#1|}

\begin{document}
\Verb|'a = b'|
\textcode{'a = b'}
\textcodeii{'a = b'}
\textcode{\textquotesingle a = b\textquotesingle}
\end{document}

引号

答案1

我认为埃格雷格的诡计 这里不起作用的原因是,一旦参数传递给你的\textcodeii命令,该参数中字符的 catcode 就是不可变的;在那个阶段,它们已经固定了,再想改变它们就太晚了。因此,你的\makequotestraight宏不会帮到你。

无论如何,这里不需要这样的技巧。只需将自定义\textcode命令定义为不带参数,如下所示

\newcommand\textcode\Verb

然后引用

 \textcode|'a = b'|

将会如您所愿笔直。

在此处输入图片描述

有关此定义背后原理的更多详细信息,请参阅为什么 verbatim 在... 内不起作用?

LaTeX 逐字命令通过更改类别代码来工作。Knuth 谈到这种事情时说“需要小心把握时机...”,因为一旦将类别代码分配给字符,它就不会改变。因此,\verb必须\begin{verbatim}假设他们首先查看参数文本;如果不是,则 TeX 已经分配了类别代码,因此逐字命令没有机会。

\documentclass[a4paper]{article}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage{upquote}
\usepackage{fancyvrb}

\newcommand\textcode{\Verb}

\begin{document}

\textcode|'a = b'|

\end{document}

答案2

expl3更加直接,不需要更改类别代码:

\documentclass{article}
\usepackage{xparse,textcomp}

\ExplSyntaxOn
\NewDocumentCommand{\textcode}{v}
 {
  \ian_textcode:n { #1 }
 }

\tl_new:N \l_ian_textcode_tl

\cs_new_protected:Npn \ian_textcode:n #1
 {
  \tl_set:Nn \l_ian_textcode_tl { #1 }
  \tl_replace_all:Nnn \l_ian_textcode_tl { ' } { \textquotesingle }
  \texttt { \l_ian_textcode_tl }
 }
\ExplSyntaxOff

\begin{document}

\textcode{'a = b'}

\textcode|'a { b'|

\end{document}

请注意,可以像 do 那样将参数括起来\verb,即放在两个相等的字符之间,如果您必须处理不平衡的括号,这很有用。

在此处输入图片描述

相关内容