When I choose something that looks like
$$ W_1(1)=\rho ^{5} \omega _1 \rho ^{-5}\\ W_2(2)=\rho ^{23} \omega _2 \rho ^{-23}\\ W_3(3)=\rho ^{10} \omega _3 \rho ^{-10}\\ W_4(4)=\rho ^{9} \omega _4 \rho ^{-9} $$
in Mathematica and select Copy As > LaTeX I get something entirely different:
$$ W_1(1)=\frac{\rho ^5 \omega _1}{\rho ^5}\\ W_2(2)=\frac{\rho ^{23} \omega _2}{\rho ^{23}}\\ W_3(3)=\frac{\rho ^{10} \omega _3}{\rho ^{10}}\\ W_4(4)=\frac{\rho ^9 \omega _4}{\rho ^9} $$
How do I prevent Mathematica from reformatting the expressions that I copy as LaTeX?
Answer
Unfortunately, the Mathematica's Copy As > LaTeX command is not (as you'd expect) a command that copies the selected expressions as LaTeX. Instead, it performs additional reformatting that can only be avoided by changing behavior of the relevant built-in function with:
System`FEDump`CopyAsTeXMakeBoxes = #&
Details
Why copied boxes are reformatted
Copy As > LaTeX command, under the hood, calls FrontEnd`CopyAsTeX
function.
If we spelunk it:
Import["https://raw.githubusercontent.com/szhorvat/Spelunking/master/Spelunking.m"]
Spelunk@FrontEnd`CopyAsTeX
we'll see it performs several steps. Relevant, for answer to this question, is call to System`FEDump`TransformBoxesToTraditionalFormBoxes
function. We can "discover" it using pop-up that appears after clicking on this function's name.
We'll see that, basically, it calls MakeExpression[..., "StandardForm"]
on given boxes, than passes resulting expression to System`FEDump`CopyAsTeXMakeBoxes
function, together with boxes. CopyAsTeXMakeBoxes
function calls MakeBoxes[..., "TraditionalForm"]
on given expression.
This is the place where reformatting occurs.
If we take expression from question and pass it, converted to boxes, to TransformBoxesToTraditionalFormBoxes
we'll get:
HoldForm[Equal[Subscript[W,1][1],Times[Power[ρ,5],Subscript[ω,1],Power[ρ,Times[-1,5]]]]] // MakeBoxes
System`FEDump`TransformBoxesToTraditionalFormBoxes[%]
(* TagBox[RowBox[{RowBox[{SubscriptBox[W,1],(,1,)}],==,FractionBox[RowBox[{SuperscriptBox[ρ,5], ,SubscriptBox[ω,1]}],SuperscriptBox[ρ,5]]}],HoldForm] *)
% // DisplayForm
$W_1(1)=\frac{\rho ^5 \omega _1}{\rho ^5}$
We see that HoldForm
TagBox
is still there. TransformBoxesToTraditionalFormBoxes
and CopyAsTeXMakeBoxes
are written in safe way, there's no evaluation leak. Expression created from boxes is wrapped with HoldComplete
and function applied to it has properly set HoldAllComplete
attribute. Reformatting is done purely by MakeBoxes
function.
TransformBoxesToTraditionalFormBoxes
was added in Mathematica version 9. Verison 8 copies expressions without reformatting.
How to change Copy As > LaTeX behavior
System`FEDump`CopyAsTeXMakeBoxes
takes two arguments first are (almost) original boxes, second is expression obtained from those boxes. Original boxes are returned when reconverting expression to boxes encounters any problems.
If we don't mind changing behavior of built-in function, we can force CopyAsTeXMakeBoxes
to always return unchanged boxes by setting:
System`FEDump`CopyAsTeXMakeBoxes = #&
Solution tested in Mathematica versions 9 and 10. Previous versions don't need it.
Comments
Post a Comment