具有树形布局的 Tikz 图形绘制库会引发错误

具有树形布局的 Tikz 图形绘制库会引发错误

当我编译以下代码片段时

\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 outtree 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

因为这对于那些经验很少或没有经验的人来说可能比较困难。让我解释一下添加这段代码的步骤。

  1. 找到[YOUR TEX INSTALLATION]/tex/generic/pgf/graphdrawing/lua/pgf/gd/interface文件夹
  2. 复制并备份InterfaceToDisplay.lua文件
  3. 打开InterfaceToDisplay.lua
  4. function InterfaceToDisplay.createVertex(name, shape, path, height, binding_infos, anchors)在文件中找到
  5. 在该行下方(和上方-- 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

  6. 保存文件(您可能需要管理员权限,具体取决于安装)

修复问题 #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}

生成的图像如下所示:

使用树形布局正确删除 \graph 内部的

相关内容