如何列出并逐字逐句地转义特殊字符?

如何列出并逐字逐句地转义特殊字符?

我使用一个宏来使用样式显示文本texttt。目前这个宏非常基础。例如,如果我想使用字符_,则必须更改其 catcode。

有没有一种巧妙的方法来转义所有特殊字符,如listingverbatimdo ?detokenize有用吗?

% Sources : 
%   * http://forum.mathematex.net/latex-f6/forcer-le-retour-a-la-ligne-dans-texttt-t13246.html#p127511
%   * http://tex.stackexchange.com/questions/33465/changing-the-catcode-of-in-one-command

\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}

答案1

通常你先更改 catcode,然后读取参数。读取参数后直接关闭组并结束临时 catcode 更改:

\newcommand\breakabletexttt{%
    \begingroup
    \catcode`\_=12
    \@breabletexttt
}
\newcommand\@breabletexttt#1{%
    \endgroup
    % do something with #1 which now contains `_' with catcode 12
    % even if that catcode is now different again
}

通常情况下,您应将 catcode 更改的范围保持在最低限度。在这里,您也可以保持组开放。

\documentclass{article}

\makeatletter
\newcommand\breakabletexttt{%
    \begingroup
    \catcode`\_=12
    \@breakabletexttt
}
\newcommand\@breakabletexttt[1]{%
    \ttfamily
    \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

\verbverbatim使用存储在 中的列表\dospecials。它们定义中最复杂的部分是如何结束它们,这相当棘手,因为\并且}不再起作用。在简单的情况下,您可以简单地使用另一个字符]作为组的结尾:

\documentclass{article}

\usepackage[T1]{fontenc}

\begin{document}
{%a new endgroup char:
\catcode`\]=2
\makeatletter\let\do\@makeother \dospecials
_#{}\abc %
] %endgroup

\end{document}

listings据我所知,一开始就相当残酷地重置了几乎所有的 catcode。

相关内容