texmath 0.12.3.2 → 0.12.3.3
raw patch · 20 files changed
+321/−80 lines, 20 files
Files
- changelog +23/−0
- src/Text/TeXMath/Readers/TeX.hs +26/−4
- src/Text/TeXMath/Writers/OMML.hs +14/−1
- src/Text/TeXMath/Writers/TeX.hs +31/−12
- tests/readers/tex/cospan.native +1/−0
- tests/readers/tex/span.native +1/−0
- tests/src/cospan.tex +2/−0
- tests/src/schwinger_dyson.tex +1/−1
- tests/src/span.tex +2/−0
- tests/writers/cospan.eqn +1/−0
- tests/writers/cospan.mml +18/−0
- tests/writers/cospan.omml +65/−0
- tests/writers/cospan.tex +1/−0
- tests/writers/deMorgans_law.omml +36/−32
- tests/writers/largeopPos3.omml +33/−29
- tests/writers/span.eqn +1/−0
- tests/writers/span.mml +16/−0
- tests/writers/span.omml +47/−0
- tests/writers/span.tex +1/−0
- texmath.cabal +1/−1
changelog view
@@ -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).
src/Text/TeXMath/Readers/TeX.hs view
@@ -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
src/Text/TeXMath/Writers/OMML.hs view
@@ -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
src/Text/TeXMath/Writers/TeX.hs view
@@ -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]]
+ tests/readers/tex/cospan.native view
@@ -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"]
+ tests/readers/tex/span.native view
@@ -0,0 +1,1 @@+[EIdentifier "Y",EOver False (ESymbol Op "\8592") (EIdentifier "f"),EIdentifier "X",EOver False (ESymbol Op "\8594") (EIdentifier "g"),EIdentifier "Z"]
+ tests/src/cospan.tex view
@@ -0,0 +1,2 @@+B \xrightarrow[f]{} A \xleftarrow[f]{} C+
tests/src/schwinger_dyson.tex view
@@ -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>
+ tests/src/span.tex view
@@ -0,0 +1,2 @@+Y \xleftarrow{f} X \xrightarrow{g} Z+
+ tests/writers/cospan.eqn view
@@ -0,0 +1,1 @@+B -> from f to {} A <- from f to {} C
+ tests/writers/cospan.mml view
@@ -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>
+ tests/writers/cospan.omml view
@@ -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>​</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>​</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>
+ tests/writers/cospan.tex view
@@ -0,0 +1,1 @@+B\xrightarrow[{f}]{}A\xleftarrow[{f}]{}C
tests/writers/deMorgans_law.omml view
@@ -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>
tests/writers/largeopPos3.omml view
@@ -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>
+ tests/writers/span.eqn view
@@ -0,0 +1,1 @@+Y <- to f X -> to g Z
+ tests/writers/span.mml view
@@ -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>
+ tests/writers/span.omml view
@@ -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>
+ tests/writers/span.tex view
@@ -0,0 +1,1 @@+Y\xleftarrow{f}X\xrightarrow{g}Z
texmath.cabal view
@@ -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.