PlantUML Tips(状態遷移図向け)

#はじめに
PlantUMLで状態遷移図を作成する方向けにTipsをまとめました。
痒い所に手が届けば幸いです。

#前提知識
PlantUML
http://plantuml.com/ja/

#確認バージョン
2.11.0 on VSCode

#状態項目
##名称に記号・絵文字を使用したい
状態項目名に「(」とか「)」とか「-」とか「&」でさえも使用するとエラーになります。
使用する場合は""で括ってください。
外部の状態(中括弧を使用しているところ)の名称に記号を含めたい場合はasでエイリアスを付加しないとエラーになります。

```
@startuml
state "禁止文字入り(半角括弧とか-とか)" as aliasName {
  state "絵文字もダブルクオーテーションで括れば可能😀😁😂"
}
@enduml
```

![testMaakdown.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18395/6d0be8c0-53c5-149b-9db0-e50987bb48e1.png)

##背景色を変更したい
状態名称の後ろに色名を指定します。

```
@startuml
state WhiteState #White{
  state BlueState #Blue
}
state GreenState #00FF00
@enduml
```

![testMaakdown-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18395/ba1d0451-8bb9-021c-7e9d-11637bacd4c7.png)

##枠線の色を変更したい
skinparamを使用します。
特定の枠線のみ変更したい場合は<<任意の名前>>でskinparamと状態名称を紐づけます。

```
@startuml
'すべての枠線を水色にする
skinparam stateBorderColor #00FFFF
'特定の枠線を青色にする
skinparam stateBorderColor<<Specified>> #0000FF

state WhiteState #White{
  state BlueState #Blue
}
state GreenState <<Specified>> #00FF00
@enduml
```
![testMaakdown-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18395/cd7a2495-45bc-4bc8-f7a2-14f8731ee3e6.png)

##文字のスタイルを変更したい
skinparamを使用する方法、XMLなタグで指定する方法があります。

```
@startuml
'特定の文字を赤・フォントサイズ20にする
skinparam StateFontColor<<Specified>> #FF0000
skinparam StateFontSize<<Specified>> 20

'注意：改行(<br>)が認識されないので、１行ごとに改行\nを付加する必要がある
state "<b><color:#FFFFFF>タグで指定してみた</color></b>\n
<color:#FFFFFF>2行目</color>
" as BlueState #blue

state "skinParamで指定してみた"<<Specified>> #FFFF00
@enduml
```

![testMaakdown-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18395/c5851686-7662-0aa1-f820-6f112a78e573.png)


#矢印
##矢印のスタイルを変更したい
矢印にいろいろ(※参照)指定します。
skinparamを指定してもできますがここでは省略します。
(※参照)http://forum.plantuml.net/93/how-use-different-color-for-arrows-in-state-diagram

```
@startuml
state WhiteState #FFFFFF
state GreenState #00FF00
WhiteState-[#Black]->GreenState : 色名を指定
WhiteState-[dashed,thickness=10]->GreenState : 点線・太さを指定
@enduml
```
![testMaakdown-8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18395/b480e19b-26dc-f130-bf70-649586eeb0af.png)

##文字のスタイルを変更したい
タグで指定します。
矢印すべての文字のスタイルを指定する場合はskinparamの指定でも可能です。
※skinparamによる特定の文字のスタイルの変更はできない模様・・・

```
@startuml
state WhiteState #FFFFFF
state GreenState #00FF00
WhiteState-->GreenState : <b><color:#0000ff>タグ指定</color></b>
WhiteState-->GreenState : 指定なし
@enduml
```

![testMaakdown-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18395/fdffba41-b2d7-b794-95f9-878a2acb5dfa.png)

##矢印の長さを変える
-->の-の数を変えると長さが変わります。

```
@startuml
state WhiteState #FFFFFF
state GreenState #00FF00
state SkyblueState #Skyblue
state PinkState #Pink
WhiteState--> GreenState: あっち
WhiteState--> SkyblueState : こっち
WhiteState--> PinkState : こっち
@enduml
```
![tesuto2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18395/93f68ec0-9330-7c7e-7775-ca2d3327d62b.png)
上記が

```
@startuml
state WhiteState #FFFFFF
state GreenState #00FF00
state SkyblueState #Skyblue
state PinkState #Pink
WhiteState--> GreenState
WhiteState---> SkyblueState
WhiteState----> PinkState
@enduml
```
![tesuto2-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18395/160f79f8-17e1-e766-12d1-8d3c20c11d7e.png)
こう変わります。


##矢印が重なる対策
実務レベルのUMLを書こうとするとたまに発生するネタ
特定の条件で発生するようです。

```
@startuml
state WhiteState #FFFFFF
state GreenState #00FF00{
state InnerGreenState #00FF00
}
InnerGreenState-> WhiteState: あっち
WhiteState->InnerGreenState : こっち
@enduml
```
![testMaakdown-6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18395/c173cea9-8bb7-b0e5-36ad-7a141ffe90b1.png)

矢印に向き(-up-> / -down-> / -left-> / -right->)を指定すると回避できますがここでは他の方法を紹介。

非表示の矢印([hidden]を付加したやつ)を追加することで
自動レイアウトが矢印の位置をずらしてくれます。
※多用は禁物

```
@startuml
state WhiteState #FFFFFF
state GreenState #00FF00{
state InnerGreenState #00FF00
}
InnerGreenState-> WhiteState: あっち
WhiteState->InnerGreenState : こっち
WhiteState-[hidden]>InnerGreenState : こっち(非表示)
@enduml
```

![testMaakdown-14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18395/51d622f8-fd5e-bb87-54dc-03758bb401b5.png)


テキストに空行(\n)を付加して表示位置をずらすことで回避する方法もあります。必要に応じてどうぞ
※多用は禁物・・・

```
@startuml
state WhiteState #FFFFFF
state GreenState #00FF00{
state InnerGreenState #00FF00
}
InnerGreenState-> WhiteState: あっち\n
WhiteState->InnerGreenState : こっち
@enduml
```

![testMaakdown-16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18395/269e451e-bd4c-de28-16c0-afb397e6e13a.png)


#注釈

##背景色を変更したい
状態名称の後ろに色名を指定します。

```
@startuml
state WhiteState #FFFFFF
note bottom of WhiteState  #aqua
注釈
end note
@enduml
```

![testMaakdown-18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18395/93762c77-20d5-b775-3edf-051f09507a7a.png)


##枠線の色を変更したい
skinparamを使用します。
※特定の枠線のみの変更はできないようなので、フォーラムに質問しています

```
@startuml
'すべての枠線を水色にする
skinparam NoteBorderColor #00FFFF

state WhiteState  #FFFFFF
note  bottom of WhiteState 
注釈：枠線の色は水色
end note
@enduml
```

![testMaakdown-20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18395/09313107-9b37-df80-9a02-da9bd1bb56e8.png)


##文字のスタイルを変更したい
タグで指定します。
もちろんskinparamの指定でも可能です。

```
@startuml
state WhiteState #FFFFFF
note bottom of WhiteState
<b><color:#0000FF>注釈にタグを付加</color></b>
<b><color:#0000FF>改行<br>は効きません</color></b>
end note
@enduml
```

![testMaakdown-11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18395/e43e69f1-a075-e9d0-f2c8-dd5b5a369a80.png)


#参考
指定可能な色名について
http://plantuml.com/ja/color

指定可能なskinparam一覧
※各種スタイルの変更に必要なskinparamが網羅されています
https://plantuml-documentation.readthedocs.io/en/latest/formatting/all-skin-params.html

不明点や要望があればフォーラムに書くのも手です
http://forum.plantuml.net/