diff --git a/changelog b/changelog
--- a/changelog
+++ b/changelog
@@ -1,3 +1,26 @@
+texmath (0.12.3.3)
+
+  * OMML writer: use nary only for operators supported by LibreOffice
+    (Albert Krewinkel).  LibreOffice (and possibly Word, too) can handle
+    only a small set of operators in an `nary` element.
+
+  * TeX writer: use `\xleftarrow`, `\xrightarrow` where sensible
+    (Albert Krewinkel).  The commands are generated for expressions over `←`
+    or `→`. Besides being more idiomatic, this change also prevents the
+    generation of invalid LaTeX, as `\leftarrow` and `\rightarrow` are not
+    math operators and hence may not be followed by `\limit`.
+    Both commands are part of amsmath.sty.
+
+  * TeX reader:
+
+    + Improve angled-bracket support (Albert Krewinkel).
+      The amsmath package allows `\left<` and `\right>` as alternatives to
+      `\left\langle` and `\right\rangle`, respectively.
+    + Ignore stared version of `\tag` (Albert Krewinkel).
+    + Support \dots{c,b,m,i,o} from amsmath (#179).
+    + Change symbol returned for \dots{b,i,m} from `…` to `⋯`
+      (Albert Krewinkel).
+
 texmath (0.12.3.2)
 
   * OMML writer: remove m:nor element in math operators (#178).
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
@@ -32,7 +32,7 @@
 import qualified Data.Map as M
 import qualified Data.Text as T
 import Data.Text (Text)
-import Data.Maybe (mapMaybe, catMaybes)
+import Data.Maybe (catMaybes, fromJust, mapMaybe)
 import Data.Semigroup ((<>))
 import Text.Parsec hiding (label)
 import Text.Parsec.Error
@@ -43,7 +43,6 @@
 import qualified Text.TeXMath.Shared as S
 import Text.TeXMath.Readers.TeX.Macros (applyMacros, parseMacroDefinitions)
 import Text.TeXMath.Unicode.ToTeX (getSymbolType)
-import Data.Maybe (fromJust)
 import Text.TeXMath.Unicode.ToUnicode (toUnicode)
 import Text.TeXMath.Shared (getSpaceChars)
 import Data.Generics (everywhere, mkT)
@@ -151,7 +150,7 @@
 label = ctrlseq "label" *> braces (skipMany (noneOf "}"))
 
 tag :: TP ()
-tag = ctrlseq "tag" *> braces (skipMany (noneOf "}"))
+tag = ctrlseq "tag" *> optional (char '*') *> braces (skipMany (noneOf "}"))
 
 unGrouped :: Exp -> [Exp]
 unGrouped (EGrouped xs) = xs
@@ -191,6 +190,7 @@
     , scaled c
     , negated c
     , siunitx c
+    , arrow c
     , tSymbol c
     ] <|> unexpected ("control sequence " <> T.unpack c)
 
@@ -356,7 +356,12 @@
 fence :: String -> TP Text
 fence cmd = do
   symbol cmd
-  enc <- basicEnclosure <|> (try (symbol ".") >> return (ESymbol Open ""))
+  let nullDelim = try (ESymbol Open "" <$ symbol ".")
+      angleDelim = try $ choice
+        [ ESymbol Open "\x27E8" <$ symbol "<"
+        , ESymbol Close "\x27E9" <$ symbol ">"
+        ]
+  enc <- basicEnclosure <|> nullDelim <|> angleDelim
   case enc of
        ESymbol Open x  -> return x
        ESymbol Close x -> return x
@@ -1144,6 +1149,11 @@
   , ("\\oint",ESymbol Op "\8750")
   , ("\\prime",ESymbol Ord "\8242")
   , ("\\dots",ESymbol Ord "\8230")
+  , ("\\dotsc",ESymbol Ord "\8230")
+  , ("\\dotso",ESymbol Ord "\8230")
+  , ("\\dotsb",ESymbol Ord "\8943")
+  , ("\\dotsi",ESymbol Ord "\8943")
+  , ("\\dotsm",ESymbol Ord "\8943")
   , ("\\ldots",ESymbol Ord "\8230")
   , ("\\hdots",ESymbol Ord "\8230")
   , ("\\cdots",ESymbol Ord "\8943")
@@ -4488,4 +4498,16 @@
     return $ [ESymbol Rel "\xa0\xd7\xa0", ESuper (ENumber "10") n ]
   parseSpace = mempty <$ skipMany1 (char ' ')
 
+arrow :: Text -> TP Exp
+arrow c = case c of
+  "\\xleftarrow"   -> underoverarrow "\x2190"
+  "\\xrightarrow"  -> underoverarrow "\x2192"
+  _                -> mzero
+ where
+  underoverarrow s = do
+    munder <- optionMaybe inbrackets
+    over <- texToken
+    return $ case munder of
+      Nothing    -> EOver False (ESymbol Op s) over
+      Just under -> EUnderover False (ESymbol Op s) under over
 
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
@@ -286,8 +286,21 @@
 isBarChar c = c == '\x203E' || c == '\x00AF' ||
               c == '\x0304' || c == '\x0333'
 
+-- | Checks whether an expression marks the start of an nary operator
+-- expression. These are different integrals, sums, products, and
+-- coproducts.
 isNary :: Exp -> Bool
-isNary (ESymbol Op _) = True
+isNary (ESymbol Op s) = case s of
+  "\x222b" -> True  -- integral
+  "\x222c" -> True  -- double integral
+  "\x222d" -> True  -- triple integral
+  "\x222e" -> True  -- line integral
+  "\x222f" -> True  -- double line integral
+  "\x2230" -> True  -- triple line integral
+  "\x220f" -> True  -- product
+  "\x2210" -> True  -- coproduct
+  "\x2211" -> True  -- sum
+  _        -> False
 isNary _ = False
 
 -- Kept as String for Text.XML.Light
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
@@ -208,24 +208,38 @@
   tellGroup (writeExp e1)
   tell [Token '^']
   tellGroup (writeExp e2)
-writeExp (EOver convertible b e1) =
-  writeScript Over convertible b e1
+writeExp (EOver convertible b e1) = do
+  env <- asks mathEnv
+  case xarrow b of
+    Just arrowCtrlSeq | "amsmath" `elem` env -> do
+      tell [arrowCtrlSeq]
+      tellGroup (writeExp e1)
+    _ -> writeScript Over convertible b e1
 writeExp (EUnder convertible b e1) =
   writeScript Under convertible b e1
 writeExp (EUnderover convertible b e1@(ESymbol Accent _) e2) =
  writeExp (EUnder convertible (EOver False b e2) e1)
 writeExp (EUnderover convertible b e1 e2@(ESymbol Accent _)) =
  writeExp (EOver convertible (EUnder False b e1) e2)
-writeExp (EUnderover convertible b e1 e2)
-  | isOperator b = do
-      (if isFancy b then tellGroup else id) $
-        (if convertible then local setConvertible else id) $ writeExp b
-      unless convertible $ tell [ControlSeq "\\limits"]
-      tell [Token '_']
-      tellGroup (checkSubstack e1)
-      tell [Token '^']
-      tellGroup (checkSubstack e2)
-  | otherwise = writeExp (EUnder convertible (EOver convertible b e2) e1)
+writeExp (EUnderover convertible b e1 e2) = do
+  env <- asks mathEnv
+  case xarrow b of
+    Just arrowCtrlSeq | "amsmath" `elem` env -> do
+      tell [arrowCtrlSeq]
+      tell [Token '[']
+      tellGroup $ writeExp e1
+      tell [Token ']']
+      tellGroup (writeExp e2)
+    Nothing
+      | isOperator b -> do
+          (if isFancy b then tellGroup else id) $
+            (if convertible then local setConvertible else id) $ writeExp b
+          unless convertible $ tell [ControlSeq "\\limits"]
+          tell [Token '_']
+          tellGroup (checkSubstack e1)
+          tell [Token '^']
+          tellGroup (checkSubstack e2)
+    _ -> writeExp (EUnder convertible (EOver convertible b e2) e1)
 writeExp (ESqrt e) = do
     tell [ControlSeq "\\sqrt"]
     tellGroup (writeExp e)
@@ -396,6 +410,11 @@
                                     Grouped [ControlSeq "\\textit",
                                       Grouped [ControlSeq "\\textsf", x]]]
         _  -> [ControlSeq "\\text", x]
