aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn MacFarlane <[email protected]>2024-02-15 08:54:27 -0800
committerJohn MacFarlane <[email protected]>2024-02-15 08:54:27 -0800
commita62eab40f72b3a2aa229e2ea7fdfb013c05b0f06 (patch)
treea0bba850fc27a0cefaa0ec8af46c7ec093657ed3
parent307fc065aaf6aba84ab9d8222ce071cf0a46f6e6 (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.hs37
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'