HaTeX-3.23.0.2: Text/LaTeX/Packages/Multirow.hs
{-# LANGUAGE OverloadedStrings #-}
-- | An extension to the standard LaTeX tabular environment which
-- provides a construction for table cells that span more than one row
-- of the table.
module Text.LaTeX.Packages.Multirow
( multirowp
, BigStrutsCount(..)
, multirow
) where
import qualified Data.Semigroup as SG ((<>))
import Data.Maybe (catMaybes)
import Text.LaTeX.Base.Syntax (LaTeX(TeXComm), TeXArg(FixArg, OptArg))
import Text.LaTeX.Base.Class (LaTeXC, liftL)
import Text.LaTeX.Base.Types (PackageName, Pos, Measure)
import Text.LaTeX.Base.Render (Render, render, rendertex)
-- | multirow package. Use it to import it like this:
--
-- > usepackage [] multirow
multirowp :: PackageName
multirowp = "multirow"
-- | Type of bigstruts count. It is mainly used if you’ve used the
-- bigstrut package. It is the total number of uses of bigstruts
-- within rows being spanned in a multirow.
data BigStrutsCount
= BigStruts Int -- ^ Normal bigstruts
| BigStrutsTop Int -- ^ Bigstruts in the top row
| BigStrutsBottom Int -- ^ Bigstruts in the bottom row
| BigStrutsTopBottom Int -- ^ Bigstruts in the top and bottom rows
deriving (Show)
instance Render BigStrutsCount where
render (BigStruts n) = render n
render (BigStrutsTop n) = "t" SG.<> render n
render (BigStrutsBottom n) = "b" SG.<> render n
render (BigStrutsTopBottom n) = "tb" SG.<> render n
-- | 'multirow' sets a piece of text in a tabular or similar
-- environment, spanning multiple rows.
multirow :: LaTeXC l =>
Maybe Pos -- ^ Optional vertical positioning of the text in the multirow block
-> Double -- ^ Number of rows to span
-> Maybe BigStrutsCount -- ^ Optinal total number of uses of bigstrut within the rows being spanned
-> Measure -- ^ Width to which the text is to be set
-> Maybe Measure -- ^ Optinal length used to raise or lower the text
-> l -- ^ Actual text of the construct
-> l
multirow mVPos nrows mBigstruts width mVMove =
liftL (\l ->
TeXComm "multirow" $ catMaybes [ fmap (OptArg . rendertex) mVPos
, Just (FixArg . rendertex $ nrows)
, fmap (OptArg . rendertex) mBigstruts
, Just (FixArg . rendertex $ width)
, fmap (OptArg . rendertex) mVMove
, Just (FixArg l)
]
)