+
+xarrow :: Exp -> Maybe TeX
+xarrow (ESymbol Op "\x2190") = Just $ ControlSeq "\\xleftarrow"
+xarrow (ESymbol Op "\x2192") = Just $ ControlSeq "\\xrightarrow"
+xarrow _ = Nothing
 
 -- Commands which can be used with \left and \right
 delimiters :: Math [[TeX]]
diff --git a/tests/readers/tex/cospan.native b/tests/readers/tex/cospan.native
new file mode 100644
--- /dev/null
+++ b/tests/readers/tex/cospan.native
@@ -0,0 +1,1 @@
+[EIdentifier "B",EUnderover False (ESymbol Op "\8594") (EIdentifier "f") (EGrouped []),EIdentifier "A",EUnderover False (ESymbol Op "\8592") (EIdentifier "f") (EGrouped []),EIdentifier "C"]
diff --git a/tests/readers/tex/span.native b/tests/readers/tex/span.native
new file mode 100644
--- /dev/null
+++ b/tests/readers/tex/span.native
@@ -0,0 +1,1 @@
+[EIdentifier "Y",EOver False (ESymbol Op "\8592") (EIdentifier "f"),EIdentifier "X",EOver False (ESymbol Op "\8594") (EIdentifier "g"),EIdentifier "Z"]
diff --git a/tests/src/cospan.tex b/tests/src/cospan.tex
new file mode 100644
--- /dev/null
+++ b/tests/src/cospan.tex
@@ -0,0 +1,2 @@
+B \xrightarrow[f]{} A \xleftarrow[f]{} C
+
diff --git a/tests/src/schwinger_dyson.tex b/tests/src/schwinger_dyson.tex
--- a/tests/src/schwinger_dyson.tex
+++ b/tests/src/schwinger_dyson.tex
@@ -1,1 +1,1 @@
-   \left\langle\psi\left|\mathcal{T}\left\{\frac{\delta}{\delta\phi}F[\phi]\right\}\right|\psi\right\rangle = -\mathrm{i}\left\langle\psi\left|\mathcal{T}\left\{F[\phi]\frac{\delta}{\delta\phi}S[\phi]\right\}\right|\psi\right\rangle
+   \left\langle\psi\left|\mathcal{T}\left\{\frac{\delta}{\delta\phi}F[\phi]\right\}\right|\psi\right\rangle = -\mathrm{i}\left<\psi\left|\mathcal{T}\left\{F[\phi]\frac{\delta}{\delta\phi}S[\phi]\right\}\right|\psi\right>
diff --git a/tests/src/span.tex b/tests/src/span.tex
new file mode 100644
--- /dev/null
+++ b/tests/src/span.tex
@@ -0,0 +1,2 @@
+Y \xleftarrow{f} X \xrightarrow{g} Z
+
diff --git a/tests/writers/cospan.eqn b/tests/writers/cospan.eqn
new file mode 100644
--- /dev/null
+++ b/tests/writers/cospan.eqn
@@ -0,0 +1,1 @@
+B -> from f to {} A <- from f to {} C
diff --git a/tests/writers/cospan.mml b/tests/writers/cospan.mml
new file mode 100644
--- /dev/null
+++ b/tests/writers/cospan.mml
@@ -0,0 +1,18 @@
+<?xml version='1.0' ?>
+<math display="block" xmlns="http://www.w3.org/1998/Math/MathML">
+  <mrow>
+    <mi>B</mi>
+    <munderover>
+      <mo>→</mo>
+      <mi>f</mi>
+      <mrow />
+    </munderover>
+    <mi>A</mi>
+    <munderover>
+      <mo>←</mo>
+      <mi>f</mi>
+      <mrow />
+    </munderover>
+    <mi>C</mi>
+  </mrow>
+</math>
diff --git a/tests/writers/cospan.omml b/tests/writers/cospan.omml
new file mode 100644
--- /dev/null
+++ b/tests/writers/cospan.omml
@@ -0,0 +1,65 @@
+<?xml version='1.0' ?>
+<m:oMathPara>
+  <m:oMathParaPr>
+    <m:jc m:val="center" />
+  </m:oMathParaPr>
+  <m:oMath>
+    <m:r>
+      <m:t>B</m:t>
+    </m:r>
+    <m:limLow>
+      <m:e>
+        <m:limUpp>
+          <m:e>
+            <m:r>
+              <m:rPr>
+                <m:sty m:val="p" />
+              </m:rPr>
+              <m:t>→</m:t>
+            </m:r>
+          </m:e>
+          <m:lim>
+            <m:r>
+              <m:t>&#8203;</m:t>
+            </m:r>
+          </m:lim>
+        </m:limUpp>
+      </m:e>
+      <m:lim>
+        <m:r>
+          <m:t>f</m:t>
+        </m:r>
+      </m:lim>
+    </m:limLow>
+    <m:r>
+      <m:t>A</m:t>
+    </m:r>
+    <m:limLow>
+      <m:e>
+        <m:limUpp>
+          <m:e>
+            <m:r>
+              <m:rPr>
+                <m:sty m:val="p" />
+              </m:rPr>
+              <m:t>←</m:t>
+            </m:r>
+          </m:e>
+          <m:lim>
+            <m:r>
+              <m:t>&#8203;</m:t>
+            </m:r>
+          </m:lim>
+        </m:limUpp>
+      </m:e>
+      <m:lim>
+        <m:r>
+          <m:t>f</m:t>
+        </m:r>
+      </m:lim>
+    </m:limLow>
+    <m:r>
+      <m:t>C</m:t>
+    </m:r>
+  </m:oMath>
+</m:oMathPara>
diff --git a/tests/writers/cospan.tex b/tests/writers/cospan.tex
new file mode 100644
--- /dev/null
+++ b/tests/writers/cospan.tex
@@ -0,0 +1,1 @@
+B\xrightarrow[{f}]{}A\xleftarrow[{f}]{}C
diff --git a/tests/writers/deMorgans_law.omml b/tests/writers/deMorgans_law.omml
--- a/tests/writers/deMorgans_law.omml
+++ b/tests/writers/deMorgans_law.omml
@@ -136,14 +136,25 @@
       </m:rPr>
       <m:t>=</m:t>
     </m:r>
