在 LaTeX 中使用 tikz-uml 包时出现未定义的控制序列错误

在 LaTeX 中使用 tikz-uml 包时出现未定义的控制序列错误

我正在尝试使用 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 以来它不再可用。


找到解决办法了:

这个问题的解决方案很简单:

  1. 包含新的 TikZ 库math
  2. 将第 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:指向某个时间位置。

对我有用的方法:

  1. 在项目文件夹内创建一个特殊文件夹。例如:

    cd $PROJHOME
    mkdir -p texmf/tex
    
  2. 下载存档版本pgf

    cd $TEMPPATH
    wget ftp://tug.org/historic/systems/texlive/2013/tlnet-final/archive/pgf.tar.xz
    
  3. 解压缩:

    tar Jxf pgf.tar.xz
    
  4. 将文件夹内容复制tex到第一步创建的文件夹内。

    cd $TEMPPATH
    cp -rp tex/* $PROJHOME/texmf/tex
    
  5. 让 LaTeX 找到你的旧包:

    1. 如果正在使用 Makefile,则导出此环境变量(作为第一行之一):

      export TEXMFHOME:=.:./texmf:~/texmf:${TEXMFHOME}
      
    2. 否则,将其设置为会话中的环境变量。


我在这里所写的内容基于 Tex.SX 的这些答案:

答案4

使用\tikzmath会导致另一个我无法解决的问题。我找到的解决方案更基本,删除\real并写入\pgfmathsetmacro{\weightT}{1.0-\weight} 它适用于 TiKZ 3,通常应该适用于 TikZ 2。此修复程序将很快在 tikz-uml 的新版本中提供

相关内容