将 tikz 图形和 LaTeX 输出外部化到不同的目录中

将 tikz 图形和 LaTeX 输出外部化到不同的目录中

我有以下树:

.
├── main.tex
├── output
└── tikz

我想main.tex使用outputLaTeX 输出进行编译,但将 tikz PDF 外部化在tikz目录中,如果缺少该目录,则会创建该目录。应从 CLI 选项中检测输出目录-output-directory

到目前为止,我正在使用以下代码。

\documentclass{article}
\usepackage[abspath]{currfile}
\getabspath{\jobname.log} % gives \theabsdir
\IfFileExists{"\theabsdir ../tikz"}{}{\immediate\write18{mkdir "tikz"}}
\typeout{theabsdir: \theabsdir ../tikz}
\typeout{currfiledir: \currfiledir tikz}
 
\usepackage{tikz}
\usetikzlibrary{external}
\tikzexternalize
\tikzset{%
  external/system call={pdflatex \tikzexternalcheckshellescape --halt-on-error
    --interaction=batchmode --output-directory="\currfiledir tikz"
 --jobname "\image" "\texsource"},
  /pgf/images/include external/.code={\includegraphics{"\currfiledir tikz/#1"}}
}
      
\begin{document}
\tikz \fill (0,0) circle(5pt);.
\end{document}

我使用以下命令进行编译:

pdflatex -shell-escape -recorder -output-directory=output main   

从 中main.log,我看到\theabsdir ../tikz\currfiledir tikz是,output/../tikz并且tikz,正如预期的那样,tikz如果缺少目录,也会创建目录。图 的 PDFmain-figure0.pdf在其中正确创建,以及日志和 dpth 文件,但main-figure0.md5转到输出目录。可能由于这个原因,我得到了

! Package tikz Error: Sorry, the system call 'pdflatex -shell-escape --halt-on-
error --interaction=batchmode --output-directory="tikz" --jobname "main-figure0
" "\def\tikzexternalrealjob{main}\input{main}"' did NOT result in a usable outp
ut file 'main-figure0' (expected one of .pdf:.jpg:.jpeg:.png:). Please verify t
hat you have enabled system calls. For pdflatex, this is 'pdflatex -shell-escap
e'. Sometimes it is also named 'write 18' or something like that. Or maybe the 
command simply failed? Error messages can be found in 'main-figure0.log'. If yo
u continue now, I'll try to typeset the picture.

值得一提的是,如果我按照建议按下 Enter 键,文档就会正确生成。

注意:我也尝试在序言中添加以下内容,但没有成功:

\RequirePackage{graphicx}
\graphicspath{{tikz/}}

答案1

幸运的是,我找到了答案。
我的代码旨在作为解决方法\tikzsetexternalprefix,它将 MD5 文件(用于确定是否重建图形)写入输出目录中,但仍然中断。在创建另一个示例来记录这一点时(回复@Tom 的评论),我忘记删除外部 tikz 文件夹,发现它有效。

因此解决方案是创建两个tikz 文件夹,一个在输出目录内,另一个在输出目录外。有一个小小的不便之处:当您丢弃输出目录时,您会丢失状态并必须重建所有图形。因此,如果项目尚未完成,则应考虑保留它。

代码如下:

\documentclass{article}
\usepackage[abspath]{currfile}
\getabspath{\jobname.log} % gives \theabsdir
\typeout{theabsdir: \theabsdir ../tikz} % just for debug
\IfFileExists{"\theabsdir ../tikz"}{}{\immediate\write18{mkdir "tikz"}}
\IfFileExists{"\theabsdir /tikz"}{}{\immediate\write18{mkdir "\theabsdir tikz"}}
     
\usepackage{tikz}
\usetikzlibrary{external}  
\tikzexternalize
\tikzsetexternalprefix{tikz/}
      
\begin{document}
\tikz \fill (0,0) circle(5pt);.
\end{document}

这次,如果缺失,则构建内部和外部 tikz 目录。

当然,一个文件夹的更好的解决方案是非常受欢迎的。

相关内容