-    <m:nary>
-      <m:naryPr>
-        <m:chr m:val="⋂" />
-        <m:limLoc m:val="undOvr" />
-        <m:subHide m:val="0" />
-        <m:supHide m:val="0" />
-      </m:naryPr>
-      <m:sub>
+    <m:limLow>
+      <m:e>
+        <m:limUpp>
+          <m:e>
+            <m:r>
+              <m:rPr>
+                <m:sty m:val="p" />
+              </m:rPr>
+              <m:t>⋂</m:t>
+            </m:r>
+          </m:e>
+          <m:lim>
+            <m:r>
+              <m:t>n</m:t>
+            </m:r>
+          </m:lim>
+        </m:limUpp>
+      </m:e>
+      <m:lim>
         <m:r>
           <m:t>i</m:t>
         </m:r>
@@ -156,33 +167,26 @@
         <m:r>
           <m:t>1</m:t>
         </m:r>
-      </m:sub>
-      <m:sup>
-        <m:r>
-          <m:t>n</m:t>
-        </m:r>
-      </m:sup>
+      </m:lim>
+    </m:limLow>
+    <m:bar>
+      <m:barPr>
+        <m:pos m:val="top" />
+      </m:barPr>
       <m:e>
-        <m:bar>
-          <m:barPr>
-            <m:pos m:val="top" />
-          </m:barPr>
+        <m:sSub>
           <m:e>
