Skip to main content

bugs - How do I prevent Mathematica from reformatting the expressions that I copy as LaTeX?


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

Popular posts from this blog

plotting - Plot 4D data with color as 4th dimension

I have a list of 4D data (x position, y position, amplitude, wavelength). I want to plot x, y, and amplitude on a 3D plot and have the color of the points correspond to the wavelength. I have seen many examples using functions to define color but my wavelength cannot be expressed by an analytic function. Is there a simple way to do this? Answer Here a another possible way to visualize 4D data: data = Flatten[Table[{x, y, x^2 + y^2, Sin[x - y]}, {x, -Pi, Pi,Pi/10}, {y,-Pi,Pi, Pi/10}], 1]; You can use the function Point along with VertexColors . Now the points are places using the first three elements and the color is determined by the fourth. In this case I used Hue, but you can use whatever you prefer. Graphics3D[ Point[data[[All, 1 ;; 3]], VertexColors -> Hue /@ data[[All, 4]]], Axes -> True, BoxRatios -> {1, 1, 1/GoldenRatio}]

plotting - Filling between two spheres in SphericalPlot3D

Manipulate[ SphericalPlot3D[{1, 2 - n}, {θ, 0, Pi}, {ϕ, 0, 1.5 Pi}, Mesh -> None, PlotPoints -> 15, PlotRange -> {-2.2, 2.2}], {n, 0, 1}] I cant' seem to be able to make a filling between two spheres. I've already tried the obvious Filling -> {1 -> {2}} but Mathematica doesn't seem to like that option. Is there any easy way around this or ... Answer There is no built-in filling in SphericalPlot3D . One option is to use ParametricPlot3D to draw the surfaces between the two shells: Manipulate[ Show[SphericalPlot3D[{1, 2 - n}, {θ, 0, Pi}, {ϕ, 0, 1.5 Pi}, PlotPoints -> 15, PlotRange -> {-2.2, 2.2}], ParametricPlot3D[{ r {Sin[t] Cos[1.5 Pi], Sin[t] Sin[1.5 Pi], Cos[t]}, r {Sin[t] Cos[0 Pi], Sin[t] Sin[0 Pi], Cos[t]}}, {r, 1, 2 - n}, {t, 0, Pi}, PlotStyle -> Yellow, Mesh -> {2, 15}]], {n, 0, 1}]

plotting - Mathematica: 3D plot based on combined 2D graphs

I have several sigmoidal fits to 3 different datasets, with mean fit predictions plus the 95% confidence limits (not symmetrical around the mean) and the actual data. I would now like to show these different 2D plots projected in 3D as in but then using proper perspective. In the link here they give some solutions to combine the plots using isometric perspective, but I would like to use proper 3 point perspective. Any thoughts? Also any way to show the mean points per time point for each series plus or minus the standard error on the mean would be cool too, either using points+vertical bars, or using spheres plus tubes. Below are some test data and the fit function I am using. Note that I am working on a logit(proportion) scale and that the final vertical scale is Log10(percentage). (* some test data *) data = Table[Null, {i, 4}]; data[[1]] = {{1, -5.8}, {2, -5.4}, {3, -0.8}, {4, -0.2}, {5, 4.6}, {1, -6.4}, {2, -5.6}, {3, -0.7}, {4, 0.04}, {5, 1.0}, {1, -6.8}, {2, -4.7}, {3, -1....