diff options
| author | John MacFarlane <[email protected]> | 2024-02-15 08:54:27 -0800 |
|---|---|---|
| committer | John MacFarlane <[email protected]> | 2024-02-15 08:54:27 -0800 |
| commit | a62eab40f72b3a2aa229e2ea7fdfb013c05b0f06 (patch) | |
| tree | a0bba850fc27a0cefaa0ec8af46c7ec093657ed3 | |
| parent | 307fc065aaf6aba84ab9d8222ce071cf0a46f6e6 (diff) | |
PDF: internal cleanup of tex2pdf path.
Distinguish tmpDir and outDir, since they can come apart
in the latexmk case.
| -rw-r--r-- | src/Text/Pandoc/PDF.hs | 37 |
1 files changed, 19 insertions, 18 deletions
diff --git a/src/Text/Pandoc/PDF.hs b/src/Text/Pandoc/PDF.hs index ccde52c39..1d23461b5 100644 --- a/src/Text/Pandoc/PDF.hs +++ b/src/Text/Pandoc/PDF.hs @@ -264,17 +264,16 @@ tex2pdf :: (PandocMonad m, MonadIO m) -> FilePath -- ^ temp directory for output -> Text -- ^ tex source -> m (Either ByteString ByteString) -tex2pdf program args tmpDir' source = do +tex2pdf program args tmpDir source = do let isOutdirArg x = "-outdir=" `isPrefixOf` x || "-output-directory=" `isPrefixOf` x - let tmpDir = + let outDir = case find isOutdirArg args of Just x -> drop 1 $ dropWhile (/='=') x - Nothing -> tmpDir' - liftIO $ createDirectoryIfMissing True tmpDir + Nothing -> tmpDir let file = tmpDir ++ "/input.tex" -- note: tmpDir has / path separators liftIO $ BS.writeFile file $ UTF8.fromText source - (exit, log', mbPdf) <- runTeXProgram program args tmpDir + (exit, log', mbPdf) <- runTeXProgram program args tmpDir outDir case (exit, mbPdf) of (ExitFailure _, _) -> do let logmsg = extractMsg log' @@ -392,28 +391,31 @@ getResultingPDF logFile pdfFile = do -- Run a TeX program once in a temp directory (on input.tex) and return (exit code, -- contents of stdout, contents of produced PDF if any). runTeXProgram :: (PandocMonad m, MonadIO m) - => String -> [String] -> FilePath + => String -> [String] -> FilePath -> FilePath -> m (ExitCode, ByteString, Maybe ByteString) -runTeXProgram program args tmpDir = do - let file = tmpDir ++ "/input.tex" +runTeXProgram program args tmpDir outDir = do let isLatexMk = takeBaseName program == "latexmk" - programArgs | isLatexMk = ["-interaction=batchmode", "-halt-on-error", "-pdf", - "-quiet", "-outdir=" ++ tmpDir] ++ args ++ [file] - | otherwise = ["-halt-on-error", "-interaction", "nonstopmode", - "-output-directory", tmpDir] ++ args ++ [file] + programArgs | isLatexMk = + ["-interaction=batchmode", "-halt-on-error", "-pdf", + "-quiet", "-outdir=" ++ outDir] ++ args ++ [file] + | otherwise = + ["-halt-on-error", "-interaction", "nonstopmode", + "-output-directory", outDir] ++ args ++ [file] env' <- liftIO getEnvironment let sep = [searchPathSeparator] let texinputs = maybe (tmpDir ++ sep) ((tmpDir ++ sep) ++) $ lookup "TEXINPUTS" env' let env'' = ("TEXINPUTS", texinputs) : - ("TEXMFOUTPUT", tmpDir) : + ("TEXMFOUTPUT", outDir) : [(k,v) | (k,v) <- env' , k /= "TEXINPUTS" && k /= "TEXMFOUTPUT"] liftIO (UTF8.readFile file) >>= showVerboseInfo (Just tmpDir) program programArgs env'' - go file env'' programArgs (1 :: Int) Nothing + go env'' programArgs (1 :: Int) Nothing where - go file env'' programArgs runNumber oldTocHash = do + file = tmpDir ++ "/input.tex" + outfile = outDir ++ "/input.pdf" + go env'' programArgs runNumber oldTocHash = do let maxruns = 4 -- stop if warnings present after 4 runs report $ MakePDFInfo ("LaTeX run number " <> tshow runNumber) mempty (exit, out) <- liftIO $ E.catch @@ -443,10 +445,9 @@ runTeXProgram program args tmpDir = do report $ MakePDFInfo "Rerun needed" (T.intercalate "\n" (map (UTF8.toText . BC.toStrict) rerunWarnings')) - go file env'' programArgs (runNumber + 1) tocHash + go env'' programArgs (runNumber + 1) tocHash else do - let pdfFile = replaceExtension file ".pdf" - (log', pdf) <- getResultingPDF (Just logFile) pdfFile + (log', pdf) <- getResultingPDF (Just logFile) outfile return (exit, fromMaybe out log', pdf) checkForRerun log' = filter isRerunWarning $ BC.lines log' |
