如何定义在 tikzpicture 环境中使用的命令?

如何定义在 tikzpicture 环境中使用的命令?

我想为 tikzpicture 环境定义一个环境,该环境定义 tikz 特定的命令。

以下是定义命令的 UML 环境的简化示例\Class):

\newenvironment{UMLDiagram}{%
    \newcommand{\Class}[3]{\node[class](##1){##2\nodepart{second}{##3}};}%
    \begin{tikzpicture}[%
        class/.style={draw, rectangle split, rectangle split parts=2, align=left}%
    ]%
}{%
    \end{tikzpicture}%
}

我想按照以下方式使用它:

\begin{UMLDiagram}
    \Class{id}{ClassName}{attributeA=a\\attributeB=b}
\end{UMLDiagram}

这——并不完全出乎意料——会引发一个错误:

! 未定义控制序列 tizk@invoke@collected@onpath ...mmand \tikz@temp \pgf@stop (...)

但是,带有单个参数的命令并没有失败。

那么,你该怎么做呢?或者,在相关说明中,tikz 是否为 tikz 特定的命令定义提供了机制?


平均能量损失

\documentclass{minimal}

\usepackage{tikz}
\usetikzlibrary{shapes}

\newenvironment{UMLDiagram}{%
    \newcommand{\Class}[3]{\node[class](##1){##2\nodepart{second}{##3}};}%
    \begin{tikzpicture}[%
        class/.style={draw, rectangle split, rectangle split parts=2, align=left}%
    ]%
}{%
    \end{tikzpicture}%
}

\begin{document}

\begin{UMLDiagram}
    \Class{id}{ClassName}{attributeA=a\\attributeB=b}
\end{UMLDiagram}

\end{document}

跟进

对我有用的解决方案是在节点标签中使用表格环境如这里所提供

    \newenvironment{UMLDiagram}{%
    \newcommand{\Class}[3]{
        \node[class](##1){%
            ##2%
            \nodepart{second}%
            \begin{tabular}{l}##3\end{tabular}%
        };
    }%
    \begin{tikzpicture}[%
        class/.style={draw, rectangle split, rectangle split parts=2, align=left}%
    ]%
}{%
    \end{tikzpicture}%
}

align=left和模式\\本来会很有利,但在这种情况下却不起作用。

答案1

\\是错误的原因,如果你删除它,你的代码就会成功:

\documentclass{minimal}

\usepackage{tikz}
\usetikzlibrary{shapes}

\newenvironment{UMLDiagramm}{%
    \newcommand{\Class}[3]{\node[class](##1){\underline{##2}\nodepart{second}{##3}};}%
    \begin{tikzpicture}[%
        class/.style={draw, rectangle split, rectangle split parts=2, align=left}%
    ]%
}{%
    \end{tikzpicture}%
}

\begin{document}

\begin{UMLDiagramm}
    \Class{id}{ClassName}{attributeA=a,attributeB=b}% <=== replaced \\ with ,
\end{UMLDiagramm}

\end{document}

如果定义了文本宽度,则可以使用换行命令:

\documentclass{minimal}

\usepackage{tikz}
\usetikzlibrary{shapes}

\newenvironment{UMLDiagramm}{%
    \newcommand{\Class}[3]{\node[class](##1){\underline{##2}\nodepart{second}{##3}};}%
    \begin{tikzpicture}[%
        class/.style={draw, rectangle split, rectangle split parts=2, align=left,
        text width=3cm% <=== added
        }%
    ]%
}{%
    \end{tikzpicture}%
}

\begin{document}

\begin{UMLDiagramm}
    \Class{id}{ClassName}{attributeA=a\\attributeB=b}
\end{UMLDiagramm}

\end{document}

相关内容