\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
- Problem with missing file when using packages datatool and tikz-network?
- Error with latest version of datatool package
根据 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 的更新,无法获取最新版本。
于是,为了获取和安装最新版本的 datatool
,我开始了漫长的折腾之旅。如果你现在着急修好这个问题,我建议你前面的内容先不要看,直接划到本文的最下面,查看“最后的解决方案”这一章节,因为我根据直觉怀疑我前面所采取的所有解决方案,实际上都没有用。 别问我为什么没有用,我也不知道。但是以防万一我会把这些过程都写一遍。
似是而非的解决措施
手动安装宏包
首先找到 datatool 宏包的 CTAN 页面,点击 下载 datatool.tds.zip
这个压缩文件,本地解压后可以得到包含 bibtex
、doc
、source
、tex
四个子文件夹。
检查一下文件版本:我们打开 ./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 的根目录下 (如果安装在 C
盘 Program 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
(文档文件,包括 CHANGES
,README.md
文件,samples
文件夹,datatool-user-examples
文件夹,PDF 和 HTML 文件,DEPENDS.txt
)。
如果你不确定如何整理这些文件,可以根据之前下载的 datatool.tds
里的文件目录结构来整理。最后也是一样,全部放到 MiKTeX 的安装目录下。
效果
然而,我在进行了上面这一番操作之后,还是什么事情也没有发生。编译文档依然报错如故。
最后的解决措施
打开 MiKTeX Console,找到“更新”的选项。我们检查一下更新。更新信息会提示说可以更新 listing
宏包,却没有 datatool
但我们先不管,先更新一下。更新完了,重新编译,或许就能不再报错、成功编译了。(没错就这么简单。)
总结
虽然最后解决了报错的问题,但是我依旧还是不能确定最后解决问题是因为我先手动更新了 datatool
宏包,再更新了 listing
宏包实现的,还是只需要更新 listing
宏包就能解决问题。但是我还是把所有的这些步骤都写了出来。反正大家试试看先更新 listing
,如果不成功再挨个去尝试其他几种方法,应该就能解决问题。