我正在尝试使用 LaTeX 构建一个简单的 UML 图tikz-uml
\umlinherit
包。使用命令时失败。
我的代码和错误消息如下,感谢您的任何想法!
\documentclass{article}
\usepackage{tikz-uml}
\begin{document}
\begin{tikzpicture}
\begin{umlpackage}[x=0,y=0]{Tierhof}
\umlclass[x=7]{Tier}{
}{
\~{} fuettern():void\\
\# getNahrungsBedarf():void\\
\# getVerkaufsPreis():void
}
\umlclass[x=5, y=-3]{Pferd}{ }{}
\umlinherit{Pferd}{Tier}
\end{umlpackage}
\end{tikzpicture}
\end{document}
错误:
! Undefined control sequence.
\pgfmath@dimen@ ...men@@ #1=0.0pt\relax \pgfmath@
l.15 \umlinherit{Pferd}{Tier}
答案1
发现问题:
我发现了原文中的问题tikz-uml.sty
:
在其第 629 行中有这样一段语句:
\pgfmathsetmacro{\weightT}{1-\real{\weight}
它的问题在于的使用\real
,在新版本的中它已被移至其他宏pgfmathparser
,并且自新版本的 PGF 以来它不再可用。
找到解决办法了:
这个问题的解决方案很简单:
- 包含新的 TikZ 库
math
。 将第 629 行替换为以下代码:
\tikzmath{% real \weightT;% \weightT = 1 - real \weight;% }%
简单补丁:
为了修补的原始版本tikz-uml.sty
,我们可以对其应用以下修补程序:
--- tikz-uml.sty.orig 2015-10-10 23:44:04.978866966 -0300
+++ tikz-uml.sty 2015-10-10 23:29:46.902834319 -0300
@@ -16,7 +16,7 @@
\RequirePackage{xstring}%
\RequirePackage{calc}%
\RequirePackage{pgfopts}%
-\usetikzlibrary{backgrounds,arrows,shapes,fit,shadows,decorations.markings}%
+\usetikzlibrary{backgrounds,arrows,shapes,fit,shadows,decorations.markings,math}%
\def\tikzumlPackageLayersNum{3}%
\pgfkeys{/tikzuml/options/.cd, packageLayers/.initial=3}%
@@ -626,7 +626,11 @@
\setcounter{posT}{100*\real{\positionT}}%
\setcounter{posStereo}{100*\real{\positionStereotype}}%
%
- \pgfmathsetmacro{\weightT}{1-\real{\weight}}%
+ % \pgfmathsetmacro{\weightT}{1-\real{\weight}}%
+ \tikzmath{%
+ real \weightT;%
+ \weightT = 1 - real \weight;%
+ }%
%
\def\tikzumlControlNodesNum{0}%
%
如果上述补丁保存在名为的文件中tikz-uml.patch
,位于原始库的同一文件夹中,则可以通过以下方式应用:
cp tikz-uml.sty tikz-uml.sty.old
patch < tikz-uml.patch
答案2
自从将软件包更新到 3.0.1 以来,我遇到了类似的问题pgf
。任何连接器的使用tikz-uml
都会导致pgfmath
问题。我已经写信给 Kielbasiewicz 先生并等待他的回复,因为我还不够聪明,无法解开这个谜团。同时,恢复到较早的pgf
版本已经为我解决了这个问题。
答案3
更新:2015 年 10 月 10 日
我会将这个答案保留在这里一段时间,但我得到了该问题的真正解决方案,我刚刚将其作为对同一问题的新答案。
我也遇到了这个问题。
为了解决此不兼容性,我做的第一件事是使用旧版 TexLive (2013)。此解决方案效果不错,但它让我在编译其他文档时不得不在 2013 版和 2015 版之间切换。
到目前为止我发现一个相当好的解决方案(只要tikz-uml
继续与最新的 TexLive 不兼容)是pgf
在同一个项目文件夹中本地安装旧版本,同时使用最新的 TexLive。
假设:
$PROJHOME
:指向项目文件夹。$TEMPPATH
:指向某个时间位置。
对我有用的方法:
在项目文件夹内创建一个特殊文件夹。例如:
cd $PROJHOME mkdir -p texmf/tex
下载存档版本
pgf
:cd $TEMPPATH wget ftp://tug.org/historic/systems/texlive/2013/tlnet-final/archive/pgf.tar.xz
解压缩:
tar Jxf pgf.tar.xz
将文件夹内容复制
tex
到第一步创建的文件夹内。cd $TEMPPATH cp -rp tex/* $PROJHOME/texmf/tex
让 LaTeX 找到你的旧包:
如果正在使用 Makefile,则导出此环境变量(作为第一行之一):
export TEXMFHOME:=.:./texmf:~/texmf:${TEXMFHOME}
否则,将其设置为会话中的环境变量。
我在这里所写的内容基于 Tex.SX 的这些答案:
答案4
使用\tikzmath
会导致另一个我无法解决的问题。我找到的解决方案更基本,删除\real
并写入\pgfmathsetmacro{\weightT}{1.0-\weight}
它适用于 TiKZ 3,通常应该适用于 TikZ 2。此修复程序将很快在 tikz-uml 的新版本中提供