## LATEX-L@LISTSERV.UNI-HEIDELBERG.DE

 Options: Use Forum View Use Proportional Font Show HTML Part by Default Condense Mail Headers Message: [<< First] [< Prev] [Next >] [Last >>] Topic: [<< First] [< Prev] [Next >] [Last >>] Author: [<< First] [< Prev] [Next >] [Last >>]

Frank,

following up an old email... :) but this is related closely to your recent email
on "LICR objects in math"

On Wed, 31 Jan 2001 20:35:31 +0100, Frank Mittelbach

>I wrote:
>
> > do you mind outlining the solution in a few sentences? how do you want
> > to be able to find out that you are not in math but will be once
> > something (eg tha actual letter) triggered the \halign u part without
> > actually triggering it (with something like \relax which kills
> > ligaturing)?
>
>but by now i got a chance to looked at it. quite a nice idea but i don't think
>it is fully correct yet. you change \if@mmode at each \halign thus an \halign
>that doesn't generate math mode cells will have this setting throughout, eg
>something like
>
>\begin{tabular}[t]{..}
>
>will have broken text inside, wouldn't it? or do i overlook something?

no, it would not have broken text, because \halign is redefined in the
following way:

\let\org@halign\halign
\DeclareRobustCommand\halign{\let\if@mmode\if@mmode@\org@halign}

and \if@mmode@ is defined like this:
\def\if@mmode@{\reset@if@mmode\ifmmode}
\DeclareRobustCommand\reset@if@mmode{\let\if@mmode\ifmmode}

so when you have \begin{tabular}[t]{..}, then the FIRST character inside the
cell
will execute \if@mmode@ which will reset \if@mmode to just \ifmmode, thus
preserving all ligatures!

i.e., each cell will at the beginning have \if@mmode defined as
\reset@if@mmode \ifmmode, but after the first inputenc-generated letter,
it will go to \ifmmode.

here's an example:

=======================================================================
\documentclass{article}
\usepackage{mathtext}
\usepackage[T2A]{fontenc}
\usepackage[koi8-r]{inputenc}
\begin{document}

\setbox0=\hbox{^^c7^^c4 ^^c7^^c4 ^^c7{}^^c4}
\showbox0

\begin{tabular}[t]{|c|c|}
\show\if@mmode
^^c7^^c4 ^^c7^^c4 ^^c7{}^^c4
\show\if@mmode&
\show\if@mmode
^^c7^^c4 ^^c7^^c4 ^^c7{}^^c4
\show\if@mmode
\\
\end{tabular}

\end{document}
=======================================================================

>assuming that the analysis is right, what follows is that instead of changing
>\halign internally you would have to change those uses of \halign where it is
>needed (only) and that cuts through all existing macros and isn't transparent
>ie you can't simply get it done by a single package or inclusion of code in
>the kernel you actually have to change every second use of \halign

there exists a SMALL probability that the kern will be broken only ONCE (for the
two characters) in the cell, but that can hallen only once per cell.
This will happen if the cell contents meets all these conditions:
1) there is a combination of 7-bit character followed
by 8-bit character, and there's a kern for them in a TFM file.
(note that for cyrillic texts, this is very rare - the word either consists
of all cyrillic letters, or all latin ones, not moxed - and there's usually
no kerning between cyrillic and latin letters)
2) there were no 8-bit characters in this cell before, i.e.
such 8-bit character preceeded by 7-bit one is the first occurrence of
8-bit char in the cell (kerns between all other characters in this cell
will be OK).

> > the approach used in the mathtext package proved to be stable enough:
> > i know a lot of people do use it for transparent' cyrillic letters in
> > math, and i did not hear about bug for a long time now. the mechanism
>
>you don't see the problem unless you look closely at kerning and ligatures
>(and you use fonts that have them) but it may be the case that this is
>sufficiently rare with the type of characters it is used so far. with latin
>fonts i guess this would become far more visible.

well, you are correct, - for latin fonts, there's usually a kern between
V and \'A, so so if the cell would include
some ascii letters ... V\'A other text
then the kern between V\'A would have been lost - but only for these two letters
in the cell - not any other!

this is demonstrated by the following example:

=======================================================================
\documentclass{article}
\usepackage{mathtext}
\usepackage[T1]{fontenc}
\usepackage[latin1]{inputenc}
\DeclareTextSymbol{\AGRAVE}{T1}{193}
\DeclareInputText{193}{\AGRAVE}
\begin{document}

\setbox0=\hbox{V^^c1 V^^c1 V{}^^c1}
\showbox0

\begin{tabular}[t]{|c|c|}
\show\if@mmode
V^^c1 V^^c1 V{}^^c1
\show\if@mmode&
\show\if@mmode
V^^c1 V^^c1 V{}^^c1
\show\if@mmode
\\
\end{tabular}

\end{document}
=======================================================================

you'll see the kern lost for the first V\'A combination in the cell,
but not for the second (and not for any other letter pairs in the cell).
(if it was a combination of accented letter PRECEEDING the non-accented
letter, then the kern would not have been lost)

I used
\DeclareTextSymbol{\AGRAVE}{T1}{193}
\DeclareInputText{193}{\AGRAVE}
in the above example because the mathtext package redefines only
the \DeclareTextSymbol command, but not the composite commands like \'A
(which were not needed for cyrillic, but can be supported too).

Well, the above example shows that there is indeed a possible problem with latin
texts - in some situations one kern in a cell may be lost.

But, i see a solution to this: we can redefine A FEW internal LaTeX commands
which build preambles for alignments to insert \reset@if@mmode in the
before the "#" - i.e. to make sure that \if@mmode will be reset to \ifmmode
before the first character in a cell is executed.

There are only a very small number of places where latex has (or builds)
the alignment preambles, so the changes would not be big...

(but for cyrillic letters, this is probably not needed at all, as mentioned
above)...

Best,
v.
`