不久前我问过如何在 \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}
第二个示例显示所有添加的连字符点,以确保它们不位于::
大写字母之间。