使用带有-output-directory的pdflatex时,Tikz会将问题外部化

时间:2016-11-23 15:32:51

标签: latex pdflatex tikz

将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目录,日志文件创建失败。

我的假设是否正确?如果是,我该如何处理这个问题?

4 个答案:

答案 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
  • 中找到相关代码
  • 如果您的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},
]