How to customize the TeXForm output?

9

3

The following snippet

args = HoldForm[# Degree] & /@ Array[15 # &, 24, 0];
funcs = {Sin, Cos, Tan, Csc, Sec, Cot};
ques = RandomSample[#, 30] &@(#1@#2 & @@@ Tuples[{funcs, args}]);
# == ReleaseHold[#] & /@ ques // Column // TeXForm

will produce the following output.

\begin{array}{l}
 \tan (240 {}^{\circ})=\sqrt{3} \\
 \tan (180 {}^{\circ})=0 \\
 \sec (15 {}^{\circ})=\sqrt{2} \left(\sqrt{3}-1\right) \\
 \sin (240 {}^{\circ})=-\frac{\sqrt{3}}{2} \\
 \cot (15 {}^{\circ})=2+\sqrt{3} \\
 \tan (60 {}^{\circ})=\sqrt{3} \\
 \tan (75 {}^{\circ})=2+\sqrt{3} \\
 \sec (240 {}^{\circ})=-2 \\
 \cos (255 {}^{\circ})=-\frac{\sqrt{3}-1}{2 \sqrt{2}} \\
 \sec (285 {}^{\circ})=\sqrt{2} \left(1+\sqrt{3}\right) \\
 \sec (135 {}^{\circ})=-\sqrt{2} \\
 \csc (330 {}^{\circ})=-2 \\
 \tan (225 {}^{\circ})=1 \\
 \cos (315 {}^{\circ})=\frac{1}{\sqrt{2}} \\
 \tan (45 {}^{\circ})=1 \\
 \cos (30 {}^{\circ})=\frac{\sqrt{3}}{2} \\
 \sec (270 {}^{\circ})=\text{ComplexInfinity} \\
 \csc (225 {}^{\circ})=-\sqrt{2} \\
 \sec (300 {}^{\circ})=2 \\
 \cos (15 {}^{\circ})=\frac{1+\sqrt{3}}{2 \sqrt{2}} \\
 \cos (270 {}^{\circ})=0 \\
 \sin (165 {}^{\circ})=\frac{\sqrt{3}-1}{2 \sqrt{2}} \\
 \sin (255 {}^{\circ})=-\frac{1+\sqrt{3}}{2 \sqrt{2}} \\
 \csc (30 {}^{\circ})=2 \\
 \cot (105 {}^{\circ})=\sqrt{3}-2 \\
 \tan (270 {}^{\circ})=\text{ComplexInfinity} \\
 \sec (60 {}^{\circ})=2 \\
 \cos (300 {}^{\circ})=\frac{1}{2} \\
 \cot (285 {}^{\circ})=\sqrt{3}-2 \\
 \csc (135 {}^{\circ})=\sqrt{2} \\
\end{array}

When I render it with pdflatex I get the following output.

enter image description here

Question

I want to

  • remove the round brackets ()
  • replace {}^{\circ} with just ^\circ
  • replace ComplexInfinity with \infty

How to achieve these requirements?

Friendly Ghost

Posted 2018-08-22T08:06:40.147

Reputation: 337

Answers

8

Let us to some degree do the LaTeX conversion ourselves. To create \infty for complex infinity, you can implement your own function:

texForm[ComplexInfinity] := "\\infty";
texForm[arg_] := ToString[arg, TeXForm];

Re-using the expression form you have, we can write a small function that matches each part and create a TeX string manually, only using TeXForm for the numbers on the right side:

mkTex[arg : (f_[HoldForm[Times[n_, Degree]]])] := 
  StringTemplate["`f` `n`^\\circ = `eval`"]@Association[
    "f" -> "\\" <> ToLowerCase@SymbolName[f],
    "n" -> n,
    "eval" -> texForm[ReleaseHold[arg]]
  ];
mkTex[l_List] := "\\begin{array}{l}\n" <> StringRiffle[mkTex /@ l, " \\\\\n"] <> 
  "\n\\end{array}"

This gives the final string that you can directly export as TeX

args = HoldForm[# Degree] & /@ Array[15 # &, 24, 0];
funcs = {Sin, Cos, Tan, Csc, Sec, Cot};
ques = RandomSample[#, 30] &@(#1@#2 & @@@ Tuples[{funcs, args}]);
mkTex[ques]

Formatted as you wanted

\begin{array}{l}
\sec 30^\circ = \frac{2}{\sqrt{3}} \\
\cos 165^\circ = -\frac{1+\sqrt{3}}{2 \sqrt{2}} \\
\tan 330^\circ = -\frac{1}{\sqrt{3}} \\
\sin 150^\circ = \frac{1}{2} \\
\csc 165^\circ = \sqrt{2} \left(1+\sqrt{3}\right) \\
\cos 0^\circ = 1 \\
\tan 150^\circ = -\frac{1}{\sqrt{3}} \\
\tan 345^\circ = \sqrt{3}-2 \\
\cos 270^\circ = 0 \\
\cot 135^\circ = -1 \\
\tan 165^\circ = \sqrt{3}-2 \\
\sin 270^\circ = -1 \\
\cos 75^\circ = \frac{\sqrt{3}-1}{2 \sqrt{2}} \\
\cos 300^\circ = \frac{1}{2} \\
\sin 240^\circ = -\frac{\sqrt{3}}{2} \\
\csc 15^\circ = \sqrt{2} \left(1+\sqrt{3}\right) \\
\tan 300^\circ = -\sqrt{3} \\
\sin 195^\circ = -\frac{\sqrt{3}-1}{2 \sqrt{2}} \\
\tan 285^\circ = -2-\sqrt{3} \\
\sin 135^\circ = \frac{1}{\sqrt{2}} \\
\sec 300^\circ = 2 \\
\sin 15^\circ = \frac{\sqrt{3}-1}{2 \sqrt{2}} \\
\tan 270^\circ = \infty \\
\sin 75^\circ = \frac{1+\sqrt{3}}{2 \sqrt{2}} \\
\sin 90^\circ = 1 \\
\sin 0^\circ = 0 \\
\cos 15^\circ = \frac{1+\sqrt{3}}{2 \sqrt{2}} \\
\sec 195^\circ = -\sqrt{2} \left(\sqrt{3}-1\right) \\
\cot 165^\circ = -2-\sqrt{3} \\
\sin 255^\circ = -\frac{1+\sqrt{3}}{2 \sqrt{2}}
\end{array}

\begin{array}{l} \sec 30^\circ = \frac{2}{\sqrt{3}} \\ \cos 165^\circ = -\frac{1+\sqrt{3}}{2 \sqrt{2}} \\ \tan 330^\circ = -\frac{1}{\sqrt{3}} \\ \sin 150^\circ = \frac{1}{2} \\ \csc 165^\circ = \sqrt{2} \left(1+\sqrt{3}\right) \\ \cos 0^\circ = 1 \\ \tan 150^\circ = -\frac{1}{\sqrt{3}} \\ \tan 345^\circ = \sqrt{3}-2 \\ \cos 270^\circ = 0 \\ \cot 135^\circ = -1 \\ \tan 165^\circ = \sqrt{3}-2 \\ \sin 270^\circ = -1 \\ \cos 75^\circ = \frac{\sqrt{3}-1}{2 \sqrt{2}} \\ \cos 300^\circ = \frac{1}{2} \\ \sin 240^\circ = -\frac{\sqrt{3}}{2} \\ \csc 15^\circ = \sqrt{2} \left(1+\sqrt{3}\right) \\ \tan 300^\circ = -\sqrt{3} \\ \sin 195^\circ = -\frac{\sqrt{3}-1}{2 \sqrt{2}} \\ \tan 285^\circ = -2-\sqrt{3} \\ \sin 135^\circ = \frac{1}{\sqrt{2}} \\ \sec 300^\circ = 2 \\ \sin 15^\circ = \frac{\sqrt{3}-1}{2 \sqrt{2}} \\ \tan 270^\circ = \infty \\ \sin 75^\circ = \frac{1+\sqrt{3}}{2 \sqrt{2}} \\ \sin 90^\circ = 1 \\ \sin 0^\circ = 0 \\ \cos 15^\circ = \frac{1+\sqrt{3}}{2 \sqrt{2}} \\ \sec 195^\circ = -\sqrt{2} \left(\sqrt{3}-1\right) \\ \cot 165^\circ = -2-\sqrt{3} \\ \sin 255^\circ = -\frac{1+\sqrt{3}}{2 \sqrt{2}} \end{array}

halirutan

Posted 2018-08-22T08:06:40.147

Reputation: 109 574

I modified your code a little bit: mkTex[l_List] := StringRiffle[ mkTex /@ l, {"\\begin{enumerate}\n\t\\item $\\displaystyle ", "$\n\t\\item $\\displaystyle ", "$\n\\end{enumerate}"}]; – Friendly Ghost – 2018-08-22T15:37:21.027

3

You could use my TeXUtilities` package.

Define special TeXForm Format for relevant functions:

funcs = {Sin, Cos, Tan, Csc, Sec, Cot};

Import@"https://raw.githubusercontent.com/jkuczm/MathematicaTeXUtilities/master/NoInstall.m"

Unprotect@Evaluate@Append[funcs, DirectedInfinity];
With[{f = "\\" <> ToLowerCase@SymbolName@# <> " "},
  Format[#@HoldForm[x_ Degree], TeXForm] :=
    TeXVerbatim[f <> ToString[Unevaluated@x, TeXForm] <> "^\\circ"]
] & /@ funcs;
Format[ComplexInfinity, TeXForm] := ∞
Protect@Evaluate@Append[funcs, DirectedInfinity];

Now use TeXForm as usual:

args = HoldForm[# Degree] & /@ Array[15 # &, 24, 0];
SeedRandom@0
ques = RandomSample[#, 30] &@(#1@#2 & @@@ Tuples[{funcs, args}]);
# == ReleaseHold[#] & /@ ques // Column // TeXForm
\begin{array}{l}
 \sin 120^\circ=\frac{\sqrt{3}}{2} \\
 \cos 135^\circ=-\frac{1}{\sqrt{2}} \\
 \csc 240^\circ=-\frac{2}{\sqrt{3}} \\
 \cot 30^\circ=\sqrt{3} \\
 \cot 330^\circ=-\sqrt{3} \\
 \sin 210^\circ=-\frac{1}{2} \\
 \sec 15^\circ=\sqrt{2} \left(\sqrt{3}-1\right) \\
 \csc 345^\circ=-\sqrt{2} \left(1+\sqrt{3}\right) \\
 \cot 180^\circ=\infty  \\
 \csc 255^\circ=-\sqrt{2} \left(\sqrt{3}-1\right) \\
 \sin 225^\circ=-\frac{1}{\sqrt{2}} \\
 \sin 135^\circ=\frac{1}{\sqrt{2}} \\
 \tan 75^\circ=2+\sqrt{3} \\
 \sec 105^\circ=-\sqrt{2} \left(1+\sqrt{3}\right) \\
 \sec 135^\circ=-\sqrt{2} \\
 \cot 135^\circ=-1 \\
 \cos 120^\circ=-\frac{1}{2} \\
 \sec 285^\circ=\sqrt{2} \left(1+\sqrt{3}\right) \\
 \sin 270^\circ=-1 \\
 \cot 60^\circ=\frac{1}{\sqrt{3}} \\
 \cot 15^\circ=2+\sqrt{3} \\
 \sec 210^\circ=-\frac{2}{\sqrt{3}} \\
 \sin 195^\circ=-\frac{\sqrt{3}-1}{2 \sqrt{2}} \\
 \csc 195^\circ=-\sqrt{2} \left(1+\sqrt{3}\right) \\
 \cos 15^\circ=\frac{1+\sqrt{3}}{2 \sqrt{2}} \\
 \csc 315^\circ=-\sqrt{2} \\
 \sin 45^\circ=\frac{1}{\sqrt{2}} \\
 \sec 120^\circ=-2 \\
 \cos 300^\circ=\frac{1}{2} \\
 \csc 225^\circ=-\sqrt{2} \\
\end{array}

You can also define suitable formatting wrapper different than Column:

Format[enumerate@l_List, TeXForm] := TeXEnvironment[
  {"enumerate", "BodyConverter" -> Function[
    Null,
    "\\item $\\displaystyle " <> ToString[Unevaluated@#, TeXForm] <> "$",
    HoldAllComplete
  ]},
  Sequence @@ Unevaluated /@ l
]

# == ReleaseHold[#]& /@ ques // enumerate // TeXForm
\begin{enumerate}
    \item $\displaystyle \sin 120^\circ=\frac{\sqrt{3}}{2}$
    \item $\displaystyle \cos 135^\circ=-\frac{1}{\sqrt{2}}$
    \item $\displaystyle \csc 240^\circ=-\frac{2}{\sqrt{3}}$
    \item $\displaystyle \cot 30^\circ=\sqrt{3}$
    \item $\displaystyle \cot 330^\circ=-\sqrt{3}$
    \item $\displaystyle \sin 210^\circ=-\frac{1}{2}$
    \item $\displaystyle \sec 15^\circ=\sqrt{2} \left(\sqrt{3}-1\right)$
    \item $\displaystyle \csc 345^\circ=-\sqrt{2} \left(1+\sqrt{3}\right)$
    \item $\displaystyle \cot 180^\circ=\infty$
    \item $\displaystyle \csc 255^\circ=-\sqrt{2} \left(\sqrt{3}-1\right)$
    \item $\displaystyle \sin 225^\circ=-\frac{1}{\sqrt{2}}$
    \item $\displaystyle \sin 135^\circ=\frac{1}{\sqrt{2}}$
    \item $\displaystyle \tan 75^\circ=2+\sqrt{3}$
    \item $\displaystyle \sec 105^\circ=-\sqrt{2} \left(1+\sqrt{3}\right)$
    \item $\displaystyle \sec 135^\circ=-\sqrt{2}$
    \item $\displaystyle \cot 135^\circ=-1$
    \item $\displaystyle \cos 120^\circ=-\frac{1}{2}$
    \item $\displaystyle \sec 285^\circ=\sqrt{2} \left(1+\sqrt{3}\right)$
    \item $\displaystyle \sin 270^\circ=-1$
    \item $\displaystyle \cot 60^\circ=\frac{1}{\sqrt{3}}$
    \item $\displaystyle \cot 15^\circ=2+\sqrt{3}$
    \item $\displaystyle \sec 210^\circ=-\frac{2}{\sqrt{3}}$
    \item $\displaystyle \sin 195^\circ=-\frac{\sqrt{3}-1}{2 \sqrt{2}}$
    \item $\displaystyle \csc 195^\circ=-\sqrt{2} \left(1+\sqrt{3}\right)$
    \item $\displaystyle \cos 15^\circ=\frac{1+\sqrt{3}}{2 \sqrt{2}}$
    \item $\displaystyle \csc 315^\circ=-\sqrt{2}$
    \item $\displaystyle \sin 45^\circ=\frac{1}{\sqrt{2}}$
    \item $\displaystyle \sec 120^\circ=-2$
    \item $\displaystyle \cos 300^\circ=\frac{1}{2}$
    \item $\displaystyle \csc 225^\circ=-\sqrt{2}$
\end{enumerate}

jkuczm

Posted 2018-08-22T08:06:40.147

Reputation: 14 388

+1 But I prefer not to depend on any third party packages because dependency can potentially lead to problem in the future. – Friendly Ghost – 2018-08-23T00:58:12.293