在一个命令中更改 _ 的 catcode?

在一个命令中更改 _ 的 catcode?

在下面的代码中,我想_显示一个简单的字母。我该如何实现呢?

% Source : http://forum.mathematex.net/latex-f6/forcer-le-retour-a-la-ligne-dans-texttt-t13246.html#p127511

\documentclass{article}
    \makeatletter
        \newcommand\breakabletexttt[1]{\texttt{\breakable@texttt#1\@nil}}
        \def\@gobble@fi#1\fi{\fi#1}
        \def\breakable@texttt#1#2\@nil{%
            #1\hspace{0pt plus 0.1pt minus 0.1pt}%
            \ifx\relax#2\relax
            %
            \else
            \@gobble@fi\breakable@texttt#2\@nil
            \fi
        }
    \makeatother


\begin{document}

\breakabletexttt{rangerangerangerange_rangerangerange_rangerangerangerangerangerangerangerangerangerangerangerangerangerangerangerangerangerangerangerangerangerangerangerangerangerangerangerangerangerangerangerangerangerangerangerangerangerangerangerangerange}

\end{document}

答案1

这是@unbonpetit 解决方案中的一个通用技巧:

% start a group and change the catcodes
\def\foo{%
  \begingroup
  \catcode`\_=12\relax
  \foowitharg}
% do the work and ends the group
\def\foowitharg#1{%
  \bfseries
  #1%
  \endgroup}

但如果你不想将宏分成两个,你可以使用 eTeX 的扩展\scantokens

\def\foo#1{%
  \textbf{\scantokens{\catcode`\_=12\relax#1}}}

都可以。


也就是说你可以将定义修改为:

\documentclass{article}
\makeatletter
\newcommand\breakabletexttt[1]{\begingroup\ttfamily
  \scantokens{\catcode`\_12\makeatletter\breakable@texttt#1\@nil}%
  \endgroup}
\def\@gobble@fi#1\fi{\fi#1}
\def\breakable@texttt#1#2\@nil{%
    #1\hspace{0pt plus 0.1pt minus 0.1pt}%
    \ifx\relax#2\relax
    %
    \else
    \@gobble@fi\breakable@texttt#2\@nil
    \fi
}
\makeatother
\begin{document}
\breakabletexttt{rangerangerangerange_rangerangerange_rangerangerangerangerangerangerangerangerangerangerangerangerangerangerangerangerangerangerangerangerangerangerangerangerangerangerangerangerangerangerangerangerangerangerangerangerangerangerangerangerange}
\end{document}

答案2

您必须更改 catcode_ 您阅读了宏的参数(请仔细阅读我发给您的文档)。

\documentclass{article}
\makeatletter
\newcommand\breakabletexttt{\begingroup\catcode`\_12 \breakabletexttt@i}
\newcommand\breakabletexttt@i[1]{\texttt{\breakable@texttt#1\@nil}\endgroup}
\def\@gobble@fi#1\fi{\fi#1}
\def\breakable@texttt#1#2\@nil{%
    #1\hspace{0pt plus 0.1pt minus 0.1pt}%
    \ifx\relax#2\relax
    %
    \else
    \@gobble@fi\breakable@texttt#2\@nil
    \fi
}
\makeatother
\begin{document}
\breakabletexttt{rangerangerangerange_rangerangerange_rangerangerangerangerangerangerangerangerangerangerangerangerangerangerangerangerangerangerangerangerangerangerangerangerangerangerangerangerangerangerangerangerangerangerangerangerangerangerangerangerange}
\end{document}

答案3

您可以使用以下方式更改角色的 catcode

\catcode`_=11

在这种情况下,11因为这是字母的类别代码。通常_是 catcode 8(即下标的类别)。你可以用

\catcode`_=8

您可以在以下位置阅读更多相关信息TeX 按主题分类

相关内容