TeXLive 的自动包下载

TeXLive 的自动包下载

我在 Windows 上使用 MiKTeX,对它相当满意。最近我开始将所有任务转向开源替代方案,当然,我很乐意使用 Linux。在 Linux 中,TeXLive 可作为 MiKTeX 的替代品。我真正喜欢 MiKTeX 的地方是它能够自动安装软件包。我可以在 TeXLive 中做同样的事情吗?有没有什么方法可以启用它或为其安装一些插件?

如果需要的话,我正在使用 Fedora 18。

答案1

在 MiKTeX 中,如果文档前言中没有安装相应的包,则会自动触发安装过程\usepackage{beamer},但 TeX Live 上没有这样的功能。

最后一句话实际上并不正确,正如 wasteofspace 在评论中指出的那样,texliveonfly在 TeX Live 2010 及更高版本中实现按需安装的软件包。我从未测试过它,不知道它是否有缺点。

但是,如果您安装了完整(或几乎完整)的 TeX Live 软件包集合(~2400),则无需添加新软件包,定期tlmgr update -all将处理所有事情,包括在第一次完整安装后安装添加到 TeX Live 集合的软件包。此功能在手册中有说明tlmgr

类似地,如果已将包添加到服务器上的集合中,而该集合也已在本地安装,则它将被添加到本地安装中。auto-install使用选项时,将调用此方法并进行声明--list。可以使用选项来抑制此自动安装--no-auto-install

该手册包含大量有关有用命令的信息,它是推荐阅读对于每个用户来说。

当然,缺点是你需要在机器上安装全套软件包,如果你没有足够的可用空间,这可能会成为一个问题。如果你真的不能从硬盘中腾出 2GB,也可以在 4GB 的硬盘上安装 TeX LiveUSB 密钥从此过上幸福的生活:)

我刚刚写的所有内容都要求你使用以下方法之一安装 TeX Live这里。如果你决定使用发行版中的 TeX 包,则必须遵循其更新策略,不同发行版的更新策略有所不同

答案2

texliveonfly

正如所提到的评论,有一个名为 TeX Live 包texliveonfly您可以将它与 一起使用texliveonfly filename.tex,它将自动下载正确的 TeX Live 包。

这也适用于 LaTeX 包名称和 TeX Live 包名称不匹配的包(例如 LaTeXrubikrotation包包含在rubikTeX Live 包中),并且还会考虑包依赖关系。

用法

安装它是一个 Python 脚本,因此需要安装 Python。然后,您可以像平常一样使用 来安装它tlmgr install texliveonfly。如果您必须sudo tlmgr在这里使用,则稍后必须使用sudo texliveonfly

跑步如果您在终端中进入文件目录filename.tex,则可以使用 运行它texliveonfly filename.tex

其他编译器目前它pdflatex默认使用,但您可以使用--compiler(或-c)标志将其配置为与其他编译器引擎一起运行,就像texliveonfly --compiler=lualatex filename.tex

编译器标志texliveonfly您可以使用--arguments(或)标志传递您使用的编译器的标志-a,例如如果您之前使用过,latexmk -shell-escape -pdf filename.tex那么现在使用texliveonfly --compiler=latexmk --arguments='-shell-escape -pdf' filename.tex

已知问题

  1. 在某些情况下,缺少软件包会失败并显示非标准错误消息,例如 babel 缺少语言时,texliveonfly不会下载它们。目前已知以下软件包必须手动安装:(如果发现更多,请编辑)
  • Babel 语言,例如针对欧洲语言安装collection-langeuropean
  • Biblatex 风格,例如对于自然风格,您需要biblatex-nature
  • fontenc 编码,例如获取t2aenc.def您需要的cyrillic包,以及获取ly1enc.def您需要的ly1包。
  • 使用 minted 软件包时涉及的软件包minted fvextra upquote lineno xstring framed caption(感谢pablgonz 用于测试
  • 当运行外部程序(例如texcount在您的 LaTeX 文件中)时,texliveonfly 不会检测到您需要该texcount包。
  1. 当为 texliveonfly 提供选项时,例如为不同的编译器提供选项,它有时会在安装软件包时无缘无故地挂起。您很可能可以通过首先运行不带选项的 texliveonfly 来解决这个问题texliveonfly main.tex(这样它就会下载软件包),然后运行您想要的任何内容,例如latexmk main.tex

背景

本质上,texliveonfly 是一个类似于 latexmk(Perl 脚本)的构建工具,它包装了 TeX 引擎。但请注意,您可以使用 将它们串联起来texliveonfly --compiler=latexmk filename.tex

它是一个 Python 脚本,通过尝试运行你的 LaTeX 文件来工作,如果由于缺少包而失败,它将尝试安装该包。

除了ctan.org/pkg/texliveonfly您可以查看源代码ctan.org/tex-archive/support/texliveonflylatex.org/论坛

PS 我在 Arch Linux 4.19.4 和 Travis CI(Ubuntu 14.04)上进行了测试。

答案3

我的相当简单的方法是搜索\usepackage、提取内容并使用发行版的包管理器进行安装。

cat *.tex | sed -n 's/^[^%]*\\usepackage[^{]*{\([^}]*\)}.*$/tex\(\1.sty\)/p' | paste -sd ' ' -

.sty这将返回带有和 包围的软件包列表tex(),例如tex(amsmath.sty) tex(enumitem.sty) tex(graphicx.sty)。我可以直接将它们传递给yum/ dnf(我正在使用 Fedora)。

sudo dnf install $( cat *.tex | sed -n 's/^[^%]*\\usepackage[^{]*{\([^}]*\)}.*$/tex\(\1.sty\)/p' | paste -sd ' ' - )

有几个包我分成了多行但表达式sed没有找到,我使用 手动安装了它们sudo dnf install 'tex(some-package-name.sty)'

希望在 ubuntu 上有一个简单的.sty安装等效方法。apt-get

答案4

并没有内置上述功能。不过,通过一些小技巧,我们可以创建一个小包装器来实现这一点。

简单地扫描包通常是不够的,因为您无法获得依赖项。

itex用于expect捕获错误并动态安装软件包。

https://github.com/dopefishh/itex

itex只需安装 texlive 基础结构,脚本将安装其余部分。

相关内容