PrintLaTeX.hs revision e6d40133bc9f858308654afb1262b8b483ec5922
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maeder{- |
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian MaederModule : $Header$
e6d40133bc9f858308654afb1262b8b483ec5922Till MossakowskiDescription : functions for LaTeX pretty printing
1549f3abf73c1122acff724f718b615c82fa3648Till MossakowskiCopyright : (c) Klaus L�ttich, Christian Maeder and Uni Bremen 2002-2006
97018cf5fa25b494adffd7e9b4e87320dae6bf47Christian MaederLicense : similar to LGPL, see HetCATS/LICENSE.txt or LIZENZ.txt
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maeder
3f69b6948966979163bdfe8331c38833d5d90ecdChristian MaederMaintainer : luettich@tzi.de
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian MaederStability : provisional
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian MaederPortability : portable
f3a94a197960e548ecd6520bb768cb0d547457bbChristian Maeder
e6d40133bc9f858308654afb1262b8b483ec5922Till MossakowskiFunctions for LaTeX pretty printing
1549f3abf73c1122acff724f718b615c82fa3648Till Mossakowski
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maeder-}
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maeder
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maedermodule Common.PrintLaTeX
f8b715ab2993083761c0aedb78f1819bcf67b6ccChristian Maeder ( renderLatex
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maeder , debugRenderLatex
575a55eadc8dcab8ee350324b417cbd9e52e69c0Christian Maeder , renderLatexVerb
ad270004874ce1d0697fb30d7309f180553bb315Christian Maeder , renderInternalLatex
ad270004874ce1d0697fb30d7309f180553bb315Christian Maeder , setTabWithSpaces
5e46b572ed576c0494768998b043d9d340594122Till Mossakowski )
db453fe9625a9dab5d108f7a5e464598814144b8Jian Chun Wang where
23a00c966f2aa8da525d7a7c51933c99964426c0Christian Maeder
575a55eadc8dcab8ee350324b417cbd9e52e69c0Christian Maederimport Data.Char (isSpace, isDigit)
575a55eadc8dcab8ee350324b417cbd9e52e69c0Christian Maederimport Common.Lib.State (State(..),evalState,get,put)
575a55eadc8dcab8ee350324b417cbd9e52e69c0Christian Maederimport Data.List (isPrefixOf,isSuffixOf)
db453fe9625a9dab5d108f7a5e464598814144b8Jian Chun Wang
575a55eadc8dcab8ee350324b417cbd9e52e69c0Christian Maederimport Common.Lib.Pretty
8c63cd89ef840cd7a3d3b75f0207dc800388c800Christian Maederimport Common.LaTeX_funs
575a55eadc8dcab8ee350324b417cbd9e52e69c0Christian Maeder
a001917177db7ae636853b37c0d0f9f4e90a83ffChristian Maeder----------------------------------------------------------------------
a001917177db7ae636853b37c0d0f9f4e90a83ffChristian Maeder-- a style for formatting (Standard is Style PageMode 50 1.19)
58b671de3fe578346fef9642ffa3c5a0a0edb3cbTill Mossakowski
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian MaederlatexStyle :: Style
0e2ae85e2453466d03c1fc5884a3d693235bb9d9Christian MaederlatexStyle = style { ribbonsPerLine = 1.1
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maeder , lineLength = calc_line_length "345.0pt"}
90c174bac60a72ffd81bc3bf5ae2dd9a61943b8bChristian Maeder -- for svmono you need 336.0pt
2561b4bfc45d280ee2be8a7870314670e4e682e4Christian Maeder
ca020e82eb3567e7bdbb1cf70729efbd07e9caa4Klaus Luettich-- a LatexRenderingState
ca020e82eb3567e7bdbb1cf70729efbd07e9caa4Klaus Luettich-- field indentTabs : for the number of tab
ca020e82eb3567e7bdbb1cf70729efbd07e9caa4Klaus Luettich-- stops set those need to be rendererd after every newline.
ca020e82eb3567e7bdbb1cf70729efbd07e9caa4Klaus Luettich-- field recentlySet : number of setTab makros indentTabs is only
a001917177db7ae636853b37c0d0f9f4e90a83ffChristian Maeder-- increased if recentlySet is 0
a001917177db7ae636853b37c0d0f9f4e90a83ffChristian Maederdata LRState = LRS { indentTabs :: ![Int]
58b671de3fe578346fef9642ffa3c5a0a0edb3cbTill Mossakowski , recentlySet
03136b84a0c70d877e227444f0875e209506b9e4Christian Maeder , totalTabStops
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maeder , setTabsThisLine
4b6aa93c12e4db86ccc7694a48a73e9cf7262d06Christian Maeder , indentTabsWritten :: !Int
c7e03d0708369f944b6f235057b39142a21599f2Mihai Codescu , onlyTabs :: !Bool
986d3f255182539098a97ac86da9eeee5b7a72e3Christian Maeder , isSetLine :: !Bool
986d3f255182539098a97ac86da9eeee5b7a72e3Christian Maeder , collSpaceIndents :: ![Int]
986d3f255182539098a97ac86da9eeee5b7a72e3Christian Maeder , insideAnno :: Bool
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maeder }
2b2f3b72e82e28b34db9c69af2d1ec38f228272eChristian Maeder deriving (Show)
2b2f3b72e82e28b34db9c69af2d1ec38f228272eChristian Maeder
8e80792f474d154ff11762fac081a422e34f1accChristian Maeder-- the initial state for using the state based rendering via LRState
03136b84a0c70d877e227444f0875e209506b9e4Christian MaederinitialLRState :: LRState
03136b84a0c70d877e227444f0875e209506b9e4Christian MaederinitialLRState = LRS { indentTabs = []
2b2f3b72e82e28b34db9c69af2d1ec38f228272eChristian Maeder , recentlySet = 0
03136b84a0c70d877e227444f0875e209506b9e4Christian Maeder , totalTabStops = 0
03136b84a0c70d877e227444f0875e209506b9e4Christian Maeder , setTabsThisLine = 0
03136b84a0c70d877e227444f0875e209506b9e4Christian Maeder , indentTabsWritten = 0
03136b84a0c70d877e227444f0875e209506b9e4Christian Maeder , onlyTabs = False
d79e02625778d20a5458078f979ff74aac67db61Christian Maeder , isSetLine = False
d79e02625778d20a5458078f979ff74aac67db61Christian Maeder , collSpaceIndents = []
74d9a385499bf903b24848dff450a153f525bda7Christian Maeder , insideAnno = False
4c7f058cdd19ce67b2b5d4b7f69703d0f8a21e38Christian Maeder }
4c7f058cdd19ce67b2b5d4b7f69703d0f8a21e38Christian Maeder
d79e02625778d20a5458078f979ff74aac67db61Christian Maeder-- a function that knows how to print LaTeX TextDetails
d79e02625778d20a5458078f979ff74aac67db61Christian Maederlatex_txt :: TextDetails -> State LRState ShowS -> State LRState ShowS
d79e02625778d20a5458078f979ff74aac67db61Christian Maederlatex_txt (Chr c) cont
d79e02625778d20a5458078f979ff74aac67db61Christian Maeder | c == '\n' = do annoBrace <- endOfLine
d79e02625778d20a5458078f979ff74aac67db61Christian Maeder indent <- getIndent
d79e02625778d20a5458078f979ff74aac67db61Christian Maeder s <- cont
d79e02625778d20a5458078f979ff74aac67db61Christian Maeder return (annoBrace . showString "\\\\".
d79e02625778d20a5458078f979ff74aac67db61Christian Maeder showChar c . indent . s)
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maeder | otherwise = do s <- cont
4b6aa93c12e4db86ccc7694a48a73e9cf7262d06Christian Maeder return (showChar c . s)
4b6aa93c12e4db86ccc7694a48a73e9cf7262d06Christian Maederlatex_txt (Str s1) cont
4b6aa93c12e4db86ccc7694a48a73e9cf7262d06Christian Maeder | null s1 = cont
4b6aa93c12e4db86ccc7694a48a73e9cf7262d06Christian Maeder | all isSpace s1 = do s2 <- cont
a001917177db7ae636853b37c0d0f9f4e90a83ffChristian Maeder return (showChar ' ' . s2)
03136b84a0c70d877e227444f0875e209506b9e4Christian Maeder | otherwise = do setOnlyTabs False
03136b84a0c70d877e227444f0875e209506b9e4Christian Maeder s2 <- cont
4b6aa93c12e4db86ccc7694a48a73e9cf7262d06Christian Maeder return (showString s1 . s2)
5e46b572ed576c0494768998b043d9d340594122Till Mossakowskilatex_txt (PStr s1) cont
5e46b572ed576c0494768998b043d9d340594122Till Mossakowski | s1 == startTab = do indent <- addTabStop
5e46b572ed576c0494768998b043d9d340594122Till Mossakowski s2 <- cont
4b6aa93c12e4db86ccc7694a48a73e9cf7262d06Christian Maeder return (indent . s2)
03136b84a0c70d877e227444f0875e209506b9e4Christian Maeder | s1 == endTab = do subTabStop
03136b84a0c70d877e227444f0875e209506b9e4Christian Maeder cont
03136b84a0c70d877e227444f0875e209506b9e4Christian Maeder | s1 == setTab = do state <- get
4b6aa93c12e4db86ccc7694a48a73e9cf7262d06Christian Maeder setTabStop
7a47fbe6b987bd69a5056ce5d00fc8710f6c5e8aChristian Maeder s2 <- cont
03136b84a0c70d877e227444f0875e209506b9e4Christian Maeder let (eAn,sAn) = if insideAnno state
03136b84a0c70d877e227444f0875e209506b9e4Christian Maeder then (showChar '}',
e01299e9b22b96b31b720ca1e9f9f5f25af9b024Christian Maeder showString startAnno)
7a47fbe6b987bd69a5056ce5d00fc8710f6c5e8aChristian Maeder else (id,id)
58b671de3fe578346fef9642ffa3c5a0a0edb3cbTill Mossakowski return (eAn. (if onlyTabs state then
a001917177db7ae636853b37c0d0f9f4e90a83ffChristian Maeder id else showString s1) . sAn. s2)
58b671de3fe578346fef9642ffa3c5a0a0edb3cbTill Mossakowski | setTabWSp
58b671de3fe578346fef9642ffa3c5a0a0edb3cbTill Mossakowski `isPrefixOf`
58b671de3fe578346fef9642ffa3c5a0a0edb3cbTill Mossakowski s1 = do addTabWithSpaces s1
4b6aa93c12e4db86ccc7694a48a73e9cf7262d06Christian Maeder cont
a001917177db7ae636853b37c0d0f9f4e90a83ffChristian Maeder | s1== startAnno = do setInsideAnno True
03136b84a0c70d877e227444f0875e209506b9e4Christian Maeder s2 <- cont
4b6aa93c12e4db86ccc7694a48a73e9cf7262d06Christian Maeder return (showString s1 . s2)
7a47fbe6b987bd69a5056ce5d00fc8710f6c5e8aChristian Maeder | s1 == endAnno = do setInsideAnno False
a001917177db7ae636853b37c0d0f9f4e90a83ffChristian Maeder s2 <- cont
68138d26bcddf5e89c30206aa83ab5ec006d170dChristian Maeder return (showChar '}' . s2)
4601edb679f0ba530bbb085b25d82a411cd070aaChristian Maeder | s1 == "\n" = do annoBrace <- endOfLine
03136b84a0c70d877e227444f0875e209506b9e4Christian Maeder indent <- getIndent
26d11a256b1433604a3dbc69913b520fff7586acChristian Maeder s2 <- cont
03136b84a0c70d877e227444f0875e209506b9e4Christian Maeder return (annoBrace . showString "\\\\\n" .
03136b84a0c70d877e227444f0875e209506b9e4Christian Maeder indent . s2)
2b2f3b72e82e28b34db9c69af2d1ec38f228272eChristian Maeder | "\\kill\n"
03136b84a0c70d877e227444f0875e209506b9e4Christian Maeder `isSuffixOf`
03136b84a0c70d877e227444f0875e209506b9e4Christian Maeder s1 = do indent <- getIndent
03136b84a0c70d877e227444f0875e209506b9e4Christian Maeder s2 <- cont
03136b84a0c70d877e227444f0875e209506b9e4Christian Maeder return (showString s1 .
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maeder indent . s2)
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maeder | otherwise = do setOnlyTabs False
03136b84a0c70d877e227444f0875e209506b9e4Christian Maeder s2 <- cont
03136b84a0c70d877e227444f0875e209506b9e4Christian Maeder return (showString s1 . s2)
03136b84a0c70d877e227444f0875e209506b9e4Christian Maeder
03136b84a0c70d877e227444f0875e209506b9e4Christian Maeder-- a function that knows how to print LaTeX TextDetails
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maederdebug_latex_txt :: TextDetails -> State LRState String -> State LRState String
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maederdebug_latex_txt (Chr c) cont
58b671de3fe578346fef9642ffa3c5a0a0edb3cbTill Mossakowski | c == '\n' = do state <- get
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maeder annoBrace <- endOfLine
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maeder indent <- getIndent
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maeder s <- cont
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maeder return (annoBrace "\\\\%"++show (state::LRState)
7a47fbe6b987bd69a5056ce5d00fc8710f6c5e8aChristian Maeder ++c:(indent s))
03136b84a0c70d877e227444f0875e209506b9e4Christian Maeder | otherwise = do s <- cont
03136b84a0c70d877e227444f0875e209506b9e4Christian Maeder return (c:s)
03136b84a0c70d877e227444f0875e209506b9e4Christian Maederdebug_latex_txt (Str s1) cont
03136b84a0c70d877e227444f0875e209506b9e4Christian Maeder | null s1 = cont
5e46b572ed576c0494768998b043d9d340594122Till Mossakowski | all isSpace s1 = do s2 <- cont
74d9a385499bf903b24848dff450a153f525bda7Christian Maeder return ( ' ':s2)
03136b84a0c70d877e227444f0875e209506b9e4Christian Maeder | otherwise = do setOnlyTabs False
03136b84a0c70d877e227444f0875e209506b9e4Christian Maeder s2 <- cont
03136b84a0c70d877e227444f0875e209506b9e4Christian Maeder return (s1 ++ s2)
03136b84a0c70d877e227444f0875e209506b9e4Christian Maederdebug_latex_txt (PStr s1) cont
03136b84a0c70d877e227444f0875e209506b9e4Christian Maeder | s1 == startTab = do indent <- addTabStop
03136b84a0c70d877e227444f0875e209506b9e4Christian Maeder s2 <- cont
03136b84a0c70d877e227444f0875e209506b9e4Christian Maeder return (s1 ++ indent s2)
03136b84a0c70d877e227444f0875e209506b9e4Christian Maeder | s1 == endTab = do subTabStop
03136b84a0c70d877e227444f0875e209506b9e4Christian Maeder s2 <- cont
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maeder return (s1 ++ s2)
58b671de3fe578346fef9642ffa3c5a0a0edb3cbTill Mossakowski | s1 == setTab = do state <- get
58b671de3fe578346fef9642ffa3c5a0a0edb3cbTill Mossakowski setTabStop
8c63cd89ef840cd7a3d3b75f0207dc800388c800Christian Maeder s2 <- cont
8c63cd89ef840cd7a3d3b75f0207dc800388c800Christian Maeder let (eAn,sAn) = if insideAnno state
8c63cd89ef840cd7a3d3b75f0207dc800388c800Christian Maeder then (showChar '}',
8c63cd89ef840cd7a3d3b75f0207dc800388c800Christian Maeder showString startAnno)
8c63cd89ef840cd7a3d3b75f0207dc800388c800Christian Maeder else (id,id)
8c63cd89ef840cd7a3d3b75f0207dc800388c800Christian Maeder return (eAn s1 ++ sAn s2)
8c63cd89ef840cd7a3d3b75f0207dc800388c800Christian Maeder | setTabWSp
8c63cd89ef840cd7a3d3b75f0207dc800388c800Christian Maeder `isPrefixOf`
8c63cd89ef840cd7a3d3b75f0207dc800388c800Christian Maeder s1 = do addTabWithSpaces s1
8c63cd89ef840cd7a3d3b75f0207dc800388c800Christian Maeder s2 <- cont
8c63cd89ef840cd7a3d3b75f0207dc800388c800Christian Maeder return (s1 ++ s2)
8c63cd89ef840cd7a3d3b75f0207dc800388c800Christian Maeder | s1== startAnno = do setInsideAnno True
575a55eadc8dcab8ee350324b417cbd9e52e69c0Christian Maeder s2 <- cont
8c63cd89ef840cd7a3d3b75f0207dc800388c800Christian Maeder return (s1 ++ s2)
8c63cd89ef840cd7a3d3b75f0207dc800388c800Christian Maeder | s1 == endAnno = do setInsideAnno False
58b671de3fe578346fef9642ffa3c5a0a0edb3cbTill Mossakowski s2 <- cont
03136b84a0c70d877e227444f0875e209506b9e4Christian Maeder return ('}' : s2)
03136b84a0c70d877e227444f0875e209506b9e4Christian Maeder | s1 == "\n" = do state <- get
03136b84a0c70d877e227444f0875e209506b9e4Christian Maeder annoBrace <- endOfLine
03136b84a0c70d877e227444f0875e209506b9e4Christian Maeder indent <- getIndent
03136b84a0c70d877e227444f0875e209506b9e4Christian Maeder s2 <- cont
8c63cd89ef840cd7a3d3b75f0207dc800388c800Christian Maeder return (annoBrace "\\\\%"++show (state::LRState)
8c63cd89ef840cd7a3d3b75f0207dc800388c800Christian Maeder ++s1++indent s2)
8c63cd89ef840cd7a3d3b75f0207dc800388c800Christian Maeder | otherwise = do setOnlyTabs False
8c63cd89ef840cd7a3d3b75f0207dc800388c800Christian Maeder s2 <- cont
8c63cd89ef840cd7a3d3b75f0207dc800388c800Christian Maeder return (s1 ++ s2)
03136b84a0c70d877e227444f0875e209506b9e4Christian Maeder
03136b84a0c70d877e227444f0875e209506b9e4Christian Maeder
03136b84a0c70d877e227444f0875e209506b9e4Christian MaedersetOnlyTabs :: Bool -> State LRState ()
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian MaedersetOnlyTabs b = do state <- get
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maeder put $ state {onlyTabs = b}
a001917177db7ae636853b37c0d0f9f4e90a83ffChristian Maeder
8c63cd89ef840cd7a3d3b75f0207dc800388c800Christian MaedersetInsideAnno :: Bool -> State LRState ()
8c63cd89ef840cd7a3d3b75f0207dc800388c800Christian MaedersetInsideAnno b = do state <- get
8c63cd89ef840cd7a3d3b75f0207dc800388c800Christian Maeder put $ state {insideAnno = b}
8c63cd89ef840cd7a3d3b75f0207dc800388c800Christian Maeder
8c63cd89ef840cd7a3d3b75f0207dc800388c800Christian Maeder-- a function to produce a String containing the actual tab stops in use
8c63cd89ef840cd7a3d3b75f0207dc800388c800Christian MaedergetIndent :: State LRState ShowS
8c63cd89ef840cd7a3d3b75f0207dc800388c800Christian MaedergetIndent = do state <- get
8c63cd89ef840cd7a3d3b75f0207dc800388c800Christian Maeder let indentTabsSum = foldl (+) 0 (indentTabs state)
8c63cd89ef840cd7a3d3b75f0207dc800388c800Christian Maeder put $ state { indentTabsWritten = indentTabsSum
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maeder , collSpaceIndents = []
58b671de3fe578346fef9642ffa3c5a0a0edb3cbTill Mossakowski , onlyTabs = True
03136b84a0c70d877e227444f0875e209506b9e4Christian Maeder , totalTabStops = max (totalTabStops state)
03136b84a0c70d877e227444f0875e209506b9e4Christian Maeder (indentTabsSum +
03136b84a0c70d877e227444f0875e209506b9e4Christian Maeder length
58b671de3fe578346fef9642ffa3c5a0a0edb3cbTill Mossakowski (collSpaceIndents state))
e01299e9b22b96b31b720ca1e9f9f5f25af9b024Christian Maeder }
e01299e9b22b96b31b720ca1e9f9f5f25af9b024Christian Maeder let indent_fun = foldl (.) id (replicate indentTabsSum
e01299e9b22b96b31b720ca1e9f9f5f25af9b024Christian Maeder (showString "\\>"))
a001917177db7ae636853b37c0d0f9f4e90a83ffChristian Maeder new_tab_line = foldl space_format id
03136b84a0c70d877e227444f0875e209506b9e4Christian Maeder (collSpaceIndents state)
03136b84a0c70d877e227444f0875e209506b9e4Christian Maeder . showString "\\kill\n"
03136b84a0c70d877e227444f0875e209506b9e4Christian Maeder sAnno = (if insideAnno state
58b671de3fe578346fef9642ffa3c5a0a0edb3cbTill Mossakowski then showString startAnno
58b671de3fe578346fef9642ffa3c5a0a0edb3cbTill Mossakowski else id)
03136b84a0c70d877e227444f0875e209506b9e4Christian Maeder return ( (if null (collSpaceIndents state) then
03136b84a0c70d877e227444f0875e209506b9e4Christian Maeder indent_fun
575a55eadc8dcab8ee350324b417cbd9e52e69c0Christian Maeder else
575a55eadc8dcab8ee350324b417cbd9e52e69c0Christian Maeder indent_fun . new_tab_line . indent_fun)
03136b84a0c70d877e227444f0875e209506b9e4Christian Maeder . sAnno)
03136b84a0c70d877e227444f0875e209506b9e4Christian Maeder where space_format :: (ShowS) -> Int -> ShowS
03136b84a0c70d877e227444f0875e209506b9e4Christian Maeder space_format sf1 i = sf1 . showString (replicate i '~')
e01299e9b22b96b31b720ca1e9f9f5f25af9b024Christian Maeder . showString "\\="
e01299e9b22b96b31b720ca1e9f9f5f25af9b024Christian Maeder
03136b84a0c70d877e227444f0875e209506b9e4Christian MaederendOfLine :: State LRState ShowS
03136b84a0c70d877e227444f0875e209506b9e4Christian MaederendOfLine = do state <- get
03136b84a0c70d877e227444f0875e209506b9e4Christian Maeder put $ state { isSetLine = False
e01299e9b22b96b31b720ca1e9f9f5f25af9b024Christian Maeder , setTabsThisLine = 0
e01299e9b22b96b31b720ca1e9f9f5f25af9b024Christian Maeder }
3df765bba27034f17ba60ee9b90d7dbd3643ea9eChristian Maeder return (if insideAnno state then showChar '}' else id)
e01299e9b22b96b31b720ca1e9f9f5f25af9b024Christian Maeder
e01299e9b22b96b31b720ca1e9f9f5f25af9b024Christian MaedersetTabStop :: State LRState ()
e01299e9b22b96b31b720ca1e9f9f5f25af9b024Christian MaedersetTabStop = State (\state -> ( ()
e01299e9b22b96b31b720ca1e9f9f5f25af9b024Christian Maeder , let new_setTabsThisLine =
e01299e9b22b96b31b720ca1e9f9f5f25af9b024Christian Maeder succ $ setTabsThisLine state
a001917177db7ae636853b37c0d0f9f4e90a83ffChristian Maeder in if onlyTabs state then state
a001917177db7ae636853b37c0d0f9f4e90a83ffChristian Maeder { isSetLine = True }
e01299e9b22b96b31b720ca1e9f9f5f25af9b024Christian Maeder else
e01299e9b22b96b31b720ca1e9f9f5f25af9b024Christian Maeder state
58b671de3fe578346fef9642ffa3c5a0a0edb3cbTill Mossakowski {
03136b84a0c70d877e227444f0875e209506b9e4Christian Maeder recentlySet = succ $ recentlySet state
0e2ae85e2453466d03c1fc5884a3d693235bb9d9Christian Maeder , setTabsThisLine = new_setTabsThisLine
200849122a9c65773e5b2ba8084ac3490d0490b5Christian Maeder , totalTabStops =
200849122a9c65773e5b2ba8084ac3490d0490b5Christian Maeder max (totalTabStops state)
a001917177db7ae636853b37c0d0f9f4e90a83ffChristian Maeder (new_setTabsThisLine +
200849122a9c65773e5b2ba8084ac3490d0490b5Christian Maeder indentTabsWritten state)
200849122a9c65773e5b2ba8084ac3490d0490b5Christian Maeder , isSetLine = True}
200849122a9c65773e5b2ba8084ac3490d0490b5Christian Maeder ))
200849122a9c65773e5b2ba8084ac3490d0490b5Christian Maeder
200849122a9c65773e5b2ba8084ac3490d0490b5Christian MaederaddTabWithSpaces :: String -> State LRState ()
200849122a9c65773e5b2ba8084ac3490d0490b5Christian MaederaddTabWithSpaces s = let delayed_indent :: Int
200849122a9c65773e5b2ba8084ac3490d0490b5Christian Maeder delayed_indent =
a001917177db7ae636853b37c0d0f9f4e90a83ffChristian Maeder (read . reverse . fst
200849122a9c65773e5b2ba8084ac3490d0490b5Christian Maeder . span isDigit . tail . reverse) s
200849122a9c65773e5b2ba8084ac3490d0490b5Christian Maeder in State (\state -> ( ()
a001917177db7ae636853b37c0d0f9f4e90a83ffChristian Maeder , state { collSpaceIndents =
200849122a9c65773e5b2ba8084ac3490d0490b5Christian Maeder collSpaceIndents state
0b6f6d3eeb7b3b36292e60f1b3da5a5ce42eef1aChristian Maeder ++ [delayed_indent]
200849122a9c65773e5b2ba8084ac3490d0490b5Christian Maeder }
200849122a9c65773e5b2ba8084ac3490d0490b5Christian Maeder ))
200849122a9c65773e5b2ba8084ac3490d0490b5Christian Maeder
200849122a9c65773e5b2ba8084ac3490d0490b5Christian Maeder-- increase the indentTabs in the state by 1
200849122a9c65773e5b2ba8084ac3490d0490b5Christian MaederaddTabStop :: State LRState ShowS
200849122a9c65773e5b2ba8084ac3490d0490b5Christian MaederaddTabStop = State (\state -> let (new_indentTabs,newTabs) =
0b6f6d3eeb7b3b36292e60f1b3da5a5ce42eef1aChristian Maeder let nT = if isSetLine state
200849122a9c65773e5b2ba8084ac3490d0490b5Christian Maeder then recentlySet state
a001917177db7ae636853b37c0d0f9f4e90a83ffChristian Maeder else 1
03136b84a0c70d877e227444f0875e209506b9e4Christian Maeder in (condAdd_indentTabs nT, nT)
03136b84a0c70d877e227444f0875e209506b9e4Christian Maeder indentTabsSum = foldl (+) 0
03136b84a0c70d877e227444f0875e209506b9e4Christian Maeder condAdd_indentTabs i =
03136b84a0c70d877e227444f0875e209506b9e4Christian Maeder if i + indentTabsSum
a001917177db7ae636853b37c0d0f9f4e90a83ffChristian Maeder (indentTabs state)
e82587ca2892d246aa4405c2f5b9f30f287f9ebfChristian Maeder >
e82587ca2892d246aa4405c2f5b9f30f287f9ebfChristian Maeder totalTabStops state
e82587ca2892d246aa4405c2f5b9f30f287f9ebfChristian Maeder then indentTabs state
e82587ca2892d246aa4405c2f5b9f30f287f9ebfChristian Maeder else indentTabs state ++ [i]
e82587ca2892d246aa4405c2f5b9f30f287f9ebfChristian Maeder new_recentlySet =
a001917177db7ae636853b37c0d0f9f4e90a83ffChristian Maeder if isSetLine state
7a47fbe6b987bd69a5056ce5d00fc8710f6c5e8aChristian Maeder then 0
7a47fbe6b987bd69a5056ce5d00fc8710f6c5e8aChristian Maeder else recentlySet state
7a47fbe6b987bd69a5056ce5d00fc8710f6c5e8aChristian Maeder inTabs nT = foldl (.) id
e82587ca2892d246aa4405c2f5b9f30f287f9ebfChristian Maeder (replicate nT $ showString "\\>")
e82587ca2892d246aa4405c2f5b9f30f287f9ebfChristian Maeder (indent_fun,
e82587ca2892d246aa4405c2f5b9f30f287f9ebfChristian Maeder new_indentTabsWritten) =
e82587ca2892d246aa4405c2f5b9f30f287f9ebfChristian Maeder if indentTabsSum
e82587ca2892d246aa4405c2f5b9f30f287f9ebfChristian Maeder new_indentTabs
7a47fbe6b987bd69a5056ce5d00fc8710f6c5e8aChristian Maeder >
e82587ca2892d246aa4405c2f5b9f30f287f9ebfChristian Maeder indentTabsWritten state
e82587ca2892d246aa4405c2f5b9f30f287f9ebfChristian Maeder && not (isSetLine state)
e82587ca2892d246aa4405c2f5b9f30f287f9ebfChristian Maeder && onlyTabs state
e82587ca2892d246aa4405c2f5b9f30f287f9ebfChristian Maeder then (inTabs newTabs,
e82587ca2892d246aa4405c2f5b9f30f287f9ebfChristian Maeder newTabs +
7a47fbe6b987bd69a5056ce5d00fc8710f6c5e8aChristian Maeder indentTabsWritten state)
e82587ca2892d246aa4405c2f5b9f30f287f9ebfChristian Maeder else (id,
e82587ca2892d246aa4405c2f5b9f30f287f9ebfChristian Maeder indentTabsWritten state)
e82587ca2892d246aa4405c2f5b9f30f287f9ebfChristian Maeder in (indent_fun
e82587ca2892d246aa4405c2f5b9f30f287f9ebfChristian Maeder ,state { recentlySet = new_recentlySet
e82587ca2892d246aa4405c2f5b9f30f287f9ebfChristian Maeder , indentTabs = new_indentTabs
2561b4bfc45d280ee2be8a7870314670e4e682e4Christian Maeder , indentTabsWritten =
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maeder new_indentTabsWritten
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maeder })
e01299e9b22b96b31b720ca1e9f9f5f25af9b024Christian Maeder
e01299e9b22b96b31b720ca1e9f9f5f25af9b024Christian Maeder )
e01299e9b22b96b31b720ca1e9f9f5f25af9b024Christian Maeder
e01299e9b22b96b31b720ca1e9f9f5f25af9b024Christian Maeder-- decrease the indentTabs in the state by 1
e01299e9b22b96b31b720ca1e9f9f5f25af9b024Christian MaedersubTabStop :: State LRState ()
e01299e9b22b96b31b720ca1e9f9f5f25af9b024Christian MaedersubTabStop = do state <- get
e01299e9b22b96b31b720ca1e9f9f5f25af9b024Christian Maeder let l_itabs = last itabs
e01299e9b22b96b31b720ca1e9f9f5f25af9b024Christian Maeder itabs = indentTabs state
b10d6cef708b7a659f2d3b367e8e0db0d03ae3f5Till Mossakowski indentTabs' = if null $ indentTabs state
03136b84a0c70d877e227444f0875e209506b9e4Christian Maeder then []
2b2f3b72e82e28b34db9c69af2d1ec38f228272eChristian Maeder else if l_itabs == 1
5e46b572ed576c0494768998b043d9d340594122Till Mossakowski then init itabs
4601edb679f0ba530bbb085b25d82a411cd070aaChristian Maeder else init itabs -- ++ [l_itabs -1]
578b677874296e4ba48e57b5e4b4b0270d995603Christian Maeder put (state {indentTabs = indentTabs'})
03136b84a0c70d877e227444f0875e209506b9e4Christian Maeder
a001917177db7ae636853b37c0d0f9f4e90a83ffChristian Maeder-- | function to set up a space based indentation macro
68138d26bcddf5e89c30206aa83ab5ec006d170dChristian MaedersetTabWithSpaces :: Int -> String
d79a4d0d842c212f82f9507fff178ffe4ba2e214Christian MaedersetTabWithSpaces i = (showString setTabWSp . shows i) "}"
68138d26bcddf5e89c30206aa83ab5ec006d170dChristian Maeder
68138d26bcddf5e89c30206aa83ab5ec006d170dChristian Maeder-- functions for producing IO printable Strings
a001917177db7ae636853b37c0d0f9f4e90a83ffChristian Maeder
e01299e9b22b96b31b720ca1e9f9f5f25af9b024Christian MaederrenderInternalLatex :: Doc -> String
e01299e9b22b96b31b720ca1e9f9f5f25af9b024Christian MaederrenderInternalLatex d = renderLatexCore latexStyle d ""
a001917177db7ae636853b37c0d0f9f4e90a83ffChristian Maeder
4fc727afa544a757d1959ce77c02208f8bf330dcChristian MaederrenderLatexCore :: Style -> Doc -> ShowS
a001917177db7ae636853b37c0d0f9f4e90a83ffChristian MaederrenderLatexCore latexStyle' d =
68138d26bcddf5e89c30206aa83ab5ec006d170dChristian Maeder evalState (fullRender
68138d26bcddf5e89c30206aa83ab5ec006d170dChristian Maeder (mode latexStyle')
2561b4bfc45d280ee2be8a7870314670e4e682e4Christian Maeder (lineLength latexStyle')
2561b4bfc45d280ee2be8a7870314670e4e682e4Christian Maeder (ribbonsPerLine latexStyle')
58b5ac21d1c88344246aaedab0c0bdc7b759d7c6Christian Maeder latex_txt (return id) d) initialLRState
58b5ac21d1c88344246aaedab0c0bdc7b759d7c6Christian Maeder
2561b4bfc45d280ee2be8a7870314670e4e682e4Christian MaederrenderLatex, renderLatexVerb :: Maybe Int -> Doc -> String
03136b84a0c70d877e227444f0875e209506b9e4Christian Maeder
03136b84a0c70d877e227444f0875e209506b9e4Christian MaederrenderLatex mi d = showString "\\begin{hetcasl}\n" $
4fc727afa544a757d1959ce77c02208f8bf330dcChristian Maeder renderLatexCore latexStyle' d "\n\\end{hetcasl}\n"
a001917177db7ae636853b37c0d0f9f4e90a83ffChristian Maeder where latexStyle' = latexStyle {lineLength =
a001917177db7ae636853b37c0d0f9f4e90a83ffChristian Maeder (case mi of
68138d26bcddf5e89c30206aa83ab5ec006d170dChristian Maeder Nothing -> lineLength latexStyle
68138d26bcddf5e89c30206aa83ab5ec006d170dChristian Maeder Just l -> l) }
a001917177db7ae636853b37c0d0f9f4e90a83ffChristian Maeder
a001917177db7ae636853b37c0d0f9f4e90a83ffChristian MaederdebugRenderLatex :: Maybe Int -> Doc -> String
68138d26bcddf5e89c30206aa83ab5ec006d170dChristian MaederdebugRenderLatex mi d = evalState (fullRender (mode latexStyle')
03136b84a0c70d877e227444f0875e209506b9e4Christian Maeder (lineLength latexStyle')
03136b84a0c70d877e227444f0875e209506b9e4Christian Maeder (ribbonsPerLine latexStyle')
4fc727afa544a757d1959ce77c02208f8bf330dcChristian Maeder debug_latex_txt
a001917177db7ae636853b37c0d0f9f4e90a83ffChristian Maeder (return "")
a001917177db7ae636853b37c0d0f9f4e90a83ffChristian Maeder d')
68138d26bcddf5e89c30206aa83ab5ec006d170dChristian Maeder initialLRState
68138d26bcddf5e89c30206aa83ab5ec006d170dChristian Maeder where d' = ptext "\\begin{hetcasl}" $+$ d $+$ ptext "\\end{hetcasl}"
68138d26bcddf5e89c30206aa83ab5ec006d170dChristian Maeder latexStyle' = latexStyle {lineLength =
0799c8f17cbd2d06d02fcbc36e2d253f8c52a760Christian Maeder (case mi of
b1caf27fb0c879dd39600d09d501074a2dfd865aChristian Maeder Nothing -> lineLength latexStyle
5e46b572ed576c0494768998b043d9d340594122Till Mossakowski Just l -> l) }
74d9a385499bf903b24848dff450a153f525bda7Christian Maeder
5e46b572ed576c0494768998b043d9d340594122Till Mossakowski-- this lacks some environment starting and closing LaTeX commands
a001917177db7ae636853b37c0d0f9f4e90a83ffChristian Maeder
88ece6e49930670e8fd3ee79c89a2e918d2fbd0cChristian MaederrenderLatexVerb mi d = renderStyle textStyle' d'
5e46b572ed576c0494768998b043d9d340594122Till Mossakowski where d' = text "\\begin{verbatim}" $+$ d $+$ text "\\end{verbatim}"
a001917177db7ae636853b37c0d0f9f4e90a83ffChristian Maeder textStyle' = style {lineLength =
5e46b572ed576c0494768998b043d9d340594122Till Mossakowski (case mi of
a001917177db7ae636853b37c0d0f9f4e90a83ffChristian Maeder Nothing -> lineLength style
5e46b572ed576c0494768998b043d9d340594122Till Mossakowski Just l -> l) }
5e46b572ed576c0494768998b043d9d340594122Till Mossakowski