diff --git a/README.markdown b/README.markdown
--- a/README.markdown
+++ b/README.markdown
@@ -6,7 +6,7 @@
 texmath is a Haskell library for converting between formats used to
 represent mathematics.  Currently it provides functions to read and
 write TeX math, presentation MathML, and OMML (Office Math Markup
-Language, used in Microsoft Office), and to write Gnu eqn and
+Language, used in Microsoft Office), and to write Gnu eqn, typst, and
 [pandoc]'s native format (allowing conversion, using pandoc, to
 a variety of different markup formats).  The TeX reader and
 writer supports basic LaTeX and AMS extensions, and it can parse
diff --git a/changelog b/changelog
--- a/changelog
+++ b/changelog
@@ -1,3 +1,9 @@
+texmath (0.12.7)
+
+  * Add typst writer. New module: Text.TeXMath.Writers.Typst.
+
+  * TeX reader: Support multilined environment. Closes #210.
+
 texmath (0.12.6)
 
   * MathML writer:
diff --git a/extra/texmath.hs b/extra/texmath.hs
--- a/extra/texmath.hs
+++ b/extra/texmath.hs
@@ -58,6 +58,7 @@
     ("native", StringWriter (\_ es -> tshow es) )
   , ("tex", StringWriter (\_ -> writeTeX))
   , ("eqn", StringWriter writeEqn)
+  , ("typst", StringWriter writeTypst)
   , ("omml",  XMLWriter writeOMML)
   , ("xhtml",   XMLWriter (\dt e -> inHtml (writeMathML dt e)))
   , ("mathml",   XMLWriter writeMathML)
diff --git a/server/Main.hs b/server/Main.hs
--- a/server/Main.hs
+++ b/server/Main.hs
@@ -22,6 +22,45 @@
 import Options.Applicative
 import Safe (readMay)
 
+-- This is the data to be supplied by the JSON payload
+-- of requests.
+data Params = Params
+  { text           :: Text
+  , from           :: Format
+  , to             :: Format
+  , display        :: Bool
+  } deriving (Show)
+
+data Format =
+  TeX | MathML | Eqn | OMML | Typst
+  deriving (Show, Ord, Eq)
+
+instance FromJSON Format where
+   parseJSON (String s) =
+               case T.toLower s of
+                 "tex" -> pure TeX
+                 "mathml" -> pure MathML
+                 "eqn" -> pure Eqn
+                 "typst" -> pure Typst
+                 "omml" -> pure OMML
+                 _ -> fail $ "Unknown format " <> T.unpack s
+   parseJSON _ = fail "Expecting string format"
+
+instance ToJSON Format where
+   toJSON x = String $ T.toLower $ T.pack $ show x
+
+instance FromHttpApiData Format where
+   parseQueryParam t =
+               case T.toLower t of
+                 "tex" -> pure TeX
+                 "mathml" -> pure MathML
+                 "eqn" -> pure Eqn
+                 "typst" -> pure Typst
+                 "omml" -> pure OMML
+                 _ -> Left $ "Unknown format " <> t
+
+-- Automatically derive code to convert to/from JSON.
+$(deriveJSON defaultOptions ''Params)
 data Opts = Opts
   { port      :: Int }
 
@@ -82,8 +121,10 @@
                      TeX -> readTeX
                      MathML -> readMathML
                      Eqn -> \_ -> Left "eqn reader not implemented"
+                     Typst -> \_ -> Left "typst reader not implemented"
           writer = case to params of
                      Eqn -> writeEqn dt
+                     Typst -> writeTypst dt
                      OMML -> T.pack . ppElement . writeOMML dt
                      TeX -> writeTeX
                      MathML -> T.pack . ppElement . writeMathML dt
@@ -92,43 +133,4 @@
   handleErr (Right t) = return t
   handleErr (Left err) = throwError $
     err500 { errBody = TLE.encodeUtf8 $ TL.fromStrict err }
-
--- This is the data to be supplied by the JSON payload
--- of requests.
-data Params = Params
-  { text           :: Text
-  , from           :: Format
-  , to             :: Format
-  , display        :: Bool
-  } deriving (Show)
-
-data Format =
-  TeX | MathML | Eqn | OMML
-  deriving (Show, Ord, Eq)
-
-instance FromJSON Format where
-   parseJSON (String s) =
-               case T.toLower s of
-                 "tex" -> pure TeX
-                 "mathml" -> pure MathML
-                 "eqn" -> pure Eqn
-                 "omml" -> pure OMML
-                 _ -> fail $ "Unknown format " <> T.unpack s
-   parseJSON _ = fail "Expecting string format"
-
-instance ToJSON Format where
-   toJSON x = String $ T.toLower $ T.pack $ show x
-
-instance FromHttpApiData Format where
-   parseQueryParam t =
-               case T.toLower t of
-                 "tex" -> pure TeX
-                 "mathml" -> pure MathML
-                 "eqn" -> pure Eqn
-                 "omml" -> pure OMML
-                 _ -> Left $ "Unknown format " <> t
-
--- Automatically derive code to convert to/from JSON.
-$(deriveJSON defaultOptions ''Params)
-
 
diff --git a/server/texmath.html b/server/texmath.html
--- a/server/texmath.html
+++ b/server/texmath.html
@@ -3,7 +3,7 @@
 <head>
   <meta charset="utf-8">
   <meta name="viewport" content="width=device-width, initial-scale=1.0">
-  <meta name="description" content="Convert between LaTeX, MathML, OMML, and eqn math formats.">
+  <meta name="description" content="Convert between LaTeX, MathML, OMML, eqn, and typst math formats.">
   <meta name="robots" content="index,follow">
   <title>texmath demo</title>
   <script src="//code.jquery.com/jquery-3.6.0.min.js"></script>
@@ -72,7 +72,7 @@
   <h1>texmath demo</h1>
   <p><a href="https://github.com/jgm/texmath">texmath</a> is a Haskell
   library, command-line program, and web server that converts between
-  TeX, MathML, OMML, and eqn formats for mathematical formulas.</p>
+  TeX, MathML, OMML, eqn, and typst formats for mathematical formulas.</p>
   <div id="controls" class="container">
     <button id="convert">Convert</button>
     <label for="from">from</label>
@@ -87,6 +87,7 @@
       <option value="mathml" selected>mathml</option>
       <option value="omml">omml</option>
       <option value="eqn">eqn</option>
+      <option value="typst">typst</option>
     </select>
     <select name="display" id="display">
       <option value="true" selected>display</option>
diff --git a/src/Text/TeXMath.hs b/src/Text/TeXMath.hs
--- a/src/Text/TeXMath.hs
+++ b/src/Text/TeXMath.hs
@@ -62,6 +62,7 @@
                       writeTeXWith,
                       addLaTeXEnvironment,
                       writeEqn,
+                      writeTypst,
                       writeOMML,
                       writeMathML,
                       writePandoc,
@@ -77,4 +78,5 @@
 import Text.TeXMath.Writers.Pandoc
 import Text.TeXMath.Writers.TeX
 import Text.TeXMath.Writers.Eqn
+import Text.TeXMath.Writers.Typst
 import Text.TeXMath.Types
diff --git a/src/Text/TeXMath/Readers/TeX.hs b/src/Text/TeXMath/Readers/TeX.hs
--- a/src/Text/TeXMath/Readers/TeX.hs
+++ b/src/Text/TeXMath/Readers/TeX.hs
@@ -477,6 +477,7 @@
   , ("Vmatrix", matrixWith "\x2225" "\x2225")
   , ("split", align)
   , ("multline", gather)
+  , ("multlined", gather)
   , ("gather", gather)
   , ("gathered", gather)
   , ("equation", equation)
