reanimate/reanimate-1.1.0.0-inplace/Reanimate.LaTeX.hs.html
2020-10-08 07:40:21 +00:00

424 lines
37 KiB
HTML

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<style type="text/css">
span.lineno { color: white; background: #aaaaaa; border-right: solid white 12px }
span.nottickedoff { background: yellow}
span.istickedoff { background: white }
span.tickonlyfalse { margin: -1px; border: 1px solid #f20913; background: #f20913 }
span.tickonlytrue { margin: -1px; border: 1px solid #60de51; background: #60de51 }
span.funcount { font-size: small; color: orange; z-index: 2; position: absolute; right: 20 }
span.decl { font-weight: bold }
span.spaces { background: white }
</style>
</head>
<body>
<pre>
<span class="decl"><span class="nottickedoff">never executed</span> <span class="tickonlytrue">always true</span> <span class="tickonlyfalse">always false</span></span>
</pre>
<pre>
<span class="lineno"> 1 </span>{-# LANGUAGE DeriveAnyClass #-}
<span class="lineno"> 2 </span>{-# LANGUAGE DeriveGeneric #-}
<span class="lineno"> 3 </span>{-# LANGUAGE OverloadedStrings #-}
<span class="lineno"> 4 </span>{-# LANGUAGE PatternSynonyms #-}
<span class="lineno"> 5 </span>{-# LANGUAGE ScopedTypeVariables #-}
<span class="lineno"> 6 </span>
<span class="lineno"> 7 </span>-- |
<span class="lineno"> 8 </span>-- Copyright : Written by David Himmelstrup
<span class="lineno"> 9 </span>-- License : Unlicense
<span class="lineno"> 10 </span>-- Maintainer : lemmih@gmail.com
<span class="lineno"> 11 </span>-- Stability : experimental
<span class="lineno"> 12 </span>-- Portability : POSIX
<span class="lineno"> 13 </span>module Reanimate.LaTeX
<span class="lineno"> 14 </span> ( latexCfg,
<span class="lineno"> 15 </span> TexEngine (..),
<span class="lineno"> 16 </span> TexConfig (..),
<span class="lineno"> 17 </span> latex,
<span class="lineno"> 18 </span> latexWithHeaders,
<span class="lineno"> 19 </span> latexChunks,
<span class="lineno"> 20 </span> xelatex,
<span class="lineno"> 21 </span> xelatexWithHeaders,
<span class="lineno"> 22 </span> ctex,
<span class="lineno"> 23 </span> ctexWithHeaders,
<span class="lineno"> 24 </span> latexAlign,
<span class="lineno"> 25 </span>
<span class="lineno"> 26 </span> -- * Font configurations
<span class="lineno"> 27 </span> chalkduster,
<span class="lineno"> 28 </span> calligra,
<span class="lineno"> 29 </span> noto,
<span class="lineno"> 30 </span> helvet,
<span class="lineno"> 31 </span> libertine,
<span class="lineno"> 32 </span> biolinum,
<span class="lineno"> 33 </span> droidSerif,
<span class="lineno"> 34 </span> droidSans,
<span class="lineno"> 35 </span> )
<span class="lineno"> 36 </span>where
<span class="lineno"> 37 </span>
<span class="lineno"> 38 </span>import Control.Lens
<span class="lineno"> 39 </span>import qualified Data.ByteString as B
<span class="lineno"> 40 </span>import Data.Hashable
<span class="lineno"> 41 </span>import Data.Monoid
<span class="lineno"> 42 </span>import Data.Text (Text)
<span class="lineno"> 43 </span>import qualified Data.Text as T
<span class="lineno"> 44 </span>import qualified Data.Text.Encoding as T
<span class="lineno"> 45 </span>import GHC.Generics (Generic)
<span class="lineno"> 46 </span>import Graphics.SvgTree
<span class="lineno"> 47 </span> ( Tree,
<span class="lineno"> 48 </span> clipPathRef,
<span class="lineno"> 49 </span> clipRule,
<span class="lineno"> 50 </span> mapTree,
<span class="lineno"> 51 </span> parseSvgFile,
<span class="lineno"> 52 </span> strokeColor,
<span class="lineno"> 53 </span> pattern ClipPathTree,
<span class="lineno"> 54 </span> pattern None,
<span class="lineno"> 55 </span> )
<span class="lineno"> 56 </span>import Reanimate.Animation (SVG)
<span class="lineno"> 57 </span>import Reanimate.Cache
<span class="lineno"> 58 </span>import Reanimate.External
<span class="lineno"> 59 </span>import Reanimate.Misc
<span class="lineno"> 60 </span>import Reanimate.Parameters
<span class="lineno"> 61 </span>import Reanimate.Svg
<span class="lineno"> 62 </span>import System.FilePath
<span class="lineno"> 63 </span> ( replaceExtension,
<span class="lineno"> 64 </span> takeFileName,
<span class="lineno"> 65 </span> (&lt;/&gt;),
<span class="lineno"> 66 </span> )
<span class="lineno"> 67 </span>import System.IO.Unsafe (unsafePerformIO)
<span class="lineno"> 68 </span>
<span class="lineno"> 69 </span>-- | TeX backends. They have different features and capabilities.
<span class="lineno"> 70 </span>data TexEngine = LaTeX | XeLaTeX | LuaLaTeX
<span class="lineno"> 71 </span> deriving (Generic, Hashable, <span class="decl"><span class="nottickedoff">Eq</span></span>, <span class="decl"><span class="nottickedoff"><span class="decl"><span class="nottickedoff"><span class="decl"><span class="nottickedoff"><span class="decl"><span class="nottickedoff"><span class="decl"><span class="nottickedoff">Ord</span></span></span></span></span></span></span></span></span></span>, <span class="decl"><span class="nottickedoff"><span class="decl"><span class="nottickedoff"><span class="decl"><span class="nottickedoff">Read</span></span></span></span></span></span>, <span class="decl"><span class="nottickedoff">Show</span></span>)
<span class="lineno"> 72 </span>
<span class="lineno"> 73 </span>-- | TeX configurations can load packages and set up environments for tex scripts.
<span class="lineno"> 74 </span>data TexConfig = TexConfig
<span class="lineno"> 75 </span> { <span class="nottickedoff"><span class="decl"><span class="nottickedoff">texConfigEngine</span></span></span> :: TexEngine,
<span class="lineno"> 76 </span> <span class="nottickedoff"><span class="decl"><span class="nottickedoff">texConfigHeaders</span></span></span> :: [T.Text],
<span class="lineno"> 77 </span> <span class="nottickedoff"><span class="decl"><span class="nottickedoff">texConfigPostScript</span></span></span> :: [T.Text]
<span class="lineno"> 78 </span> }
<span class="lineno"> 79 </span> deriving (Generic, Hashable, <span class="decl"><span class="nottickedoff"><span class="decl"><span class="nottickedoff"><span class="decl"><span class="nottickedoff">Read</span></span></span></span></span></span>, <span class="decl"><span class="nottickedoff">Show</span></span>, <span class="decl"><span class="nottickedoff">Eq</span></span>, <span class="decl"><span class="nottickedoff"><span class="decl"><span class="nottickedoff"><span class="decl"><span class="nottickedoff"><span class="decl"><span class="nottickedoff"><span class="decl"><span class="nottickedoff">Ord</span></span></span></span></span></span></span></span></span></span>)
<span class="lineno"> 80 </span>
<span class="lineno"> 81 </span>-- | Render TeX script using a given configuration.
<span class="lineno"> 82 </span>latexCfg :: TexConfig -&gt; T.Text -&gt; SVG
<span class="lineno"> 83 </span><span class="decl"><span class="nottickedoff">latexCfg (TexConfig engine headers postscript) =</span>
<span class="lineno"> 84 </span><span class="spaces"> </span><span class="nottickedoff">gen headers postscript</span>
<span class="lineno"> 85 </span><span class="spaces"> </span><span class="nottickedoff">where</span>
<span class="lineno"> 86 </span><span class="spaces"> </span><span class="nottickedoff">gen =</span>
<span class="lineno"> 87 </span><span class="spaces"> </span><span class="nottickedoff">case engine of</span>
<span class="lineno"> 88 </span><span class="spaces"> </span><span class="nottickedoff">LaTeX -&gt; someTexWithHeaders engine &quot;latex&quot; &quot;dvi&quot; []</span>
<span class="lineno"> 89 </span><span class="spaces"> </span><span class="nottickedoff">XeLaTeX -&gt; someTexWithHeaders engine &quot;xelatex&quot; &quot;xdv&quot; [&quot;-no-pdf&quot;]</span>
<span class="lineno"> 90 </span><span class="spaces"> </span><span class="nottickedoff">LuaLaTeX -&gt; someTexWithHeaders engine &quot;lualatex&quot; &quot;pdf&quot; []</span></span>
<span class="lineno"> 91 </span>
<span class="lineno"> 92 </span>-- | Invoke latex and import the result as an SVG object. SVG objects are
<span class="lineno"> 93 </span>-- cached to improve performance.
<span class="lineno"> 94 </span>--
<span class="lineno"> 95 </span>-- Example:
<span class="lineno"> 96 </span>--
<span class="lineno"> 97 </span>-- &gt; latex &quot;$e^{i\\pi}+1=0$&quot;
<span class="lineno"> 98 </span>--
<span class="lineno"> 99 </span>-- &lt;&lt;docs/gifs/doc_latex.gif&gt;&gt;
<span class="lineno"> 100 </span>latex :: T.Text -&gt; Tree
<span class="lineno"> 101 </span><span class="decl"><span class="istickedoff">latex = latexWithHeaders <span class="nottickedoff">[]</span></span></span>
<span class="lineno"> 102 </span>
<span class="lineno"> 103 </span>-- | Invoke latex with extra script headers.
<span class="lineno"> 104 </span>latexWithHeaders :: [T.Text] -&gt; T.Text -&gt; Tree
<span class="lineno"> 105 </span><span class="decl"><span class="istickedoff">latexWithHeaders = someTexWithHeaders <span class="nottickedoff">LaTeX</span> <span class="nottickedoff">&quot;latex&quot;</span> <span class="nottickedoff">&quot;dvi&quot;</span> <span class="nottickedoff">[]</span> <span class="nottickedoff">[]</span></span></span>
<span class="lineno"> 106 </span>
<span class="lineno"> 107 </span>someTexWithHeaders ::
<span class="lineno"> 108 </span> TexEngine -&gt;
<span class="lineno"> 109 </span> String -&gt;
<span class="lineno"> 110 </span> String -&gt;
<span class="lineno"> 111 </span> [String] -&gt;
<span class="lineno"> 112 </span> [T.Text] -&gt;
<span class="lineno"> 113 </span> [T.Text] -&gt;
<span class="lineno"> 114 </span> T.Text -&gt;
<span class="lineno"> 115 </span> Tree
<span class="lineno"> 116 </span><span class="decl"><span class="istickedoff">someTexWithHeaders _engine _exec _dvi _args _headers _postscript tex</span>
<span class="lineno"> 117 </span><span class="spaces"> </span><span class="istickedoff">| <span class="tickonlytrue">pNoExternals</span> = mkText tex</span>
<span class="lineno"> 118 </span><span class="spaces"></span><span class="istickedoff">someTexWithHeaders engine exec dvi args headers postscript tex =</span>
<span class="lineno"> 119 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">(unsafePerformIO . (cacheMem . cacheDiskSvg) (latexToSVG engine dvi exec args))</span></span>
<span class="lineno"> 120 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">script</span></span>
<span class="lineno"> 121 </span><span class="spaces"> </span><span class="istickedoff">where</span>
<span class="lineno"> 122 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">script = mkTexScript exec args headers (T.unlines (postscript ++ [tex]))</span></span></span>
<span class="lineno"> 123 </span>
<span class="lineno"> 124 </span>-- | Invoke latex and separate results.
<span class="lineno"> 125 </span>latexChunks :: [T.Text] -&gt; [Tree]
<span class="lineno"> 126 </span><span class="decl"><span class="nottickedoff">latexChunks chunks | pNoExternals = map mkText chunks</span>
<span class="lineno"> 127 </span><span class="spaces"></span><span class="nottickedoff">latexChunks chunks = worker (svgGlyphs $ latex $ T.concat chunks) chunks</span>
<span class="lineno"> 128 </span><span class="spaces"> </span><span class="nottickedoff">where</span>
<span class="lineno"> 129 </span><span class="spaces"> </span><span class="nottickedoff">merge lst = mkGroup [fmt svg | (fmt, _, svg) &lt;- lst]</span>
<span class="lineno"> 130 </span><span class="spaces"> </span><span class="nottickedoff">worker [] [] = []</span>
<span class="lineno"> 131 </span><span class="spaces"> </span><span class="nottickedoff">worker _ [] = error &quot;latex chunk mismatch&quot;</span>
<span class="lineno"> 132 </span><span class="spaces"> </span><span class="nottickedoff">worker everything (x : xs) =</span>
<span class="lineno"> 133 </span><span class="spaces"> </span><span class="nottickedoff">let width = length $ svgGlyphs (latex x)</span>
<span class="lineno"> 134 </span><span class="spaces"> </span><span class="nottickedoff">in merge (take width everything) : worker (drop width everything) xs</span></span>
<span class="lineno"> 135 </span>
<span class="lineno"> 136 </span>-- | Invoke xelatex and import the result as an SVG object. SVG objects are
<span class="lineno"> 137 </span>-- cached to improve performance. Xelatex has support for non-western scripts.
<span class="lineno"> 138 </span>xelatex :: Text -&gt; Tree
<span class="lineno"> 139 </span><span class="decl"><span class="nottickedoff">xelatex = xelatexWithHeaders []</span></span>
<span class="lineno"> 140 </span>
<span class="lineno"> 141 </span>-- | Invoke xelatex with extra script headers.
<span class="lineno"> 142 </span>xelatexWithHeaders :: [T.Text] -&gt; T.Text -&gt; Tree
<span class="lineno"> 143 </span><span class="decl"><span class="nottickedoff">xelatexWithHeaders = someTexWithHeaders XeLaTeX &quot;xelatex&quot; &quot;xdv&quot; [] [&quot;-no-pdf&quot;]</span></span>
<span class="lineno"> 144 </span>
<span class="lineno"> 145 </span>-- | Invoke xelatex with &quot;\usepackage[UTF8]{ctex}&quot; and import the result as an
<span class="lineno"> 146 </span>-- SVG object. SVG objects are cached to improve performance. Xelatex has
<span class="lineno"> 147 </span>-- support for non-western scripts.
<span class="lineno"> 148 </span>--
<span class="lineno"> 149 </span>-- Example:
<span class="lineno"> 150 </span>--
<span class="lineno"> 151 </span>-- &gt; ctex &quot;中文&quot;
<span class="lineno"> 152 </span>--
<span class="lineno"> 153 </span>-- &lt;&lt;docs/gifs/doc_ctex.gif&gt;&gt;
<span class="lineno"> 154 </span>ctex :: T.Text -&gt; Tree
<span class="lineno"> 155 </span><span class="decl"><span class="nottickedoff">ctex = ctexWithHeaders []</span></span>
<span class="lineno"> 156 </span>
<span class="lineno"> 157 </span>-- | Invoke xelatex with extra script headers + ctex headers.
<span class="lineno"> 158 </span>ctexWithHeaders :: [T.Text] -&gt; T.Text -&gt; Tree
<span class="lineno"> 159 </span><span class="decl"><span class="nottickedoff">ctexWithHeaders headers = xelatexWithHeaders (&quot;\\usepackage[UTF8]{ctex}&quot; : headers)</span></span>
<span class="lineno"> 160 </span>
<span class="lineno"> 161 </span>-- | Invoke latex and import the result as an SVG object. SVG objects are
<span class="lineno"> 162 </span>-- cached to improve performance. This wraps the TeX code in an 'align*'
<span class="lineno"> 163 </span>-- context.
<span class="lineno"> 164 </span>--
<span class="lineno"> 165 </span>-- Example:
<span class="lineno"> 166 </span>--
<span class="lineno"> 167 </span>-- &gt; latexAlign &quot;R = \\frac{{\\Delta x}}{{kA}}&quot;
<span class="lineno"> 168 </span>--
<span class="lineno"> 169 </span>-- &lt;&lt;docs/gifs/doc_latexAlign.gif&gt;&gt;
<span class="lineno"> 170 </span>latexAlign :: Text -&gt; Tree
<span class="lineno"> 171 </span><span class="decl"><span class="istickedoff">latexAlign tex = latex $ T.unlines [&quot;\\begin{align*}&quot;, tex, &quot;\\end{align*}&quot;]</span></span>
<span class="lineno"> 172 </span>
<span class="lineno"> 173 </span>postprocess :: Tree -&gt; Tree
<span class="lineno"> 174 </span><span class="decl"><span class="nottickedoff">postprocess =</span>
<span class="lineno"> 175 </span><span class="spaces"> </span><span class="nottickedoff">simplify</span>
<span class="lineno"> 176 </span><span class="spaces"> </span><span class="nottickedoff">. lowerTransformations</span>
<span class="lineno"> 177 </span><span class="spaces"> </span><span class="nottickedoff">. scaleXY 0.1 (-0.1)</span>
<span class="lineno"> 178 </span><span class="spaces"> </span><span class="nottickedoff">. removeClipPaths</span>
<span class="lineno"> 179 </span><span class="spaces"> </span><span class="nottickedoff">. lowerIds</span>
<span class="lineno"> 180 </span><span class="spaces"> </span><span class="nottickedoff">. mapTree clearDrawAttr</span>
<span class="lineno"> 181 </span><span class="spaces"> </span><span class="nottickedoff">where</span>
<span class="lineno"> 182 </span><span class="spaces"> </span><span class="nottickedoff">clearDrawAttr t = t &amp; strokeColor .~ Last Nothing</span></span>
<span class="lineno"> 183 </span>
<span class="lineno"> 184 </span>enginePostprocess :: TexEngine -&gt; Tree -&gt; Tree
<span class="lineno"> 185 </span><span class="decl"><span class="nottickedoff">enginePostprocess LuaLaTeX svg = translate 0 (svgHeight svg) svg</span>
<span class="lineno"> 186 </span><span class="spaces"></span><span class="nottickedoff">enginePostprocess _ svg = svg</span></span>
<span class="lineno"> 187 </span>
<span class="lineno"> 188 </span>removeClipPaths :: SVG -&gt; SVG
<span class="lineno"> 189 </span><span class="decl"><span class="nottickedoff">removeClipPaths = mapTree worker</span>
<span class="lineno"> 190 </span><span class="spaces"> </span><span class="nottickedoff">where</span>
<span class="lineno"> 191 </span><span class="spaces"> </span><span class="nottickedoff">worker ClipPathTree {} = None</span>
<span class="lineno"> 192 </span><span class="spaces"> </span><span class="nottickedoff">worker t = t &amp; clipRule .~ Last Nothing &amp; clipPathRef .~ Last Nothing</span></span>
<span class="lineno"> 193 </span>
<span class="lineno"> 194 </span>-- executable, arguments, header, tex
<span class="lineno"> 195 </span>latexToSVG :: TexEngine -&gt; String -&gt; String -&gt; [String] -&gt; Text -&gt; IO Tree
<span class="lineno"> 196 </span><span class="decl"><span class="nottickedoff">latexToSVG engine dviExt latexExec latexArgs tex = do</span>
<span class="lineno"> 197 </span><span class="spaces"> </span><span class="nottickedoff">latexBin &lt;- requireExecutable latexExec</span>
<span class="lineno"> 198 </span><span class="spaces"> </span><span class="nottickedoff">withTempDir $ \tmp_dir -&gt; withTempFile &quot;tex&quot; $ \tex_file -&gt;</span>
<span class="lineno"> 199 </span><span class="spaces"> </span><span class="nottickedoff">withTempFile &quot;svg&quot; $ \svg_file -&gt; do</span>
<span class="lineno"> 200 </span><span class="spaces"> </span><span class="nottickedoff">let dvi_file =</span>
<span class="lineno"> 201 </span><span class="spaces"> </span><span class="nottickedoff">tmp_dir &lt;/&gt; replaceExtension (takeFileName tex_file) dviExt</span>
<span class="lineno"> 202 </span><span class="spaces"> </span><span class="nottickedoff">B.writeFile tex_file (T.encodeUtf8 tex)</span>
<span class="lineno"> 203 </span><span class="spaces"> </span><span class="nottickedoff">runCmd</span>
<span class="lineno"> 204 </span><span class="spaces"> </span><span class="nottickedoff">latexBin</span>
<span class="lineno"> 205 </span><span class="spaces"> </span><span class="nottickedoff">( latexArgs</span>
<span class="lineno"> 206 </span><span class="spaces"> </span><span class="nottickedoff">++ [ &quot;-interaction=nonstopmode&quot;,</span>
<span class="lineno"> 207 </span><span class="spaces"> </span><span class="nottickedoff">&quot;-halt-on-error&quot;,</span>
<span class="lineno"> 208 </span><span class="spaces"> </span><span class="nottickedoff">&quot;-output-directory=&quot; ++ tmp_dir,</span>
<span class="lineno"> 209 </span><span class="spaces"> </span><span class="nottickedoff">tex_file</span>
<span class="lineno"> 210 </span><span class="spaces"> </span><span class="nottickedoff">]</span>
<span class="lineno"> 211 </span><span class="spaces"> </span><span class="nottickedoff">)</span>
<span class="lineno"> 212 </span><span class="spaces"> </span><span class="nottickedoff">if dviExt == &quot;pdf&quot;</span>
<span class="lineno"> 213 </span><span class="spaces"> </span><span class="nottickedoff">then do</span>
<span class="lineno"> 214 </span><span class="spaces"> </span><span class="nottickedoff">pdf2svg &lt;- requireExecutable &quot;pdf2svg&quot;</span>
<span class="lineno"> 215 </span><span class="spaces"> </span><span class="nottickedoff">runCmd</span>
<span class="lineno"> 216 </span><span class="spaces"> </span><span class="nottickedoff">pdf2svg</span>
<span class="lineno"> 217 </span><span class="spaces"> </span><span class="nottickedoff">[dvi_file, svg_file]</span>
<span class="lineno"> 218 </span><span class="spaces"> </span><span class="nottickedoff">else do</span>
<span class="lineno"> 219 </span><span class="spaces"> </span><span class="nottickedoff">dvisvgm &lt;- requireExecutable &quot;dvisvgm&quot;</span>
<span class="lineno"> 220 </span><span class="spaces"> </span><span class="nottickedoff">runCmd</span>
<span class="lineno"> 221 </span><span class="spaces"> </span><span class="nottickedoff">dvisvgm</span>
<span class="lineno"> 222 </span><span class="spaces"> </span><span class="nottickedoff">[ dvi_file,</span>
<span class="lineno"> 223 </span><span class="spaces"> </span><span class="nottickedoff">&quot;--precision=5&quot;,</span>
<span class="lineno"> 224 </span><span class="spaces"> </span><span class="nottickedoff">&quot;--exact&quot;, -- better bboxes.</span>
<span class="lineno"> 225 </span><span class="spaces"> </span><span class="nottickedoff">&quot;--no-fonts&quot;, -- use glyphs instead of fonts.</span>
<span class="lineno"> 226 </span><span class="spaces"> </span><span class="nottickedoff">&quot;--verbosity=0&quot;,</span>
<span class="lineno"> 227 </span><span class="spaces"> </span><span class="nottickedoff">&quot;-o&quot;,</span>
<span class="lineno"> 228 </span><span class="spaces"> </span><span class="nottickedoff">svg_file</span>
<span class="lineno"> 229 </span><span class="spaces"> </span><span class="nottickedoff">]</span>
<span class="lineno"> 230 </span><span class="spaces"> </span><span class="nottickedoff">svg_data &lt;- B.readFile svg_file</span>
<span class="lineno"> 231 </span><span class="spaces"> </span><span class="nottickedoff">case parseSvgFile svg_file svg_data of</span>
<span class="lineno"> 232 </span><span class="spaces"> </span><span class="nottickedoff">Nothing -&gt; error &quot;Malformed svg&quot;</span>
<span class="lineno"> 233 </span><span class="spaces"> </span><span class="nottickedoff">Just svg -&gt;</span>
<span class="lineno"> 234 </span><span class="spaces"> </span><span class="nottickedoff">return $</span>
<span class="lineno"> 235 </span><span class="spaces"> </span><span class="nottickedoff">enginePostprocess engine $</span>
<span class="lineno"> 236 </span><span class="spaces"> </span><span class="nottickedoff">postprocess $ unbox $ replaceUses svg</span></span>
<span class="lineno"> 237 </span>
<span class="lineno"> 238 </span>mkTexScript :: String -&gt; [String] -&gt; [Text] -&gt; Text -&gt; Text
<span class="lineno"> 239 </span><span class="decl"><span class="nottickedoff">mkTexScript latexExec latexArgs texHeaders tex =</span>
<span class="lineno"> 240 </span><span class="spaces"> </span><span class="nottickedoff">T.unlines $</span>
<span class="lineno"> 241 </span><span class="spaces"> </span><span class="nottickedoff">[ &quot;% &quot; &lt;&gt; T.pack (unwords (latexExec : latexArgs)),</span>
<span class="lineno"> 242 </span><span class="spaces"> </span><span class="nottickedoff">&quot;\\documentclass[preview]{standalone}&quot;,</span>
<span class="lineno"> 243 </span><span class="spaces"> </span><span class="nottickedoff">&quot;\\usepackage{amsmath}&quot;,</span>
<span class="lineno"> 244 </span><span class="spaces"> </span><span class="nottickedoff">&quot;\\usepackage{gensymb}&quot;</span>
<span class="lineno"> 245 </span><span class="spaces"> </span><span class="nottickedoff">]</span>
<span class="lineno"> 246 </span><span class="spaces"> </span><span class="nottickedoff">++ texHeaders</span>
<span class="lineno"> 247 </span><span class="spaces"> </span><span class="nottickedoff">++ [ &quot;\\usepackage[english]{babel}&quot;,</span>
<span class="lineno"> 248 </span><span class="spaces"> </span><span class="nottickedoff">&quot;\\linespread{1}&quot;,</span>
<span class="lineno"> 249 </span><span class="spaces"> </span><span class="nottickedoff">&quot;\\begin{document}&quot;,</span>
<span class="lineno"> 250 </span><span class="spaces"> </span><span class="nottickedoff">tex,</span>
<span class="lineno"> 251 </span><span class="spaces"> </span><span class="nottickedoff">&quot;\\end{document}&quot;</span>
<span class="lineno"> 252 </span><span class="spaces"> </span><span class="nottickedoff">]</span></span>
<span class="lineno"> 253 </span>
<span class="lineno"> 254 </span>{- Packages used by manim.
<span class="lineno"> 255 </span>
<span class="lineno"> 256 </span>\\\usepackage{amsmath}\n\
<span class="lineno"> 257 </span>\\\usepackage{amssymb}\n\
<span class="lineno"> 258 </span>\\\usepackage{dsfont}\n\
<span class="lineno"> 259 </span>\\\usepackage{setspace}\n\
<span class="lineno"> 260 </span>\\\usepackage{relsize}\n\
<span class="lineno"> 261 </span>\\\usepackage{textcomp}\n\
<span class="lineno"> 262 </span>\\\usepackage{mathrsfs}\n\
<span class="lineno"> 263 </span>\\\usepackage{calligra}\n\
<span class="lineno"> 264 </span>\\\usepackage{wasysym}\n\
<span class="lineno"> 265 </span>\\\usepackage{ragged2e}\n\
<span class="lineno"> 266 </span>\\\usepackage{physics}\n\
<span class="lineno"> 267 </span>\\\usepackage{xcolor}\n\
<span class="lineno"> 268 </span>\\\usepackage{textcomp}\n\
<span class="lineno"> 269 </span>\\\usepackage{xfrac}\n\
<span class="lineno"> 270 </span>\\\usepackage{microtype}\n\
<span class="lineno"> 271 </span>-}
<span class="lineno"> 272 </span>
<span class="lineno"> 273 </span>-- | Chalkduster font. Depends on lualatex.
<span class="lineno"> 274 </span>-- Font files are automatically downloaded.
<span class="lineno"> 275 </span>--
<span class="lineno"> 276 </span>-- @
<span class="lineno"> 277 </span>-- `latexCfg` `chalkduster` &quot;chalkduster&quot;
<span class="lineno"> 278 </span>-- @
<span class="lineno"> 279 </span>--
<span class="lineno"> 280 </span>-- &lt;&lt;docs/gifs/doc_chalkduster.gif&gt;&gt;
<span class="lineno"> 281 </span>chalkduster :: TexConfig
<span class="lineno"> 282 </span><span class="decl"><span class="nottickedoff">chalkduster =</span>
<span class="lineno"> 283 </span><span class="spaces"> </span><span class="nottickedoff">TexConfig</span>
<span class="lineno"> 284 </span><span class="spaces"> </span><span class="nottickedoff">{ texConfigEngine = XeLaTeX,</span>
<span class="lineno"> 285 </span><span class="spaces"> </span><span class="nottickedoff">texConfigHeaders =</span>
<span class="lineno"> 286 </span><span class="spaces"> </span><span class="nottickedoff">[ &quot;\\usepackage[no-math]{fontspec}&quot;,</span>
<span class="lineno"> 287 </span><span class="spaces"> </span><span class="nottickedoff">&quot;\\setmainfont[Mapping=tex-text,Path={&quot; &lt;&gt; chalkdusterFont &lt;&gt; &quot;/},Extension=.ttf]{Chalkduster}&quot;,</span>
<span class="lineno"> 288 </span><span class="spaces"> </span><span class="nottickedoff">&quot;\\usepackage[defaultmathsizes]{mathastext}&quot;</span>
<span class="lineno"> 289 </span><span class="spaces"> </span><span class="nottickedoff">],</span>
<span class="lineno"> 290 </span><span class="spaces"> </span><span class="nottickedoff">texConfigPostScript = []</span>
<span class="lineno"> 291 </span><span class="spaces"> </span><span class="nottickedoff">}</span>
<span class="lineno"> 292 </span><span class="spaces"> </span><span class="nottickedoff">where</span>
<span class="lineno"> 293 </span><span class="spaces"> </span><span class="nottickedoff">chalkdusterFont =</span>
<span class="lineno"> 294 </span><span class="spaces"> </span><span class="nottickedoff">T.pack $</span>
<span class="lineno"> 295 </span><span class="spaces"> </span><span class="nottickedoff">zipArchive</span>
<span class="lineno"> 296 </span><span class="spaces"> </span><span class="nottickedoff">&quot;https://www.ffonts.net/Chalkduster.font.zip&quot;</span>
<span class="lineno"> 297 </span><span class="spaces"> </span><span class="nottickedoff">&quot;Wplv4RjuFiI0hDQnAM5MVHl2evrZqWstRLdVAfBomCM=&quot;</span></span>
<span class="lineno"> 298 </span>
<span class="lineno"> 299 </span>-- |
<span class="lineno"> 300 </span>-- @
<span class="lineno"> 301 </span>-- `latexCfg` `calligra` &quot;calligra&quot;
<span class="lineno"> 302 </span>-- @
<span class="lineno"> 303 </span>--
<span class="lineno"> 304 </span>-- &lt;&lt;docs/gifs/doc_calligra.gif&gt;&gt;
<span class="lineno"> 305 </span>calligra :: TexConfig
<span class="lineno"> 306 </span><span class="decl"><span class="nottickedoff">calligra =</span>
<span class="lineno"> 307 </span><span class="spaces"> </span><span class="nottickedoff">TexConfig</span>
<span class="lineno"> 308 </span><span class="spaces"> </span><span class="nottickedoff">{ texConfigEngine = LaTeX,</span>
<span class="lineno"> 309 </span><span class="spaces"> </span><span class="nottickedoff">texConfigHeaders = [&quot;\\usepackage{calligra}&quot;],</span>
<span class="lineno"> 310 </span><span class="spaces"> </span><span class="nottickedoff">texConfigPostScript = [&quot;\\calligra&quot;]</span>
<span class="lineno"> 311 </span><span class="spaces"> </span><span class="nottickedoff">}</span></span>
<span class="lineno"> 312 </span>
<span class="lineno"> 313 </span>-- |
<span class="lineno"> 314 </span>-- @
<span class="lineno"> 315 </span>-- `latexCfg` `noto` &quot;noto&quot;
<span class="lineno"> 316 </span>-- @
<span class="lineno"> 317 </span>--
<span class="lineno"> 318 </span>-- &lt;&lt;docs/gifs/doc_noto.gif&gt;&gt;
<span class="lineno"> 319 </span>noto :: TexConfig
<span class="lineno"> 320 </span><span class="decl"><span class="nottickedoff">noto =</span>
<span class="lineno"> 321 </span><span class="spaces"> </span><span class="nottickedoff">TexConfig</span>
<span class="lineno"> 322 </span><span class="spaces"> </span><span class="nottickedoff">{ texConfigEngine = LaTeX,</span>
<span class="lineno"> 323 </span><span class="spaces"> </span><span class="nottickedoff">texConfigHeaders = [&quot;\\usepackage{noto}&quot;],</span>
<span class="lineno"> 324 </span><span class="spaces"> </span><span class="nottickedoff">texConfigPostScript = []</span>
<span class="lineno"> 325 </span><span class="spaces"> </span><span class="nottickedoff">}</span></span>
<span class="lineno"> 326 </span>
<span class="lineno"> 327 </span>-- |
<span class="lineno"> 328 </span>-- @
<span class="lineno"> 329 </span>-- `latexCfg` `helvet` &quot;helvet&quot;
<span class="lineno"> 330 </span>-- @
<span class="lineno"> 331 </span>--
<span class="lineno"> 332 </span>-- &lt;&lt;docs/gifs/doc_helvet.gif&gt;&gt;
<span class="lineno"> 333 </span>helvet :: TexConfig
<span class="lineno"> 334 </span><span class="decl"><span class="nottickedoff">helvet =</span>
<span class="lineno"> 335 </span><span class="spaces"> </span><span class="nottickedoff">TexConfig</span>
<span class="lineno"> 336 </span><span class="spaces"> </span><span class="nottickedoff">{ texConfigEngine = LaTeX,</span>
<span class="lineno"> 337 </span><span class="spaces"> </span><span class="nottickedoff">texConfigHeaders = [&quot;\\usepackage{helvet}&quot;],</span>
<span class="lineno"> 338 </span><span class="spaces"> </span><span class="nottickedoff">texConfigPostScript = []</span>
<span class="lineno"> 339 </span><span class="spaces"> </span><span class="nottickedoff">}</span></span>
<span class="lineno"> 340 </span>
<span class="lineno"> 341 </span>-- |
<span class="lineno"> 342 </span>-- @
<span class="lineno"> 343 </span>-- `latexCfg` `libertine` &quot;libertine&quot;
<span class="lineno"> 344 </span>-- @
<span class="lineno"> 345 </span>--
<span class="lineno"> 346 </span>-- &lt;&lt;docs/gifs/doc_libertine.gif&gt;&gt;
<span class="lineno"> 347 </span>libertine :: TexConfig
<span class="lineno"> 348 </span><span class="decl"><span class="nottickedoff">libertine =</span>
<span class="lineno"> 349 </span><span class="spaces"> </span><span class="nottickedoff">TexConfig</span>
<span class="lineno"> 350 </span><span class="spaces"> </span><span class="nottickedoff">{ texConfigEngine = LaTeX,</span>
<span class="lineno"> 351 </span><span class="spaces"> </span><span class="nottickedoff">texConfigHeaders = [&quot;\\usepackage{libertine}&quot;],</span>
<span class="lineno"> 352 </span><span class="spaces"> </span><span class="nottickedoff">texConfigPostScript = []</span>
<span class="lineno"> 353 </span><span class="spaces"> </span><span class="nottickedoff">}</span></span>
<span class="lineno"> 354 </span>
<span class="lineno"> 355 </span>-- |
<span class="lineno"> 356 </span>-- @
<span class="lineno"> 357 </span>-- `latexCfg` `biolinum` &quot;biolinum&quot;
<span class="lineno"> 358 </span>-- @
<span class="lineno"> 359 </span>--
<span class="lineno"> 360 </span>-- &lt;&lt;docs/gifs/doc_biolinum.gif&gt;&gt;
<span class="lineno"> 361 </span>biolinum :: TexConfig
<span class="lineno"> 362 </span><span class="decl"><span class="nottickedoff">biolinum =</span>
<span class="lineno"> 363 </span><span class="spaces"> </span><span class="nottickedoff">TexConfig</span>
<span class="lineno"> 364 </span><span class="spaces"> </span><span class="nottickedoff">{ texConfigEngine = LaTeX,</span>
<span class="lineno"> 365 </span><span class="spaces"> </span><span class="nottickedoff">texConfigHeaders =</span>
<span class="lineno"> 366 </span><span class="spaces"> </span><span class="nottickedoff">[&quot;\\usepackage{libertine}&quot;</span>
<span class="lineno"> 367 </span><span class="spaces"> </span><span class="nottickedoff">,&quot;\\renewcommand{\\familydefault}{\\sfdefault}&quot;],</span>
<span class="lineno"> 368 </span><span class="spaces"> </span><span class="nottickedoff">texConfigPostScript = []</span>
<span class="lineno"> 369 </span><span class="spaces"> </span><span class="nottickedoff">}</span></span>
<span class="lineno"> 370 </span>
<span class="lineno"> 371 </span>-- |
<span class="lineno"> 372 </span>-- @
<span class="lineno"> 373 </span>-- `latexCfg` `droidSerif` &quot;droidSerif&quot;
<span class="lineno"> 374 </span>-- @
<span class="lineno"> 375 </span>--
<span class="lineno"> 376 </span>-- &lt;&lt;docs/gifs/doc_droidSerif.gif&gt;&gt;
<span class="lineno"> 377 </span>droidSerif :: TexConfig
<span class="lineno"> 378 </span><span class="decl"><span class="nottickedoff">droidSerif =</span>
<span class="lineno"> 379 </span><span class="spaces"> </span><span class="nottickedoff">TexConfig</span>
<span class="lineno"> 380 </span><span class="spaces"> </span><span class="nottickedoff">{ texConfigEngine = LaTeX,</span>
<span class="lineno"> 381 </span><span class="spaces"> </span><span class="nottickedoff">texConfigHeaders =</span>
<span class="lineno"> 382 </span><span class="spaces"> </span><span class="nottickedoff">[&quot;\\usepackage[default]{droidserif}&quot;</span>
<span class="lineno"> 383 </span><span class="spaces"> </span><span class="nottickedoff">,&quot;\\let\\varepsilon\\epsilon&quot;],</span>
<span class="lineno"> 384 </span><span class="spaces"> </span><span class="nottickedoff">texConfigPostScript = []</span>
<span class="lineno"> 385 </span><span class="spaces"> </span><span class="nottickedoff">}</span></span>
<span class="lineno"> 386 </span>
<span class="lineno"> 387 </span>-- |
<span class="lineno"> 388 </span>-- @
<span class="lineno"> 389 </span>-- `latexCfg` `droidSans` &quot;droidSans&quot;
<span class="lineno"> 390 </span>-- @
<span class="lineno"> 391 </span>--
<span class="lineno"> 392 </span>-- &lt;&lt;docs/gifs/doc_droidSans.gif&gt;&gt;
<span class="lineno"> 393 </span>droidSans :: TexConfig
<span class="lineno"> 394 </span><span class="decl"><span class="nottickedoff">droidSans =</span>
<span class="lineno"> 395 </span><span class="spaces"> </span><span class="nottickedoff">TexConfig</span>
<span class="lineno"> 396 </span><span class="spaces"> </span><span class="nottickedoff">{ texConfigEngine = LaTeX,</span>
<span class="lineno"> 397 </span><span class="spaces"> </span><span class="nottickedoff">texConfigHeaders =</span>
<span class="lineno"> 398 </span><span class="spaces"> </span><span class="nottickedoff">[&quot;\\usepackage[default]{droidsans}&quot;</span>
<span class="lineno"> 399 </span><span class="spaces"> </span><span class="nottickedoff">,&quot;\\let\\varepsilon\\epsilon&quot;],</span>
<span class="lineno"> 400 </span><span class="spaces"> </span><span class="nottickedoff">texConfigPostScript = []</span>
<span class="lineno"> 401 </span><span class="spaces"> </span><span class="nottickedoff">}</span></span>
</pre>
</body>
</html>