如何在 \texttt 中的双冒号 (::) 之前允许换行?

如何在 \texttt 中的双冒号 (::) 之前允许换行?

我使用\texttt标记代码。有时我会得到这样的行,这些行会溢出页面,因为 Latex 不会换行\texttt

放弃吧,动物们在劳动。功能std::ostream::traits_type::eq...

我想允许换行符::在其中一个之前发生,因此将上面的换行符改为这样是可以接受的:

放弃吧,动物们在劳动。这std::ostream

::traits_type::eq功能 ...

这个答案接近我想要的——它允许换行既定事实单身的角色——但我不知道该如何去适应它。

我如何编写会换行的内容但仅限:\texttt第一的 :在一个::

答案1

你可以稍微按摩一下琴弦:

\documentclass{article}
\usepackage{xparse,l3regex}

\ExplSyntaxOn
\NewDocumentCommand{\cppstring}{m}
 {
  \tl_set:Nn \l_spraff_cppstring_tl { #1 }
  % change _ to a printable underscore
  \regex_replace_all:nnN { _ } { \cO\_ } \l_spraff_cppstring_tl
  % change :: to \linebreak[0]::
  \regex_replace_all:nnN { :: } { \c{linebreak}[0]:: } \l_spraff_cppstring_tl
  % print the result
  \texttt{ \tl_use:N \l_spraff_cppstring_tl }
 }
\tl_new:N \l_spraff_cppstring_tl
\ExplSyntaxOff

\begin{document}

\noindent % just for the example
unrecoverable error occurs during the transformation, then a
\cppstring{std::ostream::traits_type::eq}

\end{document}

在此处输入图片描述

例如,可以通过\linebreak[0]仅在第一个之后执行来改进这一点::。最简单的方法是添加另一个替换

% remove the first \linebreak[0]
\regex_replace_once:nnN { \c{linebreak}\[0\] } {} \l_spraff_cppstring_tl

在打印结果之前。

请注意,与使角色活跃的策略不同,该命令\cppstring也可以作为其他命令的参数。

babel-french这对于对结肠进行特殊治疗也有好处。


这并没有起到什么作用。以下是带有文本的示例

lorem ipsum  lorem ipsum lorem ipsum  lorem ipsum lorem ipsum  lorem ipsum lorem ipsum  lorem ipsum lorem ipsum  lorem ipsum lorem ipsum  lorem ipsum lorem ipsum  lorem ipsum lorem ipsum  lorem ipsum lorem ipsum  lorem ipsum lorem ipsum  lorem ipsum lorem ipsum  lorem ipsum

\noindent % just for the example
unrecoverable error occurs during the transformation, then a
\cppstring{stdxxxxx::ostreamxxxxxx::traits_typexxxxx::eqxxxxxxx} lorem ipsum  lorem ipsum  lorem ipsum  lorem ipsum  lorem ipsum  lorem ipsum 

不会使段落对齐,因为::无法抓住第一次机会,因为它会在行中产生太宽的空格。

在紧急情况下,当重写不可能或不成功时,您可以使用sloppypar

lorem ipsum  lorem ipsum lorem ipsum  lorem ipsum lorem ipsum  lorem ipsum lorem ipsum  lorem ipsum lorem ipsum  lorem ipsum lorem ipsum  lorem ipsum lorem ipsum  lorem ipsum lorem ipsum  lorem ipsum lorem ipsum  lorem ipsum lorem ipsum  lorem ipsum lorem ipsum  lorem ipsum

\begin{sloppypar}
\noindent % just for the example
unrecoverable error occurs during the transformation, then a
\cppstring{stdxxxxx::ostreamxxxxxx::traits_typexxxxx::eqxxxxxxx} lorem ipsum  lorem ipsum  lorem ipsum  lorem ipsum  lorem ipsum  lorem ipsum 
\end{sloppypar}

在此处输入图片描述

答案2

从所引用问题的公认答案开始,我在这里另外使:active 并测试下一个字符是否为:。 如果是,我\allowbreak

\documentclass[a4paper]{article}
\let\svcolon:
\catcode`:=\active %
\makeatletter
\def:{\@ifnextchar:{\allowbreak\svcolon}{\svcolon}}
\makeatother
\catcode`:=12 %
\renewcommand\texttt{\catcode`:=\active \texttthelp}
\newcommand{\texttthelp}[1]{%
  \begingroup
  \ttfamily
  \begingroup\lccode`~=`/\lowercase{\endgroup\def~}{/\discretionary{}{}{}}%
  \begingroup\lccode`~=`[\lowercase{\endgroup\def~}{[\discretionary{}{}{}}%
  \begingroup\lccode`~=`.\lowercase{\endgroup\def~}{.\discretionary{}{}{}}%
  \catcode`/=\active\catcode`[=\active\catcode`.=\active
  \scantokens{#1\noexpand}%
  \endgroup
}
\usepackage{lipsum}
\begin{document}
\lipsum[4]

unrecoverable error occurs during the transformation, then a
\texttt{std::ostream::traits\_type::eq}

coverable error occurs during the transformation, then a
\texttt{std::ostream::traits\_type::eq}
\end{document}

在此处输入图片描述

相关内容