content: {-# LANGUAGE OverloadedStrings, CPP #-}
  
  -- | This module allows you to use the LaTeX /graphicx/ library in order to
  --   insert graphics in a document and perform some transformations.
  --
  --   CTAN page for graphicx: <http://ctan.org/pkg/graphicx>.
  module Text.LaTeX.Packages.Graphicx
   ( -- * Graphicx package
     graphicx
     -- * Package options
   , dvips
   , dvipdfm
   , pdftex
     -- * Including graphics
   , IGOption (..)
   , includegraphics
     -- * Transformations
   , rotatebox
   , scalebox
   , reflectbox
   , resizebox
     ) where
  
  import Text.LaTeX.Base.Syntax
  import Text.LaTeX.Base.Class
  import Text.LaTeX.Base.Render
  import Text.LaTeX.Base.Types
  --
  import Data.Char (toLower)
  #if !MIN_VERSION_base(4,8,0)
  import Data.Functor ((<$>))
  #endif
  
  -- | The 'graphicx' package.
  --
  -- > usepackage [] graphicx
  graphicx :: PackageName
  graphicx = "graphicx"
  
  -- Package options
  
  -- | Package option of the 'graphicx' package.
  dvips, dvipdfm, pdftex :: LaTeXC l => l
  dvips = "dvips"
  dvipdfm = "dvipdfm"
  pdftex = "pdftex"
  
  -- Including graphics
  
  -- | Include Graphics Option. These options can be passed as arguments to the 'includegraphics' function.
  data IGOption =
     IGWidth Measure -- ^ Specify the preferred width of the imported image.
   | IGHeight Measure -- ^ Specify the preferred height of the imported image.
   | KeepAspectRatio Bool -- ^ When 'True', it will scale the image according to both 'IGWidth' and 'IGHeight'
                          -- , but will not distort the image, so that neither 'IGWidth' nor 'IGHeight' are exceeded.
   | IGScale Float -- ^ Scales the image by the desired scale factor.
   | IGAngle Int -- ^ Rotate the image by given degrees.
   | IGTrim Measure Measure Measure Measure -- ^ This option will crop the imported image. Arguments are from-left
                                            -- , from-bottom, from-right and from-top respectively.
   | IGClip Bool -- ^ For the 'IGTrim' option to work, you must set 'IGClip' to 'True'.
   | IGPage Int -- ^ If the image file is a pdf file with multiple pages,
                --   this parameter allows you to use a different page than the first.
     deriving Show
  
  instance Render IGOption where
   render (IGWidth m) = "width=" <> render m
   render (IGHeight m) = "height=" <> render m
   render (KeepAspectRatio b) = "keepaspectratio=" <> fromString (toLower <$> show b)
   render (IGScale r) = "scale=" <> render r
   render (IGAngle a) = "angle=" <> render a
   render (IGTrim l b r t) = "trim=" <> renderChars ' ' [l,b,r,t]
   render (IGClip b) = "clip=" <> fromString (toLower <$> show b)
   render (IGPage p) = "page=" <> render p
  
  -- | Include an image in the document.
  includegraphics :: LaTeXC l =>
                    [IGOption] -- ^ Options
                  -> FilePath  -- ^ Image file
                  -> l
  includegraphics opts fp = fromLaTeX $ TeXComm "includegraphics"
   [ MOptArg $ fmap rendertex opts, FixArg $ TeXRaw $ fromString fp ]
  
  -- | Rotate the content by the given angle in degrees.
  rotatebox :: LaTeXC l => Float -> l -> l
  rotatebox a = liftL $ \l -> TeXComm "rotatebox" [FixArg $ rendertex a , FixArg l]
  
  -- | Scale the content by the given factor. If only the horizontal scale is supplied,
  --   the vertical scaling will be the same.
  scalebox :: LaTeXC l =>
       Float       -- ^ Horizontal scale.
    -> Maybe Float -- ^ Vertical scale.
    -> l
    -> l
  scalebox h mv = liftL $ \l ->
    TeXComm "rotatebox" $ [FixArg $ rendertex h]
                       ++  maybe [] ((:[]) . OptArg . rendertex) mv
                       ++ [FixArg l]
  
  -- | Reflect horizontally the content.
  reflectbox :: LaTeXC l => l -> l
  reflectbox = liftL $ \l -> TeXComm "reflectbox" [FixArg l]
  
  -- | Resize the content to match the given dimensions.
  resizebox :: LaTeXC l =>
       Measure -- ^ Horizontal size.
    -> Measure -- ^ Vertical size.
    -> l
    -> l
  resizebox h v = liftL $ \l ->
    TeXComm "resizebox" [FixArg $ rendertex h,FixArg $ rendertex v,FixArg l]
  