重新定义 \texttt{} 以允许下划线

重新定义 \texttt{} 以允许下划线

\texttt{}经常在里面使用下划线来表示 python 函数,并且我已经厌倦了用 转义每个下划线\_。我尝试了以下内容来重新定义\texttt{}命令以允许未转义的下划线,基于以下答案:

我可以重新定义一个命令来包含它自己吗?

不使用 \verb 和 \texttt 转义下划线

由于某种原因,它不起作用。如果我直接在文本中写入命令内的三行,它就会起作用。有什么想法可以解释为什么它不起作用吗?

\usepackage[T1]{fontenc}

\let\oldtexttt\texttt #'Copy' command

\renewcommand{\texttt}[1]{
\catcode`_ 12\relax    
\oldtexttt{#1}
\catcode`_ 8\relax}

\texttt{hello_world}

答案1

您应该为 Python 函数定义自己的命令,并对其应用字符替换。

\documentclass{article}

\ExplSyntaxOn
\NewDocumentCommand{\pyf}{m}
 {
  \texttt
   {
    \tl_set:Nn \l_tmpa_tl { #1 }
    \tl_replace_all:Nen \l_tmpa_tl { \char_generate:nn { `_ } { 8 } } { \_ }
    \tl_use:N \l_tmpa_tl
   }
 }
\cs_generate_variant:Nn \tl_replace_all:Nnn { Ne }
\ExplSyntaxOff

\begin{document}

\pyf{my_var}

\texttt{my\_var}

\end{document}

由于编程环境_中的特殊性expl3,所以有一点复杂,所以我们需要用其通常的“下标”含义来生成下划线。

在此处输入图片描述

你的方法行不通,因为当你吸收论点时,类别代码就被冻结了。你可以这样做不是在类别代码更改之前吸收参数

\makeatletter
\newcommand{\pyf}{%
  \begingroup\catcode`_=12
  \pyf@
}
\newcommand{\pyf@}[1]{\texttt{#1}\endgroup}
\makeatother

但这将不是\pyf如果在另一个命令的参数中使用,则可以工作。

我在一开始展示的代码没有这个缺陷。

相关内容