我正在排版标识符文档,方法是从数据库生成标识符。这些标识符的格式非常自由,即使用驼峰式大小写和下划线等的混合。我想用打字机字体打印它们,并加连字符。
我在 TeX.SX 的帮助下成功打印了下划线标识符,非常感谢。
但是...连字符。我想允许在小写字母和大写字母之间以及 和 之后换行_
,-
并将普通连字符替换为另一个字符(\cdot
很好,但这不是 中的字符T1
),以防止后一种情况的歧义。
我想保留原始的连字符点(在我的示例中,这对于字符串“修改”很有用)。我想在数字之前或之后断开不需要特殊处理。
以下是我当前\identifier
命令的一个示例,该命令不添加额外的连字符点。我对它的理解不够深入,无法混入来自例如的代码自动打破驼峰式命名法不过 - 有人可以帮我尝试一下吗?
\documentclass{article}
\usepackage[T1]{fontenc} % better underscore
\usepackage[htt]{hyphenat}
\makeatletter%
\DeclareRobustCommand*{\identifier}[1]{%
\begingroup\@activeus\scantokens{%
\ifmmode%
\expandafter\texttt%
\else%
\expandafter\textnhtt%
\fi{#1}%
\endinput}\endgroup}%
\begingroup\lccode`\~=`\_\relax
\lowercase{\endgroup\def\@activeus{\catcode`\_=\active \let~\_}}
\makeatother
\begin{document}
\parbox{0pt}{\hspace{0pt}%
\identifier{SmartModificationSense}
\identifier{SmartModification_Sense}
\identifier{Smart_Modification_Sense2}
\identifier{smartModification_Sense2}
\identifier{smartModi-fication_Sense2}
\identifier{adj_Iref3_5percent}
\identifier{enable_SPI_1}
}
\end{document}
答案1
如果标识符在大写字母之前(前面没有另一个大写字母)或下划线之后拆分,则会添加一个居中点,并允许在单词片段中进行正常连字符连接。
\documentclass{article}
\usepackage[T1]{fontenc} % better underscore
\usepackage[htt]{hyphenat}
\usepackage{xparse,l3regex}
\ExplSyntaxOn
\NewDocumentCommand{\identifier}{m}
{
\cmarqu_identifier:n { #1 }
}
\tl_new:N \l_cmarqu_identifier_tl
\cs_new:Nn \cmarqu_identifier:n
{
\tl_set:Nn \l_cmarqu_identifier_tl { #1 }
\regex_replace_all:nnN
{ \B([^A-Z])([A-Z]) }
{ \1 \c{cmarqu_period:} \2 }
\l_cmarqu_identifier_tl
\regex_replace_all:nnN
{ \cD.}
{ \cO_\c{cmarqu_period:} }
\l_cmarqu_identifier_tl
\regex_replace_all:nnN
{ \c{cmarqu_period:}\c{cmarqu_period:} }
{ \c{cmarqu_period:} }
\l_cmarqu_identifier_tl
\texttt{\tl_use:N \l_cmarqu_identifier_tl}
}
\cs_new:Nn \cmarqu_period:
{
\nobreak
\discretionary{\textperiodcentered}{}{}
\nobreak\hspace{0pt}
}
\ExplSyntaxOff
\begin{document}
\parbox{0pt}{\hspace{0pt}%
\identifier{SmartModificationSense}
\identifier{SmartModification_Sense}
\identifier{Smart_Modification_Sense2}
\identifier{smartModification_Sense2}
\identifier{smartModification_Sense2}
\identifier{adj_Iref3_5percent}
\identifier{enable_SPI_1}
}
\end{document}