@@ -36,10 +36,11 @@ import qualified Data.ByteString.Lazy.Char8 as BC
36import qualified Data.ByteString as BS
36import qualified Data.ByteString as BS
37import System.Exit (ExitCode (..))
37import System.Exit (ExitCode (..))
38import System.FilePath
38import System.FilePath
39+import System.IO (stderr, stdout)
39import System.Directory
40import System.Directory
40import Data.Digest.Pure.SHA (showDigest, sha1)
41import Data.Digest.Pure.SHA (showDigest, sha1)
41import System.Environment
42import System.Environment
42−import Control.Monad (unless, (<=<))
43+import Control.Monad (unless, when, (<=<))
43import qualified Control.Exception as E
44import qualified Control.Exception as E
44import Control.Applicative ((<$))
45import Control.Applicative ((<$))
45import Data.List (isInfixOf)
46import Data.List (isInfixOf)
@@ -70,7 +71,7 @@ makePDF :: String -- ^ pdf creator (pdflatex, lualatex, xelatex)
70makePDF program writer opts doc = withTempDir "tex2pdf." $ \tmpdir -> do
71makePDF program writer opts doc = withTempDir "tex2pdf." $ \tmpdir -> do
71 doc' <- handleImages opts tmpdir doc
72 doc' <- handleImages opts tmpdir doc
72 let source = writer opts doc'
73 let source = writer opts doc'
73− tex2pdf' tmpdir program source
74+ tex2pdf' (writerVerbose opts) tmpdir program source
75handleImages :: WriterOptions
76handleImages :: WriterOptions
76 -> FilePath -- ^ temp dir to store images
77 -> FilePath -- ^ temp dir to store images
@@ -130,15 +131,16 @@ convertImage tmpdir fname =
130 mime = getMimeType fname
131 mime = getMimeType fname
131 doNothing = return (Right fname)
132 doNothing = return (Right fname)
134+tex2pdf' :: Bool -- ^ Verbose output
133−tex2pdf' :: FilePath -- ^ temp directory for output
135+ -> FilePath -- ^ temp directory for output
134 -> String -- ^ tex program
136 -> String -- ^ tex program
135 -> String -- ^ tex source
137 -> String -- ^ tex source
136 -> IO (Either ByteString ByteString)
138 -> IO (Either ByteString ByteString)
137−tex2pdf' tmpDir program source = do
139+tex2pdf' verbose tmpDir program source = do
138 let numruns = if "\\tableofcontents" `isInfixOf` source
140 let numruns = if "\\tableofcontents" `isInfixOf` source
139 then 3 -- to get page numbers
141 then 3 -- to get page numbers
140 else 2 -- 1 run won't give you PDF bookmarks
142 else 2 -- 1 run won't give you PDF bookmarks
141− (exit, log', mbPdf) <- runTeXProgram program numruns tmpDir source
143+ (exit, log', mbPdf) <- runTeXProgram verbose program 1 numruns tmpDir source
142 case (exit, mbPdf) of
144 case (exit, mbPdf) of
143 (ExitFailure _, _) -> do
145 (ExitFailure _, _) -> do
144 let logmsg = extractMsg log'
146 let logmsg = extractMsg log'
@@ -170,9 +172,9 @@ extractMsg log' = do
170-- Run a TeX program on an input bytestring and return (exit code,
172-- Run a TeX program on an input bytestring and return (exit code,
171-- contents of stdout, contents of produced PDF if any). Rerun
173-- contents of stdout, contents of produced PDF if any). Rerun
172-- a fixed number of times to resolve references.
174-- a fixed number of times to resolve references.
173−runTeXProgram :: String -> Int -> FilePath -> String
175+runTeXProgram :: Bool -> String -> Int -> Int -> FilePath -> String
174 -> IO (ExitCode, ByteString, Maybe ByteString)
176 -> IO (ExitCode, ByteString, Maybe ByteString)
175−runTeXProgram program runsLeft tmpDir source = do
177+runTeXProgram verbose program runNumber numRuns tmpDir source = do
176 let file = tmpDir </> "input.tex"
178 let file = tmpDir </> "input.tex"
177 exists <- doesFileExist file
179 exists <- doesFileExist file
178 unless exists $ UTF8.writeFile file source
180 unless exists $ UTF8.writeFile file source
@@ -192,9 +194,24 @@ runTeXProgram program runsLeft tmpDir source = do
192 $ lookup "TEXINPUTS" env'
194 $ lookup "TEXINPUTS" env'
193 let env'' = ("TEXINPUTS", texinputs) :
195 let env'' = ("TEXINPUTS", texinputs) :
194 [(k,v) | (k,v) <- env', k /= "TEXINPUTS"]
196 [(k,v) | (k,v) <- env', k /= "TEXINPUTS"]
197+ when (verbose && runNumber == 1) $ do
198+ putStrLn $ "[makePDF] Command line:"
199+ putStrLn $ program ++ " " ++ unwords (map show programArgs)
201+ putStrLn $ "[makePDF] Environment:"
204+ putStrLn $ "[makePDF] Contents of " ++ file' ++ ":"
205+ B.readFile file' >>= B.putStr
195 (exit, out, err) <- pipeProcess (Just env'') program programArgs BL.empty
207 (exit, out, err) <- pipeProcess (Just env'') program programArgs BL.empty
196− if runsLeft > 1
208+ when verbose $ do
209+ putStrLn $ "[makePDF] Run #" ++ show runNumber
210+ B.hPutStr stdout out
211+ B.hPutStr stderr err
213+ if runNumber <= numRuns
197− then runTeXProgram program (runsLeft - 1) tmpDir source
214+ then runTeXProgram verbose program (runNumber + 1) numRuns tmpDir source
199 let pdfFile = replaceDirectory (replaceExtension file ".pdf") tmpDir
216 let pdfFile = replaceDirectory (replaceExtension file ".pdf") tmpDir
200 pdfExists <- doesFileExist pdfFile
217 pdfExists <- doesFileExist pdfFile