\LaTeX 报错“Missing file \`datatool-l3fp.def' for math=l3fp. No math commands available!.”修复以及如何手动编译安装 \LaTeX 包

[!abstract]

本文详细阐述了笔者在 \LaTeX 中解决报错“Missing file `datatool-l3fp.def' for math=l3fp. No math commands available!.”的经过,并介绍了如何手动下载源码、编译和安装\LaTeX 宏包。

前言

好久没有写博客了。之前因为各种原因,新博客文章的事情一直被耽误了下去,没有时间来写。今天遇到了一个 Bug,我觉得最近可能会有很多人遇到,所以就决定拿出来写一写,希望能帮助一些人解决问题。

问题描述

起因是这个样子的:我最近在编写一个文档类。该文档类在 TeXLive 2023 上面编译正常,但是迁移到 MiKTeX 上面,编译就出现了如下的报错信息:

! Package datatool Error: Missing file `datatool-l3fp.def' for math=l3fp. No math commands available! .

See the datatool package documentation for explanation.
Type  H <return>  for immediate help.
 ...

l.929  }

?

这个报错简单来说就是 datatool 这个宏包缺少了 datatool-l3fp.def 这个文件。我的操作系统是 Windows 10 22H2,经过检查之后发现 datatool 已经被正确安装,datatool-l3fp.def 文件也可以在 MiKTeX 按装目录下的 MiKTeX/tex/latex/datatool 中找到。

使用了 H 命令之后没有得到任何有意义的帮助信息之后,我就开始在互联网上寻求帮助。在各种尝试以及向 AI 求助一通操作猛如虎之后,这个问题莫名其妙就被修复了。我不是很确定最后为什么能修好,但是这里记录一下解决问题的过程,以供大家参考。

问题的可能原因分析

我找到了 StackOverflow 上的这两篇文章以供参考(如下所示)。根据文章中的信息,初步推定是 datatool 宏包在 3.0.0 版本中出现了一个 Bug,随后作者 3 月 5 日的 3.0.1 版本发布了该 Bug

根据 StackOverflow 用户 Danghor 的阐述:

Update (2025-03-06): It's fixed! Version 3.0.1 of the datatool package is now available on CTAN and after updating, at least my document worked again (I had the lua error). So I recommend updating the datatool package through your TeX distribution (MiKTeX, TeX Live, TeXShop, etc.)

然而这个时候,如果我们打开我们的 MiKTeX Console,就会发现此时能够下载的 datatool 版本停留在 2025/3/4 的更新,无法获取最新版本。

image

于是,为了获取和安装最新版本的 datatool,我开始了漫长的折腾之旅。如果你现在着急修好这个问题,我建议你前面的内容先不要看,直接划到本文的最下面,查看“最后的解决方案”这一章节,因为我根据直觉怀疑我前面所采取的所有解决方案,实际上都没有用。 别问我为什么没有用,我也不知道。但是以防万一我会把这些过程都写一遍。

似是而非的解决措施

手动安装宏包

首先找到 datatool 宏包的 CTAN 页面,点击 下载 datatool.tds.zip 这个压缩文件,本地解压后可以得到包含 bibtexdocsourcetex 四个子文件夹。

检查一下文件版本:我们打开 ./tex/latex/datatool 文件夹,随便打开一个文件,比如 datatool.sty,查看版本号信息:

\DeclareRelease{v2.32}{2019-09-27}{datatool-2019-09-27.sty}
\DeclareCurrentRelease{v3.0.1}{2025-03-05}
\ProvidesPackage{datatool}[2025/03/05 v3.0.1 (NLCT)]

嗯,看来确实是最新的版本了。我们现在回到我们下载的压缩包文件夹的根目录里面,选中全部的 4 个文件夹,全部复制黏贴到 MiKTeX 的根目录下 (如果安装在 CProgram Files 目录下,那就是 C:\Program Files\MiKTeX),或者如果你使用的是 TeXLive,那就放到对应的 C:\TeXLive\<版本号>\ 下面。视具体安装位置而定。替换所有文件,然后执行该命令,该命令 (据说) 会更新文件名数据库。

initexmf --update-fndb

然而我在进行了上面这一番操作之后,什么事情也没有发生。编译文档依然报错如故。

重新编译安装

下载源码文件

由于无法解决问题,我只能另求他法,我决定重新安装 datatool 宏包。我们可以在 datatool 最新更新日志的发布界面 找到 宏包源码文件的下载地址

这个界面文件很多,一个一个下载不知道要等到猴年马月了。所以我们可以使用 wget 命令执行递归下载:

wget -r -np -nH --cut-dirs=4 -R "index.html*" https://ctan.ebinger.cc/tex-archive/macros/latex/contrib/datatool/

下载这些文件需要你等待一段时间,因为 datatool-user-examples 目录下面足足有 193 个示例文件。

如果你没有 wget 可以选择安装 wget

Windows 用户:你和我一样在使用 Msys 2 for Windows 这样的 POSIX 兼容层,大多数情况下都已经预装 wget,如果没有,你可以使用对应的包管理器进行安装,比如我可以使用:

pacman -S wget

MacOS 用户: 可以使用 Homebrew 安装:

brew install wget

Linux 用户: 大多数发行版已预装 wget,如果没有,可以通过包管理器安装,例如:

sudo apt-get install wget
sudo yum -syu wget

编译宏包

下载完了就可以开始尝试编译这个宏包了。可能有读者会很纳闷为什么宏包需要编译,因为这个宏包实际上是通过 .dtx 格式编写的。这里给不了解情况的读者解释一下:.dtx 是 \LaTeX 特有的 Documented \LaTeX File,是一种将 \LaTeX 宏包的源码和文档写在一起的格式,一经编译你就能同时得到排版好的宏包的 PDF 文档手册和若干个 .sty.def.ldf 乃至有可能是 .cls 格式的代码文件。可以类比一下含 R 代码的 R Markdown,或者类比 Sphinx ReStructedText 的 Python,只不过区别是 dtx 如果不编译就不能运行。

要编译这包文件中的 datatool.dtx,你需要对 datatool.ins 执行 latex 命令,即在目录下执行:

latex datatool.ins

然后包会开始自动编译。(编译的界面会非常酷炫,读者可以自行感受一下)。

安装编译

如果你把上面这些步骤都做下来了,那么恭喜你:人间折磨现在才刚刚开始

你现在会看见你的工作目录下散乱着一大堆 .sty.def.ldf 文件,和 .dtx.ins.txt.html.md.bst 混杂在一起。你现在需要手工把这些文件挑出来,按照 source/latex/datatool (包的源码)、tex/latex/datatool (包的 tex 源码,或者说实际发挥作用的“源码”)、bibtex/bst/datatool (.bst 文件) 和 doc/latex/datatool (文档文件,包括 CHANGESREADME.md 文件,samples 文件夹,datatool-user-examples 文件夹,PDF 和 HTML 文件,DEPENDS.txt)。

如果你不确定如何整理这些文件,可以根据之前下载的 datatool.tds 里的文件目录结构来整理。最后也是一样,全部放到 MiKTeX 的安装目录下。

效果

然而,我在进行了上面这一番操作之后,还是什么事情也没有发生。编译文档依然报错如故。

最后的解决措施

打开 MiKTeX Console,找到“更新”的选项。我们检查一下更新。更新信息会提示说可以更新 listing 宏包,却没有 datatool 但我们先不管,先更新一下。更新完了,重新编译,或许就能不再报错、成功编译了。(没错就这么简单。)

总结

虽然最后解决了报错的问题,但是我依旧还是不能确定最后解决问题是因为我先手动更新了 datatool 宏包,再更新了 listing 宏包实现的,还是只需要更新 listing 宏包就能解决问题。但是我还是把所有的这些步骤都写了出来。反正大家试试看先更新 listing,如果不成功再挨个去尝试其他几种方法,应该就能解决问题。

posted @ 2025-03-10 22:56  多玩我的世界盒子  阅读(224)  评论(0)    收藏  举报