7

The only non-breakable space command in ConTeXt that I know of is the tilde (~) command, but I'd like to have finer control over how long the non-breaking space will be. In LaTeX, I could accomplish this with \hspace*, but ConTeXt only offers the non-starred version of the command, and this produces a breakable space.

Does ConTeXt offer a non-breaking version of its \hspace command, or is there another preferred way of doing this in ConTeXt? I'd be content with temporarily modifying the width of the ~ space, but I'm also not sure how I might do that.

2
  • 2
    Are you familiar with \kern1cm, \kern5em, etc?
    – Mico
    Apr 15, 2020 at 3:23
  • I was not, so thanks for letting me know! Apr 15, 2020 at 12:08

1 Answer 1

9

You can use \kern as Mico suggested in a comment, however, that has the disadvantage, that it doesn't stretch or shrink.

To get a horizontal space that can't be broken around and that stretches and shrinks like interword space, you can use

\nobreak\hskip1em plus 1em minus .5em\nobreak 

However, that also doesn't fit well with the ConTeXt philosophy of first class Unicode support. Instead of specifying space manually, maybe have a look at all the predefined horizontal spaces in spac-chr.mkiv, which are natively supported by ConTeXt. The big advantage of those is that they properly export to XML and are copy-pastable from PDF. If they are breakable, it should be possible to just surround them with \nobreak like above.

Here is a shortened excerpt from spac-chr.mkiv:

\edef\nobreakspace            {\normalUchar"00A0} % space
\edef\softhyphen              {\normalUchar"00AD} % softhyohen
\edef\enquad                  {\normalUchar"2000} % quad/2
\edef\emquad                  {\normalUchar"2001} % quad

\let\ideographicspace         \enquad
\let\ideographichalffillspace \emquad

\edef\twoperemspace           {\normalUchar"2002} % quad/2
\edef\threeperemspace         {\normalUchar"2004} % quad/3
\edef\fourperemspace          {\normalUchar"2005} % quad/4
\edef\sixperemspace           {\normalUchar"2006} % quad/6
\edef\figurespace             {\normalUchar"2007} % width of zero
\edef\punctuationspace        {\normalUchar"2008} % width of period
\edef\breakablethinspace      {\normalUchar"2009} % quad/8
\edef\hairspace               {\normalUchar"200A} % quad/8
\edef\zerowidthspace          {\normalUchar"200B} % 0
\edef\zerowidthnonjoiner      {\normalUchar"200C} % 0
\edef\zerowidthjoiner         {\normalUchar"200D} % 0
\edef\narrownobreakspace      {\normalUchar"202F} % quad/8

\udef\zerowidthnobreakspace   {\penalty\plustenthousand\kern\zeropoint}
\udef\fiveperemspace          {\hskip\dimexpr\emwidth/5\relax}
1
  • Thank you for this thorough answer! It looks like \nobreak was the command I needed. I originally would've used something like \nobreak\hspace[medium] (and this works when I test it), but \nobreak\enquad creates a non-breaking space of the same width, and it does so with all the Unicode-related advantages you outlined above! Apr 15, 2020 at 12:14

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .