使用pdflatex和-output-directory时,Tikz外部化问题

8
使用带有 -output-directory 参数的 pdflatex 处理外部化的 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}

bash:

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个回答

7
据我所了解,最简单的解决方法是在主文件夹中创建一个符号链接,指向build文件夹内的tikz文件夹。操作如下:ln -s build/tikz . 这是我在另一个tikz外部化库的文档中找到的解决方案。

4

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}


1

我发现像 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},
]

0

这可能与权限有关。 尝试一下:

chmod 777 tikz

在创建文件夹后立即执行。

您还可以尝试将main.tex文件移动到构建文件夹中,看看是否会改变事情。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接