Incompatibility of Row and TeXForm



Bug introduced in 9.0 and persisting through 11.0

Update: Since no one has been able to give a reason for this change in behavior or provide a solution I am tagging this as a bug. Please report it to Wolfram Support if this affects your use of Mathematica.

In Mathematica 7 Row and TeXForm work harmoniously:

{x^a, Sqrt@b, ArcSin[c]} // Row // TeXForm
x^a\sqrt{b}\sin ^{-1}(c)

As LaTeX:

$x^a\sqrt{b}\sin ^{-1}(c)$

Unfortunately this is broken in more recent versions. Mathematica 10 returns:

TeXForm::unspt: TeXForm of TemplateSlotSequence[1,] is not supported. >>

This error was reported in version 9 as well.

An attempt at a workaround is to substitute Grid for Row but the LaTeX code generated is different:

{{x^a, Sqrt@b, ArcSin[c]}} // Grid // TeXForm

enter image description here

And it formats differently:

$\begin{array}{ccc} x^a & \sqrt{b} & \sin ^{-1}(c) \\ \end{array}$

The documentation for TeXForm indicates that it is extensible with rules for Format but I could not find a rule that worked. While I can manually convert a single Row as follows:

StringJoin[ToString /@ TeXForm /@ {x^a, Sqrt@b, ArcSin[c]}]
x^a\sqrt{b}\sin ^{-1}(c)

(Though note that one must copy as Plain Text.)

However attempting to make this a Format rule results in double-conversion and I get this:

enter image description here

Is this indeed a bug as I believe?

What is the best work-around for the problem, preferably automatic?


Posted 2014-07-20T06:55:31.577

Reputation: 259 163

does this help (TeXForm /@ {x^a, Sqrt@b, ArcSin[c]}) // Row – Algohi – 2014-07-20T07:58:58.993

@Algohi Thanks, but not really. This is similar to my own attempt near the bottom and it still doesn't allow for automatic conversion where Row is part of a larger expression. – Mr.Wizard – 2014-07-20T08:20:10.457

So have you reported it again Mr.W? – Jacob Akkerboom – 2014-07-20T09:33:34.000

@Jacob No I have not. I was waiting to see what others had to say about this. – Mr.Wizard – 2014-07-20T09:42:10.490

@Mr. Wizard I usually use RowBox and DisplayForm to get LaTex code from MM. I don't know if it works in MM10, since I don't have one. TeXForm /@ {x^a, Sqrt@b, ArcSin[c]} // RowBox // DisplayForm – Putterboy – 2014-07-21T19:07:03.973



Short answer

The TLDR answer is:

System`Convert`CommonDump`templateBoxToDisplay = BoxForm`TemplateBoxToDisplayBoxes

A more long-winded answer follows.


The basic approach used by TeXForm is to create TraditionalForm boxes, and then to convert those boxes into a TeXForm string. The basic internal function that TeXForm uses to convert boxes into a string is System`Convert`TeXFormDump`maketex. For example, consider BesselJ[n, x]. The TraditionalForm boxes are:

MakeBoxes[BesselJ[n, x], TraditionalForm]

TemplateBox[{"n", "x"}, "BesselJ"]

Notice how System`Convert`TeXFormDump`maketex is used to convert the above boxes into a string:

    ToString[BesselJ[n, x], TeXForm],





By default, System`Convert`TeXFormDump`maketex uses System`Convert`CommonDump`ExpandTemplateBoxes to convert TemplateBox objects into normal boxes:







RowBox[{SubscriptBox["J", "n"], "(", "x", ")"}]

Summarizing, TeXForm does the following:

  1. Create TraditionalForm boxes
  2. Convert TemplateBox objects into normal boxes
  3. Convert normal boxes into a TeXForm string

The problem with Row