-            <m:sSub>
-              <m:e>
-                <m:r>
-                  <m:t>A</m:t>
-                </m:r>
-              </m:e>
-              <m:sub>
-                <m:r>
-                  <m:t>i</m:t>
-                </m:r>
-              </m:sub>
-            </m:sSub>
+            <m:r>
+              <m:t>A</m:t>
+            </m:r>
           </m:e>
-        </m:bar>
+          <m:sub>
+            <m:r>
+              <m:t>i</m:t>
+            </m:r>
+          </m:sub>
+        </m:sSub>
       </m:e>
-    </m:nary>
+    </m:bar>
   </m:oMath>
 </m:oMathPara>
diff --git a/tests/writers/largeopPos3.omml b/tests/writers/largeopPos3.omml
--- a/tests/writers/largeopPos3.omml
+++ b/tests/writers/largeopPos3.omml
@@ -4,14 +4,25 @@
     <m:jc m:val="center" />
   </m:oMathParaPr>
   <m:oMath>
-    <m:nary>
-      <m:naryPr>
-        <m:chr m:val="⋂" />
-        <m:limLoc m:val="undOvr" />
-        <m:subHide m:val="0" />
-        <m:supHide m:val="0" />
-      </m:naryPr>
-      <m:sub>
+    <m:limLow>
+      <m:e>
+        <m:limUpp>
+          <m:e>
+            <m:r>
+              <m:rPr>
+                <m:sty m:val="p" />
+              </m:rPr>
+              <m:t>⋂</m:t>
+            </m:r>
+          </m:e>
+          <m:lim>
+            <m:r>
+              <m:t>∞</m:t>
+            </m:r>
+          </m:lim>
+        </m:limUpp>
+      </m:e>
+      <m:lim>
         <m:r>
           <m:t>i</m:t>
         </m:r>
