Skip to main content

symbols - TeXForm and Symbolize


I would like to use TeXForm to generate LaTeX output as usual. However, I use subscripted variables such as c_t. Unfortunately, when using Symbolize from the package Notation for this end, TeXForm does not work as expected. While I expected output such as c_t, I receive:


Needs["Notation`"];
Symbolize[ParsedBoxWrapper[SubscriptBox["_", "_"]]];
TeXForm[c_t]

\text{c$\mathsym{\UnderBracket}$Subscript$\mathsym{\UnderBracket}$t}.


Can anyone think of a better solution?


Thanks.



Answer




When you load Notation` package it automatically assigns definitions to MakeExpression and MakeBoxes function. Those definitions call NotationMakeExpression and NotationMakeBoxes functions respectively.


After symbolizing expression with a pattern, special definition is assigned to NotationMakeExpression function. This definition forces Mathematica to perform some tasks when expression, matching symbolized pattern, is encountered. A symbol, with name reflecting symbolized expression, is constructed, then special rules for this symbol are assigned to NotationMakeBoxes. These rules tell Mathematica what is box representation of constructed symbol in StandardForm.


Since only definitions for StandardForm are added, specially constructed symbol looks like symbolized expression in StandardForm and possibly other forms that use StandardForm boxes, but not in other forms.


TeXForm uses boxes from TraditionalForm not StandardForm. To solve your problem in general way for all symbolized subscripted expressions you could inspect NotationMakeBoxes definition and assign correct TraditionalForm to all symbols that have SubscriptBox assigned to StandardForm.


Let's define some functions that will do this automatically. We start with function that converts boxes in StandardForm to boxes in TraditionalForm:



SetAttributes[standardToTraditionalBoxes, HoldAllComplete]
standardToTraditionalBoxes[boxes_] :=
Function[expr, MakeBoxes[expr, TraditionalForm], HoldAllComplete] @@
MakeExpression[boxes, StandardForm]

Now a function converting NotationMakeBoxes down value to proper MakeBoxes definition for TraditionalForm:


addSubscriptTraditionalForm[
Verbatim[HoldPattern][
Verbatim[Condition][
Notation`NotationMakeBoxes[sym_Symbol, StandardForm],

_
]
] :>
SubscriptBox[x_, y_]
] := (
sym /: MakeBoxes[sym, TraditionalForm] =
SubscriptBox[standardToTraditionalBoxes[x],standardToTraditionalBoxes[y]]
)

And final function traversing down values:



