[texhax] Can't use \d (dot below) with \edef

Oleg Katsitadze olegkat at gmail.com
Thu Jun 21 11:04:06 CEST 2007

On Wed, Jun 20, 2007 at 01:52:28PM -0700, Wenlin Institute wrote:
> I'm copying \firstmark or \botmark or \splitbotmark, which  
> subsequently changes. I need to save the current value before it  
> changes.

Then the problem is (I suspect) in \mark's expansion of \d.  To avoid
that, you can use the trick with the toks registers:


Here, \mark will substitute the contents of \toks0, without any
further expansion.

You can save the marks like this:


or equivalently, but requiring a token register


Here again we avoid unnecessary expansion of the mark's contents.  If
you need more complex definition of \savedfirstmark, you can again use
the combination of \edef, \toks and \noexpand, for example:

  \edef\savedfirstmark{\noexpand\MacroNotToBeExpanded \the\toks0 \MacroToBeExpanded}%
                                 ^^^^^^^^^^^^^^^^^^^^  ^^^^^^^^^  ^^^^^^^^^^^^^^^^^
                                     no expansion      one-level    full expansion

Note the space after \toks0 -- this delimits the token register's
number and is removed from the input (doesn't make it into
\savedfirstmark's definition).  Without the space, if
\MacroToBeExpanded happens to start with a digit, that digit would
become part of the token register's number.

> In the meantime, I found a  
> workaround which was to redefine \d without \halign:
> \def\d#1{\leavevmode\setbox0=\hbox{#1}\dimen0=\wd0\setbox0=\hbox{.} 
> \advance\dimen0 by -\wd0
> 	\hbox{#1\raise-0.5ex\hbox to 0pt{\hss.\kern.5\dimen0}}}%

This works around this particular problem, but similar problems are
bound to crop up later on, so it's better to fix the cause of the

> Thank you also for your explanations

You're welcome :).


More information about the texhax mailing list