Luatex os.execute 不起作用

Luatex os.execute 不起作用
  1. 我已经挂接了 luatex 的stop_run回调,这样我可以在生成输出 pdf 后对其进行一些处理。
  2. 要处理 pdf,我需要调用 os.execute。执行此操作时,出现错误提示“所有命令执行均已禁用”,但除此之外,一切正常,执行 os.execute 不会执行我想要的命令。
  3. 我尝试-shell-escape让 os.execute 工作
  4. 然后我收到一个错误,

    无法打开 PDF 文件:Main.pdf 遇到错误。未创建输出。完成。输入错误,因此未创建输出。错误:无法打开 PDF 文件:Main.pdf 遇到错误。未创建输出。完成。输入错误,因此未创建输出。

然而,Main.pdf 显然已经创建,但 os.execute 仍然没有执行(请注意,添加-shell-execute到命令行是导致此错误的唯一更改)。我的 os.execute 也收到不同的错误。它不是1

还有!如果我只是使用“复制...”尝试将 main.pdf 文件复制到 tmp 位置(认为它可能被锁定了),我会得到一个新的 pdf,但它并不完整,就好像缓冲区没有完全刷新一样。(如果是这种情况,那么我只会收到那个烦人的错误消息,但除此之外一切都会好起来)

回顾一下:

  1. 尝试让 os.excute 工作。我使用过shell-escape,但这会导致其他问题
  2. 我的回调应该在生成 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 转义来转换,并停止主进程。

相关内容