luaotfload 字体名称数据库创建崩溃

luaotfload 字体名称数据库创建崩溃

编辑3,重新表述我原来的问题:

luaotfload需要一个文件/usr/local/etc/fonts/fonts.conf。为什么?这似乎不是fonts.confxubuntu 中 any 的规范位置,是吗?

luaotfload | db : Cannot open fontconfig file /usr/local/etc/fonts/fonts.conf.

原始帖子:

我正在尝试从 XeLaTeX 切换到 LuaLaTeX,但每次尝试使用 fontspec 时都会遇到luaotfload数据库创建问题。我重现了该问题,luaotfload-tool --update -vv如下所示:

me@mycomputer:~$ luaotfload-tool --update -vv
luaotfload | db : Updating the font names database.
luaotfload | db : Font names database not found, generating new one.
luaotfload | db : This can take several minutes; please be patient.
luaotfload | db : Updating the font names database.
luaotfload | db : Blacklisting 4 files and directories.
luaotfload | db : Whitelisting 0 files.
luaotfload | db : Scanning TEXMF and $OSFONTDIR for fonts...
luaotfload | db : Scanning system fonts...
luaotfload | db : Searching in static system directories...
.../texmf-dist/tex/luatex/luaotfload/luaotfload-parsers.lua:198: stack overflow (too many arguments)
me@mycomputer:~$ luaotfload-tool -V
luaotfload | db : Font names database not found, generating new one.
luaotfload | db : This can take several minutes; please be patient.
.../texmf-dist/tex/luatex/luaotfload/luaotfload-parsers.lua:198: stack overflow (too many arguments)

这里还显示,我无法找出luaotfload-tool -V我正在运行哪个版本,因为在告诉我之前,该工具尝试创建数据库并崩溃。

我正在运行 xubuntu 和发行版中的 TeX Live。LuaTeX 声明如下:

This is LuaTeX, Version beta-0.79.1 (TeX Live 2015/dev/Debian) (rev 4971)

有人能看出这里出了什么问题吗?

编辑:

根据提示这里我照做了luaotfload-tool --dry-run --update --force --verbose=5,崩溃前的最后一行是:

luaotfload | db : Collected 3286 files.
luaotfload | db : Scanning system fonts...
luaotfload | db : Searching in static system directories...
luaotfload | db : Cannot open fontconfig file /usr/local/etc/fonts/fonts.conf.
.../texmf-dist/tex/luatex/luaotfload/luaotfload-parsers.lua:299: stack overflow

好的,我没有目录/usr/local/etc/fonts,因此fonts.conf其中也没有文件。难怪无法打开。我对 Linux 如何管理字体的了解非常有限,但每当我evince从终端启动时,我都会收到“已弃用”警告:

Fontconfig warning: "/etc/fonts/conf.d/50-user.conf", line 14: reading configurations from ~/.fonts.conf is deprecated. please move it to /home/thomas/.config/fontconfig/fonts.conf manually

但不确定这是否是关于同一件事。

编辑2:不是。我设法解决了 evince 弃用消息,但 luatex/fontspec 数据库崩溃仍然存在。

答案1

编辑——找到问题的根源:

kpsewhich luaotfload-database.lua

包含逐字路径

local fonts_conves = { --- plural, much?
        "/usr/local/etc/fonts/fonts.conf",
        "/etc/fonts/fonts.conf",
    }

但这不会造成伤害。我认为这些stack overflow信息对工具的干扰更大。

由于堆栈溢出发生在/usr/local/etc/fonts/fonts.conf丢失消息之后,因此解析可能会出现问题/etc/fonts/fonts.conf

你可以尝试

暂时mv /etc/fonts/fonts.conf /etc/fonts/tmprm-fonts.conf.

原来的

luaotfload-tool 使用 luaotfload-parsers 中的函数来扫描 fonts.conf 文件。

  read_fonts_conf_indeed() -- Scan paths included from fontconfig
  configuration files recursively. Called with eight arguments.
  The first four are

      · the path to the file
      · the expanded $HOME
      · the expanded $XDG_CONFIG_HOME
      · the expanded $XDG_DATA_HOME

  determining the path to be checked. Another three arguments are
  tables that represent the state of the current job as lists of
  strings; these are always returned. Finally a reference to the
  find_files function is passed.

上面的代码片段来自 texlive-2015 的 2.5-4 版本。您可以在这里看到,当有一个带有安装程序的集成系统时,安装 Debian 软件包通常是一件坏事,因为 Debian 从不更改软件包版本,而且很难跟踪 texlive 软件包。您永远无法知道 Debian 软件包制作者对版本的看法,也无法知道软件包名称是否会在下一个 Debian 版本中发生变化。

直接手动安装 texlive 也相当简单。如果您需要此操作的支持,请随时留下个人消息。

调试系统

您可以kpsewhich luaotfload-parsers.lua编辑写入 stdout 的文件名并搜索 read_fonts_conf_indeed。上面的代码片段可能是doc函数定义上方部分的一部分。

你可以尝试

将 XDG_CONFIG_HOME 和 XDG_DATA_HOME 设置为 fonts.conf 所在的路径。但我不确定这两个变量后面附加了哪些路径。

创建路径 /usr/local/etc/fonts/ 并touch fonts.conf在那里应该不会有什么坏处。

检查 fontconfig 包是否已安装

dpkg -l fontconfig

以及哪些文件属于该包

dpkg -L fontconfig

apt-get install fontconfig如果没有安装的话你应该这么做。

答案2

read_fonts_conf_indeed 在 @ikrabbe 的提示和正确猜测之后,我在函数中插入了一行,kpsewhich luaotfload-parsers.lua说明logreport它正在查看什么路径。输出显示了 11 条路径的循环,其中一些是*.conf文件,一些是目录。查看*.conf-files 时,我发现它一遍又一遍地 -ing 它自己。自从我注释掉那行后,一切都正常了。呼~/.config/font-manager/local.conf<include>

我不确定,但我想很久以前我可能已经将文件从字体管理器的系统范围配置目录复制到我的私人~/.config/...目录,以用作一些早已忘记的修改的模板,并留下了那一行。luaotfload是第一个因此崩溃的程序。

相关内容