答案1
我认为卡拉姆迪尔的权利—除非您打算将 TeX 用于其他用途,否则单独的 UML 绘图程序可能是一个更好的主意。如果您确实想使用 TeX,那么您需要使用 TikZ。这是一个工作示例(使用 LaTeX),它主要模仿详细视图:
\documentclass[landscape]{article}
\usepackage[margin=.5cm]{geometry}
\usepackage{tikz}
\usetikzlibrary{calc}
\usetikzlibrary{chains}
\usetikzlibrary{arrows}
\tikzset{
every adventure uml/.style = { draw, thin
, minimum height = 2cm, text width = 4cm }
, adventure uml icon/.style = { label={[shift={(-1cm,.5cm)}]335:#1 } }
%
, overview/.style = {every adventure uml, fill = violet, text = white}
, goal/.style = {every adventure uml, fill = cyan!50}
, problem/.style = { every adventure uml, adventure uml icon = problem-#1
, fill = magenta!50 }
, solution/.style = { every adventure uml, adventure uml icon = solution-#1
, fill = green!50 }
%
, sequence/.style = { chain default direction = going below
, start chain = #1, node distance = -.4pt
, every adventure uml/.append style = {on chain=#1} }
, sequence/.default = {problem sequence}
%
, right angle/.style = {
to path={ -- ($(\tikztostart)!.5!(\tikztostart -| \tikztotarget)$)
|- (\tikztotarget) \tikztonodes }
}
%
, terminal/.style = { circle, draw=black, fill=#1
, line width=.2cm, inner sep=0pt, minimum size=.6cm}}
\begin{document}
\begin{center}\begin{tikzpicture}
\node [terminal=black, label=below:Start] (start) at (-6,0) {} ;
\node [terminal=cyan!25, label=below:End] (end) at (+16,0) {} ;
\node [below=of start, overview]
{You need to know that the transporter belongs to the motel.} ;
\node [below=of end, overview]
{They drive to the professor's aparetment.} ;
\begin{scope}[sequence]
\node[goal] (goal-transporter)
{Use the transporter to drive to the city.} ;
\node[problem=NPC] {Can't drive with manual gearshift.} ;
\node[solution=convince] (sol-convince) {Convince female reporter.} ;
\node[problem=key] {No key for the truck.} ;
\node[solution=obtain] (sol-get key) {Get the key from the office.} ;
\end{scope}
\begin{scope}[xshift=8cm, sequence]
\node[goal] (goal-ask) {Ask reporter.} ;
\node[problem=want] {Not motivated to help you.} ;
\node[solution=obvious] (sol-amulet) {Show the amulet.} ;
\end{scope}
\begin{scope}[xshift=8cm, yshift=-10cm, sequence]
\node[goal] (goal-find key) {Find the key.} ;
\node[problem=guard] {Housekeeper guards it.} ;
\node[solution=puzzle] (sol-solve 1-2) {Puzzle 1.2.} ;
\end{scope}
\begin{scope}[-triangle 45, every to/.style={right angle}]
\draw (start) to (goal-transporter.west) ;
\draw (sol-convince) to (goal-ask) ;
\draw (sol-get key) to (goal-find key) ;
\draw (sol-solve 1-2.east) to (end) ;
\end{scope}
\end{tikzpicture}\end{center}
\end{document}
这将产生以下输出。需要注意的是:我没有在右下角使用小图标,而只是文本,因此会溢出。使用图标可以避免这种情况。
因此,既然您不了解 TikZ,下面介绍它的工作原理。我要做的第一件事是加载一堆正确设置的包:横向模式、小边距、TikZ 包和 TikZ 的相关功能。接下来,我设置了一些样式。这些基本上是预定义的绘制方式。例如,every adventure uml
用细线绘制,尺寸为 2cm x 4cm。样式adventure uml icon
排版图像,其中节点的右下角。 #1
是样式的参数;我会\includegraphics{#1}
在您的代码中将其替换为类似的东西,然后确保您problem-key.png
在工作的目录中有命名的图形。
接下来的四种样式是特定类型的节点:深紫色表示概览;蓝色表示目标;粉色表示问题;绿色表示解决方案。problem
和都接受一个参数,然后分别solution
将文本problem-ARG
和传递给。因此,如果您写入,您将得到,根据我提议的更改,它将运行并查找、或类似的东西。solution-ARG
adventure UML icon
\node[problem=key] ...
adventure UML icon=problem-key
\includegraphics{problem-key}
problem-key.png
problem-key.pdf
下一个样式sequence
,用于创建单个拼图所用的垂直节点列。它创建一个节点“链”,TikZ 将为您布局,然后添加选项on chain
。every adventure uml
撤消node distance=-.4pt
线宽,因此每个块的中心与下一个块的中心相距 2 厘米(除非您添加更多文本);该参数只是命名链,大多数情况下可以忽略。
接下来,我们告诉 TikZ 如何绘制这些漂亮的直角线。坐标($(\tikztostart)!.5!(\tikztostart -| \tikztotarget)$)
很复杂,所以让我们分解一下。($...$)
语法告诉我们正在进行某种计算。在本例中,计算结果为(pt-a)!frac!(pt-b)
,结果为和frac
之间的一个点。在本例中,它位于起点和 的中间。第二个坐标只是计算一个点,它是从起点延伸的水平线和从终点延伸的垂直线的交点。换句话说,这个(pt-a)
(pt-b)
(\tikztostart -| \tikztotarget)
所有的坐标表示“水平移动到起点和终点之间的一半”。然后,|- (\tikztotarget)
通过先向上移动,再向右移动,绘制一条线到终点。
最后,样式只绘制用于和 的terminal
圆圈。应该非常清晰。start
end
呼!好了,搞定这些之后,让我们开始实际绘制图表。前两个节点只是绘制起点和终点。标签可让您将另一个节点附加到您正在绘制的节点;在这里,我使用它向圆圈添加“起点”和“终点”文本。然后,我将概览框放置在终端下方;below = of NODE
正如您可能已经猜到的那样,这就是它的作用 :-) 您还可以执行诸如above = of NODE
等操作。
现在我们来看看这三个序列。每个序列都包含在一个 中scope
,它仅设置一些参数(在本例中是序列的一部分)以应用于其中的所有内容。在每个序列中,都有一堆节点命令。在本例中,该命令的语法为\node[STYLE] (LABEL) {TEXT} ;
。(LABEL)
是可选的,并提供一种稍后引用事物的方式。STYLE
在本例中, 指的是goal
、problem=TYPE
或之一solution=TYPE
,我在上面定义了 。而TEXT
,不出所料, 就是将在节点内打印的内容。每个序列看起来都像这样;xshift
并yshift
以简单的方式移动它们。
最后,我们绘制边。我们创建一个范围,其中每条线都用箭头和直角绘制;箭头规范为-triangle 45
,表示使用 45 度等腰三角形作为箭头。然后我们连接相关节点,就完成了!
我没有做的一件大事是添加对“问题:密钥请求“行。我不确定最好的方法是什么;可能是一些引用参数的命令problem
或solution
,这样你就可以编写\node[problem=key] {\auml{Some text}}
并\auml
完成繁重的工作。但我不确定最好的方法是什么。也就是说,它应该可以在 TeX/TikZ 中完成。
答案2
当然,使用 TeX(LaTeX、ConTeX)创建这样的图表是可能的。我从未使用 TeX 创建过 UML 图表,但正如 Maciej 指出的那样,已经有了关于 UML 图排版的问题。如果预制包不能满足您的需求,那么使用 TikZ 创建这些类型的图表应该很简单。texample.net 上的几个小例子。
对于学习 *TeX,请参见例如标记为学习的问题。通常,LaTeX 包都有很好的手册(我不知道 UML 包的情况),而 TikZ 有一个很棒的手册和几个很好的教程。
然而:选择正确的工具你想要做什么。正如 JCL 指出的那样很多工具专为创建 UML 图表而设计。甚至很多免费的。我并不是想阻止你学习 TeX,但如果你只是想创建这些类型的图表,专用的图表绘制程序可能会更高效。