免责声明

免责声明

我正在编写一个使用 tikz 创建独立图形的脚本。我想确保任何拥有基本 TeX 安装的人都可以编译图形,因此我正在寻找为脚本提供所需文件的方法。我的依赖项是

  • tikz 包
  • tikz 库 shapes.geometric 和
  • 独立类。

我的问题是:

有没有办法可以确保另一个用户(安装了 TeX 但不一定安装了依赖项)可以使用我的脚本而无需安装任何东西?

我可以将 .sty 和 .cls 文件放入编译图形的同一文件夹中吗?

答案1

免责声明

总的来说,我倾向于同意这些评论并反对这样做。我宁愿建议告知人们他们将需要哪些软件包,以及如何以及在哪里获取和安装它们。话虽如此,我曾多次研究过我自己的 TeX 项目的长期可存档性,问题也朝着类似的方向发展:如何确保我仍然拥有最初用于创建文档的包和类文件,以便我仍然可以在 10 年后编译它,而不必更改一大堆东西,因为对包进行了不兼容的更改(当然——至少在我的经验中,这在 TeX 世界中并不常见)。

但我担心迄今为止我找到的解决方案并不完全对我来说还算满意。可能需要一些修补,并且可能需要进行一些手动干预。如果有人知道更好的方法,我会对此很感兴趣。


先决条件

在创建包的机器上,您将需要:


例子

main.tex(由用户创建)

RequirePackage[snapshot}在您的文件之前添加\documentclass

\RequirePackage{snapshot}
\documentclass{article}
\usepackage{lipsum}
\usepackage{tikz}
\usetikzlibrary{positioning,arrows.meta}
\begin{document}
\lipsum[1]
\begin{tikzpicture}
    \node (a) at (0,0) {A};
    \node (b) [right=of a] {B};
    \draw[-Latex] (0,-2) -- (4,-1);
\end{tikzpicture}
\end{document}

然后编译该文档。

main.dep(自动生成)

它将创建一个文件main.dep,其中包含用于编译文档的文件及其版本的列表。在我们的示例中,它将如下所示(缩短):

\RequireVersions{
  *{application}{TeX}     {1990/03/25 v3.x}
  *{format} {LaTeX2e}     {2017-04-15 v2.e}
  *{package}{snapshot}    {2002/03/05 v1.14}
  *{class}  {article}     {2014/09/29 v1.4h}
  *{file}   {size10.clo}  {2014/09/29 v1.4h}
  *{package}{lipsum}      {2014/07/27 v1.3}
  *{package}{tikz}        {2015/08/07 v3.0.1a}

  .......

  *{package}{pdftexcmds}  {2017/03/19 v0.25}
  *{package}{ifpdf}       {2017/03/15 v3.2}
  *{file}   {epstopdf-sys.cfg}{2010/07/13 v1.3}
}

笔记:这个过程并不完美,我曾经遇到过需要在某些项目中手动编辑此文件的情况。我甚至偶尔需要删除导致某种奇怪递归错误的行(如果我没记错的话——已经有一段时间了)。


捆绑文档

bundledoc是一个 Perl 脚本,它将使用该.dep文件创建编译文档所需的文件档案,然后将其打包。在 Linux 上,.tar.gz默认情况下将是一个文件。还没有在 Windows 上尝试过。bundledoc虽然是可配置的,但.zip文件应该是可行的(这里如果您好奇的话,这是我在论文中使用的配置示例)。

注意事项

由于 Perl 更新,bundledoc可能无法在较新的 Perl 版本上运行。需要对脚本进行如下手动调整才能使其为我工作。为此,我将系统范围的文件(/usr/bin/bundledoc在我的情况下)复制到我的本地项目目录中。

File::Temp首先,我需要在开始的某个地方添加模块:

use File::Temp;

(另外,显然,请确保您确实有该模块可用。)

其次:第 137 行(如果尚未添加,则为 136 行File::Temp):此正则表达式不再符合 Perl 的要求。您需要转义左括号并将双引号更改为单引号。旧版:

my $braced = "{([^\}]*)}";   # Regular expression for a braced name

新的:

my $braced = '\{([^\}]*)}';   # Regular expression for a braced name

现在我可以使用

./bundledoc main.dep

然而,这个过程似乎并不完美。具体来说,它没有拾取钛Z 库正确。我们可以使用以下选项来指示在文件bundledoc中的文件之上包含其他文件:.dep--include

./bundledoc '--include=/usr/share/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/*positioning*tex' \
    '--include=/usr/share/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/*arrows*tex' \
    main.dep

笔记:当然,您可以不使用通配符,只需指定完整文件名即可。另外,如果您确实使用通配符,请确保通配符实际上指向bundledoc而不是指向您的 shell(因此这里使用单引号 - 您也可以对其进行转义,具体取决于您的 shell)。

这将获得三个 TiZ 库文件并将它们也放入存档中(至少在我的系统上)。我尚未验证这些是否确实是我们在此示例中所需的所有文件,但您明白了:

  • tikzlibraryarrows.code.tex
  • tikzlibrarypositioning.code.tex
  • tikzlibraryshapes.arrows.code.tex

我承认,如果找不到系统级文件(或者不管怎样,您只想使用本地文件),我还没有彻底测试如何确保您的项目能够正确使用这些库文件。老实说,我预计需要进行一些手动操作。


结论

结果将是一个 tarball(或您指定的任何其他存档格式)。但我发现,确保它确实、肯定、绝对肯定地包含所需的所有文件,并且目标机器在编译文档时确实使用这些文件是一个相当繁琐的过程。

此外,当然,实际上可能需要对软件包进行一些更新,在这种情况下,您需要重新分发档案以确保人们拥有最新版本。

就我个人而言,我曾为一些重要的项目(如前所述,是我的论文)做过这件事,但这不是我经常做的事情,即使对于那些我做过的项目,我也倾向于使用常规项目文件和系统范围的 TeX 发行版,而不是让自己经历这个过程。对我来说,这是一个长期存档的应急解决方案,但仅此而已。我不确定我是否会在常用的工作流程中接受这一点。但每个人的情况都会有所不同,也许有人会找到更方便的解决方案。

相关内容