如何在 \ttfamily 中的大写字母前使用连字符?

如何在 \ttfamily 中的大写字母前使用连字符?

不久前我问过如何在 \texttt 中的双冒号 (::) 之前允许换行?这个问题是关于扩展换行行为以包括连字符。

给出的解决方案解决了最初提出的问题:

\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
  {\normalfont\ttfamily \tl_use:N \l_spraff_cppstring_tl }
 }
\tl_new:N \l_spraff_cppstring_tl
\ExplSyntaxOff

(我对给定的解决方案做了一些调整,我使用\normalfont\ttfamily而不是\texttt因为这个问题

此解决方案并不总是适用于我的文档:

在此处输入图片描述

我认为在某些情况下允许使用连字符是一种改进。具体来说,在 CamelCase 名称中的大写字母之前。我希望允许使用连字符,例如:

lorem ipsum lorem ipsum lorem ipsum MyNamespaceName::SomeType::Nested-
Type::member_function

我想保留我已经拥有的双冒号前换行的行为。我如何扩展此\cppstring命令以在大写字母前加连字符?

我不知道连字规则的具体内容,但理想情况下这种情况会尽可能少发生——也就是说,只有当绘制一个过满的水平盒子时才会发生。尽量减少连字符是可取的,防止水平盒子过满是至关重要的。

答案1

添加替换,将<capital letter>前面没有单词边界的大写字母更改为\-<capital letter>

\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
  % change capital letter X to \-X
  \regex_replace_all:nnN { (\B[A-Z]) } { \c{-}\1 } \l_spraff_cppstring_tl
  % print the result
  {\normalfont\ttfamily \tl_use:N \l_spraff_cppstring_tl }
 }
\tl_new:N \l_spraff_cppstring_tl
\ExplSyntaxOff

\begin{document}

lorem ipsum lorem ipsum lorem ipsum
\cppstring{MyNamespaceName::SomeType::NestedType::member_function}

\bigskip

\parbox{0pt}{
lorem ipsum lorem ipsum lorem ipsum
\cppstring{MyNamespaceName::SomeType::NestedType::member_function}
}

\end{document}

第二个示例显示所有添加的连字符点,以确保它们不位于::大写字母之间。

在此处输入图片描述

相关内容