@@ -1,6 +1,7 @@
11{-# LANGUAGE OverloadedStrings #-}
22module Text.Pandoc.Readers.LaTeX.SIunitx
3− ( doSI
3+ ( dosi
4+ , doSI
45 , doSIrange
56 , doSInum
67 )
@@ -17,13 +18,16 @@ import Data.Char (isDigit)
1718import Data.Text (Text)
1819import qualified Data.Text as T
1920
21+dosi :: PandocMonad m => LP m Inlines -> LP m Inlines
22+dosi tok = grouped (siUnit tok) <|> siUnit tok
23+
2024-- converts e.g. \SI{1}[\$]{} to "$ 1" or \SI{1}{\euro} to "1 €"
2125doSI :: PandocMonad m => LP m Inlines -> LP m Inlines
2226doSI tok = do
2327 skipopts
24− value <- tok
28+ value <- doSInum
2529 valueprefix <- option "" $ bracketed tok
26− unit <- grouped (siUnit tok) <|> tok
30+ unit <- dosi tok
2731 return . mconcat $ [valueprefix,
2832 emptyOr160 valueprefix,
2933 value,
@@ -65,11 +69,11 @@ parseNumPart =
6569doSIrange :: PandocMonad m => LP m Inlines -> LP m Inlines
6670doSIrange tok = do
6771 skipopts
68− startvalue <- tok
72+ startvalue <- doSInum
6973 startvalueprefix <- option "" $ bracketed tok
70− stopvalue <- tok
74+ stopvalue <- doSInum
7175 stopvalueprefix <- option "" $ bracketed tok
72− unit <- grouped (siUnit tok) <|> tok
76+ unit <- dosi tok
7377 return . mconcat $ [startvalueprefix,
7478 emptyOr160 startvalueprefix,
7579 startvalue,
@@ -86,7 +90,7 @@ emptyOr160 :: Inlines -> Inlines
8690emptyOr160 x = if x == mempty then x else str "\160"
8791
8892siUnit :: PandocMonad m => LP m Inlines -> LP m Inlines
89−siUnit tok = do
93+siUnit tok = try (do
9094 Tok _ (CtrlSeq name) _ <- anyControlSeq
9195 case name of
9296 "square" -> do
@@ -108,7 +112,17 @@ siUnit tok = do
108112 , (il <> superscript "3") <$ controlSeq "cubed"
109113 , (\n -> il <> superscript n) <$> (controlSeq "tothe" *> tok)
110114 ]
111− Nothing -> tok
115+ Nothing -> fail "not an siunit unit command")
116+ <|> (lookAhead anyControlSeq >> tok)
117+ <|> (do Tok _ Word t <- satisfyTok isWordTok
118+ return $ str t)
119+ <|> (symbol '^' *> (superscript <$> tok))
120+ <|> (symbol '_' *> (subscript <$> tok))
121+ <|> ("\xa0" <$ symbol '.')
122+ <|> ("\xa0" <$ symbol '~')
123+ <|> tok
124+ <|> (do Tok _ _ t <- anyTok
125+ return (str t))
112126
113127siUnitMap :: M.Map Text Inlines
114128siUnitMap = M.fromList