- 我已经挂接了 luatex 的
stop_run
回调,这样我可以在生成输出 pdf 后对其进行一些处理。 - 要处理 pdf,我需要调用 os.execute。执行此操作时,出现错误提示“所有命令执行均已禁用”,但除此之外,一切正常,执行 os.execute 不会执行我想要的命令。
- 我尝试
-shell-escape
让 os.execute 工作 然后我收到一个错误,
无法打开 PDF 文件:Main.pdf 遇到错误。未创建输出。完成。输入错误,因此未创建输出。错误:无法打开 PDF 文件:Main.pdf 遇到错误。未创建输出。完成。输入错误,因此未创建输出。
然而,Main.pdf 显然已经创建,但 os.execute 仍然没有执行(请注意,添加-shell-execute
到命令行是导致此错误的唯一更改)。我的 os.execute 也收到不同的错误。它不是1
。
还有!如果我只是使用“复制...”尝试将 main.pdf 文件复制到 tmp 位置(认为它可能被锁定了),我会得到一个新的 pdf,但它并不完整,就好像缓冲区没有完全刷新一样。(如果是这种情况,那么我只会收到那个烦人的错误消息,但除此之外一切都会好起来)
回顾一下:
- 尝试让 os.excute 工作。我使用过
shell-escape
,但这会导致其他问题 - 我的回调应该在生成 pdf 后调用,但是当我尝试复制它时,它似乎没有复制整个文件。要么是 pdf 没有被刷新,要么是某些东西在 pdf 末尾添加了其他内容(尽管我不希望这样,至少我希望原始 pdf 是有效的)。
我尝试写入几分钟,但副本仍然没有获得整个文件(在一些超链接内容之后,最后缺少大约 1kb)。
有人知道发生了什么事吗?
(如果我能让它工作,我应该有能力使其\include
可预编译(所以除非 tex 文件发生变化,否则它不会编译包含的文件,但会导入预编译版本))
答案1
您需要在 LuaTeX 运行周围编写一个包装器脚本。stop_run
回调在 PDF 文件关闭/完成之前运行,此时(或任何其他时间点,除了后LuaTeX 运行。
答案2
LuaTeX 有一个回调可以用于此。
%! TEX program = lualatex
\documentclass{article}
\usepackage{luacode}
\begin{document}
123
\begin{luacode*}
luatexbase.add_to_callback("wrapup_run", function()
-- do something with the output PDF here, for example:
-- io.open(tex.jobname..".pdf", "rb"):read("a")
-- the line above reads the complete content of the PDF
-- or os.execute(...)
end, "final callback to rename pdf file")
\end{luacode*}
\end{document}
请注意,文档(texdoc luatex)指出......
需要您自担风险使用它。
因此,如果您使用此解决方案,请准备好调试新编译器版本中可能出现的任何问题。
环顾四周,还有另一种选择,尽管它更丑陋。
我注意到该standalone
包可以执行一些 shell 命令将生成的 PDF 转换为另一种文件格式。https://tex.stackexchange.com/a/51766/250119
阅读其源代码,它大致执行以下操作(假设主文件名为a.tex
):
if (flag convert is given) and not (internal run):
shell escape run("latex 'internal run = true; input{a.tex}'")
shell escape run("pdf2svg a.pdf a.svg")
stop program
因此,当主文件的编译开始时,它会产生另一个 LaTeX 进程来实际上编译文件,然后在父 LaTeX 进程中执行 shell 转义来转换,并停止主进程。