我使用一个宏来使用样式显示文本texttt
。目前这个宏非常基础。例如,如果我想使用字符_
,则必须更改其 catcode。
有没有一种巧妙的方法来转义所有特殊字符,如listing
和verbatim
do ?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
\verb
并verbatim
使用存储在 中的列表\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。