将pdflatex与-output-directory
一起使用时,在外部化tikz数字时会遇到问题。虽然.md5文件是在我期望的地方创建的,但创建外部化图片文件(.pdf,.log,.dpth)的命令失败。我的假设是发生这种情况是因为创建这些文件的pdflatex
没有继承-output-directory
选项,因此无法在正确的位置创建文件。
这是显示行为的最小示例。
main.tex:
\documentclass{minimal}
\usepackage{tikz}
\usetikzlibrary{external}
\tikzexternalize[prefix=tikz/]
\begin{document}
Test externalize in combination with -output-directory
\tikzsetnextfilename{testpicture}
\begin{tikzpicture}
\node {Node};
\end{tikzpicture}
\end{document}
击:
mkdir -p build/tikz
pdflatex -output-directory build -shell-escape main.tex
错误:
===== 'mode=convert with system call': Invoking 'pdflatex
-shell-escape -halt-on-error -interaction=batchmode -jobname
"tikz/testpicture" "\def\tikzexternalrealjob{main}\input{main}"'
======== This is pdfTeX, Version 3.14159265-2.6-1.40.16
(TeX Live 2015/Debian) (preloaded format=pdflatex)
\write18 enabled.
entering extended mode
! I can't write on file `tikz/testpicture.log'.
生成的目录结构(tree
的输出):
.
├── build
│ ├── main.aux
│ ├── main.auxlock
│ ├── main.log
│ ├── main.pdf
│ └── tikz
│ └── testpicture.md5
└── main.tex
因此,据我所知,由于外部化执行的pdflatex
命令的工作目录中缺少tikz目录,日志文件创建失败。
我的假设是否正确?如果是,我该如何处理这个问题?
答案 0 :(得分:1)
据我所知,最简单的解决方案是在主文件夹中创建一个符号链接到构建内部的tikz文件夹。像这样:ln -s build/tikz .
这是我在another tikz externalizing library的文档中找到的解决方案。
答案 1 :(得分:0)
这也可能是关于权限的问题。 试试
chmod 777 tikz
创建文件夹后立即。
您还可以尝试将main.tex文件移动到构建文件夹中,以查看是否会更改内容。
答案 2 :(得分:0)
tikzexternal没有检测到-output-directory
参数。因此,您必须修改对外部化图像的编译器的调用,并自行添加此参数。
对于包含图像也是如此。您必须在此处为图像加上输出目录的路径。
在以下MWE中可以看到这两点:
\documentclass{minimal}
\usepackage{tikz}
\usetikzlibrary{external}
\tikzexternalize[prefix=tikz/]
\makeatletter
\tikzset{%
external/system call={%
pdflatex %
\tikzexternalcheckshellescape %
-halt-on-error %
-interaction=batchmode %
-output-directory="build" %
-jobname "\image" %
"\texsource"%
},
/pgf/images/include external/.code={%
\includegraphics{build/#1}%
},%
}
\makeatother
\begin{document}
Test externalize in combination with -output-directory
\tikzsetnextfilename{testpicture}
\begin{tikzpicture}
\node {Node};
\end{tikzpicture}
\end{document}
一些附加说明:
pgf/frontendlayer/tikz/libraries/tikzexternalshared.code.tex
-jobname
,则必须将"\texsource"
替换为"\string\def\string\tikzexternalrealjob{\tikzexternal@realjob}\string\input{path/to/tex/file/\tikzexternal@realjob}"
修改
有一种更短的方法来执行此操作:除了设置external/system call
,还可以设置external/shell escape={-shell-escape\space-output-directory=build}
。这将以\tikzexternalcheckshellescape
结尾。
要同时使用LuaLaTeX的两种方法(原始方法和较短方法),都需要\usepackage{shellesc}
。
答案 3 :(得分:0)
我发现Artemis建议的符号链接确实是最简单的选择,即:
mkdir -p build/fig
ln -sf build/fig .
pdflatex -shell-escape -output-directory=build main.tex
此外,如果您使用\tikzexternalize[mode=list and make]
,还将注意到生成的build/main.makefile
也不能原样使用,因为它同时使用了基础文件夹和构建文件夹中的文件。为了使其工作,符号链接似乎是最简单的选择,这一次是文件main.figlist
(替代方法是复制文件或修改makefile)。现在,整个过程如下所示:
# Run once to create list of externalize figures:
mkdir -p build/tikz
ln -sf build/tikz .
pdflatex -output-directory=build main.tex
# Build externalized figures:
ln -sf build/main.figlist .
make -f build/main.makefile
# Run again to include externalized figures into document:
pdflatex -output-directory=build main.tex
# Cleanup:
rm tikz main.figlist
此外,如果您在使用其他软件包时遇到问题,则可能还需要考虑Phobos的回答,以确保在构建单个图形时也知道构建目录,即:
\tikzexternalize[
prefix=tikz/,
mode=list and make,
shell escape={-shell-escape\space-output-directory=build},
]