import System.Directory import System.Environment import Text.Regex.Posix import System.FilePath.Posix import Data.List import System.Process import Control.Monad createTmpDir :: FilePath -> IO FilePath createTmpDir base = do let dir = addExtension base ".XXXXXXXXXX" exists <- doesDirectoryExist dir when exists $ removeDirectoryRecursive dir createDirectory dir return dir splitArgs :: [String] -> (String,[String]) splitArgs args = let (file, args') = partition (=~ "\\.lhs$") args file' = case file of [f] -> f _ -> error "could not identify .lhs file" (stem,_) = splitExtension file' in (stem, args') moveFile :: FilePath -> FilePath -> IO () moveFile fp1 fp2 = do -- error $ show (fp1,fp2) exists <- doesFileExist fp2 when exists (removeFile fp2) renameFile fp1 fp2 main :: IO () main = do args <- getArgs let (stem,args') = splitArgs args file = addExtension stem ".lhs" texFile = addExtension stem ".tex" pdfFile = addExtension stem ".pdf" auxFile = addExtension stem ".aux" old_dir <- getCurrentDirectory tmp_dir <- createTmpDir (old_dir "lhslatex") tInputs' <- lookupEnv "TEXINPUTS" let tInputs = case tInputs' of Just e -> e Nothing -> "" setEnv "TEXINPUTS" $ old_dir ++ ":" ++ tInputs lhsFile <- readFile file setCurrentDirectory tmp_dir tex <- readProcess "lhs2TeX" ["-"] lhsFile writeFile texFile tex callProcess "pdflatex" (args' ++ [texFile]) moveFile (tmp_dir pdfFile) (old_dir pdfFile) moveFile (tmp_dir auxFile) (old_dir auxFile) removeDirectoryRecursive tmp_dir