我尝试(通过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 上。
我使用了以下软件/库版本:
- PGF 3.0.0
- 光气凝胶渗透过滤器2012.07 版
- Lua 5.2.3
安装
Lua 和 OGDF
我将 Lua 和 OGDF 从源代码安装到个人目录(即非系统目录)。我遵循了标准程序,但对 OGDF 进行了两项调整:
调整了makeMakefile.config中的一个参数:
sharedLib = true
从 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>
。这个想法基本上如下:
make all
- 如果(当)有错误时,手动修复(创建共享对象,
.so
) - 如果还有其他
.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 库了。