8

Based on my old question Push long words in a new line, I search for a possibility to allow linebreak before a capital character in camel case terms.

For example the term createUnspecifiedNodeErrorMarker can be break into create-Unspecified-Node-Error-Marker.

\documentclass{scrartcl}

\begin{document}
\section{Test}
And another example the show must go on, but we have too less text (\textbf{createUnspecifiedNodeWarningMarker} and
\textbf{createUnspecifiedNodeErrorMarker}, sdjklashjksa \textbf{createUnspecifiedLinkWarningMarker} and
\textbf{createUnspecifiedLinkErrorMarker}).
\end{document}
  • 1
    Be (but only slightly) careful what you wish for. Compare: "StringRenderingEngine" with "String[space]RenderingEngine". If it splits in the wrong place you have ambiguity. – Brent.Longborough Aug 10 '12 at 8:18
  • You are right, I only want to use it in an seperate environment, not for the whole document. – CSchulz Aug 10 '12 at 8:48
8

TeX would linebreak (hyphenate) the camel case words, but perhaps not where you wish eg

cre-a-te-Un-spec-i-fiedNodeEr-ror-Marker

shows the default hyphenation points (using the default US English hyphenation)

It wasn't clear if you wanted hyphens at the break points. I have assumed not. If you do then change \penalty2 to \-.

enter image description here

This boxes the parts between capital letters so they don't break, and puts a small penalty before capitals so they can break.

As with anything using catcode changes (like \verb it will not work in the argument to another command)

\documentclass{scrartcl}

\showhyphens{createUnspecifiedNodeErrorMarker}

\makeatletter
\def\zzz{\leavevmode\begingroup
\let\ifcase\iftrue
\def\or##1{%
  \catcode`##1\active\uccode`\~`##1\uppercase{%
    \def~{\egroup\penalty2\hbox\bgroup\string##1}}}%
\@Alph{}%
\@zzz}

\def\@zzz#1{\textbf{\hbox\bgroup#1\egroup}\endgroup}
\makeatother

\begin{document}
\section{Test}


And another example the show must go on, but we have too less text (\zzz{createUnspecifiedNodeWarningMarker} and
\zzz{createUnspecifiedNodeErrorMarker}, sdjklashjksa \zzz{createUnspecifiedLinkWarningMarker} and
\zzz{createUnspecifiedLinkErrorMarker}).
\end{document}
  • Is there any possibility to use it within captions? – CSchulz Oct 17 '12 at 14:25
  • it's a fragile command so \protect\zzz should do the right thing, oh apart from the catcode change part :( – David Carlisle Oct 17 '12 at 14:32
  • I don't understand what you mean with "oh apart from the catcode change part :(" – CSchulz Oct 20 '12 at 13:42
  • But protect doesn't work with sections and so on, correct? – CSchulz Oct 20 '12 at 14:44
  • 1
    If one loads microtype there is a side effect: ! Package microtype Error: protrusion list cmr-OT1' cannot load itself.. One can avoid it by calling the bold font before it is used in the code (e.g. \AtBeginDocument{{\bfseries}}`) – Ulrike Fischer Nov 26 '15 at 14:27
2

An implementation in expl3 that also allows a (named) color as optional argument to \keyw:

\documentclass{article}
\usepackage{xcolor}
\usepackage{microtype}
\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand{\keyw}{O{.}m}
 {
  \textcolor{#1}{ \bfseries \cschulz_keyw:n { #2 } }
 }

\cs_new_protected:Nn \cschulz_keyw:n
 {
  \tl_map_inline:nn { #1 }
   {
    % if the current char is uppercase, add a discretionary hyphen
    \str_if_eq_x:nnT { ##1 } { \str_upper_case:n { ##1 } } 
     { \- }
    ##1
   }
 }
\ExplSyntaxOff

\begin{document}

\section{Test}

And another example the show must go on, but we have too less 
text (\keyw{createUnspecifiedNodeWarningMarker} sdjkle
\keyw{createUnspecifiedNodeErrorMarker}, sdjklashjksa 
\keyw{createUnspecifiedLinkWarningMarker} and
\keyw[red]{createUnspecifiedLinkErrorMarker}).

\end{document}

enter image description here

Expect several overfull boxes, anyway, as breaking only at capital letters is rather rigid.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.