aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn MacFarlane <jgm@berkeley.edu>2020-09-02 11:06:26 -0700
committerJohn MacFarlane <jgm@berkeley.edu>2020-09-02 11:06:26 -0700
commit529eb696dccd0a1923525e5fcb297a76cafa1ebe (patch)
tree8b18090d4b84b67bb8a2b74a93a1ffe5a78d2ee3
parent81fe8ebf369279a899ba4995a4cd1f8a883eeeb9 (diff)
downloadpandoc-529eb696dccd0a1923525e5fcb297a76cafa1ebe.tar.gz
LaTeX reader: Support squared, cubed, tothe in siunitx.
Closes #6657.
-rw-r--r--src/Text/Pandoc/Readers/LaTeX/SIunitx.hs34
-rw-r--r--test/command/3587.md51
2 files changed, 63 insertions, 22 deletions
diff --git a/src/Text/Pandoc/Readers/LaTeX/SIunitx.hs b/src/Text/Pandoc/Readers/LaTeX/SIunitx.hs
index 2befe80e4..458607efe 100644
--- a/src/Text/Pandoc/Readers/LaTeX/SIunitx.hs
+++ b/src/Text/Pandoc/Readers/LaTeX/SIunitx.hs
@@ -21,7 +21,7 @@ dosiunitx tok = do
skipopts
value <- tok
valueprefix <- option "" $ bracketed tok
- unit <- rawUnit tok
+ unit <- grouped (siUnit tok) <|> tok
return . mconcat $ [valueprefix,
emptyOr160 valueprefix,
value,
@@ -36,7 +36,7 @@ doSIrange tok = do
startvalueprefix <- option "" $ bracketed tok
stopvalue <- tok
stopvalueprefix <- option "" $ bracketed tok
- unit <- rawUnit tok
+ unit <- grouped (siUnit tok) <|> tok
return . mconcat $ [startvalueprefix,
emptyOr160 startvalueprefix,
startvalue,
@@ -49,23 +49,33 @@ doSIrange tok = do
emptyOr160 unit,
unit]
-rawUnit :: PandocMonad m => LP m Inlines -> LP m Inlines
-rawUnit tok = grouped (mconcat <$> many1 (siUnit tok)) <|> siUnit tok <|> tok
-
emptyOr160 :: Inlines -> Inlines
emptyOr160 x = if x == mempty then x else str "\160"
siUnit :: PandocMonad m => LP m Inlines -> LP m Inlines
siUnit tok = do
Tok _ (CtrlSeq name) _ <- anyControlSeq
- if name == "square"
- then do
- unit <- rawUnit tok
- return $ unit <> "\178"
- else
+ case name of
+ "square" -> do
+ unit <- siUnit tok
+ return $ unit <> superscript "2"
+ "cubic" -> do
+ unit <- siUnit tok
+ return $ unit <> superscript "3"
+ "raisetothe" -> do
+ n <- tok
+ unit <- siUnit tok
+ return $ unit <> superscript n
+ _ ->
case M.lookup name siUnitMap of
- Just il -> return il
- Nothing -> mzero
+ Just il ->
+ option il $
+ choice
+ [ (il <> superscript "2") <$ controlSeq "squared"
+ , (il <> superscript "3") <$ controlSeq "cubed"
+ , (\n -> il <> superscript n) <$> (controlSeq "tothe" *> tok)
+ ]
+ Nothing -> tok
siUnitMap :: M.Map Text Inlines
siUnitMap = M.fromList
diff --git a/test/command/3587.md b/test/command/3587.md
index 1493a08c5..3016afa5a 100644
--- a/test/command/3587.md
+++ b/test/command/3587.md
@@ -15,13 +15,6 @@
```
% pandoc -f latex -t native
-\SI[round-precision=2]{\{\}}[\{\}]{\{\}}
-^D
-[Para [Str "{}\160{}\160{}"]]
-```
-
-```
-% pandoc -f latex -t native
\SI{30}{\milli\meter}
^D
[Para [Str "30\160mm"]]
@@ -38,7 +31,7 @@
% pandoc -f latex -t native
\SI{25}{\square\meter}
^D
-[Para [Str "25\160m\178"]]
+[Para [Str "25\160m",Superscript [Str "2"]]]
```
```
@@ -87,15 +80,53 @@
[Para [Str "4.5\160\176C\8211\&97367265.5\160\176C"]]
```
-## Squared units
+## Squared, cubed etc. units
```
% pandoc -f latex -t native
\SIrange{10}{20}{\square\meter}
^D
-[Para [Str "10\160m\178\8211\&20\160m\178"]]
+[Para [Str "10\160m",Superscript [Str "2"],Str "\8211\&20\160m",Superscript [Str "2"]]]
```
+```
+% pandoc -f latex -t native
+\SIrange{10}{20}{\cubic\meter}
+^D
+[Para [Str "10\160m",Superscript [Str "3"],Str "\8211\&20\160m",Superscript [Str "3"]]]
+```
+
+```
+% pandoc -f latex -t native
+\SIrange{10}{20}{\raisetothe{4}\meter}
+^D
+[Para [Str "10\160m",Superscript [Str "4"],Str "\8211\&20\160m",Superscript [Str "4"]]]
+```
+
+
+```
+% pandoc -f latex -t native
+\SIrange{10}{20}{\meter\squared}
+^D
+[Para [Str "10\160m",Superscript [Str "2"],Str "\8211\&20\160m",Superscript [Str "2"]]]
+```
+
+```
+% pandoc -f latex -t native
+\SIrange{10}{20}{\meter\cubed}
+^D
+[Para [Str "10\160m",Superscript [Str "3"],Str "\8211\&20\160m",Superscript [Str "3"]]]
+```
+
+```
+% pandoc -f latex -t native
+\SIrange{10}{20}{\meter\tothe{4}}
+^D
+[Para [Str "10\160m",Superscript [Str "4"],Str "\8211\&20\160m",Superscript [Str "4"]]]
+```
+
+
+
## Ignore round precision
`round-precision` option appears to be ignored by `\SI` as of 7c6dbd37e, so