git.iko.soy/typeable/pandoc
on master help sign in
LaTeX reader: Factored out siunitx stuff into separate module.
commit81fe8ebf369279a899ba4995a4cd1f8a883eeeb9 authorJohn MacFarlane <jgm@berkeley.edu> dateWed 2 Sep 2020, 10:10 (6 years ago) parent371a7ff
3 files changed+245−223
pandoc.cabal+1 src/Text/Pandoc/Readers/LaTeX.hs+3−223 src/Text/Pandoc/Readers/LaTeX/SIunitx.hs+241
pandoc.cabal+1
@@ -589,6 +589,7 @@ library
589589 Text.Pandoc.Readers.Docx.Fields,
590590 Text.Pandoc.Readers.LaTeX.Parsing,
591591 Text.Pandoc.Readers.LaTeX.Lang,
592+ Text.Pandoc.Readers.LaTeX.SIunitx,
592593 Text.Pandoc.Readers.Odt.Base,
593594 Text.Pandoc.Readers.Odt.Namespaces,
594595 Text.Pandoc.Readers.Odt.StyleReader,
src/Text/Pandoc/Readers/LaTeX.hs+3−223
@@ -57,6 +57,7 @@ import Text.Pandoc.Readers.LaTeX.Types (ExpansionPoint (..), Macro (..),
5757import Text.Pandoc.Readers.LaTeX.Parsing
5858import Text.Pandoc.Readers.LaTeX.Lang (polyglossiaLangToBCP47,
5959 babelLangToBCP47)
60+import Text.Pandoc.Readers.LaTeX.SIunitx
6061import Text.Pandoc.Shared
6162import qualified Text.Pandoc.Translations as Translations
6263import Text.Pandoc.Walk
@@ -244,227 +245,6 @@ doxspace =
244245 startsWithLetter _ = False
245246
246247
247−-- converts e.g. \SI{1}[\$]{} to "$ 1" or \SI{1}{\euro} to "1 €"
248−dosiunitx :: PandocMonad m => LP m Inlines
249−dosiunitx = do
250− skipopts
251− value <- tok
252− valueprefix <- option "" $ bracketed tok
253− unit <- grouped (mconcat <$> many1 siUnit) <|> siUnit <|> tok
254− let emptyOr160 "" = ""
255− emptyOr160 _ = "\160"
256− return . mconcat $ [valueprefix,
257− emptyOr160 valueprefix,
258− value,
259− emptyOr160 unit,
260− unit]
261−
262−-- converts e.g. \SIrange{100}{200}{\ms} to "100 ms--200 ms"
263−doSIrange :: PandocMonad m => LP m Inlines
264−doSIrange = do
265− skipopts
266− startvalue <- tok
267− startvalueprefix <- option "" $ bracketed tok
268− stopvalue <- tok
269− stopvalueprefix <- option "" $ bracketed tok
270− unit <- grouped (mconcat <$> many1 siUnit) <|> siUnit <|> tok
271− let emptyOr160 "" = ""
272− emptyOr160 _ = "\160"
273− return . mconcat $ [startvalueprefix,
274− emptyOr160 startvalueprefix,
275− startvalue,
276− emptyOr160 unit,
277− unit,
278− "\8211", -- An en-dash
279− stopvalueprefix,
280− emptyOr160 stopvalueprefix,
281− stopvalue,
282− emptyOr160 unit,
283− unit]
284−
285−siUnit :: PandocMonad m => LP m Inlines
286−siUnit = do
287− Tok _ (CtrlSeq name) _ <- anyControlSeq
288− if name == "square"
289− then do
290− unit <- grouped (mconcat <$> many1 siUnit) <|> siUnit <|> tok
291− return . mconcat $ [unit, "\178"]
292− else
293− case M.lookup name siUnitMap of
294− Just il -> return il
295− Nothing -> mzero
296−
297−siUnitMap :: M.Map Text Inlines
298−siUnitMap = M.fromList
299− [ ("fg", str "fg")
300− , ("pg", str "pg")
301− , ("ng", str "ng")
302− , ("ug", str "μg")
303− , ("mg", str "mg")
304− , ("g", str "g")
305− , ("kg", str "kg")
306− , ("amu", str "u")
307− , ("pm", str "pm")
308− , ("nm", str "nm")
309− , ("um", str "μm")
310− , ("mm", str "mm")
311− , ("cm", str "cm")
312− , ("dm", str "dm")
313− , ("m", str "m")
314− , ("km", str "km")
315− , ("as", str "as")
316− , ("fs", str "fs")
317− , ("ps", str "ps")
318− , ("ns", str "ns")
319− , ("us", str "μs")
320− , ("ms", str "ms")
321− , ("s", str "s")
322− , ("fmol", str "fmol")
323− , ("pmol", str "pmol")
324− , ("nmol", str "nmol")
325− , ("umol", str "μmol")
326− , ("mmol", str "mmol")
327− , ("mol", str "mol")
328− , ("kmol", str "kmol")
329− , ("pA", str "pA")
330− , ("nA", str "nA")
331− , ("uA", str "μA")
332− , ("mA", str "mA")
333− , ("A", str "A")
334− , ("kA", str "kA")
335− , ("ul", str "μl")
336− , ("ml", str "ml")
337− , ("l", str "l")
338− , ("hl", str "hl")
339− , ("uL", str "μL")
340− , ("mL", str "mL")
341− , ("L", str "L")
342− , ("hL", str "hL")
343− , ("mHz", str "mHz")
344− , ("Hz", str "Hz")
345− , ("kHz", str "kHz")
346− , ("MHz", str "MHz")
347− , ("GHz", str "GHz")
348− , ("THz", str "THz")
349− , ("mN", str "mN")
350− , ("N", str "N")
351− , ("kN", str "kN")
352− , ("MN", str "MN")
353− , ("Pa", str "Pa")
354− , ("kPa", str "kPa")
355− , ("MPa", str "MPa")
356− , ("GPa", str "GPa")
357− , ("mohm", str "mΩ")
358− , ("kohm", str "kΩ")
359− , ("Mohm", str "MΩ")
360− , ("pV", str "pV")
361− , ("nV", str "nV")
362− , ("uV", str "μV")
363− , ("mV", str "mV")
364− , ("V", str "V")
365− , ("kV", str "kV")
366− , ("W", str "W")
367− , ("uW", str "μW")
368− , ("mW", str "mW")
369− , ("kW", str "kW")
370− , ("MW", str "MW")
371− , ("GW", str "GW")
372− , ("J", str "J")
373− , ("uJ", str "μJ")
374− , ("mJ", str "mJ")
375− , ("kJ", str "kJ")
376− , ("eV", str "eV")
377− , ("meV", str "meV")
378− , ("keV", str "keV")
379− , ("MeV", str "MeV")
380− , ("GeV", str "GeV")
381− , ("TeV", str "TeV")
382− , ("kWh", str "kWh")
383− , ("F", str "F")
384− , ("fF", str "fF")
385− , ("pF", str "pF")
386− , ("K", str "K")
387− , ("dB", str "dB")
388− , ("angstrom", str "Å")
389− , ("arcmin", str "′")
390− , ("arcminute", str "′")
391− , ("arcsecond", str "″")
392− , ("astronomicalunit", str "ua")
393− , ("atomicmassunit", str "u")
394− , ("atto", str "a")
395− , ("bar", str "bar")
396− , ("barn", str "b")
397− , ("becquerel", str "Bq")
398− , ("bel", str "B")
399− , ("candela", str "cd")
400− , ("celsius", str "°C")
401− , ("centi", str "c")
402− , ("coulomb", str "C")
403− , ("dalton", str "Da")
404− , ("day", str "d")
405− , ("deca", str "d")
406− , ("deci", str "d")
407− , ("decibel", str "db")
408− , ("degreeCelsius",str "°C")
409− , ("degree", str "°")
410− , ("deka", str "d")
411− , ("electronvolt", str "eV")
412− , ("exa", str "E")
413− , ("farad", str "F")
414− , ("femto", str "f")
415− , ("giga", str "G")
416− , ("gram", str "g")
417− , ("hectare", str "ha")
418− , ("hecto", str "h")
419− , ("henry", str "H")
420− , ("hertz", str "Hz")
421− , ("hour", str "h")
422− , ("joule", str "J")
423− , ("katal", str "kat")
424− , ("kelvin", str "K")
425− , ("kilo", str "k")
426− , ("kilogram", str "kg")
427− , ("knot", str "kn")
428− , ("liter", str "L")
429− , ("litre", str "l")
430− , ("lumen", str "lm")
431− , ("lux", str "lx")
432− , ("mega", str "M")
433− , ("meter", str "m")
434− , ("metre", str "m")
435− , ("micro", str "μ")
436− , ("milli", str "m")
437− , ("minute", str "min")
438− , ("mmHg", str "mmHg")
439− , ("mole", str "mol")
440− , ("nano", str "n")
441− , ("nauticalmile", str "M")
442− , ("neper", str "Np")
443− , ("newton", str "N")
444− , ("ohm", str "Ω")
445− , ("Pa", str "Pa")
446− , ("pascal", str "Pa")
447− , ("percent", str "%")
448− , ("per", str "/")
449− , ("peta", str "P")
450− , ("pico", str "p")
451− , ("radian", str "rad")
452− , ("second", str "s")
453− , ("siemens", str "S")
454− , ("sievert", str "Sv")
455− , ("steradian", str "sr")
456− , ("tera", str "T")
457− , ("tesla", str "T")
458− , ("tonne", str "t")
459− , ("volt", str "V")
460− , ("watt", str "W")
461− , ("weber", str "Wb")
462− , ("yocto", str "y")
463− , ("yotta", str "Y")
464− , ("zepto", str "z")
465− , ("zetta", str "Z")
466− ]
467−
468248lit :: Text -> LP m Inlines
469249lit = pure . str
470250
@@ -1097,8 +877,8 @@ inlineCommands = M.union inlineLanguageCommands $ M.fromList
1097877 , ("acfp", doAcronymPlural "full")
1098878 , ("acsp", doAcronymPlural "abbrv")
1099879 -- siuntix
1100− , ("SI", dosiunitx)
1101− , ("SIrange", doSIrange)
880+ , ("SI", dosiunitx tok)
881+ , ("SIrange", doSIrange tok)
1102882 -- hyphenat
1103883 , ("bshyp", lit "\\\173")
1104884 , ("fshyp", lit "/\173")
src/Text/Pandoc/Readers/LaTeX/SIunitx.hsnew file+241
@@ -0,0 +1,241 @@
1+{-# LANGUAGE OverloadedStrings #-}
2+module Text.Pandoc.Readers.LaTeX.SIunitx
3+ ( dosiunitx
4+ , doSIrange
5+ )
6+where
7+import Text.Pandoc.Builder
8+import Text.Pandoc.Readers.LaTeX.Parsing
9+import Text.Pandoc.Readers.LaTeX.Types
10+import Text.Pandoc.Class
11+import Control.Monad (mzero)
12+import Text.Pandoc.Parsing hiding (blankline, many, mathDisplay, mathInline,
13+ optional, space, spaces, withRaw, (<|>))
14+import Control.Applicative ((<|>))
15+import qualified Data.Map as M
16+import Data.Text (Text)
17+
18+-- converts e.g. \SI{1}[\$]{} to "$ 1" or \SI{1}{\euro} to "1 €"
19+dosiunitx :: PandocMonad m => LP m Inlines -> LP m Inlines
20+dosiunitx tok = do
21+ skipopts
22+ value <- tok
23+ valueprefix <- option "" $ bracketed tok
24+ unit <- rawUnit tok
25+ return . mconcat $ [valueprefix,
26+ emptyOr160 valueprefix,
27+ value,
28+ emptyOr160 unit,
29+ unit]
30+
31+-- converts e.g. \SIrange{100}{200}{\ms} to "100 ms--200 ms"
32+doSIrange :: PandocMonad m => LP m Inlines -> LP m Inlines
33+doSIrange tok = do
34+ skipopts
35+ startvalue <- tok
36+ startvalueprefix <- option "" $ bracketed tok
37+ stopvalue <- tok
38+ stopvalueprefix <- option "" $ bracketed tok
39+ unit <- rawUnit tok
40+ return . mconcat $ [startvalueprefix,
41+ emptyOr160 startvalueprefix,
42+ startvalue,
43+ emptyOr160 unit,
44+ unit,
45+ "\8211", -- An en-dash
46+ stopvalueprefix,
47+ emptyOr160 stopvalueprefix,
48+ stopvalue,
49+ emptyOr160 unit,
50+ unit]
51+
52+rawUnit :: PandocMonad m => LP m Inlines -> LP m Inlines
53+rawUnit tok = grouped (mconcat <$> many1 (siUnit tok)) <|> siUnit tok <|> tok
54+
55+emptyOr160 :: Inlines -> Inlines
56+emptyOr160 x = if x == mempty then x else str "\160"
57+
58+siUnit :: PandocMonad m => LP m Inlines -> LP m Inlines
59+siUnit tok = do
60+ Tok _ (CtrlSeq name) _ <- anyControlSeq
61+ if name == "square"
62+ then do
63+ unit <- rawUnit tok
64+ return $ unit <> "\178"
65+ else
66+ case M.lookup name siUnitMap of
67+ Just il -> return il
68+ Nothing -> mzero
69+
70+siUnitMap :: M.Map Text Inlines
71+siUnitMap = M.fromList
72+ [ ("fg", str "fg")
73+ , ("pg", str "pg")
74+ , ("ng", str "ng")
75+ , ("ug", str "μg")
76+ , ("mg", str "mg")
77+ , ("g", str "g")
78+ , ("kg", str "kg")
79+ , ("amu", str "u")
80+ , ("pm", str "pm")
81+ , ("nm", str "nm")
82+ , ("um", str "μm")
83+ , ("mm", str "mm")
84+ , ("cm", str "cm")
85+ , ("dm", str "dm")
86+ , ("m", str "m")
87+ , ("km", str "km")
88+ , ("as", str "as")
89+ , ("fs", str "fs")
90+ , ("ps", str "ps")
91+ , ("ns", str "ns")
92+ , ("us", str "μs")
93+ , ("ms", str "ms")
94+ , ("s", str "s")
95+ , ("fmol", str "fmol")
96+ , ("pmol", str "pmol")
97+ , ("nmol", str "nmol")
98+ , ("umol", str "μmol")
99+ , ("mmol", str "mmol")
100+ , ("mol", str "mol")
101+ , ("kmol", str "kmol")
102+ , ("pA", str "pA")
103+ , ("nA", str "nA")
104+ , ("uA", str "μA")
105+ , ("mA", str "mA")
106+ , ("A", str "A")
107+ , ("kA", str "kA")
108+ , ("ul", str "μl")
109+ , ("ml", str "ml")
110+ , ("l", str "l")
111+ , ("hl", str "hl")
112+ , ("uL", str "μL")
113+ , ("mL", str "mL")
114+ , ("L", str "L")
115+ , ("hL", str "hL")
116+ , ("mHz", str "mHz")
117+ , ("Hz", str "Hz")
118+ , ("kHz", str "kHz")
119+ , ("MHz", str "MHz")
120+ , ("GHz", str "GHz")
121+ , ("THz", str "THz")
122+ , ("mN", str "mN")
123+ , ("N", str "N")
124+ , ("kN", str "kN")
125+ , ("MN", str "MN")
126+ , ("Pa", str "Pa")
127+ , ("kPa", str "kPa")
128+ , ("MPa", str "MPa")
129+ , ("GPa", str "GPa")
130+ , ("mohm", str "mΩ")
131+ , ("kohm", str "kΩ")
132+ , ("Mohm", str "MΩ")
133+ , ("pV", str "pV")
134+ , ("nV", str "nV")
135+ , ("uV", str "μV")
136+ , ("mV", str "mV")
137+ , ("V", str "V")
138+ , ("kV", str "kV")
139+ , ("W", str "W")
140+ , ("uW", str "μW")
141+ , ("mW", str "mW")
142+ , ("kW", str "kW")
143+ , ("MW", str "MW")
144+ , ("GW", str "GW")
145+ , ("J", str "J")
146+ , ("uJ", str "μJ")
147+ , ("mJ", str "mJ")
148+ , ("kJ", str "kJ")
149+ , ("eV", str "eV")
150+ , ("meV", str "meV")
151+ , ("keV", str "keV")
152+ , ("MeV", str "MeV")
153+ , ("GeV", str "GeV")
154+ , ("TeV", str "TeV")
155+ , ("kWh", str "kWh")
156+ , ("F", str "F")
157+ , ("fF", str "fF")
158+ , ("pF", str "pF")
159+ , ("K", str "K")
160+ , ("dB", str "dB")
161+ , ("angstrom", str "Å")
162+ , ("arcmin", str "′")
163+ , ("arcminute", str "′")
164+ , ("arcsecond", str "″")
165+ , ("astronomicalunit", str "ua")
166+ , ("atomicmassunit", str "u")
167+ , ("atto", str "a")
168+ , ("bar", str "bar")
169+ , ("barn", str "b")
170+ , ("becquerel", str "Bq")
171+ , ("bel", str "B")
172+ , ("candela", str "cd")
173+ , ("celsius", str "°C")
174+ , ("centi", str "c")
175+ , ("coulomb", str "C")
176+ , ("dalton", str "Da")
177+ , ("day", str "d")
178+ , ("deca", str "d")
179+ , ("deci", str "d")
180+ , ("decibel", str "db")
181+ , ("degreeCelsius",str "°C")
182+ , ("degree", str "°")
183+ , ("deka", str "d")
184+ , ("electronvolt", str "eV")
185+ , ("exa", str "E")
186+ , ("farad", str "F")
187+ , ("femto", str "f")
188+ , ("giga", str "G")
189+ , ("gram", str "g")
190+ , ("hectare", str "ha")
191+ , ("hecto", str "h")
192+ , ("henry", str "H")
193+ , ("hertz", str "Hz")
194+ , ("hour", str "h")
195+ , ("joule", str "J")
196+ , ("katal", str "kat")
197+ , ("kelvin", str "K")
198+ , ("kilo", str "k")
199+ , ("kilogram", str "kg")
200+ , ("knot", str "kn")
201+ , ("liter", str "L")
202+ , ("litre", str "l")
203+ , ("lumen", str "lm")
204+ , ("lux", str "lx")
205+ , ("mega", str "M")
206+ , ("meter", str "m")
207+ , ("metre", str "m")
208+ , ("micro", str "μ")
209+ , ("milli", str "m")
210+ , ("minute", str "min")
211+ , ("mmHg", str "mmHg")
212+ , ("mole", str "mol")
213+ , ("nano", str "n")
214+ , ("nauticalmile", str "M")
215+ , ("neper", str "Np")
216+ , ("newton", str "N")
217+ , ("ohm", str "Ω")
218+ , ("Pa", str "Pa")
219+ , ("pascal", str "Pa")
220+ , ("percent", str "%")
221+ , ("per", str "/")
222+ , ("peta", str "P")
223+ , ("pico", str "p")
224+ , ("radian", str "rad")
225+ , ("second", str "s")
226+ , ("siemens", str "S")
227+ , ("sievert", str "Sv")
228+ , ("steradian", str "sr")
229+ , ("tera", str "T")
230+ , ("tesla", str "T")
231+ , ("tonne", str "t")
232+ , ("volt", str "V")
233+ , ("watt", str "W")
234+ , ("weber", str "Wb")
235+ , ("yocto", str "y")
236+ , ("yotta", str "Y")
237+ , ("zepto", str "z")
238+ , ("zetta", str "Z")
239+ ]
240+
241+