texmath 0.10.1 → 0.10.1.1
raw patch · 16 files changed
+154/−10 lines, 16 files
Files
- changelog +7/−0
- src/Text/TeXMath/Readers/OMML.hs +11/−1
- src/Text/TeXMath/Readers/TeX.hs +6/−1
- src/Text/TeXMath/Writers/Eqn.hs +17/−4
- src/Text/TeXMath/Writers/OMML.hs +13/−1
- src/Text/TeXMath/Writers/TeX.hs +6/−1
- tests/readers/omml/issue112.native +1/−0
- tests/readers/tex/issue109.native +1/−0
- tests/src/issue109.tex +1/−0
- tests/src/issue112.omml +39/−0
- tests/test-texmath.hs +1/−1
- tests/writers/issue109.eqn +1/−0
- tests/writers/issue109.mml +12/−0
- tests/writers/issue109.omml +36/−0
- tests/writers/issue109.tex +1/−0
- texmath.cabal +1/−1
changelog view
@@ -1,3 +1,10 @@+texmath (0.10.1.1)++ * Handle multicharacter operators better in Eqn, TeX, OMML (#109).++ * OMML reader: unwrap `<w:...>` tags immediately under `<m:oMath>`+ (#111, Jesse Rosenthal).+ texmath (0.10.1) * Expose Text.TeXMath.TeX (TeX rendering functions) (#108).
src/Text/TeXMath/Readers/OMML.hs view
@@ -58,8 +58,18 @@ let expList = mapMaybe elemToOMML (elChildren element) return $ map (\l -> if length l == 1 then (head l) else EGrouped l) expList elemToOMML element | isElem "m" "oMath" element =- Just $ concat $ mapMaybe (elemToExps) (elChildren element)+ Just $ concat $ mapMaybe elemToExps $ unwrapWTags $ elChildren element elemToOMML _ = Nothing++-- oMath can contain w:hyperlink, w:sdt, etc. I can't find a complete+-- documentation of this, so we just unwrap any w:tag immediately+-- beneath oMath. Note that this shouldn't affect the "w" tags in+-- elemToOMathRunElem(s) because, those are underneath an "m:r" tag.+unwrapWTags :: [Element] -> [Element]+unwrapWTags elements = concatMap unwrapChild elements+ where unwrapChild element = case qPrefix $ elName element of+ Just "w" -> elChildren element+ _ -> [element] isElem :: String -> String -> Element -> Bool isElem prefix name element =
src/Text/TeXMath/Readers/TeX.hs view
@@ -623,9 +623,14 @@ mathopWith name ty = try $ do ctrlseq name e <- expr1- case e of+ let e' = case e of+ EGrouped [x] -> x+ _ -> e+ case e' of ESymbol _ x -> return $ ESymbol ty x EIdentifier x -> return $ ESymbol ty x+ EText TextNormal x -> return $ ESymbol ty x+ EText sty x -> return $ EStyled sty [ESymbol ty x] x | ty == Op -> case expToOperatorName x of Just y -> return $ EMathOperator y _ -> return x
src/Text/TeXMath/Writers/Eqn.hs view
@@ -67,7 +67,7 @@ writeExp (ESymbol Ord [c]) -- do not render "invisible operators" | c `elem` ['\x2061'..'\x2064'] = "" -- see 3.2.5.5 of mathml spec writeExp (EIdentifier s) = writeExp (ESymbol Ord s)-writeExp (ESymbol _ s) =+writeExp (ESymbol t s) = case s of "\8805" -> ">=" "\8804" -> "<="@@ -127,9 +127,22 @@ "\958" -> "xi" "\926" -> "XI" "\950" -> "zeta"- _ | all isAscii s -> s- |otherwise -> "\\[" ++ intercalate " " (map toUchar s) ++ "]"- where toUchar c = printf "u%04x" (ord c)+ _ -> let s' = if all isAscii s+ then s+ else "\\[" ++ unwords (map toUchar s) ++ "]"+ toUchar c = printf "u%04x" (ord c)+ in if length s > 1 && (t == Rel || t == Bin || t == Op)+ then "roman{\"" +++ (if t == Rel || t == Bin+ then " "+ else "") +++ s' +++ (if t == Rel || t == Bin || t == Op+ then " "+ else "") +++ "\"}"+ else s'+ writeExp (ESpace d) = case d of _ | d > 0 && d < (2 % 9) -> "^"
src/Text/TeXMath/Writers/OMML.hs view
@@ -25,6 +25,7 @@ import Text.XML.Light import Text.TeXMath.Types import Data.Generics (everywhere, mkT)+import Data.Char (isSymbol, isPunctuation) -- | Transforms an expression tree to an OMML XML Tree writeOMML :: DisplayType -> [Exp] -> Element@@ -191,7 +192,18 @@ EIdentifier x -> [str props x] EMathOperator x -> [makeText TextNormal x] -- TODO revisit, use props?- ESymbol _ x -> [str props x]+ ESymbol _ [c]+ | isSymbol c || isPunctuation c+ -> [str props [c]]+ ESymbol ty xs+ | ty `elem` [Op, Bin, Rel]+ -> [mnode "box"+ [ mnode "boxPr"+ [ mnodeA "opEmu" "1" () ]+ , mnode "e"+ [str props xs]+ ]]+ ESymbol _ xs -> [str props xs] ESpace n | n > 0 && n <= 0.17 -> [str props "\x2009"] | n > 0.17 && n <= 0.23 -> [str props "\x2005"]
src/Text/TeXMath/Writers/TeX.hs view
@@ -24,6 +24,7 @@ import Text.TeXMath.Unicode.ToTeX (getTeXMath) import Text.TeXMath.Unicode.ToUnicode (fromUnicode) import qualified Text.TeXMath.Shared as S+import Data.Char (toLower) import Data.Generics (everywhere, mkT) import Control.Applicative ((<$>), Applicative) import Control.Monad (when, unless, foldM_)@@ -155,8 +156,12 @@ writeExp (ESymbol Ord [c]) -- do not render "invisible operators" | c `elem` ['\x2061'..'\x2064'] = return () -- see 3.2.5.5 of mathml spec writeExp (ESymbol t s) = do+ s' <- getTeXMathM s when (t == Bin || t == Rel) $ tell [Space]- tell =<< getTeXMathM s+ if length s > 1 && (t == Bin || t == Rel || t == Op)+ then tell [ControlSeq ("\\math" ++ map toLower (show t)),+ Grouped [ControlSeq "\\text", Grouped s']]+ else tell s' when (t == Bin || t == Rel) $ tell [Space] writeExp (ESpace width) = do env <- asks mathEnv
+ tests/readers/omml/issue112.native view
@@ -0,0 +1,1 @@+[ESub (EIdentifier "A") (ENumber "2")]
+ tests/readers/tex/issue109.native view
@@ -0,0 +1,1 @@+[EIdentifier "a",ESymbol Rel ">",EIdentifier "b",ESymbol Rel "or",EIdentifier "a",ESymbol Rel ">",EIdentifier "c"]
+ tests/src/issue109.tex view
@@ -0,0 +1,1 @@+a > b \mathrel{\text{or}} a > c
+ tests/src/issue112.omml view
@@ -0,0 +1,39 @@+<?xml version="1.0" encoding="UTF-8"?>+<m:oMath>+ <w:hyperlink r:id="rId6" w:history="1">+ <m:sSub>+ <m:sSubPr>+ <m:ctrlPr>+ <w:rPr>+ <w:rStyle w:val="aa"/>+ <w:rFonts w:ascii="Cambria Math" w:hAnsi="Cambria Math"/>+ <w:sz w:val="24"/>+ <w:szCs w:val="24"/>+ </w:rPr>+ </m:ctrlPr>+ </m:sSubPr>+ <m:e>+ <m:r>+ <w:rPr>+ <w:rStyle w:val="aa"/>+ <w:rFonts w:ascii="Cambria Math" w:hAnsi="Cambria Math"/>+ <w:sz w:val="24"/>+ <w:szCs w:val="24"/>+ </w:rPr>+ <m:t>A</m:t>+ </m:r>+ </m:e>+ <m:sub>+ <m:r>+ <w:rPr>+ <w:rStyle w:val="aa"/>+ <w:rFonts w:ascii="Cambria Math" w:hAnsi="Cambria Math"/>+ <w:sz w:val="24"/>+ <w:szCs w:val="24"/>+ </w:rPr>+ <m:t>2</m:t>+ </m:r>+ </m:sub>+ </m:sSub>+ </w:hyperlink>+</m:oMath>
tests/test-texmath.hs view
@@ -45,7 +45,7 @@ main = do args <- getArgs let roundTrip = "--round-trip" `elem` args- let regen = "--regenerate-tests" `elem` args+ let regen = "--regenerate-tests" `elem` args || "--accept" `elem` args setLocaleEncoding utf8 setCurrentDirectory "tests" statuses <- if roundTrip
+ tests/writers/issue109.eqn view
@@ -0,0 +1,1 @@+a > b roman{" or "} a > c
+ tests/writers/issue109.mml view
@@ -0,0 +1,12 @@+<?xml version='1.0' ?>+<math display="block" xmlns="http://www.w3.org/1998/Math/MathML">+ <mrow>+ <mi>a</mi>+ <mo>></mo>+ <mi>b</mi>+ <mo>or</mo>+ <mi>a</mi>+ <mo>></mo>+ <mi>c</mi>+ </mrow>+</math>
+ tests/writers/issue109.omml view
@@ -0,0 +1,36 @@+<?xml version='1.0' ?>+<m:oMathPara>+ <m:oMathParaPr>+ <m:jc m:val="center" />+ </m:oMathParaPr>+ <m:oMath>+ <m:r>+ <m:t>a</m:t>+ </m:r>+ <m:r>+ <m:t>></m:t>+ </m:r>+ <m:r>+ <m:t>b</m:t>+ </m:r>+ <m:box>+ <m:boxPr>+ <m:opEmu m:val="1" />+ </m:boxPr>+ <m:e>+ <m:r>+ <m:t>or</m:t>+ </m:r>+ </m:e>+ </m:box>+ <m:r>+ <m:t>a</m:t>+ </m:r>+ <m:r>+ <m:t>></m:t>+ </m:r>+ <m:r>+ <m:t>c</m:t>+ </m:r>+ </m:oMath>+</m:oMathPara>
+ tests/writers/issue109.tex view
@@ -0,0 +1,1 @@+a > b \mathrel{\text{or}} a > c
texmath.cabal view
@@ -1,5 +1,5 @@ Name: texmath-Version: 0.10.1+Version: 0.10.1.1 Cabal-Version: >= 1.10 Build-type: Simple Synopsis: Conversion between formats used to represent mathematics.