module Text.LaTeX.LambdaTeX (
module Text.LaTeX.LambdaTeX
, module Text.LaTeX.LambdaTeX.Selection
, module Text.LaTeX.LambdaTeX.Reference
, module Text.LaTeX.LambdaTeX.Package
, module Text.LaTeX.LambdaTeX.Types
) where
import Control.Monad.IO.Class (MonadIO (..))
import qualified Data.Set as S
import qualified Data.Text as T
import qualified Data.Text.IO as T
import Text.LaTeX.Base (LaTeX, renderFile)
import Text.LaTeX.LambdaTeX.Package
import Text.LaTeX.LambdaTeX.Package.Internal
import Text.LaTeX.LambdaTeX.Reference
import Text.LaTeX.LambdaTeX.Reference.Internal
import Text.LaTeX.LambdaTeX.Reference.Types
import Text.LaTeX.LambdaTeX.Selection
import Text.LaTeX.LambdaTeX.Selection.Types
import Text.LaTeX.LambdaTeX.Types
import Text.LaTeX.LambdaTeX.Utils
buildLaTeXProject :: MonadIO m => ΛTeXT m a -> ProjectConfig -> m (Either [ΛError] ())
buildLaTeXProject func conf = do
(errs, (latex, refs)) <- execLambdaTeXT func $ projectGenerationConfig conf
let mainTexFile = projectTexFileName conf ++ ".tex"
liftIO $ renderFile mainTexFile latex
let mainBibFile = projectBibFileName conf ++ ".bib"
liftIO $ removeIfExists mainBibFile
liftIO $ T.appendFile mainBibFile $ renderReferences refs
return $ if null errs
then Right ()
else Left errs
execLambdaTeXT :: Monad m => ΛTeXT m a -> GenerationConfig -> m ([ΛError], (LaTeX, [Reference]))
execLambdaTeXT func conf = do
((_,latex), _, output) <- runΛTeX func (ΛConfig $ generationSelection conf) initState
let result = injectPackageDependencies (S.toList $ outputPackageDependencies output) latex
let refs = S.toList $ outputExternalReferences output
let made = outputLabelsMade output
needed = outputLabelsNeeded output
diff = S.difference needed made
let referss = map ReferenceMissing $ S.toList diff
return (referss, (result, refs))
where
initState :: ΛState
initState = ΛState { stateCurrentPart = emptyPart }
data ProjectConfig = ProjectConfig {
projectGenerationConfig :: GenerationConfig
, projectBibFileName :: String
, projectTexFileName :: String
}
defaultProjectConfig :: ProjectConfig
defaultProjectConfig = ProjectConfig {
projectGenerationConfig = defaultGenerationConfig
, projectBibFileName = "main"
, projectTexFileName = "main"
}
data GenerationConfig = GenerationConfig {
generationSelection :: Selection
}
defaultGenerationConfig :: GenerationConfig
defaultGenerationConfig = GenerationConfig {
generationSelection = [All]
}