我目前正在清理我的项目,以便在未来扩展时更好地管理它。我想知道是否有办法以更智能、更高效的方式管理以下内容。
目前,这是我的 LaTeX 结构:
main.tex
\include{chapter_1.tex}
\input{fig_1.tikz}
\input{fig_2.tikz}
\include{chapter_2.tex}
\input{fig_1.tikz}
\include{chapter_3.tikz}
main.tex
我将以下章节纳入其中。\include{chapter_1.tex}
每个章节中,可能会有由 TikZ 生成的图形,我将其纳入其中,例如\input{fig_1.tikz}
。
现在,因为我想保持我的项目目录整洁,所以我想要有一个文件夹结构,其中有一个用于图像的文件夹,其中的图像根据它们所属的章节分开,如下所示:
main_folder/
|-- main.tex
|-- chapter_1.tex
|-- chapter_2.tex
|-- chapter_3.tex
|-- figures/
|-- chapter_1/
|-- generated_fig_0.pdf
|-- generated_fig_1.pdf
|-- tikz/
|-- fig_1.tikz
|-- fig_2.tikz
等等。然后每个 tikz 将被输入如下\input{figures/chapter_1/tikz/fig_1.tikz
现在,当我从 TikZ 外部化我的图形生成以加快我的文档编译速度时,问题就出现了。
在我的文档标题中,我必须\tikzexternalize[prefix=figures/]
将所有 TikZ 图像排序到figures/
文件夹中。在每个包含的章节中,在文件开头的章节正文后面有{ \tikzset{external/figure name/.add={chapter_1/}{}}
一个右括号,}
用于添加前缀以将所有生成的内容放入其中figures/chapter_#/
,并将其限制在章节正文的范围内。
但是,如果我希望每个生成的图像都有一个有意义的名称,我需要\tikzsetnextfilename{image_name}
在每个输入的 TikZ 之前添加,这样我总是会有这样的块:
\tikszetnextfilename{foo}
\input{figures/chapter/tikz/foo.tikz}
是否有一种简单的方法,如果我有一个foo.tex
想要输入的章节bar.tikz
,某些程序\input{bar.tikz}
会自动查找bar.tikz
并figures/foo/tikz/
创建生成的外部化 PDF figures/foo/bar.pdf
?
LatexMk 的使用会对此产生任何影响吗(我想使用它,但我不确定它在上述中能发挥什么作用)?
编辑:事实证明,这\tikzsetnextfilename
实际上会覆盖除用 设置的初始前缀之外的所有命名定义\tikzexternalprefix
。因此,我无法直接为我的图形文件名提供名称。
因此另一个问题是:有没有办法 a) 将生成的图像保存到子文件夹中figures/chapter_name/
,以及 b) 为图像提供单独的名称?
答案1
您可以尝试以下方法:
在main.tex
:
\documentclass{book}
\usepackage{tikz}
\usetikzlibrary{external}
\tikzexternalize
\def\useexternalfile#1{\tikzsetnextfilename{#1-output}\input{\csname tikzexternal@filenameprefix\endcsname#1.tikz}}
\begin{document}
\tikzsetexternalprefix{./chapter1/tikz/}
\include{chapter1}
\tikzsetexternalprefix{./chapter2/tikz/}
\include{chapter2}
\end{document}
编辑:更清晰、更 LaTeX 风格的定义\useexternalfile
是
\makeatletter
\newcommand{\useexternalfile}[1]{%
\tikzsetnextfilename{#1-output}%
\input{\tikzexternal@filenameprefix#1.tikz}}
\makeatother
记录一下,\tikzexternal@filenameprefix
内部宏是\tikzsetexternalprefix
保存“当前前缀”的地方。此外,您可以替换#1-output
您最喜欢的表达式(也许generated-figure-#1
?)
结束编辑
在chapter1.tex
:
...
\begin{figure}
\useexternalfile{myfigure}
\caption{...}
\end{figure}
...
在chapter1/tikz/myfigure.tikz
:
\begin{tikzpicture}
\draw (0,0) rectangle (4,4);
\end{tikzpicture}
(我在我的 OSX 系统中测试过,它有效;我使用了一个稍微简单一点的系统)。这与您的问题不同,因为它myfigure-output.pdf
位于文件夹中chapter1/tikz/
,而不是chapter1/
您想要的文件夹中。也许您(或其他人)可以对其进行更多调整。
答案2
我编写了一个 VB.NET 应用程序,可以处理多个 Tikz 文件并根据给定的序言(Tikz 图形的选项)生成 PDF。
可以从我的网页下载:
http://web.itu.edu.tr/bariserkus/docs.html
我还附加了一个示例项目。
VB.NET 项目是开源的,可以从以下位置下载
https://github.com/bariserkus/figs1
我写得很快,所以可能存在错误。
需要.NET Framework 4.7,TeX 系统安装并正常运行。
在您掌握 Tikz 的外部化库之前可能会有帮助。