14

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

output of \overline{AW}

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?

Hendrik Vogt
  • 37,935

1 Answers1

3

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
\advance\@tempcntb-\@tempcnta
\uccode`\a\@tempcntb
\@tempcntb\@tempcnta
\divide\@tempcntb"1000
\multiply\@tempcntb"1000
\advance\@tempcnta-\@tempcntb
\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}
David Carlisle
  • 757,742
  • 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! – Ryan Reich Mar 17 '13 at 15:30