![带换行符的彩色文本](https://linux22.com/image/335150/%E5%B8%A6%E6%8D%A2%E8%A1%8C%E7%AC%A6%E7%9A%84%E5%BD%A9%E8%89%B2%E6%96%87%E6%9C%AC.png)
冒着这个问题可能在某个地方已经解决的风险,但我就是找不到解决方案:我想在文本中突出显示 java 类名,为此我创建了一个宏\newcommand{\class}[1]{\textcolor{Green4}{\texttt{#1}}}
。但是当我使用例如\class{ALongClassName}
,并且文本比行的其余部分长时,文本会超出常规段落。当单词太长而无法放入当前所在的行时,我更喜欢在单词前自动换行。
我试过了\-\class{ALongClassName}
,但是万一出错,它会-
在行尾显示一个字符。有什么方法可以防止这种情况发生,或者有更好的方法来实现我需要的吗?
如有任何想法,我们将不胜感激,提前致谢。
答案1
\filbreak
(The TeXbook,第 111 页)的变体:
\documentclass{article}
\usepackage{xcolor}
\usepackage{showframe}
\newcommand{\class}[1]{%
\hfil\penalty0 \hfilneg
\textcolor{red}{\texttt{#1}}%
}
\begin{document}
Here is an example of long text given to class
\class{SomeVeryLongClassNameThatNeedsToBePushedToTheNextLine}
and text after it and a \class{ShortClassName}
这里有一个不同的建议:在大写字母处断开。这假定类名仅由 ASCII 字母组成。
\documentclass{article}
\usepackage{xcolor}
\usepackage{xparse}
\usepackage{showframe}
\ExplSyntaxOn
\NewDocumentCommand{\class}{m}
{
\textcolor{red}{\texttt{\lukelr_split_class:n { #1 }}}
}
\cs_new_protected:Nn \lukelr_split_class:n
{
\tl_map_inline:nn { #1 }
{
\int_compare:nT { \char_value_uccode:n { `##1 } =`##1 }
{ \discretionary{}{}{} }
##1
}
}
\ExplSyntaxOff
\begin{document}
Here is an example of long text given to class
\class{SomeVeryLongClassNameThatNeedsToBePushedToTheNextLine}
and text after it and a \class{ShortClassName}
\end{document}
代码将每个字符与其大写字母进行比较;如果它们相等,则在字符前添加一个空的自由变量,从而可以进行换行。
答案2
我认为该问题与此处描述的内容有关:如何在 \texttt 内自动连字符?将该解决方案应用到您的class
宏中将产生所需的结果:
笔记:
- 包裹
showframe
仅用于显示页边距。实际使用中不需要它。
代码:
\documentclass{article}
\usepackage{xcolor}
\usepackage{showframe}
\newcommand*{\EnableHyphenationInTexttt}{\hyphenchar\font=45\relax}% breakable \texttt
\newcommand{\classOld}[1]{\textcolor{red}{\texttt{#1}}}
\newcommand{\class}[1]{\textcolor{red}{\texttt{\EnableHyphenationInTexttt#1}}}
\begin{document}
Here is an example of long text given to class: \classOld{SomeVeryLongClassNameThatNeedsToWrapAcrossMultipleLines}
\medskip
Here is an example of long text given to class: \class{SomeVeryLongClassNameThatNeedsToWrapAcrossMultipleLines}
\end{document}