updateSubscriptTraditionalForm[] := 
Scan[addSubscriptTraditionalForm, DownValues[Notation`NotationMakeBoxes]]

updateSubscriptTraditionalForm function should be evaluated after all symbolized expressions were read by Mathematica and before using TeXForm.


Small test


Load Notation` and symbolize all expressions with subscripts:


Needs["Notation`"]
Symbolize[ParsedBoxWrapper[SubscriptBox["_", "_"]]]

Now some strange test expression:




f[a + b]Sin[c]



in FullForm gives:


f\[UnderBracket]LeftBracket\[UnderBracket]a\[UnderBracket]Plus\[UnderBracket]b\[UnderBracket]RightBracket\[UnderBracket]Subscript\[UnderBracket]Sin\[UnderBracket]LeftBracket\[UnderBracket]c\[UnderBracket]RightBracket

in TeXForm, before evaluating updateSubscriptTraditionalForm, gives:


\text{f$\mathsym{\UnderBracket}$LeftBracket$\mathsym{\UnderBracket}$a$\mathsym{\UnderBracket}$Plus$\mathsym{\UnderBracket}$b$\mathsym{\UnderBracket}$RightBracket$\mathsym{\UnderBracket}$Subscript$\mathsym{\UnderBracket}$Sin$\mathsym{\UnderBracket}$LeftBracket$\mathsym{\UnderBracket}$c$\mathsym{\UnderBracket}$RightBracket}

and after updateSubscriptTraditionalForm evaluation, TeXForm gives:



f(a+b)_{\sin (c)}




After using Symbolize ct looks in FullForm like this:


c\[UnderBracket]Subscript\[UnderBracket]t

So result you're getting is a "correct" translation to TeX of above expression.


c\[UnderBracket]Subscript\[UnderBracket]t//TeXForm
(* \text{c$\mathsym{\UnderBracket}$Subscript$\mathsym{\UnderBracket}$t} *)


To get desired result you can add formatting rule to this expression using my TeXUtilities package.


Import["https://raw.githubusercontent.com/jkuczm/MathematicaTeXUtilities/master/NoInstall.m"]
Format[c\[UnderBracket]Subscript\[UnderBracket]t, TeXForm] = TeXVerbatim["c_t"];

c\[UnderBracket]Subscript\[UnderBracket]t//TeXForm
(* c_t *)

Comments

Popular posts from this blog

functions - Get leading series expansion term?

Given a function f[x] , I would like to have a function leadingSeries that returns just the leading term in the series around x=0 . For example: leadingSeries[(1/x + 2)/(4 + 1/x^2 + x)] x and leadingSeries[(1/x + 2 + (1 - 1/x^3)/4)/(4 + x)] -(1/(16 x^3)) Is there such a function in Mathematica? Or maybe one can implement it efficiently? EDIT I finally went with the following implementation, based on Carl Woll 's answer: lds[ex_,x_]:=( (ex/.x->(x+O[x]^2))/.SeriesData[U_,Z_,L_List,Mi_,Ma_,De_]:>SeriesData[U,Z,{L[[1]]},Mi,Mi+1,De]//Quiet//Normal) The advantage is, that this one also properly works with functions whose leading term is a constant: lds[Exp[x],x] 1 Answer Update 1 Updated to eliminate SeriesData and to not return additional terms Perhaps you could use: leadingSeries[expr_, x_] := Normal[expr /. x->(x+O[x]^2) /. a_List :> Take[a, 1]] Then for your examples: leadingSeries[(1/x + 2)/(4 + 1/x^2 + x), x] leadingSeries[Exp[x], x] leadingSeries[(1/x + 2 + (1 - 1/x...

How to thread a list

I have data in format data = {{a1, a2}, {b1, b2}, {c1, c2}, {d1, d2}} Tableform: I want to thread it to : tdata = {{{a1, b1}, {a2, b2}}, {{a1, c1}, {a2, c2}}, {{a1, d1}, {a2, d2}}} Tableform: And I would like to do better then pseudofunction[n_] := Transpose[{data2[[1]], data2[[n]]}]; SetAttributes[pseudofunction, Listable]; Range[2, 4] // pseudofunction Here is my benchmark data, where data3 is normal sample of real data. data3 = Drop[ExcelWorkBook[[Column1 ;; Column4]], None, 1]; data2 = {a #, b #, c #, d #} & /@ Range[1, 10^5]; data = RandomReal[{0, 1}, {10^6, 4}]; Here is my benchmark code kptnw[list_] := Transpose[{Table[First@#, {Length@# - 1}], Rest@#}, {3, 1, 2}] &@list kptnw2[list_] := Transpose[{ConstantArray[First@#, Length@# - 1], Rest@#}, {3, 1, 2}] &@list OleksandrR[list_] := Flatten[Outer[List, List@First[list], Rest[list], 1], {{2}, {1, 4}}] paradox2[list_] := Partition[Riffle[list[[1]], #], 2] & /@ Drop[list, 1] RM[list_] := FoldList[Transpose[{First@li...

front end - keyboard shortcut to invoke Insert new matrix

I frequently need to type in some matrices, and the menu command Insert > Table/Matrix > New... allows matrices with lines drawn between columns and rows, which is very helpful. I would like to make a keyboard shortcut for it, but cannot find the relevant frontend token command (4209405) for it. Since the FullForm[] and InputForm[] of matrices with lines drawn between rows and columns is the same as those without lines, it's hard to do this via 3rd party system-wide text expanders (e.g. autohotkey or atext on mac). How does one assign a keyboard shortcut for the menu item Insert > Table/Matrix > New... , preferably using only mathematica? Thanks! Answer In the MenuSetup.tr (for linux located in the $InstallationDirectory/SystemFiles/FrontEnd/TextResources/X/ directory), I changed the line MenuItem["&New...", "CreateGridBoxDialog"] to read MenuItem["&New...", "CreateGridBoxDialog", MenuKey["m", Modifiers-...