当我编译以下代码片段时
\documentclass[tikz,border=0pt]{standalone}
\usetikzlibrary{graphdrawing}
\usetikzlibrary{graphs}
\usetikzlibrary{shapes.misc}
\usegdlibrary{trees}
\begin{document}
\begin{tikzpicture}
\graph [tree layout]
{
A -- {
B[draw,cross out]
}
};
\end{tikzpicture}
\end{document}
我收到以下错误:
ERROR: LuaTeX error ...graphdrawing/lua/pgf/gd/interface/InterfaceToDisplay.lua:213:
--- TeX said ---
...9/tex/generic/pgf/graphdrawing/lua/pgf/gd/model/Path.lua:704: memoization tab
le filled incorrectly
stack traceback:
[C]: in function 'assert'
...graphdrawing/lua/pgf/gd/interface/InterfaceToDisplay.lua:213: in function 'r
esumeGraphDrawingCoroutine'
...graphdrawing/lua/pgf/gd/interface/InterfaceToDisplay.lua:182: in function 'r
unGraphDrawingAlgorithm'
[string "\directlua "]:1: in main chunk.
\pgfgdendscope ...lay.runGraphDrawingAlgorithm() }
\endgroup \directlua {pgf...
l.14 }
但是,当我省略该tree laylout
参数时,就没问题了。似乎我可以拥有 或cross out
,tree layout
但不能同时拥有两者。
我是不是做错了什么,或者这是一个 bug?还有其他方法可以删除节点吗?
答案1
根据 SourceForge 错误跟踪器pgf
,这似乎是一个声称在 2015 年底修复的错误。到 2018 年底,我在 MiKTeX 中仍然遇到此行为……还有另一个问题,这似乎是另一个错误(在 OP 之后引入?)。您可以进行两项编辑来解决这些问题,但它们并不十分完美。
问题 #1:
在 MiKTeX 上使用\usegdlibrary{trees}
会导致以下错误(截至 2018-12-13 的最新情况):
! Package pgf Error: Graph drawing library 'trees' not found.
为了解决这个问题,这是来自 @henri-menke 的回答(针对 TexLive 2018,发布于 2018 年 9 月)在 MiKTex 上也帮助了我。在加载之前\usegdlibrary{trees}
,你基本上需要加载这个 Lua 代码:
\usepackage{luacode}
\begin{luacode}
function pgf_lookup_and_require(name)
local sep = '/'
if string.find(os.getenv('PATH'),';') then
sep = '\string\\'
end
local function lookup(name)
local sub = name:gsub('%.',sep)
local find_func = function (name, suffix)
if resolvers then
local n = resolvers.findfile (name.."."..suffix, suffix) -- changed
return (not (n == '')) and n or nil
else
return kpse.find_file(name,suffix)
end
end
if find_func(sub, 'lua') then
require(name)
elseif find_func(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}
问题 #2:
不幸的是,这只让我遇到了与你的原帖询问的相同的错误。为了解决这个问题,我回到了SourceForge 错误追踪。JP-Ellis 于 2015-08-17 发表了一篇帖子,其中提出了一种解决方法,需要您手动更改包内的文件pgf
。
InterfaceToDisplay.createVertex
修复方法包括将以下代码行添加到文件函数的开头InterfaceToDisplay.lua
:
-- The path should never be empty, so we create a trivial path in the provided
-- path is empty. This occurs with the `coordinate` shape for example.
if #path == 0 then
path:appendMoveto(0, 0)
path:appendClosepath()
end
因为这对于那些经验很少或没有经验的人来说可能比较困难。让我解释一下添加这段代码的步骤。
- 找到
[YOUR TEX INSTALLATION]/tex/generic/pgf/graphdrawing/lua/pgf/gd/interface
文件夹 - 复制并备份
InterfaceToDisplay.lua
文件 - 打开
InterfaceToDisplay.lua
function InterfaceToDisplay.createVertex(name, shape, path, height, binding_infos, anchors)
在文件中找到在该行下方(和上方
-- Setup
)添加-- The path should never be empty, so we create a trivial path in the provided
-- path is empty. This occurs with the ``coordinate`` shape for example.
if #path == 0 then
path:appendMoveto(0, 0)
path:appendClosepath()
end
保存文件(您可能需要管理员权限,具体取决于安装)
修复问题 #1 和 #2 后的结果:
现在你从 OP 更新的文件将如下所示:
\documentclass[tikz,border=0pt]{standalone}
\usetikzlibrary{graphdrawing}
\usetikzlibrary{graphs}
\usetikzlibrary{shapes.misc}
%%% ADDED TO FIX ISSUE #1, (NOT ABLE TO FILE TREE GRAPH DRAWING LIBRARY)
\usepackage{luacode}
\begin{luacode}
function pgf_lookup_and_require(name)
local sep = '/'
if string.find(os.getenv('PATH'),';') then
sep = '\string\\'
end
local function lookup(name)
local sub = name:gsub('%.',sep)
local find_func = function (name, suffix)
if resolvers then
local n = resolvers.findfile (name.."."..suffix, suffix) -- changed
return (not (n == '')) and n or nil
else
return kpse.find_file(name,suffix)
end
end
if find_func(sub, 'lua') then
require(name)
elseif find_func(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}
\begin{tikzpicture}
\graph [tree layout]
{
A -- {
B[draw,cross out]
}
};
\end{tikzpicture}
\end{document}
生成的图像如下所示: