# Can one determine the first character of a given math list?

I'm still pursuing my quest to code a better \widebar command. I can do bars over single characters quite well already, but I have problems when it comes to letter combinations such as AW. \overline{AW} produces which doesn't look nice in my opinion: the bar extends too far to the left; it doesn't take the skew of the A into account.

To correct this, I must be able to find out the first character of the argument of my \widebar command. For AW this is easy, but I also would like to cover the following arguments:

1. \mathcal{AW} or \mathcal{A}W (where \mathcal{A} is the first character),
2. \sin x (where an upright s is the first character),
3. \mathchar"0141 (which is just the character A from the standard math font),
4. \left(a^2+b^2\right) (where some ( is the first character).

Maybe #4 is too tricky since a large ( might turn out to be a box and not a character. Of course, fractions and radicals shouldn't come up in the beginning of the argument; personally, I wouldn't want to overline such quantities.

So my question is: given a math list that starts with a character, can one find out what that first character is?

• you cant deconstruct a math list in classic tex, however you could grab the tokenlist and inspect it by hand, similar to the way bm deconstructs math expressions to build an equivalent bold version Sep 12, 2012 at 19:07
• @David: Thanks, I had already feared that one has to do it the hard way. Maybe one can hack into bm to solve the problem? Sep 12, 2012 at 19:16
• bm is a delicate thing, treat it with care if hacking..... Sep 12, 2012 at 19:20
• @David: OK :-) Sep 12, 2012 at 19:21

This is more or less bm reconstructed a bit. It produces

First letter A in \symsymbols
First letter A in \symsymbols
First letter s in \symoperators
First letter A in 1
First letter (


On the examples given in the question.

\documentclass{article}

\makeatletter
\def\firstchar#1{\begingroup%
\let\fcmathgroup\relax
\let\protect\@empty
\let\@typeset@protect\@empty
\let\mathop\@firstofone
\let\use@mathgroup\insert
\def\left##1{\ifx.##1\null\fi##1}%
\fc@expand#1\null\valign
\endgroup}

\def\fc@expand{\afterassignment\fc@exp@nd\count@\a}
\def\fc@exp@nd{\afterassignment\fc@test\count@\a}
\def\fc@test{\futurelet\@let@token\fc@test@}

\def\fc@test@{%
\let\fc@next\@empty
%\show\@let@token
\ifx\@let@token\relax
\let\fc@next\fc@gobble
\else\ifx\@let@token\bgroup
\let\fc@next\fc@group
\else\ifx\@let@token\use@mathgroup
\let\fc@next\fc@usemgroup
\else\ifx\@let@token\mathgroup
\let\fc@next\fc@mgroup
\else\ifx\@let@token\mathchar
\let\fc@next\fc@mathchar
\else
\let\fc@next\fc@show
\fi\fi\fi\fi\fi
\fc@next
}

\def\fc@show#1#2\valign{%
%\def\xshow{#1|||[#2]}\show\xshow
\typeout{First letter #1 %
\ifx\fcmathgroup\relax\else in \expandafter\string\fcmathgroup\fi
}
}

\def\fc@gobble#1{%
%\def\xgobble{#1}\show\xgobble
\fc@expand
}

\def\fc@group#1{%
%  \def\xgroup{#1}\show\xgroup
\fc@expand#1}

\def\fc@usemgroup#1#2#3#4{%
%  \def\xumathgroup{#1//#2//#3/#4}\show\xumathgroup
\def\fcmathgroup{#3}%
\fc@expand#4}

\def\fc@mgroup#1#2{%
%\def\xmathgroup{#1//#2}\show\xmathgroup
\def\fcmathgroup{#2}%
\fc@expand}

\def\fc@mathchar#1{%
\afterassignment\fc@mathchar@\count@}

\def\fc@mathchar@{%
\@tempcnta\count@
\@tempcntb\count@
\divide\@tempcnta"100
\multiply\@tempcnta"100
\uccode\a\@tempcntb
\@tempcntb\@tempcnta
\divide\@tempcntb"1000
\multiply\@tempcntb"1000
\divide\@tempcnta"100
\edef\fcmathgroup{\the\@tempcnta}%
\uppercase{\fc@expand a}}

\makeatother

\begin{document}

$a$

%\tracingall
$\firstchar{\mathcal{AW}}$

$\firstchar{\mathcal{A}W}$

$\firstchar{\sin x}$

$\firstchar{\mathchar"0141}$

$\firstchar{\left(a^2+b^2\right)}$
\end{document}

• The \fc@mathchar@ part is the best. I got to the end, having skimmed the big ugly TeX arithmetic part, and thought "but what if the character is given by its code?" And there it is: \uppercase{a}` gets a typesetting construct into the input. Clever! Mar 17, 2013 at 15:30