4
$\begingroup$

When using ArcTan, the corresponding TeXForm is tan^{-1} and not \arctan which I would prefer for aesthetic reasons. How to fix that?

$\endgroup$
1

2 Answers 2

6
$\begingroup$

Using the code from my answer to Format and TeXForm does not work as expected (which I include at the bottom of this answer:

Format[ArcTan[x_], TeXForm] := arctan[x]

Then:

1 + ArcTan[x] //TeXForm

$\arctan (x)+1$

Here is the code:

Initial /: Verbatim[TagSetDelayed][Initial[sym_], lhs_, rhs_] := With[
    {
    new = Block[{sym},
        TagSetDelayed[sym, lhs, rhs];
        First @ Language`ExtendedDefinition[sym]
    ],
    protect = Unprotect[sym]
    },

    sym;
    Replace[new,
        Rule[values_, n:Except[{}]] :> (
            values[sym] = DeleteDuplicates@Join[n, values[sym]]
        ),
        {2}
    ];
    Protect@protect;
]

Initial[Convert`TeX`ExpressionToTeX] /: 
    Convert`TeX`ExpressionToTeX[e__] /; !TrueQ@$TeX := Block[
	{$TeX = True},
        Convert`TeX`ExpressionToTeX[e]
    ]

Initial[Format] /: TagSetDelayed[sym_Symbol, Verbatim[Format][x_, TeXForm], rhs_] := With[
    {fmt = TraditionalForm},

    Initial[sym] /: MakeBoxes[x, fmt] /; $TeX := MakeBoxes[rhs, fmt]
]

Initial[Format] /: SetDelayed[Verbatim[Format][x_, TeXForm], rhs_] := With[
    {s = getTagSymbol[Format[x, TeXForm]], fmt = TraditionalForm},
    Replace[s,
        HoldForm[tag_] :> (
            Initial[tag] /: MakeBoxes[x, fmt] /; $TeX := MakeBoxes[rhs, fmt]
        )
    ]
]

SetAttributes[getTagSymbol, HoldFirst]

getTagSymbol[Format[x_, TeXForm]] := Module[{dummy, t},
    extractTag[Hold[Message[Format::tag, HoldForm@Format, _, tag_], False]] := t = tag;
    Internal`HandlerBlock[{Message, extractTag},
        Quiet[dummy[1] /: Format[x, TeXForm] := 1]
    ];
    t
]

System`Convert`TeXFormDump`maketex[s_String] /; !StringMatchQ[s, "\""~~___~~"\""] && SyntaxQ[s, TeXForm] := Replace[
    s,
    {
        n_ /; StringMatchQ[n, NumberString] :> n,
        w_?wordQ :> "\\operatorname{"<>w<>"}"
    }
]

wordQ[s_String] := Length @ StringSplit[s, WordBoundary] == 1
$\endgroup$
1
  • $\begingroup$ Looks good but it changes my $\text$ blocks into $\operatorname$... $\endgroup$
    – Kutsubato
    May 31, 2019 at 7:55
4
$\begingroup$

Usually the simplest methods tend to be the best. Try the code

expr = ArcTan[x/y] - ArcTan[z/w];
StringReplace[ToString[expr, TeXForm], "\\tan ^{-1}" -> "\\arctan"]

which returns

\arctan\left(\frac{x}{y}\right)-\arctan\left(\frac{z}{w}\right)

and in display form is

$$ \arctan\left(\frac{x}{y}\right)-\arctan\left(\frac{z}{w}\right) $$

$\endgroup$
1
  • $\begingroup$ Should work but tends to be slow $\endgroup$
    – Kutsubato
    May 31, 2019 at 7:55

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

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