我想为 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}