Convert Mathematica formula to TeX (MathJax) with color

7

4

I would like to customize TeXForm so that it includes color directives in the output. For example, here's a formula generated by TeXForm:

Nest[1 + 1/Style[#, Red] &, x, 5]

(*
    1+1/(1+1/(1+1/(1+1/(1+1/x))))
*)

TeXForm[%]

(*
    \frac{1}{\frac{1}{\frac{1}{\frac{1}{\frac{1}{x}+1}+1}+1}+1}+1
*)

Notice that color information has been lost.

MathJax supports color directives, as can be seen in other answers, for example

https://math.stackexchange.com/a/432154/76942

There are more examples. I think it's helpful to highlight the questionable parts of a formula with color when asking a question on Math.SE or Mathematica.SE, as in the above answer, reproduced below:

Hint: Consider the analytic formulas relating the $\color{#00A000}{\text{vertices}}$ , $\color{#C00000}{\text{midpoints}}$, and $\color{#0000FF}{\text{median}}$:

$\hspace{3.5cm}$enter image description here

HyperGroups

Posted 2013-06-29T07:19:49.223

Reputation: 7 917

Answers

9

The short answer is that, yes, it definitely is feasible. The most basic approach is to use the "BoxRules" option of Export[_,"TeX",___] to generate the TeX color commands. To do this with your example, we might use the following BoxRules function:

Clear[myBoxRule];
myBoxRule[s_String] := s;
myBoxRule[RowBox[stuff_List, ___]] := StringJoin[myBoxRule /@ stuff];
myBoxRule[FractionBox[numerator_String, denominator_]]  := 
  "\\frac{" <> numerator <> "}{" <> myBoxRule[denominator] <> "}";
myBoxRule[StyleBox[s_String, fColor_RGBColor, opts___]] := 
  "\\color[rgb]" <> latexColor[fColor] <> s <> "}";
myBoxRule[StyleBox[stuff_RowBox, fColor_RGBColor, opts___]] := 
  "\\color[rgb]" <> latexColor[fColor] <> myBoxRule[stuff] <> "}";

We can apply this to an example like yours as follows. (I modified your example a bit to emphasize the nested structure.)

SeedRandom[2];
expr = Nest[1 + 1/Style[#, 
   RGBColor[Random[], Random[], Random[]]] &, 
   x, 5];
ExportString[expr, "TeX", "UsePackages" -> {"color"}, "BoxRules" ->
  {box : (_StyleBox | _RowBox | _FractionBox) :> myBoxRule[box]}]

(* Out: 
%% AMS-LaTeX Created by Wolfram Mathematica 9.0 : www.wolfram.com

\documentclass{article}
\usepackage{color}

\newcommand{\mathsym}[1]{{}}
\newcommand{\unicode}[1]{{}}

\newcounter{mathematicapage}
\begin{document}

\[1+\frac{1}{\color[rgb]{0.902785,0.672727,0.419794}{1+\frac{1}{\color[rgb]{0.632356,0.0725195,0.251276}{1+\frac{1}{\color[rgb]{0.529257,0.0507012,0.74907}{1+\frac{1}{\color[rgb]{0.421515,0.512692,0.0228035}{1+\frac{1}{\color[rgb]{0.238705,0.844529,0.473928}{x}}}}}}}}}}\]

\end{document}
*)

The TeXed output looks like so:

enter image description here

This does not seem to work with MathJaX on this site. It's possible that the color package simply isn't installed.

Mark McClure

Posted 2013-06-29T07:19:49.223

Reputation: 31 084

Nice--! Bad thing is I cannot download your NB files. :( How about inline cells, This is good, ExportString[Sqrt[3],"TeX","BoxRules" -> {SqrtBox[x_]:>x<>"^(1/2)"}],but this is failed,ExportString[Cell[Sqrt[3]],"TeX","BoxRules" -> {SqrtBox[x_]:>x<>"^(1/2)"}], how to deal with this case? – HyperGroups – 2013-06-30T03:07:40.050

1@HyperGroups I just tested the links and they work as far as I can tell. Why can't you download them? I think your second ExportString doesn't work because you don't have a well formed Cell. ExportString[Cell[Sqrt[3]],"TeX"] fails to produce useful TeX as well, so it's not the BoxRules. The notebooks contain code that deal with this situation. – Mark McClure – 2013-06-30T03:58:01.790

Fine, I'll do more tests. Maybe because my country filtered some other countries' websites, such like wordpress...and more... so I cannot download. – HyperGroups – 2013-06-30T04:17:51.917

2

You can modify a TeXForm internal function to get color output. Here is a function that converts an RGBColor object into the equivalent hex string:

tohex[RGBColor[r_, g_, b_]] := StringJoin["#", IntegerString[Round[255 {r,g,b}], 16, 2]]

Then, modify an internal function:

System`Convert`TeXFormDump`maketex[StyleBox[boxes_, ___, rgb_RGBColor, ___]] := StringJoin[
    "\\color{", 
    tohex[rgb],
    "}{", 
    System`Convert`TeXFormDump`maketex[boxes],
    "}"
]

Now, using TeXForm with color works:

Style[Style[3, Blue]/Style[5, Green] + 2, Orange] //TeXForm

$\color{#ff8000}{\frac{\color{#0000ff}{3}}{\color{#00ff00}{5}}+2}$

Mark's example:

SeedRandom[2];
expr = Nest[1 + 1/Style[#, RGBColor[Random[], Random[], Random[]]] &, x, 5];
HoldForm @ Evaluate @ expr //TeXForm

$1+\frac{1}{\color{#e6ac6b}{1+\frac{1}{\color{#a11240}{1+\frac{1}{\color{#870dbf}{1+\frac{ 1}{\color{#6b8306}{1+\frac{1}{\color{#3dd779}{x}}}}}}}}}}$

Carl Woll

Posted 2013-06-29T07:19:49.223

Reputation: 112 778