diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -6,14 +6,14 @@
 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, 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
-and apply LaTeX macros.  The package also includes several
-utility modules which may be useful for anyone looking to
-manipulate either TeX math or MathML.  For example, a copy of
-the MathML operator dictionary is included.
+Language, used in Microsoft Office), and to write Gnu eqn, typst,
+StarMath (used by LibreOffice), 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 and apply LaTeX macros. The
+package also includes several utility modules which may be useful
+for anyone looking to manipulate either TeX math or MathML. For
+example, a copy of the MathML operator dictionary is included.
 
 [pandoc]: http://github.com/jgm/pandoc
 
@@ -26,14 +26,6 @@
 
 By default, the executable will be installed in `~/.cabal/bin`.
 
-Alternatively, texmath can be installed using
-[stack](https://github.com/commercialhaskell/stack).  Install
-the stack binary somewhere in your path.  Then, in the texmath
-repository,
-
-    stack setup
-    stack install --flag texmath:executable
-
 The `texmath` binary will be put in `~/.local/bin`.
 
 Macro definitions may be included before a LaTeX formula.
@@ -46,7 +38,7 @@
 But it is also possible to compile a full webserver with a JSON
 API.  To do this, set the `server` cabal flag, e.g.
 
-    stack install --flag texmath:server
+    cabal install -fserver
 
 To run the server on port 3000:
 
@@ -145,7 +137,7 @@
 
 # The test suite
 
-To run the test suite, do `cabal test` or `stack test`.
+To run the test suite, do `cabal test`.
 
 In its standard mode, the test suite will run golden tests of
 the individual readers and writers.  Reader tests can be found
@@ -160,12 +152,12 @@
 If many tests fail as a result of changes, but the test
 failures are all because of improvements in the output,
 you can pass `--accept` to the test suite (e.g., with
-`--test-arguments=--accept` on `stack test`), and the existing
+`--test-option=--accept` on `cabal test`), and the existing
 golden files will be overwritten.  If you do this, inspect
 the outputs very carefully to make sure they are correct.
 
 If you pass the `--roundtrip` option into the test suite
-(e.g., using `--test-arguments=--roundtrip` with `stack test`),
+(e.g., using `--test-option=--roundtrip` with `cabal test`),
 round-trip tests will be run instead.  Many of these will
 fail. In these tests, the native inputs in `test/roundtrip/*.native`
 will be converted to (respectively) `mml`, `omml`, or `tex`,
diff --git a/changelog.md b/changelog.md
--- a/changelog.md
+++ b/changelog.md
@@ -1,3 +1,81 @@
+texmath (0.13.2)
+
+  * Require typst-symbols 0.3
+
+  * Add starmath as output format (#289, John Pye).
+    [API change] New Text.TeXMath.Writers.StarMath module, exporting
+    `writeStarMath`. The function is also exported by Text.TeXMath.
+    Starmath is the format used by LibreOffice. Although LibreOffice
+    supports equations in MathML, it converts these to starmath (often
+    badly), and the starmath version is the user-editable one. The
+    starmath writer is provided in order to better support math in ODT
+    generated by pandoc. An extensive review (see the tools
+    subdirectory for the scripts that produce it) shows that this
+    writer's starmath produces better results in LibreOffice than the
+    mathml writer.
+
+texmath (0.13.1.2)
+
+  * Typst writer: Avoid using deprecated symbols (#287).
+    This requires depending on typst-symbols 0.2.*.
+
+texmath (0.13.1.1)
+
+  * Typst writer: don't add extra spaces around `|` or escaped
+    symbols (#286).
+
+texmath (0.13.1)
+
+  * MathML writer: Keep mathvariant attribute in addition to finding
+    unicode substitutes (#280). Previously, renderers didn't support
+    mathvariant consistently, so we omitted this attribute. Tested in
+    Safari, Firefox, and Chrome.
+
+  * OMML writer: properly handle bold/italics on identifiers (#280).
+    Identifiers marked as bold need to be marked as bold-italic.
+    Special exception for uppercase Greek.
+
+  * MathML writer: fix handling of italic (#280).
+
+  * OMML reader: handle w:ins elements in math (#278).
+    Previously we skipped these, which meant that content
+    would disappear.
+
+  * TeX reader: handle space commands in `\text{..}` (#277).
+
+  * TeX reader: Allow text operators to take an unbracketed argument (#276).
+
+texmath (0.13.0.2)
+
+  * Escape ; in typst output (#275).
+
+  * Update tests for latest typst symbols.
+
+  * Require typst-symbols 0.1.9.1.
+
+texmath (0.13.0.1)
+
+  * TeX reader: fix parsing of primes (#273).
+    We previously misparsed `a_i'` as `a_{i'}` rather than `{a_i}'`.
+
+  * Typst writer: fix position of primes with ESubSup.
+    In typst, unlike tex, the primes must come after the base.
+
+texmath (0.13)
+
+  * Add cancellation of terms for most formats. (#271, #251, #269).
+    This adds support for LaTeX `\cancel`, `\bcancel`, `\xcancel`,
+    and their equivalents in OMML, MathML, and Typst.
+
+    [API change]: add StrokeType and ECancel constructor on Exp.
+
+  * MathML writer: add `mathvariant="normal"` on math operators,
+    unless a different style is specifically called for (#270).
+
+  * Don't escape `*` in typst math output (#268).
+
+  * TeX writer: Use `\underbracket` instead of `\underset` U+23B5 (#267).
+
 texmath (0.12.10.3)
 
   * MathML writer: fix rendering of EScaled (#264, Ewan Davies).
diff --git a/extra/texmath.hs b/extra/texmath.hs
--- a/extra/texmath.hs
+++ b/extra/texmath.hs
@@ -62,6 +62,7 @@
   , ("omml",  XMLWriter writeOMML)
   , ("xhtml",   XMLWriter (\dt e -> inHtml (writeMathML dt e)))
   , ("mathml",   XMLWriter writeMathML)
+  , ("starmath", StringWriter writeStarMath)
   , ("pandoc", PandocWriter writePandoc)]
 
 data Options = Options {
diff --git a/man/texmath.1.md b/man/texmath.1.md
--- a/man/texmath.1.md
+++ b/man/texmath.1.md
@@ -33,8 +33,8 @@
     Defaults to `tex`.
 
 `-t` *FORMAT*
-:   Specify output ("to") format:  `tex`, `omml`,
-    `xhtml`, `mathml`, `pandoc`, `native`.  Defaults to `mathml`.
+:   Specify output ("to") format:  `tex`, `omml`, `xhtml`, `mathml`,
+    `typst`, `eqn`, `starmath`, `pandoc`, `native`.  Defaults to `mathml`.
 
 `--inline`
 :   Use the inline display style.
diff --git a/server/Main.hs b/server/Main.hs
--- a/server/Main.hs
+++ b/server/Main.hs
@@ -35,7 +35,7 @@
   } deriving (Show)
 
 data Format =
-  TeX | MathML | Eqn | OMML | Typst
+  TeX | MathML | Eqn | OMML | Typst | StarMath
   deriving (Show, Ord, Eq)
 
 instance FromJSON Format where
@@ -46,6 +46,7 @@
                  "eqn" -> pure Eqn
                  "typst" -> pure Typst
                  "omml" -> pure OMML
+                 "starmath" -> pure StarMath
                  _ -> fail $ "Unknown format " <> T.unpack s
    parseJSON _ = fail "Expecting string format"
 
@@ -60,6 +61,7 @@
                  "eqn" -> pure Eqn
                  "typst" -> pure Typst
                  "omml" -> pure OMML
+                 "starmath" -> pure StarMath
                  _ -> Left $ "Unknown format " <> t
 
 -- Automatically derive code to convert to/from JSON.
@@ -132,12 +134,14 @@
                      MathML -> readMathML
                      Eqn -> \_ -> Left "eqn reader not implemented"
                      Typst -> \_ -> Left "typst reader not implemented"
+                     StarMath -> \_ -> Left "StarMath 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
+                     StarMath -> writeStarMath dt
       in  handleErr $ writer <$> reader txt
 
   handleErr (Right t) = return t
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,
+                      writeStarMath,
                       writeTypst,
                       writeOMML,
                       writeMathML,
@@ -78,5 +79,6 @@
 import Text.TeXMath.Writers.Pandoc
 import Text.TeXMath.Writers.TeX
 import Text.TeXMath.Writers.Eqn
+import Text.TeXMath.Writers.StarMath
 import Text.TeXMath.Writers.Typst
 import Text.TeXMath.Types
diff --git a/src/Text/TeXMath/Readers/MathML.hs b/src/Text/TeXMath/Readers/MathML.hs
--- a/src/Text/TeXMath/Readers/MathML.hs
+++ b/src/Text/TeXMath/Readers/MathML.hs
@@ -392,6 +392,9 @@
   mbNotation <- findAttrQ "notation" e
   case mbNotation of
        Just "box" -> EBoxed <$> row e
+       Just "updiagonalstrike" -> ECancel ForwardSlash <$> row e
+       Just "downdiagonalstrike" -> ECancel BackSlash <$> row e
+       Just "updiagonalstrike downdiagonalstrike" -> ECancel XSlash <$> row e
        _ -> row e
 
 action :: Element -> MML Exp
diff --git a/src/Text/TeXMath/Readers/OMML.hs b/src/Text/TeXMath/Readers/OMML.hs
--- a/src/Text/TeXMath/Readers/OMML.hs
+++ b/src/Text/TeXMath/Readers/OMML.hs
@@ -95,6 +95,7 @@
 data OMathRunElem = TextRun T.Text
                   | LnBrk
                   | Tab
+                  | Inserted [OMathRunElem]
                     deriving Show
 
 data OMathRunTextStyle = NoStyle
@@ -165,6 +166,7 @@
   | isElem "w" "br" element = Just LnBrk
   | isElem "w" "tab" element = Just Tab
   | isElem "w" "sym" element = Just $ TextRun $ getSymChar element
+  | isElem "w" "ins" element = Just $ Inserted $ mapMaybe elemToOMathRunElem (elChildren element)
   | otherwise = Nothing
 
 elemToOMathRunElems :: Element -> Maybe [OMathRunElem]
@@ -180,6 +182,7 @@
 oMathRunElemToText (TextRun s) = s
 oMathRunElemToText (LnBrk) = "\n"
 oMathRunElemToText (Tab) = "\t"
+oMathRunElemToText (Inserted es) = mconcat $ map oMathRunElemToText es
 
 oMathRunElemsToText :: [OMathRunElem] -> T.Text
 oMathRunElemsToText = T.concat . map oMathRunElemToText
@@ -278,7 +281,18 @@
 elemToExps' element | isElem "m" "borderBox" element = do
   baseExp <- filterChildName (hasElemName "m" "e") element >>=
              elemToBase
-  return [EBoxed baseExp]
+  let bbPr = filterChildName (hasElemName "m" "borderBoxPr") element
+      bltr = bbPr >>= filterChildName (hasElemName "m" "strikeBLTR") >>=
+                      findAttrBy (hasElemName "m" "val")
+      tlbr = bbPr >>= filterChildName (hasElemName "m" "strikeTLBR") >>=
+                      findAttrBy (hasElemName "m" "val")
+  return $
+    case (bltr, tlbr) of
+      (Just "1", Just "1") -> [ECancel XSlash baseExp]
+      (Just "1", _)        -> [ECancel ForwardSlash baseExp]
+      (_, Just "1")        -> [ECancel BackSlash baseExp]
+      _                    -> [EBoxed baseExp]
+
 elemToExps' element | isElem "m" "d" element =
   let baseExps  = mapMaybe
                   elemToBases
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
@@ -52,28 +52,22 @@
 
 -- The parser
 
-expr1 :: TP Exp
-expr1 = do
-  e <- expr2
-  -- check for primes and add them as a subscript
-  -- in TeX ' is shorthand for ^{\prime}
-  primes <- many (char '\'')
-  let getPrimes cs = case cs of
-                       "" -> ""
-                       "'" -> "\x2032"
-                       "''" -> "\x2033"
-                       "'''" -> "\x2034"
-                       "''''" -> "\x2057"
-                       _ -> "\x2057" ++ getPrimes (drop 4 cs)
-  ignorable
-  case getPrimes primes of
-    "" -> return e
-    cs -> return $ case e of
-                     ESub b sub -> ESubsup b sub (ESymbol Pun (T.pack cs))
-                     _ -> ESuper e (ESymbol Pun (T.pack cs))
+primes :: TP Exp
+primes = do
+  ESymbol Pun . getPrimes <$> (many1 (char '\'') <* ignorable)
 
-expr2 :: TP Exp
-expr2 = choice
+getPrimes :: [Char] -> Text
+getPrimes cs =
+  case cs of
+    "" -> ""
+    "'" -> "\x2032"
+    "''" -> "\x2033"
+    "'''" -> "\x2034"
+    "''''" -> "\x2057"
+    _ -> "\x2057" <> getPrimes (drop 4 cs)
+
+expr1 :: TP Exp
+expr1 = choice
           [ inbraces
           , variable
           , number
@@ -229,6 +223,7 @@
     , mathop c
     , phantom c
     , boxed c
+    , cancel c
     , binary c
     , genfrac c
     , substack c
@@ -254,7 +249,7 @@
     ctrlseq "operatorname"
     -- these are slightly different but we won't worry about that here...
     convertible <- (char '*' >> spaces >> return True) <|> return False
-    tok' <- texSymbol <|> braces (manyExp expr2) <|> texChar
+    tok' <- texSymbol <|> braces (manyExp expr1) <|> texChar
     tok'' <- (EMathOperator <$> (expToOperatorName tok'))
            <|> return (EStyled TextNormal [tok'])
     return (tok'', convertible)
@@ -612,8 +607,8 @@
 
 subSup :: Maybe Bool -> Bool -> Exp -> TP Exp
 subSup limits convertible a = try $ do
-  let sub1 = symbol "_" >> expr1
-  let sup1 = symbol "^" >> expr1
+  let sub1 = symbol "_" >> expr1  -- see #273
+  let sup1 = (symbol "^" >> expr1) <|> primes
   (b,c) <- try (do {m <- sub1; n <- sup1; return (m,n)})
        <|> (do {n <- sup1; m <- sub1; return (m,n)})
   return $ case limits of
@@ -624,9 +619,8 @@
 
 superOrSubscripted :: Maybe Bool -> Bool -> Exp -> TP Exp
 superOrSubscripted limits convertible a = try $ do
-  c <- oneOf "^_"
-  spaces
-  b <- expr
+  (c,b) <- ((,) <$> oneOf "^_" <*> (spaces >> expr))
+          <|> (('^',) <$> primes)
   case c of
        '^' -> return $ case limits of
                         Just True  -> EOver False a b
@@ -660,14 +654,43 @@
 boxed "\\boxed" = EBoxed <$> texToken
 boxed _ = mzero
 
+cancel :: Text -> TP Exp
+cancel c = do
+  case c of
+    "\\cancel"  -> ECancel ForwardSlash <$> texToken
+    "\\bcancel" -> ECancel BackSlash <$> texToken
+    "\\xcancel" -> ECancel XSlash <$> texToken
+    _           -> mzero
+
+textContents :: (Text -> Exp) -> TP [Exp]
+textContents op = char '{' *> manyTill chunk (char '}')
+ where
+   chunk = (op . T.concat <$> many1 textual)
+            <|> textSpaceCommand
+            <|> (char '{' *> (asGroup <$> manyTill chunk (char '}')))
+            <|> innermath
+
+textSpaceCommand :: TP Exp
+textSpaceCommand = try $ do
+  char '\\'
+  choice
+   [ ESpace (2 % 9) <$ char ' '
+   , ESpace ((-1) % 6) <$ char '!'
+   , ESpace (1 % 6) <$ char ','
+   , ESpace (2 % 9) <$ char ':'
+   , ESpace (5 % 18) <$ char ';'
+   , ESpace (2 % 9) <$ char '>'
+   ]
+
 text :: Text -> TP Exp
 text c = do
   op <- maybe mzero return $ M.lookup c textOps
-  char '{'
-  let chunk = ((op . T.concat) <$> many1 textual)
-            <|> (char '{' *> (asGroup <$> manyTill chunk (char '}')))
-            <|> innermath
-  contents <- manyTill chunk (char '}')
+  contents <- textContents op  -- braced
+           <|> ((:[]) <$>      -- nonbraced token
+                (  (op <$> textCommand)
+               <|> textSpaceCommand
+               <|> (op . T.singleton <$> noneOf "\n\t\r \\{}")
+                ))
   spaces
   case contents of
        []   -> return (op "")
diff --git a/src/Text/TeXMath/Shared.hs b/src/Text/TeXMath/Shared.hs
--- a/src/Text/TeXMath/Shared.hs
+++ b/src/Text/TeXMath/Shared.hs
@@ -110,7 +110,6 @@
 getDiacriticalCommand  :: Position -> T.Text -> Maybe T.Text
 getDiacriticalCommand pos symbol = do
   command <- M.lookup symbol diaMap
-  guard (not $ command `elem` unavailable)
   let below = command `elem` under
   case pos of
     Under -> if below then Just command else Nothing
@@ -288,11 +287,6 @@
 -- Accents which go under the character
 under :: [T.Text]
 under = ["\\underbrace", "\\underline", "\\underbar", "\\underbracket"]
-
--- We want to parse these but we can't represent them in LaTeX
-unavailable :: [T.Text]
-unavailable = ["\\overbracket", "\\underbracket"]
-
 
 -- | Mapping between unicode combining character and LaTeX accent command
 diacriticals :: [(T.Text, T.Text)]
diff --git a/src/Text/TeXMath/Types.hs b/src/Text/TeXMath/Types.hs
--- a/src/Text/TeXMath/Types.hs
+++ b/src/Text/TeXMath/Types.hs
@@ -24,8 +24,8 @@
                            FractionType(..), TextType(..),
                            Alignment(..), DisplayType(..),
                            Operator(..), FormType(..), Record(..),
-                           Property, Position(..), Env, defaultEnv,
-                           InEDelimited)
+                           Property, Position(..), StrokeType(..),
+                           Env, defaultEnv, InEDelimited)
 where
 
 import Data.Generics
@@ -44,6 +44,9 @@
                   | NoLineFrac   -- ^ No line between top and bottom
                   deriving (Show, Read, Eq, Ord, Data, Typeable)
 
+data StrokeType = ForwardSlash | BackSlash | XSlash
+                  deriving (Show, Read, Eq, Ord, Data, Typeable)
+
 type ArrayLine = [[Exp]]
 
 data Exp =
@@ -79,6 +82,7 @@
                        -- something under it.
   | EPhantom Exp  -- ^ A "phantom" operator that takes space but doesn't display.
   | EBoxed Exp    -- ^ A boxed expression.
+  | ECancel StrokeType Exp -- ^ A cancelled expression.
   | EFraction FractionType Exp Exp  -- ^ A fraction.  First argument is
                        -- numerator, second denominator.
   | ERoot Exp Exp  -- ^ An nth root.  First argument is index, second is base.
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
@@ -187,6 +187,7 @@
 writeExp (ERoot i e) = "\"\" sup " <> writeExp' i <> " sqrt " <> writeExp' e
 writeExp (EPhantom e) = "hphantom " <> writeExp' e
 writeExp (EBoxed e) = writeExp e -- TODO: any way to do this?
+writeExp (ECancel _ e) = writeExp e -- TODO 
 writeExp (EScaled _size e) = writeExp e -- TODO: any way?
 writeExp (EText ttype s) =
   let quoted = "\"" <> s <> "\""
diff --git a/src/Text/TeXMath/Writers/MathML.hs b/src/Text/TeXMath/Writers/MathML.hs
--- a/src/Text/TeXMath/Writers/MathML.hs
+++ b/src/Text/TeXMath/Writers/MathML.hs
@@ -26,8 +26,8 @@
 
 import Text.XML.Light
 import Text.TeXMath.Types
-import Text.TeXMath.Unicode.ToUnicode
 import Data.Generics (everywhere, mkT)
+import Text.TeXMath.Unicode.ToUnicode (toUnicode)
 import Text.TeXMath.Shared (getMMLType, handleDownup,
                             isUppercaseGreek, isRLSequence)
 import Text.TeXMath.Readers.MathML.MMLDict (getMathMLOperator)
@@ -80,7 +80,7 @@
 fromForm FPrefix  = "prefix"
 
 makeScaled :: Rational -> Element -> Element
-makeScaled x = withAttribute "minsize" p . withAttribute "maxsize" p 
+makeScaled x = withAttribute "minsize" p . withAttribute "maxsize" p
                . setAttribute "stretchy" "true"
   where p = T.pack $ printf "%d%%" (round (100*x) :: Int)
 
@@ -94,7 +94,6 @@
       Just (_, '.') -> T.snoc x '0'
       _ -> x
 
--- Note: Converts strings to unicode directly, as few renderers support those mathvariants.
 makeText :: TextType -> T.Text -> Element
 makeText a s = case (leadingSp, trailingSp) of
                    (False, False) -> s'
@@ -102,14 +101,15 @@
                    (False, True)  -> mrow [s', sp]
                    (True,  True)  -> mrow [sp, s', sp]
   where sp = spaceWidth (1/3)
-        s' = withAttribute "mathvariant" attr $ tunode "mtext" $ toUnicode a s
+        s' = withAttribute "mathvariant" (getMMLType a) $
+               -- use Unicode characters as few browsers support the mathvariants
+               tunode "mtext" $ toUnicode a s
         trailingSp = case T.unsnoc s of
           Just (_, c) -> T.any (== c) " \t"
           _           -> False
         leadingSp  = case T.uncons s of
           Just (c, _) -> T.any (== c) " \t"
           _           -> False
-        attr = getMMLType a
 
 makeArray :: Maybe TextType -> [Alignment] -> [ArrayLine] -> Element
 makeArray tt as ls = unode "mtable" $
@@ -144,11 +144,11 @@
     newAttr = Attr (unqual a) (T.unpack v)
     update [] = [newAttr]
     update (x:xs)
-        | qName (attrKey x) == a = 
+        | qName (attrKey x) == a =
             newAttr : xs
-        | otherwise = 
+        | otherwise =
             x : update xs
-            
+
 accent :: T.Text -> Element
 accent = add_attr (Attr (unqual "accent") "true") .
            tunode "mo"
@@ -187,10 +187,7 @@
 
 showExp :: Maybe TextType -> Exp -> Element
 showExp tt e =
- let toUnicodeMaybe :: TextType -> T.Text -> Maybe T.Text
-     toUnicodeMaybe textStyle t =
-       T.pack <$> mapM (toUnicodeChar . (textStyle,)) (T.unpack t)
-     -- variant node: tries to convert text to appropriate unicode
+ let -- variant node: tries to convert text to appropriate unicode
      -- characters depending on style
      vnode :: String -> T.Text -> Element
      vnode elname t
@@ -201,12 +198,17 @@
                 else tunode elname t
            Just TextNormal -> withAttribute "mathvariant" "normal" $
                                 tunode elname t
-           Just textStyle ->
-             case toUnicodeMaybe textStyle t of
-               -- if we can't find unicode equivalents, rely on mathvariant:
-               Nothing -> withAttribute "mathvariant" (getMMLType textStyle) $
-                             tunode elname t
-               Just t' -> tunode elname t'
+           Just TextBold
+             | elname == "mi" && not (isUppercaseGreek t) -- #255, #280
+               -> withAttribute "mathvariant" "bold-italic" $
+                     tunode elname (toUnicode TextBoldItalic t)
+             | otherwise
+               -> withAttribute "mathvariant" "bold" $
+                     tunode elname (toUnicode TextBold t)
+           Just textStyle -> withAttribute "mathvariant" (getMMLType textStyle) $
+                              -- we use unicode chars because browsers don't
+                              -- completely support mathvariant:
+                              tunode elname (toUnicode textStyle t)
   in case e of
    ENumber x        -> vnode "mn" x
    EGrouped [x]     -> showExp tt x
@@ -217,7 +219,10 @@
      [ makeStretchy FPostfix (vnode "mo" end)
         | not (T.null end) ]
    EIdentifier x    -> vnode "mi" x
-   EMathOperator x  -> vnode "mi" x -- see #257
+   EMathOperator x  -> -- see #257, #270
+     case tt of
+       Nothing -> withAttribute "mathvariant" "normal" $ tunode "mi" x
+       _ -> vnode "mi" x
    ESymbol Open x   -> makeFence FPrefix $ vnode "mo" x
    ESymbol Close x  -> makeFence FPostfix $ vnode "mo" x
    ESymbol Ord x
@@ -238,6 +243,12 @@
    EPhantom x       -> unode "mphantom" $ showExps tt [x]
    EBoxed x         -> withAttribute "notation" "box" .
                        unode "menclose" $ showExp tt x
+   ECancel ForwardSlash x -> withAttribute "notation" "updiagonalstrike" .
+                             unode "menclose" $ showExp tt x
+   ECancel BackSlash x    -> withAttribute "notation" "downdiagonalstrike" .
+                             unode "menclose" $ showExp tt x
+   ECancel XSlash x       -> withAttribute "notation" "updiagonalstrike downdiagonalstrike" .
+                             unode "menclose" $ showExp tt x
    ESqrt x          -> unode "msqrt" $ showExp tt x
    ERoot i x        -> unode "mroot" [showExp tt x, showExp tt i]
    EScaled s x      -> makeScaled s $ showExp tt x
diff --git a/src/Text/TeXMath/Writers/OMML.hs b/src/Text/TeXMath/Writers/OMML.hs
--- a/src/Text/TeXMath/Writers/OMML.hs
+++ b/src/Text/TeXMath/Writers/OMML.hs
@@ -233,6 +233,10 @@
    EIdentifier x
      | isUppercaseGreek x
      , null props -> [str [mnodeA "sty" "p" ()] x]
+     | not (isUppercaseGreek x)
+     , [Element{ elName = QName "sty" _ _
+              , elAttribs = [Attr (QName "val" Nothing (Just "m")) "b"] }] <- props
+      -> [str [mnodeA "sty" "bi" ()] x] -- #280
      | otherwise  -> [str props x]
    EMathOperator x  -> [str (mnodeA "sty" "p" () : props) x]
    ESymbol ty xs
@@ -300,6 +304,7 @@
                                             [ mnodeA "show" "off" () ]
                                           , mnode "e" $ showExp props x]]
    EBoxed   x       -> [mnode "borderBox" [ mnode "e" $ showExp props x]]
+   ECancel st x     -> [makeCancel props st x]
    EScaled _ x      -> showExp props x -- no support for scaler?
    EArray as ls     -> [makeArray props as ls]
    EText a s        -> [makeText a s]
@@ -342,3 +347,16 @@
                , mnode "sup" $ showExp props z
                , mnode "e" $ showExp props w ]
 
+makeCancel :: [Element] -> StrokeType -> Exp -> Element
+makeCancel props st x = do
+  let sn = case st of
+             ForwardSlash -> [ mnodeA "strikeBLTR" "1" () ]
+             BackSlash    -> [ mnodeA "strikeTLBR" "1" () ]
+             XSlash       -> [ mnodeA "strikeBLTR" "1" () 
+                             , mnodeA "strikeTLBR" "1" () ]
+  mnode "borderBox" [ mnode "borderBoxPr" $ 
+                      [ mnodeA "hideTop" "1" ()
+                      , mnodeA "hideBot" "1" ()
+                      , mnodeA "hideLeft" "1" ()
+                      , mnodeA "hideRight" "1" () ] ++ sn
+                    , mnode "e" $ showExp props x ]
diff --git a/src/Text/TeXMath/Writers/Pandoc.hs b/src/Text/TeXMath/Writers/Pandoc.hs
--- a/src/Text/TeXMath/Writers/Pandoc.hs
+++ b/src/Text/TeXMath/Writers/Pandoc.hs
@@ -156,4 +156,5 @@
 expToInlines _ (EUnderover _ _ _ _) = Nothing
 expToInlines _ (EPhantom _) = Nothing
 expToInlines _ (EBoxed _) = Nothing
+expToInlines _ (ECancel _ _) = Nothing
 expToInlines _ (EArray _ _) = Nothing
diff --git a/src/Text/TeXMath/Writers/StarMath.hs b/src/Text/TeXMath/Writers/StarMath.hs
new file mode 100644
--- /dev/null
+++ b/src/Text/TeXMath/Writers/StarMath.hs
@@ -0,0 +1,1598 @@
+{-# LANGUAGE OverloadedStrings #-}
+module Text.TeXMath.Writers.StarMath
+  ( writeStarMath
+  ) where
+
+import Data.Char (isLetter)
+import Data.Generics (everywhere, mkT)
+import qualified Data.List as List
+import qualified Data.Text as T
+import qualified Text.TeXMath.Shared as S
+import Text.TeXMath.Unicode.ToUnicode (toUnicodeChar)
+import Text.TeXMath.Types
+  ( Alignment(..)
+  , DisplayType(..)
+  , Exp(..)
+  , FractionType(..)
+  , TeXSymbolType(..)
+  , TextType(..)
+  )
+import Text.TeXMath.Writers.TeX (writeTeX)
+
+-- | Render TeXMath expressions as StarMath syntax.
+-- Falls back to TeX output for expressions that are not yet supported.
+writeStarMath :: DisplayType -> [Exp] -> T.Text
+writeStarMath dt exps =
+  case renderExps dt (normalizeExps (everywhere (mkT $ S.handleDownup dt) exps)) of
+    Just rendered -> T.strip rendered
+    Nothing       -> writeTeX exps
+
+data AlignContext = AlignDefault | AlignLeftCtx | AlignRightCtx
+  deriving (Eq)
+
+renderExps :: DisplayType -> [Exp] -> Maybe T.Text
+renderExps dt = renderExpsIn dt AlignDefault
+
+normalizeExps :: [Exp] -> [Exp]
+normalizeExps =
+  normalizeBareBars
+  . normalizeEvaluationBars
+  . mergeAdjacentUnicodeSerifStyled
+  . normalizeBareBraces
+  . map normalizeExp
+
+normalizeExp :: Exp -> Exp
+normalizeExp e =
+  case e of
+    EGrouped xs            -> EGrouped (normalizeExps xs)
+    EStyled sty xs         -> EStyled sty (normalizeExps xs)
+    EFraction ft num den   -> EFraction ft (normalizeExp num) (normalizeExp den)
+    ESqrt x                -> ESqrt (normalizeExp x)
+    ERoot idx rad          -> ERoot (normalizeExp idx) (normalizeExp rad)
+    EDelimited op cl xs    -> EDelimited op cl (map normalizeDelimitedPiece xs)
+    ESub base sub          -> ESub (normalizeExp base) (normalizeExp sub)
+    ESuper base sup        -> ESuper (normalizeExp base) (normalizeExp sup)
+    ESubsup base sub sup   -> ESubsup (normalizeExp base) (normalizeExp sub) (normalizeExp sup)
+    EOver b base over      -> EOver b (normalizeExp base) (normalizeExp over)
+    EUnder b base under    -> EUnder b (normalizeExp base) (normalizeExp under)
+    EUnderover b base u o  -> EUnderover b (normalizeExp base) (normalizeExp u) (normalizeExp o)
+    EArray aligns rows     -> EArray aligns (map (map normalizeExps) rows)
+    EPhantom x             -> EPhantom (normalizeExp x)
+    _                      -> e
+
+normalizeDelimitedPiece :: Either T.Text Exp -> Either T.Text Exp
+normalizeDelimitedPiece p =
+  case p of
+    Left t  -> Left t
+    Right e -> Right (normalizeExp e)
+
+normalizeBareBars :: [Exp] -> [Exp]
+normalizeBareBars [] = []
+normalizeBareBars (x : xs)
+  | Just sym <- bareBarSymbol x =
+      case collectBareDelimited sym [] xs of
+        Just (mid, trailingScript, rest) ->
+          let delimited = EDelimited sym sym (map Right mid)
+              scripted = maybe delimited ($ delimited) trailingScript
+          in scripted : normalizeBareBars rest
+        _ ->
+          x : normalizeBareBars xs
+normalizeBareBars (x:xs) = x : normalizeBareBars xs
+
+normalizeBareBraces :: [Exp] -> [Exp]
+normalizeBareBraces [] = []
+normalizeBareBraces (ESymbol Open "{" : xs) =
+  case collectBareBraces [] xs of
+    Just (mid, rest) -> EDelimited "{" "}" (map Right mid) : normalizeBareBraces rest
+    Nothing          -> ESymbol Open "{" : normalizeBareBraces xs
+normalizeBareBraces (x:xs) = x : normalizeBareBraces xs
+
+mergeAdjacentUnicodeSerifStyled :: [Exp] -> [Exp]
+mergeAdjacentUnicodeSerifStyled [] = []
+mergeAdjacentUnicodeSerifStyled (EStyled sty xs : EStyled sty' ys : rest)
+  | sty == sty' && isUnicodeSerifStyle sty =
+      mergeAdjacentUnicodeSerifStyled (EStyled sty (xs <> [ESpace 1] <> ys) : rest)
+mergeAdjacentUnicodeSerifStyled (x:xs) = x : mergeAdjacentUnicodeSerifStyled xs
+
+isUnicodeSerifStyle :: TextType -> Bool
+isUnicodeSerifStyle sty =
+  sty `elem`
+    [ TextScript
+    , TextFraktur
+    , TextDoubleStruck
+    , TextBoldScript
+    , TextBoldFraktur
+    ]
+
+normalizeEvaluationBars :: [Exp] -> [Exp]
+normalizeEvaluationBars = reverse . go []
+ where
+  go acc [] = acc
+  go acc (cur : xs)
+    | Just script <- evaluationBarScript cur
+    , Just (rest, target) <- takeEvaluationTarget acc =
+        go (script target : rest) xs
+    | otherwise =
+        go (cur : acc) xs
+
+evaluationBarScript :: Exp -> Maybe (Exp -> Exp)
+evaluationBarScript cur =
+  case cur of
+    ESub base sub
+      | isEvaluationBarBase base ->
+          Just (\target -> ESub (EDelimited "." "|" [Right target]) sub)
+    ESuper base sup
+      | isEvaluationBarBase base ->
+          Just (\target -> ESuper (EDelimited "." "|" [Right target]) sup)
+    ESubsup base sub sup
+      | isEvaluationBarBase base ->
+          Just (\target -> ESubsup (EDelimited "." "|" [Right target]) sub sup)
+    _ -> Nothing
+
+takeEvaluationTarget :: [Exp] -> Maybe ([Exp], Exp)
+takeEvaluationTarget [] = Nothing
+takeEvaluationTarget (e : rest) =
+  case e of
+    EDelimited{} -> Just (rest, e)
+    ESymbol Close c
+      | Just (rest', target) <- takeDelimitedTarget c rest ->
+          Just (rest', target)
+    _ -> Just (rest, e)
+
+takeDelimitedTarget :: T.Text -> [Exp] -> Maybe ([Exp], Exp)
+takeDelimitedTarget closeTxt = go 0 []
+ where
+  openTxt =
+    case closeTxt of
+      ")" -> Just "("
+      "]" -> Just "["
+      "}" -> Just "{"
+      _   -> Nothing
+
+  go _ _ [] = Nothing
+  go depth inner (e : rest) =
+    case (openTxt, e) of
+      (Just open, ESymbol Close c)
+        | c == closeTxt ->
+            go (depth + 1) (e : inner) rest
+      (Just open, ESymbol Open o)
+        | o == open ->
+            if depth == 0
+               then Just (rest, EDelimited open closeTxt (map Right inner))
+               else go (depth - 1) (e : inner) rest
+      _ ->
+        go depth (e : inner) rest
+
+isEvaluationBarBase :: Exp -> Bool
+isEvaluationBarBase e =
+  case e of
+    EScaled _ (ESymbol Open "|")  -> True
+    EScaled _ (ESymbol Close "|") -> True
+    _                             -> False
+
+collectBareBraces :: [Exp] -> [Exp] -> Maybe ([Exp], [Exp])
+collectBareBraces _ [] = Nothing
+collectBareBraces acc (ESymbol Close "}" : xs) = Just (reverse acc, xs)
+collectBareBraces acc (x:xs) = collectBareBraces (x:acc) xs
+
+collectBareDelimited :: T.Text -> [Exp] -> [Exp]
+                     -> Maybe ([Exp], Maybe (Exp -> Exp), [Exp])
+collectBareDelimited _ acc [] = Nothing
+collectBareDelimited sym acc (y:ys)
+  | matchesBareBar sym y = Just (reverse acc, Nothing, ys)
+  | Just apply <- scriptedBareBar sym y = Just (reverse acc, Just apply, ys)
+  | otherwise = collectBareDelimited sym (y:acc) ys
+
+bareBarSymbol :: Exp -> Maybe T.Text
+bareBarSymbol e =
+  case e of
+    ESymbol _ "|" -> Just "|"
+    ESymbol _ "∣" -> Just "|"
+    ESymbol _ "∥" -> Just "∥"
+    _             -> Nothing
+
+matchesBareBar :: T.Text -> Exp -> Bool
+matchesBareBar sym e =
+  case bareBarSymbol e of
+    Just sym' -> sym == sym'
+    Nothing   -> False
+
+scriptedBareBar :: T.Text -> Exp -> Maybe (Exp -> Exp)
+scriptedBareBar sym e =
+  case e of
+    ESub base sub
+      | matchesBareBar sym base -> Just (\del -> ESub del sub)
+    ESuper base sup
+      | matchesBareBar sym base -> Just (\del -> ESuper del sup)
+    ESubsup base sub sup
+      | matchesBareBar sym base -> Just (\del -> ESubsup del sub sup)
+    _ -> Nothing
+
+renderExpsIn :: DisplayType -> AlignContext -> [Exp] -> Maybe T.Text
+renderExpsIn dt ctx exps = do
+  rendered <- mapM (renderExpIn dt ctx) exps
+  let pieces = zip exps rendered
+  let merged = mergePieces pieces
+  let withLhs =
+        if startsWithInfixNeedingLhs exps
+           then "{} " <> T.stripStart merged
+           else merged
+  pure $ if endsWithInfixNeedingRhs exps
+            then T.stripEnd withLhs <> " {}"
+            else withLhs
+
+mergePieces :: [(Exp, T.Text)] -> T.Text
+mergePieces [] = ""
+mergePieces ((e0, t0) : rest) = snd $ List.foldl' step (e0, t0) rest
+ where
+  step (prevE, acc) (curE, curT) =
+    if T.null curT
+       then (prevE, acc)
+       else
+         (curE, appendRendered (needsSeparator prevE curE) acc curT)
+
+appendRendered :: Bool -> T.Text -> T.Text -> T.Text
+appendRendered needSep left right
+  | T.null left = T.stripStart right
+  | T.null right = T.stripEnd left
+  | otherwise =
+      let leftHadWs = endsWithAsciiSpace left
+          rightHadWs = startsWithAsciiSpace right
+          left' = T.dropWhileEnd isAsciiSpaceChar left
+          right' = T.dropWhile isAsciiSpaceChar right
+          sep = if leftHadWs || rightHadWs || needSep then " " else ""
+      in left' <> sep <> right'
+
+startsWithAsciiSpace :: T.Text -> Bool
+startsWithAsciiSpace t =
+  case T.uncons t of
+    Just (c, _) -> isAsciiSpaceChar c
+    Nothing     -> False
+
+endsWithAsciiSpace :: T.Text -> Bool
+endsWithAsciiSpace t =
+  case T.unsnoc t of
+    Just (_, c) -> isAsciiSpaceChar c
+    Nothing     -> False
+
+isAsciiSpaceChar :: Char -> Bool
+isAsciiSpaceChar c = c == ' ' || c == '\t' || c == '\n'
+
+needsSeparator :: Exp -> Exp -> Bool
+needsSeparator prevE curE
+  | isGreekIdentifierExp prevE && isIdentifierLike curE = True
+  | isGreekIdentifierExp prevE && isRootLike curE        = True
+  | isGreekIdentifierExp prevE && isTerminatingPunctuation curE = True
+  | isWordSymbolLike prevE && isIdentifierLike curE      = True
+  | isWordSymbolLike prevE && isOpenLike curE            = True
+  | isWordStyledExp prevE && isIdentifierLike curE       = True
+  | isAccentCommandExp prevE && isIdentifierLike curE    = True
+  | isAccentCommandExp prevE && isOpenLike curE          = True
+  | isAccentCommandExp prevE && isRootLike curE          = True
+  | isMathOperatorExp prevE && isIdentifierLike curE     = True
+  | isUnaryMinusSymbol prevE && isIdentifierLike curE    = True
+  | isIdentifierLike prevE && isMathOperatorExp curE     = True
+  | isIdentifierLike prevE && isRootLike curE            = True
+  | isIdentifierLike prevE && isArrowScriptedExp curE    = True
+  | isIdentifierLike prevE && isScriptedMathOperatorExp curE = True
+  | isIdentifierLike prevE && isWordSymbolLike curE      = True
+  | isLargeOpScriptedExp prevE && isIdentifierLike curE  = True
+  | isLargeOpScriptedExp prevE && isFractionLike curE    = True
+  | isLargeOpScriptedExp prevE && isAccentCommandExp curE = True
+  | isScripted prevE && isIdentifierLike curE           = True
+  | isArrowScriptedExp prevE && isIdentifierLike curE   = True
+  | isScriptedMathOperatorExp prevE && isIdentifierLike curE = True
+  | isDelimited prevE && isDelimited curE               = True
+  | isCloseLike prevE && isIdentifierLike curE          = True
+  | isCloseLike prevE && isWordSymbolLike curE          = True
+  | isCloseLike prevE && isAccentCommandExp curE        = True
+  | isCloseLike prevE && isArrayLike curE               = True
+  | isIdentifierLike prevE && isWordStyledExp curE      = True
+  | isIdentifierLike prevE && isUprightMathTextExp curE = True
+  | isIdentifierLike prevE && isAccentCommandExp curE   = True
+  | isIdentifierLike prevE && isWideSpace curE          = True
+  | isIdentifierLike prevE && isDelimited curE          = True
+  | isIdentifierLike prevE && isNonNormalTextExp curE   = True
+  | isQuotedTextExp prevE && isItalicTextExp curE       = True
+  | otherwise                                            = False
+
+isGreekIdentifierExp :: Exp -> Bool
+isGreekIdentifierExp e =
+  case e of
+    EIdentifier t -> greekName t /= Nothing
+    _             -> False
+
+isIdentifierLike :: Exp -> Bool
+isIdentifierLike e =
+  case e of
+    EIdentifier{}   -> True
+    ENumber{}       -> True
+    EMathOperator{} -> True
+    ESub{}          -> True
+    ESuper{}        -> True
+    ESubsup{}       -> True
+    EStyled{}       -> True
+    _               -> False
+
+isMathOperatorExp :: Exp -> Bool
+isMathOperatorExp e =
+  case e of
+    EMathOperator{} -> True
+    _               -> False
+
+isDelimited :: Exp -> Bool
+isDelimited e =
+  case e of
+    EDelimited{} -> True
+    _            -> False
+
+isArrayLike :: Exp -> Bool
+isArrayLike e =
+  case e of
+    EArray{} -> True
+    _        -> False
+
+isFractionLike :: Exp -> Bool
+isFractionLike e =
+  case e of
+    EFraction{} -> True
+    _           -> False
+
+isWideSpace :: Exp -> Bool
+isWideSpace e =
+  case e of
+    ESpace w -> w >= 1
+    _        -> False
+
+isWordSymbolLike :: Exp -> Bool
+isWordSymbolLike e =
+  case e of
+    ESymbol _ "∀" -> True
+    ESymbol _ "∃" -> True
+    ESymbol _ "∇" -> True
+    ESymbol _ "∂" -> True
+    ESymbol _ "¬" -> True
+    ESymbol _ "∧" -> True
+    ESymbol _ "∨" -> True
+    ESymbol _ "and" -> True
+    ESymbol _ "or" -> True
+    _             -> False
+
+isOpenLike :: Exp -> Bool
+isOpenLike e =
+  case e of
+    ESymbol Open _ -> True
+    _              -> False
+
+isRootLike :: Exp -> Bool
+isRootLike e =
+  case e of
+    ESqrt{} -> True
+    ERoot{} -> True
+    _       -> False
+
+isWordStyledExp :: Exp -> Bool
+isWordStyledExp e =
+  case e of
+    EStyled TextNormal [x]     -> isWordStyledExp x
+    EStyled TextItalic _       -> True
+    EStyled TextBold _         -> True
+    EStyled TextScript _       -> True
+    EStyled TextFraktur _      -> True
+    EStyled TextDoubleStruck _ -> True
+    _                          -> False
+
+isUprightMathTextExp :: Exp -> Bool
+isUprightMathTextExp e =
+  case e of
+    EStyled TextNormal [EIdentifier _] -> True
+    _                                  -> False
+
+isItalicTextExp :: Exp -> Bool
+isItalicTextExp e =
+  case e of
+    EText TextItalic _ -> True
+    _                  -> False
+
+isQuotedTextExp :: Exp -> Bool
+isQuotedTextExp e =
+  case e of
+    EText TextNormal _ -> True
+    _                  -> False
+
+isNonNormalTextExp :: Exp -> Bool
+isNonNormalTextExp e =
+  case e of
+    EText sty _ -> sty /= TextNormal
+    _           -> False
+
+isAccentCommandExp :: Exp -> Bool
+isAccentCommandExp e =
+  case e of
+    EOver _ _ over -> accentName over /= Nothing
+    _              -> False
+
+isTerminatingPunctuation :: Exp -> Bool
+isTerminatingPunctuation e =
+  case e of
+    ESymbol _ "." -> True
+    ESymbol _ "," -> True
+    ESymbol _ ";" -> True
+    ESymbol _ ":" -> True
+    _             -> False
+
+isCloseLike :: Exp -> Bool
+isCloseLike e =
+  case e of
+    ESymbol Close _ -> True
+    EDelimited{}    -> True
+    _               -> False
+
+isScripted :: Exp -> Bool
+isScripted e =
+  case e of
+    ESub{}    -> True
+    ESuper{}  -> True
+    ESubsup{} -> True
+    _         -> False
+
+isArrowScriptedExp :: Exp -> Bool
+isArrowScriptedExp e =
+  case e of
+    EUnder _ base _       -> isArrowBase base
+    EOver _ base _        -> isArrowBase base
+    EUnderover _ base _ _ -> isArrowBase base
+    ESub base _           -> isArrowBase base
+    ESuper base _         -> isArrowBase base
+    ESubsup base _ _      -> isArrowBase base
+    _                     -> False
+
+isScriptedMathOperatorExp :: Exp -> Bool
+isScriptedMathOperatorExp e =
+  case e of
+    ESub base _           -> isMathOperatorExp base
+    ESuper base _         -> isMathOperatorExp base
+    ESubsup base _ _      -> isMathOperatorExp base
+    EUnder _ base _       -> isMathOperatorExp base
+    EOver _ base _        -> isMathOperatorExp base
+    EUnderover _ base _ _ -> isMathOperatorExp base
+    _                     -> False
+
+isArrowBase :: Exp -> Bool
+isArrowBase e =
+  case e of
+    ESymbol _ "←" -> True
+    ESymbol _ "→" -> True
+    ESymbol _ "↔" -> True
+    ESymbol _ "⇐" -> True
+    ESymbol _ "⇒" -> True
+    ESymbol _ "⇔" -> True
+    ESymbol _ "↦" -> True
+    _             -> False
+
+isUnaryMinusSymbol :: Exp -> Bool
+isUnaryMinusSymbol e =
+  case e of
+    ESymbol t "-" -> t /= Bin
+    ESymbol t "−" -> t /= Bin
+    _             -> False
+
+isLargeOpScriptedExp :: Exp -> Bool
+isLargeOpScriptedExp e =
+  case e of
+    EUnder _ base _       -> largeOpName base /= Nothing
+    EOver _ base _        -> largeOpName base /= Nothing
+    EUnderover _ base _ _ -> largeOpName base /= Nothing
+    ESub base _      -> largeOpName base /= Nothing
+    ESuper base _    -> largeOpName base /= Nothing
+    ESubsup base _ _ -> largeOpName base /= Nothing
+    _                -> False
+
+startsWithInfixNeedingLhs :: [Exp] -> Bool
+startsWithInfixNeedingLhs exps =
+  case exps of
+    (e : _) -> needsNeutralLhs e
+    _                 -> False
+
+endsWithInfixNeedingRhs :: [Exp] -> Bool
+endsWithInfixNeedingRhs exps =
+  case reverse exps of
+    (e : _) -> needsNeutralRhs e
+    _       -> False
+
+needsNeutralLhs :: Exp -> Bool
+needsNeutralLhs = isInfixLikeExp
+
+needsNeutralRhs :: Exp -> Bool
+needsNeutralRhs = isInfixLikeExp
+
+needsNeutralScriptOperands :: Exp -> Bool
+needsNeutralScriptOperands e =
+  isInfixLikeExp e && not (isAtomicScriptOperator e)
+
+isAtomicScriptOperator :: Exp -> Bool
+isAtomicScriptOperator e =
+  case e of
+    ESymbol _ "∘" -> True
+    _             -> False
+
+isInfixLikeExp :: Exp -> Bool
+isInfixLikeExp e =
+  case e of
+    ESymbol t s
+      | t == Bin -> True
+      | t == Rel -> True
+      | otherwise -> s `elem`
+          [ "×", "⋅", "·", "∘"
+          , "∈", "∉", "∋"
+          , "∩", "∪"
+          , "⊂", "⊆", "⊃", "⊇"
+          , "≤", "≥", "≠", "≈", "≡", "∝"
+          , "∥", "⊥"
+          , "±", "∓"
+          , "/", "←", "→", "↔", "⇐", "⇒", "⇔", "↦"
+          ]
+    _ -> False
+
+renderExpIn :: DisplayType -> AlignContext -> Exp -> Maybe T.Text
+renderExpIn dt ctx e =
+  case e of
+    ENumber t       -> Just t
+    EIdentifier t   -> Just (renderIdentifier t)
+    EMathOperator t -> Just (renderMathOperator t)
+    ESymbol t s     -> Just (renderSymbol t s)
+    EText sty t     -> Just (renderTextAtom sty t)
+    ESpace w        -> Just (renderSpace w)
+    EGrouped xs     -> ("{" <>) . (<> "}") <$> renderExpsIn dt ctx xs
+    EStyled sty xs  -> renderStyled dt ctx sty xs
+
+    EFraction frac num den -> do
+      num' <- renderExpIn dt AlignDefault num
+      den' <- renderExpIn dt AlignDefault den
+      let num'' = maybeCenterFractionArg ctx num'
+      let den'' = maybeCenterFractionArg ctx den'
+      pure $ case frac of
+        NoLineFrac -> "binom" <> asDelimitedArg num'' <> asDelimitedArg den''
+        InlineFrac -> renderInlineFraction num'' den''
+        NormalFrac
+          | dt == DisplayInline -> renderInlineFraction num'' den''
+        _          -> "{" <> num'' <> " over " <> den'' <> "}"
+
+    ESqrt x -> ("sqrt {" <>) . (<> "}") <$> renderExpIn dt ctx x
+    ERoot idx rad -> do
+      idx' <- renderExpIn dt ctx idx
+      rad' <- renderExpIn dt ctx rad
+      pure $ "nroot {" <> idx' <> "} {" <> rad' <> "}"
+
+    EScaled _ (ESymbol Open "|") ->
+      Just "mline"
+    EScaled _ (ESymbol Close "|") ->
+      Just "mline"
+    EScaled _ x ->
+      renderExpIn dt ctx x
+
+    EDelimited op cl xs -> do
+      body <- renderDelimitedBody dt ctx xs
+      let op' = delimToken DelimLeft op
+      let cl' = delimToken DelimRight cl
+      pure $ "left " <> op' <> " " <> body <> " right " <> cl'
+
+    ESub base sub -> do
+      base' <- renderExpIn dt ctx base
+      sub'  <- renderScriptArg dt ctx sub
+      pure $ renderScriptBase base base' <> "_" <> sub'
+
+    ESuper base sup -> do
+      baseRendered <- renderExpIn dt ctx base
+      case renderPrimeSuffix sup of
+        Just primes ->
+          pure $ renderScriptBase base baseRendered <> primes
+        Nothing -> do
+          supRendered <- renderScriptArg dt ctx sup
+          pure $ renderScriptBase base baseRendered <> "^" <> supRendered
+
+    ESubsup base sub sup -> do
+      baseRendered <- renderExpIn dt ctx base
+      subRendered <- renderScriptArg dt ctx sub
+      case renderPrimeSuffix sup of
+        Just primes ->
+          pure $ renderScriptBase base baseRendered <> "_" <> subRendered <> primes
+        Nothing -> do
+          supRendered <- renderScriptArg dt ctx sup
+          pure $ renderScriptBase base baseRendered <> "_" <> subRendered <> "^" <> supRendered
+
+    EOver _ base over
+      | Just arrow <- arrowScriptOpName base -> do
+          if isEmptyScriptArg over
+             then pure arrow
+             else do
+               over' <- renderScriptArg dt ctx over
+               pure $ arrow <> " csup " <> centerScriptArg over'
+      | Just op <- centeredScriptOpName base -> do
+          over' <- renderScriptArg dt ctx over
+          pure $ "{" <> op <> "} csup " <> centerScriptArg over'
+      | Just brace <- braceAnnotationName over -> do
+          base' <- renderExpIn dt ctx base
+          pure $ renderScriptBase base base' <> " " <> brace
+      | isBraceAnnotatedExp base -> do
+          base' <- renderExpIn dt ctx base
+          over' <- renderBraceLabel dt ctx over
+          pure $ base' <> " " <> over'
+      | Just accent <- accentName over -> do
+          base' <- renderExpIn dt ctx base
+          pure $ accent <> " " <> renderAccentArg base base'
+      | Just op <- limitOpName base -> do
+          over' <- renderLimitArg dt ctx over
+          pure $ op <> " to " <> over' <> " "
+      | otherwise -> Nothing
+
+    EUnder _ base under ->
+      case arrowScriptOpName base of
+        Just arrow ->
+          if isEmptyScriptArg under
+             then pure arrow
+             else do
+               under' <- renderScriptArg dt ctx under
+               pure $ arrow <> " csub " <> centerScriptArg under'
+        Nothing ->
+          case underlineMarkerName under of
+            Just marker -> do
+              base' <- renderExpIn dt ctx base
+              pure $ marker <> " " <> renderAccentArg base base'
+            Nothing ->
+              case braceAnnotationName under of
+                Just brace -> do
+                  base' <- renderExpIn dt ctx base
+                  pure $ renderScriptBase base base' <> " " <> brace
+                Nothing ->
+                  if isBraceAnnotatedExp base
+                     then do
+                       base' <- renderExpIn dt ctx base
+                       under' <- renderBraceLabel dt ctx under
+                       pure $ base' <> " " <> under'
+                     else
+                       case centeredScriptOpName base of
+                         Just op -> do
+                           under' <- renderScriptArg dt ctx under
+                           pure $ "{" <> op <> "} csub " <> centerScriptArg under'
+                         Nothing ->
+                           case limitOpName base of
+                             Just op -> do
+                               under' <- renderLimitArg dt ctx under
+                               pure $ op <> " from " <> under' <> " "
+                             Nothing -> do
+                               base' <- renderExpIn dt ctx base
+                               under' <- renderScriptArg dt ctx under
+                               pure $ renderScriptBase base base' <> "_" <> under'
+    EUnderover _ base under over ->
+      case arrowScriptOpName base of
+        Just arrow ->
+          case (isEmptyScriptArg under, isEmptyScriptArg over) of
+            (True, True) -> pure arrow
+            (False, True) -> do
+              under' <- renderScriptArg dt ctx under
+              pure $ arrow <> " csub " <> centerScriptArg under'
+            (True, False) -> do
+              over' <- renderScriptArg dt ctx over
+              pure $ arrow <> " csup " <> centerScriptArg over'
+            (False, False) -> do
+              under' <- renderScriptArg dt ctx under
+              over' <- renderScriptArg dt ctx over
+              pure $ arrow <> " csub " <> centerScriptArg under'
+                  <> " csup " <> centerScriptArg over'
+        Nothing ->
+          case centeredScriptOpName base of
+            Just op -> do
+              under' <- renderScriptArg dt ctx under
+              over' <- renderScriptArg dt ctx over
+              pure $ "{" <> op <> "} csub " <> centerScriptArg under'
+                  <> " csup " <> centerScriptArg over'
+            Nothing ->
+              case limitOpName base of
+                Just op -> do
+                  under' <- renderLimitArg dt ctx under
+                  over'  <- renderLimitArg dt ctx over
+                  pure $ op <> " from " <> under' <> " to " <> over' <> " "
+                Nothing -> do
+                  base' <- renderExpIn dt ctx base
+                  under' <- renderScriptArg dt ctx under
+                  over' <- renderScriptArg dt ctx over
+                  pure $ renderScriptBase base base' <> "_" <> under' <> "^" <> over'
+    EArray aligns rows -> renderMatrix dt aligns rows
+    EPhantom x         -> do
+      x' <- renderExpIn dt ctx x
+      pure $ "phantom " <> renderPhantomArg x x'
+    _                  -> Nothing
+
+renderDelimitedBody :: DisplayType -> AlignContext -> [Either T.Text Exp] -> Maybe T.Text
+renderDelimitedBody dt ctx xs = do
+  chunks <- mapM (renderDelimitedChunk dt ctx) xs
+  pure $ T.strip (mergeDelimitedChunks chunks)
+
+data DelimitedChunk = DelimRaw T.Text | DelimExp Exp T.Text
+
+renderDelimitedChunk :: DisplayType -> AlignContext -> Either T.Text Exp -> Maybe DelimitedChunk
+renderDelimitedChunk dt ctx p =
+  case p of
+    Left t  -> Just $ DelimRaw (" " <> delimToken DelimMiddle t <> " ")
+    Right x -> DelimExp x <$> renderExpIn dt ctx x
+
+mergeDelimitedChunks :: [DelimitedChunk] -> T.Text
+mergeDelimitedChunks [] = ""
+mergeDelimitedChunks (c0:cs) = snd $ List.foldl' step (chunkExp c0, chunkText c0) cs
+ where
+  step (prevExp, acc) cur
+    | T.null curText = (prevExp, acc)
+    | otherwise =
+        case cur of
+          DelimRaw _ -> (Nothing, appendRendered False acc curText)
+          DelimExp curExp _ ->
+            let needSep = case prevExp of
+                            Just pe -> needsSeparator pe curExp
+                            Nothing -> False
+            in (Just curExp, appendRendered needSep acc curText)
+   where
+    curText = chunkText cur
+
+  chunkText c =
+    case c of
+      DelimRaw t   -> t
+      DelimExp _ t -> t
+
+  chunkExp c =
+    case c of
+      DelimRaw _   -> Nothing
+      DelimExp e _ -> Just e
+
+renderMatrix :: DisplayType -> [Alignment] -> [[[Exp]]] -> Maybe T.Text
+renderMatrix dt aligns rows = do
+  rows' <- mapM (renderMatrixRow dt aligns) rows
+  pure $ "matrix { " <> T.intercalate " ## " rows' <> " }"
+
+renderMatrixRow :: DisplayType -> [Alignment] -> [[Exp]] -> Maybe T.Text
+renderMatrixRow dt aligns cells = do
+  let explicitCenter = any (/= AlignCenter) aligns
+  let columnCount = max (length aligns) (length cells)
+  let paddedCells = take columnCount (cells ++ repeat [])
+  cells' <- sequence
+    [ renderMatrixCellWithAlign dt explicitCenter (columnAlign aligns i) c
+    | (i, c) <- zip [(0 :: Int) ..] paddedCells
+    ]
+  pure $ T.intercalate " # " cells'
+
+renderMatrixCell :: DisplayType -> AlignContext -> [Exp] -> Maybe T.Text
+renderMatrixCell _ _ [] = Just "{}"
+renderMatrixCell dt ctx xs = do
+  rendered <- renderExpsIn dt ctx xs
+  let stripped = T.strip rendered
+  pure $ if T.null stripped then "{}" else stripped
+
+renderMatrixCellWithAlign :: DisplayType -> Bool -> Alignment -> [Exp] -> Maybe T.Text
+renderMatrixCellWithAlign dt explicitCenter align xs = do
+  cell <- renderMatrixCell dt (alignmentContext align) xs
+  pure $ case align of
+    AlignLeft  -> "alignl " <> cell
+    AlignRight -> "alignr " <> cell
+    AlignCenter | explicitCenter -> "alignc " <> cell
+    _                            -> cell
+
+columnAlign :: [Alignment] -> Int -> Alignment
+columnAlign aligns i =
+  case drop i aligns of
+    (a : _) -> a
+    []      -> AlignCenter
+
+renderStyled :: DisplayType -> AlignContext -> TextType -> [Exp] -> Maybe T.Text
+renderStyled dt ctx sty xs = do
+  body <- renderExpsIn dt ctx xs
+  pure $ case sty of
+    _
+      | Just unicodeBody <- renderUnicodeSerifStyled sty xs ->
+          "nitalic " <> styleArg unicodeBody
+    TextNormal
+      | Just ident <- singleUprightIdentifier xs ->
+          "nitalic " <> renderTextNormalIdentifier ident
+      | not (hasStructuralScript xs)
+      , Just txt <- styledText xs -> quoteText txt
+      | Just txt <- renderTextNormalStyled dt xs
+      , shouldForceUprightTextNormal xs -> "nitalic{" <> txt <> "}"
+      | Just txt <- renderTextNormalStyled dt xs -> txt
+    TextItalic       -> "ital " <> styleArg body
+    TextBold
+      | shouldForceUprightBold xs -> "bold nitalic " <> styleArg body
+      | otherwise -> "bold " <> styleArg body
+    TextBoldItalic   -> "bold " <> styleArg ("ital " <> styleArg body)
+    TextMonospace    -> "font fixed nitalic " <> styleArg body
+    TextSansSerif    -> "font sans nitalic " <> styleArg body
+    TextSansSerifBold -> "bold " <> styleArg ("font sans nitalic " <> styleArg body)
+    TextSansSerifBoldItalic -> "bold " <> styleArg ("font sans ital " <> styleArg body)
+    TextSansSerifItalic -> "font sans ital " <> styleArg body
+    TextScript       -> "ital " <> styleArg body
+    TextFraktur      -> "bold " <> styleArg body
+    TextDoubleStruck -> "bold nitalic " <> styleArg body
+    _                -> body
+ where
+  styleArg t
+    | T.null t       = "{}"
+    | T.length t == 1 = t
+    | otherwise      = "{" <> t <> "}"
+
+renderUnicodeSerifStyled :: TextType -> [Exp] -> Maybe T.Text
+renderUnicodeSerifStyled sty xs =
+  case sty of
+    TextScript       -> styledUnicodeText sty xs
+    TextFraktur      -> styledUnicodeText sty xs
+    TextDoubleStruck -> styledUnicodeText sty xs
+    TextBoldScript   -> styledUnicodeText sty xs
+    TextBoldFraktur  -> styledUnicodeText sty xs
+    _                -> Nothing
+
+styledUnicodeText :: TextType -> [Exp] -> Maybe T.Text
+styledUnicodeText sty = fmap T.concat . mapM (styledUnicodeExp sty)
+
+styledUnicodeExp :: TextType -> Exp -> Maybe T.Text
+styledUnicodeExp sty e =
+  case e of
+    EIdentifier t        -> mapStyledUnicode sty t
+    ENumber t            -> mapStyledUnicode sty t
+    EGrouped xs          -> styledUnicodeText sty xs
+    EStyled TextNormal xs -> styledUnicodeText sty xs
+    ESpace w
+      | w <= 0          -> Just ""
+      | w >= 2          -> Just "  "
+      | otherwise       -> Just " "
+    _                   -> Nothing
+
+mapStyledUnicode :: TextType -> T.Text -> Maybe T.Text
+mapStyledUnicode sty t = T.pack <$> mapM (\c -> toUnicodeChar (sty, c)) (T.unpack t)
+
+hasStructuralScript :: [Exp] -> Bool
+hasStructuralScript = any go
+ where
+  go e =
+    case e of
+      ESub{}                 -> True
+      ESuper{}               -> True
+      ESubsup{}              -> True
+      EGrouped xs            -> hasStructuralScript xs
+      EStyled TextNormal xs  -> hasStructuralScript xs
+      _                      -> False
+
+styledText :: [Exp] -> Maybe T.Text
+styledText = fmap T.concat . mapM styledTextExp
+
+styledTextExp :: Exp -> Maybe T.Text
+styledTextExp e =
+  case e of
+    ENumber t         -> Just t
+    EIdentifier t     -> Just t
+    EText _ t         -> Just t
+    ESpace w
+      | w <= 0        -> Just ""
+      | w >= 2        -> Just "  "
+      | otherwise     -> Just " "
+    EGrouped xs       -> styledText xs
+    EStyled TextNormal xs -> styledText xs
+    ESub base sub     -> do
+      base' <- styledTextExp base
+      sub'  <- styledTextNonNumericExp sub
+      pure $ base' <> "_" <> sub'
+    ESuper base sup   -> do
+      base' <- styledTextExp base
+      sup'  <- styledTextNonNumericExp sup
+      pure $ base' <> "^" <> sup'
+    ESubsup base sub sup -> do
+      base' <- styledTextExp base
+      sub'  <- styledTextNonNumericExp sub
+      sup'  <- styledTextNonNumericExp sup
+      pure $ base' <> "_" <> sub' <> "^" <> sup'
+    ESymbol _ s
+      | isPlainTextSymbol s -> Just s
+    _ -> Nothing
+
+styledTextNonNumericExp :: Exp -> Maybe T.Text
+styledTextNonNumericExp e = do
+  txt <- styledTextExp e
+  if T.any isAsciiDigit txt
+     then Nothing
+     else Just txt
+
+isAsciiDigit :: Char -> Bool
+isAsciiDigit c = c >= '0' && c <= '9'
+
+isPlainTextSymbol :: T.Text -> Bool
+isPlainTextSymbol s =
+  s `elem`
+    [ "_", ",", ".", ":", ";", "-", "−", "/", "(", ")", "[", "]"
+    , "+", "=", "'", "′"
+    ]
+
+renderTextNormalStyled :: DisplayType -> [Exp] -> Maybe T.Text
+renderTextNormalStyled dt xs = do
+  let xs' = quoteStarMathKeywordRuns xs
+  rendered <- mapM (renderTextNormalExp dt) xs'
+  pure $ mergePieces (zip xs' rendered)
+
+quoteStarMathKeywordRuns :: [Exp] -> [Exp]
+quoteStarMathKeywordRuns [] = []
+quoteStarMathKeywordRuns xs@(x : rest)
+  | Just _ <- asciiIdentifierWord x =
+      let (word, wordExps, rest') = takeIdentifierWordRun xs
+      in if isStarMathReservedWord word
+            then EText TextNormal word : quoteStarMathKeywordRuns rest'
+            else wordExps <> quoteStarMathKeywordRuns rest'
+  | otherwise = x : quoteStarMathKeywordRuns rest
+
+takeIdentifierWordRun :: [Exp] -> (T.Text, [Exp], [Exp])
+takeIdentifierWordRun = go [] []
+ where
+  go pieces exps (e : rest)
+    | Just piece <- asciiIdentifierWord e = go (piece : pieces) (e : exps) rest
+  go pieces exps rest = (T.concat (reverse pieces), reverse exps, rest)
+
+asciiIdentifierWord :: Exp -> Maybe T.Text
+asciiIdentifierWord e =
+  case e of
+    EIdentifier t
+      | not (T.null t) && T.all isAsciiAlpha t -> Just t
+    _ -> Nothing
+
+renderTextNormalExp :: DisplayType -> Exp -> Maybe T.Text
+renderTextNormalExp dt e =
+  case e of
+    ENumber t       -> Just t
+    EIdentifier t   -> Just (renderIdentifier t)
+    EText sty t     -> Just (renderTextAtom sty t)
+    ESpace w        -> Just (renderSpace w)
+    EGrouped xs     -> renderTextNormalStyled dt xs
+    EStyled TextNormal xs -> renderTextNormalStyled dt xs
+    EStyled TextBold xs -> do
+      body <- renderExpsIn dt AlignDefault xs
+      pure $ "bold nitalic " <> styleArg body
+    EStyled sty xs  -> renderStyled dt AlignDefault sty xs
+    ESub base sub   -> do
+      base' <- renderTextNormalExp dt base
+      sub'  <- renderTextNormalExp dt sub
+      pure $ base' <> "_" <> sub'
+    ESuper base sup -> do
+      base' <- renderTextNormalExp dt base
+      sup'  <- renderTextNormalExp dt sup
+      pure $ base' <> "^" <> sup'
+    ESubsup base sub sup -> do
+      base' <- renderTextNormalExp dt base
+      sub'  <- renderTextNormalExp dt sub
+      sup'  <- renderTextNormalExp dt sup
+      pure $ base' <> "_" <> sub' <> "^" <> sup'
+    ESymbol t s     -> Just (T.strip (renderSymbol t s))
+    _               -> Nothing
+
+shouldForceUprightTextNormal :: [Exp] -> Bool
+shouldForceUprightTextNormal = all isUprightTextNormalExp
+
+shouldForceUprightBold :: [Exp] -> Bool
+shouldForceUprightBold = all isUprightBoldExp
+
+isUprightBoldExp :: Exp -> Bool
+isUprightBoldExp e =
+  case e of
+    ENumber{}            -> True
+    EIdentifier t        -> T.all isAsciiAlphaNum t
+    EText{}              -> True
+    ESpace{}             -> True
+    ESymbol _ s          -> isPlainTextSymbol s
+    EGrouped xs          -> shouldForceUprightBold xs
+    EStyled TextNormal xs -> shouldForceUprightBold xs
+    ESub base sub        -> isUprightBoldExp base && isUprightBoldExp sub
+    ESuper base sup      -> isUprightBoldExp base && isUprightBoldExp sup
+    ESubsup base sub sup -> isUprightBoldExp base
+                         && isUprightBoldExp sub
+                         && isUprightBoldExp sup
+    _                    -> False
+
+isUprightTextNormalExp :: Exp -> Bool
+isUprightTextNormalExp e =
+  case e of
+    ENumber{}              -> True
+    EIdentifier{}          -> True
+    EText{}                -> True
+    ESpace{}               -> True
+    ESymbol _ s            -> isPlainTextSymbol s
+    EGrouped xs            -> shouldForceUprightTextNormal xs
+    EStyled TextNormal xs  -> shouldForceUprightTextNormal xs
+    ESub base sub          -> isUprightTextNormalExp base && isUprightTextNormalExp sub
+    ESuper base sup        -> isUprightTextNormalExp base && isUprightTextNormalExp sup
+    ESubsup base sub sup   -> isUprightTextNormalExp base
+                           && isUprightTextNormalExp sub
+                           && isUprightTextNormalExp sup
+    _                      -> False
+
+isAsciiAlpha :: Char -> Bool
+isAsciiAlpha c =
+  (c >= 'A' && c <= 'Z') ||
+  (c >= 'a' && c <= 'z')
+
+isAsciiAlphaNum :: Char -> Bool
+isAsciiAlphaNum c =
+  isAsciiAlpha c ||
+  (c >= '0' && c <= '9')
+
+styleArg :: T.Text -> T.Text
+styleArg t
+  | T.null t        = "{}"
+  | T.length t == 1 = t
+  | otherwise       = "{" <> t <> "}"
+
+singleUprightIdentifier :: [Exp] -> Maybe T.Text
+singleUprightIdentifier xs =
+  case xs of
+    [EIdentifier t] -> Just t
+    _               -> Nothing
+
+alignmentContext :: Alignment -> AlignContext
+alignmentContext a =
+  case a of
+    AlignLeft  -> AlignLeftCtx
+    AlignRight -> AlignRightCtx
+    _          -> AlignDefault
+
+maybeCenterFractionArg :: AlignContext -> T.Text -> T.Text
+maybeCenterFractionArg ctx t
+  | ctx == AlignLeftCtx || ctx == AlignRightCtx = "{alignc " <> asArg t <> "}"
+  | otherwise = t
+ where
+  asArg x =
+    let s = T.strip x
+    in if T.null s
+          then "{}"
+          else if T.length s == 1
+                  then s
+          else if T.head s == '{' && T.last s == '}'
+                          then s
+                          else "{" <> s <> "}"
+
+asDelimitedArg :: T.Text -> T.Text
+asDelimitedArg t =
+  let s = T.strip t
+  in if T.null s
+        then "{}"
+        else if T.head s == '{' && T.last s == '}'
+                then s
+                else "{" <> s <> "}"
+
+renderInlineFraction :: T.Text -> T.Text -> T.Text
+renderInlineFraction num den =
+  "size*0.7 {" <> num <> " over " <> den <> "}"
+
+renderSpace :: Rational -> T.Text
+renderSpace w
+  | w <= 0    = ""
+  | w >= 2    = "~~ "
+  | w >= 1    = "~ "
+  | otherwise = " "
+
+renderIdentifier :: T.Text -> T.Text
+renderIdentifier ident =
+  case greekName ident of
+    Just name
+      | shouldItalicizeGreek ident -> "%i" <> name
+      | otherwise                  -> "%" <> name
+    Nothing -> ident
+
+renderTextNormalIdentifier :: T.Text -> T.Text
+renderTextNormalIdentifier ident =
+  case greekName ident of
+    Just{}  -> renderIdentifier ident
+    Nothing
+      | isStarMathReservedWord ident -> quoteText ident
+      | otherwise                    -> ident
+
+isStarMathReservedWord :: T.Text -> Bool
+isStarMathReservedWord t =
+  t `elem`
+    [ "alignc", "alignl", "alignr"
+    , "and", "approx"
+    , "bar", "binom", "bold", "breve"
+    , "cdot", "check", "circ", "cos", "cosh", "cot", "csub", "csup"
+    , "dlarrow", "dlrarrow", "dot", "dotsaxis", "dotsdown", "dotslow"
+    , "dotsup", "dotsvert", "downarrow", "drarrow"
+    , "emptyset", "equiv", "exists", "exp"
+    , "fixed", "font", "forall", "from", "func"
+    , "gg"
+    , "hat"
+    , "in", "infinity", "int", "intersection", "ital", "iiint"
+    , "langle", "lbrace", "lceil", "ldbracket", "ldline", "left"
+    , "leftarrow", "leftrightarrow", "lfloor", "lim", "liminf"
+    , "limsup", "ll", "lline", "ln", "log"
+    , "mapsto", "matrix", "max", "min", "minusplus", "mline"
+    , "nabla", "neg", "none", "notin", "nitalic", "nroot"
+    , "or", "ortho", "over", "overbrace", "overline", "owns"
+    , "parallel", "phantom", "plusminus", "partial", "prod", "prop"
+    , "rangle", "rbrace", "rceil", "rdbracket", "rdline", "rfloor"
+    , "right", "rline"
+    , "sans", "sin", "sinh", "sqrt", "subset", "subseteq", "sum"
+    , "supset", "supseteq"
+    , "tilde", "times", "to", "toward"
+    , "underbrace", "underline", "union", "uparrow"
+    , "vec"
+    ]
+
+renderMathOperator :: T.Text -> T.Text
+renderMathOperator t
+  | t == "min" = "func min"
+  | t == "max" = "func max"
+  | isBareMathOperator t = t
+  | shouldQuoteMathOperator t = "func " <> quoteText t
+  | otherwise                 = "func " <> t
+
+isBareMathOperator :: T.Text -> Bool
+isBareMathOperator t =
+  t `elem`
+    [ "min", "max", "log", "sin", "cos", "cosh", "sinh"
+    , "cot", "ln", "exp"
+    ]
+
+shouldQuoteMathOperator :: T.Text -> Bool
+shouldQuoteMathOperator = not . T.all isLetter
+
+shouldItalicizeGreek :: T.Text -> Bool
+shouldItalicizeGreek ident =
+  case ident of
+    "α" -> True
+    "β" -> True
+    "γ" -> True
+    "δ" -> True
+    "ϵ" -> True
+    "ε" -> True
+    "ζ" -> True
+    "η" -> True
+    "θ" -> True
+    "ϑ" -> True
+    "ι" -> True
+    "κ" -> True
+    "λ" -> True
+    "μ" -> True
+    "ν" -> True
+    "ξ" -> True
+    "ο" -> True
+    "π" -> True
+    "ϖ" -> True
+    "ρ" -> True
+    "ϱ" -> True
+    "𝜚" -> True
+    "σ" -> True
+    "ς" -> True
+    "𝜍" -> True
+    "τ" -> True
+    "υ" -> True
+    "ϕ" -> True
+    "φ" -> True
+    "χ" -> True
+    "ψ" -> True
+    "ω" -> True
+    _   -> False
+
+greekName :: T.Text -> Maybe T.Text
+greekName ident =
+  case ident of
+    "α" -> Just "alpha"
+    "β" -> Just "beta"
+    "γ" -> Just "gamma"
+    "δ" -> Just "delta"
+    "ϵ" -> Just "epsilon"
+    "ε" -> Just "varepsilon"
+    "ζ" -> Just "zeta"
+    "η" -> Just "eta"
+    "θ" -> Just "theta"
+    "ϑ" -> Just "vartheta"
+    "ι" -> Just "iota"
+    "κ" -> Just "kappa"
+    "λ" -> Just "lambda"
+    "μ" -> Just "mu"
+    "ν" -> Just "nu"
+    "ξ" -> Just "xi"
+    "ο" -> Just "omicron"
+    "π" -> Just "pi"
+    "ϖ" -> Just "varpi"
+    "ρ" -> Just "rho"
+    "ϱ" -> Just "varrho"
+    "𝜚" -> Just "varrho"
+    "σ" -> Just "sigma"
+    "ς" -> Just "varsigma"
+    "𝜍" -> Just "varsigma"
+    "τ" -> Just "tau"
+    "υ" -> Just "upsilon"
+    "ϕ" -> Just "phi"
+    "φ" -> Just "varphi"
+    "χ" -> Just "chi"
+    "ψ" -> Just "psi"
+    "ω" -> Just "omega"
+    "Γ" -> Just "GAMMA"
+    "Δ" -> Just "DELTA"
+    "Θ" -> Just "THETA"
+    "Λ" -> Just "LAMBDA"
+    "Ξ" -> Just "XI"
+    "Π" -> Just "PI"
+    "Σ" -> Just "SIGMA"
+    "Υ" -> Just "UPSILON"
+    "Φ" -> Just "PHI"
+    "Ψ" -> Just "PSI"
+    "Ω" -> Just "OMEGA"
+    _   -> Nothing
+
+renderScriptBase :: Exp -> T.Text -> T.Text
+renderScriptBase e rendered0 =
+  let rendered = T.strip rendered0
+  in if isEmptyScriptBase e || T.null rendered
+        then "{}"
+        else if isWrapped rendered
+        then rendered
+        else if isAtomic e
+        then rendered
+        else "{" <> rendered <> "}"
+
+renderScriptArg :: DisplayType -> AlignContext -> Exp -> Maybe T.Text
+renderScriptArg dt ctx e = do
+  rendered0 <-
+    if needsNeutralScriptOperands e
+       then renderExpsIn dt ctx [e]
+       else renderExpIn dt ctx e
+  let rendered = T.strip rendered0
+  pure $ if (isAtomic e && not (needsNeutralScriptOperands e)) || isQuotedText rendered
+            then rendered
+            else "{" <> rendered <> "}"
+
+renderPrimeSuffix :: Exp -> Maybe T.Text
+renderPrimeSuffix e =
+  case e of
+    ESymbol Pun "'"  -> Just "'"
+    ESymbol Pun "′"  -> Just "'"
+    ESymbol Pun "″"  -> Just "''"
+    ESymbol Pun "‴"  -> Just "'''"
+    _                -> Nothing
+
+renderLimitArg :: DisplayType -> AlignContext -> Exp -> Maybe T.Text
+renderLimitArg dt ctx e =
+  case e of
+    EGrouped xs -> do
+      rendered <- renderExpsIn dt ctx xs
+      let stripped = T.strip rendered
+      pure $
+        if T.null stripped
+           then "{}"
+           else if containsRelationLike xs
+                   then stripped
+           else if isQuotedText stripped || isWrapped stripped || T.length stripped == 1
+                   then stripped
+                   else "{" <> stripped <> "}"
+    _           -> T.strip <$> renderExpIn dt ctx e
+
+containsRelationLike :: [Exp] -> Bool
+containsRelationLike = any isRelationLike
+ where
+  isRelationLike expn =
+    case expn of
+      ESymbol Rel _ -> True
+      ESymbol Bin _ -> True
+      EGrouped ys   -> containsRelationLike ys
+      _             -> False
+
+renderAccentArg :: Exp -> T.Text -> T.Text
+renderAccentArg e rendered0 =
+  let rendered = T.strip rendered0
+  in if isAtomic e
+        then rendered
+        else "{" <> rendered <> "}"
+
+renderPhantomArg :: Exp -> T.Text -> T.Text
+renderPhantomArg e rendered0 =
+  let rendered = T.strip rendered0
+  in if isAtomic e
+        then rendered
+        else if isWrapped rendered
+        then rendered
+        else "{" <> rendered <> "}"
+
+centerScriptArg :: T.Text -> T.Text
+centerScriptArg rendered
+  | isWrapped rendered = rendered
+  | otherwise          = "{" <> rendered <> "}"
+
+isWrapped :: T.Text -> Bool
+isWrapped t = T.length t >= 2 && T.head t == '{' && T.last t == '}'
+
+isAtomic :: Exp -> Bool
+isAtomic e =
+  case e of
+    ENumber{}       -> True
+    EIdentifier{}   -> True
+    EMathOperator{} -> True
+    EText{}         -> True
+    ESymbol{}       -> True
+    _               -> False
+
+isEmptyScriptBase :: Exp -> Bool
+isEmptyScriptBase e =
+  case e of
+    EIdentifier t -> T.null t
+    _             -> False
+
+isEmptyScriptArg :: Exp -> Bool
+isEmptyScriptArg e =
+  case e of
+    EGrouped []   -> True
+    EIdentifier t -> T.null t
+    _             -> False
+
+isBraceAnnotatedExp :: Exp -> Bool
+isBraceAnnotatedExp e =
+  case e of
+    EOver _ _ over  -> braceAnnotationName over /= Nothing
+    EUnder _ _ under -> braceAnnotationName under /= Nothing
+    _               -> False
+
+braceAnnotationName :: Exp -> Maybe T.Text
+braceAnnotationName e =
+  case e of
+    ESymbol TOver "\9182"  -> Just "overbrace"
+    ESymbol TOver "\9140"  -> Just "overbrace"
+    ESymbol TUnder "\9183" -> Just "underbrace"
+    ESymbol TUnder "\9141" -> Just "underbrace"
+    _                       -> Nothing
+
+underlineMarkerName :: Exp -> Maybe T.Text
+underlineMarkerName e =
+  case e of
+    ESymbol TUnder "_" -> Just "underline"
+    _                  -> Nothing
+
+renderBraceLabel :: DisplayType -> AlignContext -> Exp -> Maybe T.Text
+renderBraceLabel dt ctx e = do
+  rendered0 <- renderExpIn dt ctx e
+  let rendered = T.strip rendered0
+  pure $ if isQuotedText rendered || isAtomic e
+            then rendered
+            else "{" <> rendered <> "}"
+
+arrowScriptOpName :: Exp -> Maybe T.Text
+arrowScriptOpName e =
+  case e of
+    ESymbol _ "←" -> Just "leftarrow"
+    ESymbol _ "→" -> Just "toward"
+    ESymbol _ "↔" -> Just "leftrightarrow"
+    ESymbol _ "⇐" -> Just "dlarrow"
+    ESymbol _ "⇒" -> Just "drarrow"
+    ESymbol _ "⇔" -> Just "dlrarrow"
+    ESymbol _ "↦" -> Just "mapsto"
+    ESymbol _ "↑" -> Just "uparrow"
+    ESymbol _ "↓" -> Just "downarrow"
+    _             -> Nothing
+
+accentName :: Exp -> Maybe T.Text
+accentName e =
+  case e of
+    ESymbol Accent s -> accentFromChar s
+    ESymbol TOver s  -> overAccentFromChar s
+    ESymbol _ s      -> accentFromChar s
+    _                -> Nothing
+
+overAccentFromChar :: T.Text -> Maybe T.Text
+overAccentFromChar s =
+  case s of
+    "\772"  -> Just "overline"
+    "\8254" -> Just "overline"
+    "¯"     -> Just "overline"
+    _       -> accentFromChar s
+
+accentFromChar :: T.Text -> Maybe T.Text
+accentFromChar s =
+  case s of
+    "\775"  -> Just "dot"
+    "˙"     -> Just "dot"
+    "\776"  -> Just "ddot"
+    "¨"     -> Just "ddot"
+    "\770"  -> Just "hat"
+    "ˆ"     -> Just "hat"
+    "\780"  -> Just "check"
+    "ˇ"     -> Just "check"
+    "\771"  -> Just "tilde"
+    "˜"     -> Just "tilde"
+    "\772"  -> Just "bar"
+    "\8254" -> Just "bar"
+    "¯"     -> Just "bar"
+    "\8407" -> Just "vec"
+    "→"     -> Just "vec"
+    "\774"  -> Just "breve"
+    "˘"     -> Just "breve"
+    _       -> Nothing
+
+data DelimSide = DelimLeft | DelimRight | DelimMiddle
+
+delimToken :: DelimSide -> T.Text -> T.Text
+delimToken side raw =
+  case raw of
+    ""  -> "none"
+    "." -> "none"
+    "(" -> "("
+    ")" -> ")"
+    "[" -> "["
+    "]" -> "]"
+    "{" -> case side of
+      DelimLeft   -> "lbrace"
+      DelimRight  -> "rbrace"
+      DelimMiddle -> "{"
+    "}" -> case side of
+      DelimLeft   -> "lbrace"
+      DelimRight  -> "rbrace"
+      DelimMiddle -> "}"
+    "|" -> case side of
+      DelimLeft   -> "lline"
+      DelimRight  -> "rline"
+      DelimMiddle -> "mline"
+    "∣" -> case side of
+      DelimLeft   -> "lline"
+      DelimRight  -> "rline"
+      DelimMiddle -> "mline"
+    "∥" -> case side of
+      DelimLeft   -> "ldline"
+      DelimRight  -> "rdline"
+      DelimMiddle -> "mline"
+    "⟨" -> "langle"
+    "⟩" -> "rangle"
+    "⌊" -> "lfloor"
+    "⌋" -> "rfloor"
+    "⌈" -> "lceil"
+    "⌉" -> "rceil"
+    "⟦" -> "ldbracket"
+    "⟧" -> "rdbracket"
+    _   -> raw
+
+renderSymbol :: TeXSymbolType -> T.Text -> T.Text
+renderSymbol t s =
+  case s of
+    "∫" -> "int "
+    "∑" -> "sum "
+    "←" -> " leftarrow "
+    "→" -> " toward "
+    "↔" -> " leftrightarrow "
+    "⇐" -> " dlarrow "
+    "⇒" -> " drarrow "
+    "⇔" -> " dlrarrow "
+    "↑" -> " uparrow "
+    "↓" -> " downarrow "
+    "↦" -> " mapsto "
+    "\8230 " -> " dotslow "
+    "… " -> " dotslow "
+    "\8230" -> " dotslow "
+    "…" -> " dotslow "
+    "\8943" -> " dotsaxis "
+    "⋯" -> " dotsaxis "
+    "⋮" -> " dotsvert "
+    "⋱" -> " dotsdown "
+    "⋰" -> " dotsup "
+    "∈" -> " in "
+    "∉" -> " notin "
+    "∋" -> " owns "
+    "∩" -> " intersection "
+    "∪" -> " union "
+    "⊂" -> " subset "
+    "⊆" -> " subseteq "
+    "⊃" -> " supset "
+    "⊇" -> " supseteq "
+    "≤" -> " <= "
+    "≥" -> " >= "
+    "≠" -> " <> "
+    "≈" -> " approx "
+    "≡" -> " equiv "
+    "\8810" -> " ll "
+    "≪" -> " ll "
+    "\8811" -> " gg "
+    "≫" -> " gg "
+    "∝" -> " prop "
+    "∥" -> " parallel "
+    "⊥" -> " ortho "
+    "±" -> " plusminus "
+    "∓" -> " minusplus "
+    "×" -> " times "
+    "⋅" -> " cdot "
+    "·" -> " cdot "
+    "∘" -> " circ "
+    "/" -> " / "
+    "∂" -> "partial"
+    "∇" -> "nabla"
+    "∀" -> "forall"
+    "∃" -> "exists"
+    "¬" -> "neg"
+    "∧" -> "and"
+    "∨" -> "or"
+    "∞" -> "infinity"
+    "∅" -> "emptyset"
+    "+" -> " + "
+    "-" | t == Bin  -> " - "
+    "-"             -> "-"
+    "−" | t == Bin  -> " - "
+    "−"             -> "-"
+    "<" -> " < "
+    ">" -> " > "
+    "=" -> " = "
+    "," -> ", "
+    ";" -> "; "
+    ":" -> " : "
+    "!" -> " ! "
+    "'" -> "'"
+    "′" -> "'"
+    "″" -> "''"
+    "‴" -> "'''"
+    _   | isWordLiteralSymbol s -> quoteText s
+        | otherwise             -> s
+
+isWordLiteralSymbol :: T.Text -> Bool
+isWordLiteralSymbol s =
+  not (T.null s) && T.all isWordLiteralChar s
+
+isWordLiteralChar :: Char -> Bool
+isWordLiteralChar c =
+  (c >= 'A' && c <= 'Z') ||
+  (c >= 'a' && c <= 'z') ||
+  c == ' ' || c == '-'
+
+quoteText :: T.Text -> T.Text
+quoteText t = "\"" <> escapeQuotes t <> "\""
+
+escapeQuotes :: T.Text -> T.Text
+escapeQuotes = T.replace "\"" "\\\""
+
+isQuotedText :: T.Text -> Bool
+isQuotedText t =
+  T.length t >= 2 && T.head t == '"' && T.last t == '"'
+
+largeOpName :: Exp -> Maybe T.Text
+largeOpName e =
+  case e of
+    ESymbol Op "\8747" -> Just "int"
+    ESymbol Op "\8751" -> Just "iiint"
+    ESymbol Op "\8721" -> Just "sum"
+    ESymbol Op "\8719" -> Just "prod"
+    ESymbol Op "\8899" -> Just "oper ∪"
+    ESymbol Op "\8898" -> Just "oper ∩"
+    ESymbol Op "∫"     -> Just "int"
+    ESymbol Op "∭"     -> Just "iiint"
+    ESymbol Op "∑"     -> Just "sum"
+    ESymbol Op "∏"     -> Just "prod"
+    ESymbol Op "⋃"     -> Just "oper ∪"
+    ESymbol Op "⋂"     -> Just "oper ∩"
+    _                  -> Nothing
+
+limitOpName :: Exp -> Maybe T.Text
+limitOpName e =
+  case largeOpName e of
+    Just op -> Just op
+    Nothing ->
+      case e of
+        EMathOperator "lim"    -> Just "lim"
+        EMathOperator "liminf" -> Just "liminf"
+        EMathOperator "limsup" -> Just "limsup"
+        EMathOperator "min"    -> Nothing
+        EMathOperator "max"    -> Nothing
+        _                      -> Nothing
+
+centeredScriptOpName :: Exp -> Maybe T.Text
+centeredScriptOpName e =
+  case e of
+    EMathOperator "min" -> Just "func min"
+    EMathOperator "max" -> Just "func max"
+    EMathOperator "det" -> Just "func det"
+    EMathOperator "Pr"  -> Just "func Pr"
+    EMathOperator "gcd" -> Just "func gcd"
+    EMathOperator "lim" -> Nothing
+    EMathOperator "liminf" -> Nothing
+    EMathOperator "limsup" -> Nothing
+    EMathOperator t     -> Just (renderMathOperator t)
+    _                   -> Nothing
+renderTextAtom :: TextType -> T.Text -> T.Text
+renderTextAtom sty t =
+  case sty of
+    TextItalic    -> "ital " <> styleArg t
+    TextBold      -> "bold " <> styleArg (quoteText t)
+    TextMonospace -> "font fixed " <> quoteText t
+    TextSansSerif -> "font sans " <> quoteText t
+    _             -> quoteText t
diff --git a/src/Text/TeXMath/Writers/TeX.hs b/src/Text/TeXMath/Writers/TeX.hs
--- a/src/Text/TeXMath/Writers/TeX.hs
+++ b/src/Text/TeXMath/Writers/TeX.hs
@@ -37,7 +37,7 @@
 -- tr' x = trace (show x) x
 
 -- | Transforms an expression tree to equivalent LaTeX with the default
--- packages (amsmath and amssymb)
+-- packages (amsmath, amssymb, and cancel)
 writeTeX :: [Exp] -> T.Text
 writeTeX = writeTeXWith defaultEnv
 
@@ -262,6 +262,12 @@
         tell [ControlSeq "\\boxed"]
         tellGroup (writeExp e)
       else writeExp e
+writeExp (ECancel st e) = do
+  case st of
+    ForwardSlash -> tell [ControlSeq "\\cancel"]
+    BackSlash -> tell [ControlSeq "\\bcancel"]
+    XSlash -> tell [ControlSeq "\\xcancel"]
+  tellGroup (writeExp e)
 writeExp (EScaled size e)
   | case e of
          (ESymbol Open _)  -> True
diff --git a/src/Text/TeXMath/Writers/Typst.hs b/src/Text/TeXMath/Writers/Typst.hs
--- a/src/Text/TeXMath/Writers/Typst.hs
+++ b/src/Text/TeXMath/Writers/Typst.hs
@@ -25,7 +25,7 @@
 import qualified Data.Text as T
 import Text.TeXMath.Types
 import qualified Text.TeXMath.Shared as S
-import Typst.Symbols (typstSymbols)
+import qualified Typst.Symbols as TS
 import Data.Generics (everywhere, mkT)
 import Data.Text (Text)
 import Data.Char (isDigit, isAlpha, isAscii)
@@ -43,7 +43,11 @@
 writeExps = go . map writeExp
  where
    go (a : b : es)
-    | T.take 1 b == "'" -- avoid space before a prime #239
+    | Just (bstart, _) <- T.uncons b
+    , Just (astart, _) <- T.uncons a
+    , Just (_, aend) <- T.unsnoc a
+    , bstart == '\'' -- avoid space before a prime #239
+      || bstart == '|' || aend == '|' || bstart == '\\' || astart == '\\' -- #286
      = a <> go (b:es)
    go (a : as)
      = a <> if null as
@@ -74,12 +78,12 @@
     needsEscape '(' = True
     needsEscape ')' = True
     needsEscape '_' = True
-    needsEscape '*' = True
     needsEscape '^' = True
     needsEscape '"' = True
     needsEscape '/' = True
     needsEscape '\\' = True
     needsEscape ',' = True -- #242
+    needsEscape ';' = True -- #275
     needsEscape _ = False
 
 escInQuotes :: Text -> Text
@@ -142,11 +146,12 @@
 writeExp (ESuper b e1) = writeExpB b <>
   case S.toPrimes e1 of
     Just ps -> ps
-    _ -> "^" <> writeExpS e1
-writeExp (ESubsup b e1 e2) = writeExpB b <> "_" <> writeExpS e1 <>
-  case S.toPrimes e2 of
-    Just ps -> ps
-    _ -> "^" <> writeExpS e2
+    Nothing -> "^" <> writeExpS e1
+writeExp (ESubsup b e1 e2) =
+  writeExpB b <>
+    case S.toPrimes e2 of
+      Just ps -> ps <> "_" <> writeExpS e1
+      Nothing -> "_" <> writeExpS e1 <> "^" <> writeExpS e2
 writeExp (EOver _ (EOver _ b (ESymbol TOver "\9182")) e1) =
   "overbrace(" <> writeExp b <> ", " <> writeExp e1 <> ")"
 writeExp (EOver _ (EOver _ b (ESymbol TOver "\9140")) e1) =
@@ -226,6 +231,9 @@
        TextBoldFraktur -> "bold" <> inParens ("frak" <> inParens contents)
        TextSansSerifItalic -> "italic" <> inParens ("sans" <> inParens contents)
 writeExp (EBoxed e) = "#box(stroke: black, inset: 3pt, [$ " <> writeExp e <> " $])"
+writeExp (ECancel ForwardSlash e) = "cancel(" <> writeExp e <> ")"
+writeExp (ECancel BackSlash e) = "cancel(" <> writeExp e <> ", inverted: #true)"
+writeExp (ECancel XSlash e) = "cancel(" <> writeExp e <> ", cross: #true)"
 writeExp (EPhantom e) = "#hide[" <> writeExp e <> "]"
 writeExp (EScaled size e) =
   "#scale(x: " <> tshow (floor (100 * size) :: Int) <>
@@ -302,7 +310,10 @@
 typstSymbolMap :: M.Map Text Text
 typstSymbolMap = M.fromList $
   ("\776", "dot.double") -- see #231
-  : [(s,name) | (name, _, s) <- typstSymbols]
+  : [(s,name) | TS.Sym { TS.symName = name
+                       , TS.symText = s
+                       , TS.symDeprecation = Nothing
+                       } <- TS.typstSymbols]
 
 getAccentCommand :: Text -> Maybe Text
 getAccentCommand ac = do
diff --git a/test/reader/mml/menclose.test b/test/reader/mml/menclose.test
new file mode 100644
--- /dev/null
+++ b/test/reader/mml/menclose.test
@@ -0,0 +1,23 @@
+<<< mml
+<?xml version="1.0" encoding="UTF-8"?>
+
+<math xmlns="http://www.w3.org/1998/Math/MathML" display="block">  
+  <menclose notation="box">    
+    <mn>0</mn>
+  </menclose>
+  <menclose notation="updiagonalstrike">
+    <mn>1</mn>
+  </menclose>
+  <menclose notation="downdiagonalstrike">
+    <mn>2</mn>
+  </menclose>
+  <menclose notation="updiagonalstrike downdiagonalstrike">
+    <mn>3</mn>
+  </menclose> 
+</math>
+>>> native
+[ EBoxed (ENumber "0")
+, ECancel ForwardSlash (ENumber "1")
+, ECancel BackSlash (ENumber "2")
+, ECancel XSlash (ENumber "3")
+]
diff --git a/test/reader/omml/cancel.test b/test/reader/omml/cancel.test
new file mode 100644
--- /dev/null
+++ b/test/reader/omml/cancel.test
@@ -0,0 +1,86 @@
+<<< omml
+<?xml version="1.0" encoding="UTF-8"?>
+<m:oMathPara>
+  <m:oMath>
+    <m:borderBox>
+      <m:borderBoxPr>
+        <m:hideTop m:val="1" />
+        <m:hideBot m:val="1" />
+        <m:hideLeft m:val="1" />
+        <m:hideRight m:val="1" />
+        <m:strikeBLTR m:val="1" />
+      </m:borderBoxPr>
+      <m:e>
+        <m:r>
+          <m:t>abc</m:t>
+        </m:r>
+      </m:e>
+    </m:borderBox>
+    <m:r>
+      <m:t>d+</m:t>
+    </m:r>
+    <m:borderBox>
+      <m:borderBoxPr>
+        <m:hideTop m:val="1" />
+        <m:hideBot m:val="1" />
+        <m:hideLeft m:val="1" />
+        <m:hideRight m:val="1" />
+        <m:strikeTLBR m:val="1" />
+      </m:borderBoxPr>
+      <m:e>
+        <m:sSup>
+          <m:e>
+            <m:r>
+              <m:t>x</m:t>
+            </m:r>
+          </m:e>
+          <m:sup>
+            <m:r>
+              <m:t>2</m:t>
+            </m:r>
+          </m:sup>
+        </m:sSup>
+      </m:e>
+    </m:borderBox>
+    <m:r>
+      <m:t>=d+</m:t>
+    </m:r>
+    <m:borderBox>
+      <m:borderBoxPr>
+        <m:hideTop m:val="1" />
+        <m:hideBot m:val="1" />
+        <m:hideLeft m:val="1" />
+        <m:hideRight m:val="1" />
+        <m:strikeBLTR m:val="1" />
+        <m:strikeTLBR m:val="1" />
+      </m:borderBoxPr>
+      <m:e>
+        <m:sSup>
+          <m:e>
+            <m:r>
+              <m:t>x</m:t>
+            </m:r>
+          </m:e>
+          <m:sup>
+            <m:r>
+              <m:t>2</m:t>
+            </m:r>
+          </m:sup>
+        </m:sSup>
+      </m:e>
+    </m:borderBox>
+  </m:oMath>
+</m:oMathPara>
+
+>>> native
+[ ECancel
+    ForwardSlash
+    (EGrouped [ EIdentifier "a" , EIdentifier "b" , EIdentifier "c" ])
+, EIdentifier "d"
+, ESymbol Bin "+"
+, ECancel BackSlash (ESuper (EIdentifier "x") (ENumber "2"))
+, ESymbol Rel "="
+, EIdentifier "d"
+, ESymbol Bin "+"
+, ECancel XSlash (ESuper (EIdentifier "x") (ENumber "2"))
+]
diff --git a/test/reader/tex/cancel.test b/test/reader/tex/cancel.test
new file mode 100644
--- /dev/null
+++ b/test/reader/tex/cancel.test
@@ -0,0 +1,13 @@
+<<< tex
+\boxed{\cancel{x} + \bcancel{y} = \xcancel{z}}
+
+>>> native
+[ EBoxed
+    (EGrouped
+       [ ECancel ForwardSlash (EIdentifier "x")
+       , ESymbol Bin "+"
+       , ECancel BackSlash (EIdentifier "y")
+       , ESymbol Rel "="
+       , ECancel XSlash (EIdentifier "z")
+       ])
+]
diff --git a/test/reader/tex/macros.test b/test/reader/tex/macros.test
--- a/test/reader/tex/macros.test
+++ b/test/reader/tex/macros.test
@@ -9,9 +9,9 @@
 \theta%
 }
 % comment
-\newcommand{\aaa}{\b{2}}
+\newcommand{\aaa}{\bb{2}}
 \renewcommand{\phi}{\aaa}
-\newcommand{\b}[1]{#1}
+\newcommand{\bb}[1]{#1}
 
 \newenvironment{ary}
 {\begin{array}{cc}
diff --git a/test/regression/245b.test b/test/regression/245b.test
--- a/test/regression/245b.test
+++ b/test/regression/245b.test
@@ -102,9 +102,9 @@
 upright("^\\backprime") x^prime.rev\
 upright("^\\backdprime") x^prime.double.rev\
 upright("^\\backtrprime") x^prime.triple.rev\
-upright("^\\hyphenbullet") x^(⁃)\
-upright("^\\ast") x^(\*)\
+upright("^\\hyphenbullet") x^bullet.hyph\
+upright("^\\ast") x^(*)\
 upright("^\\vysmwhtcircle") x^compose\
 upright("^\\vysmblkcircle") x^circle.filled.small\
-upright("^\\llcorner") x^\⌞\
-upright("^\\ulcorner") x^\⌜\
+upright("^\\llcorner") x^corner.l.b\
+upright("^\\ulcorner") x^corner.l.t\
diff --git a/test/regression/273.test b/test/regression/273.test
new file mode 100644
--- /dev/null
+++ b/test/regression/273.test
@@ -0,0 +1,5 @@
+<<< tex
+a_i'
+>>> native
+[ ESubsup (EIdentifier "a") (EIdentifier "i") (ESymbol Pun "\8242")
+]
diff --git a/test/regression/275.test b/test/regression/275.test
new file mode 100644
--- /dev/null
+++ b/test/regression/275.test
@@ -0,0 +1,14 @@
+<<< native
+[ EDelimited
+    "{"
+    ""
+    [ Right
+        (EArray
+           [ AlignLeft , AlignLeft ]
+           [ [ [ EIdentifier "a" ] , [ ESymbol Pun ";" ] ]
+           , [ [ EIdentifier "b" ] , [ EIdentifier "c" ] ]
+           ])
+    ]
+]
+>>> typst
+cases(delim: "{", a & \;, b & c)
diff --git a/test/regression/276.test b/test/regression/276.test
new file mode 100644
--- /dev/null
+++ b/test/regression/276.test
@@ -0,0 +1,9 @@
+<<< tex
+x = y\text.x
+>>> native
+[ EIdentifier "x"
+, ESymbol Rel "="
+, EIdentifier "y"
+, EText TextNormal "."
+, EIdentifier "x"
+]
diff --git a/test/regression/277.test b/test/regression/277.test
new file mode 100644
--- /dev/null
+++ b/test/regression/277.test
@@ -0,0 +1,4 @@
+<<< tex
+\text{\:\;}
+>>> native
+[ ESpace (2 % 9) , ESpace (5 % 18) ]
diff --git a/test/regression/278.test b/test/regression/278.test
new file mode 100644
--- /dev/null
+++ b/test/regression/278.test
@@ -0,0 +1,4 @@
+<<< omml
+<m:oMath><m:r><w:ins w:id="2" w:author="Tron Su" w:date="2025-12-16T22:06:00Z" w16du:dateUtc="2025-12-16T14:06:00Z"><m:rPr><m:nor/></m:rPr><w:rPr><w:rFonts w:cs="Times New Roman"/><w:sz w:val="28"/></w:rPr><m:t>∆</m:t></w:ins></m:r><m:r><w:ins w:id="3" w:author="Tron Su" w:date="2025-12-16T22:06:00Z" w16du:dateUtc="2025-12-16T14:06:00Z"><w:rPr><w:rFonts w:ascii="Cambria Math" w:hAnsi="Cambria Math"/></w:rPr><m:t>F</m:t></w:ins></m:r><m:r><w:ins w:id="4" w:author="Tron Su" w:date="2025-12-16T22:06:00Z" w16du:dateUtc="2025-12-16T14:06:00Z"><m:rPr><m:sty m:val="p"/></m:rPr><w:rPr><w:rFonts w:ascii="Cambria Math" w:hAnsi="Cambria Math"/></w:rPr><m:t>/</m:t></w:ins></m:r><m:sSub><m:sSubPr><m:ctrlPr><w:ins w:id="5" w:author="Tron Su" w:date="2025-12-16T22:06:00Z" w16du:dateUtc="2025-12-16T14:06:00Z"><w:rPr><w:rFonts w:ascii="Cambria Math" w:hAnsi="Cambria Math"/></w:rPr></w:ins></m:ctrlPr></m:sSubPr><m:e><m:r><w:ins w:id="6" w:author="Tron Su" w:date="2025-12-16T22:06:00Z" w16du:dateUtc="2025-12-16T14:06:00Z"><w:rPr><w:rFonts w:ascii="Cambria Math" w:hAnsi="Cambria Math"/></w:rPr><m:t>F</m:t></w:ins></m:r></m:e><m:sub><m:r><w:ins w:id="7" w:author="Tron Su" w:date="2025-12-16T22:06:00Z" w16du:dateUtc="2025-12-16T14:06:00Z"><w:rPr><w:rFonts w:ascii="Cambria Math" w:hAnsi="Cambria Math"/></w:rPr><m:t>0</m:t></w:ins></m:r></m:sub></m:sSub></m:oMath>
+>>> tex
+\mathrm{\Delta}F/F_{0}
diff --git a/test/regression/280.test b/test/regression/280.test
new file mode 100644
--- /dev/null
+++ b/test/regression/280.test
@@ -0,0 +1,13 @@
+<<< tex
+\boldsymbol{\Gamma + b + \alpha}
+>>> mml
+<?xml version='1.0' ?>
+<math display="block" xmlns="http://www.w3.org/1998/Math/MathML">
+  <mrow>
+    <mi mathvariant="bold">𝚪</mi>
+    <mo mathvariant="bold">+</mo>
+    <mi mathvariant="bold-italic">𝒃</mi>
+    <mo mathvariant="bold">+</mo>
+    <mi mathvariant="bold-italic">𝜶</mi>
+  </mrow>
+</math>
diff --git a/test/regression/280b.test b/test/regression/280b.test
new file mode 100644
--- /dev/null
+++ b/test/regression/280b.test
@@ -0,0 +1,41 @@
+<<< tex
+\boldsymbol{\Gamma + b + \alpha}
+>>> omml
+<?xml version='1.0' ?>
+<m:oMathPara>
+  <m:oMathParaPr>
+    <m:jc m:val="center" />
+  </m:oMathParaPr>
+  <m:oMath>
+    <m:r>
+      <m:rPr>
+        <m:sty m:val="b" />
+      </m:rPr>
+      <m:t>Γ</m:t>
+    </m:r>
+    <m:r>
+      <m:rPr>
+        <m:sty m:val="b" />
+      </m:rPr>
+      <m:t>+</m:t>
+    </m:r>
+    <m:r>
+      <m:rPr>
+        <m:sty m:val="bi" />
+      </m:rPr>
+      <m:t>b</m:t>
+    </m:r>
+    <m:r>
+      <m:rPr>
+        <m:sty m:val="b" />
+      </m:rPr>
+      <m:t>+</m:t>
+    </m:r>
+    <m:r>
+      <m:rPr>
+        <m:sty m:val="bi" />
+      </m:rPr>
+      <m:t>α</m:t>
+    </m:r>
+  </m:oMath>
+</m:oMathPara>
diff --git a/test/roundtrip/cancel.native b/test/roundtrip/cancel.native
new file mode 100644
--- /dev/null
+++ b/test/roundtrip/cancel.native
@@ -0,0 +1,6 @@
+[ ECancel ForwardSlash (EIdentifier "x")
+, ESymbol Bin "+"
+, ECancel BackSlash (EIdentifier "y")
+, ESymbol Rel "="
+, ECancel XSlash (EIdentifier "z")
+]
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"
+  starmathWriterTests <- getFiles "test/writer/starmath"
   typstWriterTests <- getFiles "test/writer/typst"
   regressionTests <- getFiles "test/regression"
   roundtripTests <- getFiles "test/roundtrip"
@@ -63,6 +64,7 @@
              , testGroup "mml" $ map toGoldenTest mmlWriterTests
              , testGroup "omml" $ map toGoldenTest ommlWriterTests
              , testGroup "eqn" $ map toGoldenTest eqnWriterTests
+             , testGroup "starmath" $ map toGoldenTest starmathWriterTests
              , testGroup "typst" $ map toGoldenTest typstWriterTests
              ],
              testGroup "regression" $ map toGoldenTest regressionTests
@@ -148,6 +150,8 @@
           , ("tex", writeTeX)
           , ("omml", T.pack . ppTopElement . writeOMML DisplayBlock)
           , ("eqn", writeEqn DisplayBlock)
+          , ("starmath", writeStarMath DisplayBlock)
+          , ("starmath-inline", writeStarMath DisplayInline)
           , ("typst", writeTypst DisplayBlock)
           , ("native", T.pack . ppShow)
           , ("pandoc", maybe "" (T.pack . ppShow) . writePandoc DisplayBlock)
diff --git a/test/writer/eqn/cancel.test b/test/writer/eqn/cancel.test
new file mode 100644
--- /dev/null
+++ b/test/writer/eqn/cancel.test
@@ -0,0 +1,8 @@
+<<< native
+[ EBoxed (ENumber "0")
+, ECancel ForwardSlash (ENumber "1")
+, ECancel BackSlash (ENumber "2")
+, ECancel XSlash (ENumber "3")
+]
+>>> eqn
+0 1 2 3
diff --git a/test/writer/mml/00000_C0_Controls_and_Basic_Latin.test b/test/writer/mml/00000_C0_Controls_and_Basic_Latin.test
--- a/test/writer/mml/00000_C0_Controls_and_Basic_Latin.test
+++ b/test/writer/mml/00000_C0_Controls_and_Basic_Latin.test
@@ -224,7 +224,7 @@
         <mi>*</mi>
       </mtd>
       <mtd columnalign="center" style="text-align: center">
-        <mi></mi>
+        <mi mathvariant="normal"></mi>
       </mtd>
       <mtd columnalign="center" style="text-align: center">
         <mi>0</mi>
diff --git a/test/writer/mml/08.test b/test/writer/mml/08.test
--- a/test/writer/mml/08.test
+++ b/test/writer/mml/08.test
@@ -74,7 +74,7 @@
     </msup>
     <mo>,</mo>
     <mrow>
-      <mi>arg</mi>
+      <mi mathvariant="normal">arg</mi>
       <mo>&#8289;</mo>
     </mrow>
     <mrow>
@@ -88,7 +88,7 @@
     <mo>=</mo>
     <mi>n</mi>
     <mrow>
-      <mi>arg</mi>
+      <mi mathvariant="normal">arg</mi>
       <mo>&#8289;</mo>
     </mrow>
     <mrow>
diff --git a/test/writer/mml/09.test b/test/writer/mml/09.test
--- a/test/writer/mml/09.test
+++ b/test/writer/mml/09.test
@@ -19,7 +19,7 @@
 <math display="block" xmlns="http://www.w3.org/1998/Math/MathML">
   <mrow>
     <munder>
-      <mi>lim</mi>
+      <mi mathvariant="normal">lim</mi>
       <mrow>
         <mi>z</mi>
         <mo>→</mo>
diff --git a/test/writer/mml/10.test b/test/writer/mml/10.test
--- a/test/writer/mml/10.test
+++ b/test/writer/mml/10.test
@@ -77,7 +77,7 @@
     <mfrac>
       <mrow>
         <mrow>
-          <mi>sin</mi>
+          <mi mathvariant="normal">sin</mi>
           <mo>&#8289;</mo>
         </mrow>
         <mrow>
diff --git a/test/writer/mml/20.test b/test/writer/mml/20.test
--- a/test/writer/mml/20.test
+++ b/test/writer/mml/20.test
@@ -119,120 +119,120 @@
 <?xml version='1.0' ?>
 <math display="block" xmlns="http://www.w3.org/1998/Math/MathML">
   <mrow>
-    <mi>𝒜</mi>
-    <mi>ℬ</mi>
-    <mi>𝒞</mi>
-    <mi>𝒟</mi>
-    <mi>ℰ</mi>
-    <mi>ℱ</mi>
-    <mi>𝒢</mi>
-    <mi>ℋ</mi>
-    <mi>ℐ</mi>
-    <mi>𝒥</mi>
-    <mi>𝒦</mi>
-    <mi>ℒ</mi>
-    <mi>ℳ</mi>
-    <mi>𝒩</mi>
-    <mi>𝒪</mi>
-    <mi>𝒫</mi>
-    <mi>𝒬</mi>
-    <mi>ℛ</mi>
-    <mi>𝒮</mi>
-    <mi>𝒯</mi>
-    <mi>𝒰</mi>
-    <mi>𝒱</mi>
-    <mi>𝒲</mi>
-    <mi>𝒳</mi>
-    <mi>𝒴</mi>
-    <mi>𝒵</mi>
-    <mi>𝒶</mi>
-    <mi>𝒷</mi>
-    <mi>𝒸</mi>
-    <mi>𝒹</mi>
-    <mi>ℯ</mi>
-    <mi>𝒻</mi>
-    <mi>ℊ</mi>
-    <mi>𝒽</mi>
-    <mi>𝒾</mi>
-    <mi>𝒿</mi>
-    <mi>𝓀</mi>
-    <mi>𝓁</mi>
-    <mi>𝓂</mi>
-    <mi>𝓃</mi>
-    <mi>ℴ</mi>
-    <mi>𝓅</mi>
-    <mi>𝓆</mi>
-    <mi>𝓇</mi>
-    <mi>𝓈</mi>
-    <mi>𝓉</mi>
-    <mi>𝓊</mi>
-    <mi>𝓋</mi>
-    <mi>𝓌</mi>
-    <mi>𝓍</mi>
-    <mi>𝓎</mi>
-    <mi>𝓏</mi>
-    <mi>𝔸</mi>
-    <mi>𝔹</mi>
-    <mi>ℂ</mi>
-    <mi>𝔻</mi>
-    <mi>𝔼</mi>
-    <mi>𝔽</mi>
-    <mi>𝔾</mi>
-    <mi>ℍ</mi>
-    <mi>𝕀</mi>
-    <mi>𝕁</mi>
-    <mi>𝕂</mi>
-    <mi>𝕃</mi>
-    <mi>𝕄</mi>
-    <mi>ℕ</mi>
-    <mi>𝕆</mi>
-    <mi>ℙ</mi>
-    <mi>ℚ</mi>
-    <mi>ℝ</mi>
-    <mi>𝕊</mi>
-    <mi>𝕋</mi>
-    <mi>𝕌</mi>
-    <mi>𝕍</mi>
-    <mi>𝕎</mi>
-    <mi>𝕏</mi>
-    <mi>𝕐</mi>
-    <mi>ℤ</mi>
-    <mi>𝕒</mi>
-    <mi>𝕓</mi>
-    <mi>𝕔</mi>
-    <mi>𝕕</mi>
-    <mi>𝕖</mi>
-    <mi>𝕗</mi>
-    <mi>𝕘</mi>
-    <mi>𝕙</mi>
-    <mi>𝕚</mi>
-    <mi>𝕛</mi>
-    <mi>𝕜</mi>
-    <mi>𝕝</mi>
-    <mi>𝕞</mi>
-    <mi>𝕟</mi>
-    <mi>𝕠</mi>
-    <mi>𝕡</mi>
-    <mi>𝕢</mi>
-    <mi>𝕣</mi>
-    <mi>𝕤</mi>
-    <mi>𝕥</mi>
-    <mi>𝕦</mi>
-    <mi>𝕧</mi>
-    <mi>𝕨</mi>
-    <mi>𝕩</mi>
-    <mi>𝕪</mi>
-    <mi>𝕫</mi>
-    <mn>𝟘</mn>
-    <mn>𝟙</mn>
-    <mn>𝟚</mn>
-    <mn>𝟛</mn>
-    <mn>𝟜</mn>
-    <mn>𝟝</mn>
-    <mn>𝟞</mn>
-    <mn>𝟟</mn>
-    <mn>𝟠</mn>
-    <mn>𝟡</mn>
-    <mn>𝟘</mn>
+    <mi mathvariant="script">𝒜</mi>
+    <mi mathvariant="script">ℬ</mi>
+    <mi mathvariant="script">𝒞</mi>
+    <mi mathvariant="script">𝒟</mi>
+    <mi mathvariant="script">ℰ</mi>
+    <mi mathvariant="script">ℱ</mi>
+    <mi mathvariant="script">𝒢</mi>
+    <mi mathvariant="script">ℋ</mi>
+    <mi mathvariant="script">ℐ</mi>
+    <mi mathvariant="script">𝒥</mi>
+    <mi mathvariant="script">𝒦</mi>
+    <mi mathvariant="script">ℒ</mi>
+    <mi mathvariant="script">ℳ</mi>
+    <mi mathvariant="script">𝒩</mi>
+    <mi mathvariant="script">𝒪</mi>
+    <mi mathvariant="script">𝒫</mi>
+    <mi mathvariant="script">𝒬</mi>
+    <mi mathvariant="script">ℛ</mi>
+    <mi mathvariant="script">𝒮</mi>
+    <mi mathvariant="script">𝒯</mi>
+    <mi mathvariant="script">𝒰</mi>
+    <mi mathvariant="script">𝒱</mi>
+    <mi mathvariant="script">𝒲</mi>
+    <mi mathvariant="script">𝒳</mi>
+    <mi mathvariant="script">𝒴</mi>
+    <mi mathvariant="script">𝒵</mi>
+    <mi mathvariant="script">𝒶</mi>
+    <mi mathvariant="script">𝒷</mi>
+    <mi mathvariant="script">𝒸</mi>
+    <mi mathvariant="script">𝒹</mi>
+    <mi mathvariant="script">ℯ</mi>
+    <mi mathvariant="script">𝒻</mi>
+    <mi mathvariant="script">ℊ</mi>
+    <mi mathvariant="script">𝒽</mi>
+    <mi mathvariant="script">𝒾</mi>
+    <mi mathvariant="script">𝒿</mi>
+    <mi mathvariant="script">𝓀</mi>
+    <mi mathvariant="script">𝓁</mi>
+    <mi mathvariant="script">𝓂</mi>
+    <mi mathvariant="script">𝓃</mi>
+    <mi mathvariant="script">ℴ</mi>
+    <mi mathvariant="script">𝓅</mi>
+    <mi mathvariant="script">𝓆</mi>
+    <mi mathvariant="script">𝓇</mi>
+    <mi mathvariant="script">𝓈</mi>
+    <mi mathvariant="script">𝓉</mi>
+    <mi mathvariant="script">𝓊</mi>
+    <mi mathvariant="script">𝓋</mi>
+    <mi mathvariant="script">𝓌</mi>
+    <mi mathvariant="script">𝓍</mi>
+    <mi mathvariant="script">𝓎</mi>
+    <mi mathvariant="script">𝓏</mi>
+    <mi mathvariant="double-struck">𝔸</mi>
+    <mi mathvariant="double-struck">𝔹</mi>
+    <mi mathvariant="double-struck">ℂ</mi>
+    <mi mathvariant="double-struck">𝔻</mi>
+    <mi mathvariant="double-struck">𝔼</mi>
+    <mi mathvariant="double-struck">𝔽</mi>
+    <mi mathvariant="double-struck">𝔾</mi>
+    <mi mathvariant="double-struck">ℍ</mi>
+    <mi mathvariant="double-struck">𝕀</mi>
+    <mi mathvariant="double-struck">𝕁</mi>
+    <mi mathvariant="double-struck">𝕂</mi>
+    <mi mathvariant="double-struck">𝕃</mi>
+    <mi mathvariant="double-struck">𝕄</mi>
+    <mi mathvariant="double-struck">ℕ</mi>
+    <mi mathvariant="double-struck">𝕆</mi>
+    <mi mathvariant="double-struck">ℙ</mi>
+    <mi mathvariant="double-struck">ℚ</mi>
+    <mi mathvariant="double-struck">ℝ</mi>
+    <mi mathvariant="double-struck">𝕊</mi>
+    <mi mathvariant="double-struck">𝕋</mi>
+    <mi mathvariant="double-struck">𝕌</mi>
+    <mi mathvariant="double-struck">𝕍</mi>
+    <mi mathvariant="double-struck">𝕎</mi>
+    <mi mathvariant="double-struck">𝕏</mi>
+    <mi mathvariant="double-struck">𝕐</mi>
+    <mi mathvariant="double-struck">ℤ</mi>
+    <mi mathvariant="double-struck">𝕒</mi>
+    <mi mathvariant="double-struck">𝕓</mi>
+    <mi mathvariant="double-struck">𝕔</mi>
+    <mi mathvariant="double-struck">𝕕</mi>
+    <mi mathvariant="double-struck">𝕖</mi>
+    <mi mathvariant="double-struck">𝕗</mi>
+    <mi mathvariant="double-struck">𝕘</mi>
+    <mi mathvariant="double-struck">𝕙</mi>
+    <mi mathvariant="double-struck">𝕚</mi>
+    <mi mathvariant="double-struck">𝕛</mi>
+    <mi mathvariant="double-struck">𝕜</mi>
+    <mi mathvariant="double-struck">𝕝</mi>
+    <mi mathvariant="double-struck">𝕞</mi>
+    <mi mathvariant="double-struck">𝕟</mi>
+    <mi mathvariant="double-struck">𝕠</mi>
+    <mi mathvariant="double-struck">𝕡</mi>
+    <mi mathvariant="double-struck">𝕢</mi>
+    <mi mathvariant="double-struck">𝕣</mi>
+    <mi mathvariant="double-struck">𝕤</mi>
+    <mi mathvariant="double-struck">𝕥</mi>
+    <mi mathvariant="double-struck">𝕦</mi>
+    <mi mathvariant="double-struck">𝕧</mi>
+    <mi mathvariant="double-struck">𝕨</mi>
+    <mi mathvariant="double-struck">𝕩</mi>
+    <mi mathvariant="double-struck">𝕪</mi>
+    <mi mathvariant="double-struck">𝕫</mi>
+    <mn mathvariant="double-struck">𝟘</mn>
+    <mn mathvariant="double-struck">𝟙</mn>
+    <mn mathvariant="double-struck">𝟚</mn>
+    <mn mathvariant="double-struck">𝟛</mn>
+    <mn mathvariant="double-struck">𝟜</mn>
+    <mn mathvariant="double-struck">𝟝</mn>
+    <mn mathvariant="double-struck">𝟞</mn>
+    <mn mathvariant="double-struck">𝟟</mn>
+    <mn mathvariant="double-struck">𝟠</mn>
+    <mn mathvariant="double-struck">𝟡</mn>
+    <mn mathvariant="double-struck">𝟘</mn>
   </mrow>
 </math>
diff --git a/test/writer/mml/22.test b/test/writer/mml/22.test
--- a/test/writer/mml/22.test
+++ b/test/writer/mml/22.test
@@ -313,12 +313,12 @@
       </mtd>
       <mtd columnalign="left" style="text-align: left">
         <mrow>
-          <mi>𝐀</mi>
-          <mi>𝐁</mi>
-          <mi>𝐂</mi>
-          <mi>𝐚</mi>
-          <mi>𝐛</mi>
-          <mi>𝐜</mi>
+          <mi mathvariant="bold-italic">𝑨</mi>
+          <mi mathvariant="bold-italic">𝑩</mi>
+          <mi mathvariant="bold-italic">𝑪</mi>
+          <mi mathvariant="bold-italic">𝒂</mi>
+          <mi mathvariant="bold-italic">𝒃</mi>
+          <mi mathvariant="bold-italic">𝒄</mi>
         </mrow>
       </mtd>
     </mtr>
@@ -328,12 +328,12 @@
       </mtd>
       <mtd columnalign="left" style="text-align: left">
         <mrow>
-          <mi>𝐀</mi>
-          <mi>𝐁</mi>
-          <mi>𝐂</mi>
-          <mi>𝐚</mi>
-          <mi>𝐛</mi>
-          <mi>𝐜</mi>
+          <mi mathvariant="bold-italic">𝑨</mi>
+          <mi mathvariant="bold-italic">𝑩</mi>
+          <mi mathvariant="bold-italic">𝑪</mi>
+          <mi mathvariant="bold-italic">𝒂</mi>
+          <mi mathvariant="bold-italic">𝒃</mi>
+          <mi mathvariant="bold-italic">𝒄</mi>
         </mrow>
       </mtd>
     </mtr>
@@ -351,12 +351,12 @@
       </mtd>
       <mtd columnalign="left" style="text-align: left">
         <mrow>
-          <mi>𝐴</mi>
-          <mi>𝐵</mi>
-          <mi>𝐶</mi>
-          <mi>𝑎</mi>
-          <mi>𝑏</mi>
-          <mi>𝑐</mi>
+          <mi mathvariant="italic">𝐴</mi>
+          <mi mathvariant="italic">𝐵</mi>
+          <mi mathvariant="italic">𝐶</mi>
+          <mi mathvariant="italic">𝑎</mi>
+          <mi mathvariant="italic">𝑏</mi>
+          <mi mathvariant="italic">𝑐</mi>
         </mrow>
       </mtd>
     </mtr>
@@ -374,12 +374,12 @@
       </mtd>
       <mtd columnalign="left" style="text-align: left">
         <mrow>
-          <mi>𝙰</mi>
-          <mi>𝙱</mi>
-          <mi>𝙲</mi>
-          <mi>𝚊</mi>
-          <mi>𝚋</mi>
-          <mi>𝚌</mi>
+          <mi mathvariant="monospace">𝙰</mi>
+          <mi mathvariant="monospace">𝙱</mi>
+          <mi mathvariant="monospace">𝙲</mi>
+          <mi mathvariant="monospace">𝚊</mi>
+          <mi mathvariant="monospace">𝚋</mi>
+          <mi mathvariant="monospace">𝚌</mi>
         </mrow>
       </mtd>
     </mtr>
@@ -397,12 +397,12 @@
       </mtd>
       <mtd columnalign="left" style="text-align: left">
         <mrow>
-          <mi>𝖠</mi>
-          <mi>𝖡</mi>
-          <mi>𝖢</mi>
-          <mi>𝖺</mi>
-          <mi>𝖻</mi>
-          <mi>𝖼</mi>
+          <mi mathvariant="sans-serif">𝖠</mi>
+          <mi mathvariant="sans-serif">𝖡</mi>
+          <mi mathvariant="sans-serif">𝖢</mi>
+          <mi mathvariant="sans-serif">𝖺</mi>
+          <mi mathvariant="sans-serif">𝖻</mi>
+          <mi mathvariant="sans-serif">𝖼</mi>
         </mrow>
       </mtd>
     </mtr>
@@ -412,12 +412,12 @@
       </mtd>
       <mtd columnalign="left" style="text-align: left">
         <mrow>
-          <mi>𝖠</mi>
-          <mi>𝖡</mi>
-          <mi>𝖢</mi>
-          <mi>𝖺</mi>
-          <mi>𝖻</mi>
-          <mi>𝖼</mi>
+          <mi mathvariant="sans-serif">𝖠</mi>
+          <mi mathvariant="sans-serif">𝖡</mi>
+          <mi mathvariant="sans-serif">𝖢</mi>
+          <mi mathvariant="sans-serif">𝖺</mi>
+          <mi mathvariant="sans-serif">𝖻</mi>
+          <mi mathvariant="sans-serif">𝖼</mi>
         </mrow>
       </mtd>
     </mtr>
@@ -427,12 +427,12 @@
       </mtd>
       <mtd columnalign="left" style="text-align: left">
         <mrow>
-          <mi>𝔸</mi>
-          <mi>𝔹</mi>
-          <mi>ℂ</mi>
-          <mi>𝕒</mi>
-          <mi>𝕓</mi>
-          <mi>𝕔</mi>
+          <mi mathvariant="double-struck">𝔸</mi>
+          <mi mathvariant="double-struck">𝔹</mi>
+          <mi mathvariant="double-struck">ℂ</mi>
+          <mi mathvariant="double-struck">𝕒</mi>
+          <mi mathvariant="double-struck">𝕓</mi>
+          <mi mathvariant="double-struck">𝕔</mi>
         </mrow>
       </mtd>
     </mtr>
@@ -442,12 +442,12 @@
       </mtd>
       <mtd columnalign="left" style="text-align: left">
         <mrow>
-          <mi>𝒜</mi>
-          <mi>ℬ</mi>
-          <mi>𝒞</mi>
-          <mi>𝒶</mi>
-          <mi>𝒷</mi>
-          <mi>𝒸</mi>
+          <mi mathvariant="script">𝒜</mi>
+          <mi mathvariant="script">ℬ</mi>
+          <mi mathvariant="script">𝒞</mi>
+          <mi mathvariant="script">𝒶</mi>
+          <mi mathvariant="script">𝒷</mi>
+          <mi mathvariant="script">𝒸</mi>
         </mrow>
       </mtd>
     </mtr>
@@ -457,12 +457,12 @@
       </mtd>
       <mtd columnalign="left" style="text-align: left">
         <mrow>
-          <mi>𝒜</mi>
-          <mi>ℬ</mi>
-          <mi>𝒞</mi>
-          <mi>𝒶</mi>
-          <mi>𝒷</mi>
-          <mi>𝒸</mi>
+          <mi mathvariant="script">𝒜</mi>
+          <mi mathvariant="script">ℬ</mi>
+          <mi mathvariant="script">𝒞</mi>
+          <mi mathvariant="script">𝒶</mi>
+          <mi mathvariant="script">𝒷</mi>
+          <mi mathvariant="script">𝒸</mi>
         </mrow>
       </mtd>
     </mtr>
@@ -472,12 +472,12 @@
       </mtd>
       <mtd columnalign="left" style="text-align: left">
         <mrow>
-          <mi>𝔄</mi>
-          <mi>𝔅</mi>
-          <mi>ℭ</mi>
-          <mi>𝔞</mi>
-          <mi>𝔟</mi>
-          <mi>𝔠</mi>
+          <mi mathvariant="fraktur">𝔄</mi>
+          <mi mathvariant="fraktur">𝔅</mi>
+          <mi mathvariant="fraktur">ℭ</mi>
+          <mi mathvariant="fraktur">𝔞</mi>
+          <mi mathvariant="fraktur">𝔟</mi>
+          <mi mathvariant="fraktur">𝔠</mi>
         </mrow>
       </mtd>
     </mtr>
@@ -487,12 +487,12 @@
       </mtd>
       <mtd columnalign="left" style="text-align: left">
         <mrow>
-          <mi>𝑨</mi>
-          <mi>𝑩</mi>
-          <mi>𝑪</mi>
-          <mi>𝒂</mi>
-          <mi>𝒃</mi>
-          <mi>𝒄</mi>
+          <mi mathvariant="bold-italic">𝑨</mi>
+          <mi mathvariant="bold-italic">𝑩</mi>
+          <mi mathvariant="bold-italic">𝑪</mi>
+          <mi mathvariant="bold-italic">𝒂</mi>
+          <mi mathvariant="bold-italic">𝒃</mi>
+          <mi mathvariant="bold-italic">𝒄</mi>
         </mrow>
       </mtd>
     </mtr>
@@ -502,12 +502,12 @@
       </mtd>
       <mtd columnalign="left" style="text-align: left">
         <mrow>
-          <mi>𝗔</mi>
-          <mi>𝗕</mi>
-          <mi>𝗖</mi>
-          <mi>𝗮</mi>
-          <mi>𝗯</mi>
-          <mi>𝗰</mi>
+          <mi mathvariant="bold-sans-serif">𝗔</mi>
+          <mi mathvariant="bold-sans-serif">𝗕</mi>
+          <mi mathvariant="bold-sans-serif">𝗖</mi>
+          <mi mathvariant="bold-sans-serif">𝗮</mi>
+          <mi mathvariant="bold-sans-serif">𝗯</mi>
+          <mi mathvariant="bold-sans-serif">𝗰</mi>
         </mrow>
       </mtd>
     </mtr>
@@ -517,12 +517,12 @@
       </mtd>
       <mtd columnalign="left" style="text-align: left">
         <mrow>
-          <mi>𝘼</mi>
-          <mi>𝘽</mi>
-          <mi>𝘾</mi>
-          <mi>𝙖</mi>
-          <mi>𝙗</mi>
-          <mi>𝙘</mi>
+          <mi mathvariant="sans-serif-bold-italic">𝘼</mi>
+          <mi mathvariant="sans-serif-bold-italic">𝘽</mi>
+          <mi mathvariant="sans-serif-bold-italic">𝘾</mi>
+          <mi mathvariant="sans-serif-bold-italic">𝙖</mi>
+          <mi mathvariant="sans-serif-bold-italic">𝙗</mi>
+          <mi mathvariant="sans-serif-bold-italic">𝙘</mi>
         </mrow>
       </mtd>
     </mtr>
@@ -532,12 +532,12 @@
       </mtd>
       <mtd columnalign="left" style="text-align: left">
         <mrow>
-          <mi>𝓐</mi>
-          <mi>𝓑</mi>
-          <mi>𝓒</mi>
-          <mi>𝓪</mi>
-          <mi>𝓫</mi>
-          <mi>𝓬</mi>
+          <mi mathvariant="bold-script">𝓐</mi>
+          <mi mathvariant="bold-script">𝓑</mi>
+          <mi mathvariant="bold-script">𝓒</mi>
+          <mi mathvariant="bold-script">𝓪</mi>
+          <mi mathvariant="bold-script">𝓫</mi>
+          <mi mathvariant="bold-script">𝓬</mi>
         </mrow>
       </mtd>
     </mtr>
@@ -547,12 +547,12 @@
       </mtd>
       <mtd columnalign="left" style="text-align: left">
         <mrow>
-          <mi>𝕬</mi>
-          <mi>𝕭</mi>
-          <mi>𝕮</mi>
-          <mi>𝖆</mi>
-          <mi>𝖇</mi>
-          <mi>𝖈</mi>
+          <mi mathvariant="bold-fraktur">𝕬</mi>
+          <mi mathvariant="bold-fraktur">𝕭</mi>
+          <mi mathvariant="bold-fraktur">𝕮</mi>
+          <mi mathvariant="bold-fraktur">𝖆</mi>
+          <mi mathvariant="bold-fraktur">𝖇</mi>
+          <mi mathvariant="bold-fraktur">𝖈</mi>
         </mrow>
       </mtd>
     </mtr>
@@ -562,12 +562,12 @@
       </mtd>
       <mtd columnalign="left" style="text-align: left">
         <mrow>
-          <mi>𝓐</mi>
-          <mi>𝓑</mi>
-          <mi>𝓒</mi>
-          <mi>𝓪</mi>
-          <mi>𝓫</mi>
-          <mi>𝓬</mi>
+          <mi mathvariant="bold-script">𝓐</mi>
+          <mi mathvariant="bold-script">𝓑</mi>
+          <mi mathvariant="bold-script">𝓒</mi>
+          <mi mathvariant="bold-script">𝓪</mi>
+          <mi mathvariant="bold-script">𝓫</mi>
+          <mi mathvariant="bold-script">𝓬</mi>
         </mrow>
       </mtd>
     </mtr>
@@ -577,12 +577,12 @@
       </mtd>
       <mtd columnalign="left" style="text-align: left">
         <mrow>
-          <mi>𝘈</mi>
-          <mi>𝘉</mi>
-          <mi>𝘊</mi>
-          <mi>𝘢</mi>
-          <mi>𝘣</mi>
-          <mi>𝘤</mi>
+          <mi mathvariant="sans-serif-italic">𝘈</mi>
+          <mi mathvariant="sans-serif-italic">𝘉</mi>
+          <mi mathvariant="sans-serif-italic">𝘊</mi>
+          <mi mathvariant="sans-serif-italic">𝘢</mi>
+          <mi mathvariant="sans-serif-italic">𝘣</mi>
+          <mi mathvariant="sans-serif-italic">𝘤</mi>
         </mrow>
       </mtd>
     </mtr>
diff --git a/test/writer/mml/a.test b/test/writer/mml/a.test
--- a/test/writer/mml/a.test
+++ b/test/writer/mml/a.test
@@ -138,7 +138,7 @@
         <mtext mathvariant="normal">acE</mtext>
       </mtd>
       <mtd columnalign="center" style="text-align: center">
-        <mi>∾̳</mi>
+        <mi mathvariant="normal">∾̳</mi>
       </mtd>
     </mtr>
     <mtr>
diff --git a/test/writer/mml/b.test b/test/writer/mml/b.test
--- a/test/writer/mml/b.test
+++ b/test/writer/mml/b.test
@@ -577,7 +577,7 @@
         <mtext mathvariant="normal">bne</mtext>
       </mtd>
       <mtd columnalign="center" style="text-align: center">
-        <mi>=⃥</mi>
+        <mi mathvariant="normal">=⃥</mi>
       </mtd>
     </mtr>
     <mtr>
@@ -585,7 +585,7 @@
         <mtext mathvariant="normal">bnequiv</mtext>
       </mtd>
       <mtd columnalign="center" style="text-align: center">
-        <mi>≡⃥</mi>
+        <mi mathvariant="normal">≡⃥</mi>
       </mtd>
     </mtr>
     <mtr>
diff --git a/test/writer/mml/binomial_coefficient.test b/test/writer/mml/binomial_coefficient.test
--- a/test/writer/mml/binomial_coefficient.test
+++ b/test/writer/mml/binomial_coefficient.test
@@ -43,7 +43,7 @@
 <?xml version='1.0' ?>
 <math display="block" xmlns="http://www.w3.org/1998/Math/MathML">
   <mrow>
-    <mi>𝐂</mi>
+    <mi mathvariant="bold-italic">𝑪</mi>
     <mrow>
       <mo stretchy="true" form="prefix">(</mo>
       <mi>n</mi>
@@ -53,7 +53,7 @@
     </mrow>
     <mo>=</mo>
     <msubsup>
-      <mi>𝐂</mi>
+      <mi mathvariant="bold-italic">𝑪</mi>
       <mi>k</mi>
       <mi>n</mi>
     </msubsup>
@@ -63,7 +63,7 @@
       <mi>n</mi>
     </msub>
     <msub>
-      <mi>𝐂</mi>
+      <mi mathvariant="bold-italic">𝑪</mi>
       <mi>k</mi>
     </msub>
     <mo>=</mo>
diff --git a/test/writer/mml/c.test b/test/writer/mml/c.test
--- a/test/writer/mml/c.test
+++ b/test/writer/mml/c.test
@@ -237,7 +237,7 @@
         <mtext mathvariant="normal">caps</mtext>
       </mtd>
       <mtd columnalign="center" style="text-align: center">
-        <mi>∩︀</mi>
+        <mi mathvariant="normal">∩︀</mi>
       </mtd>
     </mtr>
     <mtr>
@@ -1037,7 +1037,7 @@
         <mtext mathvariant="normal">cups</mtext>
       </mtd>
       <mtd columnalign="center" style="text-align: center">
-        <mi>∪︀</mi>
+        <mi mathvariant="normal">∪︀</mi>
       </mtd>
     </mtr>
     <mtr>
diff --git a/test/writer/mml/complex3.test b/test/writer/mml/complex3.test
--- a/test/writer/mml/complex3.test
+++ b/test/writer/mml/complex3.test
@@ -7734,11 +7734,11 @@
             <mo>+</mo>
             <mrow>
               <mrow>
-                <mi>sin</mi>
+                <mi mathvariant="normal">sin</mi>
                 <mo>&#8289;</mo>
               </mrow>
               <mrow>
-                <mi>cos</mi>
+                <mi mathvariant="normal">cos</mi>
                 <mo>&#8289;</mo>
               </mrow>
               <mi>θ</mi>
@@ -7902,7 +7902,7 @@
         <mrow>
           <mrow>
             <munder>
-              <mi>lim</mi>
+              <mi mathvariant="normal">lim</mi>
               <mrow>
                 <mi>n</mi>
                 <mo>→</mo>
@@ -9135,7 +9135,7 @@
                       <mi>&#8290;</mi>
                       <mrow>
                         <mrow>
-                          <mi>sin</mi>
+                          <mi mathvariant="normal">sin</mi>
                           <mo>&#8289;</mo>
                         </mrow>
                         <mi>y</mi>
@@ -9193,7 +9193,7 @@
           <mo>=</mo>
           <mrow>
             <mrow>
-              <mi>sin</mi>
+              <mi mathvariant="normal">sin</mi>
               <mo>&#8289;</mo>
             </mrow>
             <mi>x</mi>
@@ -10385,7 +10385,7 @@
               <mi>&#8290;</mi>
               <mrow>
                 <mrow>
-                  <mi>cos</mi>
+                  <mi mathvariant="normal">cos</mi>
                   <mo>&#8289;</mo>
                 </mrow>
                 <mrow>
@@ -10437,7 +10437,7 @@
             <mi>&#8290;</mi>
             <mrow>
               <mrow>
-                <mi>tan</mi>
+                <mi mathvariant="normal">tan</mi>
                 <mo>&#8289;</mo>
               </mrow>
               <mrow>
@@ -11336,7 +11336,7 @@
                   </msub>
                   <mo>=</mo>
                   <mrow>
-                    <mi>𝒩</mi>
+                    <mi mathvariant="script">𝒩</mi>
                     <mo>&#8289;</mo>
                     <mrow>
                       <mo stretchy="false" form="prefix">(</mo>
@@ -11364,7 +11364,7 @@
             <mtd columnalign="center" style="text-align: center">
               <mrow>
                 <mrow>
-                  <mi>sin</mi>
+                  <mi mathvariant="normal">sin</mi>
                   <mo>&#8289;</mo>
                 </mrow>
                 <mi>θ</mi>
@@ -11375,7 +11375,7 @@
             <mtd columnalign="center" style="text-align: center">
               <mrow>
                 <mrow>
-                  <mi>cos</mi>
+                  <mi mathvariant="normal">cos</mi>
                   <mo>&#8289;</mo>
                 </mrow>
                 <mi>γ</mi>
@@ -11510,7 +11510,7 @@
         <mrow>
           <mrow>
             <mrow>
-              <mi>∇×</mi>
+              <mi mathvariant="normal">∇×</mi>
               <mo>&#8289;</mo>
             </mrow>
             <mi>F</mi>
@@ -11525,7 +11525,7 @@
       <mtd columnalign="center" style="text-align: center">
         <mrow>
           <mrow>
-            <mi>∇·</mi>
+            <mi mathvariant="normal">∇·</mi>
             <mo>&#8289;</mo>
           </mrow>
           <mi>F</mi>
@@ -11538,7 +11538,7 @@
         <mrow>
           <mrow>
             <mrow>
-              <mi>∇·∇</mi>
+              <mi mathvariant="normal">∇·∇</mi>
               <mo>&#8289;</mo>
             </mrow>
             <mi>F</mi>
@@ -11566,7 +11566,7 @@
         <mrow>
           <mrow>
             <mrow>
-              <mi>∇×</mi>
+              <mi mathvariant="normal">∇×</mi>
               <mo>&#8289;</mo>
             </mrow>
             <mrow>
@@ -11633,7 +11633,7 @@
         <mrow>
           <mrow>
             <mrow>
-              <mi>∇×</mi>
+              <mi mathvariant="normal">∇×</mi>
               <mo>&#8289;</mo>
             </mrow>
             <mrow>
@@ -11695,12 +11695,12 @@
       <mtd columnalign="center" style="text-align: center">
         <mrow>
           <mrow>
-            <mi>𝐚</mi>
+            <mi mathvariant="bold-italic">𝒂</mi>
             <mo>+</mo>
-            <mi>𝐛</mi>
+            <mi mathvariant="bold-italic">𝒃</mi>
           </mrow>
           <mo>=</mo>
-          <mi>𝐜</mi>
+          <mi mathvariant="bold-italic">𝒄</mi>
         </mrow>
       </mtd>
       <mtd columnalign="center" style="text-align: center" />
@@ -11726,7 +11726,7 @@
               <mo>&#8289;</mo>
               <mrow>
                 <mo stretchy="false" form="prefix">(</mo>
-                <mi>𝐱</mi>
+                <mi mathvariant="bold-italic">𝒙</mi>
                 <mo stretchy="false" form="postfix">)</mo>
               </mrow>
             </mrow>
@@ -11743,21 +11743,21 @@
       <mtd columnalign="center" style="text-align: center">
         <mrow>
           <mrow>
-            <mi>𝑇</mi>
+            <mi mathvariant="italic">𝑇</mi>
             <mi>&#8290;</mi>
-            <mi>ℎ</mi>
+            <mi mathvariant="italic">ℎ</mi>
             <mi>&#8290;</mi>
-            <mi>𝑒</mi>
+            <mi mathvariant="italic">𝑒</mi>
             <mi>&#8290;</mi>
-            <mi>𝑞</mi>
+            <mi mathvariant="italic">𝑞</mi>
             <mi>&#8290;</mi>
-            <mi>𝑢</mi>
+            <mi mathvariant="italic">𝑢</mi>
             <mi>&#8290;</mi>
-            <mi>𝑖</mi>
+            <mi mathvariant="italic">𝑖</mi>
             <mi>&#8290;</mi>
-            <mi>𝑐</mi>
+            <mi mathvariant="italic">𝑐</mi>
             <mi>&#8290;</mi>
-            <mi>𝑘</mi>
+            <mi mathvariant="italic">𝑘</mi>
             <mi>&#8290;</mi>
             <mi>b</mi>
             <mi>&#8290;</mi>
@@ -11785,13 +11785,13 @@
             <mi>&#8290;</mi>
             <mi>s</mi>
             <mi>&#8290;</mi>
-            <mi>𝐨</mi>
+            <mi mathvariant="bold-italic">𝒐</mi>
             <mi>&#8290;</mi>
-            <mi>𝐯</mi>
+            <mi mathvariant="bold-italic">𝒗</mi>
             <mi>&#8290;</mi>
-            <mi>𝐞</mi>
+            <mi mathvariant="bold-italic">𝒆</mi>
             <mi>&#8290;</mi>
-            <mi>𝐫</mi>
+            <mi mathvariant="bold-italic">𝒓</mi>
             <mi>&#8290;</mi>
             <mi>t</mi>
             <mi>&#8290;</mi>
@@ -11799,19 +11799,19 @@
             <mi>&#8290;</mi>
             <mi>e</mi>
             <mi>&#8290;</mi>
-            <mi>𝗅</mi>
+            <mi mathvariant="sans-serif">𝗅</mi>
             <mi>&#8290;</mi>
-            <mi>𝖺</mi>
+            <mi mathvariant="sans-serif">𝖺</mi>
             <mi>&#8290;</mi>
-            <mi>𝗓</mi>
+            <mi mathvariant="sans-serif">𝗓</mi>
             <mi>&#8290;</mi>
-            <mi>𝗒</mi>
+            <mi mathvariant="sans-serif">𝗒</mi>
             <mi>&#8290;</mi>
-            <mi>𝚍</mi>
+            <mi mathvariant="monospace">𝚍</mi>
             <mi>&#8290;</mi>
-            <mi>𝚘</mi>
+            <mi mathvariant="monospace">𝚘</mi>
             <mi>&#8290;</mi>
-            <mi>𝚐</mi>
+            <mi mathvariant="monospace">𝚐</mi>
           </mrow>
           <mtext mathvariant="normal">.</mtext>
           <mrow>
@@ -12085,7 +12085,7 @@
                     </mrow>
                   </mrow>
                   <mo>⋅</mo>
-                  <mi>𝐮</mi>
+                  <mi mathvariant="bold-italic">𝒖</mi>
                 </mrow>
               </mrow>
             </mtd>
@@ -12224,7 +12224,7 @@
                   <mo stretchy="true" form="prefix">(</mo>
                   <mrow>
                     <mrow>
-                      <mi>arccos</mi>
+                      <mi mathvariant="normal">arccos</mi>
                       <mo>&#8289;</mo>
                     </mrow>
                     <mrow>
@@ -12277,7 +12277,7 @@
                   <mo stretchy="true" form="prefix">(</mo>
                   <mrow>
                     <mrow>
-                      <mi>arccos</mi>
+                      <mi mathvariant="normal">arccos</mi>
                       <mo>&#8289;</mo>
                     </mrow>
                     <mrow>
@@ -12351,7 +12351,7 @@
         <mrow>
           <mrow>
             <mrow>
-              <mi>det</mi>
+              <mi mathvariant="normal">det</mi>
               <mo>&#8289;</mo>
             </mrow>
             <mrow>
@@ -12462,7 +12462,7 @@
                   <mtd columnalign="center" style="text-align: center">
                     <mrow>
                       <mrow>
-                        <mi>cos</mi>
+                        <mi mathvariant="normal">cos</mi>
                         <mo>&#8289;</mo>
                       </mrow>
                       <mi>θ</mi>
@@ -12473,7 +12473,7 @@
                       <mo>−</mo>
                       <mrow>
                         <mrow>
-                          <mi>sin</mi>
+                          <mi mathvariant="normal">sin</mi>
                           <mo>&#8289;</mo>
                         </mrow>
                         <mi>θ</mi>
@@ -12485,7 +12485,7 @@
                   <mtd columnalign="center" style="text-align: center">
                     <mrow>
                       <mrow>
-                        <mi>sin</mi>
+                        <mi mathvariant="normal">sin</mi>
                         <mo>&#8289;</mo>
                       </mrow>
                       <mi>θ</mi>
@@ -12494,7 +12494,7 @@
                   <mtd columnalign="center" style="text-align: center">
                     <mrow>
                       <mrow>
-                        <mi>cos</mi>
+                        <mi mathvariant="normal">cos</mi>
                         <mo>&#8289;</mo>
                       </mrow>
                       <mi>θ</mi>
@@ -12512,7 +12512,7 @@
                   <mtd columnalign="center" style="text-align: center">
                     <mrow>
                       <mrow>
-                        <mi>cos</mi>
+                        <mi mathvariant="normal">cos</mi>
                         <mo>&#8289;</mo>
                       </mrow>
                       <mi>θ</mi>
@@ -12521,7 +12521,7 @@
                   <mtd columnalign="center" style="text-align: center">
                     <mrow>
                       <mrow>
-                        <mi>sin</mi>
+                        <mi mathvariant="normal">sin</mi>
                         <mo>&#8289;</mo>
                       </mrow>
                       <mi>θ</mi>
@@ -12534,7 +12534,7 @@
                       <mo>−</mo>
                       <mrow>
                         <mrow>
-                          <mi>sin</mi>
+                          <mi mathvariant="normal">sin</mi>
                           <mo>&#8289;</mo>
                         </mrow>
                         <mi>θ</mi>
@@ -12544,7 +12544,7 @@
                   <mtd columnalign="center" style="text-align: center">
                     <mrow>
                       <mrow>
-                        <mi>cos</mi>
+                        <mi mathvariant="normal">cos</mi>
                         <mo>&#8289;</mo>
                       </mrow>
                       <mi>θ</mi>
@@ -12694,7 +12694,7 @@
         <mrow>
           <mrow>
             <mrow>
-              <mi>det</mi>
+              <mi mathvariant="normal">det</mi>
               <mo>&#8289;</mo>
             </mrow>
             <mrow>
@@ -12853,7 +12853,7 @@
           <mo>=</mo>
           <mrow>
             <munder>
-              <mi>max</mi>
+              <mi mathvariant="normal">max</mi>
               <mrow>
                 <mi>x</mi>
                 <mo>≠</mo>
@@ -13216,7 +13216,7 @@
           <mo>=</mo>
           <mrow>
             <munder>
-              <mi>lim</mi>
+              <mi mathvariant="normal">lim</mi>
               <mrow>
                 <mi>x</mi>
                 <mo>=</mo>
@@ -13265,7 +13265,7 @@
           <mo>=</mo>
           <mrow>
             <munder>
-              <mi>lim</mi>
+              <mi mathvariant="normal">lim</mi>
               <mrow>
                 <mrow>
                   <mo>∥</mo>
@@ -13346,7 +13346,7 @@
           <mo>=</mo>
           <mrow>
             <munder>
-              <mi>lim</mi>
+              <mi mathvariant="normal">lim</mi>
               <mrow>
                 <mi>n</mi>
                 <mo>→</mo>
@@ -13652,7 +13652,7 @@
         <mrow>
           <mrow>
             <munder>
-              <mi>lim</mi>
+              <mi mathvariant="normal">lim</mi>
               <mrow>
                 <mi>x</mi>
                 <mo>→</mo>
@@ -13661,7 +13661,7 @@
             </munder>
             <mrow>
               <mrow>
-                <mi>sin</mi>
+                <mi mathvariant="normal">sin</mi>
                 <mo>&#8289;</mo>
               </mrow>
               <mrow>
@@ -13875,7 +13875,7 @@
               <mo stretchy="true" form="prefix">(</mo>
               <mrow>
                 <mrow>
-                  <mi>max</mi>
+                  <mi mathvariant="normal">max</mi>
                   <mo>&#8289;</mo>
                 </mrow>
                 <mrow>
@@ -14030,7 +14030,7 @@
         <mrow>
           <mrow>
             <munder>
-              <mi>lim</mi>
+              <mi mathvariant="normal">lim</mi>
               <mrow>
                 <mi>a</mi>
                 <mo>→</mo>
@@ -14043,7 +14043,7 @@
             <mrow>
               <msub>
                 <mrow>
-                  <mi>log</mi>
+                  <mi mathvariant="normal">log</mi>
                   <mo>&#8289;</mo>
                 </mrow>
                 <mi>a</mi>
@@ -14096,7 +14096,7 @@
           <mo>=</mo>
           <mrow>
             <munder>
-              <mi>lim</mi>
+              <mi mathvariant="normal">lim</mi>
               <mrow>
                 <mi>a</mi>
                 <mo>→</mo>
@@ -14109,7 +14109,7 @@
             <mrow>
               <msub>
                 <mrow>
-                  <mi>log</mi>
+                  <mi mathvariant="normal">log</mi>
                   <mo>&#8289;</mo>
                 </mrow>
                 <mi>a</mi>
@@ -14184,7 +14184,7 @@
           <mo>=</mo>
           <mrow>
             <mrow>
-              <mi>exp</mi>
+              <mi mathvariant="normal">exp</mi>
               <mo>&#8289;</mo>
             </mrow>
             <mrow>
@@ -14249,12 +14249,12 @@
         <mrow>
           <mrow>
             <mrow>
-              <mi>Aut</mi>
+              <mi mathvariant="normal">Aut</mi>
               <mo>&#8289;</mo>
             </mrow>
             <mrow>
               <mo stretchy="false" form="prefix">(</mo>
-              <mi>𝐈</mi>
+              <mi mathvariant="bold-italic">𝑰</mi>
               <mo stretchy="false" form="postfix">)</mo>
             </mrow>
           </mrow>
@@ -14365,7 +14365,7 @@
           <mrow>
             <mrow>
               <mrow>
-                <mi>tan</mi>
+                <mi mathvariant="normal">tan</mi>
                 <mo>&#8289;</mo>
               </mrow>
               <mi>θ</mi>
@@ -14414,7 +14414,7 @@
                   <mo>+</mo>
                   <mrow>
                     <mrow>
-                      <mi>sin</mi>
+                      <mi mathvariant="normal">sin</mi>
                       <mo>&#8289;</mo>
                     </mrow>
                     <mi>t</mi>
@@ -14427,7 +14427,7 @@
               <mi>&#8290;</mi>
               <mrow>
                 <mrow>
-                  <mi>cos</mi>
+                  <mi mathvariant="normal">cos</mi>
                   <mo>&#8289;</mo>
                 </mrow>
                 <mi>t</mi>
@@ -14442,7 +14442,7 @@
                   <mo>+</mo>
                   <mrow>
                     <mrow>
-                      <mi>cos</mi>
+                      <mi mathvariant="normal">cos</mi>
                       <mo>&#8289;</mo>
                     </mrow>
                     <mi>t</mi>
@@ -14455,7 +14455,7 @@
               <mi>&#8290;</mi>
               <mrow>
                 <mrow>
-                  <mi>sin</mi>
+                  <mi mathvariant="normal">sin</mi>
                   <mo>&#8289;</mo>
                 </mrow>
                 <mi>t</mi>
@@ -14467,7 +14467,7 @@
               <mi>&#8290;</mi>
               <mrow>
                 <mrow>
-                  <mi>sin</mi>
+                  <mi mathvariant="normal">sin</mi>
                   <mo>&#8289;</mo>
                 </mrow>
                 <mrow>
@@ -15055,7 +15055,7 @@
       <mtd columnalign="center" style="text-align: center">
         <mrow>
           <mrow>
-            <mi>mod</mi>
+            <mi mathvariant="normal">mod</mi>
             <mo>&#8289;</mo>
           </mrow>
           <mi>a</mi>
@@ -15069,7 +15069,7 @@
           <mrow>
             <mn>5</mn>
             <mrow>
-              <mi>mod</mi>
+              <mi mathvariant="normal">mod</mi>
               <mo>&#8289;</mo>
             </mrow>
             <mn>3</mn>
@@ -15094,7 +15094,7 @@
               </mrow>
             </mrow>
             <mrow>
-              <mi>mod</mi>
+              <mi mathvariant="normal">mod</mi>
               <mo>&#8289;</mo>
             </mrow>
             <mn>3</mn>
@@ -15126,7 +15126,7 @@
             <mo stretchy="true" form="prefix">(</mo>
             <mrow>
               <mrow>
-                <mi>mod</mi>
+                <mi mathvariant="normal">mod</mi>
                 <mo>&#8289;</mo>
               </mrow>
               <mn>13</mn>
@@ -15157,7 +15157,7 @@
               <mn>5</mn>
             </mrow>
             <mrow>
-              <mi>mod</mi>
+              <mi mathvariant="normal">mod</mi>
               <mo>&#8289;</mo>
             </mrow>
             <mn>7</mn>
@@ -15207,7 +15207,7 @@
               </mrow>
             </mrow>
             <mrow>
-              <mi>mod</mi>
+              <mi mathvariant="normal">mod</mi>
               <mo>&#8289;</mo>
             </mrow>
             <mn>3</mn>
@@ -15375,7 +15375,7 @@
         <mrow>
           <mrow>
             <mrow>
-              <mi>Pr</mi>
+              <mi mathvariant="normal">Pr</mi>
               <mo>&#8289;</mo>
             </mrow>
             <mrow>
@@ -15420,7 +15420,7 @@
             <mo>=</mo>
             <mrow>
               <mrow>
-                <mi>max</mi>
+                <mi mathvariant="normal">max</mi>
                 <mo>&#8289;</mo>
               </mrow>
               <mrow>
@@ -15483,7 +15483,7 @@
           <mo>=</mo>
           <mrow>
             <munder>
-              <mi>lim</mi>
+              <mi mathvariant="normal">lim</mi>
               <mrow>
                 <mi>x</mi>
                 <mover>
@@ -16379,7 +16379,7 @@
                 <mi>&#8290;</mi>
                 <mrow>
                   <mrow>
-                    <mi>cos</mi>
+                    <mi mathvariant="normal">cos</mi>
                     <mo>&#8289;</mo>
                   </mrow>
                   <mi>x</mi>
@@ -16404,7 +16404,7 @@
                       <mrow>
                         <msup>
                           <mrow>
-                            <mi>cos</mi>
+                            <mi mathvariant="normal">cos</mi>
                             <mo>&#8289;</mo>
                           </mrow>
                           <mn>2</mn>
@@ -16419,7 +16419,7 @@
                         <mn>60</mn>
                         <mrow>
                           <mrow>
-                            <mi>cos</mi>
+                            <mi mathvariant="normal">cos</mi>
                             <mo>&#8289;</mo>
                           </mrow>
                           <mi>x</mi>
@@ -16428,7 +16428,7 @@
                       <mi>&#8290;</mi>
                       <mrow>
                         <mrow>
-                          <mi>sin</mi>
+                          <mi mathvariant="normal">sin</mi>
                           <mo>&#8289;</mo>
                         </mrow>
                         <mrow>
@@ -16468,7 +16468,7 @@
               <mrow>
                 <mrow>
                   <mrow>
-                    <mi>cos</mi>
+                    <mi mathvariant="normal">cos</mi>
                     <mo>&#8289;</mo>
                   </mrow>
                   <mrow>
@@ -16484,7 +16484,7 @@
                 <mi>&#8290;</mi>
                 <mrow>
                   <mrow>
-                    <mi>sin</mi>
+                    <mi mathvariant="normal">sin</mi>
                     <mo>&#8289;</mo>
                   </mrow>
                   <mrow>
@@ -16511,7 +16511,7 @@
                   <mo>−</mo>
                   <mrow>
                     <mrow>
-                      <mi>cos</mi>
+                      <mi mathvariant="normal">cos</mi>
                       <mo>&#8289;</mo>
                     </mrow>
                     <mrow>
@@ -16549,7 +16549,7 @@
                   <mo>−</mo>
                   <mrow>
                     <mrow>
-                      <mi>cos</mi>
+                      <mi mathvariant="normal">cos</mi>
                       <mo>&#8289;</mo>
                     </mrow>
                     <mrow>
@@ -16609,7 +16609,7 @@
         <mrow>
           <mrow>
             <munder>
-              <mi>max</mi>
+              <mi mathvariant="normal">max</mi>
               <mrow>
                 <mrow>
                   <mo>−</mo>
@@ -16710,7 +16710,7 @@
               </msup>
               <mrow>
                 <mrow>
-                  <mi>sin</mi>
+                  <mi mathvariant="normal">sin</mi>
                   <mo>&#8289;</mo>
                 </mrow>
                 <mi>x</mi>
@@ -16810,7 +16810,7 @@
                 <mi>&#8290;</mi>
                 <mrow>
                   <mrow>
-                    <mi>cos</mi>
+                    <mi mathvariant="normal">cos</mi>
                     <mo>&#8289;</mo>
                   </mrow>
                   <mi>x</mi>
@@ -16835,7 +16835,7 @@
                       <mrow>
                         <msup>
                           <mrow>
-                            <mi>cos</mi>
+                            <mi mathvariant="normal">cos</mi>
                             <mo>&#8289;</mo>
                           </mrow>
                           <mn>2</mn>
@@ -16850,7 +16850,7 @@
                         <mn>60</mn>
                         <mrow>
                           <mrow>
-                            <mi>cos</mi>
+                            <mi mathvariant="normal">cos</mi>
                             <mo>&#8289;</mo>
                           </mrow>
                           <mi>x</mi>
@@ -16859,7 +16859,7 @@
                       <mi>&#8290;</mi>
                       <mrow>
                         <mrow>
-                          <mi>sin</mi>
+                          <mi mathvariant="normal">sin</mi>
                           <mo>&#8289;</mo>
                         </mrow>
                         <mrow>
@@ -16898,7 +16898,7 @@
             <msub>
               <mrow />
               <msup>
-                <mi>𝐑</mi>
+                <mi mathvariant="bold-italic">𝑹</mi>
                 <mn>3</mn>
               </msup>
             </msub>
@@ -16976,15 +16976,15 @@
               <mo stretchy="true" form="prefix">(</mo>
               <mrow>
                 <mrow>
-                  <mi>∇×</mi>
+                  <mi mathvariant="normal">∇×</mi>
                   <mo>&#8289;</mo>
                 </mrow>
-                <mi>𝐅</mi>
+                <mi mathvariant="bold-italic">𝑭</mi>
               </mrow>
               <mo stretchy="true" form="postfix">)</mo>
             </mrow>
             <mo>⋅</mo>
-            <mi>𝐤</mi>
+            <mi mathvariant="bold-italic">𝒌</mi>
           </mrow>
           <mo>=</mo>
           <mrow>
@@ -17190,7 +17190,7 @@
                   <mtd columnalign="center" style="text-align: center">
                     <mrow>
                       <mrow>
-                        <mi>sin</mi>
+                        <mi mathvariant="normal">sin</mi>
                         <mo>&#8289;</mo>
                       </mrow>
                       <mi>θ</mi>
@@ -17393,7 +17393,7 @@
               <mtd columnalign="center" style="text-align: center">
                 <mrow>
                   <mrow>
-                    <mi>sin</mi>
+                    <mi mathvariant="normal">sin</mi>
                     <mo>&#8289;</mo>
                   </mrow>
                   <mi>θ</mi>
@@ -17503,7 +17503,7 @@
             <mrow>
               <msup>
                 <mrow>
-                  <mi>sin</mi>
+                  <mi mathvariant="normal">sin</mi>
                   <mo>&#8289;</mo>
                 </mrow>
                 <mn>3</mn>
@@ -17518,7 +17518,7 @@
             <mrow>
               <mrow>
                 <mrow>
-                  <mi>sin</mi>
+                  <mi mathvariant="normal">sin</mi>
                   <mo>&#8289;</mo>
                 </mrow>
                 <msup>
@@ -17529,14 +17529,14 @@
               <mi>&#8290;</mi>
               <mrow>
                 <mrow>
-                  <mi>sin</mi>
+                  <mi mathvariant="normal">sin</mi>
                   <mo>&#8289;</mo>
                 </mrow>
                 <mrow>
                   <mo stretchy="true" form="prefix">(</mo>
                   <mrow>
                     <mrow>
-                      <mi>sin</mi>
+                      <mi mathvariant="normal">sin</mi>
                       <mo>&#8289;</mo>
                     </mrow>
                     <msup>
@@ -18343,7 +18343,7 @@
               <mrow>
                 <msup>
                   <mrow>
-                    <mi>csc</mi>
+                    <mi mathvariant="normal">csc</mi>
                     <mo>&#8289;</mo>
                   </mrow>
                   <mrow>
@@ -18393,7 +18393,7 @@
             <mrow>
               <msup>
                 <mrow>
-                  <mi>tanh</mi>
+                  <mi mathvariant="normal">tanh</mi>
                   <mo>&#8289;</mo>
                 </mrow>
                 <mrow>
@@ -18413,7 +18413,7 @@
               <mi>&#8290;</mi>
               <mrow>
                 <mrow>
-                  <mi>ln</mi>
+                  <mi mathvariant="normal">ln</mi>
                   <mo>&#8289;</mo>
                 </mrow>
                 <mrow>
@@ -18818,12 +18818,12 @@
         <mrow>
           <mi>x</mi>
           <mrow>
-            <mi>≰⃥</mi>
+            <mi mathvariant="normal">≰⃥</mi>
             <mo>&#8289;</mo>
           </mrow>
           <mi>y</mi>
           <mrow>
-            <mi>≰⃥</mi>
+            <mi mathvariant="normal">≰⃥</mi>
             <mo>&#8289;</mo>
           </mrow>
           <mi>z</mi>
@@ -18835,7 +18835,7 @@
       <mtd columnalign="center" style="text-align: center">
         <mrow>
           <mover>
-            <mi>lim</mi>
+            <mi mathvariant="normal">lim</mi>
             <mo accent="true">¯</mo>
           </mover>
           <mi>x</mi>
@@ -18847,7 +18847,7 @@
       <mtd columnalign="center" style="text-align: center">
         <mrow>
           <munder>
-            <mi>lim</mi>
+            <mi mathvariant="normal">lim</mi>
             <mo accent="true">̲</mo>
           </munder>
           <mi>x</mi>
@@ -18859,7 +18859,7 @@
       <mtd columnalign="center" style="text-align: center">
         <mrow>
           <munder>
-            <mi>lim</mi>
+            <mi mathvariant="normal">lim</mi>
             <mo accent="true">→</mo>
           </munder>
           <mi>x</mi>
@@ -18871,7 +18871,7 @@
       <mtd columnalign="center" style="text-align: center">
         <mrow>
           <munder>
-            <mi>lim</mi>
+            <mi mathvariant="normal">lim</mi>
             <mo accent="true">←</mo>
           </munder>
           <mi>x</mi>
@@ -19720,7 +19720,7 @@
           <mfrac>
             <mrow>
               <mrow>
-                <mi>sin</mi>
+                <mi mathvariant="normal">sin</mi>
                 <mo>&#8289;</mo>
               </mrow>
               <mi>θ</mi>
@@ -19739,7 +19739,7 @@
           <mfrac>
             <mrow>
               <mrow>
-                <mi>sin</mi>
+                <mi mathvariant="normal">sin</mi>
                 <mo>&#8289;</mo>
               </mrow>
               <mi>θ</mi>
@@ -19758,7 +19758,7 @@
           <mfrac>
             <mrow>
               <mrow>
-                <mi>sin</mi>
+                <mi mathvariant="normal">sin</mi>
                 <mo>&#8289;</mo>
               </mrow>
               <mi>θ</mi>
@@ -19777,7 +19777,7 @@
           <mfrac>
             <mrow>
               <mrow>
-                <mi>sin</mi>
+                <mi mathvariant="normal">sin</mi>
                 <mo>&#8289;</mo>
               </mrow>
               <mi>θ</mi>
@@ -19796,7 +19796,7 @@
           <mfrac>
             <mrow>
               <mrow>
-                <mi>sin</mi>
+                <mi mathvariant="normal">sin</mi>
                 <mo>&#8289;</mo>
               </mrow>
               <mi>θ</mi>
@@ -19815,7 +19815,7 @@
           <mfrac>
             <mrow>
               <mrow>
-                <mi>sin</mi>
+                <mi mathvariant="normal">sin</mi>
                 <mo>&#8289;</mo>
               </mrow>
               <mi>θ</mi>
@@ -19834,7 +19834,7 @@
           <mfrac>
             <mrow>
               <mrow>
-                <mi>sin</mi>
+                <mi mathvariant="normal">sin</mi>
                 <mo>&#8289;</mo>
               </mrow>
               <mi>θ</mi>
@@ -19853,7 +19853,7 @@
           <mfrac>
             <mrow>
               <mrow>
-                <mi>sin</mi>
+                <mi mathvariant="normal">sin</mi>
                 <mo>&#8289;</mo>
               </mrow>
               <mi>θ</mi>
@@ -19872,7 +19872,7 @@
           <mfrac>
             <mrow>
               <mrow>
-                <mi>sin</mi>
+                <mi mathvariant="normal">sin</mi>
                 <mo>&#8289;</mo>
               </mrow>
               <mi>θ</mi>
@@ -19889,7 +19889,7 @@
         <mfrac>
           <mrow>
             <mrow>
-              <mi>sin</mi>
+              <mi mathvariant="normal">sin</mi>
               <mo>&#8289;</mo>
             </mrow>
             <mi>θ</mi>
@@ -19904,7 +19904,7 @@
         <mfrac>
           <mrow>
             <mrow>
-              <mi>sin</mi>
+              <mi mathvariant="normal">sin</mi>
               <mo>&#8289;</mo>
             </mrow>
             <mi>θ</mi>
@@ -19919,7 +19919,7 @@
         <mfrac>
           <mrow>
             <mrow>
-              <mi>sin</mi>
+              <mi mathvariant="normal">sin</mi>
               <mo>&#8289;</mo>
             </mrow>
             <mi>θ</mi>
@@ -19934,7 +19934,7 @@
         <mfrac>
           <mrow>
             <mrow>
-              <mi>sin</mi>
+              <mi mathvariant="normal">sin</mi>
               <mo>&#8289;</mo>
             </mrow>
             <mi>θ</mi>
@@ -19949,7 +19949,7 @@
         <mfrac>
           <mrow>
             <mrow>
-              <mi>sin</mi>
+              <mi mathvariant="normal">sin</mi>
               <mo>&#8289;</mo>
             </mrow>
             <mi>θ</mi>
@@ -19964,7 +19964,7 @@
         <mfrac>
           <mrow>
             <mrow>
-              <mi>sin</mi>
+              <mi mathvariant="normal">sin</mi>
               <mo>&#8289;</mo>
             </mrow>
             <mi>θ</mi>
@@ -19979,7 +19979,7 @@
         <mfrac>
           <mrow>
             <mrow>
-              <mi>sin</mi>
+              <mi mathvariant="normal">sin</mi>
               <mo>&#8289;</mo>
             </mrow>
             <mi>θ</mi>
@@ -19994,7 +19994,7 @@
         <mfrac>
           <mrow>
             <mrow>
-              <mi>sin</mi>
+              <mi mathvariant="normal">sin</mi>
               <mo>&#8289;</mo>
             </mrow>
             <mi>θ</mi>
@@ -20009,7 +20009,7 @@
         <mfrac>
           <mrow>
             <mrow>
-              <mi>sin</mi>
+              <mi mathvariant="normal">sin</mi>
               <mo>&#8289;</mo>
             </mrow>
             <mi>θ</mi>
diff --git a/test/writer/mml/emptyContent1.test b/test/writer/mml/emptyContent1.test
--- a/test/writer/mml/emptyContent1.test
+++ b/test/writer/mml/emptyContent1.test
@@ -5,6 +5,6 @@
 <math display="block" xmlns="http://www.w3.org/1998/Math/MathML">
   <msub>
     <mn></mn>
-    <mi></mi>
+    <mi mathvariant="normal"></mi>
   </msub>
 </math>
diff --git a/test/writer/mml/f.test b/test/writer/mml/f.test
--- a/test/writer/mml/f.test
+++ b/test/writer/mml/f.test
@@ -157,7 +157,7 @@
         <mtext mathvariant="normal">fjlig</mtext>
       </mtd>
       <mtd columnalign="center" style="text-align: center">
-        <mi>fj</mi>
+        <mi mathvariant="normal">fj</mi>
       </mtd>
     </mtr>
     <mtr>
diff --git a/test/writer/mml/g.test b/test/writer/mml/g.test
--- a/test/writer/mml/g.test
+++ b/test/writer/mml/g.test
@@ -317,7 +317,7 @@
         <mtext mathvariant="normal">gesl</mtext>
       </mtd>
       <mtd columnalign="center" style="text-align: center">
-        <mi>⋛︀</mi>
+        <mi mathvariant="normal">⋛︀</mi>
       </mtd>
     </mtr>
     <mtr>
@@ -717,7 +717,7 @@
         <mtext mathvariant="normal">gvertneqq</mtext>
       </mtd>
       <mtd columnalign="center" style="text-align: center">
-        <mi>≩︀</mi>
+        <mi mathvariant="normal">≩︀</mi>
       </mtd>
     </mtr>
     <mtr>
@@ -725,7 +725,7 @@
         <mtext mathvariant="normal">gvnE</mtext>
       </mtd>
       <mtd columnalign="center" style="text-align: center">
-        <mi>≩︀</mi>
+        <mi mathvariant="normal">≩︀</mi>
       </mtd>
     </mtr>
   </mtable>
diff --git a/test/writer/mml/invChars.test b/test/writer/mml/invChars.test
--- a/test/writer/mml/invChars.test
+++ b/test/writer/mml/invChars.test
@@ -13,7 +13,7 @@
   <mrow>
     <mn></mn>
     <mrow>
-      <mi></mi>
+      <mi mathvariant="normal"></mi>
       <mo>&#8289;</mo>
     </mrow>
     <mi></mi>
diff --git a/test/writer/mml/l.test b/test/writer/mml/l.test
--- a/test/writer/mml/l.test
+++ b/test/writer/mml/l.test
@@ -548,7 +548,7 @@
         <mtext mathvariant="normal">lates</mtext>
       </mtd>
       <mtd columnalign="center" style="text-align: center">
-        <mi>⪭︀</mi>
+        <mi mathvariant="normal">⪭︀</mi>
       </mtd>
     </mtr>
     <mtr>
@@ -1116,7 +1116,7 @@
         <mtext mathvariant="normal">lesg</mtext>
       </mtd>
       <mtd columnalign="center" style="text-align: center">
-        <mi>⋚︀</mi>
+        <mi mathvariant="normal">⋚︀</mi>
       </mtd>
     </mtr>
     <mtr>
@@ -1964,7 +1964,7 @@
         <mtext mathvariant="normal">lvertneqq</mtext>
       </mtd>
       <mtd columnalign="center" style="text-align: center">
-        <mi>≨︀</mi>
+        <mi mathvariant="normal">≨︀</mi>
       </mtd>
     </mtr>
     <mtr>
@@ -1972,7 +1972,7 @@
         <mtext mathvariant="normal">lvnE</mtext>
       </mtd>
       <mtd columnalign="center" style="text-align: center">
-        <mi>≨︀</mi>
+        <mi mathvariant="normal">≨︀</mi>
       </mtd>
     </mtr>
   </mtable>
diff --git a/test/writer/mml/menclose.test b/test/writer/mml/menclose.test
new file mode 100644
--- /dev/null
+++ b/test/writer/mml/menclose.test
@@ -0,0 +1,25 @@
+<<< native
+[ EBoxed (ENumber "0")
+, ECancel ForwardSlash (ENumber "1")
+, ECancel BackSlash (ENumber "2")
+, ECancel XSlash (ENumber "3")
+]
+
+>>> mml
+<?xml version='1.0' ?>
+<math display="block" xmlns="http://www.w3.org/1998/Math/MathML">
+  <mrow>
+    <menclose notation="box">
+      <mn>0</mn>
+    </menclose>
+    <menclose notation="updiagonalstrike">
+      <mn>1</mn>
+    </menclose>
+    <menclose notation="downdiagonalstrike">
+      <mn>2</mn>
+    </menclose>
+    <menclose notation="updiagonalstrike downdiagonalstrike">
+      <mn>3</mn>
+    </menclose>
+  </mrow>
+</math>
diff --git a/test/writer/mml/mfencedAempty.test b/test/writer/mml/mfencedAempty.test
--- a/test/writer/mml/mfencedAempty.test
+++ b/test/writer/mml/mfencedAempty.test
@@ -10,6 +10,6 @@
       <mi>x</mi>
       <mi>y</mi>
     </mrow>
-    <mi></mi>
+    <mi mathvariant="normal"></mi>
   </mrow>
 </math>
diff --git a/test/writer/mml/mfracZcomp-01.test b/test/writer/mml/mfracZcomp-01.test
--- a/test/writer/mml/mfracZcomp-01.test
+++ b/test/writer/mml/mfracZcomp-01.test
@@ -16,7 +16,7 @@
     <mfrac>
       <mrow>
         <mrow>
-          <mi>sin</mi>
+          <mi mathvariant="normal">sin</mi>
           <mo>&#8289;</mo>
         </mrow>
         <mi>θ</mi>
diff --git a/test/writer/mml/mfracZcomp-02.test b/test/writer/mml/mfracZcomp-02.test
--- a/test/writer/mml/mfracZcomp-02.test
+++ b/test/writer/mml/mfracZcomp-02.test
@@ -16,7 +16,7 @@
     <mfrac>
       <mrow>
         <mrow>
-          <mi>ln</mi>
+          <mi mathvariant="normal">ln</mi>
           <mo>&#8289;</mo>
         </mrow>
         <mi>x</mi>
diff --git a/test/writer/mml/mfracZcomp-03.test b/test/writer/mml/mfracZcomp-03.test
--- a/test/writer/mml/mfracZcomp-03.test
+++ b/test/writer/mml/mfracZcomp-03.test
@@ -16,7 +16,7 @@
     <mfrac>
       <mrow>
         <mrow>
-          <mi>tan</mi>
+          <mi mathvariant="normal">tan</mi>
           <mo>&#8289;</mo>
         </mrow>
         <mi>θ</mi>
diff --git a/test/writer/mml/mfracZcomp-12.test b/test/writer/mml/mfracZcomp-12.test
--- a/test/writer/mml/mfracZcomp-12.test
+++ b/test/writer/mml/mfracZcomp-12.test
@@ -22,7 +22,7 @@
       <mfrac>
         <mrow>
           <mrow>
-            <mi>log</mi>
+            <mi mathvariant="normal">log</mi>
             <mo>&#8289;</mo>
           </mrow>
           <mi>x</mi>
diff --git a/test/writer/mml/mfracZcomp-13.test b/test/writer/mml/mfracZcomp-13.test
--- a/test/writer/mml/mfracZcomp-13.test
+++ b/test/writer/mml/mfracZcomp-13.test
@@ -22,7 +22,7 @@
       <mfrac>
         <mrow>
           <mrow>
-            <mi>sin</mi>
+            <mi mathvariant="normal">sin</mi>
             <mo>&#8289;</mo>
           </mrow>
           <mi>θ</mi>
diff --git a/test/writer/mml/mfracZcomp-14.test b/test/writer/mml/mfracZcomp-14.test
--- a/test/writer/mml/mfracZcomp-14.test
+++ b/test/writer/mml/mfracZcomp-14.test
@@ -24,7 +24,7 @@
       <mfrac>
         <mrow>
           <mrow>
-            <mi>sin</mi>
+            <mi mathvariant="normal">sin</mi>
             <mo>&#8289;</mo>
           </mrow>
           <mi>θ</mi>
diff --git a/test/writer/mml/mfracZcomp-15.test b/test/writer/mml/mfracZcomp-15.test
--- a/test/writer/mml/mfracZcomp-15.test
+++ b/test/writer/mml/mfracZcomp-15.test
@@ -24,7 +24,7 @@
       <mfrac>
         <mrow>
           <mrow>
-            <mi>sin</mi>
+            <mi mathvariant="normal">sin</mi>
             <mo>&#8289;</mo>
           </mrow>
           <mi>θ</mi>
diff --git a/test/writer/mml/mfracZcomp-16.test b/test/writer/mml/mfracZcomp-16.test
--- a/test/writer/mml/mfracZcomp-16.test
+++ b/test/writer/mml/mfracZcomp-16.test
@@ -22,7 +22,7 @@
       <mfrac>
         <mrow>
           <mrow>
-            <mi>sin</mi>
+            <mi mathvariant="normal">sin</mi>
             <mo>&#8289;</mo>
           </mrow>
           <mi>θ</mi>
diff --git a/test/writer/mml/mfracZcomp-17.test b/test/writer/mml/mfracZcomp-17.test
--- a/test/writer/mml/mfracZcomp-17.test
+++ b/test/writer/mml/mfracZcomp-17.test
@@ -22,7 +22,7 @@
       <mfrac>
         <mrow>
           <mrow>
-            <mi>sin</mi>
+            <mi mathvariant="normal">sin</mi>
             <mo>&#8289;</mo>
           </mrow>
           <mi>θ</mi>
diff --git a/test/writer/mml/mfracZcomp-18.test b/test/writer/mml/mfracZcomp-18.test
--- a/test/writer/mml/mfracZcomp-18.test
+++ b/test/writer/mml/mfracZcomp-18.test
@@ -25,7 +25,7 @@
       <mfrac>
         <mrow>
           <mrow>
-            <mi>sin</mi>
+            <mi mathvariant="normal">sin</mi>
             <mo>&#8289;</mo>
           </mrow>
           <mi>θ</mi>
diff --git a/test/writer/mml/mfracZcomp-19.test b/test/writer/mml/mfracZcomp-19.test
--- a/test/writer/mml/mfracZcomp-19.test
+++ b/test/writer/mml/mfracZcomp-19.test
@@ -24,7 +24,7 @@
       <mfrac>
         <mrow>
           <mrow>
-            <mi>sin</mi>
+            <mi mathvariant="normal">sin</mi>
             <mo>&#8289;</mo>
           </mrow>
           <mi>θ</mi>
diff --git a/test/writer/mml/mfracZcomp-20.test b/test/writer/mml/mfracZcomp-20.test
--- a/test/writer/mml/mfracZcomp-20.test
+++ b/test/writer/mml/mfracZcomp-20.test
@@ -26,7 +26,7 @@
       <mfrac>
         <mrow>
           <mrow>
-            <mi>sin</mi>
+            <mi mathvariant="normal">sin</mi>
             <mo>&#8289;</mo>
           </mrow>
           <mi>θ</mi>
diff --git a/test/writer/mml/mfracZcomp-21.test b/test/writer/mml/mfracZcomp-21.test
--- a/test/writer/mml/mfracZcomp-21.test
+++ b/test/writer/mml/mfracZcomp-21.test
@@ -26,7 +26,7 @@
       <mfrac>
         <mrow>
           <mrow>
-            <mi>sin</mi>
+            <mi mathvariant="normal">sin</mi>
             <mo>&#8289;</mo>
           </mrow>
           <mi>θ</mi>
diff --git a/test/writer/mml/mfracZcomp-24.test b/test/writer/mml/mfracZcomp-24.test
--- a/test/writer/mml/mfracZcomp-24.test
+++ b/test/writer/mml/mfracZcomp-24.test
@@ -56,7 +56,7 @@
                 <mrow>
                   <mrow>
                     <mrow>
-                      <mi>sin</mi>
+                      <mi mathvariant="normal">sin</mi>
                       <mo>&#8289;</mo>
                     </mrow>
                     <mi>θ</mi>
diff --git a/test/writer/mml/mfracZcomp-25.test b/test/writer/mml/mfracZcomp-25.test
--- a/test/writer/mml/mfracZcomp-25.test
+++ b/test/writer/mml/mfracZcomp-25.test
@@ -56,7 +56,7 @@
                 <mrow>
                   <mrow>
                     <mrow>
-                      <mi>sin</mi>
+                      <mi mathvariant="normal">sin</mi>
                       <mo>&#8289;</mo>
                     </mrow>
                     <mi>θ</mi>
diff --git a/test/writer/mml/mfracZcomp-33.test b/test/writer/mml/mfracZcomp-33.test
--- a/test/writer/mml/mfracZcomp-33.test
+++ b/test/writer/mml/mfracZcomp-33.test
@@ -74,7 +74,7 @@
           <mi>i</mi>
           <mi> </mi>
           <mrow>
-            <mi>cos</mi>
+            <mi mathvariant="normal">cos</mi>
             <mo>&#8289;</mo>
           </mrow>
           <mrow>
diff --git a/test/writer/mml/mi2.test b/test/writer/mml/mi2.test
--- a/test/writer/mml/mi2.test
+++ b/test/writer/mml/mi2.test
@@ -5,7 +5,7 @@
 <math display="block" xmlns="http://www.w3.org/1998/Math/MathML">
   <mrow>
     <mrow>
-      <mi>sin</mi>
+      <mi mathvariant="normal">sin</mi>
       <mo>&#8289;</mo>
     </mrow>
     <mi>x</mi>
diff --git a/test/writer/mml/miAtoken5.test b/test/writer/mml/miAtoken5.test
--- a/test/writer/mml/miAtoken5.test
+++ b/test/writer/mml/miAtoken5.test
@@ -64,7 +64,7 @@
     <mtr>
       <mtd columnalign="center" style="text-align: center">
         <mrow>
-          <mi>𝒜</mi>
+          <mi mathvariant="script">𝒜</mi>
           <mo>+</mo>
           <mi>A</mi>
           <mo>+</mo>
@@ -77,7 +77,7 @@
     <mtr>
       <mtd columnalign="center" style="text-align: center">
         <mrow>
-          <mi>𝒜</mi>
+          <mi mathvariant="script">𝒜</mi>
           <mo>+</mo>
           <mi>A</mi>
           <mo>+</mo>
diff --git a/test/writer/mml/miequivalents11.test b/test/writer/mml/miequivalents11.test
--- a/test/writer/mml/miequivalents11.test
+++ b/test/writer/mml/miequivalents11.test
@@ -122,7 +122,7 @@
         <mrow>
           <mi>𝐀</mi>
           <mo>=</mo>
-          <mi>𝐀</mi>
+          <mi mathvariant="bold-italic">𝑨</mi>
         </mrow>
       </mtd>
     </mtr>
@@ -131,7 +131,7 @@
         <mrow>
           <mi>𝐴</mi>
           <mo>=</mo>
-          <mi>𝐴</mi>
+          <mi mathvariant="italic">𝐴</mi>
         </mrow>
       </mtd>
     </mtr>
@@ -140,7 +140,7 @@
         <mrow>
           <mi>𝑨</mi>
           <mo>=</mo>
-          <mi>𝑨</mi>
+          <mi mathvariant="bold-italic">𝑨</mi>
         </mrow>
       </mtd>
     </mtr>
@@ -149,7 +149,7 @@
         <mrow>
           <mi>𝔸</mi>
           <mo>=</mo>
-          <mi>𝔸</mi>
+          <mi mathvariant="double-struck">𝔸</mi>
           <mo>=</mo>
           <mi>𝔸</mi>
         </mrow>
@@ -160,7 +160,7 @@
         <mrow>
           <mi>𝒜</mi>
           <mo>=</mo>
-          <mi>𝒜</mi>
+          <mi mathvariant="script">𝒜</mi>
           <mo>=</mo>
           <mi>𝒜</mi>
         </mrow>
@@ -171,7 +171,7 @@
         <mrow>
           <mi>𝓐</mi>
           <mo>=</mo>
-          <mi>𝓐</mi>
+          <mi mathvariant="bold-script">𝓐</mi>
         </mrow>
       </mtd>
     </mtr>
@@ -180,7 +180,7 @@
         <mrow>
           <mi>𝔄</mi>
           <mo>=</mo>
-          <mi>𝔄</mi>
+          <mi mathvariant="fraktur">𝔄</mi>
           <mo>=</mo>
           <mi>𝔄</mi>
         </mrow>
@@ -191,7 +191,7 @@
         <mrow>
           <mi>𝕬</mi>
           <mo>=</mo>
-          <mi>𝕬</mi>
+          <mi mathvariant="bold-fraktur">𝕬</mi>
         </mrow>
       </mtd>
     </mtr>
@@ -200,7 +200,7 @@
         <mrow>
           <mi>𝖠</mi>
           <mo>=</mo>
-          <mi>𝖠</mi>
+          <mi mathvariant="sans-serif">𝖠</mi>
         </mrow>
       </mtd>
     </mtr>
@@ -209,7 +209,7 @@
         <mrow>
           <mi>𝗔</mi>
           <mo>=</mo>
-          <mi>𝗔</mi>
+          <mi mathvariant="bold-sans-serif">𝗔</mi>
         </mrow>
       </mtd>
     </mtr>
@@ -218,7 +218,7 @@
         <mrow>
           <mi>𝘈</mi>
           <mo>=</mo>
-          <mi>𝘈</mi>
+          <mi mathvariant="sans-serif-italic">𝘈</mi>
         </mrow>
       </mtd>
     </mtr>
@@ -227,7 +227,7 @@
         <mrow>
           <mi>𝘼</mi>
           <mo>=</mo>
-          <mi>𝘼</mi>
+          <mi mathvariant="sans-serif-bold-italic">𝘼</mi>
         </mrow>
       </mtd>
     </mtr>
@@ -236,7 +236,7 @@
         <mrow>
           <mi>𝙰</mi>
           <mo>=</mo>
-          <mi>𝙰</mi>
+          <mi mathvariant="monospace">𝙰</mi>
         </mrow>
       </mtd>
     </mtr>
diff --git a/test/writer/mml/mimathvariant13.test b/test/writer/mml/mimathvariant13.test
--- a/test/writer/mml/mimathvariant13.test
+++ b/test/writer/mml/mimathvariant13.test
@@ -65,46 +65,46 @@
         <mi>a</mi>
       </mtd>
       <mtd columnalign="center" style="text-align: center">
-        <mi>𝐚</mi>
+        <mi mathvariant="bold-italic">𝒂</mi>
       </mtd>
       <mtd columnalign="center" style="text-align: center">
-        <mi>𝑎</mi>
+        <mi mathvariant="italic">𝑎</mi>
       </mtd>
       <mtd columnalign="center" style="text-align: center">
-        <mi>𝒂</mi>
+        <mi mathvariant="bold-italic">𝒂</mi>
       </mtd>
       <mtd columnalign="center" style="text-align: center">
-        <mi>𝕒</mi>
+        <mi mathvariant="double-struck">𝕒</mi>
       </mtd>
       <mtd columnalign="center" style="text-align: center">
-        <mi>𝖆</mi>
+        <mi mathvariant="bold-fraktur">𝖆</mi>
       </mtd>
       <mtd columnalign="center" style="text-align: center">
-        <mi>𝒶</mi>
+        <mi mathvariant="script">𝒶</mi>
       </mtd>
       <mtd columnalign="center" style="text-align: center">
-        <mi>𝓪</mi>
+        <mi mathvariant="bold-script">𝓪</mi>
       </mtd>
       <mtd columnalign="center" style="text-align: center">
-        <mi>𝔞</mi>
+        <mi mathvariant="fraktur">𝔞</mi>
       </mtd>
       <mtd columnalign="center" style="text-align: center">
-        <mi>𝖺</mi>
+        <mi mathvariant="sans-serif">𝖺</mi>
       </mtd>
       <mtd columnalign="center" style="text-align: center">
-        <mi>𝗮</mi>
+        <mi mathvariant="bold-sans-serif">𝗮</mi>
       </mtd>
       <mtd columnalign="center" style="text-align: center">
-        <mi>𝘢</mi>
+        <mi mathvariant="sans-serif-italic">𝘢</mi>
       </mtd>
       <mtd columnalign="center" style="text-align: center">
-        <mi>𝙖</mi>
+        <mi mathvariant="sans-serif-bold-italic">𝙖</mi>
       </mtd>
       <mtd columnalign="center" style="text-align: center">
-        <mi>𝚊</mi>
+        <mi mathvariant="monospace">𝚊</mi>
       </mtd>
       <mtd columnalign="center" style="text-align: center">
-        <mi>𝐚𝐛</mi>
+        <mi mathvariant="bold-italic">𝒂𝒃</mi>
       </mtd>
     </mtr>
     <mtr>
@@ -115,46 +115,46 @@
         <mi>A</mi>
       </mtd>
       <mtd columnalign="center" style="text-align: center">
-        <mi>𝐀</mi>
+        <mi mathvariant="bold-italic">𝑨</mi>
       </mtd>
       <mtd columnalign="center" style="text-align: center">
-        <mi>𝐴</mi>
+        <mi mathvariant="italic">𝐴</mi>
       </mtd>
       <mtd columnalign="center" style="text-align: center">
-        <mi>𝑨</mi>
+        <mi mathvariant="bold-italic">𝑨</mi>
       </mtd>
       <mtd columnalign="center" style="text-align: center">
-        <mi>𝔸</mi>
+        <mi mathvariant="double-struck">𝔸</mi>
       </mtd>
       <mtd columnalign="center" style="text-align: center">
-        <mi>𝕬</mi>
+        <mi mathvariant="bold-fraktur">𝕬</mi>
       </mtd>
       <mtd columnalign="center" style="text-align: center">
-        <mi>𝒜</mi>
+        <mi mathvariant="script">𝒜</mi>
       </mtd>
       <mtd columnalign="center" style="text-align: center">
-        <mi>𝓐</mi>
+        <mi mathvariant="bold-script">𝓐</mi>
       </mtd>
       <mtd columnalign="center" style="text-align: center">
-        <mi>𝔄</mi>
+        <mi mathvariant="fraktur">𝔄</mi>
       </mtd>
       <mtd columnalign="center" style="text-align: center">
-        <mi>𝖠</mi>
+        <mi mathvariant="sans-serif">𝖠</mi>
       </mtd>
       <mtd columnalign="center" style="text-align: center">
-        <mi>𝗔</mi>
+        <mi mathvariant="bold-sans-serif">𝗔</mi>
       </mtd>
       <mtd columnalign="center" style="text-align: center">
-        <mi>𝘈</mi>
+        <mi mathvariant="sans-serif-italic">𝘈</mi>
       </mtd>
       <mtd columnalign="center" style="text-align: center">
-        <mi>𝘼</mi>
+        <mi mathvariant="sans-serif-bold-italic">𝘼</mi>
       </mtd>
       <mtd columnalign="center" style="text-align: center">
-        <mi>𝙰</mi>
+        <mi mathvariant="monospace">𝙰</mi>
       </mtd>
       <mtd columnalign="center" style="text-align: center">
-        <mi>𝛂</mi>
+        <mi mathvariant="bold-italic">𝜶</mi>
       </mtd>
     </mtr>
   </mtable>
diff --git a/test/writer/mml/mimathvariant14.test b/test/writer/mml/mimathvariant14.test
--- a/test/writer/mml/mimathvariant14.test
+++ b/test/writer/mml/mimathvariant14.test
@@ -46,40 +46,40 @@
     <mtr>
       <mtd columnalign="left" style="text-align: left">
         <mrow>
-          <mi>𝔄𝔅ℭ𝔇𝔈𝔉𝔊ℌℑ𝔍𝔎𝔏𝔐𝔑𝔒𝔓𝔔ℜ𝔖𝔗𝔘𝔙𝔚𝔛𝔜ℨ</mi>
-          <mi>𝔞𝔟𝔠𝔡𝔢𝔣𝔤𝔥𝔦𝔧𝔨𝔩𝔪𝔫𝔬𝔭𝔮𝔯𝔰𝔱𝔲𝔳𝔴𝔵𝔶𝔷</mi>
+          <mi mathvariant="fraktur">𝔄𝔅ℭ𝔇𝔈𝔉𝔊ℌℑ𝔍𝔎𝔏𝔐𝔑𝔒𝔓𝔔ℜ𝔖𝔗𝔘𝔙𝔚𝔛𝔜ℨ</mi>
+          <mi mathvariant="fraktur">𝔞𝔟𝔠𝔡𝔢𝔣𝔤𝔥𝔦𝔧𝔨𝔩𝔪𝔫𝔬𝔭𝔮𝔯𝔰𝔱𝔲𝔳𝔴𝔵𝔶𝔷</mi>
         </mrow>
       </mtd>
     </mtr>
     <mtr>
       <mtd columnalign="left" style="text-align: left">
         <mrow>
-          <mi>𝕬𝕭𝕮𝕯𝕰𝕱𝕲𝕳𝕴𝕵𝕶𝕷𝕸𝕹𝕺𝕻𝕼𝕽𝕾𝕿𝖀𝖁𝖂𝖃𝖄𝖅</mi>
-          <mi>𝖆𝖇𝖈𝖉𝖊𝖋𝖌𝖍𝖎𝖏𝖐𝖑𝖒𝖓𝖔𝖕𝖖𝖗𝖘𝖙𝖚𝖛𝖜𝖝𝖞𝖟</mi>
+          <mi mathvariant="bold-fraktur">𝕬𝕭𝕮𝕯𝕰𝕱𝕲𝕳𝕴𝕵𝕶𝕷𝕸𝕹𝕺𝕻𝕼𝕽𝕾𝕿𝖀𝖁𝖂𝖃𝖄𝖅</mi>
+          <mi mathvariant="bold-fraktur">𝖆𝖇𝖈𝖉𝖊𝖋𝖌𝖍𝖎𝖏𝖐𝖑𝖒𝖓𝖔𝖕𝖖𝖗𝖘𝖙𝖚𝖛𝖜𝖝𝖞𝖟</mi>
         </mrow>
       </mtd>
     </mtr>
     <mtr>
       <mtd columnalign="left" style="text-align: left">
         <mrow>
-          <mi>𝔸𝔹ℂ𝔻𝔼𝔽𝔾ℍ𝕀𝕁𝕂𝕃𝕄ℕ𝕆ℙℚℝ𝕊𝕋𝕌𝕍𝕎𝕏𝕐ℤ</mi>
-          <mi>𝕒𝕓𝕔𝕕𝕖𝕗𝕘𝕙𝕚𝕛𝕜𝕝𝕞𝕟𝕠𝕡𝕢𝕣𝕤𝕥𝕦𝕧𝕨𝕩𝕪𝕫</mi>
+          <mi mathvariant="double-struck">𝔸𝔹ℂ𝔻𝔼𝔽𝔾ℍ𝕀𝕁𝕂𝕃𝕄ℕ𝕆ℙℚℝ𝕊𝕋𝕌𝕍𝕎𝕏𝕐ℤ</mi>
+          <mi mathvariant="double-struck">𝕒𝕓𝕔𝕕𝕖𝕗𝕘𝕙𝕚𝕛𝕜𝕝𝕞𝕟𝕠𝕡𝕢𝕣𝕤𝕥𝕦𝕧𝕨𝕩𝕪𝕫</mi>
         </mrow>
       </mtd>
     </mtr>
     <mtr>
       <mtd columnalign="left" style="text-align: left">
         <mrow>
-          <mi>𝒜ℬ𝒞𝒟ℰℱ𝒢ℋℐ𝒥𝒦ℒℳ𝒩𝒪𝒫𝒬ℛ𝒮𝒯𝒰𝒱𝒲𝒳𝒴𝒵</mi>
-          <mi>𝒶𝒷𝒸𝒹ℯ𝒻ℊ𝒽𝒾𝒿𝓀𝓁𝓂𝓃ℴ𝓅𝓆𝓇𝓈𝓉𝓊𝓋𝓌𝓍𝓎𝓏</mi>
+          <mi mathvariant="script">𝒜ℬ𝒞𝒟ℰℱ𝒢ℋℐ𝒥𝒦ℒℳ𝒩𝒪𝒫𝒬ℛ𝒮𝒯𝒰𝒱𝒲𝒳𝒴𝒵</mi>
+          <mi mathvariant="script">𝒶𝒷𝒸𝒹ℯ𝒻ℊ𝒽𝒾𝒿𝓀𝓁𝓂𝓃ℴ𝓅𝓆𝓇𝓈𝓉𝓊𝓋𝓌𝓍𝓎𝓏</mi>
         </mrow>
       </mtd>
     </mtr>
     <mtr>
       <mtd columnalign="left" style="text-align: left">
         <mrow>
-          <mi>𝓐𝓑𝓒𝓓𝓔𝓕𝓖𝓗𝓘𝓙𝓚𝓛𝓜𝓝𝓞𝓟𝓠𝓡𝓢𝓣𝓤𝓥𝓦𝓧𝓨𝓩</mi>
-          <mi>𝓪𝓫𝓬𝓭𝓮𝓯𝓰𝓱𝓲𝓳𝓴𝓵𝓶𝓷𝓸𝓹𝓺𝓻𝓼𝓽𝓾𝓿𝔀𝔁𝔂𝔃</mi>
+          <mi mathvariant="bold-script">𝓐𝓑𝓒𝓓𝓔𝓕𝓖𝓗𝓘𝓙𝓚𝓛𝓜𝓝𝓞𝓟𝓠𝓡𝓢𝓣𝓤𝓥𝓦𝓧𝓨𝓩</mi>
+          <mi mathvariant="bold-script">𝓪𝓫𝓬𝓭𝓮𝓯𝓰𝓱𝓲𝓳𝓴𝓵𝓶𝓷𝓸𝓹𝓺𝓻𝓼𝓽𝓾𝓿𝔀𝔁𝔂𝔃</mi>
         </mrow>
       </mtd>
     </mtr>
diff --git a/test/writer/mml/mo6.test b/test/writer/mml/mo6.test
--- a/test/writer/mml/mo6.test
+++ b/test/writer/mml/mo6.test
@@ -19,7 +19,7 @@
 <math display="block" xmlns="http://www.w3.org/1998/Math/MathML">
   <mrow>
     <mrow>
-      <mi>there exists</mi>
+      <mi mathvariant="normal">there exists</mi>
       <mo>&#8289;</mo>
     </mrow>
     <mrow>
@@ -29,7 +29,7 @@
         <mn>0</mn>
       </mrow>
       <mrow>
-        <mi>such that</mi>
+        <mi mathvariant="normal">such that</mi>
         <mo>&#8289;</mo>
       </mrow>
       <mrow>
diff --git a/test/writer/mml/mstyleA2.test b/test/writer/mml/mstyleA2.test
--- a/test/writer/mml/mstyleA2.test
+++ b/test/writer/mml/mstyleA2.test
@@ -9,6 +9,6 @@
   <mrow>
     <mn mathvariant="bold-italic">2</mn>
     <mo mathvariant="bold-italic">+</mo>
-    <mi>𝒙</mi>
+    <mi mathvariant="bold-italic">𝒙</mi>
   </mrow>
 </math>
diff --git a/test/writer/mml/n.test b/test/writer/mml/n.test
--- a/test/writer/mml/n.test
+++ b/test/writer/mml/n.test
@@ -405,7 +405,7 @@
         <mtext mathvariant="normal">nang</mtext>
       </mtd>
       <mtd columnalign="center" style="text-align: center">
-        <mi>∠⃒</mi>
+        <mi mathvariant="normal">∠⃒</mi>
       </mtd>
     </mtr>
     <mtr>
@@ -421,7 +421,7 @@
         <mtext mathvariant="normal">napE</mtext>
       </mtd>
       <mtd columnalign="center" style="text-align: center">
-        <mi>⩰̸</mi>
+        <mi mathvariant="normal">⩰̸</mi>
       </mtd>
     </mtr>
     <mtr>
@@ -429,7 +429,7 @@
         <mtext mathvariant="normal">napid</mtext>
       </mtd>
       <mtd columnalign="center" style="text-align: center">
-        <mi>≋̸</mi>
+        <mi mathvariant="normal">≋̸</mi>
       </mtd>
     </mtr>
     <mtr>
@@ -549,7 +549,7 @@
         <mtext mathvariant="normal">ncongdot</mtext>
       </mtd>
       <mtd columnalign="center" style="text-align: center">
-        <mi>⩭̸</mi>
+        <mi mathvariant="normal">⩭̸</mi>
       </mtd>
     </mtr>
     <mtr>
@@ -629,7 +629,7 @@
         <mtext mathvariant="normal">nedot</mtext>
       </mtd>
       <mtd columnalign="center" style="text-align: center">
-        <mi>≐̸</mi>
+        <mi mathvariant="normal">≐̸</mi>
       </mtd>
     </mtr>
     <mtr>
@@ -709,7 +709,7 @@
         <mtext mathvariant="normal">NewLine</mtext>
       </mtd>
       <mtd columnalign="center" style="text-align: center">
-        <mi></mi>
+        <mi mathvariant="normal"></mi>
       </mtd>
     </mtr>
     <mtr>
@@ -757,7 +757,7 @@
         <mtext mathvariant="normal">ngE</mtext>
       </mtd>
       <mtd columnalign="center" style="text-align: center">
-        <mi>≧̸</mi>
+        <mi mathvariant="normal">≧̸</mi>
       </mtd>
     </mtr>
     <mtr>
@@ -773,7 +773,7 @@
         <mtext mathvariant="normal">ngeqq</mtext>
       </mtd>
       <mtd columnalign="center" style="text-align: center">
-        <mi>≧̸</mi>
+        <mi mathvariant="normal">≧̸</mi>
       </mtd>
     </mtr>
     <mtr>
@@ -797,7 +797,7 @@
         <mtext mathvariant="normal">nGg</mtext>
       </mtd>
       <mtd columnalign="center" style="text-align: center">
-        <mi>⋙̸</mi>
+        <mi mathvariant="normal">⋙̸</mi>
       </mtd>
     </mtr>
     <mtr>
@@ -821,7 +821,7 @@
         <mtext mathvariant="normal">nGt</mtext>
       </mtd>
       <mtd columnalign="center" style="text-align: center">
-        <mi>≫⃒</mi>
+        <mi mathvariant="normal">≫⃒</mi>
       </mtd>
     </mtr>
     <mtr>
@@ -1029,7 +1029,7 @@
         <mtext mathvariant="normal">nLl</mtext>
       </mtd>
       <mtd columnalign="center" style="text-align: center">
-        <mi>⋘̸</mi>
+        <mi mathvariant="normal">⋘̸</mi>
       </mtd>
     </mtr>
     <mtr>
@@ -1053,7 +1053,7 @@
         <mtext mathvariant="normal">nLt</mtext>
       </mtd>
       <mtd columnalign="center" style="text-align: center">
-        <mi>≪⃒</mi>
+        <mi mathvariant="normal">≪⃒</mi>
       </mtd>
     </mtr>
     <mtr>
@@ -1213,7 +1213,7 @@
         <mtext mathvariant="normal">NotGreaterFullEqual</mtext>
       </mtd>
       <mtd columnalign="center" style="text-align: center">
-        <mi>≧̸</mi>
+        <mi mathvariant="normal">≧̸</mi>
       </mtd>
     </mtr>
     <mtr>
@@ -1277,7 +1277,7 @@
         <mtext mathvariant="normal">notindot</mtext>
       </mtd>
       <mtd columnalign="center" style="text-align: center">
-        <mi>⋵̸</mi>
+        <mi mathvariant="normal">⋵̸</mi>
       </mtd>
     </mtr>
     <mtr>
@@ -1285,7 +1285,7 @@
         <mtext mathvariant="normal">notinE</mtext>
       </mtd>
       <mtd columnalign="center" style="text-align: center">
-        <mi>⋹̸</mi>
+        <mi mathvariant="normal">⋹̸</mi>
       </mtd>
     </mtr>
     <mtr>
@@ -1645,7 +1645,7 @@
         <mtext mathvariant="normal">nparsl</mtext>
       </mtd>
       <mtd columnalign="center" style="text-align: center">
-        <mi>⫽⃥</mi>
+        <mi mathvariant="normal">⫽⃥</mi>
       </mtd>
     </mtr>
     <mtr>
@@ -1653,7 +1653,7 @@
         <mtext mathvariant="normal">npart</mtext>
       </mtd>
       <mtd columnalign="center" style="text-align: center">
-        <mi>∂̸</mi>
+        <mi mathvariant="normal">∂̸</mi>
       </mtd>
     </mtr>
     <mtr>
@@ -1725,7 +1725,7 @@
         <mtext mathvariant="normal">nrarrc</mtext>
       </mtd>
       <mtd columnalign="center" style="text-align: center">
-        <mi>⤳̸</mi>
+        <mi mathvariant="normal">⤳̸</mi>
       </mtd>
     </mtr>
     <mtr>
@@ -1733,7 +1733,7 @@
         <mtext mathvariant="normal">nrarrw</mtext>
       </mtd>
       <mtd columnalign="center" style="text-align: center">
-        <mi>↝̸</mi>
+        <mi mathvariant="normal">↝̸</mi>
       </mtd>
     </mtr>
     <mtr>
@@ -1901,7 +1901,7 @@
         <mtext mathvariant="normal">nsubE</mtext>
       </mtd>
       <mtd columnalign="center" style="text-align: center">
-        <mi>⫅̸</mi>
+        <mi mathvariant="normal">⫅̸</mi>
       </mtd>
     </mtr>
     <mtr>
@@ -1925,7 +1925,7 @@
         <mtext mathvariant="normal">nsubseteqq</mtext>
       </mtd>
       <mtd columnalign="center" style="text-align: center">
-        <mi>⫅̸</mi>
+        <mi mathvariant="normal">⫅̸</mi>
       </mtd>
     </mtr>
     <mtr>
@@ -1965,7 +1965,7 @@
         <mtext mathvariant="normal">nsupE</mtext>
       </mtd>
       <mtd columnalign="center" style="text-align: center">
-        <mi>⫆̸</mi>
+        <mi mathvariant="normal">⫆̸</mi>
       </mtd>
     </mtr>
     <mtr>
@@ -1989,7 +1989,7 @@
         <mtext mathvariant="normal">nsupseteqq</mtext>
       </mtd>
       <mtd columnalign="center" style="text-align: center">
-        <mi>⫆̸</mi>
+        <mi mathvariant="normal">⫆̸</mi>
       </mtd>
     </mtr>
     <mtr>
@@ -2093,7 +2093,7 @@
         <mtext mathvariant="normal">nvap</mtext>
       </mtd>
       <mtd columnalign="center" style="text-align: center">
-        <mi>≍⃒</mi>
+        <mi mathvariant="normal">≍⃒</mi>
       </mtd>
     </mtr>
     <mtr>
@@ -2133,7 +2133,7 @@
         <mtext mathvariant="normal">nvge</mtext>
       </mtd>
       <mtd columnalign="center" style="text-align: center">
-        <mi>≥⃒</mi>
+        <mi mathvariant="normal">≥⃒</mi>
       </mtd>
     </mtr>
     <mtr>
@@ -2141,7 +2141,7 @@
         <mtext mathvariant="normal">nvgt</mtext>
       </mtd>
       <mtd columnalign="center" style="text-align: center">
-        <mi>&gt;⃒</mi>
+        <mi mathvariant="normal">&gt;⃒</mi>
       </mtd>
     </mtr>
     <mtr>
@@ -2173,7 +2173,7 @@
         <mtext mathvariant="normal">nvle</mtext>
       </mtd>
       <mtd columnalign="center" style="text-align: center">
-        <mi>≤⃒</mi>
+        <mi mathvariant="normal">≤⃒</mi>
       </mtd>
     </mtr>
     <mtr>
@@ -2181,7 +2181,7 @@
         <mtext mathvariant="normal">nvlt</mtext>
       </mtd>
       <mtd columnalign="center" style="text-align: center">
-        <mi>&lt;⃒</mi>
+        <mi mathvariant="normal">&lt;⃒</mi>
       </mtd>
     </mtr>
     <mtr>
@@ -2189,7 +2189,7 @@
         <mtext mathvariant="normal">nvltrie</mtext>
       </mtd>
       <mtd columnalign="center" style="text-align: center">
-        <mi>⊴⃒</mi>
+        <mi mathvariant="normal">⊴⃒</mi>
       </mtd>
     </mtr>
     <mtr>
@@ -2205,7 +2205,7 @@
         <mtext mathvariant="normal">nvrtrie</mtext>
       </mtd>
       <mtd columnalign="center" style="text-align: center">
-        <mi>⊵⃒</mi>
+        <mi mathvariant="normal">⊵⃒</mi>
       </mtd>
     </mtr>
     <mtr>
@@ -2213,7 +2213,7 @@
         <mtext mathvariant="normal">nvsim</mtext>
       </mtd>
       <mtd columnalign="center" style="text-align: center">
-        <mi>∼⃒</mi>
+        <mi mathvariant="normal">∼⃒</mi>
       </mtd>
     </mtr>
     <mtr>
diff --git a/test/writer/mml/operatorname.test b/test/writer/mml/operatorname.test
--- a/test/writer/mml/operatorname.test
+++ b/test/writer/mml/operatorname.test
@@ -77,7 +77,7 @@
         <mtd columnalign="left" style="text-align: left">
           <msub>
             <mrow>
-              <mi>div</mi>
+              <mi mathvariant="normal">div</mi>
               <mo>&#8289;</mo>
             </mrow>
             <mi>x</mi>
@@ -85,7 +85,7 @@
           <mi>u</mi>
           <msup>
             <mrow>
-              <mi>div</mi>
+              <mi mathvariant="normal">div</mi>
               <mo>&#8289;</mo>
             </mrow>
             <mi>x</mi>
@@ -93,7 +93,7 @@
           <mi>u</mi>
           <msubsup>
             <mrow>
-              <mi>div</mi>
+              <mi mathvariant="normal">div</mi>
               <mo>&#8289;</mo>
             </mrow>
             <mi>x</mi>
@@ -102,7 +102,7 @@
           <mi>u</mi>
           <msubsup>
             <mrow>
-              <mi>div</mi>
+              <mi mathvariant="normal">div</mi>
               <mo>&#8289;</mo>
             </mrow>
             <mi>x</mi>
@@ -117,7 +117,7 @@
       <mtr>
         <mtd columnalign="left" style="text-align: left">
           <munder>
-            <mi>⋆-lim&#39;sup</mi>
+            <mi mathvariant="normal">⋆-lim&#39;sup</mi>
             <mrow>
               <mi>x</mi>
               <mo>→</mo>
@@ -126,12 +126,12 @@
           </munder>
           <mi>u</mi>
           <mover>
-            <mi>⋆-lim&#39;sup</mi>
+            <mi mathvariant="normal">⋆-lim&#39;sup</mi>
             <mi>w</mi>
           </mover>
           <mi>u</mi>
           <munderover>
-            <mi>⋆-lim&#39;sup</mi>
+            <mi mathvariant="normal">⋆-lim&#39;sup</mi>
             <mrow>
               <mi>x</mi>
               <mo>→</mo>
@@ -141,7 +141,7 @@
           </munderover>
           <mi>u</mi>
           <munderover>
-            <mi>⋆-lim&#39;sup</mi>
+            <mi mathvariant="normal">⋆-lim&#39;sup</mi>
             <mrow>
               <mi>x</mi>
               <mo>→</mo>
@@ -159,7 +159,7 @@
         <mtd columnalign="left" style="text-align: left">
           <msub>
             <mrow>
-              <mi>⋆-lim&#39;sup</mi>
+              <mi mathvariant="normal">⋆-lim&#39;sup</mi>
               <mo>&#8289;</mo>
             </mrow>
             <mrow>
@@ -171,7 +171,7 @@
           <mi>u</mi>
           <msup>
             <mrow>
-              <mi>⋆-lim&#39;sup</mi>
+              <mi mathvariant="normal">⋆-lim&#39;sup</mi>
               <mo>&#8289;</mo>
             </mrow>
             <mi>w</mi>
@@ -179,7 +179,7 @@
           <mi>u</mi>
           <msubsup>
             <mrow>
-              <mi>⋆-lim&#39;sup</mi>
+              <mi mathvariant="normal">⋆-lim&#39;sup</mi>
               <mo>&#8289;</mo>
             </mrow>
             <mrow>
@@ -192,7 +192,7 @@
           <mi>u</mi>
           <msubsup>
             <mrow>
-              <mi>⋆-lim&#39;sup</mi>
+              <mi mathvariant="normal">⋆-lim&#39;sup</mi>
               <mo>&#8289;</mo>
             </mrow>
             <mrow>
@@ -212,14 +212,14 @@
         <mtd columnalign="left" style="text-align: left">
           <msub>
             <mrow>
-              <mi>curl</mi>
+              <mi mathvariant="normal">curl</mi>
               <mo>&#8289;</mo>
             </mrow>
             <mi>x</mi>
           </msub>
           <mi>v</mi>
           <munder>
-            <mi>argmax</mi>
+            <mi mathvariant="normal">argmax</mi>
             <mi>K</mi>
           </munder>
           <mi>u</mi>
diff --git a/test/writer/mml/primes1.test b/test/writer/mml/primes1.test
--- a/test/writer/mml/primes1.test
+++ b/test/writer/mml/primes1.test
@@ -62,7 +62,7 @@
     <mo>+</mo>
     <msup>
       <mi>x</mi>
-      <mi>&#39;&#39;</mi>
+      <mi mathvariant="normal">&#39;&#39;</mi>
     </msup>
     <mo>+</mo>
     <mi>x</mi>
diff --git a/test/writer/mml/s.test b/test/writer/mml/s.test
--- a/test/writer/mml/s.test
+++ b/test/writer/mml/s.test
@@ -812,7 +812,7 @@
         <mtext mathvariant="normal">smtes</mtext>
       </mtd>
       <mtd columnalign="center" style="text-align: center">
-        <mi>⪬︀</mi>
+        <mi mathvariant="normal">⪬︀</mi>
       </mtd>
     </mtr>
     <mtr>
@@ -908,7 +908,7 @@
         <mtext mathvariant="normal">sqcaps</mtext>
       </mtd>
       <mtd columnalign="center" style="text-align: center">
-        <mi>⊓︀</mi>
+        <mi mathvariant="normal">⊓︀</mi>
       </mtd>
     </mtr>
     <mtr>
@@ -924,7 +924,7 @@
         <mtext mathvariant="normal">sqcups</mtext>
       </mtd>
       <mtd columnalign="center" style="text-align: center">
-        <mi>⊔︀</mi>
+        <mi mathvariant="normal">⊔︀</mi>
       </mtd>
     </mtr>
     <mtr>
diff --git a/test/writer/mml/schwinger_dyson.test b/test/writer/mml/schwinger_dyson.test
--- a/test/writer/mml/schwinger_dyson.test
+++ b/test/writer/mml/schwinger_dyson.test
@@ -62,7 +62,7 @@
       <mi>ψ</mi>
       <mrow>
         <mo stretchy="true" form="prefix">|</mo>
-        <mi>𝒯</mi>
+        <mi mathvariant="script">𝒯</mi>
         <mrow>
           <mo stretchy="true" form="prefix">{</mo>
           <mfrac>
@@ -93,7 +93,7 @@
       <mi>ψ</mi>
       <mrow>
         <mo stretchy="true" form="prefix">|</mo>
-        <mi>𝒯</mi>
+        <mi mathvariant="script">𝒯</mi>
         <mrow>
           <mo stretchy="true" form="prefix">{</mo>
           <mi>F</mi>
diff --git a/test/writer/mml/simplePres.test b/test/writer/mml/simplePres.test
--- a/test/writer/mml/simplePres.test
+++ b/test/writer/mml/simplePres.test
@@ -48,7 +48,7 @@
         <mo>,</mo>
         <mrow>
           <mrow>
-            <mi>sin</mi>
+            <mi mathvariant="normal">sin</mi>
             <mo>&#8289;</mo>
           </mrow>
           <mi>x</mi>
diff --git a/test/writer/mml/sphere_volume.test b/test/writer/mml/sphere_volume.test
--- a/test/writer/mml/sphere_volume.test
+++ b/test/writer/mml/sphere_volume.test
@@ -177,7 +177,7 @@
             <mn>2</mn>
           </msup>
           <mrow>
-            <mi>sin</mi>
+            <mi mathvariant="normal">sin</mi>
             <mo>&#8289;</mo>
           </mrow>
           <mi>θ</mi>
@@ -215,7 +215,7 @@
           </msubsup>
           <mspace width="-0.167em" />
           <mrow>
-            <mi>sin</mi>
+            <mi mathvariant="normal">sin</mi>
             <mo>&#8289;</mo>
           </mrow>
           <mi>θ</mi>
@@ -254,7 +254,7 @@
           <mrow>
             <mo stretchy="true" form="prefix">(</mo>
             <mo>−</mo>
-            <mi>cos</mi>
+            <mi mathvariant="normal">cos</mi>
             <mi>θ</mi>
             <mo stretchy="true" form="postfix">)</mo>
           </mrow>
diff --git a/test/writer/mml/stretchAccents2.test b/test/writer/mml/stretchAccents2.test
--- a/test/writer/mml/stretchAccents2.test
+++ b/test/writer/mml/stretchAccents2.test
@@ -16,7 +16,7 @@
     </mover>
     <mo>=</mo>
     <mover>
-      <mi>𝑥𝑥𝑥</mi>
+      <mi mathvariant="italic">𝑥𝑥𝑥</mi>
       <mo accent="true">¯</mo>
     </mover>
   </mrow>
diff --git a/test/writer/mml/subsup.test b/test/writer/mml/subsup.test
--- a/test/writer/mml/subsup.test
+++ b/test/writer/mml/subsup.test
@@ -81,27 +81,27 @@
     </msubsup>
     <mspace width="1.0em" />
     <munder>
-      <mi>min</mi>
+      <mi mathvariant="normal">min</mi>
       <mi>A</mi>
     </munder>
     <mspace width="1.0em" />
     <munder>
-      <mi>max</mi>
+      <mi mathvariant="normal">max</mi>
       <mi>B</mi>
     </munder>
     <mspace width="1.0em" />
     <munder>
-      <mi>det</mi>
+      <mi mathvariant="normal">det</mi>
       <mi>C</mi>
     </munder>
     <mspace width="1.0em" />
     <munder>
-      <mi>Pr</mi>
+      <mi mathvariant="normal">Pr</mi>
       <mi>A</mi>
     </munder>
     <mspace width="1.0em" />
     <munder>
-      <mi>gcd</mi>
+      <mi mathvariant="normal">gcd</mi>
       <mi>A</mi>
     </munder>
     <mspace width="1.0em" />
diff --git a/test/writer/mml/t.test b/test/writer/mml/t.test
--- a/test/writer/mml/t.test
+++ b/test/writer/mml/t.test
@@ -101,7 +101,7 @@
         <mtext mathvariant="normal">Tab</mtext>
       </mtd>
       <mtd columnalign="center" style="text-align: center">
-        <mi></mi>
+        <mi mathvariant="normal"></mi>
       </mtd>
     </mtr>
     <mtr>
@@ -277,7 +277,7 @@
         <mtext mathvariant="normal">ThickSpace</mtext>
       </mtd>
       <mtd columnalign="center" style="text-align: center">
-        <mi>  </mi>
+        <mi mathvariant="normal">  </mi>
       </mtd>
     </mtr>
     <mtr>
diff --git a/test/writer/mml/v.test b/test/writer/mml/v.test
--- a/test/writer/mml/v.test
+++ b/test/writer/mml/v.test
@@ -185,7 +185,7 @@
         <mtext mathvariant="normal">varsubsetneq</mtext>
       </mtd>
       <mtd columnalign="center" style="text-align: center">
-        <mi>⊊︀</mi>
+        <mi mathvariant="normal">⊊︀</mi>
       </mtd>
     </mtr>
     <mtr>
@@ -193,7 +193,7 @@
         <mtext mathvariant="normal">varsubsetneqq</mtext>
       </mtd>
       <mtd columnalign="center" style="text-align: center">
-        <mi>⫋︀</mi>
+        <mi mathvariant="normal">⫋︀</mi>
       </mtd>
     </mtr>
     <mtr>
@@ -201,7 +201,7 @@
         <mtext mathvariant="normal">varsupsetneq</mtext>
       </mtd>
       <mtd columnalign="center" style="text-align: center">
-        <mi>⊋︀</mi>
+        <mi mathvariant="normal">⊋︀</mi>
       </mtd>
     </mtr>
     <mtr>
@@ -209,7 +209,7 @@
         <mtext mathvariant="normal">varsupsetneqq</mtext>
       </mtd>
       <mtd columnalign="center" style="text-align: center">
-        <mi>⫌︀</mi>
+        <mi mathvariant="normal">⫌︀</mi>
       </mtd>
     </mtr>
     <mtr>
@@ -521,7 +521,7 @@
         <mtext mathvariant="normal">vsubne</mtext>
       </mtd>
       <mtd columnalign="center" style="text-align: center">
-        <mi>⊊︀</mi>
+        <mi mathvariant="normal">⊊︀</mi>
       </mtd>
     </mtr>
     <mtr>
@@ -529,7 +529,7 @@
         <mtext mathvariant="normal">vsubnE</mtext>
       </mtd>
       <mtd columnalign="center" style="text-align: center">
-        <mi>⫋︀</mi>
+        <mi mathvariant="normal">⫋︀</mi>
       </mtd>
     </mtr>
     <mtr>
@@ -537,7 +537,7 @@
         <mtext mathvariant="normal">vsupne</mtext>
       </mtd>
       <mtd columnalign="center" style="text-align: center">
-        <mi>⊋︀</mi>
+        <mi mathvariant="normal">⊋︀</mi>
       </mtd>
     </mtr>
     <mtr>
@@ -545,7 +545,7 @@
         <mtext mathvariant="normal">vsupnE</mtext>
       </mtd>
       <mtd columnalign="center" style="text-align: center">
-        <mi>⫌︀</mi>
+        <mi mathvariant="normal">⫌︀</mi>
       </mtd>
     </mtr>
     <mtr>
diff --git a/test/writer/mml/white10.test b/test/writer/mml/white10.test
--- a/test/writer/mml/white10.test
+++ b/test/writer/mml/white10.test
@@ -33,27 +33,27 @@
     <mi> </mi>
     <mi>H</mi>
     <mrow>
-      <mi> ︀</mi>
+      <mi mathvariant="normal"> ︀</mi>
       <mo>&#8289;</mo>
     </mrow>
     <mi>H</mi>
     <mrow>
-      <mi> ︀</mi>
+      <mi mathvariant="normal"> ︀</mi>
       <mo>&#8289;</mo>
     </mrow>
     <mi>H</mi>
     <mrow>
-      <mi> ︀</mi>
+      <mi mathvariant="normal"> ︀</mi>
       <mo>&#8289;</mo>
     </mrow>
     <mi>H</mi>
     <mrow>
-      <mi> ︀</mi>
+      <mi mathvariant="normal"> ︀</mi>
       <mo>&#8289;</mo>
     </mrow>
     <mi>H</mi>
     <mrow>
-      <mi></mi>
+      <mi mathvariant="normal"></mi>
       <mo>&#8289;</mo>
     </mrow>
     <mi>H</mi>
diff --git a/test/writer/omml/22.test b/test/writer/omml/22.test
--- a/test/writer/omml/22.test
+++ b/test/writer/omml/22.test
@@ -452,37 +452,37 @@
         <m:e>
           <m:r>
             <m:rPr>
-              <m:sty m:val="b" />
+              <m:sty m:val="bi" />
             </m:rPr>
             <m:t>A</m:t>
           </m:r>
           <m:r>
             <m:rPr>
-              <m:sty m:val="b" />
+              <m:sty m:val="bi" />
             </m:rPr>
             <m:t>B</m:t>
           </m:r>
           <m:r>
             <m:rPr>
-              <m:sty m:val="b" />
+              <m:sty m:val="bi" />
             </m:rPr>
             <m:t>C</m:t>
           </m:r>
           <m:r>
             <m:rPr>
-              <m:sty m:val="b" />
+              <m:sty m:val="bi" />
             </m:rPr>
             <m:t>a</m:t>
           </m:r>
           <m:r>
             <m:rPr>
-              <m:sty m:val="b" />
+              <m:sty m:val="bi" />
             </m:rPr>
             <m:t>b</m:t>
           </m:r>
           <m:r>
             <m:rPr>
-              <m:sty m:val="b" />
+              <m:sty m:val="bi" />
             </m:rPr>
             <m:t>c</m:t>
           </m:r>
@@ -502,37 +502,37 @@
         <m:e>
           <m:r>
             <m:rPr>
-              <m:sty m:val="b" />
+              <m:sty m:val="bi" />
             </m:rPr>
             <m:t>A</m:t>
           </m:r>
           <m:r>
             <m:rPr>
-              <m:sty m:val="b" />
+              <m:sty m:val="bi" />
             </m:rPr>
             <m:t>B</m:t>
           </m:r>
           <m:r>
             <m:rPr>
-              <m:sty m:val="b" />
+              <m:sty m:val="bi" />
             </m:rPr>
             <m:t>C</m:t>
           </m:r>
           <m:r>
             <m:rPr>
-              <m:sty m:val="b" />
+              <m:sty m:val="bi" />
             </m:rPr>
             <m:t>a</m:t>
           </m:r>
           <m:r>
             <m:rPr>
-              <m:sty m:val="b" />
+              <m:sty m:val="bi" />
             </m:rPr>
             <m:t>b</m:t>
           </m:r>
           <m:r>
             <m:rPr>
-              <m:sty m:val="b" />
+              <m:sty m:val="bi" />
             </m:rPr>
             <m:t>c</m:t>
           </m:r>
diff --git a/test/writer/omml/binomial_coefficient.test b/test/writer/omml/binomial_coefficient.test
--- a/test/writer/omml/binomial_coefficient.test
+++ b/test/writer/omml/binomial_coefficient.test
@@ -48,7 +48,7 @@
   <m:oMath>
     <m:r>
       <m:rPr>
-        <m:sty m:val="b" />
+        <m:sty m:val="bi" />
       </m:rPr>
       <m:t>C</m:t>
     </m:r>
@@ -84,7 +84,7 @@
       <m:e>
         <m:r>
           <m:rPr>
-            <m:sty m:val="b" />
+            <m:sty m:val="bi" />
           </m:rPr>
           <m:t>C</m:t>
         </m:r>
@@ -122,7 +122,7 @@
       <m:e>
         <m:r>
           <m:rPr>
-            <m:sty m:val="b" />
+            <m:sty m:val="bi" />
           </m:rPr>
           <m:t>C</m:t>
         </m:r>
diff --git a/test/writer/omml/cancel.test b/test/writer/omml/cancel.test
new file mode 100644
--- /dev/null
+++ b/test/writer/omml/cancel.test
@@ -0,0 +1,113 @@
+<<< native
+[ ECancel
+    ForwardSlash
+    (EGrouped [ EIdentifier "a" , EIdentifier "b" , EIdentifier "c" ])
+, EIdentifier "d"
+, ESymbol Bin "+"
+, ECancel BackSlash (ESuper (EIdentifier "x") (ENumber "2"))
+, ESymbol Rel "="
+, EIdentifier "d"
+, ESymbol Bin "+"
+, ECancel XSlash (ESuper (EIdentifier "x") (ENumber "2"))
+]
+
+>>> omml
+<?xml version='1.0' ?>
+<m:oMathPara>
+  <m:oMathParaPr>
+    <m:jc m:val="center" />
+  </m:oMathParaPr>
+  <m:oMath>
+    <m:borderBox>
+      <m:borderBoxPr>
+        <m:hideTop m:val="1" />
+        <m:hideBot m:val="1" />
+        <m:hideLeft m:val="1" />
+        <m:hideRight m:val="1" />
+        <m:strikeBLTR m:val="1" />
+      </m:borderBoxPr>
+      <m:e>
+        <m:r>
+          <m:t>a</m:t>
+        </m:r>
+        <m:r>
+          <m:t>b</m:t>
+        </m:r>
+        <m:r>
+          <m:t>c</m:t>
+        </m:r>
+      </m:e>
+    </m:borderBox>
+    <m:r>
+      <m:t>d</m:t>
+    </m:r>
+    <m:r>
+      <m:rPr>
+        <m:sty m:val="p" />
+      </m:rPr>
+      <m:t>+</m:t>
+    </m:r>
+    <m:borderBox>
+      <m:borderBoxPr>
+        <m:hideTop m:val="1" />
+        <m:hideBot m:val="1" />
+        <m:hideLeft m:val="1" />
+        <m:hideRight m:val="1" />
+        <m:strikeTLBR m:val="1" />
+      </m:borderBoxPr>
+      <m:e>
+        <m:sSup>
+          <m:e>
+            <m:r>
+              <m:t>x</m:t>
+            </m:r>
+          </m:e>
+          <m:sup>
+            <m:r>
+              <m:t>2</m:t>
+            </m:r>
+          </m:sup>
+        </m:sSup>
+      </m:e>
+    </m:borderBox>
+    <m:r>
+      <m:rPr>
+        <m:sty m:val="p" />
+      </m:rPr>
+      <m:t>=</m:t>
+    </m:r>
+    <m:r>
+      <m:t>d</m:t>
+    </m:r>
+    <m:r>
+      <m:rPr>
+        <m:sty m:val="p" />
+      </m:rPr>
+      <m:t>+</m:t>
+    </m:r>
+    <m:borderBox>
+      <m:borderBoxPr>
+        <m:hideTop m:val="1" />
+        <m:hideBot m:val="1" />
+        <m:hideLeft m:val="1" />
+        <m:hideRight m:val="1" />
+        <m:strikeBLTR m:val="1" />
+        <m:strikeTLBR m:val="1" />
+      </m:borderBoxPr>
+      <m:e>
+        <m:sSup>
+          <m:e>
+            <m:r>
+              <m:t>x</m:t>
+            </m:r>
+          </m:e>
+          <m:sup>
+            <m:r>
+              <m:t>2</m:t>
+            </m:r>
+          </m:sup>
+        </m:sSup>
+      </m:e>
+    </m:borderBox>
+  </m:oMath>
+</m:oMathPara>
diff --git a/test/writer/omml/complex3.test b/test/writer/omml/complex3.test
--- a/test/writer/omml/complex3.test
+++ b/test/writer/omml/complex3.test
@@ -17527,7 +17527,7 @@
         <m:e>
           <m:r>
             <m:rPr>
-              <m:sty m:val="b" />
+              <m:sty m:val="bi" />
             </m:rPr>
             <m:t>a</m:t>
           </m:r>
@@ -17539,7 +17539,7 @@
           </m:r>
           <m:r>
             <m:rPr>
-              <m:sty m:val="b" />
+              <m:sty m:val="bi" />
             </m:rPr>
             <m:t>b</m:t>
           </m:r>
@@ -17551,7 +17551,7 @@
           </m:r>
           <m:r>
             <m:rPr>
-              <m:sty m:val="b" />
+              <m:sty m:val="bi" />
             </m:rPr>
             <m:t>c</m:t>
           </m:r>
@@ -17603,7 +17603,7 @@
           </m:r>
           <m:r>
             <m:rPr>
-              <m:sty m:val="b" />
+              <m:sty m:val="bi" />
             </m:rPr>
             <m:t>x</m:t>
           </m:r>
@@ -17851,7 +17851,7 @@
           </m:r>
           <m:r>
             <m:rPr>
-              <m:sty m:val="b" />
+              <m:sty m:val="bi" />
             </m:rPr>
             <m:t>o</m:t>
           </m:r>
@@ -17863,7 +17863,7 @@
           </m:r>
           <m:r>
             <m:rPr>
-              <m:sty m:val="b" />
+              <m:sty m:val="bi" />
             </m:rPr>
             <m:t>v</m:t>
           </m:r>
@@ -17875,7 +17875,7 @@
           </m:r>
           <m:r>
             <m:rPr>
-              <m:sty m:val="b" />
+              <m:sty m:val="bi" />
             </m:rPr>
             <m:t>e</m:t>
           </m:r>
@@ -17887,7 +17887,7 @@
           </m:r>
           <m:r>
             <m:rPr>
-              <m:sty m:val="b" />
+              <m:sty m:val="bi" />
             </m:rPr>
             <m:t>r</m:t>
           </m:r>
@@ -18759,7 +18759,7 @@
                 </m:r>
                 <m:r>
                   <m:rPr>
-                    <m:sty m:val="b" />
+                    <m:sty m:val="bi" />
                   </m:rPr>
                   <m:t>u</m:t>
                 </m:r>
@@ -24005,7 +24005,7 @@
           </m:r>
           <m:r>
             <m:rPr>
-              <m:sty m:val="b" />
+              <m:sty m:val="bi" />
             </m:rPr>
             <m:t>I</m:t>
           </m:r>
@@ -30415,7 +30415,7 @@
                     <m:e>
                       <m:r>
                         <m:rPr>
-                          <m:sty m:val="b" />
+                          <m:sty m:val="bi" />
                         </m:rPr>
                         <m:t>R</m:t>
                       </m:r>
@@ -30620,7 +30620,7 @@
               </m:r>
               <m:r>
                 <m:rPr>
-                  <m:sty m:val="b" />
+                  <m:sty m:val="bi" />
                 </m:rPr>
                 <m:t>F</m:t>
               </m:r>
@@ -30634,7 +30634,7 @@
           </m:r>
           <m:r>
             <m:rPr>
-              <m:sty m:val="b" />
+              <m:sty m:val="bi" />
             </m:rPr>
             <m:t>k</m:t>
           </m:r>
diff --git a/test/writer/omml/miequivalents11.test b/test/writer/omml/miequivalents11.test
--- a/test/writer/omml/miequivalents11.test
+++ b/test/writer/omml/miequivalents11.test
@@ -153,7 +153,7 @@
           </m:r>
           <m:r>
             <m:rPr>
-              <m:sty m:val="b" />
+              <m:sty m:val="bi" />
             </m:rPr>
             <m:t>A</m:t>
           </m:r>
diff --git a/test/writer/omml/mimathvariant13.test b/test/writer/omml/mimathvariant13.test
--- a/test/writer/omml/mimathvariant13.test
+++ b/test/writer/omml/mimathvariant13.test
@@ -177,7 +177,7 @@
         <m:e>
           <m:r>
             <m:rPr>
-              <m:sty m:val="b" />
+              <m:sty m:val="bi" />
             </m:rPr>
             <m:t>a</m:t>
           </m:r>
@@ -291,7 +291,7 @@
         <m:e>
           <m:r>
             <m:rPr>
-              <m:sty m:val="b" />
+              <m:sty m:val="bi" />
             </m:rPr>
             <m:t>ab</m:t>
           </m:r>
@@ -311,7 +311,7 @@
         <m:e>
           <m:r>
             <m:rPr>
-              <m:sty m:val="b" />
+              <m:sty m:val="bi" />
             </m:rPr>
             <m:t>A</m:t>
           </m:r>
@@ -425,7 +425,7 @@
         <m:e>
           <m:r>
             <m:rPr>
-              <m:sty m:val="b" />
+              <m:sty m:val="bi" />
             </m:rPr>
             <m:t>α</m:t>
           </m:r>
diff --git a/test/writer/starmath/001_dot_text_subscript.test b/test/writer/starmath/001_dot_text_subscript.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/001_dot_text_subscript.test
@@ -0,0 +1,4 @@
+<<< tex
+\dot{Q}_{\text{dem}}(t)=\dot{Q}_{\text{eb}}(t)+\dot{Q}_{\text{dis}}(t)+\dot{Q}_{\text{boil}}(t),
+>>> starmath
+{dot Q}_"dem"(t) = {dot Q}_"eb"(t) + {dot Q}_"dis"(t) + {dot Q}_"boil"(t),
diff --git a/test/writer/starmath/002_common_accents.test b/test/writer/starmath/002_common_accents.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/002_common_accents.test
@@ -0,0 +1,4 @@
+<<< tex
+\ddot{x}+\hat{x}+\tilde{x}+\vec{x}+\bar{x}
+>>> starmath
+ddot x + hat x + tilde x + vec x + bar x
diff --git a/test/writer/starmath/003_fraction.test b/test/writer/starmath/003_fraction.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/003_fraction.test
@@ -0,0 +1,4 @@
+<<< tex
+\frac{a+b}{c}
+>>> starmath
+{{a + b} over c}
diff --git a/test/writer/starmath/004_square_root.test b/test/writer/starmath/004_square_root.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/004_square_root.test
@@ -0,0 +1,4 @@
+<<< tex
+\sqrt{x+1}
+>>> starmath
+sqrt {{x + 1}}
diff --git a/test/writer/starmath/005_nth_root.test b/test/writer/starmath/005_nth_root.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/005_nth_root.test
@@ -0,0 +1,4 @@
+<<< tex
+\sqrt[3]{x}
+>>> starmath
+nroot {3} {x}
diff --git a/test/writer/starmath/006_subscript_and_superscript.test b/test/writer/starmath/006_subscript_and_superscript.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/006_subscript_and_superscript.test
@@ -0,0 +1,4 @@
+<<< tex
+x_i^2
+>>> starmath
+x_i^2
diff --git a/test/writer/starmath/007_superscript_with_grouped_base.test b/test/writer/starmath/007_superscript_with_grouped_base.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/007_superscript_with_grouped_base.test
@@ -0,0 +1,4 @@
+<<< tex
+(a+b)^2
+>>> starmath
+(a + b)^2
diff --git a/test/writer/starmath/008_delimited_fraction.test b/test/writer/starmath/008_delimited_fraction.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/008_delimited_fraction.test
@@ -0,0 +1,4 @@
+<<< tex
+\left(\frac{a}{b}\right)
+>>> starmath
+left ( {a over b} right )
diff --git a/test/writer/starmath/009_delimited_braces.test b/test/writer/starmath/009_delimited_braces.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/009_delimited_braces.test
@@ -0,0 +1,4 @@
+<<< tex
+\left\{\frac{a}{b}\right\}
+>>> starmath
+left lbrace {a over b} right rbrace
diff --git a/test/writer/starmath/01.test b/test/writer/starmath/01.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/01.test
@@ -0,0 +1,22 @@
+<<< native
+[ EIdentifier "x"
+, ESymbol Rel "="
+, EFraction
+    NormalFrac
+    (EGrouped
+       [ ESymbol Ord "\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" ])
+]
+>>> starmath
+x = {{- b plusminus sqrt {{b^2 - 4ac}}} over {2a}}
diff --git a/test/writer/starmath/010_absolute_value_bars_normalize_to_delimiters.test b/test/writer/starmath/010_absolute_value_bars_normalize_to_delimiters.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/010_absolute_value_bars_normalize_to_delimiters.test
@@ -0,0 +1,4 @@
+<<< tex
+|r_i| \le \varepsilon_{\mathrm{free}}
+>>> starmath
+left lline r_i right rline <= %ivarepsilon_"free"
diff --git a/test/writer/starmath/011_double_bars_normalize_to_norm_delimiters.test b/test/writer/starmath/011_double_bars_normalize_to_norm_delimiters.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/011_double_bars_normalize_to_norm_delimiters.test
@@ -0,0 +1,4 @@
+<<< tex
+\|\mathbf{A}\mathbf{n} - \mathbf{b}\|
+>>> starmath
+left ldline bold nitalic A bold nitalic n - bold nitalic b right rdline
diff --git a/test/writer/starmath/012_one_sided_delimiter_uses_none.test b/test/writer/starmath/012_one_sided_delimiter_uses_none.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/012_one_sided_delimiter_uses_none.test
@@ -0,0 +1,4 @@
+<<< tex
+\left. x \right|
+>>> starmath
+left none x right rline
diff --git a/test/writer/starmath/013_middle_delimiter_uses_mline.test b/test/writer/starmath/013_middle_delimiter_uses_mline.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/013_middle_delimiter_uses_mline.test
@@ -0,0 +1,4 @@
+<<< tex
+\left( x \middle| y \right)
+>>> starmath
+left ( x mline y right )
diff --git a/test/writer/starmath/014_operator_mapping_cdot.test b/test/writer/starmath/014_operator_mapping_cdot.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/014_operator_mapping_cdot.test
@@ -0,0 +1,4 @@
+<<< tex
+a\cdot b
+>>> starmath
+a cdot b
diff --git a/test/writer/starmath/015_binomial_nolinefrac.test b/test/writer/starmath/015_binomial_nolinefrac.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/015_binomial_nolinefrac.test
@@ -0,0 +1,4 @@
+<<< tex
+\binom{n}{k}
+>>> starmath
+left ( binom{n}{k} right )
diff --git a/test/writer/starmath/016_integral_without_limits.test b/test/writer/starmath/016_integral_without_limits.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/016_integral_without_limits.test
@@ -0,0 +1,4 @@
+<<< tex
+\int x\,dx
+>>> starmath
+int x dx
diff --git a/test/writer/starmath/017_integral_with_lower_and_upper_limits.test b/test/writer/starmath/017_integral_with_lower_and_upper_limits.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/017_integral_with_lower_and_upper_limits.test
@@ -0,0 +1,4 @@
+<<< tex
+\int_0^1 x\,dx
+>>> starmath
+int_0^1 x dx
diff --git a/test/writer/starmath/018_integral_with_infinite_upper_limit.test b/test/writer/starmath/018_integral_with_infinite_upper_limit.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/018_integral_with_infinite_upper_limit.test
@@ -0,0 +1,4 @@
+<<< tex
+\int_{0}^{\infty} e^{-x}\,dx
+>>> starmath
+int_0^infinity e^{{- x}} dx
diff --git a/test/writer/starmath/019_sum_with_lower_and_upper_limits.test b/test/writer/starmath/019_sum_with_lower_and_upper_limits.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/019_sum_with_lower_and_upper_limits.test
@@ -0,0 +1,4 @@
+<<< tex
+\sum_{i=1}^{n} i
+>>> starmath
+sum from i = 1 to n i
diff --git a/test/writer/starmath/02.test b/test/writer/starmath/02.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/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" ]))
+    ]
+]
+>>> starmath
+2 = left ( {{left ( 3 - x right ) times 2} over {3 - x}} right )
diff --git a/test/writer/starmath/020_sum_with_symbolic_term.test b/test/writer/starmath/020_sum_with_symbolic_term.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/020_sum_with_symbolic_term.test
@@ -0,0 +1,4 @@
+<<< tex
+\sum_{k=1}^{n} a_k
+>>> starmath
+sum from k = 1 to n a_k
diff --git a/test/writer/starmath/021_greek_letter_mapping.test b/test/writer/starmath/021_greek_letter_mapping.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/021_greek_letter_mapping.test
@@ -0,0 +1,4 @@
+<<< tex
+\alpha + \beta + \Gamma + \Omega
+>>> starmath
+%ialpha + %ibeta + %GAMMA + %OMEGA
diff --git a/test/writer/starmath/022_greek_variant_mapping.test b/test/writer/starmath/022_greek_variant_mapping.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/022_greek_variant_mapping.test
@@ -0,0 +1,4 @@
+<<< tex
+\phi + \varphi + \epsilon + \varepsilon + \vartheta
+>>> starmath
+%iphi + %ivarphi + %iepsilon + %ivarepsilon + %ivartheta
diff --git a/test/writer/starmath/023_arrow_mapping.test b/test/writer/starmath/023_arrow_mapping.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/023_arrow_mapping.test
@@ -0,0 +1,4 @@
+<<< tex
+x \to y, x \leftarrow y, x \Rightarrow y, x \Leftrightarrow y
+>>> starmath
+x toward y, x leftarrow y, x drarrow y, x dlrarrow y
diff --git a/test/writer/starmath/024_set_and_relation_symbol_mapping.test b/test/writer/starmath/024_set_and_relation_symbol_mapping.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/024_set_and_relation_symbol_mapping.test
@@ -0,0 +1,4 @@
+<<< tex
+A \subseteq B, A \cup B, x \in A, x \notin B
+>>> starmath
+A subseteq B, A union B, x in A, x notin B
diff --git a/test/writer/starmath/025_logic_and_calculus_symbol_mapping.test b/test/writer/starmath/025_logic_and_calculus_symbol_mapping.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/025_logic_and_calculus_symbol_mapping.test
@@ -0,0 +1,4 @@
+<<< tex
+\forall x \exists y, \nabla f = 0, \partial_t u
+>>> starmath
+forall x exists y, nabla f = 0, partial_t u
diff --git a/test/writer/starmath/026_greek_identifier_spacing_in_products.test b/test/writer/starmath/026_greek_identifier_spacing_in_products.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/026_greek_identifier_spacing_in_products.test
@@ -0,0 +1,4 @@
+<<< tex
+E_{k+1}=E_{k+\frac12}-\frac{\dot{Q}_{\text{dis},k}\Delta t}{\eta_{\text{dis}}},
+>>> starmath
+E_{{k + 1}} = E_{{k + {1 over 2}}} - {{{dot Q}_{{"dis", k}} %DELTA t} over %ieta_"dis"},
diff --git a/test/writer/starmath/027_math_operators_rendered_as_functions.test b/test/writer/starmath/027_math_operators_rendered_as_functions.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/027_math_operators_rendered_as_functions.test
@@ -0,0 +1,4 @@
+<<< tex
+E_{k+1}\leftarrow\min\!\left(E^{\text{cap}}_{\text{s}},\max(0,E_{k+1})\right).
+>>> starmath
+E_{{k + 1}} leftarrow func min left ( E_"s"^"cap", func max(0, E_{{k + 1}}) right ).
diff --git a/test/writer/starmath/028_nested_function_with_left_delimiter_spacing.test b/test/writer/starmath/028_nested_function_with_left_delimiter_spacing.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/028_nested_function_with_left_delimiter_spacing.test
@@ -0,0 +1,4 @@
+<<< tex
+P_{\text{ch}, k}=\max\!\left(0,\min\!\left(P'_{\text{pv}, k},\,P^{\text{cap}}_{\text{ch}},\,P_{\text{ch,head}, k}\right)\right).
+>>> starmath
+P_{{"ch", k}} = func max left ( 0, func min left ( P_{{"pv", k}}', P_"ch"^"cap", P_{{"ch,head", k}} right ) right ).
diff --git a/test/writer/starmath/029_quad_spacing_command.test b/test/writer/starmath/029_quad_spacing_command.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/029_quad_spacing_command.test
@@ -0,0 +1,4 @@
+<<< tex
+a,\quad b
+>>> starmath
+a, ~ b
diff --git a/test/writer/starmath/03.test b/test/writer/starmath/03.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/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"
+]
+>>> starmath
+ax^2 + bx + c = 0
diff --git a/test/writer/starmath/030_qquad_spacing_command.test b/test/writer/starmath/030_qquad_spacing_command.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/030_qquad_spacing_command.test
@@ -0,0 +1,4 @@
+<<< tex
+a,\qquad b
+>>> starmath
+a, ~~ b
diff --git a/test/writer/starmath/031_greek_token_separator_before_scripted_identifier.test b/test/writer/starmath/031_greek_token_separator_before_scripted_identifier.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/031_greek_token_separator_before_scripted_identifier.test
@@ -0,0 +1,4 @@
+<<< tex
+f_{\text{eff}}=(1-\lambda)f_{\text{m}}+\lambda f_{\text{l}}.
+>>> starmath
+f_"eff" = (1 - %ilambda) f_"m" + %ilambda f_"l".
diff --git a/test/writer/starmath/032_mathrm_text_in_subscripts_stays_quoted.test b/test/writer/starmath/032_mathrm_text_in_subscripts_stays_quoted.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/032_mathrm_text_in_subscripts_stays_quoted.test
@@ -0,0 +1,4 @@
+<<< tex
+n_{\mathrm{Fe,metal}} = n_{\mathrm{Fe_bcc}} + n_{\mathrm{Fe_fcc}}
+>>> starmath
+n_"Fe,metal" = n_{nitalic{Fe_b cc}} + n_{nitalic{Fe_f cc}}
diff --git a/test/writer/starmath/033_escaped_underscore_in_mathrm_stays_literal.test b/test/writer/starmath/033_escaped_underscore_in_mathrm_stays_literal.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/033_escaped_underscore_in_mathrm_stays_literal.test
@@ -0,0 +1,4 @@
+<<< tex
+n_{\mathrm{wus}} = n_{\mathrm{Wus\_FeO}} + n_{\mathrm{Wus\_FeO1p5}}
+>>> starmath
+n_"wus" = n_"Wus_FeO" + n_"Wus_FeO1p5"
diff --git a/test/writer/starmath/034_numeric_chemistry_subscripts_in_mathrm_stay_structural.test b/test/writer/starmath/034_numeric_chemistry_subscripts_in_mathrm_stay_structural.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/034_numeric_chemistry_subscripts_in_mathrm_stay_structural.test
@@ -0,0 +1,4 @@
+<<< tex
+\frac{n_{\mathrm{H_2O}}}{n_{\mathrm{H_2}}}\qquad \text{or} \qquad \frac{p_{\mathrm{H_2O}}}{p_{\mathrm{H_2}}}
+>>> starmath
+{n_{nitalic{H_2 O}} over n_{nitalic{H_2}}}~~ "or"~~ {p_{nitalic{H_2 O}} over p_{nitalic{H_2}}}
diff --git a/test/writer/starmath/035_circ_operator_maps_to_starmath_command.test b/test/writer/starmath/035_circ_operator_maps_to_starmath_command.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/035_circ_operator_maps_to_starmath_command.test
@@ -0,0 +1,4 @@
+<<< tex
+\mu_i^\circ(T, P^\circ)
+>>> starmath
+%imu_i^circ(T, P^circ)
diff --git a/test/writer/starmath/036_min_with_bold_limit_variable_uses_operator_limits.test b/test/writer/starmath/036_min_with_bold_limit_variable_uses_operator_limits.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/036_min_with_bold_limit_variable_uses_operator_limits.test
@@ -0,0 +1,4 @@
+<<< tex
+\min_{\mathbf{n}}\; G(\mathbf{n})
+>>> starmath
+{func min} csub {bold nitalic n} G(bold nitalic n)
diff --git a/test/writer/starmath/037_identifier_before_function_gets_separator.test b/test/writer/starmath/037_identifier_before_function_gets_separator.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/037_identifier_before_function_gets_separator.test
@@ -0,0 +1,4 @@
+<<< tex
+\mu_i(T,P,\mathbf{n}) = \mu_i^\circ(T,P^\circ) + RT\ln\left(\frac{y_i P}{P^\circ}\right)
+>>> starmath
+%imu_i(T, P, bold nitalic n) = %imu_i^circ(T, P^circ) + RT ln left ( {{y_i P} over P^circ} right )
diff --git a/test/writer/starmath/038_greek_identifier_before_punctuation_gets_separator.test b/test/writer/starmath/038_greek_identifier_before_punctuation_gets_separator.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/038_greek_identifier_before_punctuation_gets_separator.test
@@ -0,0 +1,4 @@
+<<< tex
+\xi.
+>>> starmath
+%ixi .
diff --git a/test/writer/starmath/039_greek_identifier_before_punctuation_in_larger_expression.test b/test/writer/starmath/039_greek_identifier_before_punctuation_in_larger_expression.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/039_greek_identifier_before_punctuation_in_larger_expression.test
@@ -0,0 +1,4 @@
+<<< tex
+(\mathbf{H}+\lambda\mathbf{I})\Delta\mathbf{z} = -\nabla\phi.
+>>> starmath
+(bold nitalic H + %ilambda bold nitalic I) %DELTA bold nitalic z = -nabla %iphi .
diff --git a/test/writer/starmath/04.test b/test/writer/starmath/04.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/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")
+]
+>>> starmath
+S_"new" = S_"old" - {{left ( 5 - T right )}^2 over 2}
diff --git a/test/writer/starmath/040_bare_recognized_math_operators_omit_func_and_keep_spacing.test b/test/writer/starmath/040_bare_recognized_math_operators_omit_func_and_keep_spacing.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/040_bare_recognized_math_operators_omit_func_and_keep_spacing.test
@@ -0,0 +1,4 @@
+<<< tex
+\min x\log x\operatorname{log} x\sin x\cos x\max x\cosh x\sinh x\cot x\ln x\exp x
+>>> starmath
+func min x log x log x sin x cos x func max x cosh x sinh x cot x ln x exp x
diff --git a/test/writer/starmath/041_ordinary_function_with_subscript_keeps_ordinary_script_syntax.test b/test/writer/starmath/041_ordinary_function_with_subscript_keeps_ordinary_script_syntax.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/041_ordinary_function_with_subscript_keeps_ordinary_script_syntax.test
@@ -0,0 +1,4 @@
+<<< tex
+\Delta\log_{10}K_j = \log_{10}K_{j,\mathrm{FPROPS}} - \log_{10}K_{j,\mathrm{ref}},\qquad j=1,\dots,r.
+>>> starmath
+%DELTA log_10 K_j = log_10 K_{{j, "FPROPS"}} - log_10 K_{{j, "ref"}}, ~~ j = 1, dotslow , r.
diff --git a/test/writer/starmath/042_adjacent_bold_terms_get_separator.test b/test/writer/starmath/042_adjacent_bold_terms_get_separator.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/042_adjacent_bold_terms_get_separator.test
@@ -0,0 +1,4 @@
+<<< tex
+\mathcal{L}(\mathbf{n},\boldsymbol\lambda,\mathbf{s}) = G(\mathbf{n}) + \boldsymbol\lambda^T(\mathbf{A}\mathbf{n}-\mathbf{b}) - \mathbf{s}^T\mathbf{n}.
+>>> starmath
+nitalic ℒ(bold nitalic n, bold {%ilambda}, bold nitalic s) = G(bold nitalic n) + {bold {%ilambda}}^T(bold nitalic A bold nitalic n - bold nitalic b) - {bold nitalic s}^T bold nitalic n.
diff --git a/test/writer/starmath/043_mathcal_styled_token_before_left_delimiter.test b/test/writer/starmath/043_mathcal_styled_token_before_left_delimiter.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/043_mathcal_styled_token_before_left_delimiter.test
@@ -0,0 +1,4 @@
+<<< tex
+\min\ \mathcal{J}\left(P^{\text{cap}}_{\text{pv}},N_{\text{u}},P^{\text{cap}}_{\text{eb}}\right)
+>>> starmath
+func min nitalic 𝒥 left ( P_"pv"^"cap", N_"u", P_"eb"^"cap" right )
diff --git a/test/writer/starmath/044_leading_binary_operator_gets_neutral_lhs.test b/test/writer/starmath/044_leading_binary_operator_gets_neutral_lhs.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/044_leading_binary_operator_gets_neutral_lhs.test
@@ -0,0 +1,4 @@
+<<< tex
+\times\Delta t
+>>> starmath
+{} times %DELTA t
diff --git a/test/writer/starmath/045_standalone_binary_operator_gets_neutral_operands.test b/test/writer/starmath/045_standalone_binary_operator_gets_neutral_operands.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/045_standalone_binary_operator_gets_neutral_operands.test
@@ -0,0 +1,4 @@
+<<< tex
+\times
+>>> starmath
+{} times {}
diff --git a/test/writer/starmath/046_trailing_binary_operator_gets_neutral_rhs.test b/test/writer/starmath/046_trailing_binary_operator_gets_neutral_rhs.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/046_trailing_binary_operator_gets_neutral_rhs.test
@@ -0,0 +1,4 @@
+<<< tex
+a\times
+>>> starmath
+a times {}
diff --git a/test/writer/starmath/047_standalone_relation_gets_neutral_operands.test b/test/writer/starmath/047_standalone_relation_gets_neutral_operands.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/047_standalone_relation_gets_neutral_operands.test
@@ -0,0 +1,4 @@
+<<< tex
+\leq
+>>> starmath
+{} <= {}
diff --git a/test/writer/starmath/048_standalone_arrow_gets_neutral_operands.test b/test/writer/starmath/048_standalone_arrow_gets_neutral_operands.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/048_standalone_arrow_gets_neutral_operands.test
@@ -0,0 +1,4 @@
+<<< tex
+\rightarrow
+>>> starmath
+{} toward {}
diff --git a/test/writer/starmath/049_subscript_only_fragment_gets_neutral_base.test b/test/writer/starmath/049_subscript_only_fragment_gets_neutral_base.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/049_subscript_only_fragment_gets_neutral_base.test
@@ -0,0 +1,4 @@
+<<< tex
+_2
+>>> starmath
+{}_2
diff --git a/test/writer/starmath/05.test b/test/writer/starmath/05.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/05.test
@@ -0,0 +1,33 @@
+<<< 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"
+, ESymbol Open "("
+, EIdentifier "y"
+, ESymbol Close ")"
+, 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"
+, ESymbol Open "("
+, EIdentifier "y"
+, ESymbol Close ")"
+, ESymbol Open "("
+, EIdentifier "x"
+, ESymbol Bin "\8722"
+, EIdentifier "y"
+, ESymbol Close ")"
+, ESpace (1 % 6)
+, EIdentifier "d"
+, EIdentifier "y"
+]
+>>> starmath
+int_a^x int_a^s f(y) dy ds = int_a^x f(y)(x - y) dy
diff --git a/test/writer/starmath/050_superscript_only_fragment_gets_neutral_base.test b/test/writer/starmath/050_superscript_only_fragment_gets_neutral_base.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/050_superscript_only_fragment_gets_neutral_base.test
@@ -0,0 +1,4 @@
+<<< tex
+^+
+>>> starmath
+{}^{{} + {}}
diff --git a/test/writer/starmath/051_grouped_subscript_only_fragment_gets_neutral_base.test b/test/writer/starmath/051_grouped_subscript_only_fragment_gets_neutral_base.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/051_grouped_subscript_only_fragment_gets_neutral_base.test
@@ -0,0 +1,4 @@
+<<< tex
+_{j,\mathrm{ref}}
+>>> starmath
+{}_{{j, "ref"}}
diff --git a/test/writer/starmath/052_matrix_environment.test b/test/writer/starmath/052_matrix_environment.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/052_matrix_environment.test
@@ -0,0 +1,4 @@
+<<< tex
+\begin{matrix}a&b\\c&d\end{matrix}
+>>> starmath
+matrix { a # b ## c # d }
diff --git a/test/writer/starmath/053_pmatrix_environment.test b/test/writer/starmath/053_pmatrix_environment.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/053_pmatrix_environment.test
@@ -0,0 +1,4 @@
+<<< tex
+\begin{pmatrix}a&b\\c&d\end{pmatrix}
+>>> starmath
+left ( matrix { a # b ## c # d } right )
diff --git a/test/writer/starmath/054_bmatrix_environment.test b/test/writer/starmath/054_bmatrix_environment.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/054_bmatrix_environment.test
@@ -0,0 +1,4 @@
+<<< tex
+\begin{bmatrix}a&b\\c&d\end{bmatrix}
+>>> starmath
+left [ matrix { a # b ## c # d } right ]
diff --git a/test/writer/starmath/055_vmatrix_environment.test b/test/writer/starmath/055_vmatrix_environment.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/055_vmatrix_environment.test
@@ -0,0 +1,4 @@
+<<< tex
+\begin{vmatrix}a&b\\c&d\end{vmatrix}
+>>> starmath
+left lline matrix { a # b ## c # d } right rline
diff --git a/test/writer/starmath/056_vmatrix_environment.test b/test/writer/starmath/056_vmatrix_environment.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/056_vmatrix_environment.test
@@ -0,0 +1,4 @@
+<<< tex
+\begin{Vmatrix}a&b\\c&d\end{Vmatrix}
+>>> starmath
+left ldline matrix { a # b ## c # d } right rdline
diff --git a/test/writer/starmath/057_array_with_left_right_alignment.test b/test/writer/starmath/057_array_with_left_right_alignment.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/057_array_with_left_right_alignment.test
@@ -0,0 +1,4 @@
+<<< tex
+\begin{array}{lr}a&bbb\\ccc&d\end{array}
+>>> starmath
+matrix { alignl a # alignr bbb ## alignl ccc # alignr d }
diff --git a/test/writer/starmath/058_aligned_array_keeps_fractions_centered.test b/test/writer/starmath/058_aligned_array_keeps_fractions_centered.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/058_aligned_array_keeps_fractions_centered.test
@@ -0,0 +1,4 @@
+<<< tex
+\begin{array}{l}\frac{AAA}{B}\end{array}
+>>> starmath
+matrix { alignl {{alignc {AAA}} over {alignc B}} }
diff --git a/test/writer/starmath/059_cases_environment.test b/test/writer/starmath/059_cases_environment.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/059_cases_environment.test
@@ -0,0 +1,4 @@
+<<< tex
+\begin{cases}a, & x>0\\ b, & x\le 0\end{cases}
+>>> starmath
+left lbrace matrix { alignl a, # alignl x > 0 ## alignl b, # alignl x <= 0 } right none
diff --git a/test/writer/starmath/06.test b/test/writer/starmath/06.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/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"))
+           ]
+       ])
+]
+>>> starmath
+sum from m = 1 to infinity sum from n = 1 to infinity {{m^2 n} over {3^m left ( m 3^n + n 3^m right )}}
diff --git a/test/writer/starmath/060_cases_with_negative_log_fraction.test b/test/writer/starmath/060_cases_with_negative_log_fraction.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/060_cases_with_negative_log_fraction.test
@@ -0,0 +1,4 @@
+<<< tex
+t_{\text{pb,disc}}=\begin{cases}\dfrac{C_{\text{tot}}}{B}, & r=0,\\\dfrac{-\ln\!\left(1-rC_{\text{tot}}/B\right)}{\ln(1+r)}, & r>0\text{ and }1-rC_{\text{tot}}/B>0,\\\infty, & \text{otherwise}.\end{cases}
+>>> starmath
+t_"pb,disc" = left lbrace matrix { alignl {{alignc {C_"tot"}} over {alignc B}}, # alignl r = 0, ## alignl {{alignc {- ln left ( 1 - rC_"tot" / B right )}} over {alignc {ln(1 + r)}}}, # alignl r > 0" and "1 - rC_"tot" / B > 0, ## alignl infinity, # alignl "otherwise". } right none
diff --git a/test/writer/starmath/061_phantom_alignment.test b/test/writer/starmath/061_phantom_alignment.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/061_phantom_alignment.test
@@ -0,0 +1,7 @@
+<<< tex
+\begin{gathered}
+x + y = 2x + y - x \\
+\phantom{x+y} = 3x + y - 2x
+\end{gathered}
+>>> starmath
+matrix { x + y = 2x + y - x ## phantom {x + y} = 3x + y - 2x }
diff --git a/test/writer/starmath/062_fallback_to_tex_for_under_over_constructs.test b/test/writer/starmath/062_fallback_to_tex_for_under_over_constructs.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/062_fallback_to_tex_for_under_over_constructs.test
@@ -0,0 +1,4 @@
+<<< tex
+\underbrace{x+y}_{z}+\overbrace{x+y}^{z}
+>>> starmath
+{x + y} underbrace z + {x + y} overbrace z
diff --git a/test/writer/starmath/063_demorgans_law.test b/test/writer/starmath/063_demorgans_law.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/063_demorgans_law.test
@@ -0,0 +1,5 @@
+<<< tex
+\neg(p\wedge q)\iff(\neg p)\vee(\neg q)
+  \overline{\bigcup_{i=1}^{n} A_{i}}=\bigcap_{i=1}^{n} \overline{A_{i}}
+>>> starmath
+neg (p and q) dlrarrow (neg p) or (neg q) overline {{oper ∪ from i = 1 to n A_i}} = oper ∩ from i = 1 to n overline {A_i}
diff --git a/test/writer/starmath/063_extensible_arrows_use_centered_scripts.test b/test/writer/starmath/063_extensible_arrows_use_centered_scripts.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/063_extensible_arrows_use_centered_scripts.test
@@ -0,0 +1,10 @@
+<<< native
+[ EIdentifier "X"
+, EOver False (ESymbol Op "\8660") (EIdentifier "h")
+, EIdentifier "Y"
+, EUnderover
+    False (ESymbol Op "\8658") (EIdentifier "k") (EGrouped [])
+, EIdentifier "Z"
+]
+>>> starmath
+X dlrarrow csup {h} Y drarrow csub {k} Z
diff --git a/test/writer/starmath/064_centered_array_omits_explicit_alignc.test b/test/writer/starmath/064_centered_array_omits_explicit_alignc.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/064_centered_array_omits_explicit_alignc.test
@@ -0,0 +1,13 @@
+<<< native
+[ EArray
+    [ AlignCenter , AlignCenter ]
+    [ [ [ EIdentifier "a" ]
+      , [ EIdentifier "b" ]
+      ]
+    , [ [ EIdentifier "c" ]
+      , [ EIdentifier "d" ]
+      ]
+    ]
+]
+>>> starmath
+matrix { a # b ## c # d }
diff --git a/test/writer/starmath/065_reserved_word_in_uptext_subscript_is_quoted.test b/test/writer/starmath/065_reserved_word_in_uptext_subscript_is_quoted.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/065_reserved_word_in_uptext_subscript_is_quoted.test
@@ -0,0 +1,4 @@
+<<< tex
+y_{\mathrm{H_2,in}} = 1
+>>> starmath
+y_{nitalic{H_2,"in"}} = 1
diff --git a/test/writer/starmath/066_standalone_plus_minus_scripts_get_neutral_operands.test b/test/writer/starmath/066_standalone_plus_minus_scripts_get_neutral_operands.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/066_standalone_plus_minus_scripts_get_neutral_operands.test
@@ -0,0 +1,4 @@
+<<< tex
+r_{r,e}=r_{r,e}^{+}-r_{r,e}^{-}
+>>> starmath
+r_{{r, e}} = r_{{r, e}}^{{} + {}} - r_{{r, e}}^{{} - {}}
diff --git a/test/writer/starmath/067_integral_default_limits_use_scripts.test b/test/writer/starmath/067_integral_default_limits_use_scripts.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/067_integral_default_limits_use_scripts.test
@@ -0,0 +1,4 @@
+<<< tex
+\int_0^1 f(x)\,dx
+>>> starmath
+int_0^1 f(x) dx
diff --git a/test/writer/starmath/068_integral_limits_use_from_to.test b/test/writer/starmath/068_integral_limits_use_from_to.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/068_integral_limits_use_from_to.test
@@ -0,0 +1,4 @@
+<<< tex
+\int\limits_0^1 f(x)\,dx
+>>> starmath
+int from 0 to 1 f(x) dx
diff --git a/test/writer/starmath/069_integral_nolimits_use_scripts.test b/test/writer/starmath/069_integral_nolimits_use_scripts.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/069_integral_nolimits_use_scripts.test
@@ -0,0 +1,4 @@
+<<< tex
+\int\nolimits_0^1 f(x)\,dx
+>>> starmath
+int_0^1 f(x) dx
diff --git a/test/writer/starmath/07.test b/test/writer/starmath/07.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/07.test
@@ -0,0 +1,27 @@
+<<< native
+[ ESuper (EIdentifier "u") (ESymbol Pun "\8243")
+, ESymbol Bin "+"
+, EIdentifier "p"
+, ESymbol Open "("
+, EIdentifier "x"
+, ESymbol Close ")"
+, ESuper (EIdentifier "u") (ESymbol Pun "\8242")
+, ESymbol Bin "+"
+, EIdentifier "q"
+, ESymbol Open "("
+, EIdentifier "x"
+, ESymbol Close ")"
+, EIdentifier "u"
+, ESymbol Rel "="
+, EIdentifier "f"
+, ESymbol Open "("
+, EIdentifier "x"
+, ESymbol Close ")"
+, ESymbol Pun ","
+, ESpace (1 % 1)
+, EIdentifier "x"
+, ESymbol Rel ">"
+, EIdentifier "a"
+]
+>>> starmath
+u'' + p(x) u' + q(x) u = f(x), ~ x > a
diff --git a/test/writer/starmath/070_normal_fraction_display_inline_uses_inline_size.test b/test/writer/starmath/070_normal_fraction_display_inline_uses_inline_size.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/070_normal_fraction_display_inline_uses_inline_size.test
@@ -0,0 +1,4 @@
+<<< native
+[ EFraction NormalFrac (EIdentifier "a") (EIdentifier "b") ]
+>>> starmath-inline
+size*0.7 {a over b}
diff --git a/test/writer/starmath/071_grouped_mathrm_alpha_subscripts_stay_structural.test b/test/writer/starmath/071_grouped_mathrm_alpha_subscripts_stay_structural.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/071_grouped_mathrm_alpha_subscripts_stay_structural.test
@@ -0,0 +1,4 @@
+<<< tex
+n_{\mathrm{Fe_{bcc}}} + n_{\mathrm{Fe_{fcc}}}
+>>> starmath
+n_{nitalic{Fe_bcc}} + n_{nitalic{Fe_fcc}}
diff --git a/test/writer/starmath/08.test b/test/writer/starmath/08.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/08.test
@@ -0,0 +1,32 @@
+<<< native
+[ ESymbol Open "|"
+, EOver False (EIdentifier "z") (ESymbol Accent "\8254")
+, ESymbol Open "|"
+, ESymbol Rel "="
+, ESymbol Open "|"
+, EIdentifier "z"
+, ESymbol Open "|"
+, ESymbol Pun ","
+, ESymbol Open "|"
+, ESymbol Open "("
+, EOver False (EIdentifier "z") (ESymbol Accent "\8254")
+, ESuper (ESymbol Close ")") (EIdentifier "n")
+, ESymbol Open "|"
+, ESymbol Rel "="
+, ESymbol Open "|"
+, EIdentifier "z"
+, ESuper (ESymbol Open "|") (EIdentifier "n")
+, ESymbol Pun ","
+, EMathOperator "arg"
+, ESymbol Open "("
+, ESuper (EIdentifier "z") (EIdentifier "n")
+, ESymbol Close ")"
+, ESymbol Rel "="
+, EIdentifier "n"
+, EMathOperator "arg"
+, ESymbol Open "("
+, EIdentifier "z"
+, ESymbol Close ")"
+]
+>>> starmath
+left lline bar z right rline = left lline z right rline, left lline (bar z )^n right rline = {left lline z right rline}^n, func arg(z^n) = n func arg(z)
diff --git a/test/writer/starmath/09.test b/test/writer/starmath/09.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/09.test
@@ -0,0 +1,21 @@
+<<< native
+[ EUnder
+    True
+    (EMathOperator "lim")
+    (EGrouped
+       [ EIdentifier "z"
+       , ESymbol Rel "\8594"
+       , ESub (EIdentifier "z") (ENumber "0")
+       ])
+, EIdentifier "f"
+, ESymbol Open "("
+, EIdentifier "z"
+, ESymbol Close ")"
+, ESymbol Rel "="
+, EIdentifier "f"
+, ESymbol Open "("
+, ESub (EIdentifier "z") (ENumber "0")
+, ESymbol Close ")"
+]
+>>> starmath
+lim from z toward z_0 f(z) = f(z_0)
diff --git a/test/writer/starmath/10.test b/test/writer/starmath/10.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/10.test
@@ -0,0 +1,51 @@
+<<< native
+[ ESub (EIdentifier "\981") (EIdentifier "n")
+, ESymbol Open "("
+, EIdentifier "\954"
+, ESymbol Close ")"
+, 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"
+       , ESymbol Open "("
+       , EIdentifier "\954"
+       , EIdentifier "R"
+       , ESymbol Close ")"
+       ])
+    (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")
+              , ESymbol Open "("
+              , EIdentifier "R"
+              , ESymbol Close ")"
+              ])
+           (EGrouped [ ESymbol Ord "\8706" , EIdentifier "R" ]))
+    ]
+, ESpace (1 % 6)
+, EIdentifier "d"
+, EIdentifier "R"
+]
+>>> starmath
+%iphi_n(%ikappa) = {1 over {4%ipi^2 %ikappa^2}}int_0^infinity {{sin(%ikappa R)} over {%ikappa R}}{partial over {partial R}}left [ R^2{{partial D_n(R)} over {partial R}} right ] dR
diff --git a/test/writer/starmath/11.test b/test/writer/starmath/11.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/11.test
@@ -0,0 +1,28 @@
+<<< native
+[ ESub (EIdentifier "\981") (EIdentifier "n")
+, ESymbol Open "("
+, EIdentifier "\954"
+, ESymbol Close ")"
+, ESymbol Rel "="
+, ENumber "0.033"
+, ESubsup (EIdentifier "C") (EIdentifier "n") (ENumber "2")
+, ESuper
+    (EIdentifier "\954")
+    (EGrouped
+       [ ESymbol Ord "\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"))
+]
+>>> starmath
+%iphi_n(%ikappa) = 0.033C_n^2 %ikappa^{{- 11 / 3}}, ~ {1 over L_0} ll %ikappa ll {1 over l_0}
diff --git a/test/writer/starmath/12.test b/test/writer/starmath/12.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/12.test
@@ -0,0 +1,35 @@
+<<< native
+[ EIdentifier "f"
+, ESymbol Open "("
+, EIdentifier "x"
+, ESymbol Close ")"
+, ESymbol Rel "="
+, EDelimited
+    "{"
+    ""
+    [ Right
+        (EArray
+           [ AlignLeft , AlignLeft ]
+           [ [ [ ENumber "1" ]
+             , [ ESymbol Ord "\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" ]
+             ]
+           ])
+    ]
+]
+>>> starmath
+f(x) = left lbrace matrix { alignl 1 # alignl - 1 <= x < 0 ## alignl {{alignc 1} over {alignc 2}} # alignl x = 0 ## alignl 1 - x^2 # alignl "otherwise" } right none
diff --git a/test/writer/starmath/13.test b/test/writer/starmath/13.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/13.test
@@ -0,0 +1,51 @@
+<<< native
+[ ESub (EGrouped []) (EIdentifier "p")
+, ESub (EIdentifier "F") (EIdentifier "q")
+, ESymbol Open "("
+, ESub (EIdentifier "a") (ENumber "1")
+, ESymbol Pun ","
+, ESymbol Ord "\8230"
+, ESymbol Pun ","
+, ESub (EIdentifier "a") (EIdentifier "p")
+, ESymbol Pun ";"
+, ESub (EIdentifier "c") (ENumber "1")
+, ESymbol Pun ","
+, ESymbol Ord "\8230"
+, ESymbol Pun ","
+, ESub (EIdentifier "c") (EIdentifier "q")
+, ESymbol Pun ";"
+, EIdentifier "z"
+, ESymbol Close ")"
+, ESymbol Rel "="
+, EUnderover
+    True
+    (ESymbol Op "\8721")
+    (EGrouped [ EIdentifier "n" , ESymbol Rel "=" , ENumber "0" ])
+    (ESymbol Ord "\8734")
+, EFraction
+    NormalFrac
+    (EGrouped
+       [ ESymbol Open "("
+       , ESub (EIdentifier "a") (ENumber "1")
+       , ESub (ESymbol Close ")") (EIdentifier "n")
+       , ESymbol Ord "\8943"
+       , ESymbol Open "("
+       , ESub (EIdentifier "a") (EIdentifier "p")
+       , ESub (ESymbol Close ")") (EIdentifier "n")
+       ])
+    (EGrouped
+       [ ESymbol Open "("
+       , ESub (EIdentifier "c") (ENumber "1")
+       , ESub (ESymbol Close ")") (EIdentifier "n")
+       , ESymbol Ord "\8943"
+       , ESymbol Open "("
+       , ESub (EIdentifier "c") (EIdentifier "q")
+       , ESub (ESymbol Close ")") (EIdentifier "n")
+       ])
+, EFraction
+    NormalFrac
+    (ESuper (EIdentifier "z") (EIdentifier "n"))
+    (EGrouped [ EIdentifier "n" , ESymbol Ord "!" ])
+]
+>>> starmath
+{}_p F_q(a_1, dotslow , a_p; c_1, dotslow , c_q; z) = sum from n = 0 to infinity {{(a_1 )_n dotsaxis (a_p )_n} over {(c_1 )_n dotsaxis (c_q )_n}}{z^n over {n ! }}
diff --git a/test/writer/starmath/14.test b/test/writer/starmath/14.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/14.test
@@ -0,0 +1,7 @@
+<<< native
+[ EFraction NormalFrac (EIdentifier "a") (EIdentifier "b")
+, ESpace (2 % 9)
+, EFraction InlineFrac (EIdentifier "a") (EIdentifier "b")
+]
+>>> starmath
+{a over b} size*0.7 {a over b}
diff --git a/test/writer/starmath/15.test b/test/writer/starmath/15.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/15.test
@@ -0,0 +1,4 @@
+<<< native
+[ EFraction NormalFrac (EIdentifier "a") (ENumber "2") ]
+>>> starmath
+{a over 2}
diff --git a/test/writer/starmath/16.test b/test/writer/starmath/16.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/16.test
@@ -0,0 +1,4 @@
+<<< native
+[ ENumber "3" , ESymbol Bin "\215" , ENumber "4" ]
+>>> starmath
+3 times 4
diff --git a/test/writer/starmath/17.test b/test/writer/starmath/17.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/17.test
@@ -0,0 +1,11 @@
+<<< native
+[ EIdentifier "x"
+, ESymbol Bin "*"
+, ENumber "4"
+, ESymbol Rel "="
+, ENumber "4"
+, ESymbol Bin "*"
+, EIdentifier "x"
+]
+>>> starmath
+x*4 = 4*x
diff --git a/test/writer/starmath/18.test b/test/writer/starmath/18.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/18.test
@@ -0,0 +1,4 @@
+<<< native
+[ ENumber "1.3" , ESymbol Bin "\215" , ENumber ".2" ]
+>>> starmath
+1.3 times .2
diff --git a/test/writer/starmath/19.test b/test/writer/starmath/19.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/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" ] ]
+           ])
+    ]
+]
+>>> starmath
+left [ matrix { {{partial x_1} over {partial y_1}} # {{partial x_2} over {partial y_1}} ## {} # {} ## {{partial x_1} over {partial y_2}} # {{partial x_2} over {partial y_2}} } right ] left ( matrix { 1 # 2 ## 3 # 4 } right ) left lbrace matrix { 1 # 2 ## 3 # 4 } right rbrace left lline matrix { 1 # 2 ## 3 # 4 } right rline left ldline matrix { 1 # 2 ## 3 # 4 } right rdline
diff --git a/test/writer/starmath/20.test b/test/writer/starmath/20.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/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" ]
+]
+>>> starmath
+nitalic {𝒜 ℬ 𝒞 𝒟 ℰ ℱ 𝒢 ℋ ℐ 𝒥 𝒦 ℒ ℳ 𝒩 𝒪 𝒫 𝒬 ℛ 𝒮 𝒯 𝒰 𝒱 𝒲 𝒳 𝒴 𝒵 𝒶 𝒷 𝒸 𝒹 ℯ 𝒻 ℊ 𝒽 𝒾 𝒿 𝓀 𝓁 𝓂 𝓃 ℴ 𝓅 𝓆 𝓇 𝓈 𝓉 𝓊 𝓋 𝓌 𝓍 𝓎 𝓏} nitalic {𝔸 𝔹 ℂ 𝔻 𝔼 𝔽 𝔾 ℍ 𝕀 𝕁 𝕂 𝕃 𝕄 ℕ 𝕆 ℙ ℚ ℝ 𝕊 𝕋 𝕌 𝕍 𝕎 𝕏 𝕐 ℤ 𝕒 𝕓 𝕔 𝕕 𝕖 𝕗 𝕘 𝕙 𝕚 𝕛 𝕜 𝕝 𝕞 𝕟 𝕠 𝕡 𝕢 𝕣 𝕤 𝕥 𝕦 𝕧 𝕨 𝕩 𝕪 𝕫 𝟘 𝟙 𝟚 𝟛 𝟜 𝟝 𝟞 𝟟 𝟠 𝟡 𝟘}
diff --git a/test/writer/starmath/21.test b/test/writer/starmath/21.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/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")
+]
+>>> starmath
+e_1 = b^2 + c^22
diff --git a/test/writer/starmath/22.test b/test/writer/starmath/22.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/22.test
@@ -0,0 +1,256 @@
+<<< 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
+            TextNormal
+            [ 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"
+            ]
+        ]
+      ]
+    ]
+]
+>>> starmath
+matrix { alignl font fixed "textrm" # alignl "ABCabc" ## alignl font fixed "mathrm" # alignl "ABCabc" ## alignl font fixed "mathup" # alignl "ABCabc" ## alignl font fixed "text" # alignl "ABCabc" ## alignl font fixed "mbox" # alignl "ABCabc" ## alignl font fixed "mathbf" # alignl bold nitalic {ABCabc} ## alignl font fixed "mathbfup" # alignl bold nitalic {ABCabc} ## alignl font fixed "textbf" # alignl bold {"ABCabc"} ## alignl font fixed "mathit" # alignl ital {ABCabc} ## alignl font fixed "textit" # alignl ital {ABCabc} ## alignl font fixed "mathtt" # alignl font fixed nitalic {ABCabc} ## alignl font fixed "texttt" # alignl font fixed "ABCabc" ## alignl font fixed "mathsf" # alignl font sans nitalic {ABCabc} ## alignl font fixed "mathsfup" # alignl font sans nitalic {ABCabc} ## alignl font fixed "mathbb" # alignl nitalic {𝔸𝔹ℂ𝕒𝕓𝕔} ## alignl font fixed "mathcal" # alignl nitalic {𝒜ℬ𝒞𝒶𝒷𝒸} ## alignl font fixed "mathscr" # alignl nitalic {𝒜ℬ𝒞𝒶𝒷𝒸} ## alignl font fixed "mathfrak" # alignl nitalic {𝔄𝔅ℭ𝔞𝔟𝔠} ## alignl font fixed "mathbfit" # alignl bold {ital {ABCabc}} ## alignl font fixed "mathbfsfup" # alignl bold {font sans nitalic {ABCabc}} ## alignl font fixed "mathbfsfit" # alignl bold {font sans ital {ABCabc}} ## alignl font fixed "mathbfscr" # alignl nitalic {𝓐𝓑𝓒𝓪𝓫𝓬} ## alignl font fixed "mathbffrak" # alignl nitalic {𝕬𝕭𝕮𝖆𝖇𝖈} ## alignl font fixed "mathbfcal" # alignl nitalic {𝓐𝓑𝓒𝓪𝓫𝓬} ## alignl font fixed "mathsfit" # alignl font sans ital {ABCabc} }
diff --git a/test/writer/starmath/23.test b/test/writer/starmath/23.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/23.test
@@ -0,0 +1,4 @@
+<<< native
+[ ENumber "1" , ESymbol Ord "." ]
+>>> starmath
+1.
diff --git a/test/writer/starmath/axiom_of_power_set.test b/test/writer/starmath/axiom_of_power_set.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/axiom_of_power_set.test
@@ -0,0 +1,31 @@
+<<< 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)
+, ESymbol Open "["
+, EIdentifier "B"
+, ESymbol Rel "\8712"
+, EIdentifier "P"
+, ESymbol Rel "\8660"
+, ESymbol Op "\8704"
+, EIdentifier "C"
+, ESpace (1 % 6)
+, ESymbol Open "("
+, EIdentifier "C"
+, ESymbol Rel "\8712"
+, EIdentifier "B"
+, ESymbol Rel "\8658"
+, EIdentifier "C"
+, ESymbol Rel "\8712"
+, EIdentifier "A"
+, ESymbol Close ")"
+, ESymbol Close "]"
+]
+>>> starmath
+forall A exists P forall B [B in P dlrarrow forall C (C in B drarrow C in A)]
diff --git a/test/writer/starmath/binomial_coefficient.test b/test/writer/starmath/binomial_coefficient.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/binomial_coefficient.test
@@ -0,0 +1,41 @@
+<<< native
+[ EStyled TextNormal [ EStyled TextBold [ EIdentifier "C" ] ]
+, ESymbol Open "("
+, EIdentifier "n"
+, ESymbol Pun ","
+, EIdentifier "k"
+, ESymbol Close ")"
+, ESymbol Rel "="
+, ESubsup
+    (EStyled TextNormal [ EStyled TextBold [ EIdentifier "C" ] ])
+    (EIdentifier "k")
+    (EIdentifier "n")
+, ESymbol Rel "="
+, ESub (EGrouped []) (EIdentifier "n")
+, ESub
+    (EStyled TextNormal [ 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)
+       , ESymbol Open "("
+       , EIdentifier "n"
+       , ESymbol Bin "\8722"
+       , EIdentifier "k"
+       , ESymbol Close ")"
+       , ESymbol Ord "!"
+       ])
+]
+>>> starmath
+bold nitalic C(n, k) = {bold nitalic C}_k^n = {}_n {bold nitalic C}_k = left ( binom{n}{k} right ) = {{n ! } over {k ! (n - k) ! }}
diff --git a/test/writer/starmath/boxed.test b/test/writer/starmath/boxed.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/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")
+       ])
+]
+>>> starmath
+\boxed{x^{2} + y^{2} + z^{2}}
diff --git a/test/writer/starmath/cancel.test b/test/writer/starmath/cancel.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/cancel.test
@@ -0,0 +1,12 @@
+<<< native
+[ EBoxed
+    (EGrouped
+       [ ECancel ForwardSlash (EIdentifier "x")
+       , ESymbol Bin "+"
+       , ECancel BackSlash (EIdentifier "y")
+       , ESymbol Rel "="
+       , ECancel XSlash (EIdentifier "z")
+       ])
+]
+>>> starmath
+\boxed{\cancel{x} + \bcancel{y} = \xcancel{z}}
diff --git a/test/writer/starmath/choose.test b/test/writer/starmath/choose.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/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" ]))
+              ]))
+    ]
+]
+>>> starmath
+left ( binom{a}{left lbrace binom{b}{c + 2} right rbrace} right )
diff --git a/test/writer/starmath/complex_number.test b/test/writer/starmath/complex_number.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/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")
+]
+>>> starmath
+c = {a underbrace "real" + {b nitalic i} underbrace "imaginary"} overbrace "complex number"
diff --git a/test/writer/starmath/cospan.test b/test/writer/starmath/cospan.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/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"
+]
+>>> starmath
+B toward csub {f} A leftarrow csub {f} C
diff --git a/test/writer/starmath/deMorgans_law.test b/test/writer/starmath/deMorgans_law.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/deMorgans_law.test
@@ -0,0 +1,41 @@
+<<< native
+[ ESymbol Op "\172"
+, ESymbol Open "("
+, EIdentifier "p"
+, ESymbol Bin "\8743"
+, EIdentifier "q"
+, ESymbol Close ")"
+, ESymbol Rel "\8660"
+, ESymbol Open "("
+, ESymbol Op "\172"
+, EIdentifier "p"
+, ESymbol Close ")"
+, ESymbol Bin "\8744"
+, ESymbol Open "("
+, ESymbol Op "\172"
+, EIdentifier "q"
+, ESymbol Close ")"
+, 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")
+]
+>>> starmath
+neg (p and q) dlrarrow (neg p) or (neg q) overline {{oper ∪ from i = 1 to n A_i}} = oper ∩ from i = 1 to n overline {A_i}
diff --git a/test/writer/starmath/differentiable_manifold.test b/test/writer/starmath/differentiable_manifold.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/differentiable_manifold.test
@@ -0,0 +1,70 @@
+<<< 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")
+               , ESymbol Open "("
+               , ENumber "0"
+               , ESymbol Close ")"
+               , ESymbol Rel "="
+               , ESub (EIdentifier "\947") (ENumber "2")
+               , ESymbol Open "("
+               , ENumber "0"
+               , ESymbol Close ")"
+               , 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 (ESymbol Open "(")
+                      , Right (EIdentifier "t")
+                      , Right (ESymbol Close ")")
+                      ])
+                   (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 (ESymbol Open "(")
+                      , Right (EIdentifier "t")
+                      , Right (ESymbol Close ")")
+                      ])
+                   (EGrouped [ EIdentifier "t" , ESymbol Rel "=" , ENumber "0" ])
+               ]
+             ]
+           ])
+    ]
+]
+>>> starmath
+%igamma_1 equiv %igamma_2 dlrarrow left lbrace matrix { alignl %igamma_1(0) = %igamma_2(0) = p, " and " ## alignl {left none {{alignc {nitalic d}} over {alignc {nitalic dt}}}%iphi circ %igamma_1(t) right rline}_{{t = 0}} = {left none {{alignc {nitalic d}} over {alignc {nitalic dt}}}%iphi circ %igamma_2(t) right rline}_{{t = 0}} } right none
diff --git a/test/writer/starmath/divergence.test b/test/writer/starmath/divergence.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/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" ])
+]
+>>> starmath
+nabla cdot vec v = {{partial v_x} over {partial x}} + {{partial v_y} over {partial y}} + {{partial v_z} over {partial z}}
diff --git a/test/writer/starmath/ensuremath.test b/test/writer/starmath/ensuremath.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/ensuremath.test
@@ -0,0 +1,4 @@
+<<< native
+[ ESuper (EIdentifier "\960") (ENumber "2") ]
+>>> starmath
+%ipi^2
diff --git a/test/writer/starmath/genfrac.test b/test/writer/starmath/genfrac.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/genfrac.test
@@ -0,0 +1,9 @@
+<<< native
+[ EDelimited
+    "{"
+    "}"
+    [ Right (EFraction NoLineFrac (EIdentifier "x") (EIdentifier "y"))
+    ]
+]
+>>> starmath
+left lbrace binom{x}{y} right rbrace
diff --git a/test/writer/starmath/issue109.test b/test/writer/starmath/issue109.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/issue109.test
@@ -0,0 +1,11 @@
+<<< native
+[ EIdentifier "a"
+, ESymbol Rel ">"
+, EIdentifier "b"
+, ESymbol Rel "or"
+, EIdentifier "a"
+, ESymbol Rel ">"
+, EIdentifier "c"
+]
+>>> starmath
+a > b "or" a > c
diff --git a/test/writer/starmath/issue204.test b/test/writer/starmath/issue204.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/issue204.test
@@ -0,0 +1,7 @@
+<<< native
+[ EIdentifier "a"
+, ESub (ESymbol Rel "\8829") (EIdentifier "i")
+, EIdentifier "b"
+]
+>>> starmath
+a≽_i b
diff --git a/test/writer/starmath/issue229.test b/test/writer/starmath/issue229.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/issue229.test
@@ -0,0 +1,13 @@
+<<< native
+[ EArray
+    [ AlignLeft , AlignRight , AlignCenter , AlignRight , AlignCenter ]
+    [ [ [ ENumber "1" ]
+      , [ ENumber "2" ]
+      , [ ENumber "3" ]
+      , [ ENumber "4" ]
+      , [ ENumber "5" ]
+      ]
+    ]
+]
+>>> starmath
+matrix { alignl 1 # alignr 2 # alignc 3 # alignr 4 # alignc 5 }
diff --git a/test/writer/starmath/labels.test b/test/writer/starmath/labels.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/labels.test
@@ -0,0 +1,4 @@
+<<< native
+[ ENumber "2" , ESymbol Bin "+" , ENumber "2" ]
+>>> starmath
+2 + 2
diff --git a/test/writer/starmath/macros.test b/test/writer/starmath/macros.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/macros.test
@@ -0,0 +1,15 @@
+<<< native
+[ ENumber "2"
+, ENumber "5"
+, EGrouped [ EIdentifier "y" , ESymbol Bin "+" , ENumber "3" ]
+, EGrouped [ EIdentifier "x" , ESymbol Bin "+" , ENumber "3" ]
+, EGrouped
+    [ EIdentifier "x" , ESymbol Bin "+" , EIdentifier "\945" ]
+, EArray
+    [ AlignCenter , AlignCenter ]
+    [ [ [ ENumber "2" ] , [ ENumber "3" ] ]
+    , [ [ ENumber "4" ] , [ ENumber "5" ] ]
+    ]
+]
+>>> starmath
+25{y + 3}{x + 3}{x + %ialpha}matrix { 2 # 3 ## 4 # 5 }
diff --git a/test/writer/starmath/math-in-text.test b/test/writer/starmath/math-in-text.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/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 "."
+            ]
+        ]
+    ]
+]
+>>> starmath
+X^2 = y{" under "H_0" except when "{x{bold {" is less than "}z bold {"."}}}}
diff --git a/test/writer/starmath/moore_determinant.test b/test/writer/starmath/moore_determinant.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/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" ]))
+               ]
+             ]
+           ])
+    ]
+]
+>>> starmath
+M = left [ matrix { %ialpha_1 # %ialpha_1^q # dotsaxis # %ialpha_1^{q^{{n - 1}}} ## %ialpha_2 # %ialpha_2^q # dotsaxis # %ialpha_2^{q^{{n - 1}}} ## dotsvert # dotsvert # {} dotsdown {} # dotsvert ## %ialpha_m # %ialpha_m^q # dotsaxis # %ialpha_m^{q^{{n - 1}}} } right ]
diff --git a/test/writer/starmath/notin.test b/test/writer/starmath/notin.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/notin.test
@@ -0,0 +1,11 @@
+<<< native
+[ EIdentifier "x"
+, ESymbol Rel "\8712"
+, EIdentifier "y"
+, ESymbol Bin "\8743"
+, EIdentifier "x"
+, ESymbol Rel "\8713"
+, EIdentifier "y"
+]
+>>> starmath
+x in y and x notin y
diff --git a/test/writer/starmath/operatorname.test b/test/writer/starmath/operatorname.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/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" ]
+             ]
+           ])
+    ]
+]
+>>> starmath
+left lbrace matrix { alignl func div_x u func div^x u func div_x^y u func div_x^y u # alignl "operatorname" ## alignl {func "⋆-lim'sup"} csub {{x toward 0}} u {func "⋆-lim'sup"} csup {w} u {func "⋆-lim'sup"} csub {{x toward 0}} csup {w} u {func "⋆-lim'sup"} csub {{x toward 0}} csup {w} u # alignl "operatorname*" ## alignl func "⋆-lim'sup"_{{x toward 0}} u func "⋆-lim'sup"^w u func "⋆-lim'sup"_{{x toward 0}}^w u func "⋆-lim'sup"_{{x toward 0}}^w u # alignl "operatorname*:nolimits" ## alignl func curl_x v {func argmax} csub {K} u # alignl "DeclareMathOperator" } right none
diff --git a/test/writer/starmath/phantom.test b/test/writer/starmath/phantom.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/phantom.test
@@ -0,0 +1,10 @@
+<<< native
+[ EDelimited
+    "("
+    ")"
+    [ Right
+        (EPhantom (EFraction NormalFrac (ENumber "1") (ENumber "2")))
+    ]
+]
+>>> starmath
+left ( phantom {1 over 2} right )
diff --git a/test/writer/starmath/quadratic_formula.test b/test/writer/starmath/quadratic_formula.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/quadratic_formula.test
@@ -0,0 +1,22 @@
+<<< native
+[ EIdentifier "x"
+, ESymbol Rel "="
+, EFraction
+    NormalFrac
+    (EGrouped
+       [ ESymbol Ord "\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" ])
+]
+>>> starmath
+x = {{- b plusminus sqrt {{b^2 - 4ac}}} over {2a}}
diff --git a/test/writer/starmath/schwinger_dyson.test b/test/writer/starmath/schwinger_dyson.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/schwinger_dyson.test
@@ -0,0 +1,63 @@
+<<< 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 (ESymbol Open "[")
+                  , Right (EIdentifier "\981")
+                  , Right (ESymbol Close "]")
+                  ])
+           ])
+    , Right (EIdentifier "\968")
+    ]
+, ESymbol Rel "="
+, ESymbol Ord "\8722"
+, EStyled TextNormal [ EIdentifier "i" ]
+, EDelimited
+    "\10216"
+    "\10217"
+    [ Right (EIdentifier "\968")
+    , Right
+        (EDelimited
+           "|"
+           "|"
+           [ Right (EStyled TextScript [ EIdentifier "T" ])
+           , Right
+               (EDelimited
+                  "{"
+                  "}"
+                  [ Right (EIdentifier "F")
+                  , Right (ESymbol Open "[")
+                  , Right (EIdentifier "\981")
+                  , Right (ESymbol Close "]")
+                  , Right
+                      (EFraction
+                         NormalFrac
+                         (EIdentifier "\948")
+                         (EGrouped [ EIdentifier "\948" , EIdentifier "\981" ]))
+                  , Right (EIdentifier "S")
+                  , Right (ESymbol Open "[")
+                  , Right (EIdentifier "\981")
+                  , Right (ESymbol Close "]")
+                  ])
+           ])
+    , Right (EIdentifier "\968")
+    ]
+]
+>>> starmath
+left langle %ipsi left lline nitalic 𝒯 left lbrace {%idelta over {%idelta %iphi}}F[%iphi] right rbrace right rline %ipsi right rangle = - nitalic i left langle %ipsi left lline nitalic 𝒯 left lbrace F[%iphi]{%idelta over {%idelta %iphi}}S[%iphi] right rbrace right rline %ipsi right rangle
diff --git a/test/writer/starmath/simple_sum_formula.test b/test/writer/starmath/simple_sum_formula.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/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")
+]
+>>> starmath
+sum from i = 1 to 100 x = {{100*101} over 2}
diff --git a/test/writer/starmath/sophomores_dream.test b/test/writer/starmath/sophomores_dream.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/sophomores_dream.test
@@ -0,0 +1,27 @@
+<<< 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
+    [ ESymbol Open "("
+    , ESymbol Ord "\8722"
+    , ENumber "1"
+    , ESuper
+        (ESymbol Close ")")
+        (EGrouped [ EIdentifier "n" , ESymbol Bin "+" , ENumber "1" ])
+    , ESpace (1 % 6)
+    , ESuper
+        (EIdentifier "n")
+        (EGrouped [ ESymbol Ord "\8722" , EIdentifier "n" ])
+    ]
+]
+>>> starmath
+int_0^1 x^x nitalic dx = sum from n = 1 to infinity {(- 1)^{{n + 1}} n^{{- n}}}
diff --git a/test/writer/starmath/span.test b/test/writer/starmath/span.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/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"
+]
+>>> starmath
+Y leftarrow csup {f} X toward csup {g} Z
diff --git a/test/writer/starmath/sphere_volume.test b/test/writer/starmath/sphere_volume.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/sphere_volume.test
@@ -0,0 +1,127 @@
+<<< 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)
+        , ESymbol Open "("
+        , ESymbol Ord "\8722"
+        , EMathOperator "cos"
+        , EIdentifier "\952"
+        , ESymbol Close ")"
+        , 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")
+        ]
+      ]
+    ]
+]
+>>> starmath
+S = left lbrace 0 <= %iphi <= 2%ipi , 0 <= %itheta <= %ipi , 0 <= %irho <= R right rbrace matrix { alignr "Volume" # alignl {} = iiint from S %irho^2 sin %itheta nitalic d%irho nitalic d%itheta nitalic d%iphi ## alignr {} # alignl {} = int_0^{{2%ipi}} nitalic d%iphi int_0^%ipi sin %itheta nitalic d%itheta int_0^R %irho^2 nitalic d%irho ## alignr {} # alignl {} = {left none %iphi right rline}_0^{{2%ipi}} {left none left ( - cos %itheta right ) right rline}_0^%ipi size*0.7 {{alignc 1} over {alignc 3}}{left none %irho^3 right rline}_0^R ## alignr {} # alignl {} = 2%ipi times 2 times size*0.7 {{alignc 1} over {alignc 3}}R^3 ## alignr {} # alignl {} = size*0.7 {{alignc 4} over {alignc 3}}%ipi R^3 }
diff --git a/test/writer/starmath/stackrel.test b/test/writer/starmath/stackrel.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/stackrel.test
@@ -0,0 +1,7 @@
+<<< native
+[ ESub (EIdentifier "u") (EIdentifier "n")
+, EOver False (ESymbol Rel "\8594") (EIdentifier "w")
+, EIdentifier "u"
+]
+>>> starmath
+u_n toward csup {w} u
diff --git a/test/writer/starmath/substack.test b/test/writer/starmath/substack.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/substack.test
@@ -0,0 +1,34 @@
+<<< 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"
+, ESymbol Open "("
+, EIdentifier "i"
+, ESymbol Pun ","
+, EIdentifier "j"
+, ESymbol Close ")"
+]
+>>> starmath
+sum from matrix { {0 < i < m} ## {0 < j < n} } P(i, j)
diff --git a/test/writer/starmath/subsup.test b/test/writer/starmath/subsup.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/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")
+]
+>>> starmath
+x_b^a ~ x_b^a ~ {func min} csub {A}~ {func max} csub {B}~ {func det} csub {C}~ {func Pr} csub {A}~ {func gcd} csub {A}~ {dot u}^2 ~ {overline u}_%ivarepsilon ~ {underline u}_b^a ~ {a + b} overbrace "term"~ {a + b} overbrace c~ {a + b} underbrace c~ {a + b} underbrace c{~}^H e3{~}_x A{~}_x^3
diff --git a/test/writer/starmath/text.test b/test/writer/starmath/text.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/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"
+]
+>>> starmath
+"(Łukasiewicz, Gödel, and Gödel)" ital {…–“double quotes”—‘single quotes’}
diff --git a/test/writer/starmath/tokens.test b/test/writer/starmath/tokens.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/tokens.test
@@ -0,0 +1,14 @@
+<<< native
+[ EOver False (EIdentifier "\981") (ESymbol Accent "\771")
+, ESqrt (EIdentifier "\981")
+, EFraction NormalFrac (EIdentifier "\981") (EIdentifier "\958")
+, EFraction NormalFrac (EIdentifier "\981") (EIdentifier "\958")
+, EFraction NormalFrac (EIdentifier "\981") (EIdentifier "\958")
+, EGrouped
+    [ ESymbol Open "(" , EIdentifier "\981" , ESymbol Close ")" ]
+, EGrouped
+    [ ESymbol Open "(" , EIdentifier "\981" , ESymbol Close ")" ]
+, EIdentifier "\958"
+]
+>>> starmath
+tilde %iphi sqrt {%iphi}{%iphi over %ixi}{%iphi over %ixi}{%iphi over %ixi}{(%iphi)}{(%iphi)}%ixi
diff --git a/test/writer/starmath/unicode.test b/test/writer/starmath/unicode.test
new file mode 100644
--- /dev/null
+++ b/test/writer/starmath/unicode.test
@@ -0,0 +1,9 @@
+<<< native
+[ EIdentifier "f"
+, ESymbol Rel ":"
+, EIdentifier "X"
+, ESymbol Rel "\8594"
+, EIdentifier "Y"
+]
+>>> starmath
+f : X toward Y
diff --git a/test/writer/tex/accents1.test b/test/writer/tex/accents1.test
--- a/test/writer/tex/accents1.test
+++ b/test/writer/tex/accents1.test
@@ -88,7 +88,7 @@
 >>> tex
 \begin{array}{l}
 \text{default: (accent=true)} \\
-{\overset{'}{H}\hat{H}\overset{\_}{H}\grave{H}\overset{\sim}{H}\overset{¨}{H}\overline{H}\acute{H}\overset{¸}{H}\widehat{H}\check{H}\breve{H}\overset{˙}{H}\overset{˚}{H}\widetilde{H}\overset{˝}{H}\widehat{H}\overset{̑}{H}\bar{H}\dddot{H}\ddddot{H}\overset{\leftarrow}{H}\overset{\rightarrow}{H}\overset{\leftrightarrow}{H}\overset{\leftharpoonup}{H}\overset{\leftharpoondown}{H}\overset{\rightharpoonup}{H}\overset{\rightharpoondown}{H}\overset{⎴}{H}\overset{⎵}{H}\overset{⏜}{H}\overset{⏝}{H}\overbrace{H}\overset{\underbrace{}}{H}\overset{⥎}{H}\overset{⥐}{H}} \\
+{\overset{'}{H}\hat{H}\overset{\_}{H}\grave{H}\overset{\sim}{H}\overset{¨}{H}\overline{H}\acute{H}\overset{¸}{H}\widehat{H}\check{H}\breve{H}\overset{˙}{H}\overset{˚}{H}\widetilde{H}\overset{˝}{H}\widehat{H}\overset{̑}{H}\bar{H}\dddot{H}\ddddot{H}\overset{\leftarrow}{H}\overset{\rightarrow}{H}\overset{\leftrightarrow}{H}\overset{\leftharpoonup}{H}\overset{\leftharpoondown}{H}\overset{\rightharpoonup}{H}\overset{\rightharpoondown}{H}\overbracket{H}\overset{⎵}{H}\overset{⏜}{H}\overset{⏝}{H}\overbrace{H}\overset{\underbrace{}}{H}\overset{⥎}{H}\overset{⥐}{H}} \\
 \text{accent=false:} \\
-{\overset{'}{H}\overset{\hat{}}{H}\overset{\_}{H}\overset{`}{H}\overset{\sim}{H}\overset{¨}{H}\overset{¯}{H}\overset{´}{H}\overset{¸}{H}\overset{\hat{}}{H}\overset{ˇ}{H}\overset{˘}{H}\overset{˙}{H}\overset{˚}{H}\overset{˜}{H}\overset{˝}{H}\widehat{H}\overset{̑}{H}\overset{‾}{H}\dddot{H}\ddddot{H}\overset{\leftarrow}{H}\overset{\rightarrow}{H}\overset{\leftrightarrow}{H}\overset{\leftharpoonup}{H}\overset{\leftharpoondown}{H}\overset{\rightharpoonup}{H}\overset{\rightharpoondown}{H}\overset{⎴}{H}\overset{⎵}{H}\overset{⏜}{H}\overset{⏝}{H}\overbrace{H}\overset{\underbrace{}}{H}\overset{⥎}{H}\overset{⥐}{H}}
+{\overset{'}{H}\overset{\hat{}}{H}\overset{\_}{H}\overset{`}{H}\overset{\sim}{H}\overset{¨}{H}\overset{¯}{H}\overset{´}{H}\overset{¸}{H}\overset{\hat{}}{H}\overset{ˇ}{H}\overset{˘}{H}\overset{˙}{H}\overset{˚}{H}\overset{˜}{H}\overset{˝}{H}\widehat{H}\overset{̑}{H}\overset{‾}{H}\dddot{H}\ddddot{H}\overset{\leftarrow}{H}\overset{\rightarrow}{H}\overset{\leftrightarrow}{H}\overset{\leftharpoonup}{H}\overset{\leftharpoondown}{H}\overset{\rightharpoonup}{H}\overset{\rightharpoondown}{H}\overbracket{H}\overset{⎵}{H}\overset{⏜}{H}\overset{⏝}{H}\overbrace{H}\overset{\underbrace{}}{H}\overset{⥎}{H}\overset{⥐}{H}}
 \end{array}
diff --git a/test/writer/tex/accents2.test b/test/writer/tex/accents2.test
--- a/test/writer/tex/accents2.test
+++ b/test/writer/tex/accents2.test
@@ -88,7 +88,7 @@
 >>> tex
 \begin{array}{l}
 \text{default: (accent=true)} \\
-{\overset{'}{x}\hat{x}\overset{\_}{x}\grave{x}\overset{\sim}{x}\overset{¨}{x}\overline{x}\acute{x}\overset{¸}{x}\widehat{x}\check{x}\breve{x}\overset{˙}{x}\overset{˚}{x}\widetilde{x}\overset{˝}{x}\widehat{x}\overset{̑}{x}\bar{x}\dddot{x}\ddddot{x}\overset{\leftarrow}{x}\overset{\rightarrow}{x}\overset{\leftrightarrow}{x}\overset{\leftharpoonup}{x}\overset{\leftharpoondown}{x}\overset{\rightharpoonup}{x}\overset{\rightharpoondown}{x}\overset{⎴}{x}\overset{⎵}{x}\overset{⏜}{x}\overset{⏝}{x}\overbrace{x}\overset{\underbrace{}}{x}\overset{⥎}{x}\overset{⥐}{x}} \\
+{\overset{'}{x}\hat{x}\overset{\_}{x}\grave{x}\overset{\sim}{x}\overset{¨}{x}\overline{x}\acute{x}\overset{¸}{x}\widehat{x}\check{x}\breve{x}\overset{˙}{x}\overset{˚}{x}\widetilde{x}\overset{˝}{x}\widehat{x}\overset{̑}{x}\bar{x}\dddot{x}\ddddot{x}\overset{\leftarrow}{x}\overset{\rightarrow}{x}\overset{\leftrightarrow}{x}\overset{\leftharpoonup}{x}\overset{\leftharpoondown}{x}\overset{\rightharpoonup}{x}\overset{\rightharpoondown}{x}\overbracket{x}\overset{⎵}{x}\overset{⏜}{x}\overset{⏝}{x}\overbrace{x}\overset{\underbrace{}}{x}\overset{⥎}{x}\overset{⥐}{x}} \\
 \text{accent=false:} \\
-{\overset{'}{x}\overset{\hat{}}{x}\overset{\_}{x}\overset{`}{x}\overset{\sim}{x}\overset{¨}{x}\overset{¯}{x}\overset{´}{x}\overset{¸}{x}\overset{\hat{}}{x}\overset{ˇ}{x}\overset{˘}{x}\overset{˙}{x}\overset{˚}{x}\overset{˜}{x}\overset{˝}{x}\widehat{x}\overset{̑}{x}\overset{‾}{x}\dddot{x}\ddddot{x}\overset{\leftarrow}{x}\overset{\rightarrow}{x}\overset{\leftrightarrow}{x}\overset{\leftharpoonup}{x}\overset{\leftharpoondown}{x}\overset{\rightharpoonup}{x}\overset{\rightharpoondown}{x}\overset{⎴}{x}\overset{⎵}{x}\overset{⏜}{x}\overset{⏝}{x}\overbrace{x}\overset{\underbrace{}}{x}\overset{⥎}{x}\overset{⥐}{x}}
+{\overset{'}{x}\overset{\hat{}}{x}\overset{\_}{x}\overset{`}{x}\overset{\sim}{x}\overset{¨}{x}\overset{¯}{x}\overset{´}{x}\overset{¸}{x}\overset{\hat{}}{x}\overset{ˇ}{x}\overset{˘}{x}\overset{˙}{x}\overset{˚}{x}\overset{˜}{x}\overset{˝}{x}\widehat{x}\overset{̑}{x}\overset{‾}{x}\dddot{x}\ddddot{x}\overset{\leftarrow}{x}\overset{\rightarrow}{x}\overset{\leftrightarrow}{x}\overset{\leftharpoonup}{x}\overset{\leftharpoondown}{x}\overset{\rightharpoonup}{x}\overset{\rightharpoondown}{x}\overbracket{x}\overset{⎵}{x}\overset{⏜}{x}\overset{⏝}{x}\overbrace{x}\overset{\underbrace{}}{x}\overset{⥎}{x}\overset{⥐}{x}}
 \end{array}
diff --git a/test/writer/tex/accents3.test b/test/writer/tex/accents3.test
--- a/test/writer/tex/accents3.test
+++ b/test/writer/tex/accents3.test
@@ -88,7 +88,7 @@
 >>> tex
 \begin{array}{l}
 \text{default: (accent=true)} \\
-{\underset{'}{H}\underset{\hat{}}{H}\underline{H}\underset{`}{H}\underset{\sim}{H}\underset{¨}{H}\underset{¯}{H}\underset{´}{H}\underset{¸}{H}\underset{\hat{}}{H}\underset{ˇ}{H}\underset{˘}{H}\underset{˙}{H}\underset{˚}{H}\underset{˜}{H}\underset{˝}{H}\underset{\hat{}}{H}\underset{̑}{H}\underset{‾}{H}\underset{\dddot{}}{H}\underset{\ddddot{}}{H}\underset{\leftarrow}{H}\underset{\rightarrow}{H}\underset{\leftrightarrow}{H}\underset{\leftharpoonup}{H}\underset{\leftharpoondown}{H}\underset{\rightharpoonup}{H}\underset{\rightharpoondown}{H}\underset{⎴}{H}\underset{⎵}{H}\underset{⏜}{H}\underset{⏝}{H}\underset{\overbrace{}}{H}\underbrace{H}\underset{⥎}{H}\underset{⥐}{H}} \\
+{\underset{'}{H}\underset{\hat{}}{H}\underline{H}\underset{`}{H}\underset{\sim}{H}\underset{¨}{H}\underset{¯}{H}\underset{´}{H}\underset{¸}{H}\underset{\hat{}}{H}\underset{ˇ}{H}\underset{˘}{H}\underset{˙}{H}\underset{˚}{H}\underset{˜}{H}\underset{˝}{H}\underset{\hat{}}{H}\underset{̑}{H}\underset{‾}{H}\underset{\dddot{}}{H}\underset{\ddddot{}}{H}\underset{\leftarrow}{H}\underset{\rightarrow}{H}\underset{\leftrightarrow}{H}\underset{\leftharpoonup}{H}\underset{\leftharpoondown}{H}\underset{\rightharpoonup}{H}\underset{\rightharpoondown}{H}\underset{⎴}{H}\underbracket{H}\underset{⏜}{H}\underset{⏝}{H}\underset{\overbrace{}}{H}\underbrace{H}\underset{⥎}{H}\underset{⥐}{H}} \\
 \text{accent=false:} \\
-{\underset{'}{H}\underset{\hat{}}{H}\underset{\_}{H}\underset{`}{H}\underset{\sim}{H}\underset{¨}{H}\underset{¯}{H}\underset{´}{H}\underset{¸}{H}\underset{\hat{}}{H}\underset{ˇ}{H}\underset{˘}{H}\underset{˙}{H}\underset{˚}{H}\underset{˜}{H}\underset{˝}{H}\underset{\hat{}}{H}\underset{̑}{H}\underset{‾}{H}\underset{\dddot{}}{H}\underset{\ddddot{}}{H}\underset{\leftarrow}{H}\underset{\rightarrow}{H}\underset{\leftrightarrow}{H}\underset{\leftharpoonup}{H}\underset{\leftharpoondown}{H}\underset{\rightharpoonup}{H}\underset{\rightharpoondown}{H}\underset{⎴}{H}\underset{⎵}{H}\underset{⏜}{H}\underset{⏝}{H}\underset{\overbrace{}}{H}\underbrace{H}\underset{⥎}{H}\underset{⥐}{H}}
+{\underset{'}{H}\underset{\hat{}}{H}\underset{\_}{H}\underset{`}{H}\underset{\sim}{H}\underset{¨}{H}\underset{¯}{H}\underset{´}{H}\underset{¸}{H}\underset{\hat{}}{H}\underset{ˇ}{H}\underset{˘}{H}\underset{˙}{H}\underset{˚}{H}\underset{˜}{H}\underset{˝}{H}\underset{\hat{}}{H}\underset{̑}{H}\underset{‾}{H}\underset{\dddot{}}{H}\underset{\ddddot{}}{H}\underset{\leftarrow}{H}\underset{\rightarrow}{H}\underset{\leftrightarrow}{H}\underset{\leftharpoonup}{H}\underset{\leftharpoondown}{H}\underset{\rightharpoonup}{H}\underset{\rightharpoondown}{H}\underset{⎴}{H}\underbracket{H}\underset{⏜}{H}\underset{⏝}{H}\underset{\overbrace{}}{H}\underbrace{H}\underset{⥎}{H}\underset{⥐}{H}}
 \end{array}
diff --git a/test/writer/tex/accents4.test b/test/writer/tex/accents4.test
--- a/test/writer/tex/accents4.test
+++ b/test/writer/tex/accents4.test
@@ -88,7 +88,7 @@
 >>> tex
 \begin{array}{l}
 \text{default: (accent=true)} \\
-{\underset{'}{x}\underset{\hat{}}{x}\underline{x}\underset{`}{x}\underset{\sim}{x}\underset{¨}{x}\underset{¯}{x}\underset{´}{x}\underset{¸}{x}\underset{\hat{}}{x}\underset{ˇ}{x}\underset{˘}{x}\underset{˙}{x}\underset{˚}{x}\underset{˜}{x}\underset{˝}{x}\underset{\hat{}}{x}\underset{̑}{x}\underset{‾}{x}\underset{\dddot{}}{x}\underset{\ddddot{}}{x}\underset{\leftarrow}{x}\underset{\rightarrow}{x}\underset{\leftrightarrow}{x}\underset{\leftharpoonup}{x}\underset{\leftharpoondown}{x}\underset{\rightharpoonup}{x}\underset{\rightharpoondown}{x}\underset{⎴}{x}\underset{⎵}{x}\underset{⏜}{x}\underset{⏝}{x}\underset{\overbrace{}}{x}\underbrace{x}\underset{⥎}{x}\underset{⥐}{x}} \\
+{\underset{'}{x}\underset{\hat{}}{x}\underline{x}\underset{`}{x}\underset{\sim}{x}\underset{¨}{x}\underset{¯}{x}\underset{´}{x}\underset{¸}{x}\underset{\hat{}}{x}\underset{ˇ}{x}\underset{˘}{x}\underset{˙}{x}\underset{˚}{x}\underset{˜}{x}\underset{˝}{x}\underset{\hat{}}{x}\underset{̑}{x}\underset{‾}{x}\underset{\dddot{}}{x}\underset{\ddddot{}}{x}\underset{\leftarrow}{x}\underset{\rightarrow}{x}\underset{\leftrightarrow}{x}\underset{\leftharpoonup}{x}\underset{\leftharpoondown}{x}\underset{\rightharpoonup}{x}\underset{\rightharpoondown}{x}\underset{⎴}{x}\underbracket{x}\underset{⏜}{x}\underset{⏝}{x}\underset{\overbrace{}}{x}\underbrace{x}\underset{⥎}{x}\underset{⥐}{x}} \\
 \text{accent=false:} \\
-{\underset{'}{x}\underset{\hat{}}{x}\underset{\_}{x}\underset{`}{x}\underset{\sim}{x}\underset{¨}{x}\underset{¯}{x}\underset{´}{x}\underset{¸}{x}\underset{\hat{}}{x}\underset{ˇ}{x}\underset{˘}{x}\underset{˙}{x}\underset{˚}{x}\underset{˜}{x}\underset{˝}{x}\underset{\hat{}}{x}\underset{̑}{x}\underset{‾}{x}\underset{\dddot{}}{x}\underset{\ddddot{}}{x}\underset{\leftarrow}{x}\underset{\rightarrow}{x}\underset{\leftrightarrow}{x}\underset{\leftharpoonup}{x}\underset{\leftharpoondown}{x}\underset{\rightharpoonup}{x}\underset{\rightharpoondown}{x}\underset{⎴}{x}\underset{⎵}{x}\underset{⏜}{x}\underset{⏝}{x}\underset{\overbrace{}}{x}\underbrace{x}\underset{⥎}{x}\underset{⥐}{x}}
+{\underset{'}{x}\underset{\hat{}}{x}\underset{\_}{x}\underset{`}{x}\underset{\sim}{x}\underset{¨}{x}\underset{¯}{x}\underset{´}{x}\underset{¸}{x}\underset{\hat{}}{x}\underset{ˇ}{x}\underset{˘}{x}\underset{˙}{x}\underset{˚}{x}\underset{˜}{x}\underset{˝}{x}\underset{\hat{}}{x}\underset{̑}{x}\underset{‾}{x}\underset{\dddot{}}{x}\underset{\ddddot{}}{x}\underset{\leftarrow}{x}\underset{\rightarrow}{x}\underset{\leftrightarrow}{x}\underset{\leftharpoonup}{x}\underset{\leftharpoondown}{x}\underset{\rightharpoonup}{x}\underset{\rightharpoondown}{x}\underset{⎴}{x}\underbracket{x}\underset{⏜}{x}\underset{⏝}{x}\underset{\overbrace{}}{x}\underbrace{x}\underset{⥎}{x}\underset{⥐}{x}}
 \end{array}
diff --git a/test/writer/tex/accents5.test b/test/writer/tex/accents5.test
--- a/test/writer/tex/accents5.test
+++ b/test/writer/tex/accents5.test
@@ -295,7 +295,7 @@
 >>> tex
 \begin{array}{l}
 \text{default: (accent=true)} \\
-{\underset{'}{\overset{'}{H}}\underset{\hat{}}{\hat{H}}\underline{\overset{\_}{H}}\underset{`}{\grave{H}}\underset{\sim}{\overset{\sim}{H}}\underset{¨}{\overset{¨}{H}}\underset{¯}{\overline{H}}\underset{´}{\acute{H}}\underset{¸}{\overset{¸}{H}}\underset{\hat{}}{\widehat{H}}\underset{ˇ}{\check{H}}\underset{˘}{\breve{H}}\underset{˙}{\overset{˙}{H}}\underset{˚}{\overset{˚}{H}}\underset{˜}{\widetilde{H}}\underset{˝}{\overset{˝}{H}}\underset{\hat{}}{\widehat{H}}\underset{̑}{\overset{̑}{H}}\underset{‾}{\bar{H}}\underset{\dddot{}}{\dddot{H}}\underset{\ddddot{}}{\ddddot{H}}\underset{\leftarrow}{\overset{\leftarrow}{H}}\underset{\rightarrow}{\overset{\rightarrow}{H}}\underset{\leftrightarrow}{\overset{\leftrightarrow}{H}}\underset{\leftharpoonup}{\overset{\leftharpoonup}{H}}\underset{\leftharpoondown}{\overset{\leftharpoondown}{H}}\underset{\rightharpoonup}{\overset{\rightharpoonup}{H}}\underset{\rightharpoondown}{\overset{\rightharpoondown}{H}}\underset{⎴}{\overset{⎴}{H}}\underset{⎵}{\overset{⎵}{H}}\underset{⏜}{\overset{⏜}{H}}\underset{⏝}{\overset{⏝}{H}}\underset{\overbrace{}}{\overbrace{H}}\underbrace{\overset{\underbrace{}}{H}}\underset{⥎}{\overset{⥎}{H}}\underset{⥐}{\overset{⥐}{H}}} \\
+{\underset{'}{\overset{'}{H}}\underset{\hat{}}{\hat{H}}\underline{\overset{\_}{H}}\underset{`}{\grave{H}}\underset{\sim}{\overset{\sim}{H}}\underset{¨}{\overset{¨}{H}}\underset{¯}{\overline{H}}\underset{´}{\acute{H}}\underset{¸}{\overset{¸}{H}}\underset{\hat{}}{\widehat{H}}\underset{ˇ}{\check{H}}\underset{˘}{\breve{H}}\underset{˙}{\overset{˙}{H}}\underset{˚}{\overset{˚}{H}}\underset{˜}{\widetilde{H}}\underset{˝}{\overset{˝}{H}}\underset{\hat{}}{\widehat{H}}\underset{̑}{\overset{̑}{H}}\underset{‾}{\bar{H}}\underset{\dddot{}}{\dddot{H}}\underset{\ddddot{}}{\ddddot{H}}\underset{\leftarrow}{\overset{\leftarrow}{H}}\underset{\rightarrow}{\overset{\rightarrow}{H}}\underset{\leftrightarrow}{\overset{\leftrightarrow}{H}}\underset{\leftharpoonup}{\overset{\leftharpoonup}{H}}\underset{\leftharpoondown}{\overset{\leftharpoondown}{H}}\underset{\rightharpoonup}{\overset{\rightharpoonup}{H}}\underset{\rightharpoondown}{\overset{\rightharpoondown}{H}}\underset{⎴}{\overbracket{H}}\underbracket{\overset{⎵}{H}}\underset{⏜}{\overset{⏜}{H}}\underset{⏝}{\overset{⏝}{H}}\underset{\overbrace{}}{\overbrace{H}}\underbrace{\overset{\underbrace{}}{H}}\underset{⥎}{\overset{⥎}{H}}\underset{⥐}{\overset{⥐}{H}}} \\
 \text{accent=false:} \\
-{\underset{'}{\overset{'}{H}}\underset{\hat{}}{\overset{\hat{}}{H}}\underset{\_}{\overset{\_}{H}}\underset{`}{\overset{`}{H}}\underset{\sim}{\overset{\sim}{H}}\underset{¨}{\overset{¨}{H}}\underset{¯}{\overset{¯}{H}}\underset{´}{\overset{´}{H}}\underset{¸}{\overset{¸}{H}}\underset{\hat{}}{\overset{\hat{}}{H}}\underset{ˇ}{\overset{ˇ}{H}}\underset{˘}{\overset{˘}{H}}\underset{˙}{\overset{˙}{H}}\underset{˚}{\overset{˚}{H}}\underset{˜}{\overset{˜}{H}}\underset{˝}{\overset{˝}{H}}\underset{\hat{}}{\widehat{H}}\underset{̑}{\overset{̑}{H}}\underset{‾}{\overset{‾}{H}}\underset{\dddot{}}{\dddot{H}}\underset{\ddddot{}}{\ddddot{H}}\underset{\leftarrow}{\overset{\leftarrow}{H}}\underset{\rightarrow}{\overset{\rightarrow}{H}}\underset{\leftrightarrow}{\overset{\leftrightarrow}{H}}\underset{\leftharpoonup}{\overset{\leftharpoonup}{H}}\underset{\leftharpoondown}{\overset{\leftharpoondown}{H}}\underset{\rightharpoonup}{\overset{\rightharpoonup}{H}}\underset{\rightharpoondown}{\overset{\rightharpoondown}{H}}\underset{⎴}{\overset{⎴}{H}}\underset{⎵}{\overset{⎵}{H}}\underset{⏜}{\overset{⏜}{H}}\underset{⏝}{\overset{⏝}{H}}\underset{\overbrace{}}{\overbrace{H}}\underbrace{\overset{\underbrace{}}{H}}\underset{⥎}{\overset{⥎}{H}}\underset{⥐}{\overset{⥐}{H}}}
+{\underset{'}{\overset{'}{H}}\underset{\hat{}}{\overset{\hat{}}{H}}\underset{\_}{\overset{\_}{H}}\underset{`}{\overset{`}{H}}\underset{\sim}{\overset{\sim}{H}}\underset{¨}{\overset{¨}{H}}\underset{¯}{\overset{¯}{H}}\underset{´}{\overset{´}{H}}\underset{¸}{\overset{¸}{H}}\underset{\hat{}}{\overset{\hat{}}{H}}\underset{ˇ}{\overset{ˇ}{H}}\underset{˘}{\overset{˘}{H}}\underset{˙}{\overset{˙}{H}}\underset{˚}{\overset{˚}{H}}\underset{˜}{\overset{˜}{H}}\underset{˝}{\overset{˝}{H}}\underset{\hat{}}{\widehat{H}}\underset{̑}{\overset{̑}{H}}\underset{‾}{\overset{‾}{H}}\underset{\dddot{}}{\dddot{H}}\underset{\ddddot{}}{\ddddot{H}}\underset{\leftarrow}{\overset{\leftarrow}{H}}\underset{\rightarrow}{\overset{\rightarrow}{H}}\underset{\leftrightarrow}{\overset{\leftrightarrow}{H}}\underset{\leftharpoonup}{\overset{\leftharpoonup}{H}}\underset{\leftharpoondown}{\overset{\leftharpoondown}{H}}\underset{\rightharpoonup}{\overset{\rightharpoonup}{H}}\underset{\rightharpoondown}{\overset{\rightharpoondown}{H}}\underset{⎴}{\overbracket{H}}\underbracket{\overset{⎵}{H}}\underset{⏜}{\overset{⏜}{H}}\underset{⏝}{\overset{⏝}{H}}\underset{\overbrace{}}{\overbrace{H}}\underbrace{\overset{\underbrace{}}{H}}\underset{⥎}{\overset{⥎}{H}}\underset{⥐}{\overset{⥐}{H}}}
 \end{array}
diff --git a/test/writer/tex/accents6.test b/test/writer/tex/accents6.test
--- a/test/writer/tex/accents6.test
+++ b/test/writer/tex/accents6.test
@@ -295,7 +295,7 @@
 >>> tex
 \begin{array}{l}
 \text{default: (accent=true)} \\
-{\underset{'}{\overset{'}{x}}\underset{\hat{}}{\hat{x}}\underline{\overset{\_}{x}}\underset{`}{\grave{x}}\underset{\sim}{\overset{\sim}{x}}\underset{¨}{\overset{¨}{x}}\underset{¯}{\overline{x}}\underset{´}{\acute{x}}\underset{¸}{\overset{¸}{x}}\underset{\hat{}}{\widehat{x}}\underset{ˇ}{\check{x}}\underset{˘}{\breve{x}}\underset{˙}{\overset{˙}{x}}\underset{˚}{\overset{˚}{x}}\underset{˜}{\widetilde{x}}\underset{˝}{\overset{˝}{x}}\underset{\hat{}}{\widehat{x}}\underset{̑}{\overset{̑}{x}}\underset{‾}{\bar{x}}\underset{\dddot{}}{\dddot{x}}\underset{\ddddot{}}{\ddddot{x}}\underset{\leftarrow}{\overset{\leftarrow}{x}}\underset{\rightarrow}{\overset{\rightarrow}{x}}\underset{\leftrightarrow}{\overset{\leftrightarrow}{x}}\underset{\leftharpoonup}{\overset{\leftharpoonup}{x}}\underset{\leftharpoondown}{\overset{\leftharpoondown}{x}}\underset{\rightharpoonup}{\overset{\rightharpoonup}{x}}\underset{\rightharpoondown}{\overset{\rightharpoondown}{x}}\underset{⎴}{\overset{⎴}{x}}\underset{⎵}{\overset{⎵}{x}}\underset{⏜}{\overset{⏜}{x}}\underset{⏝}{\overset{⏝}{x}}\underset{\overbrace{}}{\overbrace{x}}\underbrace{\overset{\underbrace{}}{x}}\underset{⥎}{\overset{⥎}{x}}\underset{⥐}{\overset{⥐}{x}}} \\
+{\underset{'}{\overset{'}{x}}\underset{\hat{}}{\hat{x}}\underline{\overset{\_}{x}}\underset{`}{\grave{x}}\underset{\sim}{\overset{\sim}{x}}\underset{¨}{\overset{¨}{x}}\underset{¯}{\overline{x}}\underset{´}{\acute{x}}\underset{¸}{\overset{¸}{x}}\underset{\hat{}}{\widehat{x}}\underset{ˇ}{\check{x}}\underset{˘}{\breve{x}}\underset{˙}{\overset{˙}{x}}\underset{˚}{\overset{˚}{x}}\underset{˜}{\widetilde{x}}\underset{˝}{\overset{˝}{x}}\underset{\hat{}}{\widehat{x}}\underset{̑}{\overset{̑}{x}}\underset{‾}{\bar{x}}\underset{\dddot{}}{\dddot{x}}\underset{\ddddot{}}{\ddddot{x}}\underset{\leftarrow}{\overset{\leftarrow}{x}}\underset{\rightarrow}{\overset{\rightarrow}{x}}\underset{\leftrightarrow}{\overset{\leftrightarrow}{x}}\underset{\leftharpoonup}{\overset{\leftharpoonup}{x}}\underset{\leftharpoondown}{\overset{\leftharpoondown}{x}}\underset{\rightharpoonup}{\overset{\rightharpoonup}{x}}\underset{\rightharpoondown}{\overset{\rightharpoondown}{x}}\underset{⎴}{\overbracket{x}}\underbracket{\overset{⎵}{x}}\underset{⏜}{\overset{⏜}{x}}\underset{⏝}{\overset{⏝}{x}}\underset{\overbrace{}}{\overbrace{x}}\underbrace{\overset{\underbrace{}}{x}}\underset{⥎}{\overset{⥎}{x}}\underset{⥐}{\overset{⥐}{x}}} \\
 \text{accent=false:} \\
-{\underset{'}{\overset{'}{x}}\underset{\hat{}}{\overset{\hat{}}{x}}\underset{\_}{\overset{\_}{x}}\underset{`}{\overset{`}{x}}\underset{\sim}{\overset{\sim}{x}}\underset{¨}{\overset{¨}{x}}\underset{¯}{\overset{¯}{x}}\underset{´}{\overset{´}{x}}\underset{¸}{\overset{¸}{x}}\underset{\hat{}}{\overset{\hat{}}{x}}\underset{ˇ}{\overset{ˇ}{x}}\underset{˘}{\overset{˘}{x}}\underset{˙}{\overset{˙}{x}}\underset{˚}{\overset{˚}{x}}\underset{˜}{\overset{˜}{x}}\underset{˝}{\overset{˝}{x}}\underset{\hat{}}{\widehat{x}}\underset{̑}{\overset{̑}{x}}\underset{‾}{\overset{‾}{x}}\underset{\dddot{}}{\dddot{x}}\underset{\ddddot{}}{\ddddot{x}}\underset{\leftarrow}{\overset{\leftarrow}{x}}\underset{\rightarrow}{\overset{\rightarrow}{x}}\underset{\leftrightarrow}{\overset{\leftrightarrow}{x}}\underset{\leftharpoonup}{\overset{\leftharpoonup}{x}}\underset{\leftharpoondown}{\overset{\leftharpoondown}{x}}\underset{\rightharpoonup}{\overset{\rightharpoonup}{x}}\underset{\rightharpoondown}{\overset{\rightharpoondown}{x}}\underset{⎴}{\overset{⎴}{x}}\underset{⎵}{\overset{⎵}{x}}\underset{⏜}{\overset{⏜}{x}}\underset{⏝}{\overset{⏝}{x}}\underset{\overbrace{}}{\overbrace{x}}\underbrace{\overset{\underbrace{}}{x}}\underset{⥎}{\overset{⥎}{x}}\underset{⥐}{\overset{⥐}{x}}}
+{\underset{'}{\overset{'}{x}}\underset{\hat{}}{\overset{\hat{}}{x}}\underset{\_}{\overset{\_}{x}}\underset{`}{\overset{`}{x}}\underset{\sim}{\overset{\sim}{x}}\underset{¨}{\overset{¨}{x}}\underset{¯}{\overset{¯}{x}}\underset{´}{\overset{´}{x}}\underset{¸}{\overset{¸}{x}}\underset{\hat{}}{\overset{\hat{}}{x}}\underset{ˇ}{\overset{ˇ}{x}}\underset{˘}{\overset{˘}{x}}\underset{˙}{\overset{˙}{x}}\underset{˚}{\overset{˚}{x}}\underset{˜}{\overset{˜}{x}}\underset{˝}{\overset{˝}{x}}\underset{\hat{}}{\widehat{x}}\underset{̑}{\overset{̑}{x}}\underset{‾}{\overset{‾}{x}}\underset{\dddot{}}{\dddot{x}}\underset{\ddddot{}}{\ddddot{x}}\underset{\leftarrow}{\overset{\leftarrow}{x}}\underset{\rightarrow}{\overset{\rightarrow}{x}}\underset{\leftrightarrow}{\overset{\leftrightarrow}{x}}\underset{\leftharpoonup}{\overset{\leftharpoonup}{x}}\underset{\leftharpoondown}{\overset{\leftharpoondown}{x}}\underset{\rightharpoonup}{\overset{\rightharpoonup}{x}}\underset{\rightharpoondown}{\overset{\rightharpoondown}{x}}\underset{⎴}{\overbracket{x}}\underbracket{\overset{⎵}{x}}\underset{⏜}{\overset{⏜}{x}}\underset{⏝}{\overset{⏝}{x}}\underset{\overbrace{}}{\overbrace{x}}\underbrace{\overset{\underbrace{}}{x}}\underset{⥎}{\overset{⥎}{x}}\underset{⥐}{\overset{⥐}{x}}}
 \end{array}
diff --git a/test/writer/tex/cancel.test b/test/writer/tex/cancel.test
new file mode 100644
--- /dev/null
+++ b/test/writer/tex/cancel.test
@@ -0,0 +1,13 @@
+<<< native
+[ EBoxed
+    (EGrouped
+       [ ECancel ForwardSlash (EIdentifier "x")
+       , ESymbol Bin "+"
+       , ECancel BackSlash (EIdentifier "y")
+       , ESymbol Rel "="
+       , ECancel XSlash (EIdentifier "z")
+       ])
+]
+
+>>> tex
+\boxed{\cancel{x} + \bcancel{y} = \xcancel{z}}
diff --git a/test/writer/tex/subsup.test b/test/writer/tex/subsup.test
--- a/test/writer/tex/subsup.test
+++ b/test/writer/tex/subsup.test
@@ -65,4 +65,4 @@
 , ESubsup (ESpace (1 % 1)) (EIdentifier "x") (ENumber "3")
 ]
 >>> tex
-x_{b}^{a}\quad x_{b}^{a}\quad\min_{A}\quad\max_{B}\quad\det_{C}\quad\Pr_{A}\quad\gcd_{A}\quad{\dot{u}}^{2}\quad{\overline{u}}_{\varepsilon}\quad{\underline{u}}_{b}^{a}\quad\overset{\text{term}}{\overbrace{a + b}}\quad\overset{c}{\overset{⎴}{a + b}}\quad\underset{c}{\underbrace{a + b}}\quad\underset{c}{\underset{⎵}{a + b}}\quad^{H}e3\quad_{x}A\quad_{x}^{3}
+x_{b}^{a}\quad x_{b}^{a}\quad\min_{A}\quad\max_{B}\quad\det_{C}\quad\Pr_{A}\quad\gcd_{A}\quad{\dot{u}}^{2}\quad{\overline{u}}_{\varepsilon}\quad{\underline{u}}_{b}^{a}\quad\overset{\text{term}}{\overbrace{a + b}}\quad\overset{c}{\overbracket{a + b}}\quad\underset{c}{\underbrace{a + b}}\quad\underset{c}{\underbracket{a + b}}\quad^{H}e3\quad_{x}A\quad_{x}^{3}
diff --git a/test/writer/typst/07.test b/test/writer/typst/07.test
--- a/test/writer/typst/07.test
+++ b/test/writer/typst/07.test
@@ -20,4 +20,4 @@
 , EIdentifier "a"
 ]
 >>> typst
-u'' + p (x) u' + q (x) u = f (x) \, quad x > a
+u'' + p (x) u' + q (x) u = f (x)\,quad x > a
diff --git a/test/writer/typst/08.test b/test/writer/typst/08.test
--- a/test/writer/typst/08.test
+++ b/test/writer/typst/08.test
@@ -30,4 +30,4 @@
 , EDelimited "(" ")" [ Right (EIdentifier "z") ]
 ]
 >>> typst
-lr(|macron(z)|) = lr(|z|) \, lr(|(macron(z))^n|) = lr(|z|)^n \, arg (z^n) = n arg (z)
+lr(|macron(z)|) = lr(|z|)\,lr(|(macron(z))^n|) = lr(|z|)^n\,arg (z^n) = n arg (z)
diff --git a/test/writer/typst/11.test b/test/writer/typst/11.test
--- a/test/writer/typst/11.test
+++ b/test/writer/typst/11.test
@@ -23,4 +23,4 @@
     NormalFrac (ENumber "1") (ESub (EIdentifier "l") (ENumber "0"))
 ]
 >>> typst
-phi.alt_n (kappa) = 0.033 C_n^2 kappa^(- 11 \/ 3) \, quad 1 / L_0 lt.double kappa lt.double 1 / l_0
+phi.alt_n (kappa) = 0.033 C_n^2 kappa^(- 11\/3)\,quad 1 / L_0 lt.double kappa lt.double 1 / l_0
diff --git a/test/writer/typst/13.test b/test/writer/typst/13.test
--- a/test/writer/typst/13.test
+++ b/test/writer/typst/13.test
@@ -54,4 +54,4 @@
     (EGrouped [ EIdentifier "n" , ESymbol Ord "!" ])
 ]
 >>> typst
-zws_p F_q (a_1 \, dots.h \, a_p ; c_1 \, dots.h \, c_q ; z) = sum_(n = 0)^oo frac((a_1)_n dots.h.c (a_p)_n, (c_1)_n dots.h.c (c_q)_n) frac(z^n, n !)
+zws_p F_q (a_1 \, dots.h \, a_p \; c_1 \, dots.h \, c_q \; z) = sum_(n = 0)^oo frac((a_1)_n dots.h.c (a_p)_n, (c_1)_n dots.h.c (c_q)_n) frac(z^n, n !)
diff --git a/test/writer/typst/17.test b/test/writer/typst/17.test
--- a/test/writer/typst/17.test
+++ b/test/writer/typst/17.test
@@ -8,4 +8,4 @@
 , EIdentifier "x"
 ]
 >>> typst
-x \* 4 = 4 \* x
+x * 4 = 4 * x
diff --git a/test/writer/typst/cancel.test b/test/writer/typst/cancel.test
new file mode 100644
--- /dev/null
+++ b/test/writer/typst/cancel.test
@@ -0,0 +1,9 @@
+<<< native
+[ ECancel ForwardSlash (EIdentifier "x")
+, ESymbol Bin "+"
+, ECancel BackSlash (EIdentifier "y")
+, ESymbol Rel "="
+, ECancel XSlash (EIdentifier "z")
+]
+>>> typst
+cancel(x) + cancel(y, inverted: #true) = cancel(z, cross: #true)
diff --git a/test/writer/typst/complex1.test b/test/writer/typst/complex1.test
--- a/test/writer/typst/complex1.test
+++ b/test/writer/typst/complex1.test
@@ -601,12 +601,12 @@
     ]
 ]
 >>> typst
-upright("Bernoulli Trials") & P \( E \) = (n / k) p_()^k \( 1 - p \)_()^(n - k)\
+upright("Bernoulli Trials") & P\(E\) = (n / k) p_()^k\(1 - p\)_()^(n - k)\
 upright("Cauchy-Schwarz Inequality") & (sum_(k = 1)^n a_k^() b_k^())_()^2 lt.eq (sum_(k = 1)^n a_k^2) (sum_(k = 1)^n b_k^2)\
-upright("Cauchy Formula") & f \( z \) thin dot.c "Ind"_gamma^() \( z \) = frac(1, 2 pi i) integral.cont_gamma^() frac(f \( xi \), xi - z) thin d xi\
+upright("Cauchy Formula") & f\(z\)thin dot.c "Ind"_gamma^()\(z\)= frac(1, 2 pi i) integral.cont_gamma^() frac(f\(xi\), xi - z) thin d xi\
 upright("Cross Product") & V_1^() times V_2^() = mat(delim: "|", i, j, k; frac(partial X, partial u), frac(partial Y, partial u), 0; frac(partial X, partial v), frac(partial Y, partial 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 - 1), v_2^(n - 1), dots.h.c, v_n^(n - 1)) = product_(1 lt.eq i < j lt.eq n)^() \( v_j^() - v_i^() \)\
-upright("Lorenz Equations") & accent(x, ˙)_() & = & sigma \( y - x \)\
+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 - 1), v_2^(n - 1), dots.h.c, v_n^(n - 1)) = product_(1 lt.eq i < j lt.eq n)^()\(v_j^() - v_i^()\)\
+upright("Lorenz Equations") & accent(x, ˙)_() & = & sigma\(y - x\)\
 accent(y, ˙)_() & = & rho x - y - x z\
 accent(z, ˙)_() & = & - beta z + x y\
 upright("Maxwell's Equations") & {nabla zws times accent(B, ↼)_() - thin 1 / c thin frac(partial zws accent(E, ↼)_(), partial zws t) & = & frac(4 pi, c) thin accent(j, ↼)_()\
@@ -614,9 +614,9 @@
 nabla zws times accent(E, ↼)_() thin + thin 1 / c thin frac(partial zws accent(B, ↼)_(), partial zws t) & = & accent(0, ↼)_()\
 nabla zws dot.c accent(B, ↼)_() & = & 0\
 upright("Einstein Field Equations") & R_(mu nu)^() - 1 / 2 thin g_(mu nu)^() thin R = frac(8 pi G, c_()^4) thin T_(mu nu)^()\
-upright("Ramanujan Identity") & frac(1, \( sqrt(phi sqrt(5)) - phi \) e_()^(25 / pi)) = 1 + frac(e_()^(- 2 pi), 1 + frac(e_()^(- 4 pi), 1 + frac(e_()^(- 6 pi), 1 + frac(e_()^(- 8 pi), 1 + dots.h))))\
+upright("Ramanujan Identity") & frac(1, \(sqrt(phi sqrt(5)) - phi\)e_()^(25 / pi)) = 1 + frac(e_()^(- 2 pi), 1 + frac(e_()^(- 4 pi), 1 + frac(e_()^(- 6 pi), 1 + frac(e_()^(- 8 pi), 1 + dots.h))))\
 upright("Another Ramanujan identity") & sum_(k = 1)^oo 1 / 2_()^(floor.l k dot.c zws phi floor.r) = frac(1, 2_()^0 + frac(1, 2_()^1 + dots.h.c))\
-upright("Rogers-Ramanujan Identity") & 1 + sum_(k = 1)^oo frac(q_()^(k_()^2 + k), \( 1 - q \) \( 1 - q_()^2 \) dots.h.c \( 1 - q_()^k \)) = product_(j = 0)^oo frac(1, \( 1 - q_()^(5 j + 2) \) \( 1 - q_()^(5 j + 3) \)) \, upright("  ") upright("  ") f o r med \| q \| < 1 .\
+upright("Rogers-Ramanujan Identity") & 1 + sum_(k = 1)^oo frac(q_()^(k_()^2 + k), \(1 - q\)\(1 - q_()^2\)dots.h.c\(1 - q_()^k\)) = product_(j = 0)^oo frac(1, \(1 - q_()^(5 j + 2)\)\(1 - q_()^(5 j + 3)\))\,upright("  ") upright("  ") f o r med\|q\|< 1 .\
 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
--- a/test/writer/typst/complex2.test
+++ b/test/writer/typst/complex2.test
@@ -393,16 +393,16 @@
 >>> typst
 upright("Quadratic Equation") & x = frac(- b plus.minus sqrt(b_()^2 - 4 a c), 2 a)\
 upright("DisplayQuadratic Equation") & x = frac(- b plus.minus sqrt(b_()^2 - 4 a c), 2 a)\
-upright("Rational Function") & f \( x \) = frac(1 - x_()^2, 1 - x_()^3)\
-upright("Rational Function") & f \( x \) = frac(\( 1 - x_()^2 \) x_()^3, 1 - x_()^3)\
-upright("Rational Function") & f \( x \) = frac(\( 1 - x_()^2 \) \( x_()^3 - 5 x \), 1 - x_()^3)\
-upright("Parametrize Rational Function") & f \( x \) = frac(\( a_i^() - x_()^2 \)_()^5, 1 - x_()^3)\
-upright("Stacked exponents") & g \( z \) = e_()^(- x_()^2)\
-upright("Stacked exponents") & g \( z \) = e_()^(- \( z - a \)_()^2)\
-upright("Stacked exponents") & g \( z \) = e_()^(- sum_(i = 0)^oo z_i^2)\
-upright("Stacked exponents") & g \( y \) = e_()^(- sum_(i = 0)^oo y_i^2)\
-upright("Stacked exponents") & g \( z \) = e_()^(- sum_(i = 0)^oo z_()^(frac(2, a - i)))\
+upright("Rational Function") & f\(x\)= frac(1 - x_()^2, 1 - x_()^3)\
+upright("Rational Function") & f\(x\)= frac(\(1 - x_()^2\)x_()^3, 1 - x_()^3)\
+upright("Rational Function") & f\(x\)= frac(\(1 - x_()^2\)\(x_()^3 - 5 x\), 1 - x_()^3)\
+upright("Parametrize Rational Function") & f\(x\)= frac(\(a_i^() - x_()^2\)_()^5, 1 - x_()^3)\
+upright("Stacked exponents") & g\(z\)= e_()^(- x_()^2)\
+upright("Stacked exponents") & g\(z\)= e_()^(-\(z - a\)_()^2)\
+upright("Stacked exponents") & g\(z\)= e_()^(- sum_(i = 0)^oo z_i^2)\
+upright("Stacked exponents") & g\(y\)= e_()^(- sum_(i = 0)^oo y_i^2)\
+upright("Stacked exponents") & g\(z\)= e_()^(- sum_(i = 0)^oo z_()^(frac(2, a - i)))\
 upright("Cross Product") & frac(x_1^() - x_2^(), x_3^() - x_4^()) frac(x_1^() - x_4^(), x_2^() - x_3^())\
-upright("Cross Product") & \( frac(x_1^() - x_2^(), x_3^() - x_4^()) \) \( frac(x_1^() - x_4^(), x_2^() - x_3^()) \)\
+upright("Cross Product") & \(frac(x_1^() - x_2^(), x_3^() - x_4^())\)\(frac(x_1^() - x_4^(), x_2^() - x_3^())\)\
 upright("Cross Product") & (frac(x_1^() - x_2^(), x_3^() - x_4^())) (frac(x_1^() - x_4^(), x_2^() - x_3^()))\
-upright("Cross Product") & frac(\( x_1^() - x_2^() \) \( x_3^() - x_4^() \), \( x_1^() - x_4^() \) \( x_2^() - x_3^() \))
+upright("Cross Product") & frac(\(x_1^() - x_2^()\)\(x_3^() - x_4^()\), \(x_1^() - x_4^()\)\(x_2^() - x_3^()\))
diff --git a/test/writer/typst/deMorgans_law.test b/test/writer/typst/deMorgans_law.test
--- a/test/writer/typst/deMorgans_law.test
+++ b/test/writer/typst/deMorgans_law.test
@@ -36,4 +36,4 @@
     (ESymbol TOver "\175")
 ]
 >>> typst
-not (p and q) arrow.l.r.double (not p) or (not q) overline(union.big_(i = 1)^n A_i) = sect.big_(i = 1)^n overline(A_i)
+not (p and q) arrow.l.r.double (not p) or (not q) overline(union.big_(i = 1)^n A_i) = inter.big_(i = 1)^n overline(A_i)
diff --git a/test/writer/typst/differentiable_manifold.test b/test/writer/typst/differentiable_manifold.test
--- a/test/writer/typst/differentiable_manifold.test
+++ b/test/writer/typst/differentiable_manifold.test
@@ -59,5 +59,5 @@
     ]
 ]
 >>> typst
-gamma_1 equiv gamma_2 arrow.l.r.double {gamma_1 (0) = gamma_2 (0) = p \, upright(" and ")\
+gamma_1 equiv gamma_2 arrow.l.r.double {gamma_1 (0) = gamma_2 (0) = p\,upright(" and ")\
 frac(upright(d), upright(d) t) phi.alt compose gamma_1 (t)\|_(t = 0) = frac(upright(d), upright(d) t) phi.alt compose gamma_2 (t)\|_(t = 0)
diff --git a/test/writer/typst/largeop1.test b/test/writer/typst/largeop1.test
--- a/test/writer/typst/largeop1.test
+++ b/test/writer/typst/largeop1.test
@@ -76,9 +76,9 @@
     ]
 ]
 >>> 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
+upright("displaystyle: false largeop: false") & and.big or.big integral sum product union.big inter.big\
+upright("displaystyle: false largeop: true") & and.big or.big integral sum product union.big inter.big\
+upright("displaystyle: true largeop: false") & and.big or.big integral sum product union.big inter.big\
+upright("displaystyle: true largeop: true") & and.big or.big integral sum product union.big inter.big\
+upright("displaystyle: false largeop: default") & and.big or.big integral sum product union.big inter.big\
+upright("displaystyle: true largeop: default") & and.big or.big integral sum product union.big inter.big
diff --git a/test/writer/typst/largeopPos3.test b/test/writer/typst/largeopPos3.test
--- a/test/writer/typst/largeopPos3.test
+++ b/test/writer/typst/largeopPos3.test
@@ -8,4 +8,4 @@
     [ EIdentifier "A" , ESymbol Bin "\8745" , EIdentifier "B" ]
 ]
 >>> typst
-sect.big_(i = 0)^oo A sect B
+inter.big_(i = 0)^oo A inter B
diff --git a/test/writer/typst/primes2.test b/test/writer/typst/primes2.test
--- a/test/writer/typst/primes2.test
+++ b/test/writer/typst/primes2.test
@@ -27,4 +27,4 @@
 , ESuper (EIdentifier "H") (ESymbol Accent "\8279")
 ]
 >>> typst
-H^(\") H^(') H^(\*) H^(`) 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' H^('') H^(''') H^prime.rev H^prime.double.rev H^prime.triple.rev H^('''')
+H^(\") H^(') H^(*) H^(`) 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' H^('') H^(''') H^prime.rev H^prime.double.rev H^prime.triple.rev H^('''')
diff --git a/test/writer/typst/simple_sum_formula.test b/test/writer/typst/simple_sum_formula.test
--- a/test/writer/typst/simple_sum_formula.test
+++ b/test/writer/typst/simple_sum_formula.test
@@ -12,4 +12,4 @@
     (ENumber "2")
 ]
 >>> typst
-sum_(i = 1)^100 x = frac(100 \* 101, 2)
+sum_(i = 1)^100 x = frac(100 * 101, 2)
diff --git a/test/writer/typst/sphere_volume.test b/test/writer/typst/sphere_volume.test
--- a/test/writer/typst/sphere_volume.test
+++ b/test/writer/typst/sphere_volume.test
@@ -126,7 +126,7 @@
     ]
 ]
 >>> typst
-S = { 0 lt.eq phi.alt lt.eq 2 pi \, med 0 lt.eq theta lt.eq pi \, med 0 lt.eq rho lt.eq R } upright(V o l u m e) & = integral.triple_S #h(-1em) rho^2 sin theta thin upright(d) rho thin upright(d) theta thin upright(d) phi.alt\
+S = { 0 lt.eq phi.alt lt.eq 2 pi\,med 0 lt.eq theta lt.eq pi\,med 0 lt.eq rho lt.eq R } upright(V o l u m e) & = integral.triple_S #h(-1em) rho^2 sin theta thin upright(d) rho thin upright(d) theta thin upright(d) phi.alt\
  & = 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\
  & = phi.alt #scale(x: 180%, y: 180%)[\|]_0^(2 pi) med (- cos theta) #scale(x: 180%, y: 180%)[\|]_0^pi med 1 / 3 rho^3 #scale(x: 180%, y: 180%)[\|]_0^R\
  & = 2 pi times 2 times 1 / 3 R^3\
diff --git a/texmath.cabal b/texmath.cabal
--- a/texmath.cabal
+++ b/texmath.cabal
@@ -1,16 +1,17 @@
 Name:                texmath
-Version:             0.12.10.3
+Version:             0.13.2
 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, 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.
-  (See <https://johnmacfarlane.net/texmath here> for a live demo of
+  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, typst,
+  StarMath, 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. (See
+  <https://johnmacfarlane.net/texmath here> for a live demo of
   bidirectional conversion between LaTeX and MathML.)
   .
   The package also includes several utility modules which may be
@@ -43,6 +44,7 @@
                      test/writer/mml/*.test
                      test/writer/omml/*.test
                      test/writer/tex/*.test
+                     test/writer/starmath/*.test
                      test/writer/typst/*.test
                      test/writer/eqn/*.test
                      test/reader/mml/*.test
@@ -66,10 +68,12 @@
 Flag executable
   description:       Compile test executable.
   default:           False
+  manual:            True
 
 Flag server
   description:       Compile webserver.
   default:           False
+  manual:            True
 
 Library
     Build-depends:       base >= 4.11 && < 5,
@@ -80,7 +84,7 @@
                          pandoc-types >= 1.20 && < 1.24,
                          mtl >= 2.2.1,
                          text,
-                         typst-symbols >= 0.1.8.1 && < 0.1.9,
+                         typst-symbols >= 0.3 && < 0.3.1,
                          split
 
     Exposed-modules:     Text.TeXMath,
@@ -96,6 +100,7 @@
                          Text.TeXMath.Writers.OMML,
                          Text.TeXMath.Writers.Pandoc,
                          Text.TeXMath.Writers.TeX,
+                         Text.TeXMath.Writers.StarMath,
                          Text.TeXMath.Writers.Typst,
                          Text.TeXMath.Writers.Eqn,
                          Text.TeXMath.Unicode.ToUnicode,
