安装

安装

我尝试(通过lualatex)编译以下 MWE,但没有成功。

\documentclass[tikz]{standalone}
\usetikzlibrary{graphdrawing}
\usegdlibrary{ogdf}
\begin{document}
\begin{tikzpicture}
  \graph [SugiyamaLayout] { a -- {b,c,d} -- e -- a };
\end{tikzpicture}
\end{document}

我收到此消息:

! LuaTeX error ...tex/generic/pgf/graphdrawing/lua/pgf/gd/ogdf/library.lua:32: m
odule 'pgf_gd_ogdf_c_ogdf_script' not found:
    no field package.preload['pgf_gd_ogdf_c_ogdf_script']
    [kpse lua searcher] file not found: 'pgf_gd_ogdf_c_ogdf_script'
    [kpse C searcher] file not found: 'pgf_gd_ogdf_c_ogdf_script'
    [oberdiek.luatex.kpse_module_loader]-eroux Search failed
stack traceback:
    [C]: in function 'require'
    ...tex/generic/pgf/graphdrawing/lua/pgf/gd/ogdf/library.lua:32: in main chunk
    [C]: in function 'require'
    [string "\directlua "]:1: in function 'lookup'
    [string "\directlua "]:1: in function 'pgf_lookup_and_require'
    [string "\directlua "]:1: in main chunk.
<argument> ...drawing library '\pgf@temp ' not found}}') end}
                                                   \fi 
l.3 \usegdlibrary{ogdf}

那么,如何将 OGDF 库与 TikZ 3.0 一起使用?

答案1

评论太长。在章节34 图形绘制算法:开放图形绘制框架PGF 文档对此有一个令人沮丧的消息:

备注:ogdf 库的集成仍在建设中,本节中的示例更多是概念验证。因此,使用时请自担风险。

然后是下面几行:

由于 C++ 代码是编译的而不是解释的(像 Lua 一样),为了使用当前的库,您需要为pgf/gd/ogdf/c/ogdf_script.so您的特定架构正确安装 ogdf 库的 pgf 接口代码的编译版本 ( )。这绝非易事...

因此,为了使这些示例正常工作,您需要pgf/gd/ogdf/c/ogdf_script.so为您的特定体系结构正确安装编译版本。如何做到这一点,我不知道...我在网上快速搜索了一下,但没有找到任何真正有用的东西。这似乎真的不是一件容易的事。

答案2

添加以下行后,我就能编译该示例了:

\usetikzlibrary{graphs}

这样完整的 MWE 就变成:

\documentclass[tikz]{standalone}
\usetikzlibrary{graphs}
\usetikzlibrary{graphdrawing}
\usegdlibrary{ogdf}
\begin{document}
\begin{tikzpicture}
  \graph [SugiyamaLayout] { a -- {b,c,d} -- e -- a };
\end{tikzpicture}
\end{document}

如果仍然有问题,您可以检查 PGF-OGDF 接口库中是否缺少依赖项:

ldd PATH_TO/pgf_gd_ogdf_c_ogdf_script.so

以下是对以下内容的描述为我工作在 Ubuntu 12.04 x86-64 上。

我使用了以下软件/库版本:

安装

Lua 和 OGDF

我将 Lua 和 OGDF 从源代码安装到个人目录(即非系统目录)。我遵循了标准程序,但对 OGDF 进行了两项调整:

  1. 调整了makeMakefile.config中的一个参数:

    sharedLib = true
    
  2. 从 makeMakefile.py 中的编译器选项中删除-DOGDF_DLL。在下面的差异中,“<”是原始版本,“>”是调整后的版本:

    85c85
    <       compiler = ' '.join( [compiler, '-DOGDF_DLL -DOGDF_INSTALL' ] )
    ---
    >       compiler = ' '.join( [compiler, '-DOGDF_INSTALL' ] )
    

PGF的OGDF接口

我从以下网址下载并解压了 PGF 的 TDS 档案: http://www.ctan.org/pkg/pgf

source/generic/pgf/c/config/LocalMakefileConfig.mk我创建了一个包含以下内容的文本文件 :

LUAINCLUDES=<LUAPATH>
OGDFINCLUDES=<OGDFPATH>
INSTALLDIR=<TEXBIN>/lib/luatex/lua
MYCFLAGS=-fPIC

请注意,<...>必须用适当的值替换:

  • <LUAPATH>,lua 标头的路径
  • <OGDFPATH>,OGDF 标头的路径
  • <TEXBIN>,TeX 二进制文件的路径

唉,我找不到一种方法来制作一个可以make all完成简单操作的本地配置文件(因为 Makefile 中编译器选项的顺序)。这让我有两个选择:编辑 Makefile 或手动编译。我选择了后者。

我运行了以下命令序列,其中<LIBPATH>表示 Lua 和 OGDF 库的位置(.so)。将其替换为适当的路径。请注意,如果库已安装在标准位置,则不需要-L<LIBPATH>-rpath=<LIBPATH>。这个想法基本上如下:

  1. make all
  2. 如果(当)有错误时,手动修复(创建共享对象,.so
  3. 如果还有其他.so文件需要制作,请转到 1

命令序列:

cd source/generic/pgf/c
make all
cd graphdrawing/pgf/gd/examples/c
gcc -shared SimpleDemoC.o ../../interface/c/InterfaceFromC.o \
  -L<LIBPATH> -Wl,--no-undefined,-rpath=<LIBPATH> \
  -lm -llua -o SimpleDemoC.so
cd ../../../../..
make all
cd graphdrawing/pgf/gd/examples/c
g++ -shared SimpleDemoCPlusPlus.o ../../interface/c/InterfaceFromC++.o \
  ../../interface/c/InterfaceFromC.o -L<LIBPATH> \
  -Wl,--no-undefined,-rpath=<LIBPATH> -llua \
  -o SimpleDemoCPlusPlus.so
cd ../../../../..
make all
cd graphdrawing/pgf/gd/ogdf/c
g++ -shared ../../interface/c/InterfaceFromC.o \
  ../../interface/c/InterfaceFromC++.o InterfaceFromOGDF.o ogdf_script.o \
  -L<LIBPATH> -Wl,--no-undefined,-rpath=<LIBPATH> \
  -pthread -llua -lOGDF -o ogdf_script.so
cd ../../../../..
make all
cd graphdrawing/pgf/gd/ogdf/c
g++ -shared SimpleDemoOGDF.o ../../interface/c/InterfaceFromC++.o \
  ../../interface/c/InterfaceFromC.o InterfaceFromOGDF.o \
  -L<LIBPATH> -Wl,--no-undefined,-rpath=<LIBPATH> \
  -pthread -llua -lOGDF -o SimpleDemoOGDF.so
cd ../../../../..
make install_all

此后,TikZ/PGF 应该准备好使用 OGDF 库了。

相关内容