When I compilethis MWE:

Test $x_\mathit{in}$

...it works perfectly with latex and pdflatex. If I try to use htlatex on it, it chokes:

! Argument of \new:mfont has an extra }.
<inserted text> 
l.7 Test $x_\mathit{

What am I doing wrong?

(BTW: if someone can point me to a comprehensive document about htlatex, please do... my google-fu is quite low today).

EDIT I discovered that if I write:


(with the extra set of braces) it works. But I am still wondering why...

This is standard (distribution-provided) full LaTeX installation in Ubuntu 14.04.

  • 3
    I guess it's a difference in the implementation of \mathit with tex4ht. While $x_\mathit{in}$ works in LaTeX, it's better to use $x_{\mathit{in}}$ anyway.
    – egreg
    Commented May 13, 2014 at 23:17
  • @egreg so it's basically a case of "doctor, it hurts if..." :-)
    – Rmano
    Commented May 13, 2014 at 23:33
  • 3
    the _\mathit{} form only works because of the rather weird parsing of the tex primitive, if you had a macro (or active character) that took an argument #1 then you wouldn't be able to go _\mathit{}` as #1 would just be \mathit tex4ht probably makes _ active so it can write the specials it needs in the conversion, so that makes it have the standard argument behaviour. Commented May 14, 2014 at 0:21
  • @DavidCarlisle I found that this is documented here: "6.2. Extra braces required. In short, when in doubt enclosed sub- and super- scripts in braces if they are longer than a single character. In this respect the syntax of the TeX language that is accepted by TeX4ht is stricter than that accepted by TeX and LaTeX. " (at stuff.mit.edu/afs/athena/system/i386_deb50/os-ubuntu-9.04/usr/… ) Thank to all for the comments.
    – Rmano
    Commented May 14, 2014 at 2:38

1 Answer 1



When tex4ht.sty is loaded, that is, during processing with htlatex, the character _ doesn't have category code 8 as usual in TeX, but category code 12 and it becomes “math active”, so that, when it is scanned in math mode, TeX considers it as if it were an active character, with the definition

->\ifmmode \expandafter \pr:sb \else \expandafter \sys:sb \fi .

So now \pr:sb remains, because we are in math mode (reserved macros of tex4ht.sty have colons in their names). Here's the definition:

\pr:sb ->\ifx \EndPicture \:UnDef \expandafter \Protect \expandafter \S:b \else
 \expandafter \s:b \fi 

In your case, \EndPicture (of which I ignore the function) is not defined, so what's substituted is \Protect\S:b and it's here where the problem begins. The macro \Protect is irrelevant in this case (it's similar to the usual \protect), and \S:b is

\S:b #1->\def \SuB: {#1}\futurelet \:temp \sub:sup 

OK, #1 is \mathit, so we have


I won't follow the processing any more: the idea is that what's stored in \SuB is what is to be subscripted, so you get the equivalent of


which is definitely wrong.

If \EndPicture is defined, \s:b would be used, which produces a normal _8` character and the compilation would proceed without errors; however, the output wouldn't be correct: “in” appears in smaller type, but not as a subscript.


Always use $x_{\mathit{in}}$. As explained in my answer to Why does `x_\text y` work?, the fact that $x_\mathit{in}$ works relies on the assumption that _ is the usual subscript character.

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .