%  nolbreaks.sty  by Donald Arseneau
%  Public domain software -- please improve and submit to CTAN

\ProvidesPackage{nolbreaks}[2002/09/19 \space v 1.0 \space 
   - no linebreaks in text]

%  Use \nolbreaks{some text} to prevent linebreaks in "some text".
%  This has the advantage over \mbox{} that glue (rubber space) 
%  remains flexible.  It has the disadvantage of not working in 
%  all cases!  Most common cases are handled here (\linebreak is 
%  disabled, for example) but spaces hidden in macros or { }
%  can still create break-points.
%
%  Large pieces of text with no breaks can cause problems with
%  paragraph justification.  Giving the package option [ragged]
%  allows a line before the unbreakable text to be cut short.
%  
%  You should declare \sloppy in your document.

\let\nb@ragged\relax

\DeclareOption{ragged}{
  \def\nb@ragged{%
    \skip@\lastskip \unskip
    \nb@counter \lastpenalty
    \hskip \z@ plus 2cm\relax
    \penalty\nb@counter
    \advance\skip@ \z@ plus -2cm\relax
    \hskip\skip@
  }}
\ProcessOptions

\let\nb@@iwspace=\ %
\let\nb@@hskip=\hskip
\let\nb@@penalty=\penalty
\newcount\nb@counter
\ifx\langwohyphens\undefined
 \newlanguage\nb@lang
\else
 \let\nb@lang\langwohyphens
\fi

\DeclareRobustCommand{\nolbreaks}[1]{%
  \leavevmode
  \begingroup
    %  Apply flexible lead-in
    \nb@ragged
    %  Prevent hyphenation
    \language\nb@lang
    %  Disable commands that give breakpoints
    \let\ \nb@iwspace
    \let\hskip\nb@hskip
    \let\penalty\nb@penalty
    \let\language\nb@counter
    %  Prevent breaks in math
    \relpenalty\@M
    \binoppenalty\@M
    %  Prevent breaks at spaces (only outermost visible spaces)
    \@PreserveSpaces \@empty #1 \@PreserveSpaces
  \endgroup
}

\def\@PreserveSpaces#1 {#1\@ifnextchar\@PreserveSpaces{\@gobble}%
 {\@firstofone{\nb@@penalty\@M} \@PreserveSpaces\@empty}}

\def\nb@iwspace{\nb@@penalty\@M \nb@@iwspace}
\def\nb@hskip  {\nb@@penalty\@M \nb@@hskip}
\def\nb@penalty{\nb@@penalty\@M \nb@counter}
