# [XeTeX] Mysterious nonzero lastskip

Ross Moore ross at ics.mq.edu.au
Wed Dec 2 00:59:50 CET 2009

> Dear all,
>
> Can you explain me the strange behaviour of this short TeX script:
>
> % -*- tex-command: "xelatex" -*-
> \documentclass{minimal}
> \usepackage{xltxtra}
>
> \let\dash—
> \catcode\—=\active
> \def—{\ifdim\lastskip>0pt\message{!!!}\showthe\lastskip\fi\dash}
>
> \begin{document}
> This is a test.—
> \end{document}
>
> In my case (XeTeX, Version 3.1415926-2.2-0.9994.1 (Web2C 7.5.6);
> xltxtra 2008/07/29 v0.4) it executes the TRUE clause of \if with
> message, but shows zero lastskip there.  But when I add a soft
> hyphen in "te\-st", \if condition changes to FALSE, hence no message.

I cannot give the definitive explanation, but here's something
that might be relevant, from those dim misty days when I did
a lot of low-level TeX programming.

Start your macro's expansion with \relax .
\def—{\relax\ifdim\lastskip...  }

The reason, as I understand it, is that the asynchronous nature
of the tasks that TeX performs internally mean that registers
and other special primitive constructs (such as \lastskip)
need not always be up-to-date with what you would expect,

By putting in \relax you allow the TeX internals time to
"catch up". Now your \if... conditionals will work as expected
when required to read the value of a register.

So although the TeX book says that \relax "does nothing",
this is not entirely true. (There are other places where
it can be important to have a \relax too.)

> Without xltxtra, no message in both cases (with or without soft
> hyphen).

I've checked that this indeed happens, but cannot explain why
it makes a difference. However,  xltxtra  causes several extensive
packages to be loaded, any one of which may have coding that affects
the value of \lastskip .

BTW, I'm not sure exactly what you have in mind for defining this
\dash  macro, but the TeXbook has a solution (6.6 on page 307),
which puts some flexible glue around the emdash character:

\def\extraspace{\nobreak\hskip 0pt plus.15em\relax}
\def\dash{\unskip\extraspace---\extraspace}

then this should work just fine.
Alternatively, you could use:
\def\dash{\unskip\extraspace\char 8212\extraspace}
provided you were confident that the font would have
an appropriate glyph.  (Or include a test to see whether
the glyph is in the current font.)

With these, you still want to do:

\catcode\—=\active
\let—\dash

to use the character to get the macro.

>

Hope this helps,

Ross

------------------------------------------------------------------------
Ross Moore                                       ross at maths.mq.edu.au
Mathematics Department                           office: E7A-419
Macquarie University                             tel: +61 (0)2 9850 8955
Sydney, Australia  2109                          fax: +61 (0)2 9850 8114
------------------------------------------------------------------------