我使用\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
,即放在两个相等的字符之间,如果您必须处理不平衡的括号,这很有用。