在 Linux 上全新安装 TL 2018 时,找不到 tikz 图形绘制库。
例如文件texlive/2018/texmf-dist/tex/generic/pgf/graphdrawing/tex/pgflibrarygraphdrawing.trees.code.tex
就在那里。
\documentclass{scrartcl}
\usepackage{tikz}
\usetikzlibrary{graphdrawing}
\usegdlibrary{trees}
\begin{document}
Hello World
\end{document}
使用 lualatex 进行编译
! Package pgf Error: Graph drawing library 'trees' not found.
答案1
详情如下https://github.com/u-fischer/luaotfload/issues/6,与 ConTeXt 一起使用时pgf_lookup_and_require
错误地用于resolvers.findfile
查找图形绘制库。此错误在luaotfload
升级时出现,现在此resolvers.findfile
功能也已升级。
问题显然出在 PGF 上,因为resolvers.findfile
它要查找字体而不是 TeX 树中的任意文件。在修复此问题之前,您可以pgf_lookup_and_require
使用自己的变体覆盖该函数,该变体可以执行正确的操作。
\documentclass{article}
\usepackage{luacode}
\usepackage{tikz}
\usetikzlibrary{graphdrawing}
\begin{luacode*}
function pgf_lookup_and_require(name)
local sep = package.config:sub(1,1)
local function lookup(name)
local sub = name:gsub('%.',sep)
if kpse.find_file(sub, 'lua') then
require(name)
elseif kpse.find_file(sub, 'clua') then
collectgarbage('stop')
require(name)
collectgarbage('restart')
else
return false
end
return true
end
return
lookup('pgf.gd.' .. name .. '.library') or
lookup('pgf.gd.' .. name) or
lookup(name .. '.library') or
lookup(name)
end
\end{luacode*}
\usegdlibrary{trees}
\begin{document}
Hello World
\end{document}
在我看来,PGF 中的 Lua 代码并没有经过深思熟虑,因为这个简单的函数已经表现出一些 Lua 反模式,例如通过require
返回表而不是停止并重新启动垃圾收集器来污染全局环境,这会强制进行收集循环。此外,这种笨拙的确定路径分隔符的方式,而不是使用package.config
确实应该避免。