7
$\begingroup$

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

$\endgroup$
9
$\begingroup$

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.

$\endgroup$
  • $\begingroup$ 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? $\endgroup$ – HyperGroups Jun 30 '13 at 3:07
  • 1
    $\begingroup$ @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. $\endgroup$ – Mark McClure Jun 30 '13 at 3:58
  • $\begingroup$ Fine, I'll do more tests. Maybe because my country filtered some other countries' websites, such like wordpress...and more... so I cannot download. $\endgroup$ – HyperGroups Jun 30 '13 at 4:17
2
$\begingroup$

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}}}}}}}}}}$

$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.