@@ -24,26 +35,19 @@
         <m:r>
           <m:t>0</m:t>
         </m:r>
-      </m:sub>
-      <m:sup>
-        <m:r>
-          <m:t>∞</m:t>
-        </m:r>
-      </m:sup>
-      <m:e>
-        <m:r>
-          <m:t>A</m:t>
-        </m:r>
-        <m:r>
-          <m:rPr>
-            <m:sty m:val="p" />
-          </m:rPr>
-          <m:t>∩</m:t>
-        </m:r>
-        <m:r>
-          <m:t>B</m:t>
-        </m:r>
-      </m:e>
-    </m:nary>
+      </m:lim>
+    </m:limLow>
+    <m:r>
+      <m:t>A</m:t>
+    </m:r>
+    <m:r>
+      <m:rPr>
+        <m:sty m:val="p" />
+      </m:rPr>
+      <m:t>∩</m:t>
+    </m:r>
+    <m:r>
+      <m:t>B</m:t>
+    </m:r>
   </m:oMath>
 </m:oMathPara>
diff --git a/tests/writers/span.eqn b/tests/writers/span.eqn
new file mode 100644
--- /dev/null
+++ b/tests/writers/span.eqn
@@ -0,0 +1,1 @@
+Y <- to f X -> to g Z
diff --git a/tests/writers/span.mml b/tests/writers/span.mml
new file mode 100644
--- /dev/null
+++ b/tests/writers/span.mml
@@ -0,0 +1,16 @@
+<?xml version='1.0' ?>
+<math display="block" xmlns="http://www.w3.org/1998/Math/MathML">
+  <mrow>
+    <mi>Y</mi>
+    <mover>
+      <mo>←</mo>
+      <mi>f</mi>
+    </mover>
+    <mi>X</mi>
+    <mover>
+      <mo>→</mo>
+      <mi>g</mi>
+    </mover>
+    <mi>Z</mi>
+  </mrow>
+</math>
diff --git a/tests/writers/span.omml b/tests/writers/span.omml
new file mode 100644
--- /dev/null
+++ b/tests/writers/span.omml
@@ -0,0 +1,47 @@
+<?xml version='1.0' ?>
+<m:oMathPara>
+  <m:oMathParaPr>
+    <m:jc m:val="center" />
+  </m:oMathParaPr>
+  <m:oMath>
+    <m:r>
+      <m:t>Y</m:t>
+    </m:r>
+    <m:limUpp>
+      <m:e>
+        <m:r>
+          <m:rPr>
+            <m:sty m:val="p" />
+          </m:rPr>
+          <m:t>←</m:t>
+        </m:r>
+      </m:e>
+      <m:lim>
+        <m:r>
+          <m:t>f</m:t>
+        </m:r>
+      </m:lim>
+    </m:limUpp>
+    <m:r>
+      <m:t>X</m:t>
+    </m:r>
+    <m:limUpp>
+      <m:e>
+        <m:r>
+          <m:rPr>
+            <m:sty m:val="p" />
+          </m:rPr>
+          <m:t>→</m:t>
+        </m:r>
+      </m:e>
+      <m:lim>
+        <m:r>
+          <m:t>g</m:t>
+        </m:r>
+      </m:lim>
+    </m:limUpp>
+    <m:r>
+      <m:t>Z</m:t>
+    </m:r>
+  </m:oMath>
+</m:oMathPara>
diff --git a/tests/writers/span.tex b/tests/writers/span.tex
new file mode 100644
--- /dev/null
+++ b/tests/writers/span.tex
@@ -0,0 +1,1 @@
+Y\xleftarrow{f}X\xrightarrow{g}Z
diff --git a/texmath.cabal b/texmath.cabal
--- a/texmath.cabal
+++ b/texmath.cabal
@@ -1,5 +1,5 @@
 Name:                texmath
-Version:             0.12.3.2
+Version:             0.12.3.3
 Cabal-Version:       >= 1.10
 Build-type:          Simple
 Synopsis:            Conversion between formats used to represent mathematics.
