我正在使用 Tikz 的 externalize 函数来加速包含大量图表的文档的编译。除了我的 Mac(装有 MacTex 2014)之外,此函数在任何系统上都可以正常工作。当 tikz 调用它自己的“ pdflatex \tikzexternalcheckshellescape -halt-on-error -interaction=batchmode ...
”时,pdflatex 会失败,因为 tikz 抱怨它找不到 pdflatex。然而,pdflatex 肯定在我的 PATH 环境中。如果我修改 tikz externalize 调用以使用绝对路径,则它可以正常工作:
\tikzset{external/system call={%
/usr/texbin/pdflatex \tikzexternalcheckshellescape
-halt-on-error -interaction=batchmode
-jobname "\image" "\texsource"}}
但是,使用 pdflatex 的相对路径(像这样)不起作用:
\tikzset{external/system call={%
pdflatex \tikzexternalcheckshellescape
-halt-on-error -interaction=batchmode
-jobname "\image" "\texsource"}}
但是,由于我在不同的机器和操作系统上使用相同的代码,因此它不想明确定义 pdflatex 的绝对路径。知道为什么 tikz 的“内部”调用找不到 pdflatex 吗?PS:Texstudio 可以使用相对路径很好地调用 pdflatex。pdflatex 通过 /etc/paths.d/TeX 添加到 PATH,这是 MacTeX 2014 的默认方式。
@JLDiaz:如果我使用“interaction=nonstopmode”编译主文档,tikz 只会抱怨,它找不到 pdf 文件(因为创建失败)。
! Package tikz Error: Sorry, the system call 'pdflatex -shell-escape -halt-on-e
rror -interaction=batchmode -jobname "testplot.tikz" "maindoc"' did NOT
result in a usable output file 'testplot.tikz' (expected one of .pdf:.jp
g:.jpeg:.png:). Please verify that you have enabled system calls. For pdflatex,
this is 'pdflatex -shell-escape'. Sometimes it is also named 'write 18' or som
ething like that. Or maybe the command simply failed? Error messages can be fou
nd in 'testplot.tikz.log'. If you continue now, I'll try to typeset the p
icture.
如果我允许 pdflatex 因错误而停止,它会因错误而停止
sh: pdflatex: command not found
其中后一种情况下的“pdflatex”是 tikz 调用的。
PS:由于未找到 pdflatex,因此未创建 testplot.tikz.log
答案1
我在这里发布通过聊天对话找到的最终“解决方案”(您稍后会理解引号),作为其他(不太可能)可能面临同样问题的用户的参考,并记录一些调试此类问题的策略。
这里主要怀疑的是 PATH 变量的值,pdflatex
对于启动并执行的shell 来说“可见”\write18
命令的 shell 所“可见”的 PATH 变量的值。此 shell 为sh
,在大多数现代系统(尤其是 OSX)中,它与 相同bash
。此子 shell 中的 值PATH
预计与终端“可见”的系统路径相同。
通过将此代码片段放在 tex 文档的序言中,
\tikzset{external/system call={echo $PATH > test.log}}
当 tikz 尝试外部化图像时,它不会启动(失败),而是会将此子 shell 所看到的变量pdflatex
的实际值写入PATH
test.log
的实际值写入文件中。结果是:
/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/texlive/2012/bin/x86_64-darwin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin:/usr/texbin
此 PATH 中有一些令人惊奇的地方:
- 它与在终端中可以通过以下方式看到的 PATH 不同
echo $PATH
- 它包含一个错误的目录(
/usr/local/texlive/2012/bin/x86_64-darwin
),它不应该在这里。该文件夹不存在,而且根据 OP 的说法,这台机器确实从未安装过 Texlive 2012。PATH 的这一部分来自哪里,是一个谜。 /usr/texbin
它在末尾包含正确的目录。这是所在pdflatex
的目录,因此外部化命令无论如何都应该起作用。
这些令人震惊的事实让我完全困惑不解,绝望之下,我在序言中提出了以下片段:
\tikzset{external/system call={%
PATH=/usr/texbin:$PATH pdflatex \tikzexternalcheckshellescape
-halt-on-error -interaction=batchmode
-jobname "\image" "\texsource"}}
出乎我的意料,它成功了!
这个“解决方案”只是将文件/usr/texbin/
夹添加到PATH
,但无论如何,这个文件夹已经在路径中了。唯一的区别是现在是第一个要尝试的文件夹。不知何故,这产生了差异(我仍然不明白为什么)。
因此问题解决了,但解决的方式却令人很不满意……