我有以下树:
.
├── main.tex
├── output
└── tikz
我想main.tex
使用output
LaTeX 输出进行编译,但将 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 目录。
当然,一个文件夹的更好的解决方案是非常受欢迎的。