diff --git a/src/Text/TeXMath/Writers/Eqn.hs b/src/Text/TeXMath/Writers/Eqn.hs
--- a/src/Text/TeXMath/Writers/Eqn.hs
+++ b/src/Text/TeXMath/Writers/Eqn.hs
@@ -1,6 +1,6 @@
 {-# LANGUAGE GeneralizedNewtypeDeriving, ViewPatterns, GADTs, OverloadedStrings #-}
 {-
-Copyright (C) 2014 Matthew Pickering <matthewtpickering@gmail.com>
+Copyright (C) 2016-2023 John MacFarlane <jgm@berkeley.edu>
 
 This program is free software; you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
@@ -33,8 +33,7 @@
 -- import Debug.Trace
 -- tr' x = trace (show x) x
 
--- | Transforms an expression tree to equivalent Eqn with the default
--- packages (amsmath and amssymb)
+-- | Transforms an expression tree to equivalent Eqn
 writeEqn :: DisplayType -> [Exp] -> T.Text
 writeEqn dt exprs =
   T.unwords $ map writeExp $ everywhere (mkT $ S.handleDownup dt) exprs
diff --git a/src/Text/TeXMath/Writers/Typst.hs b/src/Text/TeXMath/Writers/Typst.hs
new file mode 100644
--- /dev/null
+++ b/src/Text/TeXMath/Writers/Typst.hs
@@ -0,0 +1,1004 @@
+{-# LANGUAGE GeneralizedNewtypeDeriving, ViewPatterns, GADTs, OverloadedStrings #-}
+{-
+Copyright (C) 2023 John MacFarlane <jgm@berkeley.edu>
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+-}
+
+module Text.TeXMath.Writers.Typst (writeTypst) where
+
+import Data.List (transpose)
+import qualified Data.Map as M
+import qualified Data.Text as T
+import Text.TeXMath.Types
+import qualified Text.TeXMath.Shared as S
+import Data.Generics (everywhere, mkT)
+import Data.Text (Text)
+
+-- import Debug.Trace
+-- tr' x = trace (show x) x
+
+-- | Transforms an expression tree to equivalent Typst
+writeTypst :: DisplayType -> [Exp] -> Text
+writeTypst dt exprs =
+  T.unwords $ map writeExp $ everywhere (mkT $ S.handleDownup dt) exprs
+
+writeExps :: [Exp] -> Text
+writeExps = T.intercalate " " . map writeExp
+
+inParens :: Text -> Text
+inParens s = "(" <> s <> ")"
+
+inQuotes :: Text -> Text
+inQuotes s = "\"" <> s <> "\""
+
+esc :: Text -> Text
+esc t =
+  if T.any needsEscape t
+     then T.concatMap escapeChar t
+     else t
+  where
+    escapeChar c
+      | needsEscape c = "\\" <> T.singleton c
+      | otherwise = T.singleton c
+    needsEscape '[' = True
+    needsEscape ']' = True
+    needsEscape '|' = True
+    needsEscape '#' = True
+    needsEscape '$' = True
+    needsEscape '(' = True
+    needsEscape ')' = True
+    needsEscape '_' = True
+    needsEscape _ = False
+
+writeExp' :: Exp -> Text
+writeExp' (EGrouped es) = "(" <> writeExps es <> ")"
+writeExp' e = writeExp e
+
+writeExp :: Exp -> Text
+writeExp (ENumber s) = s
+writeExp (ESymbol _t s) =
+  maybe (esc s) id $ M.lookup s typstSymbols
+writeExp (EIdentifier s) =
+  if T.length s == 1
+     then writeExp (ESymbol Ord s)
+     else inQuotes s
+writeExp (EMathOperator s)
+  | s `elem` ["arccos", "arcsin", "arctan", "arg", "cos", "cosh",
+              "cot", "ctg", "coth", "csc", "deg", "det", "dim", "exp",
+              "gcd", "hom", "mod", "inf", "ker", "lg", "lim", "ln",
+              "log", "max", "min", "Pr", "sec", "sin", "sinh", "sup",
+              "tan", "tg", "tanh", "liminf", "and", "limsup"]
+    = s
+  | otherwise = "\"" <> s <> "\""
+writeExp (EGrouped es) = writeExps es
+writeExp (EFraction _fractype e1 e2) =
+  case (e1, e2) of
+    (EGrouped _, _) -> "frac(" <> writeExp e1 <> ", " <> writeExp e2 <> ")"
+    (_, EGrouped _) -> "frac(" <> writeExp e1 <> ", " <> writeExp e2 <> ")"
+    _ -> writeExp e1 <> " / " <> writeExp e2
+writeExp (ESub b e1) = writeExp' b <> "_" <> writeExp' e1
+writeExp (ESuper b e1) = writeExp' b <> "^" <> writeExp' e1
+writeExp (ESubsup b e1 e2) = writeExp' b <> "_" <> writeExp' e1 <>
+                                            "^" <> writeExp' e2
+writeExp (EOver _convertible b e1) =
+  case e1 of
+    ESymbol Accent "`" -> "grave" <> inParens (writeExp b)
+    ESymbol Accent "\xb4" -> "acute" <> inParens (writeExp b)
+    ESymbol Accent "^" -> "hat" <> inParens (writeExp b)
+    ESymbol Accent "~" -> "tilde" <> inParens (writeExp b)
+    ESymbol Accent "\xaf" -> "macron" <> inParens (writeExp b)
+    ESymbol Accent "\x2d8" -> "breve" <> inParens (writeExp b)
+    ESymbol Accent "." -> "dot" <> inParens (writeExp b)
+    ESymbol Accent "\xa8" -> "diaer" <> inParens (writeExp b)
+    ESymbol Accent "\x2218" -> "circle" <> inParens (writeExp b)
+    ESymbol Accent "\x2dd" -> "acute.double" <> inParens (writeExp b)
+    ESymbol Accent "\x2c7" -> "caron" <> inParens (writeExp b)
+    ESymbol Accent "\x2192" -> "->" <> inParens (writeExp b)
+    ESymbol Accent "\x2190" -> "<-" <> inParens (writeExp b)
+    ESymbol TOver "\9182" -> "overbrace(" <> writeExp b <> ")"
+    ESymbol TOver "\9140" -> "overbracket(" <> writeExp b <> ")"
+    _ -> writeExp' b <> "^" <> writeExp' e1
+writeExp (EUnder _convertible b e1) =
+  case e1 of
+    ESymbol TUnder "_" -> "underline(" <> writeExp b <> ")"
+    ESymbol TUnder "\9182" -> "underbrace(" <> writeExp b <> ")"
+    ESymbol TUnder "\9140" -> "underbracket(" <> writeExp b <> ")"
+    _ -> writeExp' b <> "_" <> writeExp' e1
+writeExp (EUnderover convertible b e1 e2) =
+  case (e1, e2) of
+    (_, ESymbol Accent _) -> writeExp (EUnder convertible (EOver False b e2) e1)
+    (_, ESymbol TOver _) -> writeExp (EUnder convertible (EOver False b e2) e1)
+    (ESymbol TUnder _, _) -> writeExp (EOver convertible (EUnder False b e1) e2)
+    _ -> writeExp' b <> "_" <> writeExp' e1 <> "^" <> writeExp' e2
+writeExp (ESqrt e) = "sqrt(" <> writeExp e <> ")"
+writeExp (ERoot i e) = "root(" <> writeExp i <> ", " <> writeExp e <> ")"
+writeExp (ESpace width) =
+  case (floor (width * 18) :: Int) of
+    0 -> "zws"
+    3 -> "thin"
+    4 -> "med"
+    6 -> "thick"
+    18 -> "quad"
+    n -> "#h(" <> tshow (n `div` 18) <> "em)"
+writeExp (EText ttype s) =
+  case ttype of
+       TextNormal -> "upright" <> inParens (inQuotes s)
+       TextItalic -> "italic" <> inParens (inQuotes s)
+       TextBold   -> "bold" <> inParens (inQuotes s)
+       TextBoldItalic -> "bold" <> inParens ("italic" <> inParens (inQuotes s))
+       TextMonospace -> "mono" <> inParens (inQuotes s)
+       TextSansSerif -> "sans" <> inParens (inQuotes s)
+       TextDoubleStruck -> "bb" <> inParens (inQuotes s)
+       TextScript -> "cal" <> inParens (inQuotes s)
+       TextFraktur -> "frak" <> inParens (inQuotes s)
+       TextSansSerifBold -> "bold" <> inParens ("sans" <> inParens (inQuotes s))
+       TextSansSerifBoldItalic -> "bold" <>
+         inParens ("italic" <> inParens ("sans" <> inParens (inQuotes s)))
+       TextBoldScript -> "bold" <> inParens ("cal" <> inParens (inQuotes s))
+       TextBoldFraktur -> "bold" <> inParens ("frak" <> inParens (inQuotes s))
+       TextSansSerifItalic -> "italic" <>
+          inParens ("sans" <> inParens (inQuotes s))
+writeExp (EStyled ttype es) =
+  let contents = writeExps es
+  in case ttype of
+       TextNormal -> "upright" <> inParens contents
+       TextItalic -> "italic" <> inParens contents
+       TextBold   -> "bold" <> inParens contents
+       TextBoldItalic -> "bold" <> inParens ("italic" <> inParens contents)
+       TextMonospace -> "mono" <> inParens contents
+       TextSansSerif -> "sans" <> inParens contents
+       TextDoubleStruck -> "bb" <> inParens contents
+       TextScript -> "cal" <> inParens contents
+       TextFraktur -> "frak" <> inParens contents
+       TextSansSerifBold -> "bold" <> inParens ("sans" <> inParens contents)
+       TextSansSerifBoldItalic -> "bold" <>
+         inParens ("italic" <> inParens ("sans" <> inParens contents))
+       TextBoldScript -> "bold" <> inParens ("cal" <> inParens contents)
+       TextBoldFraktur -> "bold" <> inParens ("frak" <> inParens contents)
+       TextSansSerifItalic -> "italic" <> inParens ("sans" <> inParens contents)
+writeExp (EBoxed e) = "#box([" <> writeExp e <> "])"
+writeExp (EPhantom e) = "#hide[" <> writeExp e <> "]"
+writeExp (EScaled size e) =
+  "#scale(x: " <> tshow (floor (100 * size) :: Int) <>
+          "%, y: " <> tshow (floor (100 * size) :: Int) <>
+          "%)[" <> writeExp e <> "]"
+writeExp (EDelimited "(" ")" [Right (EArray _aligns rows)])
+  | all (\row -> length row == 1) rows = -- vector
+  "vec(" <> mkArray (transpose rows) <> ")"
+writeExp (EDelimited "(" ")" [Right (EArray _aligns [[xs],[ys]])]) =
+  "binom(" <> writeExps xs <> ", " <> writeExps ys <> ")"
+writeExp (EDelimited "(" ")" [Right (EArray _aligns rows)]) =
+  "mat(delim: \"(\", " <> mkArray rows <> ")"
+writeExp (EDelimited "[" "]" [Right (EArray _aligns rows)]) =
+  "mat(delim: \"[\", " <> mkArray rows <> ")"
+writeExp (EDelimited "{" "}" [Right (EArray _aligns rows)]) =
+  "mat(delim: \"{\", " <> mkArray rows <> ")"
+writeExp (EDelimited "|" "|" [Right (EArray _aligns rows)]) =
+  "mat(delim: \"|\", " <> mkArray rows <> ")"
+writeExp (EDelimited "||" "||" [Right (EArray _aligns rows)]) =
+  "mat(delim: \"||\", " <> mkArray rows <> ")"
+writeExp (EDelimited "\x2223" "\x2223" [Right (EArray _aligns rows)]) =
+  "mat(delim: \"||\", " <> mkArray rows <> ")"
+writeExp (EDelimited "\x2225" "\x2225" [Right (EArray _aligns rows)]) =
+  "mat(delim: \"||\", " <> mkArray rows <> ")"
+writeExp (EDelimited op "" [Right (EArray [AlignLeft, AlignLeft] rows)]) =
+  "cases" <> inParens("delim: " <> inQuotes op <> mconcat (map toCase rows))
+   where toCase = (", " <>) . T.intercalate " & " . map writeExps
+writeExp (EDelimited open close es) =
+  if isDelim open && isDelim close
+     then "lr" <> inParens (open <> body <> close)
+     else esc open <> body <> esc close
+  where fromDelimited (Left e)  = e
+        fromDelimited (Right e) = writeExp e
+        isDelim c = c `elem` ["(",")","[","]","{","}","|","||"]
+        body = T.unwords (map fromDelimited es)
+writeExp (EArray _aligns rows)
+  = T.intercalate "\\\n" $ map mkRow rows
+     where mkRow = T.intercalate " & " . map writeExps
+
+mkArray :: [[[Exp]]] -> Text
+mkArray rows =
+  T.intercalate "; " $ map mkRow rows
+ where
+   mkRow = T.intercalate ", " . map mkCell
+   mkCell = writeExps
+
+tshow :: Show a => a -> Text
+tshow = T.pack . show
+
+typstSymbols :: M.Map Text Text
+typstSymbols = M.fromList
+  [ ("\x1d538","AA")
+  , ("\x391","Alpha")
+  , ("\x1d539","BB")
+  , ("\x392","Beta")
+  , ("\x2102","CC")
+  , ("\x3A7","Chi")
+  , ("\x1d53b","DD")
+  , ("\x394","Delta")
+  , ("\x1d53c","EE")
+  , ("\x395","Epsilon")
+  , ("\x397","Eta")
+  , ("\x1d53d","FF")
+  , ("\x1d53e","GG")
+  , ("\x393","Gamma")
+  , ("\x210d","HH")
+  , ("\x1d540","II")
+  , ("\x2111","Im")
+  , ("\x399","Iota")
+  , ("\x1d541","JJ")
+  , ("\x1d542","KK")
+  , ("\x3CF","Kai")
+  , ("\x39A","Kappa")
+  , ("\x1d543","LL")
+  , ("\x39B","Lambda")
+  , ("\x1d544","MM")
+  , ("\x39C","Mu")
+  , ("\x2115","NN")
+  , ("\x39D","Nu")
+  , ("\x1d546","OO")
+  , ("\x3A9","Omega")
+  , ("\x39F","Omicron")
+  , ("\x2119","PP")
+  , ("\x3A6","Phi")
+  , ("\x3A0","Pi")
+  , ("\x3A8","Psi")
+  , ("\x211a","QQ")
+  , ("\x211d","RR")
+  , ("\x211c","Re")
+  , ("\x3A1","Rho")
+  , ("\x1d54a","SS")
+  , ("\x3A3","Sigma")
+  , ("\x1d54b","TT")
+  , ("\x3A4","Tau")
+  , ("\x398","Theta")
+  , ("\x1d54c","UU")
+  , ("\x3A5","Upsilon")
+  , ("\x1d54d","VV")
+  , ("\x1d54e","WW")
+  , ("\x1d54f","XX")
+  , ("\x39E","Xi")
+  , ("\x1d550","YY")
+  , ("\x2124","ZZ")
+  , ("\x396","Zeta")
+  , ("\xb4","acute")
+  , ("\x2dd","acute.double")
+  , ("\x5d0","alef")
+  , ("\x3b1","alpha")
+  , ("&","amp")
+  , ("\x214b","amp.inv")
+  , ("\x2227","and")
+  , ("\x22c0","and.big")
+  , ("\x22cf","and.curly")
+  , ("\x27d1","and.dot")
+  , ("\x2a53","and.double")
+  , ("\x2220","angle")
+  , ("\x2329","angle.l")
+  , ("\x232a","angle.r")
+  , ("\x300a","angle.l.double")
+  , ("\x300b","angle.r.double")
+  , ("\x299f","angle.acute")
+  , ("\x2221","angle.arc")
+  , ("\x299b","angle.arc.rev")
+  , ("\x29a3","angle.rev")
+  , ("\x221f","angle.right")
+  , ("\11262","angle.right.rev")
+  , ("\x22be","angle.right.arc")
+  , ("\x299d","angle.right.dot")
+  , ("\x299c","angle.right.sq")
+  , ("\x27c0","angle.spatial")
+  , ("\x2222","angle.spheric")
+  , ("\x29a0","angle.spheric.rev")
+  , ("\x29a1","angle.spheric.top")
+  , ("\x212B","angstrom")
+  , ("\x2248","approx")
+  , ("\x224a","approx.eq")
+  , ("\x2249","approx.not")
+  , ("\x2192","arrow.r")
+  , ("\x27fc","arrow.r.long.bar")
+  , ("\x21a6","arrow.r.bar")
+  , ("\x2937","arrow.r.curve")
+  , ("\x21e2","arrow.r.dashed")
+  , ("\x2911","arrow.r.dotted")
+  , ("\x21d2","arrow.r.double")
+  , ("\x2907","arrow.r.double.bar")
+  , ("\x27f9","arrow.r.double.long")
+  , ("\x27fe","arrow.r.double.long.bar")
+  , ("\x21cf","arrow.r.double.not")
+  , ("\x27a1","arrow.r.filled")
+  , ("\x21aa","arrow.r.hook")
+  , ("\x27f6","arrow.r.long")
+  , ("\x27ff","arrow.r.long.squiggly")
+  , ("\x21ac","arrow.r.loop")
+  , ("\x219b","arrow.r.not")
+  , ("\x2b46","arrow.r.quad")
+  , ("\x21dd","arrow.r.squiggly")
+  , ("\x21e5","arrow.r.stop")
+  , ("\x21e8","arrow.r.stroked")
+  , ("\x21a3","arrow.r.tail")
+  , ("\x21db","arrow.r.triple")
+  , ("\x2905","arrow.r.twohead.bar")
+  , ("\x21a0","arrow.r.twohead")
+  , ("\x219d","arrow.r.wave")
+  , ("\x2190","arrow.l")
+  , ("\x21a4","arrow.l.bar")
+  , ("\x2936","arrow.l.curve")
+  , ("\x21e0","arrow.l.dashed")
+  , ("\x2b38","arrow.l.dotted")
+  , ("\x21d0","arrow.l.double")
+  , ("\x2906","arrow.l.double.bar")
+  , ("\x27f8","arrow.l.double.long")
+  , ("\x27fd","arrow.l.double.long.bar")
+  , ("\x21cd","arrow.l.double.not")
+  , ("\x2b05","arrow.l.filled")
+  , ("\x21a9","arrow.l.hook")
+  , ("\x27f5","arrow.l.long")
+  , ("\x27fb","arrow.l.long.bar")
+  , ("\x2b33","arrow.l.long.squiggly")
+  , ("\x21ab","arrow.l.loop")
+  , ("\x219a","arrow.l.not")
+  , ("\x2b45","arrow.l.quad")
+  , ("\x21dc","arrow.l.squiggly")
+  , ("\x21e4","arrow.l.stop")
+  , ("\x21e6","arrow.l.stroked")
+  , ("\x21a2","arrow.l.tail")
+  , ("\x21da","arrow.l.triple")
+  , ("\x2b36","arrow.l.twohead.bar")
+  , ("\x219e","arrow.l.twohead")
+  , ("\x219c","arrow.l.wave")
+  , ("\x2191","arrow.t")
+  , ("\x21a5","arrow.t.bar")
+  , ("\x2934","arrow.t.curve")
+  , ("\x21e1","arrow.t.dashed")
+  , ("\x21d1","arrow.t.double")
+  , ("\x2b06","arrow.t.filled")
+  , ("\x27f0","arrow.t.quad")
+  , ("\x2912","arrow.t.stop")
+  , ("\x21e7","arrow.t.stroked")
+  , ("\x290a","arrow.t.triple")
+  , ("\x219f","arrow.t.twohead")
+  , ("\x2193","arrow.b")
+  , ("\x21a7","arrow.b.bar")
+  , ("\x2935","arrow.b.curve")
+  , ("\x21e3","arrow.b.dashed")
+  , ("\x21d3","arrow.b.double")
+  , ("\x2b07","arrow.b.filled")
+  , ("\x27f1","arrow.b.quad")
+  , ("\x2913","arrow.b.stop")
+  , ("\x21e9","arrow.b.stroked")
+  , ("\x290b","arrow.b.triple")
+  , ("\x21a1","arrow.b.twohead")
+  , ("\x2194","arrow.l.r")
+  , ("\x21d4","arrow.l.r.double")
+  , ("\x27fa","arrow.l.r.double.long")
+  , ("\x21ce","arrow.l.r.double.not")
+  , ("\x2b0c","arrow.l.r.filled")
+  , ("\x27f7","arrow.l.r.long")
+  , ("\x21ae","arrow.l.r.not")
+  , ("\x2b04","arrow.l.r.stroked")
+  , ("\x21ad","arrow.l.r.wave")
+  , ("\x2195","arrow.t.b")
+  , ("\x21d5","arrow.t.b.double")
+  , ("\x2b0d","arrow.t.b.filled")
+  , ("\x21f3","arrow.t.b.stroked")
+  , ("\x2197","arrow.tr")
+  , ("\x21d7","arrow.tr.double")
+  , ("\x2b08","arrow.tr.filled")
+  , ("\x2924","arrow.tr.hook")
+  , ("\x2b00","arrow.tr.stroked")
+  , ("\x2198","arrow.br")
+  , ("\x21d8","arrow.br.double")
+  , ("\x2b0a","arrow.br.filled")
+  , ("\x2925","arrow.br.hook")
+  , ("\x2b02","arrow.br.stroked")
+  , ("\x2196","arrow.tl")
+  , ("\x21d6","arrow.tl.double")
+  , ("\x2b09","arrow.tl.filled")
+  , ("\x2923","arrow.tl.hook")
+  , ("\x2b01","arrow.tl.stroked")
+  , ("\x2199","arrow.bl")
+  , ("\x21d9","arrow.bl.double")
+  , ("\x2b0b","arrow.bl.filled")
+  , ("\x2926","arrow.bl.hook")
+  , ("\x2b03","arrow.bl.stroked")
+  , ("\x2921","arrow.tl.br")
+  , ("\x2922","arrow.tr.bl")
+  , ("\x21ba","arrow.ccw")
+  , ("\x21b6","arrow.ccw.half")
+  , ("\x21bb","arrow.cw")
+  , ("\x21b7","arrow.cw.half")
+  , ("\x21af","arrow.zigzag")
+  , ("\x2303","arrowhead.t")
+  , ("\x2304","arrowhead.b")
+  , ("\x21c9","arrows.rr")
+  , ("\x21c7","arrows.ll")
+  , ("\x21c8","arrows.tt")
+  , ("\x21ca","arrows.bb")
+  , ("\x21c6","arrows.lr")
+  , ("\x21b9","arrows.lr.stop")
+  , ("\x21c4","arrows.rl")
+  , ("\x21c5","arrows.tb")
+  , ("\x21f5","arrows.bt")
+  , ("\x21f6","arrows.rrr")
+  , ("\x2b31","arrows.lll")
+  , ("*","ast")
+  , ("\x204e","ast.low")
+  , ("\x2051","ast.double")
+  , ("\x2042","ast.triple")
+  , ("\xfe61","ast.small")
+  , ("\x2217","ast.op")
+  , ("\x229b","ast.circle")
+  , ("\x29c6","ast.sq")
+  , ("@","at")
+  , ("\\","backslash")
+  , ("\x29b8","backslash.circle")
+  , ("\x29f7","backslash.not")
+  , ("\x2610","ballot")
+  , ("\x2612","ballot.x")
+  , ("|","bar.v")
+  , ("\x2016","bar.v.double")
+  , ("\x2980","bar.v.triple")
+  , ("\xa6","bar.v.broken")
+  , ("\x29b6","bar.v.circle")
+  , ("\x2015","bar.h")
+  , ("\x2235","because")
+  , ("\x5d1","bet")
+  , ("\x3b2","beta")
+  , ("\x3d0","beta.alt")
+  , ("\x20bf","bitcoin")
+  , ("\x22a5","bot")
+  , ("{","brace.l")
+  , ("}","brace.r")
+  , ("\x23de","brace.t")
+  , ("\x23df","brace.b")
+  , ("[","bracket.l")
+  , ("]","bracket.r")
+  , ("\x23b4","bracket.t")
+  , ("\x23b5","bracket.b")
+  , ("\x2d8","breve")
+  , ("\x2038","caret")
+  , ("\x2c7","caron")
+  , ("\x2713","checkmark")
+  , ("\x1f5f8","checkmark.light")
+  , ("\x3c7","chi")
+  , ("\x25cb","circle.stroked")
+  , ("\x2218","circle.stroked.tiny")
+  , ("\x26ac","circle.stroked.small")
+  , ("\x25ef","circle.stroked.big")
+  , ("\x25cf","circle.filled")
+  , ("\x2981","circle.filled.tiny")
+  , ("\x2219","circle.filled.small")
+  , ("\x2b24","circle.filled.big")
+  , ("\x25cc","circle.dotted")
+  , ("\x229a","circle.nested")
+  , ("\x2105","co")
+  , (":","colon")
+  , ("\x2254","colon.eq")
+  , ("\x2a74","colon.double.eq")
+  , (",","comma")
+  , ("\x2201","complement")
+  , ("\x2218","compose")
+  , ("\x2217","convolve")
+  , ("\xa9","copyright")
+  , ("\x2117","copyright.sound")
+  , ("\x2020","dagger")
+  , ("\x2021","dagger.double")
+  , ("\x2013","dash.en")
+  , ("\x2014","dash.em")
+  , ("\x2012","dash.fig")
+  , ("\x301c","dash.wave")
+  , ("\x2239","dash.colon")
+  , ("\x229d","dash.circle")
+  , ("\x3030","dash.wave.double")
+  , ("\xb0","degree")
+  , ("\x2103","degree.c")
+  , ("\x2109","degree.f")
+  , ("\x3b4","delta")
+  , ("\xa8","diaer")
+  , ("\x2300","diameter")
+  , ("\x25c7","diamond.stroked")
+  , ("\x22c4","diamond.stroked.small")
+  , ("\x2b26","diamond.stroked.medium")
+  , ("\x27d0","diamond.stroked.dot")
+  , ("\x25c6","diamond.filled")
+  , ("\x2b25","diamond.filled.medium")
+  , ("\x2b29","diamond.filled.small")
+  , ("\x2202","diff")
+  , ("\xf7","div")
+  , ("\x2a38","div.circle")
+  , ("\x2223","divides")
+  , ("\x2224","divides.not")
+  , ("$","dollar")
+  , (".","dot")
+  , ("\x22c5","dot.op")
+  , ("\xb7","dot.c")
+  , ("\x2299","dot.circle")
+  , ("\x2a00","dot.circle.big")
+  , ("\x22a1","dot.square")
+  , ("\x2026","dots.h")
+  , ("\x22ef","dots.h.c")
+  , ("\x22ee","dots.v")
+  , ("\x22f1","dots.down")
+  , ("\x22f0","dots.up")
+  , ("\x2113","ell")
+  , ("\x2b2d","ellipse.stroked.h")
+  , ("\x2b2f","ellipse.stroked.v")
+  , ("\x2b2c","ellipse.filled.h")
+  , ("\x2b2e","ellipse.filled.v")
+  , ("\x3b5","epsilon")
+  , ("\x3f5","epsilon.alt")
+  , ("=","eq")
+  , ("\x225b","eq.star")
+  , ("\x229c","eq.circle")
+  , ("\x2255","eq.colon")
+  , ("\x225d","eq.def")
+  , ("\x225c","eq.delta")
+  , ("\x225a","eq.equi")
+  , ("\x2259","eq.est")
+  , ("\x22dd","eq.gt")
+  , ("\x22dc","eq.lt")
+  , ("\x225e","eq.m")
+  , ("\x2260","eq.not")
+  , ("\x22de","eq.prec")
+  , ("\x225f","eq.quest")
+  , ("\xfe66","eq.small")
+  , ("\x22df","eq.succ")
+  , ("\x3b7","eta")
+  , ("\x20ac","euro")
+  , ("!","excl")
+  , ("\x203c","excl.double")
+  , ("\xa1","excl.inv")
+  , ("\x2049","excl.quest")
+  , ("\x2203","exists")
+  , ("\x2204","exists.not")
+  , ("\x29d8","fence.l")
+  , ("\x29da","fence.l.double")
+  , ("\x29d9","fence.r")
+  , ("\x29db","fence.r.double")
+  , ("\x2999","fence.dotted")
+  , ("\x2766","floral")
+  , ("\x2619","floral.l")
+  , ("\x2767","floral.r")
+  , ("\x2200","forall")
+  , ("\x20a3","franc")
+  , ("\x3b3","gamma")
+  , ("\x5d2","gimel")
+  , ("`","grave")
+  , (">","gt")
+  , ("\x29c1","gt.circle")
+  , ("\x22d7","gt.dot")
+  , ("\x226b","gt.double")
+  , ("\x2265","gt.eq")
+  , ("\x22db","gt.eq.lt")
+  , ("\x2271","gt.eq.not")
+  , ("\x2267","gt.eqq")
+  , ("\x2277","gt.lt")
+  , ("\x2279","gt.lt.not")
+  , ("\x2269","gt.neqq")
+  , ("\x226f","gt.not")
+  , ("\x22e7","gt.ntilde")
+  , ("\xfe65","gt.small")
+  , ("\x2273","gt.tilde")
+  , ("\x2275","gt.tilde.not")
+  , ("\x22d9","gt.triple")
+  , ("\x2af8","gt.triple.nested")
+  , ("\x21c0","harpoon.rt")
+  , ("\x295b","harpoon.rt.bar")
+  , ("\x2953","harpoon.rt.stop")
+  , ("\x21c1","harpoon.rb")
+  , ("\x295f","harpoon.rb.bar")
+  , ("\x2957","harpoon.rb.stop")
+  , ("\x21bc","harpoon.lt")
+  , ("\x295a","harpoon.lt.bar")
+  , ("\x2952","harpoon.lt.stop")
+  , ("\x21bd","harpoon.lb")
+  , ("\x295e","harpoon.lb.bar")
+  , ("\x2956","harpoon.lb.stop")
+  , ("\x21bf","harpoon.tl")
+  , ("\x2960","harpoon.tl.bar")
+  , ("\x2958","harpoon.tl.stop")
+  , ("\x21be","harpoon.tr")
+  , ("\x295c","harpoon.tr.bar")
+  , ("\x2954","harpoon.tr.stop")
+  , ("\x21c3","harpoon.bl")
+  , ("\x2961","harpoon.bl.bar")
+  , ("\x2959","harpoon.bl.stop")
+  , ("\x21c2","harpoon.br")
+  , ("\x295d","harpoon.br.bar")
+  , ("\x2955","harpoon.br.stop")
+  , ("\x294e","harpoon.lt.rt")
+  , ("\x2950","harpoon.lb.rb")
+  , ("\x294b","harpoon.lb.rt")
+  , ("\x294a","harpoon.lt.rb")
+  , ("\x2951","harpoon.tl.bl")
+  , ("\x294f","harpoon.tr.br")
+  , ("\x294d","harpoon.tl.br")
+  , ("\x294c","harpoon.tr.bl")
+  , ("\x2964","harpoons.rtrb")
+  , ("\x2965","harpoons.blbr")
+  , ("\x296f","harpoons.bltr")
+  , ("\x2967","harpoons.lbrb")
+  , ("\x2962","harpoons.ltlb")
+  , ("\x21cb","harpoons.ltrb")
+  , ("\x2966","harpoons.ltrt")
+  , ("\x2969","harpoons.rblb")
+  , ("\x21cc","harpoons.rtlb")
+  , ("\x2968","harpoons.rtlt")
+  , ("\x296e","harpoons.tlbr")
+  , ("\x2963","harpoons.tltr")
+  , ("#","hash")
+  , ("^","hat")
+  , ("\x2b21","hexa.stroked")
+  , ("\x2b22","hexa.filled")
+  , ("\x2010","hyph")
+  , ("-","hyph.minus")
+  , ("\x2011","hyph.nobreak")
+  , ("\x2027","hyph.point")
+  , ("\173","hyph.soft")
+  , ("\x2261","ident")
+  , ("\x2262","ident.not")
+  , ("\x2263","ident.strict")
+  , ("\x2208","in")
+  , ("\x2209","in.not")
+  , ("\x220b","in.rev")
+  , ("\x220c","in.rev.not")
+  , ("\x220d","in.rev.small")
+  , ("\x220a","in.small")
+  , ("\x221e","infinity")
+  , ("\x222b","integral")
+  , ("\x2a17","integral.arrow.hook")
+  , ("\x2a11","integral.ccw")
+  , ("\x222e","integral.cont")
+  , ("\x2233","integral.cont.ccw")
+  , ("\x2232","integral.cont.cw")
+  , ("\x2231","integral.cw")
+  , ("\x222c","integral.double")
+  , ("\x2a0c","integral.quad")
+  , ("\x2a19","integral.sect")
+  , ("\x2a16","integral.sq")
+  , ("\x222f","integral.surf")
+  , ("\x2a18","integral.times")
+  , ("\x222d","integral.triple")
+  , ("\x2a1a","integral.union")
+  , ("\x2230","integral.vol")
+  , ("\x203d","interrobang")
+  , ("\x3b9","iota")
+  , ("\x2a1d","join")
+  , ("\x27d6","join.r")
+  , ("\x27d5","join.l")
+  , ("\x27d7","join.l.r")
+  , ("\x3d7","kai")
+  , ("\x3ba","kappa")
+  , ("\x3f0","kappa.alt")
+  , ("\x212a","kelvin")
+  , ("\x3bb","lambda")
+  , ("\x20ba","lira")
+  , ("\x25ca","lozenge.stroked")
+  , ("\x2b2b","lozenge.stroked.small")
+  , ("\x2b28","lozenge.stroked.medium")
+  , ("\x29eb","lozenge.filled")
+  , ("\x2b2a","lozenge.filled.small")
+  , ("\x2b27","lozenge.filled.medium")
+  , ("<","lt")
+  , ("\x29c0","lt.circle")
+  , ("\x22d6","lt.dot")
+  , ("\x226a","lt.double")
+  , ("\x2264","lt.eq")
+  , ("\x22da","lt.eq.gt")
+  , ("\x2270","lt.eq.not")
+  , ("\x2266","lt.eqq")
+  , ("\x2276","lt.gt")
+  , ("\x2278","lt.gt.not")
+  , ("\x2268","lt.neqq")
+  , ("\x226e","lt.not")
+  , ("\x22e6","lt.ntilde")
+  , ("\xfe64","lt.small")
+  , ("\x2272","lt.tilde")
+  , ("\x2274","lt.tilde.not")
+  , ("\x22d8","lt.triple")
+  , ("\x2af7","lt.triple.nested")
+  , ("\xaf","macron")
+  , ("\x2720","maltese")
+  , ("\x2212","minus")
+  , ("\x2296","minus.circle")
+  , ("\x2238","minus.dot")
+  , ("\x2213","minus.plus")
+  , ("\x229f","minus.square")
+  , ("\x2242","minus.tilde")
+  , ("\x2a3a","minus.triangle")
+  , ("\x22a7","models")
+  , ("\x3bc","mu")
+  , ("\x22b8","multimap")
+  , ("\x2207","nabla")
+  , ("\xac","not")
+  , ("\x1f39c","notes.up")
+  , ("\x1f39d","notes.down")
+  , ("\x2205","nothing")
+  , ("\x29b0","nothing.rev")
+  , ("\x3bd","nu")
+  , ("\x2126","ohm")
+  , ("\x2127","ohm.inv")
+  , ("\x3c9","omega")
+  , ("\x3bf","omicron")
+  , ("\x221e","oo")
+  , ("\x2228","or")
+  , ("\x22c1","or.big")
+  , ("\x22ce","or.curly")
+  , ("\x27c7","or.dot")
+  , ("\x2a54","or.double")
+  , ("\x2225","parallel")
+  , ("\x29b7","parallel.circle")
+  , ("\x2226","parallel.not")
+  , ("(","paren.l")
+  , (")","paren.r")
+  , ("\x23dc","paren.t")
+  , ("\x23dd","paren.b")
+  , ("\x2b20","penta.stroked")
+  , ("\x2b1f","penta.filled")
+  , ("%","percent")
+  , ("\x2030","permille")
+  , ("\x27c2","perp")
+  , ("\x29b9","perp.circle")
+  , ("\x20b1","peso")
+  , ("\x3c6","phi")
+  , ("\x3d5","phi.alt")
+  , ("\x3c0","pi")
+  , ("\x3d6","pi.alt")
+  , ("\xb6","pilcrow")
+  , ("\x204b","pilcrow.rev")
+  , ("\x210e","planck")
+  , ("\x210f","planck.reduce")
+  , ("+","plus")
+  , ("\x2295","plus.circle")
+  , ("\x27f4","plus.circle.arrow")
+  , ("\x2a01","plus.circle.big")
+  , ("\x2214","plus.dot")
+  , ("\xb1","plus.minus")
+  , ("\xfe62","plus.small")
+  , ("\x229e","plus.square")
+  , ("\x2a39","plus.triangle")
+  , ("\xa3","pound")
+  , ("\x227a","prec")
+  , ("\x2ab7","prec.approx")
+  , ("\x2abb","prec.double")
+  , ("\x227c","prec.eq")
+  , ("\x22e0","prec.eq.not")
+  , ("\x2ab3","prec.eqq")
+  , ("\x2ab9","prec.napprox")
+  , ("\x2ab5","prec.neqq")
+  , ("\x2280","prec.not")
+  , ("\x22e8","prec.ntilde")
+  , ("\x227e","prec.tilde")
+  , ("\x2032","prime")
+  , ("\x2035","prime.rev")
+  , ("\x2033","prime.double")
+  , ("\x2036","prime.double.rev")
+  , ("\x2034","prime.triple")
+  , ("\x2037","prime.triple.rev")
+  , ("\x2057","prime.quad")
+  , ("\x220f","product")
+  , ("\x2210","product.co")
+  , ("\x221d","prop")
+  , ("\x3c8","psi")
+  , ("\x220e","qed")
+  , ("?","quest")
+  , ("\x2047","quest.double")
+  , ("\x2048","quest.excl")
+  , ("\xbf","quest.inv")
+  , ("\"","quote.double")
+  , ("'","quote.single")
+  , ("\x201c","quote.l.double")
+  , ("\x2018","quote.l.single")
+  , ("\x201d","quote.r.double")
+  , ("\x2019","quote.r.single")
+  , ("\xab","quote.angle.l.double")
+  , ("\x2039","quote.angle.l.single")
+  , ("\xbb","quote.angle.r.double")
+  , ("\x203a","quote.angle.r.single")
+  , ("\x201f","quote.high.double")
+  , ("\x201b","quote.high.single")
+  , ("\x201e","quote.low.double")
+  , ("\x201a","quote.low.single")
+  , ("\x2236","ratio")
+  , ("\x25ad","rect.stroked.h")
+  , ("\x25af","rect.stroked.v")
+  , ("\x25ac","rect.filled.h")
+  , ("\x25ae","rect.filled.v")
+  , ("\x203b","refmark")
+  , ("\x3c1","rho")
+  , ("\x3f1","rho.alt")
+  , ("\x20bd","ruble")
+  , ("\x20b9","rupee")
+  , ("\x2229","sect")
+  , ("\x2a44","sect.and")
+  , ("\x22c2","sect.big")
+  , ("\x2a40","sect.dot")
+  , ("\x22d2","sect.double")
+  , ("\x2293","sect.sq")
+  , ("\x2a05","sect.sq.big")
+  , ("\x2a4e","sect.sq.double")
+  , ("\xa7","section")
+  , (";","semi")
+  , ("\x204f","semi.rev")
+  , ("\x2120","servicemark")
+  , ("\x5e9","shin")
+  , ("\x3c3","sigma")
+  , ("/","slash")
+  , ("\x2afd","slash.double")
+  , ("\x2afb","slash.triple")
+  , ("\x2a33","smash")
+  , ("s","space")
+  , ("\xa0","space.nobreak")
+  , ("\x2002","space.en")
+  , ("\x2003","space.quad")
+  , ("\x2004","space.third")
+  , ("\x2005","space.quarter")
+  , ("\x2006","space.sixth")
+  , ("\x205f","space.med")
+  , ("\x2007","space.fig")
+  , ("\x2008","space.punct")
+  , ("\x2009","space.thin")
+  , ("\x200a","space.hair")
+  , ("\x25a1","square.stroked")
+  , ("\x25ab","square.stroked.tiny")
+  , ("\x25fd","square.stroked.small")
+  , ("\x25fb","square.stroked.medium")
+  , ("\x2b1c","square.stroked.big")
+  , ("\x2b1a","square.stroked.dotted")
+  , ("\x25a2","square.stroked.rounded")
+  , ("\x25a0","square.filled")
+  , ("\x25aa","square.filled.tiny")
+  , ("\x25fe","square.filled.small")
+  , ("\x25fc","square.filled.medium")
+  , ("\x2b1b","square.filled.big")
+  , ("\x22c6","star.op")
+  , ("\x2605","star.stroked")
+  , ("\x2605","star.filled")
+  , ("\x2282","subset")
+  , ("\x2abd","subset.dot")
+  , ("\x22d0","subset.double")
+  , ("\x2286","subset.eq")
+  , ("\x2288","subset.eq.not")
+  , ("\x2291","subset.eq.sq")
+  , ("\x22e2","subset.eq.sq.not")
+  , ("\x228a","subset.neq")
+  , ("\x2284","subset.not")
+  , ("\x228f","subset.sq")
+  , ("\x22e4","subset.sq.neq")
+  , ("\x227b","succ")
+  , ("\x2ab8","succ.approx")
+  , ("\x2abc","succ.double")
+  , ("\x227d","succ.eq")
+  , ("\x22e1","succ.eq.not")
+  , ("\x2ab4","succ.eqq")
+  , ("\x2aba","succ.napprox")
+  , ("\x2ab6","succ.neqq")
+  , ("\x2281","succ.not")
+  , ("\x22e9","succ.ntilde")
+  , ("\x227f","succ.tilde")
+  , ("\x2663","suit.club")
+  , ("\x2666","suit.diamond")
+  , ("\x2665","suit.heart")
+  , ("\x2660","suit.spade")
+  , ("\x2211","sum")
+  , ("\x2a0b","sum.integral")
+  , ("\x2283","supset")
+  , ("\x2abe","supset.dot")
+  , ("\x22d1","supset.double")
+  , ("\x2287","supset.eq")
+  , ("\x2289","supset.eq.not")
+  , ("\x2292","supset.eq.sq")
+  , ("\x22e3","supset.eq.sq.not")
+  , ("\x228b","supset.neq")
+  , ("\x2285","supset.not")
+  , ("\x2290","supset.sq")
+  , ("\x22e5","supset.sq.neq")
+  , ("\x22a2","tack.r")
+  , ("\x27dd","tack.r.long")
+  , ("\x22a3","tack.l")
+  , ("\x27de","tack.l.long")
+  , ("\x2ade","tack.l.short")
+  , ("\x22a5","tack.t")
+  , ("\x27d8","tack.t.big")
+  , ("\x2aeb","tack.t.double")
+  , ("\x2ae0","tack.t.short")
+  , ("\x22a4","tack.b")
+  , ("\x27d9","tack.b.big")
+  , ("\x2aea","tack.b.double")
+  , ("\x2adf","tack.b.short")
+  , ("\x27db","tack.l.r")
+  , ("\x3c4","tau")
+  , ("\x2234","therefore")
+  , ("\x3b8","theta")
+  , ("\x3d1","theta.alt")
+  , ("~","tilde")
+  , ("\x223c","tilde.op")
+  , ("\x2243","tilde.eq")
+  , ("\x2244","tilde.eq.not")
+  , ("\x22cd","tilde.eq.rev")
+  , ("\x2245","tilde.eqq")
+  , ("\x2247","tilde.eqq.not")
+  , ("\x2246","tilde.neqq")
+  , ("\x2241","tilde.not")
+  , ("\x223d","tilde.rev")
+  , ("\x224c","tilde.rev.eqq")
+  , ("\x224b","tilde.triple")
+  , ("\xd7","times")
+  , ("\x2a09","times.big")
+  , ("\x2297","times.circle")
+  , ("\x2a02","times.circle.big")
+  , ("\x22c7","times.div")
+  , ("\x22cb","times.l")
+  , ("\x22cc","times.r")
+  , ("\x22a0","times.square")
+  , ("\x2a3b","times.triangle")
+  , ("\x22a4","top")
+  , ("\x25b7","triangle.stroked.r")
+  , ("\x25c1","triangle.stroked.l")
+  , ("\x25b3","triangle.stroked.t")
+  , ("\x25bd","triangle.stroked.b")
+  , ("\x25fa","triangle.stroked.bl")
+  , ("\x25ff","triangle.stroked.br")
+  , ("\x25f8","triangle.stroked.tl")
+  , ("\x25f9","triangle.stroked.tr")
+  , ("\x25b9","triangle.stroked.small.r")
+  , ("\x25bf","triangle.stroked.small.b")
+  , ("\x25c3","triangle.stroked.small.l")
+  , ("\x25b5","triangle.stroked.small.t")
+  , ("\x1f6c6","triangle.stroked.rounded")
+  , ("\x27c1","triangle.stroked.nested")
+  , ("\x25ec","triangle.stroked.dot")
+  , ("\x25b6","triangle.filled.r")
+  , ("\x25c0","triangle.filled.l")
+  , ("\x25b2","triangle.filled.t")
+  , ("\x25bc","triangle.filled.b")
+  , ("\x25e3","triangle.filled.bl")
+  , ("\x25e2","triangle.filled.br")
+  , ("\x25e4","triangle.filled.tl")
+  , ("\x25e5","triangle.filled.tr")
+  , ("\x25b8","triangle.filled.small.r")
+  , ("\x25be","triangle.filled.small.b")
+  , ("\x25c2","triangle.filled.small.l")
+  , ("\x25b4","triangle.filled.small.t")
+  , ("\x3014","turtle.l")
+  , ("\x3015","turtle.r")
+  , ("\x23e0","turtle.t")
+  , ("\x23e1","turtle.b")
+  , ("\x222a","union")
+  , ("\x228c","union.arrow")
+  , ("\x22c3","union.big")
+  , ("\x228d","union.dot")
+  , ("\x2a03","union.dot.big")
+  , ("\x22d3","union.double")
+  , ("\x2a41","union.minus")
+  , ("\x2a45","union.or")
+  , ("\x228e","union.plus")
+  , ("\x2a04","union.plus.big")
+  , ("\x2294","union.sq")
+  , ("\x2a06","union.sq.big")
+  , ("\x2a4f","union.sq.double")
+  , ("\x3c5","upsilon")
+  , ("\x2216","without")
+  , ("\8288","wj")
+  , ("\x20a9","won")
+  , ("\x2240","wreath")
+  , ("\x3be","xi")
+  , ("\xa5","yen")
+  , ("\x3b6","zeta")
+  , ("\x200d","zwj")
+  , ("\x200c","zwnj")
+  , ("\x200b","zws") ]
diff --git a/test/test-texmath.hs b/test/test-texmath.hs
--- a/test/test-texmath.hs
+++ b/test/test-texmath.hs
@@ -37,6 +37,7 @@
   mmlWriterTests <- getFiles "test/writer/mml"
   ommlWriterTests <- getFiles "test/writer/omml"
   eqnWriterTests <- getFiles "test/writer/eqn"
+  typstWriterTests <- getFiles "test/writer/typst"
   regressionTests <- getFiles "test/regression"
   roundtripTests <- getFiles "test/roundtrip"
   let ings = includingOptions [Option (Proxy :: Proxy RoundTrip)] :
@@ -62,6 +63,7 @@
              , testGroup "mml" $ map toGoldenTest mmlWriterTests
              , testGroup "omml" $ map toGoldenTest ommlWriterTests
              , testGroup "eqn" $ map toGoldenTest eqnWriterTests
+             , testGroup "typst" $ map toGoldenTest typstWriterTests
              ],
              testGroup "regression" $ map toGoldenTest regressionTests
            ]
@@ -145,5 +147,6 @@
           , ("tex", writeTeX)
           , ("omml", T.pack . ppTopElement . writeOMML DisplayBlock)
           , ("eqn", writeEqn DisplayBlock)
+          , ("typst", writeTypst DisplayBlock)
           , ("native", T.pack . ppShow)
           ]