So, where do things go wrong with Row objects? In Mathematica version 7 and earlier, Row objects were formatted as RowBox objects directly, and so there was no need to convert TemplateBox objects into normal boxes. However, starting in versions 8 or 9, Row objects were formatted as TemplateBox objects. For example, in M9 (I don't have ready access to earlier versions):

MakeBoxes[Row[{x, y}], TraditionalForm]

TemplateBox[{"x", "y"}, "RowDefault"]

One possible fix for this issue is to restore the old functionality of formatting Row objects as normal boxes, and this is what the global variable BoxForm`$UseTemplateSlotSequenceForRow controls. I don't like this solution, as it means that Row objects will never use TemplateBox, which I think is a shame (I think TemplateBox offers both speed and memory advantages). Also, it only fixes one symptom of the issue, and not the underlying problem. So, let's figure out the underlying problem.


Here is the TemplateBox format for a Row object:

boxes = MakeBoxes[Row[{x, y}, None], TraditionalForm]

TemplateBox[{"x", "y"}, "RowNoSeparators"]

(I used a Row object with a separator for reasons I will explain later). These are the normal boxes that TeXForm creates for this TemplateBox:

    TemplateBox[{"x","y"}, "RowNoSeparators"]


Notice the appearance of a TemplateSlotSequence object. This kind of object is not supported by System`Convert`TeXFormDump`maketex. Also, just like other Slot objects, the TemplateSlotSequence object only has meaning when it is inside of a Function object, so the above output is not a valid form of normal boxes. This is the reason for the error that gets reported:

ToString[Row[{x, y}, None], TeXForm]

TeXForm::unspt: TeXForm of TemplateSlotSequence[1] is not supported.


Single argument Row

The above error doesn't happen for single argument Row because System`Convert`TeXFormDump`maketex was hacked to support it. Compare:

    System`Convert`TeXFormDump`maketex[TemplateBox[{"x", "y"}, "RowNoSeparators"]],



TeXForm::unspt: TeXForm of TemplateSlotSequence[1] is not supported.



    System`Convert`TeXFormDump`maketex[TemplateBox[{"x", "y"}, "RowDefault"]],


Notice that the "RowDefault" TemplateBox never gets processed by System`Convert`CommonDump`ExpandTemplateBoxes because System`Convert`TeXFormDump`maketex has a special DownValues for this case.

Non-Row TemplateSlotSequence issues

The failure to support TemplateSlotSequence is not restricted to Row objects. For example:

ToString[BellY[a, b, {c, d}], TeXForm]

TeXForm::unspt: TeXForm of TemplateSlotSequence[3,,] is not supported.


ToString[WignerD[{j, m1, m2}, \[Theta]], TeXForm]

TeXForm::unspt: TeXForm of TemplateSlotSequence[4,,] is not supported.


So, changing the formatting of Row so that it doesn't use a TemplateBox is not really sufficient, it won't fix the above errors.


The function used by TeXForm to convert TemplateBox objects into normal boxes is System`Convert`CommonDump`templateBoxToDisplay:

    System`Convert`CommonDump`ExpandTemplateBoxes[TemplateBox[{"x", "y"}, "RowNoSeparators"]],



Instead of using System`Convert`CommonDump`templateBoxToDisplay one could use BoxForm`TemplateBoxToDisplayBoxes:

template = TemplateBox[{"x","y"},"RowNoSeparators"];



RowBox[{"x", "y"}]

Note that the latter function produces acceptable boxes. I don't know why TeXForm uses its own custom function to convert TemplateBox objects. So, a simple fix is to redefine System`Convert`CommonDump`templateBoxToDisplay:

System`Convert`CommonDump`templateBoxToDisplay = BoxForm`TemplateBoxToDisplayBoxes;

Now, TeXForm will work properly with any object whose format uses a TemplateSlotSequence TemplateBox:

ToString[BellY[a, b, {c, d}], TeXForm] //OutputForm
ToString[WignerD[{j, m1, m2}, θ], TeXForm] //OutputForm
ToString[Row[{a, b}, ","], TeXForm] //OutputForm


$D_{\operatorname{m1},\operatorname{m2}}^j(0,\theta ,0)$


Carl Woll

Posted 2014-07-20T06:55:31.577

Reputation: 112 778

Thank you for such a deep analysis. I am going to bookmark this for later re-reading. One thing for now; you wrote: I think TemplateBox offers both speed and memory advantages – why would this be? – Mr.Wizard – 2018-09-23T11:54:05.010


The following works in Version and Version

BoxForm`$UseTemplateSlotSequenceForRow = False; 
{x^a, Sqrt@b,  ArcSin[c]} // Row // TeXForm
(* x^a\sqrt{b}\sin^{-1}(c) *)


Posted 2014-07-20T06:55:31.577

Reputation: 302 076

1What on Earth is that?! +1 :-) – Mr.Wizard – 2014-09-20T16:45:14.800

6@Mr.Wizard, it is something that show up when I used my whatOnEarthIs function: whatOnEarthIs = ToExpression["??*`*" ~~ ToString@# ~~ "*"] &; whatOnEarthIs@TemplateSlotSequence:) – kglr – 2014-09-20T17:49:51.223

This seems to restore the old behavior therefore I am Accepting it. Nevertheless I believe a bug remains in the current implementation as presumably TemplateSlotSequence is supposed to work and does not. – Mr.Wizard – 2014-09-21T11:08:43.373


TeXForm /@ {x^a, Sqrt@b, ArcSin[c]} // RowBox // DisplayForm

$x^a\sqrt{b}\sin ^{-1}(c)$


Posted 2014-07-20T06:55:31.577

Reputation: 4 491

This works for a single row, as does my own StringJoin method, but I still don't know how to use this for a larger expression that contains a Row. If I use this method (or mine) to convert (only) the Row subexpressions, then apply TeXForm to the entire expression, the output is wrong. I could try to do everything in pieces then assemble them but there are too many possibilities to make that robust. – Mr.Wizard – 2014-07-24T10:03:39.683


What do you think about the following substitutions?

expr = Row@{x^a, Sqrt@b, ArcSin[c]};

expr /. Row@{x__} :> HoldForm@Times@x // TeXForm

$ x^a \sqrt{b} \sin ^{-1}(c) $

expr2 = Row[{x^a, Sqrt@b, ArcSin[c]}, d];

expr2 /. Row[x_, y_] :> HoldForm@*Times @@ Riffle[x, y] // TeXForm

$ x^a d \sqrt{b} d \sin ^{-1}(c) $


Posted 2014-07-20T06:55:31.577

Reputation: 41 907

I haven't voted for this yet because I am unsure of Times being consistently formatted as a row. Could you comment on that? – Mr.Wizard – 2014-09-20T19:27:08.030

@Mr.Wizard As I understand now, not always :( For example, it add parenthesis for Row@{x+y,z}. Nothing can compete with incredible @kguler's solution. – ybeltukov – 2014-09-20T19:51:50.100