diff --git a/test/writer/typst/01.test b/test/writer/typst/01.test
new file mode 100644
--- /dev/null
+++ b/test/writer/typst/01.test
@@ -0,0 +1,22 @@
+<<< native
+[ EIdentifier "x"
+, ESymbol Rel "="
+, EFraction
+    NormalFrac
+    (EGrouped
+       [ ESymbol Op "\8722"
+       , EIdentifier "b"
+       , ESymbol Bin "\177"
+       , ESqrt
+           (EGrouped
+              [ ESuper (EIdentifier "b") (ENumber "2")
+              , ESymbol Bin "\8722"
+              , ENumber "4"
+              , EIdentifier "a"
+              , EIdentifier "c"
+              ])
+       ])
+    (EGrouped [ ENumber "2" , EIdentifier "a" ])
+]
+>>> typst
+x eq frac(minus b plus.minus sqrt(b^2 minus 4 a c), 2 a)
diff --git a/test/writer/typst/02.test b/test/writer/typst/02.test
new file mode 100644
--- /dev/null
+++ b/test/writer/typst/02.test
@@ -0,0 +1,25 @@
+<<< native
+[ ENumber "2"
+, ESymbol Rel "="
+, EDelimited
+    "("
+    ")"
+    [ Right
+        (EFraction
+           NormalFrac
+           (EGrouped
+              [ EDelimited
+                  "("
+                  ")"
+                  [ Right (ENumber "3")
+                  , Right (ESymbol Bin "\8722")
+                  , Right (EIdentifier "x")
+                  ]
+              , ESymbol Bin "\215"
+              , ENumber "2"
+              ])
+           (EGrouped [ ENumber "3" , ESymbol Bin "\8722" , EIdentifier "x" ]))
+    ]
+]
+>>> typst
+2 eq lr((frac(lr((3 minus x)) times 2, 3 minus x)))
diff --git a/test/writer/typst/03.test b/test/writer/typst/03.test
new file mode 100644
--- /dev/null
+++ b/test/writer/typst/03.test
@@ -0,0 +1,13 @@
+<<< native
+[ EIdentifier "a"
+, ESuper (EIdentifier "x") (ENumber "2")
+, ESymbol Bin "+"
+, EIdentifier "b"
+, EIdentifier "x"
+, ESymbol Bin "+"
+, EIdentifier "c"
+, ESymbol Rel "="
+, ENumber "0"
+]
+>>> typst
+a x^2 plus b x plus c eq 0
diff --git a/test/writer/typst/04.test b/test/writer/typst/04.test
new file mode 100644
--- /dev/null
+++ b/test/writer/typst/04.test
@@ -0,0 +1,20 @@
+<<< native
+[ ESub (EIdentifier "S") (EText TextNormal "new")
+, ESymbol Rel "="
+, ESub (EIdentifier "S") (EText TextNormal "old")
+, ESymbol Bin "\8722"
+, EFraction
+    NormalFrac
+    (ESuper
+       (EDelimited
+          "("
+          ")"
+          [ Right (ENumber "5")
+          , Right (ESymbol Bin "\8722")
+          , Right (EIdentifier "T")
+          ])
+       (ENumber "2"))
+    (ENumber "2")
+]
+>>> typst
+S_upright("new") eq S_upright("old") minus lr((5 minus T))^2 / 2
diff --git a/test/writer/typst/05.test b/test/writer/typst/05.test
new file mode 100644
--- /dev/null
+++ b/test/writer/typst/05.test
@@ -0,0 +1,31 @@
+<<< native
+[ ESubsup (ESymbol Op "\8747") (EIdentifier "a") (EIdentifier "x")
+, ESpace ((-1) % 6)
+, ESpace ((-1) % 6)
+, ESpace ((-1) % 6)
+, ESubsup (ESymbol Op "\8747") (EIdentifier "a") (EIdentifier "s")
+, EIdentifier "f"
+, EDelimited "(" ")" [ Right (EIdentifier "y") ]
+, ESpace (1 % 6)
+, EIdentifier "d"
+, EIdentifier "y"
+, ESpace (1 % 6)
+, EIdentifier "d"
+, EIdentifier "s"
+, ESymbol Rel "="
+, ESubsup (ESymbol Op "\8747") (EIdentifier "a") (EIdentifier "x")
+, EIdentifier "f"
+, EDelimited "(" ")" [ Right (EIdentifier "y") ]
+, EDelimited
+    "("
+    ")"
+    [ Right (EIdentifier "x")
+    , Right (ESymbol Bin "\8722")
+    , Right (EIdentifier "y")
+    ]
+, ESpace (1 % 6)
+, EIdentifier "d"
+, EIdentifier "y"
+]
+>>> typst
+integral_a^x #h(-1em) #h(-1em) #h(-1em) integral_a^space f lr((y)) thin d y thin d space eq integral_a^x f lr((y)) lr((x minus y)) thin d y
diff --git a/test/writer/typst/06.test b/test/writer/typst/06.test
new file mode 100644
--- /dev/null
+++ b/test/writer/typst/06.test
@@ -0,0 +1,35 @@
+<<< native
+[ EUnderover
+    True
+    (ESymbol Op "\8721")
+    (EGrouped [ EIdentifier "m" , ESymbol Rel "=" , ENumber "1" ])
+    (ESymbol Ord "\8734")
+, EUnderover
+    True
+    (ESymbol Op "\8721")
+    (EGrouped [ EIdentifier "n" , ESymbol Rel "=" , ENumber "1" ])
+    (ESymbol Ord "\8734")
+, EFraction
+    NormalFrac
+    (EGrouped
+       [ ESuper (EIdentifier "m") (ENumber "2")
+       , ESpace (1 % 6)
+       , EIdentifier "n"
+       ])
+    (EGrouped
+       [ ESuper (ENumber "3") (EIdentifier "m")
+       , EDelimited
+           "("
+           ")"
+           [ Right (EIdentifier "m")
+           , Right (ESpace (1 % 6))
+           , Right (ESuper (ENumber "3") (EIdentifier "n"))
+           , Right (ESymbol Bin "+")
+           , Right (EIdentifier "n")
+           , Right (ESpace (1 % 6))
+           , Right (ESuper (ENumber "3") (EIdentifier "m"))
+           ]
+       ])
+]
+>>> typst
+sum_(m eq 1)^oo sum_(n eq 1)^oo frac(m^2 thin n, 3^m lr((m thin 3^n plus n thin 3^m)))
diff --git a/test/writer/typst/07.test b/test/writer/typst/07.test
new file mode 100644
--- /dev/null
+++ b/test/writer/typst/07.test
@@ -0,0 +1,23 @@
+<<< native
+[ EIdentifier "u"
+, ESymbol Ord "\8243"
+, ESymbol Bin "+"
+, EIdentifier "p"
+, EDelimited "(" ")" [ Right (EIdentifier "x") ]
+, EIdentifier "u"
+, ESymbol Ord "\8242"
+, ESymbol Bin "+"
+, EIdentifier "q"
+, EDelimited "(" ")" [ Right (EIdentifier "x") ]
+, EIdentifier "u"
+, ESymbol Rel "="
+, EIdentifier "f"
+, EDelimited "(" ")" [ Right (EIdentifier "x") ]
+, ESymbol Pun ","
+, ESpace (1 % 1)
+, EIdentifier "x"
+, ESymbol Rel ">"
+, EIdentifier "a"
+]
+>>> typst
+u prime.double plus p lr((x)) u prime plus q lr((x)) u eq f lr((x)) comma quad x gt a
diff --git a/test/writer/typst/08.test b/test/writer/typst/08.test
new file mode 100644
--- /dev/null
+++ b/test/writer/typst/08.test
@@ -0,0 +1,33 @@
+<<< native
+[ EDelimited
+    "|"
+    "|"
+    [ Right (EOver False (EIdentifier "z") (ESymbol Accent "\8254")) ]
+, ESymbol Rel "="
+, EDelimited "|" "|" [ Right (EIdentifier "z") ]
+, ESymbol Pun ","
+, EDelimited
+    "|"
+    "|"
+    [ Right
+        (ESuper
+           (EDelimited
+              "("
+              ")"
+              [ Right (EOver False (EIdentifier "z") (ESymbol Accent "\8254")) ])
+           (EIdentifier "n"))
+    ]
+, ESymbol Rel "="
+, ESuper
+    (EDelimited "|" "|" [ Right (EIdentifier "z") ]) (EIdentifier "n")
+, ESymbol Pun ","
+, EMathOperator "arg"
+, EDelimited
+    "(" ")" [ Right (ESuper (EIdentifier "z") (EIdentifier "n")) ]
+, ESymbol Rel "="
+, EIdentifier "n"
+, EMathOperator "arg"
+, EDelimited "(" ")" [ Right (EIdentifier "z") ]
+]
+>>> typst
+lr(|z^‾|) eq lr(|z|) comma lr(|lr((z^‾))^n|) eq lr(|z|)^n comma arg lr((z^n)) eq n arg lr((z))
diff --git a/test/writer/typst/09.test b/test/writer/typst/09.test
new file mode 100644
--- /dev/null
+++ b/test/writer/typst/09.test
@@ -0,0 +1,18 @@
+<<< native
+[ EUnder
+    True
+    (EMathOperator "lim")
+    (EGrouped
+       [ EIdentifier "z"
+       , ESymbol Rel "\8594"
+       , ESub (EIdentifier "z") (ENumber "0")
+       ])
+, EIdentifier "f"
+, EDelimited "(" ")" [ Right (EIdentifier "z") ]
+, ESymbol Rel "="
+, EIdentifier "f"
+, EDelimited
+    "(" ")" [ Right (ESub (EIdentifier "z") (ENumber "0")) ]
+]
+>>> typst
+lim_(z arrow.r z_0) f lr((z)) eq f lr((z_0))
diff --git a/test/writer/typst/10.test b/test/writer/typst/10.test
new file mode 100644
--- /dev/null
+++ b/test/writer/typst/10.test
@@ -0,0 +1,45 @@
+<<< native
+[ ESub (EIdentifier "\981") (EIdentifier "n")
+, EDelimited "(" ")" [ Right (EIdentifier "\954") ]
+, ESymbol Rel "="
+, EFraction
+    NormalFrac
+    (ENumber "1")
+    (EGrouped
+       [ ENumber "4"
+       , ESuper (EIdentifier "\960") (ENumber "2")
+       , ESuper (EIdentifier "\954") (ENumber "2")
+       ])
+, ESubsup (ESymbol Op "\8747") (ENumber "0") (ESymbol Ord "\8734")
+, EFraction
+    NormalFrac
+    (EGrouped
+       [ EMathOperator "sin"
+       , EDelimited
+           "(" ")" [ Right (EIdentifier "\954") , Right (EIdentifier "R") ]
+       ])
+    (EGrouped [ EIdentifier "\954" , EIdentifier "R" ])
+, EFraction
+    NormalFrac
+    (ESymbol Ord "\8706")
+    (EGrouped [ ESymbol Ord "\8706" , EIdentifier "R" ])
+, EDelimited
+    "["
+    "]"
+    [ Right (ESuper (EIdentifier "R") (ENumber "2"))
+    , Right
+        (EFraction
+           NormalFrac
+           (EGrouped
+              [ ESymbol Ord "\8706"
+              , ESub (EIdentifier "D") (EIdentifier "n")
+              , EDelimited "(" ")" [ Right (EIdentifier "R") ]
+              ])
+           (EGrouped [ ESymbol Ord "\8706" , EIdentifier "R" ]))
+    ]
+, ESpace (1 % 6)
+, EIdentifier "d"
+, EIdentifier "R"
+]
+>>> typst
+phi.alt_n lr((kappa)) eq frac(1, 4 pi^2 kappa^2) integral_0^oo frac(sin lr((kappa R)), kappa R) frac(diff, diff R) lr([R^2 frac(diff D_n lr((R)), diff R)]) thin d R
diff --git a/test/writer/typst/11.test b/test/writer/typst/11.test
new file mode 100644
--- /dev/null
+++ b/test/writer/typst/11.test
@@ -0,0 +1,26 @@
+<<< native
+[ ESub (EIdentifier "\981") (EIdentifier "n")
+, EDelimited "(" ")" [ Right (EIdentifier "\954") ]
+, ESymbol Rel "="
+, ENumber "0.033"
+, ESubsup (EIdentifier "C") (EIdentifier "n") (ENumber "2")
+, ESuper
+    (EIdentifier "\954")
+    (EGrouped
+       [ ESymbol Op "\8722"
+       , ENumber "11"
+       , ESymbol Ord "/"
+       , ENumber "3"
+       ])
+, ESymbol Pun ","
+, ESpace (1 % 1)
+, EFraction
+    NormalFrac (ENumber "1") (ESub (EIdentifier "L") (ENumber "0"))
+, ESymbol Rel "\8810"
+, EIdentifier "\954"
+, ESymbol Rel "\8810"
+, EFraction
+    NormalFrac (ENumber "1") (ESub (EIdentifier "l") (ENumber "0"))
+]
+>>> typst
+phi.alt_n lr((kappa)) eq 0.033 C_n^2 kappa^(minus 11 slash 3) comma quad 1 / L_0 lt.double kappa lt.double 1 / l_0
diff --git a/test/writer/typst/12.test b/test/writer/typst/12.test
new file mode 100644
--- /dev/null
+++ b/test/writer/typst/12.test
@@ -0,0 +1,33 @@
+<<< native
+[ EIdentifier "f"
+, EDelimited "(" ")" [ Right (EIdentifier "x") ]
+, ESymbol Rel "="
+, EDelimited
+    "{"
+    ""
+    [ Right
+        (EArray
+           [ AlignLeft , AlignLeft ]
+           [ [ [ ENumber "1" ]
+             , [ ESymbol Bin "\8722"
+               , ENumber "1"
+               , ESymbol Rel "\8804"
+               , EIdentifier "x"
+               , ESymbol Rel "<"
+               , ENumber "0"
+               ]
+             ]
+           , [ [ EFraction NormalFrac (ENumber "1") (ENumber "2") ]
+             , [ EIdentifier "x" , ESymbol Rel "=" , ENumber "0" ]
+             ]
+           , [ [ ENumber "1"
+               , ESymbol Bin "\8722"
+               , ESuper (EIdentifier "x") (ENumber "2")
+               ]
+             , [ EText TextNormal "otherwise" ]
+             ]
+           ])
+    ]
+]
+>>> typst
+f lr((x)) eq cases(delim: "{", 1 & minus 1 lt.eq x lt 0, 1 / 2 & x eq 0, 1 minus x^2 & upright("otherwise"))
diff --git a/test/writer/typst/13.test b/test/writer/typst/13.test
new file mode 100644
--- /dev/null
+++ b/test/writer/typst/13.test
@@ -0,0 +1,57 @@
+<<< native
+[ ESub (EGrouped []) (EIdentifier "p")
+, ESub (EIdentifier "F") (EIdentifier "q")
+, EDelimited
+    "("
+    ")"
+    [ Right (ESub (EIdentifier "a") (ENumber "1"))
+    , Right (ESymbol Pun ",")
+    , Right (ESymbol Ord "\8230")
+    , Right (ESymbol Pun ",")
+    , Right (ESub (EIdentifier "a") (EIdentifier "p"))
+    , Right (ESymbol Pun ";")
+    , Right (ESub (EIdentifier "c") (ENumber "1"))
+    , Right (ESymbol Pun ",")
+    , Right (ESymbol Ord "\8230")
+    , Right (ESymbol Pun ",")
+    , Right (ESub (EIdentifier "c") (EIdentifier "q"))
+    , Right (ESymbol Pun ";")
+    , Right (EIdentifier "z")
+    ]
+, ESymbol Rel "="
+, EUnderover
+    True
+    (ESymbol Op "\8721")
+    (EGrouped [ EIdentifier "n" , ESymbol Rel "=" , ENumber "0" ])
+    (ESymbol Ord "\8734")
+, EFraction
+    NormalFrac
+    (EGrouped
+       [ ESub
+           (EDelimited
+              "(" ")" [ Right (ESub (EIdentifier "a") (ENumber "1")) ])
+           (EIdentifier "n")
+       , ESymbol Ord "\8943"
+       , ESub
+           (EDelimited
+              "(" ")" [ Right (ESub (EIdentifier "a") (EIdentifier "p")) ])
+           (EIdentifier "n")
+       ])
+    (EGrouped
+       [ ESub
+           (EDelimited
+              "(" ")" [ Right (ESub (EIdentifier "c") (ENumber "1")) ])
+           (EIdentifier "n")
+       , ESymbol Ord "\8943"
+       , ESub
+           (EDelimited
+              "(" ")" [ Right (ESub (EIdentifier "c") (EIdentifier "q")) ])
+           (EIdentifier "n")
+       ])
+, EFraction
+    NormalFrac
+    (ESuper (EIdentifier "z") (EIdentifier "n"))
+    (EGrouped [ EIdentifier "n" , ESymbol Ord "!" ])
+]
+>>> typst
+()_p F_q lr((a_1 comma dots.h comma a_p semi c_1 comma dots.h comma c_q semi z)) eq sum_(n eq 0)^oo frac(lr((a_1))_n dots.h.c lr((a_p))_n, lr((c_1))_n dots.h.c lr((c_q))_n) frac(z^n, n excl)
diff --git a/test/writer/typst/14.test b/test/writer/typst/14.test
new file mode 100644
--- /dev/null
+++ b/test/writer/typst/14.test
@@ -0,0 +1,7 @@
+<<< native
+[ EFraction NormalFrac (EIdentifier "a") (EIdentifier "b")
+, ESpace (2 % 9)
+, EFraction InlineFrac (EIdentifier "a") (EIdentifier "b")
+]
+>>> typst
+a / b med a / b
diff --git a/test/writer/typst/15.test b/test/writer/typst/15.test
new file mode 100644
--- /dev/null
+++ b/test/writer/typst/15.test
@@ -0,0 +1,4 @@
+<<< native
+[ EFraction NormalFrac (EIdentifier "a") (ENumber "2") ]
+>>> typst
+a / 2
diff --git a/test/writer/typst/16.test b/test/writer/typst/16.test
new file mode 100644
--- /dev/null
+++ b/test/writer/typst/16.test
@@ -0,0 +1,4 @@
+<<< native
+[ ENumber "3" , ESymbol Bin "\215" , ENumber "4" ]
+>>> typst
+3 times 4
diff --git a/test/writer/typst/17.test b/test/writer/typst/17.test
new file mode 100644
--- /dev/null
+++ b/test/writer/typst/17.test
@@ -0,0 +1,11 @@
+<<< native
+[ EIdentifier "x"
+, ESymbol Bin "*"
+, ENumber "4"
+, ESymbol Rel "="
+, ENumber "4"
+, ESymbol Bin "*"
+, EIdentifier "x"
+]
+>>> typst
+x ast 4 eq 4 ast x
diff --git a/test/writer/typst/18.test b/test/writer/typst/18.test
new file mode 100644
--- /dev/null
+++ b/test/writer/typst/18.test
@@ -0,0 +1,4 @@
+<<< native
+[ ENumber "1.3" , ESymbol Bin "\215" , ENumber ".2" ]
+>>> typst
+1.3 times .2
diff --git a/test/writer/typst/19.test b/test/writer/typst/19.test
new file mode 100644
--- /dev/null
+++ b/test/writer/typst/19.test
@@ -0,0 +1,83 @@
+<<< native
+[ EDelimited
+    "["
+    "]"
+    [ Right
+        (EArray
+           [ AlignCenter , AlignCenter ]
+           [ [ [ EFraction
+                   DisplayFrac
+                   (EGrouped
+                      [ ESymbol Ord "\8706" , ESub (EIdentifier "x") (ENumber "1") ])
+                   (EGrouped
+                      [ ESymbol Ord "\8706" , ESub (EIdentifier "y") (ENumber "1") ])
+               ]
+             , [ EFraction
+                   DisplayFrac
+                   (EGrouped
+                      [ ESymbol Ord "\8706" , ESub (EIdentifier "x") (ENumber "2") ])
+                   (EGrouped
+                      [ ESymbol Ord "\8706" , ESub (EIdentifier "y") (ENumber "1") ])
+               ]
+             ]
+           , [ [ ESpace (2 % 9) ] ]
+           , [ [ EFraction
+                   DisplayFrac
+                   (EGrouped
+                      [ ESymbol Ord "\8706" , ESub (EIdentifier "x") (ENumber "1") ])
+                   (EGrouped
+                      [ ESymbol Ord "\8706" , ESub (EIdentifier "y") (ENumber "2") ])
+               ]
+             , [ EFraction
+                   DisplayFrac
+                   (EGrouped
+                      [ ESymbol Ord "\8706" , ESub (EIdentifier "x") (ENumber "2") ])
+                   (EGrouped
+                      [ ESymbol Ord "\8706" , ESub (EIdentifier "y") (ENumber "2") ])
+               ]
+             ]
+           ])
+    ]
+, EDelimited
+    "("
+    ")"
+    [ Right
+        (EArray
+           [ AlignCenter , AlignCenter ]
+           [ [ [ ENumber "1" ] , [ ENumber "2" ] ]
+           , [ [ ENumber "3" ] , [ ENumber "4" ] ]
+           ])
+    ]
+, EDelimited
+    "{"
+    "}"
+    [ Right
+        (EArray
+           [ AlignCenter , AlignCenter ]
+           [ [ [ ENumber "1" ] , [ ENumber "2" ] ]
+           , [ [ ENumber "3" ] , [ ENumber "4" ] ]
+           ])
+    ]
+, EDelimited
+    "\8739"
+    "\8739"
+    [ Right
+        (EArray
+           [ AlignCenter , AlignCenter ]
+           [ [ [ ENumber "1" ] , [ ENumber "2" ] ]
+           , [ [ ENumber "3" ] , [ ENumber "4" ] ]
+           ])
+    ]
+, EDelimited
+    "\8741"
+    "\8741"
+    [ Right
+        (EArray
+           [ AlignCenter , AlignCenter ]
+           [ [ [ ENumber "1" ] , [ ENumber "2" ] ]
+           , [ [ ENumber "3" ] , [ ENumber "4" ] ]
+           ])
+    ]
+]
+>>> typst
+mat(delim: "[", frac(diff x_1, diff y_1), frac(diff x_2, diff y_1); med; frac(diff x_1, diff y_2), frac(diff x_2, diff y_2)) mat(delim: "(", 1, 2; 3, 4) mat(delim: "{", 1, 2; 3, 4) mat(delim: "||", 1, 2; 3, 4) mat(delim: "||", 1, 2; 3, 4)
diff --git a/test/writer/typst/20.test b/test/writer/typst/20.test
new file mode 100644
--- /dev/null
+++ b/test/writer/typst/20.test
@@ -0,0 +1,119 @@
+<<< native
+[ EStyled TextScript [ EIdentifier "A" ]
+, EStyled TextScript [ EIdentifier "B" ]
+, EStyled TextScript [ EIdentifier "C" ]
+, EStyled TextScript [ EIdentifier "D" ]
+, EStyled TextScript [ EIdentifier "E" ]
+, EStyled TextScript [ EIdentifier "F" ]
+, EStyled TextScript [ EIdentifier "G" ]
+, EStyled TextScript [ EIdentifier "H" ]
+, EStyled TextScript [ EIdentifier "I" ]
+, EStyled TextScript [ EIdentifier "J" ]
+, EStyled TextScript [ EIdentifier "K" ]
+, EStyled TextScript [ EIdentifier "L" ]
+, EStyled TextScript [ EIdentifier "M" ]
+, EStyled TextScript [ EIdentifier "N" ]
+, EStyled TextScript [ EIdentifier "O" ]
+, EStyled TextScript [ EIdentifier "P" ]
+, EStyled TextScript [ EIdentifier "Q" ]
+, EStyled TextScript [ EIdentifier "R" ]
+, EStyled TextScript [ EIdentifier "S" ]
+, EStyled TextScript [ EIdentifier "T" ]
+, EStyled TextScript [ EIdentifier "U" ]
+, EStyled TextScript [ EIdentifier "V" ]
+, EStyled TextScript [ EIdentifier "W" ]
+, EStyled TextScript [ EIdentifier "X" ]
+, EStyled TextScript [ EIdentifier "Y" ]
+, EStyled TextScript [ EIdentifier "Z" ]
+, EStyled TextScript [ EIdentifier "a" ]
+, EStyled TextScript [ EIdentifier "b" ]
+, EStyled TextScript [ EIdentifier "c" ]
+, EStyled TextScript [ EIdentifier "d" ]
+, EStyled TextScript [ EIdentifier "e" ]
+, EStyled TextScript [ EIdentifier "f" ]
+, EStyled TextScript [ EIdentifier "g" ]
+, EStyled TextScript [ EIdentifier "h" ]
+, EStyled TextScript [ EIdentifier "i" ]
+, EStyled TextScript [ EIdentifier "j" ]
+, EStyled TextScript [ EIdentifier "k" ]
+, EStyled TextScript [ EIdentifier "l" ]
+, EStyled TextScript [ EIdentifier "m" ]
+, EStyled TextScript [ EIdentifier "n" ]
+, EStyled TextScript [ EIdentifier "o" ]
+, EStyled TextScript [ EIdentifier "p" ]
+, EStyled TextScript [ EIdentifier "q" ]
+, EStyled TextScript [ EIdentifier "r" ]
+, EStyled TextScript [ EIdentifier "s" ]
+, EStyled TextScript [ EIdentifier "t" ]
+, EStyled TextScript [ EIdentifier "u" ]
+, EStyled TextScript [ EIdentifier "v" ]
+, EStyled TextScript [ EIdentifier "w" ]
+, EStyled TextScript [ EIdentifier "x" ]
+, EStyled TextScript [ EIdentifier "y" ]
+, EStyled TextScript [ EIdentifier "z" ]
+, EStyled TextDoubleStruck [ EIdentifier "A" ]
+, EStyled TextDoubleStruck [ EIdentifier "B" ]
+, EStyled TextDoubleStruck [ EIdentifier "C" ]
+, EStyled TextDoubleStruck [ EIdentifier "D" ]
+, EStyled TextDoubleStruck [ EIdentifier "E" ]
+, EStyled TextDoubleStruck [ EIdentifier "F" ]
+, EStyled TextDoubleStruck [ EIdentifier "G" ]
+, EStyled TextDoubleStruck [ EIdentifier "H" ]
+, EStyled TextDoubleStruck [ EIdentifier "I" ]
+, EStyled TextDoubleStruck [ EIdentifier "J" ]
+, EStyled TextDoubleStruck [ EIdentifier "K" ]
+, EStyled TextDoubleStruck [ EIdentifier "L" ]
+, EStyled TextDoubleStruck [ EIdentifier "M" ]
+, EStyled TextDoubleStruck [ EIdentifier "N" ]
+, EStyled TextDoubleStruck [ EIdentifier "O" ]
+, EStyled TextDoubleStruck [ EIdentifier "P" ]
+, EStyled TextDoubleStruck [ EIdentifier "Q" ]
+, EStyled TextDoubleStruck [ EIdentifier "R" ]
+, EStyled TextDoubleStruck [ EIdentifier "S" ]
+, EStyled TextDoubleStruck [ EIdentifier "T" ]
+, EStyled TextDoubleStruck [ EIdentifier "U" ]
+, EStyled TextDoubleStruck [ EIdentifier "V" ]
+, EStyled TextDoubleStruck [ EIdentifier "W" ]
+, EStyled TextDoubleStruck [ EIdentifier "X" ]
+, EStyled TextDoubleStruck [ EIdentifier "Y" ]
+, EStyled TextDoubleStruck [ EIdentifier "Z" ]
+, EStyled TextDoubleStruck [ EIdentifier "a" ]
+, EStyled TextDoubleStruck [ EIdentifier "b" ]
+, EStyled TextDoubleStruck [ EIdentifier "c" ]
+, EStyled TextDoubleStruck [ EIdentifier "d" ]
+, EStyled TextDoubleStruck [ EIdentifier "e" ]
+, EStyled TextDoubleStruck [ EIdentifier "f" ]
+, EStyled TextDoubleStruck [ EIdentifier "g" ]
+, EStyled TextDoubleStruck [ EIdentifier "h" ]
+, EStyled TextDoubleStruck [ EIdentifier "i" ]
+, EStyled TextDoubleStruck [ EIdentifier "j" ]
+, EStyled TextDoubleStruck [ EIdentifier "k" ]
+, EStyled TextDoubleStruck [ EIdentifier "l" ]
+, EStyled TextDoubleStruck [ EIdentifier "m" ]
+, EStyled TextDoubleStruck [ EIdentifier "n" ]
+, EStyled TextDoubleStruck [ EIdentifier "o" ]
+, EStyled TextDoubleStruck [ EIdentifier "p" ]
+, EStyled TextDoubleStruck [ EIdentifier "q" ]
+, EStyled TextDoubleStruck [ EIdentifier "r" ]
+, EStyled TextDoubleStruck [ EIdentifier "s" ]
+, EStyled TextDoubleStruck [ EIdentifier "t" ]
+, EStyled TextDoubleStruck [ EIdentifier "u" ]
+, EStyled TextDoubleStruck [ EIdentifier "v" ]
+, EStyled TextDoubleStruck [ EIdentifier "w" ]
+, EStyled TextDoubleStruck [ EIdentifier "x" ]
+, EStyled TextDoubleStruck [ EIdentifier "y" ]
+, EStyled TextDoubleStruck [ EIdentifier "z" ]
+, EStyled TextDoubleStruck [ ENumber "0" ]
+, EStyled TextDoubleStruck [ ENumber "1" ]
+, EStyled TextDoubleStruck [ ENumber "2" ]
+, EStyled TextDoubleStruck [ ENumber "3" ]
+, EStyled TextDoubleStruck [ ENumber "4" ]
+, EStyled TextDoubleStruck [ ENumber "5" ]
+, EStyled TextDoubleStruck [ ENumber "6" ]
+, EStyled TextDoubleStruck [ ENumber "7" ]
+, EStyled TextDoubleStruck [ ENumber "8" ]
+, EStyled TextDoubleStruck [ ENumber "9" ]
+, EStyled TextDoubleStruck [ ENumber "0" ]
+]
+>>> typst
+cal(A) cal(B) cal(C) cal(D) cal(E) cal(F) cal(G) cal(H) cal(I) cal(J) cal(K) cal(L) cal(M) cal(N) cal(O) cal(P) cal(Q) cal(R) cal(S) cal(T) cal(U) cal(V) cal(W) cal(X) cal(Y) cal(Z) cal(a) cal(b) cal(c) cal(d) cal(e) cal(f) cal(g) cal(h) cal(i) cal(j) cal(k) cal(l) cal(m) cal(n) cal(o) cal(p) cal(q) cal(r) cal(space) cal(t) cal(u) cal(v) cal(w) cal(x) cal(y) cal(z) bb(A) bb(B) bb(C) bb(D) bb(E) bb(F) bb(G) bb(H) bb(I) bb(J) bb(K) bb(L) bb(M) bb(N) bb(O) bb(P) bb(Q) bb(R) bb(S) bb(T) bb(U) bb(V) bb(W) bb(X) bb(Y) bb(Z) bb(a) bb(b) bb(c) bb(d) bb(e) bb(f) bb(g) bb(h) bb(i) bb(j) bb(k) bb(l) bb(m) bb(n) bb(o) bb(p) bb(q) bb(r) bb(space) bb(t) bb(u) bb(v) bb(w) bb(x) bb(y) bb(z) bb(0) bb(1) bb(2) bb(3) bb(4) bb(5) bb(6) bb(7) bb(8) bb(9) bb(0)
diff --git a/test/writer/typst/21.test b/test/writer/typst/21.test
new file mode 100644
--- /dev/null
+++ b/test/writer/typst/21.test
@@ -0,0 +1,9 @@
+<<< native
+[ ESub (EIdentifier "e") (ENumber "1")
+, ESymbol Rel "="
+, ESuper (EIdentifier "b") (ENumber "2")
+, ESymbol Bin "+"
+, ESuper (EIdentifier "c") (ENumber "22")
+]
+>>> typst
+e_1 eq b^2 plus c^22
diff --git a/test/writer/typst/22.test b/test/writer/typst/22.test
new file mode 100644
--- /dev/null
+++ b/test/writer/typst/22.test
@@ -0,0 +1,277 @@
+<<< native
+[ EArray
+    [ AlignLeft , AlignLeft ]
+    [ [ [ EText TextMonospace "textrm" ]
+      , [ EText TextNormal "ABCabc" ]
+      ]
+    , [ [ EText TextMonospace "mathrm" ]
+      , [ EStyled
+            TextNormal
+            [ EIdentifier "A"
+            , EIdentifier "B"
+            , EIdentifier "C"
+            , EIdentifier "a"
+            , EIdentifier "b"
+            , EIdentifier "c"
+            ]
+        ]
+      ]
+    , [ [ EText TextMonospace "mathup" ]
+      , [ EStyled
+            TextNormal
+            [ EIdentifier "A"
+            , EIdentifier "B"
+            , EIdentifier "C"
+            , EIdentifier "a"
+            , EIdentifier "b"
+            , EIdentifier "c"
+            ]
+        ]
+      ]
+    , [ [ EText TextMonospace "text" ]
+      , [ EText TextNormal "ABCabc" ]
+      ]
+    , [ [ EText TextMonospace "mbox" ]
+      , [ EText TextNormal "ABCabc" ]
+      ]
+    , [ [ EText TextMonospace "mathbf" ]
+      , [ EStyled
+            TextBold
+            [ EIdentifier "A"
+            , EIdentifier "B"
+            , EIdentifier "C"
+            , EIdentifier "a"
+            , EIdentifier "b"
+            , EIdentifier "c"
+            ]
+        ]
+      ]
+    , [ [ EText TextMonospace "mathbfup" ]
+      , [ EStyled
+            TextBold
+            [ EIdentifier "A"
+            , EIdentifier "B"
+            , EIdentifier "C"
+            , EIdentifier "a"
+            , EIdentifier "b"
+            , EIdentifier "c"
+            ]
+        ]
+      ]
+    , [ [ EText TextMonospace "textbf" ]
+      , [ EText TextBold "ABCabc" ]
+      ]
+    , [ [ EText TextMonospace "mathit" ]
+      , [ EStyled
+            TextItalic
+            [ EIdentifier "A"
+            , EIdentifier "B"
+            , EIdentifier "C"
+            , EIdentifier "a"
+            , EIdentifier "b"
+            , EIdentifier "c"
+            ]
+        ]
+      ]
+    , [ [ EText TextMonospace "textit" ]
+      , [ EText TextItalic "ABCabc" ]
+      ]
+    , [ [ EText TextMonospace "mathtt" ]
+      , [ EStyled
+            TextMonospace
+            [ EIdentifier "A"
+            , EIdentifier "B"
+            , EIdentifier "C"
+            , EIdentifier "a"
+            , EIdentifier "b"
+            , EIdentifier "c"
+            ]
+        ]
+      ]
+    , [ [ EText TextMonospace "texttt" ]
+      , [ EText TextMonospace "ABCabc" ]
+      ]
+    , [ [ EText TextMonospace "mathsf" ]
+      , [ EStyled
+            TextSansSerif
+            [ EIdentifier "A"
+            , EIdentifier "B"
+            , EIdentifier "C"
+            , EIdentifier "a"
+            , EIdentifier "b"
+            , EIdentifier "c"
+            ]
+        ]
+      ]
+    , [ [ EText TextMonospace "mathsfup" ]
+      , [ EStyled
+            TextSansSerif
+            [ EIdentifier "A"
+            , EIdentifier "B"
+            , EIdentifier "C"
+            , EIdentifier "a"
+            , EIdentifier "b"
+            , EIdentifier "c"
+            ]
+        ]
+      ]
+    , [ [ EText TextMonospace "mathbb" ]
+      , [ EStyled
+            TextDoubleStruck
+            [ EIdentifier "A"
+            , EIdentifier "B"
+            , EIdentifier "C"
+            , EIdentifier "a"
+            , EIdentifier "b"
+            , EIdentifier "c"
+            ]
+        ]
+      ]
+    , [ [ EText TextMonospace "mathcal" ]
+      , [ EStyled
+            TextScript
+            [ EIdentifier "A"
+            , EIdentifier "B"
+            , EIdentifier "C"
+            , EIdentifier "a"
+            , EIdentifier "b"
+            , EIdentifier "c"
+            ]
+        ]
+      ]
+    , [ [ EText TextMonospace "mathscr" ]
+      , [ EStyled
+            TextScript
+            [ EIdentifier "A"
+            , EIdentifier "B"
+            , EIdentifier "C"
+            , EIdentifier "a"
+            , EIdentifier "b"
+            , EIdentifier "c"
+            ]
+        ]
+      ]
+    , [ [ EText TextMonospace "mathfrak" ]
+      , [ EStyled
+            TextFraktur
+            [ EIdentifier "A"
+            , EIdentifier "B"
+            , EIdentifier "C"
+            , EIdentifier "a"
+            , EIdentifier "b"
+            , EIdentifier "c"
+            ]
+        ]
+      ]
+    , [ [ EText TextMonospace "mathbfit" ]
+      , [ EStyled
+            TextBoldItalic
+            [ EIdentifier "A"
+            , EIdentifier "B"
+            , EIdentifier "C"
+            , EIdentifier "a"
+            , EIdentifier "b"
+            , EIdentifier "c"
+            ]
+        ]
+      ]
+    , [ [ EText TextMonospace "mathbfsfup" ]
+      , [ EStyled
+            TextSansSerifBold
+            [ EIdentifier "A"
+            , EIdentifier "B"
+            , EIdentifier "C"
+            , EIdentifier "a"
+            , EIdentifier "b"
+            , EIdentifier "c"
+            ]
+        ]
+      ]
+    , [ [ EText TextMonospace "mathbfsfit" ]
+      , [ EStyled
+            TextSansSerifBoldItalic
+            [ EIdentifier "A"
+            , EIdentifier "B"
+            , EIdentifier "C"
+            , EIdentifier "a"
+            , EIdentifier "b"
+            , EIdentifier "c"
+            ]
+        ]
+      ]
+    , [ [ EText TextMonospace "mathbfscr" ]
+      , [ EStyled
+            TextBoldScript
+            [ EIdentifier "A"
+            , EIdentifier "B"
+            , EIdentifier "C"
+            , EIdentifier "a"
+            , EIdentifier "b"
+            , EIdentifier "c"
+            ]
+        ]
+      ]
+    , [ [ EText TextMonospace "mathbffrak" ]
+      , [ EStyled
+            TextBoldFraktur
+            [ EIdentifier "A"
+            , EIdentifier "B"
+            , EIdentifier "C"
+            , EIdentifier "a"
+            , EIdentifier "b"
+            , EIdentifier "c"
+            ]
+        ]
+      ]
+    , [ [ EText TextMonospace "mathbfcal" ]
+      , [ EStyled
+            TextBoldScript
+            [ EIdentifier "A"
+            , EIdentifier "B"
+            , EIdentifier "C"
+            , EIdentifier "a"
+            , EIdentifier "b"
+            , EIdentifier "c"
+            ]
+        ]
+      ]
+    , [ [ EText TextMonospace "mathsfit" ]
+      , [ EStyled
+            TextSansSerifItalic
+            [ EIdentifier "A"
+            , EIdentifier "B"
+            , EIdentifier "C"
+            , EIdentifier "a"
+            , EIdentifier "b"
+            , EIdentifier "c"
+            ]
+        ]
+      ]
+    ]
+]
+>>> typst
+mono("textrm") & upright("ABCabc")\
+mono("mathrm") & upright(A B C a b c)\
+mono("mathup") & upright(A B C a b c)\
+mono("text") & upright("ABCabc")\
+mono("mbox") & upright("ABCabc")\
+mono("mathbf") & bold(A B C a b c)\
+mono("mathbfup") & bold(A B C a b c)\
+mono("textbf") & bold("ABCabc")\
+mono("mathit") & italic(A B C a b c)\
+mono("textit") & italic("ABCabc")\
+mono("mathtt") & mono(A B C a b c)\
+mono("texttt") & mono("ABCabc")\
+mono("mathsf") & sans(A B C a b c)\
+mono("mathsfup") & sans(A B C a b c)\
+mono("mathbb") & bb(A B C a b c)\
+mono("mathcal") & cal(A B C a b c)\
+mono("mathscr") & cal(A B C a b c)\
+mono("mathfrak") & frak(A B C a b c)\
+mono("mathbfit") & bold(italic(A B C a b c))\
+mono("mathbfsfup") & bold(sans(A B C a b c))\
+mono("mathbfsfit") & bold(italic(sans(A B C a b c)))\
+mono("mathbfscr") & bold(cal(A B C a b c))\
+mono("mathbffrak") & bold(frak(A B C a b c))\
+mono("mathbfcal") & bold(cal(A B C a b c))\
+mono("mathsfit") & italic(sans(A B C a b c))
diff --git a/test/writer/typst/23.test b/test/writer/typst/23.test
new file mode 100644
--- /dev/null
+++ b/test/writer/typst/23.test
@@ -0,0 +1,4 @@
+<<< native
+[ ENumber "1" , ESymbol Ord "." ]
+>>> typst
+1 dot
diff --git a/test/writer/typst/abs1.test b/test/writer/typst/abs1.test
new file mode 100644
--- /dev/null
+++ b/test/writer/typst/abs1.test
@@ -0,0 +1,4 @@
+<<< native
+[ EDelimited "|" "|" [ Right (EIdentifier "x") ] ]
+>>> typst
+lr(|x|)
diff --git a/test/writer/typst/axiom_of_power_set.test b/test/writer/typst/axiom_of_power_set.test
new file mode 100644
--- /dev/null
+++ b/test/writer/typst/axiom_of_power_set.test
@@ -0,0 +1,36 @@
+<<< native
+[ ESymbol Op "\8704"
+, EIdentifier "A"
+, ESpace (1 % 6)
+, ESymbol Op "\8707"
+, EIdentifier "P"
+, ESpace (1 % 6)
+, ESymbol Op "\8704"
+, EIdentifier "B"
+, ESpace (1 % 6)
+, EDelimited
+    "["
+    "]"
+    [ Right (EIdentifier "B")
+    , Right (ESymbol Rel "\8712")
+    , Right (EIdentifier "P")
+    , Right (ESymbol Rel "\8660")
+    , Right (ESymbol Op "\8704")
+    , Right (EIdentifier "C")
+    , Right (ESpace (1 % 6))
+    , Right
+        (EDelimited
+           "("
+           ")"
+           [ Right (EIdentifier "C")
+           , Right (ESymbol Rel "\8712")
+           , Right (EIdentifier "B")
+           , Right (ESymbol Rel "\8658")
+           , Right (EIdentifier "C")
+           , Right (ESymbol Rel "\8712")
+           , Right (EIdentifier "A")
+           ])
+    ]
+]
+>>> typst
+forall A thin exists P thin forall B thin lr([B in P arrow.l.r.double forall C thin lr((C in B arrow.r.double C in A))])
diff --git a/test/writer/typst/binomial_coefficient.test b/test/writer/typst/binomial_coefficient.test
new file mode 100644
--- /dev/null
+++ b/test/writer/typst/binomial_coefficient.test
@@ -0,0 +1,43 @@
+<<< native
+[ EStyled TextBold [ EIdentifier "C" ]
+, EDelimited
+    "("
+    ")"
+    [ Right (EIdentifier "n")
+    , Right (ESymbol Pun ",")
+    , Right (EIdentifier "k")
+    ]
+, ESymbol Rel "="
+, ESubsup
+    (EStyled TextBold [ EIdentifier "C" ])
+    (EIdentifier "k")
+    (EIdentifier "n")
+, ESymbol Rel "="
+, ESub (EGrouped []) (EIdentifier "n")
+, ESub (EStyled TextBold [ EIdentifier "C" ]) (EIdentifier "k")
+, ESymbol Rel "="
+, EDelimited
+    "("
+    ")"
+    [ Right (EFraction NoLineFrac (EIdentifier "n") (EIdentifier "k"))
+    ]
+, ESymbol Rel "="
+, EFraction
+    NormalFrac
+    (EGrouped [ EIdentifier "n" , ESymbol Ord "!" ])
+    (EGrouped
+       [ EIdentifier "k"
+       , ESymbol Ord "!"
+       , ESpace (1 % 6)
+       , EDelimited
+           "("
+           ")"
+           [ Right (EIdentifier "n")
+           , Right (ESymbol Bin "\8722")
+           , Right (EIdentifier "k")
+           ]
+       , ESymbol Ord "!"
+       ])
+]
+>>> typst
+bold(C) lr((n comma k)) eq bold(C)_k^n eq ()_n bold(C)_k eq lr((n / k)) eq frac(n excl, k excl thin lr((n minus k)) excl)
diff --git a/test/writer/typst/boxed.test b/test/writer/typst/boxed.test
new file mode 100644
--- /dev/null
+++ b/test/writer/typst/boxed.test
@@ -0,0 +1,12 @@
+<<< native
+[ EBoxed
+    (EGrouped
+       [ ESuper (EIdentifier "x") (ENumber "2")
+       , ESymbol Bin "+"
+       , ESuper (EIdentifier "y") (ENumber "2")
+       , ESymbol Bin "+"
+       , ESuper (EIdentifier "z") (ENumber "2")
+       ])
+]
+>>> typst
+#box([x^2 plus y^2 plus z^2])
diff --git a/test/writer/typst/chain2.test b/test/writer/typst/chain2.test
new file mode 100644
--- /dev/null
+++ b/test/writer/typst/chain2.test
@@ -0,0 +1,52 @@
+<<< native
+[ ESubsup (ESymbol Op "\8747") (ENumber "0") (ENumber "1")
+, EIdentifier "f"
+, EDelimited "(" ")" [ Right (EIdentifier "x") ]
+, ESpace (1 % 9)
+, ESymbol Ord "\8518"
+, EIdentifier "x"
+, ESymbol Rel "="
+, EUnderover
+    False
+    (ESymbol Op "\8721")
+    (EGrouped [ EIdentifier "i" , ESymbol Rel "=" , ENumber "0" ])
+    (EIdentifier "\8734")
+, ESub (EIdentifier "x") (EIdentifier "i")
+, ESymbol Rel "="
+, EUnderover
+    False
+    (ESymbol Op "\8719")
+    (EGrouped [ EIdentifier "i" , ESymbol Rel "=" , ENumber "0" ])
+    (EIdentifier "\8734")
+, ESub (EIdentifier "x") (EIdentifier "i")
+, ESymbol Rel "="
+, EUnderover
+    False
+    (ESymbol Op "\8720")
+    (EGrouped [ EIdentifier "i" , ESymbol Rel "=" , ENumber "0" ])
+    (EIdentifier "\8734")
+, ESub (EIdentifier "x") (EIdentifier "i")
+, ESymbol Rel "="
+, ESubsup (ESymbol Op "\8750") (ENumber "0") (ENumber "1")
+, EIdentifier "f"
+, EDelimited "(" ")" [ Right (EIdentifier "x") ]
+, ESpace (1 % 9)
+, ESymbol Ord "\8518"
+, EIdentifier "x"
+, ESymbol Rel "="
+, ESubsup (ESymbol Op "\8748") (ENumber "0") (ENumber "1")
+, EIdentifier "f"
+, EDelimited "(" ")" [ Right (EIdentifier "x") ]
+, ESpace (1 % 9)
+, ESymbol Ord "\8518"
+, EIdentifier "x"
+, ESymbol Rel "="
+, ESubsup (ESymbol Op "\8749") (ENumber "0") (ENumber "1")
+, EIdentifier "f"
+, EDelimited "(" ")" [ Right (EIdentifier "x") ]
+, ESpace (1 % 9)
+, ESymbol Ord "\8518"
+, EIdentifier "x"
+]
+>>> typst
+integral_0^1 f lr((x)) #h(0em) ⅆ x eq sum_(i eq 0)^oo x_i eq product_(i eq 0)^oo x_i eq product.co_(i eq 0)^oo x_i eq integral.cont_0^1 f lr((x)) #h(0em) ⅆ x eq integral.double_0^1 f lr((x)) #h(0em) ⅆ x eq integral.triple_0^1 f lr((x)) #h(0em) ⅆ x
diff --git a/test/writer/typst/choose.test b/test/writer/typst/choose.test
new file mode 100644
--- /dev/null
+++ b/test/writer/typst/choose.test
@@ -0,0 +1,21 @@
+<<< native
+[ EDelimited
+    "("
+    ")"
+    [ Right
+        (EFraction
+           NoLineFrac
+           (EIdentifier "a")
+           (EDelimited
+              "{"
+              "}"
+              [ Right
+                  (EFraction
+                     NoLineFrac
+                     (EIdentifier "b")
+                     (EGrouped [ EIdentifier "c" , ESymbol Bin "+" , ENumber "2" ]))
+              ]))
+    ]
+]
+>>> typst
+lr((a / lr({frac(b, c plus 2)})))
diff --git a/test/writer/typst/complex1.test b/test/writer/typst/complex1.test
new file mode 100644
--- /dev/null
+++ b/test/writer/typst/complex1.test
@@ -0,0 +1,622 @@
+<<< native
+[ EArray
+    [ AlignCenter , AlignCenter ]
+    [ [ [ EText TextNormal "Bernoulli Trials" ]
+      , [ EGrouped
+            [ EGrouped
+                [ EIdentifier "P"
+                , ESymbol Open "("
+                , EIdentifier "E"
+                , ESymbol Close ")"
+                ]
+            , ESymbol Rel "="
+            , EDelimited
+                "("
+                ")"
+                [ Right (EFraction NormalFrac (EIdentifier "n") (EIdentifier "k"))
+                ]
+            , ESubsup (EIdentifier "p") (EGrouped []) (EIdentifier "k")
+            , ESubsup
+                (EGrouped
+                   [ ESymbol Open "("
+                   , ENumber "1"
+                   , ESymbol Bin "-"
+                   , EIdentifier "p"
+                   , ESymbol Close ")"
+                   ])
+                (EGrouped [])
+                (EGrouped [ EIdentifier "n" , ESymbol Bin "-" , EIdentifier "k" ])
+            ]
+        ]
+      ]
+    , [ [ EText TextNormal "Cauchy-Schwarz Inequality" ]
+      , [ EGrouped
+            [ ESubsup
+                (EDelimited
+                   "("
+                   ")"
+                   [ Right
+                       (EUnderover
+                          False
+                          (ESymbol Op "\8721")
+                          (EGrouped [ EIdentifier "k" , ESymbol Rel "=" , ENumber "1" ])
+                          (EIdentifier "n"))
+                   , Right (ESubsup (EIdentifier "a") (EIdentifier "k") (EGrouped []))
+                   , Right (ESubsup (EIdentifier "b") (EIdentifier "k") (EGrouped []))
+                   ])
+                (EGrouped [])
+                (ENumber "2")
+            , ESymbol Rel "\8804"
+            , EDelimited
+                "("
+                ")"
+                [ Right
+                    (EUnderover
+                       False
+                       (ESymbol Op "\8721")
+                       (EGrouped [ EIdentifier "k" , ESymbol Rel "=" , ENumber "1" ])
+                       (EIdentifier "n"))
+                , Right (ESubsup (EIdentifier "a") (EIdentifier "k") (ENumber "2"))
+                ]
+            , EDelimited
+                "("
+                ")"
+                [ Right
+                    (EUnderover
+                       False
+                       (ESymbol Op "\8721")
+                       (EGrouped [ EIdentifier "k" , ESymbol Rel "=" , ENumber "1" ])
+                       (EIdentifier "n"))
+                , Right (ESubsup (EIdentifier "b") (EIdentifier "k") (ENumber "2"))
+                ]
+            ]
+        ]
+      ]
+    , [ [ EText TextNormal "Cauchy Formula" ]
+      , [ EGrouped
+            [ EIdentifier "f"
+            , ESymbol Open "("
+            , EIdentifier "z"
+            , ESymbol Close ")"
+            , ESpace (1 % 6)
+            , ESymbol Bin "\183"
+            , ESubsup (EIdentifier "Ind") (EIdentifier "\947") (EGrouped [])
+            , ESymbol Open "("
+            , EIdentifier "z"
+            , ESymbol Close ")"
+            , ESymbol Rel "="
+            , EFraction
+                NormalFrac
+                (ENumber "1")
+                (EGrouped [ ENumber "2" , EIdentifier "\960" , EIdentifier "i" ])
+            , EUnderover
+                False (ESymbol Op "\8750") (EIdentifier "\947") (EGrouped [])
+            , EFraction
+                NormalFrac
+                (EGrouped
+                   [ EIdentifier "f"
+                   , ESymbol Open "("
+                   , EIdentifier "\958"
+                   , ESymbol Close ")"
+                   ])
+                (EGrouped
+                   [ EIdentifier "\958" , ESymbol Bin "-" , EIdentifier "z" ])
+            , ESpace (1 % 6)
+            , EIdentifier "d"
+            , EIdentifier "\958"
+            ]
+        ]
+      ]
+    , [ [ EText TextNormal "Cross Product" ]
+      , [ EGrouped
+            [ ESubsup (EIdentifier "V") (ENumber "1") (EGrouped [])
+            , ESymbol Bin "\215"
+            , ESubsup (EIdentifier "V") (ENumber "2") (EGrouped [])
+            , ESymbol Rel "="
+            , EDelimited
+                "|"
+                "|"
+                [ Right
+                    (EArray
+                       [ AlignCenter , AlignCenter , AlignCenter ]
+                       [ [ [ EIdentifier "i" ]
+                         , [ EIdentifier "j" ]
+                         , [ EIdentifier "k" ]
+                         ]
+                       , [ [ EFraction
+                               NormalFrac
+                               (EGrouped [ ESymbol Ord "\8706" , EIdentifier "X" ])
+                               (EGrouped [ ESymbol Ord "\8706" , EIdentifier "u" ])
+                           ]
+                         , [ EFraction
+                               NormalFrac
+                               (EGrouped [ ESymbol Ord "\8706" , EIdentifier "Y" ])
+                               (EGrouped [ ESymbol Ord "\8706" , EIdentifier "u" ])
+                           ]
+                         , [ ENumber "0" ]
+                         ]
+                       , [ [ EFraction
+                               NormalFrac
+                               (EGrouped [ ESymbol Ord "\8706" , EIdentifier "X" ])
+                               (EGrouped [ ESymbol Ord "\8706" , EIdentifier "v" ])
+                           ]
+                         , [ EFraction
+                               NormalFrac
+                               (EGrouped [ ESymbol Ord "\8706" , EIdentifier "Y" ])
+                               (EGrouped [ ESymbol Ord "\8706" , EIdentifier "v" ])
+                           ]
+                         , [ ENumber "0" ]
+                         ]
+                       ])
+                ]
+            ]
+        ]
+      ]
+    , [ [ EText TextNormal "Vandermonde Determinant" ]
+      , [ EGrouped
+            [ EDelimited
+                "|"
+                "|"
+                [ Right
+                    (EArray
+                       [ AlignCenter , AlignCenter , AlignCenter , AlignCenter ]
+                       [ [ [ ENumber "1" ]
+                         , [ ENumber "1" ]
+                         , [ ESymbol Ord "\8943" ]
+                         , [ ENumber "1" ]
+                         ]
+                       , [ [ ESubsup (EIdentifier "v") (ENumber "1") (EGrouped []) ]
+                         , [ ESubsup (EIdentifier "v") (ENumber "2") (EGrouped []) ]
+                         , [ ESymbol Ord "\8943" ]
+                         , [ ESubsup (EIdentifier "v") (EIdentifier "n") (EGrouped []) ]
+                         ]
+                       , [ [ ESubsup (EIdentifier "v") (ENumber "1") (ENumber "2") ]
+                         , [ ESubsup (EIdentifier "v") (ENumber "2") (ENumber "2") ]
+                         , [ ESymbol Ord "\8943" ]
+                         , [ ESubsup (EIdentifier "v") (EIdentifier "n") (ENumber "2") ]
+                         ]
+                       , [ [ ESymbol Rel "\8942" ]
+                         , [ ESymbol Rel "\8942" ]
+                         , [ ESymbol Rel "\8945" ]
+                         , [ ESymbol Rel "\8942" ]
+                         ]
+                       , [ [ ESubsup
+                               (EIdentifier "v")
+                               (ENumber "1")
+                               (EGrouped [ EIdentifier "n" , ESymbol Bin "-" , ENumber "1" ])
+                           ]
+                         , [ ESubsup
+                               (EIdentifier "v")
+                               (ENumber "2")
+                               (EGrouped [ EIdentifier "n" , ESymbol Bin "-" , ENumber "1" ])
+                           ]
+                         , [ ESymbol Ord "\8943" ]
+                         , [ ESubsup
+                               (EIdentifier "v")
+                               (EIdentifier "n")
+                               (EGrouped [ EIdentifier "n" , ESymbol Bin "-" , ENumber "1" ])
+                           ]
+                         ]
+                       ])
+                ]
+            , ESymbol Rel "="
+            , EUnderover
+                False
+                (ESymbol Op "\8719")
+                (EGrouped
+                   [ ENumber "1"
+                   , ESymbol Rel "\8804"
+                   , EIdentifier "i"
+                   , ESymbol Rel "<"
+                   , EIdentifier "j"
+                   , ESymbol Rel "\8804"
+                   , EIdentifier "n"
+                   ])
+                (EGrouped [])
+            , ESymbol Open "("
+            , ESubsup (EIdentifier "v") (EIdentifier "j") (EGrouped [])
+            , ESymbol Bin "-"
+            , ESubsup (EIdentifier "v") (EIdentifier "i") (EGrouped [])
+            , ESymbol Close ")"
+            ]
+        ]
+      ]
+    , [ [ EText TextNormal "Lorenz Equations" ]
+      , [ EArray
+            [ AlignCenter , AlignCenter , AlignCenter ]
+            [ [ [ EUnderover
+                    False (EIdentifier "x") (EGrouped []) (ESymbol Accent "\729")
+                ]
+              , [ ESymbol Rel "=" ]
+              , [ EGrouped
+                    [ EIdentifier "\963"
+                    , ESymbol Open "("
+                    , EIdentifier "y"
+                    , ESymbol Bin "-"
+                    , EIdentifier "x"
+                    , ESymbol Close ")"
+                    ]
+                ]
+              ]
+            , [ [ EUnderover
+                    False (EIdentifier "y") (EGrouped []) (ESymbol Accent "\729")
+                ]
+              , [ ESymbol Rel "=" ]
+              , [ EGrouped
+                    [ EIdentifier "\961"
+                    , EIdentifier "x"
+                    , ESymbol Bin "-"
+                    , EIdentifier "y"
+                    , ESymbol Bin "-"
+                    , EIdentifier "x"
+                    , EIdentifier "z"
+                    ]
+                ]
+              ]
+            , [ [ EUnderover
+                    False (EIdentifier "z") (EGrouped []) (ESymbol Accent "\729")
+                ]
+              , [ ESymbol Rel "=" ]
+              , [ EGrouped
+                    [ ESymbol Bin "-"
+                    , EIdentifier "\946"
+                    , EIdentifier "z"
+                    , ESymbol Bin "+"
+                    , EIdentifier "x"
+                    , EIdentifier "y"
+                    ]
+                ]
+              ]
+            ]
+        ]
+      ]
+    , [ [ EText TextNormal "Maxwell's Equations" ]
+      , [ EDelimited
+            "{"
+            ""
+            [ Right
+                (EArray
+                   [ AlignCenter , AlignCenter , AlignCenter ]
+                   [ [ [ EGrouped
+                           [ ESymbol Ord "\8711"
+                           , ESpace (0 % 1)
+                           , ESymbol Bin "\215"
+                           , EUnderover
+                               False (EIdentifier "B") (EGrouped []) (ESymbol Accent "\8636")
+                           , ESymbol Bin "-"
+                           , ESpace (1 % 6)
+                           , EFraction NormalFrac (ENumber "1") (EIdentifier "c")
+                           , ESpace (1 % 6)
+                           , EFraction
+                               NormalFrac
+                               (EGrouped
+                                  [ ESymbol Ord "\8706"
+                                  , ESpace (0 % 1)
+                                  , EUnderover
+                                      False (EIdentifier "E") (EGrouped []) (ESymbol Accent "\8636")
+                                  ])
+                               (EGrouped
+                                  [ ESymbol Ord "\8706" , ESpace (0 % 1) , EIdentifier "t" ])
+                           ]
+                       ]
+                     , [ ESymbol Rel "=" ]
+                     , [ EGrouped
+                           [ EFraction
+                               NormalFrac
+                               (EGrouped [ ENumber "4" , EIdentifier "\960" ])
+                               (EIdentifier "c")
+                           , ESpace (1 % 6)
+                           , EUnderover
+                               False (EIdentifier "j") (EGrouped []) (ESymbol Accent "\8636")
+                           ]
+                       ]
+                     ]
+                   , [ [ EGrouped
+                           [ ESymbol Ord "\8711"
+                           , ESpace (0 % 1)
+                           , ESymbol Bin "\183"
+                           , EUnderover
+                               False (EIdentifier "E") (EGrouped []) (ESymbol Accent "\8636")
+                           ]
+                       ]
+                     , [ ESymbol Rel "=" ]
+                     , [ EGrouped
+                           [ ENumber "4" , EIdentifier "\960" , EIdentifier "\961" ]
+                       ]
+                     ]
+                   , [ [ EGrouped
+                           [ ESymbol Ord "\8711"
+                           , ESpace (0 % 1)
+                           , ESymbol Bin "\215"
+                           , EUnderover
+                               False (EIdentifier "E") (EGrouped []) (ESymbol Accent "\8636")
+                           , ESpace (1 % 6)
+                           , ESymbol Bin "+"
+                           , ESpace (1 % 6)
+                           , EFraction NormalFrac (ENumber "1") (EIdentifier "c")
+                           , ESpace (1 % 6)
+                           , EFraction
+                               NormalFrac
+                               (EGrouped
+                                  [ ESymbol Ord "\8706"
+                                  , ESpace (0 % 1)
+                                  , EUnderover
+                                      False (EIdentifier "B") (EGrouped []) (ESymbol Accent "\8636")
+                                  ])
+                               (EGrouped
+                                  [ ESymbol Ord "\8706" , ESpace (0 % 1) , EIdentifier "t" ])
+                           ]
+                       ]
+                     , [ ESymbol Rel "=" ]
+                     , [ EUnderover
+                           False (ENumber "0") (EGrouped []) (ESymbol Accent "\8636")
+                       ]
+                     ]
+                   , [ [ EGrouped
+                           [ ESymbol Ord "\8711"
+                           , ESpace (0 % 1)
+                           , ESymbol Bin "\183"
+                           , EUnderover
+                               False (EIdentifier "B") (EGrouped []) (ESymbol Accent "\8636")
+                           ]
+                       ]
+                     , [ ESymbol Rel "=" ]
+                     , [ ENumber "0" ]
+                     ]
+                   ])
+            ]
+        ]
+      ]
+    , [ [ EText TextNormal "Einstein Field Equations" ]
+      , [ EGrouped
+            [ ESubsup
+                (EIdentifier "R")
+                (EGrouped [ EIdentifier "\956" , EIdentifier "\957" ])
+                (EGrouped [])
+            , ESymbol Bin "-"
+            , EFraction NormalFrac (ENumber "1") (ENumber "2")
+            , ESpace (1 % 6)
+            , ESubsup
+                (EIdentifier "g")
+                (EGrouped [ EIdentifier "\956" , EIdentifier "\957" ])
+                (EGrouped [])
+            , ESpace (1 % 6)
+            , EIdentifier "R"
+            , ESymbol Rel "="
+            , EFraction
+                NormalFrac
+                (EGrouped [ ENumber "8" , EIdentifier "\960" , EIdentifier "G" ])
+                (ESubsup (EIdentifier "c") (EGrouped []) (ENumber "4"))
+            , ESpace (1 % 6)
+            , ESubsup
+                (EIdentifier "T")
+                (EGrouped [ EIdentifier "\956" , EIdentifier "\957" ])
+                (EGrouped [])
+            ]
+        ]
+      ]
+    , [ [ EText TextNormal "Ramanujan Identity" ]
+      , [ EGrouped
+            [ EFraction
+                NormalFrac
+                (ENumber "1")
+                (EGrouped
+                   [ ESymbol Open "("
+                   , ESqrt (EGrouped [ EIdentifier "\966" , ESqrt (ENumber "5") ])
+                   , ESymbol Bin "-"
+                   , EIdentifier "\966"
+                   , ESymbol Close ")"
+                   , ESubsup
+                       (EIdentifier "e")
+                       (EGrouped [])
+                       (EFraction NormalFrac (ENumber "25") (EIdentifier "\960"))
+                   ])
+            , ESymbol Rel "="
+            , ENumber "1"
+            , ESymbol Bin "+"
+            , EFraction
+                NormalFrac
+                (ESubsup
+                   (EIdentifier "e")
+                   (EGrouped [])
+                   (EGrouped [ ESymbol Bin "-" , ENumber "2" , EIdentifier "\960" ]))
+                (EGrouped
+                   [ ENumber "1"
+                   , ESymbol Bin "+"
+                   , EFraction
+                       NormalFrac
+                       (ESubsup
+                          (EIdentifier "e")
+                          (EGrouped [])
+                          (EGrouped [ ESymbol Bin "-" , ENumber "4" , EIdentifier "\960" ]))
+                       (EGrouped
+                          [ ENumber "1"
+                          , ESymbol Bin "+"
+                          , EFraction
+                              NormalFrac
+                              (ESubsup
+                                 (EIdentifier "e")
+                                 (EGrouped [])
+                                 (EGrouped [ ESymbol Bin "-" , ENumber "6" , EIdentifier "\960" ]))
+                              (EGrouped
+                                 [ ENumber "1"
+                                 , ESymbol Bin "+"
+                                 , EFraction
+                                     NormalFrac
+                                     (ESubsup
+                                        (EIdentifier "e")
+                                        (EGrouped [])
+                                        (EGrouped
+                                           [ ESymbol Bin "-" , ENumber "8" , EIdentifier "\960" ]))
+                                     (EGrouped
+                                        [ ENumber "1" , ESymbol Bin "+" , ESymbol Ord "\8230" ])
+                                 ])
+                          ])
+                   ])
+            ]
+        ]
+      ]
+    , [ [ EText TextNormal "Another Ramanujan identity" ]
+      , [ EGrouped
+            [ EUnderover
+                False
+                (ESymbol Op "\8721")
+                (EGrouped [ EIdentifier "k" , ESymbol Rel "=" , ENumber "1" ])
+                (EIdentifier "\8734")
+            , EFraction
+                NormalFrac
+                (ENumber "1")
+                (ESubsup
+                   (ENumber "2")
+                   (EGrouped [])
+                   (EGrouped
+                      [ ESymbol Open "\8970"
+                      , EIdentifier "k"
+                      , ESymbol Bin "\183"
+                      , ESpace (0 % 1)
+                      , EIdentifier "\966"
+                      , ESymbol Close "\8971"
+                      ]))
+            , ESymbol Rel "="
+            , EFraction
+                NormalFrac
+                (ENumber "1")
+                (EGrouped
+                   [ ESubsup (ENumber "2") (EGrouped []) (ENumber "0")
+                   , ESymbol Bin "+"
+                   , EFraction
+                       NormalFrac
+                       (ENumber "1")
+                       (EGrouped
+                          [ ESubsup (ENumber "2") (EGrouped []) (ENumber "1")
+                          , ESymbol Bin "+"
+                          , ESymbol Ord "\8943"
+                          ])
+                   ])
+            ]
+        ]
+      ]
+    , [ [ EText TextNormal "Rogers-Ramanujan Identity" ]
+      , [ EGrouped
+            [ ENumber "1"
+            , ESymbol Bin "+"
+            , EGrouped
+                [ EUnderover
+                    False
+                    (ESymbol Op "\8721")
+                    (EGrouped [ EIdentifier "k" , ESymbol Rel "=" , ENumber "1" ])
+                    (EIdentifier "\8734")
+                , EFraction
+                    NormalFrac
+                    (ESubsup
+                       (EIdentifier "q")
+                       (EGrouped [])
+                       (EGrouped
+                          [ ESubsup (EIdentifier "k") (EGrouped []) (ENumber "2")
+                          , ESymbol Bin "+"
+                          , EIdentifier "k"
+                          ]))
+                    (EGrouped
+                       [ ESymbol Open "("
+                       , ENumber "1"
+                       , ESymbol Bin "-"
+                       , EIdentifier "q"
+                       , ESymbol Close ")"
+                       , ESymbol Open "("
+                       , ENumber "1"
+                       , ESymbol Bin "-"
+                       , ESubsup (EIdentifier "q") (EGrouped []) (ENumber "2")
+                       , ESymbol Close ")"
+                       , ESymbol Ord "\8943"
+                       , ESymbol Open "("
+                       , ENumber "1"
+                       , ESymbol Bin "-"
+                       , ESubsup (EIdentifier "q") (EGrouped []) (EIdentifier "k")
+                       , ESymbol Close ")"
+                       ])
+                ]
+            , ESymbol Rel "="
+            , EGrouped
+                [ EUnderover
+                    False
+                    (ESymbol Op "\8719")
+                    (EGrouped [ EIdentifier "j" , ESymbol Rel "=" , ENumber "0" ])
+                    (EIdentifier "\8734")
+                , EFraction
+                    NormalFrac
+                    (ENumber "1")
+                    (EGrouped
+                       [ ESymbol Open "("
+                       , ENumber "1"
+                       , ESymbol Bin "-"
+                       , ESubsup
+                           (EIdentifier "q")
+                           (EGrouped [])
+                           (EGrouped
+                              [ ENumber "5" , EIdentifier "j" , ESymbol Bin "+" , ENumber "2" ])
+                       , ESymbol Close ")"
+                       , ESymbol Open "("
+                       , ENumber "1"
+                       , ESymbol Bin "-"
+                       , ESubsup
+                           (EIdentifier "q")
+                           (EGrouped [])
+                           (EGrouped
+                              [ ENumber "5" , EIdentifier "j" , ESymbol Bin "+" , ENumber "3" ])
+                       , ESymbol Close ")"
+                       ])
+                ]
+            , ESymbol Pun ","
+            , EText TextNormal "\8287\8202"
+            , EText TextNormal "\8287\8202"
+            , EGrouped [ EIdentifier "f" , EIdentifier "o" , EIdentifier "r" ]
+            , ESpace (2 % 9)
+            , ESymbol Op "|"
+            , EIdentifier "q"
+            , ESymbol Op "|"
+            , ESymbol Rel "<"
+            , ENumber "1"
+            , EIdentifier "."
+            ]
+        ]
+      ]
+    , [ [ EText TextNormal "Commutative Diagram" ]
+      , [ EArray
+            [ AlignCenter , AlignCenter , AlignCenter ]
+            [ [ [ EIdentifier "H" ]
+              , [ ESymbol Accent "\8592" ]
+              , [ EIdentifier "K" ]
+              ]
+            , [ [ ESymbol Rel "\8595" ]
+              , [ ESpace (0 % 1) ]
+              , [ ESymbol Rel "\8593" ]
+              ]
+            , [ [ EIdentifier "H" ]
+              , [ ESymbol Accent "\8594" ]
+              , [ EIdentifier "K" ]
+              ]
+            ]
+        ]
+      ]
+    ]
+]
+>>> typst
+upright("Bernoulli Trials") & P paren.l E paren.r eq lr((n / k)) p_()^k (paren.l 1 hyph.minus p paren.r)_()^(n hyph.minus k)\
+upright("Cauchy-Schwarz Inequality") & lr((sum_(k eq 1)^n a_k^() b_k^()))_()^2 lt.eq lr((sum_(k eq 1)^n a_k^2)) lr((sum_(k eq 1)^n b_k^2))\
+upright("Cauchy Formula") & f paren.l z paren.r thin dot.c "Ind"_gamma^() paren.l z paren.r eq frac(1, 2 pi i) integral.cont_gamma^() frac(f paren.l xi paren.r, xi hyph.minus z) thin d xi\
+upright("Cross Product") & V_1^() times V_2^() eq mat(delim: "|", i, j, k; frac(diff X, diff u), frac(diff Y, diff u), 0; frac(diff X, diff v), frac(diff Y, diff v), 0)\
+upright("Vandermonde Determinant") & mat(delim: "|", 1, 1, dots.h.c, 1; v_1^(), v_2^(), dots.h.c, v_n^(); v_1^2, v_2^2, dots.h.c, v_n^2; dots.v, dots.v, dots.down, dots.v; v_1^(n hyph.minus 1), v_2^(n hyph.minus 1), dots.h.c, v_n^(n hyph.minus 1)) eq product_(1 lt.eq i lt j lt.eq n)^() paren.l v_j^() hyph.minus v_i^() paren.r\
+upright("Lorenz Equations") & x^˙_() & eq & sigma paren.l y hyph.minus x paren.r\
+y^˙_() & eq & rho x hyph.minus y hyph.minus x z\
+z^˙_() & eq & hyph.minus beta z plus x y\
+upright("Maxwell's Equations") & {nabla zws times B^harpoon.lt_() hyph.minus thin 1 / c thin frac(diff zws E^harpoon.lt_(), diff zws t) & eq & frac(4 pi, c) thin j^harpoon.lt_()\
+nabla zws dot.c E^harpoon.lt_() & eq & 4 pi rho\
+nabla zws times E^harpoon.lt_() thin plus thin 1 / c thin frac(diff zws B^harpoon.lt_(), diff zws t) & eq & 0^harpoon.lt_()\
+nabla zws dot.c B^harpoon.lt_() & eq & 0\
+upright("Einstein Field Equations") & R_(mu nu)^() hyph.minus 1 / 2 thin g_(mu nu)^() thin R eq frac(8 pi G, c_()^4) thin T_(mu nu)^()\
+upright("Ramanujan Identity") & frac(1, paren.l sqrt(phi sqrt(5)) hyph.minus phi paren.r e_()^25 / pi) eq 1 plus frac(e_()^(hyph.minus 2 pi), 1 plus frac(e_()^(hyph.minus 4 pi), 1 plus frac(e_()^(hyph.minus 6 pi), 1 plus frac(e_()^(hyph.minus 8 pi), 1 plus dots.h))))\
+upright("Another Ramanujan identity") & sum_(k eq 1)^oo 1 / 2_()^(⌊ k dot.c zws phi ⌋) eq frac(1, 2_()^0 plus frac(1, 2_()^1 plus dots.h.c))\
+upright("Rogers-Ramanujan Identity") & 1 plus sum_(k eq 1)^oo frac(q_()^(k_()^2 plus k), paren.l 1 hyph.minus q paren.r paren.l 1 hyph.minus q_()^2 paren.r dots.h.c paren.l 1 hyph.minus q_()^k paren.r) eq product_(j eq 0)^oo frac(1, paren.l 1 hyph.minus q_()^(5 j plus 2) paren.r paren.l 1 hyph.minus q_()^(5 j plus 3) paren.r) comma upright("  ") upright("  ") f o r med bar.v q bar.v lt 1 dot\
+upright("Commutative Diagram") & H & arrow.l & K\
+arrow.b & zws & arrow.t\
+H & arrow.r & K
diff --git a/test/writer/typst/complex2.test b/test/writer/typst/complex2.test
new file mode 100644
--- /dev/null
+++ b/test/writer/typst/complex2.test
@@ -0,0 +1,408 @@
+<<< native
+[ EArray
+    [ AlignCenter , AlignCenter ]
+    [ [ [ EText TextNormal "Quadratic Equation" ]
+      , [ EGrouped
+            [ EIdentifier "x"
+            , ESymbol Rel "="
+            , EFraction
+                NormalFrac
+                (EGrouped
+                   [ ESymbol Bin "-"
+                   , EIdentifier "b"
+                   , ESymbol Bin "\177"
+                   , ESqrt
+                       (EGrouped
+                          [ ESubsup (EIdentifier "b") (EGrouped []) (ENumber "2")
+                          , ESymbol Bin "-"
+                          , ENumber "4"
+                          , EIdentifier "a"
+                          , EIdentifier "c"
+                          ])
+                   ])
+                (EGrouped [ ENumber "2" , EIdentifier "a" ])
+            ]
+        ]
+      ]
+    , [ [ EText TextNormal "DisplayQuadratic Equation" ]
+      , [ EGrouped
+            [ EIdentifier "x"
+            , ESymbol Rel "="
+            , EFraction
+                NormalFrac
+                (EGrouped
+                   [ ESymbol Bin "-"
+                   , EIdentifier "b"
+                   , ESymbol Bin "\177"
+                   , ESqrt
+                       (EGrouped
+                          [ ESubsup (EIdentifier "b") (EGrouped []) (ENumber "2")
+                          , ESymbol Bin "-"
+                          , ENumber "4"
+                          , EIdentifier "a"
+                          , EIdentifier "c"
+                          ])
+                   ])
+                (EGrouped [ ENumber "2" , EIdentifier "a" ])
+            ]
+        ]
+      ]
+    , [ [ EText TextNormal "Rational Function" ]
+      , [ EGrouped
+            [ EIdentifier "f"
+            , ESymbol Open "("
+            , EIdentifier "x"
+            , ESymbol Close ")"
+            , ESymbol Rel "="
+            , EFraction
+                NormalFrac
+                (EGrouped
+                   [ ENumber "1"
+                   , ESymbol Bin "-"
+                   , ESubsup (EIdentifier "x") (EGrouped []) (ENumber "2")
+                   ])
+                (EGrouped
+                   [ ENumber "1"
+                   , ESymbol Bin "-"
+                   , ESubsup (EIdentifier "x") (EGrouped []) (ENumber "3")
+                   ])
+            ]
+        ]
+      ]
+    , [ [ EText TextNormal "Rational Function" ]
+      , [ EGrouped
+            [ EIdentifier "f"
+            , ESymbol Open "("
+            , EIdentifier "x"
+            , ESymbol Close ")"
+            , ESymbol Rel "="
+            , EFraction
+                NormalFrac
+                (EGrouped
+                   [ ESymbol Open "("
+                   , ENumber "1"
+                   , ESymbol Bin "-"
+                   , ESubsup (EIdentifier "x") (EGrouped []) (ENumber "2")
+                   , ESymbol Close ")"
+                   , ESubsup (EIdentifier "x") (EGrouped []) (ENumber "3")
+                   ])
+                (EGrouped
+                   [ ENumber "1"
+                   , ESymbol Bin "-"
+                   , ESubsup (EIdentifier "x") (EGrouped []) (ENumber "3")
+                   ])
+            ]
+        ]
+      ]
+    , [ [ EText TextNormal "Rational Function" ]
+      , [ EGrouped
+            [ EIdentifier "f"
+            , ESymbol Open "("
+            , EIdentifier "x"
+            , ESymbol Close ")"
+            , ESymbol Rel "="
+            , EFraction
+                NormalFrac
+                (EGrouped
+                   [ ESymbol Open "("
+                   , ENumber "1"
+                   , ESymbol Bin "-"
+                   , ESubsup (EIdentifier "x") (EGrouped []) (ENumber "2")
+                   , ESymbol Close ")"
+                   , ESymbol Open "("
+                   , ESubsup (EIdentifier "x") (EGrouped []) (ENumber "3")
+                   , ESymbol Bin "-"
+                   , ENumber "5"
+                   , EIdentifier "x"
+                   , ESymbol Close ")"
+                   ])
+                (EGrouped
+                   [ ENumber "1"
+                   , ESymbol Bin "-"
+                   , ESubsup (EIdentifier "x") (EGrouped []) (ENumber "3")
+                   ])
+            ]
+        ]
+      ]
+    , [ [ EText TextNormal "Parametrize Rational Function" ]
+      , [ EGrouped
+            [ EIdentifier "f"
+            , ESymbol Open "("
+            , EIdentifier "x"
+            , ESymbol Close ")"
+            , ESymbol Rel "="
+            , EFraction
+                NormalFrac
+                (EGrouped
+                   [ ESymbol Open "("
+                   , ESubsup (EIdentifier "a") (EIdentifier "i") (EGrouped [])
+                   , ESymbol Bin "-"
+                   , ESubsup (EIdentifier "x") (EGrouped []) (ENumber "2")
+                   , ESubsup (ESymbol Close ")") (EGrouped []) (ENumber "5")
+                   ])
+                (EGrouped
+                   [ ENumber "1"
+                   , ESymbol Bin "-"
+                   , ESubsup (EIdentifier "x") (EGrouped []) (ENumber "3")
+                   ])
+            ]
+        ]
+      ]
+    , [ [ EText TextNormal "Stacked exponents" ]
+      , [ EGrouped
+            [ EIdentifier "g"
+            , ESymbol Open "("
+            , EIdentifier "z"
+            , ESymbol Close ")"
+            , ESymbol Rel "="
+            , ESubsup
+                (EIdentifier "e")
+                (EGrouped [])
+                (EGrouped
+                   [ ESymbol Bin "-"
+                   , ESubsup (EIdentifier "x") (EGrouped []) (ENumber "2")
+                   ])
+            ]
+        ]
+      ]
+    , [ [ EText TextNormal "Stacked exponents" ]
+      , [ EGrouped
+            [ EIdentifier "g"
+            , ESymbol Open "("
+            , EIdentifier "z"
+            , ESymbol Close ")"
+            , ESymbol Rel "="
+            , ESubsup
+                (EIdentifier "e")
+                (EGrouped [])
+                (EGrouped
+                   [ ESymbol Bin "-"
+                   , ESymbol Open "("
+                   , EIdentifier "z"
+                   , ESymbol Bin "-"
+                   , EIdentifier "a"
+                   , ESubsup (ESymbol Close ")") (EGrouped []) (ENumber "2")
+                   ])
+            ]
+        ]
+      ]
+    , [ [ EText TextNormal "Stacked exponents" ]
+      , [ EGrouped
+            [ EIdentifier "g"
+            , ESymbol Open "("
+            , EIdentifier "z"
+            , ESymbol Close ")"
+            , ESymbol Rel "="
+            , ESubsup
+                (EIdentifier "e")
+                (EGrouped [])
+                (EGrouped
+                   [ ESymbol Bin "-"
+                   , EUnderover
+                       False
+                       (ESymbol Op "\8721")
+                       (EGrouped [ EIdentifier "i" , ESymbol Rel "=" , ENumber "0" ])
+                       (EIdentifier "\8734")
+                   , ESubsup (EIdentifier "z") (EIdentifier "i") (ENumber "2")
+                   ])
+            ]
+        ]
+      ]
+    , [ [ EText TextNormal "Stacked exponents" ]
+      , [ EGrouped
+            [ EIdentifier "g"
+            , ESymbol Open "("
+            , EIdentifier "y"
+            , ESymbol Close ")"
+            , ESymbol Rel "="
+            , ESubsup
+                (EIdentifier "e")
+                (EGrouped [])
+                (EGrouped
+                   [ ESymbol Bin "-"
+                   , EUnderover
+                       False
+                       (ESymbol Op "\8721")
+                       (EGrouped [ EIdentifier "i" , ESymbol Rel "=" , ENumber "0" ])
+                       (EIdentifier "\8734")
+                   , ESubsup (EIdentifier "y") (EIdentifier "i") (ENumber "2")
+                   ])
+            ]
+        ]
+      ]
+    , [ [ EText TextNormal "Stacked exponents" ]
+      , [ EGrouped
+            [ EIdentifier "g"
+            , ESymbol Open "("
+            , EIdentifier "z"
+            , ESymbol Close ")"
+            , ESymbol Rel "="
+            , ESubsup
+                (EIdentifier "e")
+                (EGrouped [])
+                (EGrouped
+                   [ ESymbol Bin "-"
+                   , EUnderover
+                       False
+                       (ESymbol Op "\8721")
+                       (EGrouped [ EIdentifier "i" , ESymbol Rel "=" , ENumber "0" ])
+                       (EIdentifier "\8734")
+                   , ESubsup
+                       (EIdentifier "z")
+                       (EGrouped [])
+                       (EFraction
+                          NormalFrac
+                          (ENumber "2")
+                          (EGrouped [ EIdentifier "a" , ESymbol Bin "-" , EIdentifier "i" ]))
+                   ])
+            ]
+        ]
+      ]
+    , [ [ EText TextNormal "Cross Product" ]
+      , [ EGrouped
+            [ EFraction
+                NormalFrac
+                (EGrouped
+                   [ ESubsup (EIdentifier "x") (ENumber "1") (EGrouped [])
+                   , ESymbol Bin "-"
+                   , ESubsup (EIdentifier "x") (ENumber "2") (EGrouped [])
+                   ])
+                (EGrouped
+                   [ ESubsup (EIdentifier "x") (ENumber "3") (EGrouped [])
+                   , ESymbol Bin "-"
+                   , ESubsup (EIdentifier "x") (ENumber "4") (EGrouped [])
+                   ])
+            , EFraction
+                NormalFrac
+                (EGrouped
+                   [ ESubsup (EIdentifier "x") (ENumber "1") (EGrouped [])
+                   , ESymbol Bin "-"
+                   , ESubsup (EIdentifier "x") (ENumber "4") (EGrouped [])
+                   ])
+                (EGrouped
+                   [ ESubsup (EIdentifier "x") (ENumber "2") (EGrouped [])
+                   , ESymbol Bin "-"
+                   , ESubsup (EIdentifier "x") (ENumber "3") (EGrouped [])
+                   ])
+            ]
+        ]
+      ]
+    , [ [ EText TextNormal "Cross Product" ]
+      , [ EGrouped
+            [ ESymbol Open "("
+            , EFraction
+                NormalFrac
+                (EGrouped
+                   [ ESubsup (EIdentifier "x") (ENumber "1") (EGrouped [])
+                   , ESymbol Bin "-"
+                   , ESubsup (EIdentifier "x") (ENumber "2") (EGrouped [])
+                   ])
+                (EGrouped
+                   [ ESubsup (EIdentifier "x") (ENumber "3") (EGrouped [])
+                   , ESymbol Bin "-"
+                   , ESubsup (EIdentifier "x") (ENumber "4") (EGrouped [])
+                   ])
+            , ESymbol Close ")"
+            , ESymbol Open "("
+            , EFraction
+                NormalFrac
+                (EGrouped
+                   [ ESubsup (EIdentifier "x") (ENumber "1") (EGrouped [])
+                   , ESymbol Bin "-"
+                   , ESubsup (EIdentifier "x") (ENumber "4") (EGrouped [])
+                   ])
+                (EGrouped
+                   [ ESubsup (EIdentifier "x") (ENumber "2") (EGrouped [])
+                   , ESymbol Bin "-"
+                   , ESubsup (EIdentifier "x") (ENumber "3") (EGrouped [])
+                   ])
+            , ESymbol Close ")"
+            ]
+        ]
+      ]
+    , [ [ EText TextNormal "Cross Product" ]
+      , [ EGrouped
+            [ EDelimited
+                "("
+                ")"
+                [ Right
+                    (EFraction
+                       NormalFrac
+                       (EGrouped
+                          [ ESubsup (EIdentifier "x") (ENumber "1") (EGrouped [])
+                          , ESymbol Bin "-"
+                          , ESubsup (EIdentifier "x") (ENumber "2") (EGrouped [])
+                          ])
+                       (EGrouped
+                          [ ESubsup (EIdentifier "x") (ENumber "3") (EGrouped [])
+                          , ESymbol Bin "-"
+                          , ESubsup (EIdentifier "x") (ENumber "4") (EGrouped [])
+                          ]))
+                ]
+            , EDelimited
+                "("
+                ")"
+                [ Right
+                    (EFraction
+                       NormalFrac
+                       (EGrouped
+                          [ ESubsup (EIdentifier "x") (ENumber "1") (EGrouped [])
+                          , ESymbol Bin "-"
+                          , ESubsup (EIdentifier "x") (ENumber "4") (EGrouped [])
+                          ])
+                       (EGrouped
+                          [ ESubsup (EIdentifier "x") (ENumber "2") (EGrouped [])
+                          , ESymbol Bin "-"
+                          , ESubsup (EIdentifier "x") (ENumber "3") (EGrouped [])
+                          ]))
+                ]
+            ]
+        ]
+      ]
+    , [ [ EText TextNormal "Cross Product" ]
+      , [ EFraction
+            NormalFrac
+            (EGrouped
+               [ ESymbol Open "("
+               , ESubsup (EIdentifier "x") (ENumber "1") (EGrouped [])
+               , ESymbol Bin "-"
+               , ESubsup (EIdentifier "x") (ENumber "2") (EGrouped [])
+               , ESymbol Close ")"
+               , ESymbol Open "("
+               , ESubsup (EIdentifier "x") (ENumber "3") (EGrouped [])
+               , ESymbol Bin "-"
+               , ESubsup (EIdentifier "x") (ENumber "4") (EGrouped [])
+               , ESymbol Close ")"
+               ])
+            (EGrouped
+               [ ESymbol Open "("
+               , ESubsup (EIdentifier "x") (ENumber "1") (EGrouped [])
+               , ESymbol Bin "-"
+               , ESubsup (EIdentifier "x") (ENumber "4") (EGrouped [])
+               , ESymbol Close ")"
+               , ESymbol Open "("
+               , ESubsup (EIdentifier "x") (ENumber "2") (EGrouped [])
+               , ESymbol Bin "-"
+               , ESubsup (EIdentifier "x") (ENumber "3") (EGrouped [])
+               , ESymbol Close ")"
+               ])
+        ]
+      ]
+    ]
+]
+>>> typst
+upright("Quadratic Equation") & x eq frac(hyph.minus b plus.minus sqrt(b_()^2 hyph.minus 4 a c), 2 a)\
+upright("DisplayQuadratic Equation") & x eq frac(hyph.minus b plus.minus sqrt(b_()^2 hyph.minus 4 a c), 2 a)\
+upright("Rational Function") & f paren.l x paren.r eq frac(1 hyph.minus x_()^2, 1 hyph.minus x_()^3)\
+upright("Rational Function") & f paren.l x paren.r eq frac(paren.l 1 hyph.minus x_()^2 paren.r x_()^3, 1 hyph.minus x_()^3)\
+upright("Rational Function") & f paren.l x paren.r eq frac(paren.l 1 hyph.minus x_()^2 paren.r paren.l x_()^3 hyph.minus 5 x paren.r, 1 hyph.minus x_()^3)\
+upright("Parametrize Rational Function") & f paren.l x paren.r eq frac(paren.l a_i^() hyph.minus x_()^2 paren.r_()^5, 1 hyph.minus x_()^3)\
+upright("Stacked exponents") & g paren.l z paren.r eq e_()^(hyph.minus x_()^2)\
+upright("Stacked exponents") & g paren.l z paren.r eq e_()^(hyph.minus paren.l z hyph.minus a paren.r_()^2)\
+upright("Stacked exponents") & g paren.l z paren.r eq e_()^(hyph.minus sum_(i eq 0)^oo z_i^2)\
+upright("Stacked exponents") & g paren.l y paren.r eq e_()^(hyph.minus sum_(i eq 0)^oo y_i^2)\
+upright("Stacked exponents") & g paren.l z paren.r eq e_()^(hyph.minus sum_(i eq 0)^oo z_()^frac(2, a hyph.minus i))\
+upright("Cross Product") & frac(x_1^() hyph.minus x_2^(), x_3^() hyph.minus x_4^()) frac(x_1^() hyph.minus x_4^(), x_2^() hyph.minus x_3^())\
+upright("Cross Product") & paren.l frac(x_1^() hyph.minus x_2^(), x_3^() hyph.minus x_4^()) paren.r paren.l frac(x_1^() hyph.minus x_4^(), x_2^() hyph.minus x_3^()) paren.r\
+upright("Cross Product") & lr((frac(x_1^() hyph.minus x_2^(), x_3^() hyph.minus x_4^()))) lr((frac(x_1^() hyph.minus x_4^(), x_2^() hyph.minus x_3^())))\
+upright("Cross Product") & frac(paren.l x_1^() hyph.minus x_2^() paren.r paren.l x_3^() hyph.minus x_4^() paren.r, paren.l x_1^() hyph.minus x_4^() paren.r paren.l x_2^() hyph.minus x_3^() paren.r)
diff --git a/test/writer/typst/complex_number.test b/test/writer/typst/complex_number.test
new file mode 100644
--- /dev/null
+++ b/test/writer/typst/complex_number.test
@@ -0,0 +1,27 @@
+<<< native
+[ EIdentifier "c"
+, ESymbol Rel "="
+, EOver
+    False
+    (EOver
+       False
+       (EGrouped
+          [ EUnder
+              False
+              (EUnder False (EIdentifier "a") (ESymbol TUnder "\9183"))
+              (EText TextNormal "real")
+          , ESymbol Bin "+"
+          , EUnder
+              False
+              (EUnder
+                 False
+                 (EGrouped
+                    [ EIdentifier "b" , EStyled TextNormal [ EIdentifier "i" ] ])
+                 (ESymbol TUnder "\9183"))
+              (EText TextNormal "imaginary")
+          ])
+       (ESymbol TOver "\9182"))
+    (EText TextNormal "complex number")
+]
+>>> typst
+c eq overbrace(a_brace.b_upright("real") plus (b upright(i))_brace.b_upright("imaginary"))^upright("complex number")
diff --git a/test/writer/typst/coprod2.test b/test/writer/typst/coprod2.test
new file mode 100644
--- /dev/null
+++ b/test/writer/typst/coprod2.test
@@ -0,0 +1,10 @@
+<<< native
+[ EUnderover
+    False
+    (ESymbol Op "\8720")
+    (EGrouped [ EIdentifier "i" , ESymbol Rel "=" , ENumber "0" ])
+    (EIdentifier "\8734")
+, ESub (EIdentifier "x") (EIdentifier "i")
+]
+>>> typst
+product.co_(i eq 0)^oo x_i
diff --git a/test/writer/typst/cospan.test b/test/writer/typst/cospan.test
new file mode 100644
--- /dev/null
+++ b/test/writer/typst/cospan.test
@@ -0,0 +1,11 @@
+<<< native
+[ EIdentifier "B"
+, EUnderover
+    False (ESymbol Op "\8594") (EIdentifier "f") (EGrouped [])
+, EIdentifier "A"
+, EUnderover
+    False (ESymbol Op "\8592") (EIdentifier "f") (EGrouped [])
+, EIdentifier "C"
+]
+>>> typst
+B arrow.r_f^() A arrow.l_f^() C
diff --git a/test/writer/typst/deMorgans_law.test b/test/writer/typst/deMorgans_law.test
new file mode 100644
--- /dev/null
+++ b/test/writer/typst/deMorgans_law.test
@@ -0,0 +1,39 @@
+<<< native
+[ ESymbol Op "\172"
+, EDelimited
+    "("
+    ")"
+    [ Right (EIdentifier "p")
+    , Right (ESymbol Bin "\8743")
+    , Right (EIdentifier "q")
+    ]
+, ESymbol Rel "\8660"
+, EDelimited
+    "(" ")" [ Right (ESymbol Op "\172") , Right (EIdentifier "p") ]
+, ESymbol Bin "\8744"
+, EDelimited
+    "(" ")" [ Right (ESymbol Op "\172") , Right (EIdentifier "q") ]
+, EOver
+    False
+    (EGrouped
+       [ EUnderover
+           True
+           (ESymbol Op "\8899")
+           (EGrouped [ EIdentifier "i" , ESymbol Rel "=" , ENumber "1" ])
+           (EIdentifier "n")
+       , ESub (EIdentifier "A") (EIdentifier "i")
+       ])
+    (ESymbol TOver "\175")
+, ESymbol Rel "="
+, EUnderover
+    True
+    (ESymbol Op "\8898")
+    (EGrouped [ EIdentifier "i" , ESymbol Rel "=" , ENumber "1" ])
+    (EIdentifier "n")
+, EOver
+    False
+    (ESub (EIdentifier "A") (EIdentifier "i"))
+    (ESymbol TOver "\175")
+]
+>>> typst
+not lr((p and q)) arrow.l.r.double lr((not p)) or lr((not q)) (union.big_(i eq 1)^n A_i)^macron eq sect.big_(i eq 1)^n A_i^macron
diff --git a/test/writer/typst/differentiable_manifold.test b/test/writer/typst/differentiable_manifold.test
new file mode 100644
--- /dev/null
+++ b/test/writer/typst/differentiable_manifold.test
@@ -0,0 +1,63 @@
+<<< native
+[ ESub (EIdentifier "\947") (ENumber "1")
+, ESymbol Rel "\8801"
+, ESub (EIdentifier "\947") (ENumber "2")
+, ESymbol Rel "\8660"
+, EDelimited
+    "{"
+    ""
+    [ Right
+        (EArray
+           [ AlignLeft ]
+           [ [ [ ESub (EIdentifier "\947") (ENumber "1")
+               , EDelimited "(" ")" [ Right (ENumber "0") ]
+               , ESymbol Rel "="
+               , ESub (EIdentifier "\947") (ENumber "2")
+               , EDelimited "(" ")" [ Right (ENumber "0") ]
+               , ESymbol Rel "="
+               , EIdentifier "p"
+               , ESymbol Pun ","
+               , EText TextNormal " and "
+               ]
+             ]
+           , [ [ ESub
+                   (EDelimited
+                      ""
+                      "|"
+                      [ Right
+                          (EFraction
+                             NormalFrac
+                             (EStyled TextNormal [ EIdentifier "d" ])
+                             (EGrouped
+                                [ EStyled TextNormal [ EIdentifier "d" ] , EIdentifier "t" ]))
+                      , Right (EIdentifier "\981")
+                      , Right (ESymbol Bin "\8728")
+                      , Right (ESub (EIdentifier "\947") (ENumber "1"))
+                      , Right (EDelimited "(" ")" [ Right (EIdentifier "t") ])
+                      ])
+                   (EGrouped [ EIdentifier "t" , ESymbol Rel "=" , ENumber "0" ])
+               , ESymbol Rel "="
+               , ESub
+                   (EDelimited
+                      ""
+                      "|"
+                      [ Right
+                          (EFraction
+                             NormalFrac
+                             (EStyled TextNormal [ EIdentifier "d" ])
+                             (EGrouped
+                                [ EStyled TextNormal [ EIdentifier "d" ] , EIdentifier "t" ]))
+                      , Right (EIdentifier "\981")
+                      , Right (ESymbol Bin "\8728")
+                      , Right (ESub (EIdentifier "\947") (ENumber "2"))
+                      , Right (EDelimited "(" ")" [ Right (EIdentifier "t") ])
+                      ])
+                   (EGrouped [ EIdentifier "t" , ESymbol Rel "=" , ENumber "0" ])
+               ]
+             ]
+           ])
+    ]
+]
+>>> typst
+gamma_1 ident gamma_2 arrow.l.r.double {gamma_1 lr((0)) eq gamma_2 lr((0)) eq p comma upright(" and ")\
+frac(upright(d), upright(d) t) phi.alt compose gamma_1 lr((t))\|_(t eq 0) eq frac(upright(d), upright(d) t) phi.alt compose gamma_2 lr((t))\|_(t eq 0)
diff --git a/test/writer/typst/divergence.test b/test/writer/typst/divergence.test
new file mode 100644
--- /dev/null
+++ b/test/writer/typst/divergence.test
@@ -0,0 +1,25 @@
+<<< native
+[ ESymbol Ord "\8711"
+, ESymbol Bin "\8901"
+, EOver False (EIdentifier "v") (ESymbol Accent "\8407")
+, ESymbol Rel "="
+, EFraction
+    NormalFrac
+    (EGrouped
+       [ ESymbol Ord "\8706" , ESub (EIdentifier "v") (EIdentifier "x") ])
+    (EGrouped [ ESymbol Ord "\8706" , EIdentifier "x" ])
+, ESymbol Bin "+"
+, EFraction
+    NormalFrac
+    (EGrouped
+       [ ESymbol Ord "\8706" , ESub (EIdentifier "v") (EIdentifier "y") ])
+    (EGrouped [ ESymbol Ord "\8706" , EIdentifier "y" ])
+, ESymbol Bin "+"
+, EFraction
+    NormalFrac
+    (EGrouped
+       [ ESymbol Ord "\8706" , ESub (EIdentifier "v") (EIdentifier "z") ])
+    (EGrouped [ ESymbol Ord "\8706" , EIdentifier "z" ])
+]
+>>> typst
+nabla dot.op v^⃗ eq frac(diff v_x, diff x) plus frac(diff v_y, diff y) plus frac(diff v_z, diff z)
diff --git a/test/writer/typst/double-struck.test b/test/writer/typst/double-struck.test
new file mode 100644
--- /dev/null
+++ b/test/writer/typst/double-struck.test
@@ -0,0 +1,15 @@
+<<< native
+[ EStyled
+    TextDoubleStruck
+    [ EArray
+        [ AlignLeft ]
+        [ [ [ EText TextNormal "0123456789" ] ]
+        , [ [ EText TextNormal "ABCDEFGHIJKLMNOPQRSTUVWXYZ" ] ]
+        , [ [ EText TextNormal "abcdefghijklmnopqrstuvwxyz" ] ]
+        ]
+    ]
+]
+>>> typst
+bb(upright("0123456789")\
+upright("ABCDEFGHIJKLMNOPQRSTUVWXYZ")\
+upright("abcdefghijklmnopqrstuvwxyz"))
diff --git a/test/writer/typst/doubleint1.test b/test/writer/typst/doubleint1.test
new file mode 100644
--- /dev/null
+++ b/test/writer/typst/doubleint1.test
@@ -0,0 +1,10 @@
+<<< native
+[ ESubsup (ESymbol Op "\8748") (ENumber "0") (ENumber "1")
+, EIdentifier "f"
+, EDelimited "(" ")" [ Right (EIdentifier "x") ]
+, ESpace (1 % 9)
+, ESymbol Ord "\8518"
+, EIdentifier "x"
+]
+>>> typst
+integral.double_0^1 f lr((x)) #h(0em) ⅆ x
diff --git a/test/writer/typst/genfrac.test b/test/writer/typst/genfrac.test
new file mode 100644
--- /dev/null
+++ b/test/writer/typst/genfrac.test
@@ -0,0 +1,9 @@
+<<< native
+[ EDelimited
+    "{"
+    "}"
+    [ Right (EFraction NoLineFrac (EIdentifier "x") (EIdentifier "y"))
+    ]
+]
+>>> typst
+lr({x / y})
diff --git a/test/writer/typst/largeop1.test b/test/writer/typst/largeop1.test
new file mode 100644
--- /dev/null
+++ b/test/writer/typst/largeop1.test
@@ -0,0 +1,84 @@
+<<< native
+[ EArray
+    [ AlignCenter , AlignCenter ]
+    [ [ [ EText TextNormal "displaystyle: false largeop: false" ]
+      , [ EGrouped
+            [ ESymbol Op "\8896"
+            , ESymbol Op "\8897"
+            , ESymbol Op "\8747"
+            , ESymbol Op "\8721"
+            , ESymbol Op "\8719"
+            , ESymbol Op "\8899"
+            , ESymbol Op "\8898"
+            ]
+        ]
+      ]
+    , [ [ EText TextNormal "displaystyle: false largeop: true" ]
+      , [ EGrouped
+            [ ESymbol Op "\8896"
+            , ESymbol Op "\8897"
+            , ESymbol Op "\8747"
+            , ESymbol Op "\8721"
+            , ESymbol Op "\8719"
+            , ESymbol Op "\8899"
+            , ESymbol Op "\8898"
+            ]
+        ]
+      ]
+    , [ [ EText TextNormal "displaystyle: true largeop: false" ]
+      , [ EGrouped
+            [ ESymbol Op "\8896"
+            , ESymbol Op "\8897"
+            , ESymbol Op "\8747"
+            , ESymbol Op "\8721"
+            , ESymbol Op "\8719"
+            , ESymbol Op "\8899"
+            , ESymbol Op "\8898"
+            ]
+        ]
+      ]
+    , [ [ EText TextNormal "displaystyle: true largeop: true" ]
+      , [ EGrouped
+            [ ESymbol Op "\8896"
+            , ESymbol Op "\8897"
+            , ESymbol Op "\8747"
+            , ESymbol Op "\8721"
+            , ESymbol Op "\8719"
+            , ESymbol Op "\8899"
+            , ESymbol Op "\8898"
+            ]
+        ]
+      ]
+    , [ [ EText TextNormal "displaystyle: false largeop: default" ]
+      , [ EGrouped
+            [ ESymbol Op "\8896"
+            , ESymbol Op "\8897"
+            , ESymbol Op "\8747"
+            , ESymbol Op "\8721"
+            , ESymbol Op "\8719"
+            , ESymbol Op "\8899"
+            , ESymbol Op "\8898"
+            ]
+        ]
+      ]
+    , [ [ EText TextNormal "displaystyle: true largeop: default" ]
+      , [ EGrouped
+            [ ESymbol Op "\8896"
+            , ESymbol Op "\8897"
+            , ESymbol Op "\8747"
+            , ESymbol Op "\8721"
+            , ESymbol Op "\8719"
+            , ESymbol Op "\8899"
+            , ESymbol Op "\8898"
+            ]
+        ]
+      ]
+    ]
+]
+>>> typst
+upright("displaystyle: false largeop: false") & and.big or.big integral sum product union.big sect.big\
+upright("displaystyle: false largeop: true") & and.big or.big integral sum product union.big sect.big\
+upright("displaystyle: true largeop: false") & and.big or.big integral sum product union.big sect.big\
+upright("displaystyle: true largeop: true") & and.big or.big integral sum product union.big sect.big\
+upright("displaystyle: false largeop: default") & and.big or.big integral sum product union.big sect.big\
+upright("displaystyle: true largeop: default") & and.big or.big integral sum product union.big sect.big
diff --git a/test/writer/typst/largeopPos3.test b/test/writer/typst/largeopPos3.test
new file mode 100644
--- /dev/null
+++ b/test/writer/typst/largeopPos3.test
@@ -0,0 +1,11 @@
+<<< native
+[ EUnderover
+    False
+    (ESymbol Op "\8898")
+    (EGrouped [ EIdentifier "i" , ESymbol Rel "=" , ENumber "0" ])
+    (EIdentifier "\8734")
+, EGrouped
+    [ EIdentifier "A" , ESymbol Bin "\8745" , EIdentifier "B" ]
+]
+>>> typst
+sect.big_(i eq 0)^oo A sect B
diff --git a/test/writer/typst/math-in-text.test b/test/writer/typst/math-in-text.test
new file mode 100644
--- /dev/null
+++ b/test/writer/typst/math-in-text.test
@@ -0,0 +1,20 @@
+<<< native
+[ ESuper (EIdentifier "X") (ENumber "2")
+, ESymbol Rel "="
+, EIdentifier "y"
+, EGrouped
+    [ EText TextNormal " under "
+    , ESub (EIdentifier "H") (ENumber "0")
+    , EText TextNormal " except when "
+    , EGrouped
+        [ EIdentifier "x"
+        , EGrouped
+            [ EText TextBold " is less than "
+            , EIdentifier "z"
+            , EText TextBold "."
+            ]
+        ]
+    ]
+]
+>>> typst
+X^2 eq y upright(" under ") H_0 upright(" except when ") x bold(" is less than ") z bold(".")
diff --git a/test/writer/typst/moore_determinant.test b/test/writer/typst/moore_determinant.test
new file mode 100644
--- /dev/null
+++ b/test/writer/typst/moore_determinant.test
@@ -0,0 +1,54 @@
+<<< native
+[ EIdentifier "M"
+, ESymbol Rel "="
+, EDelimited
+    "["
+    "]"
+    [ Right
+        (EArray
+           [ AlignCenter , AlignCenter , AlignCenter , AlignCenter ]
+           [ [ [ ESub (EIdentifier "\945") (ENumber "1") ]
+             , [ ESubsup (EIdentifier "\945") (ENumber "1") (EIdentifier "q") ]
+             , [ ESymbol Ord "\8943" ]
+             , [ ESubsup
+                   (EIdentifier "\945")
+                   (ENumber "1")
+                   (ESuper
+                      (EIdentifier "q")
+                      (EGrouped [ EIdentifier "n" , ESymbol Bin "\8722" , ENumber "1" ]))
+               ]
+             ]
+           , [ [ ESub (EIdentifier "\945") (ENumber "2") ]
+             , [ ESubsup (EIdentifier "\945") (ENumber "2") (EIdentifier "q") ]
+             , [ ESymbol Ord "\8943" ]
+             , [ ESubsup
+                   (EIdentifier "\945")
+                   (ENumber "2")
+                   (ESuper
+                      (EIdentifier "q")
+                      (EGrouped [ EIdentifier "n" , ESymbol Bin "\8722" , ENumber "1" ]))
+               ]
+             ]
+           , [ [ ESymbol Ord "\8942" ]
+             , [ ESymbol Ord "\8942" ]
+             , [ ESymbol Rel "\8945" ]
+             , [ ESymbol Ord "\8942" ]
+             ]
+           , [ [ ESub (EIdentifier "\945") (EIdentifier "m") ]
+             , [ ESubsup
+                   (EIdentifier "\945") (EIdentifier "m") (EIdentifier "q")
+               ]
+             , [ ESymbol Ord "\8943" ]
+             , [ ESubsup
+                   (EIdentifier "\945")
+                   (EIdentifier "m")
+                   (ESuper
+                      (EIdentifier "q")
+                      (EGrouped [ EIdentifier "n" , ESymbol Bin "\8722" , ENumber "1" ]))
+               ]
+             ]
+           ])
+    ]
+]
+>>> typst
+M eq mat(delim: "[", alpha_1, alpha_1^q, dots.h.c, alpha_1^q^(n minus 1); alpha_2, alpha_2^q, dots.h.c, alpha_2^q^(n minus 1); dots.v, dots.v, dots.down, dots.v; alpha_m, alpha_m^q, dots.h.c, alpha_m^q^(n minus 1))
diff --git a/test/writer/typst/nestFrac1.test b/test/writer/typst/nestFrac1.test
new file mode 100644
--- /dev/null
+++ b/test/writer/typst/nestFrac1.test
@@ -0,0 +1,37 @@
+<<< native
+[ EFraction
+    NormalFrac
+    (ENumber "1")
+    (EGrouped
+       [ ESqrt (ENumber "2")
+       , ESymbol Bin "+"
+       , EFraction
+           NormalFrac
+           (ENumber "1")
+           (EGrouped
+              [ ESqrt (ENumber "3")
+              , ESymbol Bin "+"
+              , EFraction
+                  NormalFrac
+                  (ENumber "1")
+                  (EGrouped
+                     [ ESqrt (ENumber "4")
+                     , ESymbol Bin "+"
+                     , EFraction
+                         NormalFrac
+                         (ENumber "1")
+                         (EGrouped
+                            [ ESqrt (ENumber "5")
+                            , ESymbol Bin "+"
+                            , EFraction
+                                NormalFrac
+                                (ENumber "1")
+                                (EGrouped
+                                   [ ESqrt (ENumber "6") , ESymbol Bin "+" , EIdentifier "\8230" ])
+                            ])
+                     ])
+              ])
+       ])
+]
+>>> typst
+frac(1, sqrt(2) plus frac(1, sqrt(3) plus frac(1, sqrt(4) plus frac(1, sqrt(5) plus frac(1, sqrt(6) plus dots.h)))))
diff --git a/test/writer/typst/nestScript.test b/test/writer/typst/nestScript.test
new file mode 100644
--- /dev/null
+++ b/test/writer/typst/nestScript.test
@@ -0,0 +1,10 @@
+<<< native
+[ ESuper
+    (EIdentifier "v")
+    (ESuper
+       (EIdentifier "w")
+       (ESuper
+          (EIdentifier "x") (ESuper (EIdentifier "y") (EIdentifier "z"))))
+]
+>>> typst
+v^w^x^y^z
diff --git a/test/writer/typst/nestedAwidth1.test b/test/writer/typst/nestedAwidth1.test
new file mode 100644
--- /dev/null
+++ b/test/writer/typst/nestedAwidth1.test
@@ -0,0 +1,33 @@
+<<< native
+[ EArray
+    [ AlignCenter ]
+    [ [ [ EArray
+            [ AlignCenter , AlignCenter ]
+            [ [ [ ENumber "1" ] , [ ENumber "2" ] ]
+            , [ [ EIdentifier "x" ] , [ EIdentifier "y" ] ]
+            ]
+        ]
+      ]
+    , [ [ EArray
+            [ AlignCenter , AlignCenter ]
+            [ [ [ ENumber "1" ] , [ ENumber "2" ] ]
+            , [ [ EIdentifier "x" ] , [ EIdentifier "y" ] ]
+            ]
+        ]
+      ]
+    , [ [ EArray
+            [ AlignCenter , AlignCenter ]
+            [ [ [ ENumber "1" ] , [ ENumber "2" ] ]
+            , [ [ EIdentifier "x" ] , [ EIdentifier "y" ] ]
+            ]
+        ]
+      ]
+    ]
+]
+>>> typst
+1 & 2\
+x & y\
+1 & 2\
+x & y\
+1 & 2\
+x & y
diff --git a/test/writer/typst/notin.test b/test/writer/typst/notin.test
new file mode 100644
--- /dev/null
+++ b/test/writer/typst/notin.test
@@ -0,0 +1,11 @@
+<<< native
+[ EIdentifier "x"
+, ESymbol Rel "\8712"
+, EIdentifier "y"
+, ESymbol Bin "\8743"
+, EIdentifier "x"
+, ESymbol Rel "\8713"
+, EIdentifier "y"
+]
+>>> typst
+x in y and x in.not y
diff --git a/test/writer/typst/oint1.test b/test/writer/typst/oint1.test
new file mode 100644
--- /dev/null
+++ b/test/writer/typst/oint1.test
@@ -0,0 +1,10 @@
+<<< native
+[ ESubsup (ESymbol Op "\8750") (ENumber "0") (ENumber "1")
+, EIdentifier "f"
+, EDelimited "(" ")" [ Right (EIdentifier "x") ]
+, ESpace (1 % 9)
+, ESymbol Ord "\8518"
+, EIdentifier "x"
+]
+>>> typst
+integral.cont_0^1 f lr((x)) #h(0em) ⅆ x
diff --git a/test/writer/typst/operatorname.test b/test/writer/typst/operatorname.test
new file mode 100644
--- /dev/null
+++ b/test/writer/typst/operatorname.test
@@ -0,0 +1,71 @@
+<<< native
+[ EDelimited
+    "{"
+    ""
+    [ Right
+        (EArray
+           [ AlignLeft , AlignLeft ]
+           [ [ [ ESub (EMathOperator "div") (EIdentifier "x")
+               , EIdentifier "u"
+               , ESuper (EMathOperator "div") (EIdentifier "x")
+               , EIdentifier "u"
+               , ESubsup (EMathOperator "div") (EIdentifier "x") (EIdentifier "y")
+               , EIdentifier "u"
+               , ESubsup (EMathOperator "div") (EIdentifier "x") (EIdentifier "y")
+               , EIdentifier "u"
+               ]
+             , [ EText TextNormal "operatorname" ]
+             ]
+           , [ [ EUnder
+                   True
+                   (EMathOperator "\8902-lim'sup")
+                   (EGrouped [ EIdentifier "x" , ESymbol Rel "\8594" , ENumber "0" ])
+               , EIdentifier "u"
+               , EOver True (EMathOperator "\8902-lim'sup") (EIdentifier "w")
+               , EIdentifier "u"
+               , EUnderover
+                   True
+                   (EMathOperator "\8902-lim'sup")
+                   (EGrouped [ EIdentifier "x" , ESymbol Rel "\8594" , ENumber "0" ])
+                   (EIdentifier "w")
+               , EIdentifier "u"
+               , EUnderover
+                   True
+                   (EMathOperator "\8902-lim'sup")
+                   (EGrouped [ EIdentifier "x" , ESymbol Rel "\8594" , ENumber "0" ])
+                   (EIdentifier "w")
+               , EIdentifier "u"
+               ]
+             , [ EText TextNormal "operatorname*" ]
+             ]
+           , [ [ ESub
+                   (EMathOperator "\8902-lim'sup")
+                   (EGrouped [ EIdentifier "x" , ESymbol Rel "\8594" , ENumber "0" ])
+               , EIdentifier "u"
+               , ESuper (EMathOperator "\8902-lim'sup") (EIdentifier "w")
+               , EIdentifier "u"
+               , ESubsup
+                   (EMathOperator "\8902-lim'sup")
+                   (EGrouped [ EIdentifier "x" , ESymbol Rel "\8594" , ENumber "0" ])
+                   (EIdentifier "w")
+               , EIdentifier "u"
+               , ESubsup
+                   (EMathOperator "\8902-lim'sup")
+                   (EGrouped [ EIdentifier "x" , ESymbol Rel "\8594" , ENumber "0" ])
+                   (EIdentifier "w")
+               , EIdentifier "u"
+               ]
+             , [ EText TextNormal "operatorname*:nolimits" ]
+             ]
+           , [ [ ESub (EMathOperator "curl") (EIdentifier "x")
+               , EIdentifier "v"
+               , EUnder True (EMathOperator "argmax") (EIdentifier "K")
+               , EIdentifier "u"
+               ]
+             , [ EText TextNormal "DeclareMathOperator" ]
+             ]
+           ])
+    ]
+]
+>>> typst
+cases(delim: "{", "div"_x u "div"^x u "div"_x^y u "div"_x^y u & upright("operatorname"), "⋆-lim'sup"_(x arrow.r 0) u "⋆-lim'sup"^w u "⋆-lim'sup"_(x arrow.r 0)^w u "⋆-lim'sup"_(x arrow.r 0)^w u & upright("operatorname*"), "⋆-lim'sup"_(x arrow.r 0) u "⋆-lim'sup"^w u "⋆-lim'sup"_(x arrow.r 0)^w u "⋆-lim'sup"_(x arrow.r 0)^w u & upright("operatorname*:nolimits"), "curl"_x v "argmax"_K u & upright("DeclareMathOperator"))
diff --git a/test/writer/typst/phantom.test b/test/writer/typst/phantom.test
new file mode 100644
--- /dev/null
+++ b/test/writer/typst/phantom.test
@@ -0,0 +1,10 @@
+<<< native
+[ EDelimited
+    "("
+    ")"
+    [ Right
+        (EPhantom (EFraction NormalFrac (ENumber "1") (ENumber "2")))
+    ]
+]
+>>> typst
+lr((#hide[1 / 2]))
diff --git a/test/writer/typst/primes1.test b/test/writer/typst/primes1.test
new file mode 100644
--- /dev/null
+++ b/test/writer/typst/primes1.test
@@ -0,0 +1,40 @@
+<<< native
+[ ESuper (EIdentifier "x") (ENumber "2")
+, ESymbol Bin "+"
+, ESuper (ENumber "2") (ENumber "2")
+, ESymbol Bin "+"
+, ESuper (EIdentifier "x") (ESymbol Ord "\8242")
+, ESymbol Bin "+"
+, ESuper (EIdentifier "x") (ESymbol Accent "'")
+, ESymbol Bin "+"
+, ESuper (EIdentifier "x") (EMathOperator "''")
+, ESymbol Bin "+"
+, EIdentifier "x"
+, EIdentifier "\8242"
+, ESymbol Bin "+"
+, ESuper
+    (ESuper (EIdentifier "x") (ESymbol Accent "'"))
+    (ESymbol Accent "'")
+, ESymbol Bin "+"
+, ESuper
+    (ESuper (EIdentifier "x") (ESymbol Accent "'")) (ENumber "2")
+, ESymbol Bin "+"
+, ESuper
+    (EIdentifier "x")
+    (EGrouped
+       [ ESymbol Accent "'" , ESymbol Bin "+" , ESymbol Accent "'" ])
+, ESymbol Bin "+"
+, ESuper
+    (ESuper (EIdentifier "x") (ESymbol Accent "'"))
+    (ESymbol Accent "'")
+, ESymbol Bin "+"
+, ESuper
+    (EIdentifier "x")
+    (ESuper (ESymbol Accent "'") (ESymbol Accent "'"))
+, ESymbol Bin "+"
+, ESuper (ESymbol Accent "'") (ESymbol Accent "'")
+, ESymbol Bin "+"
+, ESuper (ESymbol Accent "'") (ESymbol Accent "'")
+]
+>>> typst
+x^2 plus 2^2 plus x^prime plus x^quote.single plus x^"''" plus x prime plus x^quote.single^quote.single plus x^quote.single^2 plus x^(quote.single plus quote.single) plus x^quote.single^quote.single plus x^quote.single^quote.single plus quote.single^quote.single plus quote.single^quote.single
diff --git a/test/writer/typst/primes2.test b/test/writer/typst/primes2.test
new file mode 100644
--- /dev/null
+++ b/test/writer/typst/primes2.test
@@ -0,0 +1,30 @@
+<<< native
+[ ESuper (EIdentifier "H") (ESymbol Accent "\"")
+, ESuper (EIdentifier "H") (ESymbol Accent "'")
+, ESuper (EIdentifier "H") (ESymbol Ord "*")
+, ESuper (EIdentifier "H") (ESymbol Accent "`")
+, ESuper (EIdentifier "H") (ESymbol Accent "\170")
+, ESuper (EIdentifier "H") (ESymbol Ord "\176")
+, ESuper (EIdentifier "H") (ESymbol Accent "\178")
+, ESuper (EIdentifier "H") (ESymbol Accent "\179")
+, ESuper (EIdentifier "H") (ESymbol Accent "\180")
+, ESuper (EIdentifier "H") (ESymbol Accent "\185")
+, ESuper (EIdentifier "H") (ESymbol Accent "\186")
+, ESuper (EIdentifier "H") (ESymbol Open "\8216")
+, ESuper (EIdentifier "H") (ESymbol Close "\8217")
+, ESuper (EIdentifier "H") (ESymbol Accent "\8218")
+, ESuper (EIdentifier "H") (ESymbol Accent "\8219")
+, ESuper (EIdentifier "H") (ESymbol Open "\8220")
+, ESuper (EIdentifier "H") (ESymbol Close "\8221")
+, ESuper (EIdentifier "H") (ESymbol Accent "\8222")
+, ESuper (EIdentifier "H") (ESymbol Accent "\8223")
+, ESuper (EIdentifier "H") (ESymbol Ord "\8242")
+, ESuper (EIdentifier "H") (ESymbol Accent "\8243")
+, ESuper (EIdentifier "H") (ESymbol Accent "\8244")
+, ESuper (EIdentifier "H") (ESymbol Accent "\8245")
+, ESuper (EIdentifier "H") (ESymbol Accent "\8246")
+, ESuper (EIdentifier "H") (ESymbol Accent "\8247")
+, ESuper (EIdentifier "H") (ESymbol Accent "\8279")
+]
+>>> typst
+H^quote.double H^quote.single H^ast H^grave H^ª H^degree H^² H^³ H^acute H^¹ H^º H^quote.l.single H^quote.r.single H^quote.low.single H^quote.high.single H^quote.l.double H^quote.r.double H^quote.low.double H^quote.high.double H^prime H^prime.double H^prime.triple H^prime.rev H^prime.double.rev H^prime.triple.rev H^prime.quad
diff --git a/test/writer/typst/prod2.test b/test/writer/typst/prod2.test
new file mode 100644
--- /dev/null
+++ b/test/writer/typst/prod2.test
@@ -0,0 +1,10 @@
+<<< native
+[ EUnderover
+    False
+    (ESymbol Op "\8719")
+    (EGrouped [ EIdentifier "i" , ESymbol Rel "=" , ENumber "0" ])
+    (EIdentifier "\8734")
+, ESub (EIdentifier "x") (EIdentifier "i")
+]
+>>> typst
+product_(i eq 0)^oo x_i
diff --git a/test/writer/typst/schwinger_dyson.test b/test/writer/typst/schwinger_dyson.test
new file mode 100644
--- /dev/null
+++ b/test/writer/typst/schwinger_dyson.test
@@ -0,0 +1,57 @@
+<<< native
+[ EDelimited
+    "\10216"
+    "\10217"
+    [ Right (EIdentifier "\968")
+    , Right
+        (EDelimited
+           "|"
+           "|"
+           [ Right (EStyled TextScript [ EIdentifier "T" ])
+           , Right
+               (EDelimited
+                  "{"
+                  "}"
+                  [ Right
+                      (EFraction
+                         NormalFrac
+                         (EIdentifier "\948")
+                         (EGrouped [ EIdentifier "\948" , EIdentifier "\981" ]))
+                  , Right (EIdentifier "F")
+                  , Right (EDelimited "[" "]" [ Right (EIdentifier "\981") ])
+                  ])
+           ])
+    , Right (EIdentifier "\968")
+    ]
+, ESymbol Rel "="
+, ESymbol Bin "\8722"
+, EStyled TextNormal [ EIdentifier "i" ]
+, EDelimited
+    "\10216"
+    "\10217"
+    [ Right (EIdentifier "\968")
+    , Right
+        (EDelimited
+           "|"
+           "|"
+           [ Right (EStyled TextScript [ EIdentifier "T" ])
+           , Right
+               (EDelimited
+                  "{"
+                  "}"
+                  [ Right (EIdentifier "F")
+                  , Right (EDelimited "[" "]" [ Right (EIdentifier "\981") ])
+                  , Right
+                      (EFraction
+                         NormalFrac
+                         (EIdentifier "\948")
+                         (EGrouped [ EIdentifier "\948" , EIdentifier "\981" ]))
+                  , Right (EIdentifier "S")
+                  , Right (EDelimited "[" "]" [ Right (EIdentifier "\981") ])
+                  ])
+           ])
+    , Right (EIdentifier "\968")
+    ]
+]
+>>> typst
+⟨psi lr(|cal(T) lr({frac(delta, delta phi.alt) F lr([phi.alt])})|) psi⟩ eq minus upright(i) ⟨psi lr(|cal(T) lr({F lr([phi.alt]) frac(delta, delta phi.alt) S lr([phi.alt])})|) psi⟩
diff --git a/test/writer/typst/simple_sum_formula.test b/test/writer/typst/simple_sum_formula.test
new file mode 100644
--- /dev/null
+++ b/test/writer/typst/simple_sum_formula.test
@@ -0,0 +1,15 @@
+<<< native
+[ EUnderover
+    True
+    (ESymbol Op "\8721")
+    (EGrouped [ EIdentifier "i" , ESymbol Rel "=" , ENumber "1" ])
+    (ENumber "100")
+, EIdentifier "x"
+, ESymbol Rel "="
+, EFraction
+    NormalFrac
+    (EGrouped [ ENumber "100" , ESymbol Bin "*" , ENumber "101" ])
+    (ENumber "2")
+]
+>>> typst
+sum_(i eq 1)^100 x eq frac(100 ast 101, 2)
diff --git a/test/writer/typst/sophomores_dream.test b/test/writer/typst/sophomores_dream.test
new file mode 100644
--- /dev/null
+++ b/test/writer/typst/sophomores_dream.test
@@ -0,0 +1,25 @@
+<<< native
+[ ESubsup (ESymbol Op "\8747") (ENumber "0") (ENumber "1")
+, ESuper (EIdentifier "x") (EIdentifier "x")
+, ESpace (1 % 6)
+, EStyled TextNormal [ EIdentifier "d" ]
+, EIdentifier "x"
+, ESymbol Rel "="
+, EUnderover
+    True
+    (ESymbol Op "\8721")
+    (EGrouped [ EIdentifier "n" , ESymbol Rel "=" , ENumber "1" ])
+    (ESymbol Ord "\8734")
+, EGrouped
+    [ ESuper
+        (EDelimited
+           "(" ")" [ Right (ESymbol Op "\8722") , Right (ENumber "1") ])
+        (EGrouped [ EIdentifier "n" , ESymbol Bin "+" , ENumber "1" ])
+    , ESpace (1 % 6)
+    , ESuper
+        (EIdentifier "n")
+        (EGrouped [ ESymbol Op "\8722" , EIdentifier "n" ])
+    ]
+]
+>>> typst
+integral_0^1 x^x thin upright(d) x eq sum_(n eq 1)^oo lr((minus 1))^(n plus 1) thin n^(minus n)
diff --git a/test/writer/typst/span.test b/test/writer/typst/span.test
new file mode 100644
--- /dev/null
+++ b/test/writer/typst/span.test
@@ -0,0 +1,9 @@
+<<< native
+[ EIdentifier "Y"
+, EOver False (ESymbol Op "\8592") (EIdentifier "f")
+, EIdentifier "X"
+, EOver False (ESymbol Op "\8594") (EIdentifier "g")
+, EIdentifier "Z"
+]
+>>> typst
+Y arrow.l^f X arrow.r^g Z
diff --git a/test/writer/typst/sphere_volume.test b/test/writer/typst/sphere_volume.test
new file mode 100644
--- /dev/null
+++ b/test/writer/typst/sphere_volume.test
@@ -0,0 +1,133 @@
+<<< native
+[ EIdentifier "S"
+, ESymbol Rel "="
+, ESymbol Open "{"
+, ENumber "0"
+, ESymbol Rel "\8804"
+, EIdentifier "\981"
+, ESymbol Rel "\8804"
+, ENumber "2"
+, EIdentifier "\960"
+, ESymbol Pun ","
+, ESpace (2 % 9)
+, ENumber "0"
+, ESymbol Rel "\8804"
+, EIdentifier "\952"
+, ESymbol Rel "\8804"
+, EIdentifier "\960"
+, ESymbol Pun ","
+, ESpace (2 % 9)
+, ENumber "0"
+, ESymbol Rel "\8804"
+, EIdentifier "\961"
+, ESymbol Rel "\8804"
+, EIdentifier "R"
+, ESymbol Close "}"
+, EArray
+    [ AlignRight , AlignLeft ]
+    [ [ [ EStyled
+            TextNormal
+            [ EIdentifier "V"
+            , EIdentifier "o"
+            , EIdentifier "l"
+            , EIdentifier "u"
+            , EIdentifier "m"
+            , EIdentifier "e"
+            ]
+        ]
+      , [ ESymbol Rel "="
+        , EUnder False (ESymbol Op "\8749") (EIdentifier "S")
+        , ESpace ((-1) % 6)
+        , ESuper (EIdentifier "\961") (ENumber "2")
+        , EMathOperator "sin"
+        , EIdentifier "\952"
+        , ESpace (1 % 6)
+        , EStyled TextNormal [ EIdentifier "d" ]
+        , EIdentifier "\961"
+        , ESpace (1 % 6)
+        , EStyled TextNormal [ EIdentifier "d" ]
+        , EIdentifier "\952"
+        , ESpace (1 % 6)
+        , EStyled TextNormal [ EIdentifier "d" ]
+        , EIdentifier "\981"
+        ]
+      ]
+    , [ []
+      , [ ESymbol Rel "="
+        , ESubsup
+            (ESymbol Op "\8747")
+            (ENumber "0")
+            (EGrouped [ ENumber "2" , EIdentifier "\960" ])
+        , ESpace ((-1) % 6)
+        , EStyled TextNormal [ EIdentifier "d" ]
+        , EIdentifier "\981"
+        , ESpace (1 % 6)
+        , ESubsup (ESymbol Op "\8747") (ENumber "0") (EIdentifier "\960")
+        , ESpace ((-1) % 6)
+        , EMathOperator "sin"
+        , EIdentifier "\952"
+        , ESpace (1 % 6)
+        , EStyled TextNormal [ EIdentifier "d" ]
+        , EIdentifier "\952"
+        , ESpace (1 % 6)
+        , ESubsup (ESymbol Op "\8747") (ENumber "0") (EIdentifier "R")
+        , ESpace ((-1) % 6)
+        , ESuper (EIdentifier "\961") (ENumber "2")
+        , EStyled TextNormal [ EIdentifier "d" ]
+        , EIdentifier "\961"
+        ]
+      ]
+    , [ []
+      , [ ESymbol Rel "="
+        , EIdentifier "\981"
+        , ESubsup
+            (EScaled (9 % 5) (ESymbol Open "|"))
+            (ENumber "0")
+            (EGrouped [ ENumber "2" , EIdentifier "\960" ])
+        , ESpace (2 % 9)
+        , EDelimited
+            "("
+            ")"
+            [ Right (ESymbol Op "\8722")
+            , Right (EMathOperator "cos")
+            , Right (EIdentifier "\952")
+            ]
+        , ESubsup
+            (EScaled (9 % 5) (ESymbol Open "|"))
+            (ENumber "0")
+            (EIdentifier "\960")
+        , ESpace (2 % 9)
+        , EFraction InlineFrac (ENumber "1") (ENumber "3")
+        , ESuper (EIdentifier "\961") (ENumber "3")
+        , ESubsup
+            (EScaled (9 % 5) (ESymbol Open "|"))
+            (ENumber "0")
+            (EIdentifier "R")
+        ]
+      ]
+    , [ []
+      , [ ESymbol Rel "="
+        , ENumber "2"
+        , EIdentifier "\960"
+        , ESymbol Bin "\215"
+        , ENumber "2"
+        , ESymbol Bin "\215"
+        , EFraction InlineFrac (ENumber "1") (ENumber "3")
+        , ESuper (EIdentifier "R") (ENumber "3")
+        ]
+      ]
+    , [ []
+      , [ ESymbol Rel "="
+        , EFraction InlineFrac (ENumber "4") (ENumber "3")
+        , EIdentifier "\960"
+        , ESuper (EIdentifier "R") (ENumber "3")
+        ]
+      ]
+    ]
+]
+>>> typst
+S eq brace.l 0 lt.eq phi.alt lt.eq 2 pi comma med 0 lt.eq theta lt.eq pi comma med 0 lt.eq rho lt.eq R brace.r upright(V o l u m e) & eq integral.triple_S #h(-1em) rho^2 sin theta thin upright(d) rho thin upright(d) theta thin upright(d) phi.alt\
+ & eq integral_0^(2 pi) #h(-1em) upright(d) phi.alt thin integral_0^pi #h(-1em) sin theta thin upright(d) theta thin integral_0^R #h(-1em) rho^2 upright(d) rho\
+ & eq phi.alt #scale(x: 180%, y: 180%)[bar.v]_0^(2 pi) med lr((minus cos theta)) #scale(x: 180%, y: 180%)[bar.v]_0^pi med 1 / 3 rho^3 #scale(x: 180%, y: 180%)[bar.v]_0^R\
+ & eq 2 pi times 2 times 1 / 3 R^3\
+ & eq 4 / 3 pi R^3
diff --git a/test/writer/typst/stackrel.test b/test/writer/typst/stackrel.test
new file mode 100644
--- /dev/null
+++ b/test/writer/typst/stackrel.test
@@ -0,0 +1,7 @@
+<<< native
+[ ESub (EIdentifier "u") (EIdentifier "n")
+, EOver False (ESymbol Rel "\8594") (EIdentifier "w")
+, EIdentifier "u"
+]
+>>> typst
+u_n arrow.r^w u
diff --git a/test/writer/typst/substack.test b/test/writer/typst/substack.test
new file mode 100644
--- /dev/null
+++ b/test/writer/typst/substack.test
@@ -0,0 +1,37 @@
+<<< native
+[ EUnder
+    True
+    (ESymbol Op "\8721")
+    (EArray
+       [ AlignCenter ]
+       [ [ [ EGrouped
+               [ ENumber "0"
+               , ESymbol Rel "<"
+               , EIdentifier "i"
+               , ESymbol Rel "<"
+               , EIdentifier "m"
+               ]
+           ]
+         ]
+       , [ [ EGrouped
+               [ ENumber "0"
+               , ESymbol Rel "<"
+               , EIdentifier "j"
+               , ESymbol Rel "<"
+               , EIdentifier "n"
+               ]
+           ]
+         ]
+       ])
+, EIdentifier "P"
+, EDelimited
+    "("
+    ")"
+    [ Right (EIdentifier "i")
+    , Right (ESymbol Pun ",")
+    , Right (EIdentifier "j")
+    ]
+]
+>>> typst
+sum_0 lt i lt m\
+0 lt j lt n P lr((i comma j))
diff --git a/test/writer/typst/subsup.test b/test/writer/typst/subsup.test
new file mode 100644
--- /dev/null
+++ b/test/writer/typst/subsup.test
@@ -0,0 +1,68 @@
+<<< native
+[ ESubsup (EIdentifier "x") (EIdentifier "b") (EIdentifier "a")
+, ESpace (1 % 1)
+, ESubsup (EIdentifier "x") (EIdentifier "b") (EIdentifier "a")
+, ESpace (1 % 1)
+, EUnder True (EMathOperator "min") (EIdentifier "A")
+, ESpace (1 % 1)
+, EUnder True (EMathOperator "max") (EIdentifier "B")
+, ESpace (1 % 1)
+, EUnder True (EMathOperator "det") (EIdentifier "C")
+, ESpace (1 % 1)
+, EUnder True (EMathOperator "Pr") (EIdentifier "A")
+, ESpace (1 % 1)
+, EUnder True (EMathOperator "gcd") (EIdentifier "A")
+, ESpace (1 % 1)
+, ESuper
+    (EOver False (EIdentifier "u") (ESymbol Accent "\775"))
+    (ENumber "2")
+, ESpace (1 % 1)
+, ESub
+    (EOver False (EIdentifier "u") (ESymbol TOver "\175"))
+    (EIdentifier "\949")
+, ESpace (1 % 1)
+, ESubsup
+    (EUnder False (EIdentifier "u") (ESymbol TUnder "_"))
+    (EIdentifier "b")
+    (EIdentifier "a")
+, ESpace (1 % 1)
+, EOver
+    False
+    (EOver
+       False
+       (EGrouped [ EIdentifier "a" , ESymbol Bin "+" , EIdentifier "b" ])
+       (ESymbol TOver "\9182"))
+    (EText TextNormal "term")
+, ESpace (1 % 1)
+, EOver
+    False
+    (EOver
+       False
+       (EGrouped [ EIdentifier "a" , ESymbol Bin "+" , EIdentifier "b" ])
+       (ESymbol TOver "\9140"))
+    (EIdentifier "c")
+, ESpace (1 % 1)
+, EUnder
+    False
+    (EUnder
+       False
+       (EGrouped [ EIdentifier "a" , ESymbol Bin "+" , EIdentifier "b" ])
+       (ESymbol TUnder "\9183"))
+    (EIdentifier "c")
+, ESpace (1 % 1)
+, EUnder
+    False
+    (EUnder
+       False
+       (EGrouped [ EIdentifier "a" , ESymbol Bin "+" , EIdentifier "b" ])
+       (ESymbol TUnder "\9141"))
+    (EIdentifier "c")
+, ESuper (ESpace (1 % 1)) (EIdentifier "H")
+, EIdentifier "e"
+, ENumber "3"
+, ESub (ESpace (1 % 1)) (EIdentifier "x")
+, EIdentifier "A"
+, ESubsup (ESpace (1 % 1)) (EIdentifier "x") (ENumber "3")
+]
+>>> typst
+x_b^a quad x_b^a quad min_A quad max_B quad det_C quad Pr_A quad gcd_A quad u^̇^2 quad u^macron_epsilon quad underline(u)_b^a quad overbrace(a plus b)^upright("term") quad overbracket(a plus b)^c quad (a plus b)_brace.b_c quad (a plus b)_bracket.b_c quad^H e 3 quad_x A quad_x^3
diff --git a/test/writer/typst/sum1.test b/test/writer/typst/sum1.test
new file mode 100644
--- /dev/null
+++ b/test/writer/typst/sum1.test
@@ -0,0 +1,10 @@
+<<< native
+[ EUnderover
+    False
+    (ESymbol Op "\8721")
+    (EGrouped [ EIdentifier "i" , ESymbol Rel "=" , ENumber "0" ])
+    (EIdentifier "\8734")
+, ESub (EIdentifier "x") (EIdentifier "i")
+]
+>>> typst
+sum_(i eq 0)^oo x_i
diff --git a/test/writer/typst/text.test b/test/writer/typst/text.test
new file mode 100644
--- /dev/null
+++ b/test/writer/typst/text.test
@@ -0,0 +1,8 @@
+<<< native
+[ EText TextNormal "(\321ukasiewicz, G\246del, and G\246del)"
+, EText
+    TextItalic
+    "\8230\8211\8220double quotes\8221\8212\8216single quotes\8217"
+]
+>>> typst
+upright("(Łukasiewicz, Gödel, and Gödel)") italic("…–“double quotes”—‘single quotes’")
diff --git a/test/writer/typst/tripleint2.test b/test/writer/typst/tripleint2.test
new file mode 100644
--- /dev/null
+++ b/test/writer/typst/tripleint2.test
@@ -0,0 +1,10 @@
+<<< native
+[ ESubsup (ESymbol Op "\8749") (ENumber "0") (ENumber "1")
+, EIdentifier "f"
+, EDelimited "(" ")" [ Right (EIdentifier "x") ]
+, ESpace (1 % 9)
+, ESymbol Ord "\8518"
+, EIdentifier "x"
+]
+>>> typst
+integral.triple_0^1 f lr((x)) #h(0em) ⅆ x
diff --git a/test/writer/typst/unicode.test b/test/writer/typst/unicode.test
new file mode 100644
--- /dev/null
+++ b/test/writer/typst/unicode.test
@@ -0,0 +1,9 @@
+<<< native
+[ EIdentifier "f"
+, ESymbol Rel ":"
+, EIdentifier "X"
+, ESymbol Rel "\8594"
+, EIdentifier "Y"
+]
+>>> typst
+f colon X arrow.r Y
diff --git a/test/writer/typst/verbar2.test b/test/writer/typst/verbar2.test
new file mode 100644
--- /dev/null
+++ b/test/writer/typst/verbar2.test
@@ -0,0 +1,9 @@
+<<< native
+[ EDelimited
+    "|"
+    "|"
+    [ Right (EFraction NormalFrac (EIdentifier "H") (EIdentifier "K"))
+    ]
+]
+>>> typst
+lr(|H / K|)
diff --git a/texmath.cabal b/texmath.cabal
--- a/texmath.cabal
+++ b/texmath.cabal
@@ -1,12 +1,12 @@
 Name:                texmath
-Version:             0.12.6
+Version:             0.12.7
 Cabal-Version:       >= 1.10
 Build-type:          Simple
 Synopsis:            Conversion between math formats.
 Description:         The texmath library provides functions to read
   and write TeX math, presentation MathML, and OMML (Office
   Math Markup Language, used in Microsoft Office).  Support is also
-  included for converting math formats to Gnu eqn and to pandoc's
+  included for converting math formats to Gnu eqn, typst, and pandoc's
   native format (allowing conversion, via pandoc, to a variety of
   different markup formats).  The TeX reader supports basic LaTeX
   and AMS extensions, and it can parse and apply LaTeX macros.
@@ -43,6 +43,7 @@
                      test/writer/mml/*.test
                      test/writer/omml/*.test
                      test/writer/tex/*.test
+                     test/writer/typst/*.test
                      test/writer/eqn/*.test
                      test/reader/mml/*.test
                      test/reader/tex/*.test
@@ -94,6 +95,7 @@
                          Text.TeXMath.Writers.OMML,
                          Text.TeXMath.Writers.Pandoc,
                          Text.TeXMath.Writers.TeX,
+                         Text.TeXMath.Writers.Typst,
                          Text.TeXMath.Writers.Eqn,
                          Text.TeXMath.Unicode.ToUnicode,
                          Text.TeXMath.Unicode.ToTeX,
