続・PlantUML使い方メモ

[PlantUML使い方メモ #Java - Qiita](https://qiita.com/opengl-8080/items/98c510b8ca060bdd2ea3) の続き。
クラス図やシーケンス図以外の図の書き方について、気になったやつのメモ。

# ◆EBNF図
[Extended Backus–Naur Form diagram](https://plantuml.com/ja/ebnf)

```plantuml
@startebnf
title LISP Grammar
grammars_expression = atomic_symbol | "(", s_expression, ".", s_expression, ")" | list;
list = "(", s_expression, { s_expression }, ")";
atomic_symbol = letter, atom_part;
atom_part = empty | letter, atom_part | number, atom_part;
letter = ? a-z ?;
number = ? 1-9 ?;
empty = " ";
@endebnf
```

- プログラミング言語の構文を説明するときとかに用いられる図
- EBNF 自体の説明は [EBNF - Wikipedia](https://ja.wikipedia.org/wiki/EBNF) とかを参照

## EBNF の基本
```text
hoge = "a" | "b" | fuga;
fuga = "1" | "2";
```

- EBNF は、プログラムの構文を**生成規則**を列挙することによって表現する
- 上の例は、 `hoge` と `fuga` の2つの生成規則を定義している
- 生成規則 `hoge` は、文字 `a`, 文字 `b` または別の生成規則 `fuga` のいずれかであることを示している
- 生成規則 `fuga` は、文字 `1` または 文字 `2` のいずれかであることを示している

### 終端記号と非終端記号
- プログラムの構文は、最終的には全て**終端記号**で構成されるものと考えることができる
    - 終端記号とは、 `a` や `1`, `*` などの具体的な文字や数字、記号などを指す
- 一方で、上の例の `hoge` や `fuga` などのように、他の終端記号や生成規則に分解可能なものは**非終端記号**と呼ぶ
    - 逆に言うと、具体的な文字はそれ以上分解できないから終端記号と呼べる
- EBNF は、非終端記号を終端記号に達するまで分解していっているようなものと考えられる

## 終端記号
```text
@startebnf
hoge = "a";
@endebnf
```

```plantuml
@startebnf
hoge = "a";
@endebnf
```

- 終端記号はダブルクォーテーション (`"`) で囲うことで表現できる

## 非終端記号
```text
@startebnf
hoge = fuga;
@endebnf
```

```plantuml
@startebnf
hoge = fuga;
@endebnf
```

- 素のテキストは非終端記号として扱われる

## いずれか
```text
@startebnf
hoge = "a" | "b" | "c";
@endebnf
```

```plantuml
@startebnf
hoge = "a" | "b" | "c";
@endebnf
```

- パイプ (`|`) で区切ることで、いずれかが選択可能であることを表す

## 順序
```text
@startebnf
hoge = "a", "b", "c";
@endebnf
```

```plantuml
@startebnf
hoge = "a", "b", "c";
@endebnf
```

- カンマ (`,`) で区切ることで、その順序で並ぶ必要があることを表すことができる

## グループ化
```text
@startebnf
hoge = ("a" | "b"), "c";
@endebnf
```

```plantuml
@startebnf
hoge = ("a" | "b"), "c";
@endebnf
```

- 丸括弧 (`()`) で囲うことでグループ化できる

## 任意
```text
@startebnf
hoge = ["a"];
@endebnf
```

```plantuml
@startebnf
hoge = ["a"];
@endebnf
```

- 角括弧 (`[]`) で囲うことで、任意を表現できる

## 0回以上
```text
@startebnf
hoge = {"a"};
@endebnf
```

```plantuml
@startebnf
hoge = {"a"};
@endebnf
```

- 波括弧 (`{}`) で囲うことで、0回以上を表現できる

## 1回以上
```text
@startebnf
hoge = {"a"}-;
@endebnf
```

```plantuml
@startebnf
hoge = {"a"}-;
@endebnf
```

- 波括弧 (`{}`) で囲った後ろにハイフン (`-`)  をつけることで、1回以上を表現できる

## n回
```text
@startebnf
hoge = 3 * "a";
@endebnf
```

```plantuml
@startebnf
hoge = 3 * "a";
@endebnf
```

- `n *` を前につけることで、繰り返し回数を指定できる

## 特殊シーケンス
```text
@startebnf
hoge = ? 0-9 ?;
@endebnf
```

```plantuml
@startebnf
hoge = ? 0-9 ?;
@endebnf
```

- はてな (`?`) で囲うことで、特殊シーケンス(special sequence)を表現できる
- これは EBNF で表現しきれない特殊なケースを任意の表現で説明するときに利用する

## ノート

```text
@startebnf

(* ノート
改行 *)

hoge = "a" (*aaa*), [b (*bbb*)], {c}(*ccc*);

(*note*)
@endebnf
```

```plantuml
@startebnf

(* ノート
改行 *)

hoge = "a" (*aaa*), [b (*bbb*)], {c}(*ccc*);

(*note*)
@endebnf
```

- `(*`, `*)` で囲うことでノートを記載できる
- 改行はそのまま反映される
- 各要素の直後に挿入することで、要素ごとにノートをつけることができる

## 応用
### カンマ区切り

```text
@startebnf
hoge = "a", {",", "a"};
@endebnf
```

```plantuml
@startebnf
hoge = "a", {",", "a"};
@endebnf
```

# ◆JSONデータ
```text
@startjson
{
    "string": "FOO",
    "number": 10,
    "boolean": true,
    "null": null,
    "list": [1, 2, 3],
    "object": {
        "foo": "bar"
    },
    "empty-list": [],
    "empty-object": {}
}
@endjson
```

```plantuml
@startjson
{
    "string": "FOO",
    "number": 10,
    "boolean": true,
    "null": null,
    "list": [1, 2, 3],
    "object": {
        "foo": "bar"
    },
    "empty-list": [],
    "empty-object": {}
}
@endjson
```

- JSON を表形式で表示させることができる

## 特定のプロパティをハイライトさせる
```text
@startjson
#highlight "hoge"
#highlight "fuga"/"fuga"
#highlight "piyo"/"2"
{
    "hoge": "HOGE",
    "fuga": {
        "hoge": "HOGE",
        "fuga": "FUGA"
    },
    "piyo": ["HOGE", "FUGA", "PIYO"]
}
@endjson
```

```plantuml
@startjson
#highlight "hoge"
#highlight "fuga"/"fuga"
#highlight "piyo"/"2"
{
    "hoge": "HOGE",
    "fuga": {
        "hoge": "HOGE",
        "fuga": "FUGA"
    },
    "piyo": ["HOGE", "FUGA", "PIYO"]
}
@endjson
```

- `#highlight プロパティ` と記述することで、指定されたプロパティをハイライトできる
- プロパティは、キーをダブルクォーテーションで囲って記述する
- ネストされた要素のプロパティを指定する場合は、スラッシュ (`/`) で区切ってプロパティのキーをつなげる
- 配列の場合はインデックスをダブルクォーテーションで囲って記述する

## ハイライトのスタイルを変更する
```text
@startjson
<style>
highlight {
    BackGroundColor lightblue
}
</style>

#highlight "hoge"
#highlight "fuga"/"fuga"
#highlight "piyo"/"2"
{
    "hoge": "HOGE",
    "fuga": {
        "hoge": "HOGE",
        "fuga": "FUGA"
    },
    "piyo": ["HOGE", "FUGA", "PIYO"]
}
@endjson
```

```plantuml
@startjson
<style>
highlight {
    BackGroundColor lightblue
}
</style>

#highlight "hoge"
#highlight "fuga"/"fuga"
#highlight "piyo"/"2"
{
    "hoge": "HOGE",
    "fuga": {
        "hoge": "HOGE",
        "fuga": "FUGA"
    },
    "piyo": ["HOGE", "FUGA", "PIYO"]
}
@endjson
```

- `<style>` タグ？を追加して、そこに CSS みたいな感じでスタイルを定義する
- `highlight` というタグ？に対してスタイルを定義することで、デフォルトのハイライトのスタイルを変更できる
- プロパティは PlantUML 独自？のものを指定する
- プロパティに使えそうなものは以下

|プロパティ|説明|
|---|---|
|`BackGroundColor`|背景色|
|`FontName`|フォント名|
|`FontColor`|フォント色|
|`FontSize`|フォントサイズ|

### 特定のプロパティだけハイライトを変更する
```text
@startjson
<style>
.my-class {
    BackGroundColor pink
}
</style>

#highlight "hoge" <<my-class>>
#highlight "fuga"

{
    "hoge": "HOGE",
    "fuga": "FUGA",
    "piyo": "PIYO"
}
@endjson
```

```plantuml
@startjson
<style>
.my-class {
    BackGroundColor pink    
}
</style>

#highlight "hoge" <<my-class>>
#highlight "fuga"

{
    "hoge": "HOGE",
    "fuga": "FUGA",
    "piyo": "PIYO"
}
@endjson
```

- `<style>` で、任意のクラスでスタイルを定義する
    - クラス名の先頭に `.` が必要なので注意
- `#highlight` の最後に割り当てたいクラスを `<<クラス名>>` という形で指定する

# ◆YAMLデータ
```text
@startyaml
string: "STRING"
number: 12
list:
    - hoge
    - fuga
    -
        foo: FOO
        bar: BAR
nested:
    hoge: HOGE
    fuga: FUGA    
@endyaml
```

```plantuml
@startyaml
string: "STRING"
number: 12
list:
    - hoge
    - fuga
    -
        foo: FOO
        bar: BAR
nested:
    hoge: HOGE
    fuga: FUGA    
@endyaml
```

- YAML データを表形式で表示できる

## 特定のプロパティをハイライトさせる
```text
@startyaml
#highlight "hoge"
#highlight "fuga"/"hoge"
#highlight "piyo"/"2"

hoge: HOGE
fuga:
    hoge: HOGE
    fuga: FUGA
piyo:
    - HOGE
    - FUGA
    - PIYO
@endyaml
```

```plantuml
@startyaml
#highlight "hoge"
#highlight "fuga"/"hoge"
#highlight "piyo"/"2"

hoge: HOGE
fuga:
    hoge: HOGE
    fuga: FUGA
piyo:
    - HOGE
    - FUGA
    - PIYO
@endyaml
```

- ハイライトのさせかたは [JSON の場合](#特定のプロパティをハイライトさせる) と同じ
- デフォルトの変更とかも JSON と同じなのでそっち参照

# ◆正規表現ダイアグラム
```text
@startregex
^https?://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$
@endregex
```

```plantuml
@startregex
^https?://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$
@endregex
```

- 正規表現を入力するとダイアグラムにして表示してくれる

# ◆ER図
```plantuml
Entity01 }|..|| Entity02
Entity03 }o..o| Entity04
Entity05 ||--o{ Entity06
Entity07 |o--|| Entity08
```

- ER図を作成できる

## エンティティの定義
```text
entity HOGE {}
```

```plantuml
entity HOGE {}
```

- `entity <名前> {}` でエンティティを定義できる
    - 空でも `{}` がないとシーケンス図と勘違いされるので注意

### 属性の定義
```text
entity HOGE {
    * ID: NUMBER
    ---
    * name: VARCHAR
    memo: VARCHAR
}
```

```plantuml
entity HOGE {
    * ID: NUMBER
    ---
    * name: VARCHAR
    memo: VARCHAR
}
```

- `{}` の中にエンティティの属性を定義できる
- 先頭に `*` をつけると必須属性であることを表すことができる
- 属性の書式は割とフリーで、書いたものがそのまま表示される
- `---` で区切ることで、主キーとそれ以外を分けて表現できる

## リレーション
```text
Entity01 ||--|| Entity02
Entity03 |o--o| Entity04
Entity05 }|--|{ Entity06
Entity07 }o--o{ Entity08
```

```plantuml
Entity01 ||--|| Entity02
Entity03 |o--o| Entity04
Entity05 }|--|{ Entity06
Entity07 }o--o{ Entity08
```

- `|o` など専用の記法を使ってエンティティ同士をつなげることでリレーションを定義できる

|左端|右端|意味|
|---|---|---|
|`\|o`|`o\|`|0または1|
|`\|\|`|`\|\|`|1のみ|
|`}o`|`o{`|0以上|
|`}\|`|`\|{`|1以上|

### 非依存リレーション
```text
Hoge ||..o{ Fuga
```

```plantuml
Hoge ||..o{ Fuga
```

- `..` でつなげることと破線になり、非依存リレーションを表現できる

### ラベルを付ける
```text
Hoge ||--|| Fuga: ラベル
```

```plantuml
Hoge ||--|| Fuga: ラベル
```

- リレーションの定義の後ろに `: ラベル` と続けることでラベルを付けることができる


# ◆ガント・ダイアグラム

```plantuml
@startgantt
[Prototype design] requires 15 days
[Test prototype] requires 10 days
-- All example --
[Task 1 (1 day)] requires 1 day
[T2 (5 days)] requires 5 days
[T3 (1 week)] requires 1 week
[T4 (1 week and 4 days)] requires 1 week and 4 days
[T5 (2 weeks)] requires 2 weeks
@endgantt
```

- ガント・ダイアグラム（ガントチャート）を作成できる 

## タスクを定義する
```text
@startgantt
[task1] requires 3 day
[task2] requires 4 day
[task3] requires 1 day
@endgantt
```

```plantuml
@startgantt
[task1] requires 3 day
[task2] requires 4 day
[task3] requires 1 day
@endgantt
```

- `[タスク名] requires <日数> day` でタスクを期間とともに定義できる

### タスクに別名をつける
```text
@startgantt
[task1] as [t1] requires 2 day
@endgantt
```

```plantuml
@startgantt
[task1] as [t1] requires 2 day
@endgantt
```

- タスク名の後に `as [別名]` とすることで、タスクに別名をつけることができる

### プロジェクトの開始日付を設定する
```text
@startgantt
Project starts 2024-01-01
[task1] requires 10 days
@endgantt
```

```plantuml
@startgantt
Project starts 2024-01-01
[task1] requires 10 days
@endgantt
```

- `Project starts <開始日>` と指定することで、プロジェクト全体の開始日を設定できる

### タスクの開始を定義する
```text
@startgantt
[task1] requires 3 day
[task2] requires 4 day
[task3] requires 2 day

Project starts 2024-01-01
[task1] starts D+0
[task2] starts D+2
[task3] starts 2024-01-04
@endgantt
```

```plantuml
@startgantt
[task1] requires 3 day
[task2] requires 4 day
[task3] requires 2 day

Project starts 2024-01-01
[task1] starts D+0
[task2] starts D+2
[task3] starts 2024-01-04
@endgantt
```

- `[タスク名] starts <開始>` で、タスクの開始を定義する
    - `D+N` で、プロジェクトの開始からの相対的な日付で指定できる
    - プロジェクトの開始日を設定している場合は、開始を具体的な日付で指定できる

### タスクの終了を定義する
```text
@startgantt
[task1] requires 3 day
[task2] requires 4 day
[task3] requires 2 day

Project starts 2024-01-01
[task1] ends D+10
[task2] ends D+5
[task3] ends 2024-01-08
@endgantt
```

```plantuml
@startgantt
[task1] requires 3 day
[task2] requires 4 day
[task3] requires 2 day

Project starts 2024-01-01
[task1] ends D+10
[task2] ends D+5
[task3] ends 2024-01-08
@endgantt
```

- `[タスク名] ends <終了>` で、タスクの終了を定義する
    - `D+N` で、プロジェクトの開始日からの相対的な日付を指定できる
    - プロジェクトの開始日を設定している場合は、終了を具体的な日付で指定できる

### 開始・終了を指定して定義する
```text
@startgantt
Project starts 2024-01-01
[task1] starts D+0
[task1] ends D+4
[task2] starts 2024-01-02
[task2] ends 2024-01-04
@endgantt
```

```plantuml
@startgantt
Project starts 2024-01-01
[task1] starts D+0
[task1] ends D+4
[task2] starts 2024-01-02
[task2] ends 2024-01-04
@endgantt
```

- `requires` を使わずに、 `starts` と `ends` だけで定義することもできる

### 1行でまとめて定義する
```text
@startgantt
Project starts 2024-01-01
[task1] starts D+0 and ends D+5
[task2] starts 2024-01-02 and ends 2024-01-04
[task3] starts 2024-01-03 and requires 3 days
@endgantt
```

```plantuml
@startgantt
Project starts 2024-01-01
[task1] starts D+0 and ends D+5
[task2] starts 2024-01-02 and ends 2024-01-04
[task3] starts 2024-01-03 and requires 3 days
@endgantt
```

- `and` でつなげることで、複数の定義を１行にまとめることができる

### タスク間の制約(前後関係)を設定する
```text
@startgantt
[task1] requires 3 days
[task2] starts at [task1]'s end and requires 2 days

[task3] starts D+2 and requires 4 days
[task4] starts at [task3]'s start and requires 2 days
@endgantt
```

```plantuml
@startgantt
[task1] requires 3 days
[task2] starts at [task1]'s end and requires 2 days

[task3] starts D+2 and requires 4 days
[task4] starts at [task3]'s start and requires 2 days
@endgantt
```

- `[タスクA] starts at [タスクB]'s end` と指定することで、タスクAの開始をタスクBの終了後にできる
- `[タスクA] starts at [タスクB]'s start` と指定することで、タスクAの開始をタスクBの開始と同時にできる

### タスクの前後関係を簡易的に記述する
```text
@startgantt
[task1] requires 3 days
then [task2] requires 4 days

[task3] requires 2 days
[task4] requires 3 days
[task3] -> [task4]
@endgantt
```

```plantuml
@startgantt
[task1] requires 3 days
then [task2] requires 4 days

[task3] requires 2 days
[task4] requires 3 days
[task3] -> [task4]
@endgantt
```

- `then` でつなげることによりタスク間の前後関係を簡易的に表現できる
- もしくは `->` でつなげることでも表現できる

## 言語を変更する
```text
@startgantt
language ja
Project starts 2024-01-01
[task1] starts D+0 and requires 10 days
@endgantt
```

```plantuml
@startgantt
language ja
Project starts 2024-01-01
[task1] starts D+0 and requires 10 days
@endgantt
```

- `language <言語>` で言語を変更できる
- 日本語にする場合は `ja` を指定する

## タスクに進捗率を設定する
```text
@startgantt
[task1] requires 10 days
[task1] is 40% completed

[task2] requires 10 days and is 70% completed
@endgantt
```

```plantuml
@startgantt
[task1] requires 10 days
[task1] is 40% completed

[task2] requires 10 days and is 70% completed
@endgantt
```

- `[タスク名] is <進捗率>% completed` と記述することで、タスクの進捗率を設定できる
- `and` でつなげることにより１行にまとめることもできる

## マイルストーンの定義
```text
@startgantt
Project starts 2024-01-01
[task1] starts 2024-01-03 and requires 6 days
[task2] starts 2024-01-10 and requires 3 days

[milestone1] happens at D+3
[milestone2] happens at 2024-01-05
[milestone3] happens at [task1]'s end
[milestone4] happens at [task2]'s start
[milestone5] happens on 3 days after [task2]'s end
[milestone6] happens on 1 weeks after [task2]'s end
[milestone7] happens on 3 days before [task2]'s start
[milestone8] happens on 1 weeks before [task2]'s start
@endgantt
```

```plantuml
@startgantt
Project starts 2024-01-01
[task1] starts 2024-01-03 and requires 6 days
[task2] starts 2024-01-10 and requires 3 days

[milestone1] happens at D+3
[milestone2] happens at 2024-01-05
[milestone3] happens at [task1]'s end
[milestone4] happens at [task2]'s start
[milestone5] happens on 3 days after [task2]'s end
[milestone6] happens on 1 weeks after [task2]'s end
[milestone7] happens on 3 days before [task2]'s start
[milestone8] happens on 1 weeks before [task2]'s start
@endgantt
```

- `[マイルストーン名] happens at <日付>` でマイルストーンを定義できる
- 日付には相対的な日付や絶対的な日付、他のタスクの開始・終了を指定できる
- `on N <days|weeks> <before after> [タスク名]'s <start|end>` とすることで、基準のタスクの開始・終了を基準にして一定時間前後したところにマイルストーンを設定できる

### 複数のタスクの終了を日付として指定した場合
```text
@startgantt
[task1] requires 3 days and starts D+1
[task2] requires 4 days and starts D+2
[task3] requires 2 days

[milestone1] happens at [task1]'s end
[milestone1] happens at [task2]'s end
[milestone1] happens at [task3]'s end
@endgantt
```

```plantuml
@startgantt
[task1] requires 3 days and starts D+1
[task2] requires 4 days and starts D+2
[task3] requires 2 days

[milestone1] happens at [task1]'s end
[milestone1] happens at [task2]'s end
[milestone1] happens at [task3]'s end
@endgantt
```

- マイルストーンの日付として複数のタスクの終了を指定すると、終了日が最も後ろの日付が採用される

## 日付に背景色を設定する
```text
@startgantt
Project starts 2024-01-01
language ja

saturday is colored in lightblue
sunday is colored in pink
2024-01-01 to 2024-01-03 is colored in pink
2024-01-08 is colored in pink

[task1] requires 20 days
[milestone] happens at D+30
@endgantt
```

```plantuml
@startgantt
Project starts 2024-01-01
language ja

saturday is colored in lightblue
sunday is colored in pink
2024-01-01 to 2024-01-03 is colored in pink
2024-01-08 is colored in pink

[task1] requires 20 days
[milestone] happens at D+30
@endgantt
```

- `<日付> is colored in <色>` と記述することで、特定の日付の背景色を変更できる
- 日付には絶対的な日付以外に、 `sunday` のような曜日も指定できる
- 日付を `to` でつなげることで、期間で指定できる

## 非稼働日を設定する
```text
@startgantt
Project starts 2024-01-01
language ja

saturday are closed
sunday are closed
2024-01-01 to 2024-01-03 are closed
2024-01-08 is closed

[task1] requires 10 days
@endgantt
```

```plantuml
@startgantt
Project starts 2024-01-01
language ja

saturday are closed
sunday are closed
2024-01-01 to 2024-01-03 are closed
2024-01-08 is closed

[task1] requires 10 days
@endgantt
```

- `<日付> <is|are> closed` と記述することで、特定の日付を非稼働日にできる
    - 非稼働日はタスクの期間から除外される
- 日付には絶対的な日付以外に、 `sunday` のような曜日も指定できる
- 日付を `to` でつなげることで、期間で指定できる
- 曜日を指定した場合、動詞は `are` になる
- 絶対的な日付で指定した場合は、 `are` でも `is` でもどちらでもいい（文法的にしっくり来るほうを選べばいいと思う）

## タスクの一時停止
```text
@startgantt
Project starts 2024-01-01
language ja
[task1] requires 10 days
[task1] pauses on 2024-01-05
[task1] pauses on 2024-01-07
[task1] pauses on wednesday

[task2] requires 10 days
@endgantt
```

```plantuml
@startgantt
Project starts 2024-01-01
language ja
[task1] requires 10 days
[task1] pauses on 2024-01-05
[task1] pauses on 2024-01-07
[task1] pauses on wednesday

[task2] requires 10 days
@endgantt
```

- `[タスク名] pauses on <対象日>` と指定することで、指定された日をそのタスクの稼働から除外できる

## カレンダーのスケールを変更する
```text
@startgantt
printscale weekly
Project starts 2024-01-01

[task1] requires 30 days
then [task2] requires 30 days
@endgantt
```

```plantuml
@startgantt
printscale weekly
Project starts 2024-01-01

[task1] requires 30 days
then [task2] requires 30 days
@endgantt
```

- `printscale <スケール>` と指定することで、カレンダーのスケール（１列の単位）を変更できる

|スケール|意味|
|---|---|
|`daily`|日(デフォルト)|
|`weekly`|週|
|`monthly`|月|
|`quarterly`|四半期|
|`yearly`|年|

## ズーム

**ズームなし**

```text
@startgantt
printscale weekly
Project starts 2024-01-01
[task1] requires 30 days
then [task2] requires 15 days
@endgantt
```

```plantuml
@startgantt
printscale weekly
Project starts 2024-01-01
[task1] requires 30 days
then [task2] requires 15 days
@endgantt
```

**ズームあり**

```text
@startgantt
printscale weekly zoom 2
Project starts 2024-01-01
[task1] requires 30 days
then [task2] requires 15 days
@endgantt
```

```plantuml
@startgantt
printscale weekly zoom 2
Project starts 2024-01-01
[task1] requires 30 days
then [task2] requires 15 days
@endgantt
```

- `printscale` の後ろに `zoom N` と指定することで、グラフを拡大できる

## 横線
```text
@startgantt
[task1] requires 10 days
then [task2] requires 5 days

-- 横線 --

then [task3] requires 3 days
then [task4] requires 6 days
@endgantt
```

```plantuml
@startgantt
[task1] requires 10 days
then [task2] requires 5 days

-- 横線 --

then [task3] requires 3 days
then [task4] requires 6 days
@endgantt
```

- `-- テキスト --` を記述することで、横線を挿入できる

## 縦線
```text
@startgantt
[task1] requires 3 days and starts D+3
[milestone] happens at D+10

Separator just at [task1]'s start
Separator just at [task1]'s end
Separator just 2 days before [task1]'s start
Separator just 2 days after [task1]'s end
@endgantt
```

```plantuml
@startgantt
[task1] requires 3 days and starts D+3
[milestone] happens at D+10

Separator just at [task1]'s start
Separator just at [task1]'s end
Separator just 2 days before [task1]'s start
Separator just 2 days after [task1]'s end
@endgantt
```

- `Separator just at [タスク名]'s <start|end>` で、タスクの開始・終了日の縦線を入れられる
- `Separator just N <days|weeks> <before|after> [タスク名]'s <start|end>` で、タスクの開始・終了日から指定された前後に縦線を入れられる

## 注釈
```text
@startgantt
[task1] requires 15 days
note bottom
    Task1
end note

[task2] requires 10 days and starts after [task1]'s end
note bottom
    Task2
end note
@endgantt
```

```plantuml
@startgantt
[task1] requires 15 days
note bottom
    Task1
end note

[task2] requires 10 days and starts after [task1]'s end
note bottom
    Task2
end note
@endgantt
```

- タスク定義の直後に `note bottom ... end note` と記述することで、そのタスクの下に注釈を追加できる
- `bottom` 以外は指定できないっぽい

## タスクの色を変更する
```text
@startgantt
[task1] requires 10 days
[task1] is colored in pink
[task2] requires 10 days and is colored in lightgreen
@endgantt
```

```plantuml
@startgantt
[task1] requires 10 days
[task1] is colored in pink
[task2] requires 10 days and is colored in lightgreen
@endgantt
```

- `is colored in <色>` で、タスクの色を変更できる


# ◆マインドマップ
```plantuml
@startmindmap
* Debian
** Ubuntu
*** Linux Mint
*** Kubuntu
*** Lubuntu
*** KDE Neon
** LMDE
** SolydXK
** SteamOS
** Raspbian with a very long name
*** 
Raspmbc
 => OSMC
*** 
Raspyfi
 => Volumio
@endmindmap
```

- マインドマップを書ける

## 基本
```text
@startmindmap
+ root
++ hoge
+++ foo
+++ bar
++ fuga
-- piyo
--- fizz
--- buzz
@endmindmap
```

```plantuml
@startmindmap
+ root
++ hoge
+++ foo
+++ bar
++ fuga
-- piyo
--- fizz
--- buzz
@endmindmap
```

- `+` または `-` でノードを定義する
- `+`, `-` の数でノードの深さを制御できる
- `+` は右方向に、 `-` は左方向にノードが伸びる

## Markdown で記述する
```text
@startmindmap
* root
    * hoge
        * foo
        * bar
    * fuga
@endmindmap
```

```plantuml
@startmindmap
* root
    * hoge
        * foo
        * bar
    * fuga
@endmindmap
```

- Markdown のリストの書き方でも記述できる
- この場合は右方向にしか伸ばせない
- `*` しか使えない(`-` はダメ)

## 複数行
```text
@startmindmap
+ root
**:multi
line;
++ foo

left side

-- fizz
**:multi
line;
@endmindmap
```

```plantuml
@startmindmap
+ root
**:multi
line;
++ foo

left side

-- fizz
***:multi
line;
-- buzz
@endmindmap
```

- `:` と `;` で囲うことにより、ノードのテキストを複数行で記述できる
- このとき、ノードの高さを表す記号にはアスタリスク (`*`) を使用する
- 左側に複数行のノードを追加したい場合は、 `left side` という１行を挿入する（ここから下が左側のノードとして扱われる）
- Markdown 記法だと使えない

## 複数ルート
```text
@startmindmap
+ root1
++ hoge
++ fuga
+ root2
++ foo
++ bar
@endmindmap
```

```plantuml
@startmindmap
+ root1
++ hoge
++ fuga
+ root2
++ foo
++ bar
@endmindmap
```

- 複数のルートノードを宣言できる

## ノードの色を変更する
```text
@startmindmap
+[#orange] root
++[#FFBBCC] hoge
@endmindmap
```

```plantuml
@startmindmap
+[#orange] root
++[#FFBBCC] hoge
@endmindmap
```

- 記号のうしろに `[#色]` と指定することで、そのノードの色を変更できる

```text
@startmindmap
*[#orange] root
    *[#FFBBCC] hoge
@endmindmap
```

```plantuml
@startmindmap
*[#orange] root
    *[#FFBBCC] hoge
@endmindmap
```

- Markdown でも同様に指定できる

## スタイルの指定
```text
@startmindmap
<style>
mindmapDiagram {
    .orange {
        BackgroundColor orange
    }
    .pink {
        BackgroundColor #FFBBCC
    }
}
</style>
+ root <<orange>>
++ hoge <<pink>>
**:multi
line <<pink>>;
@endmindmap
```

```plantuml
@startmindmap
<style>
mindmapDiagram {
    .orange {
        BackgroundColor orange
    }
    .pink {
        BackgroundColor #FFBBCC
    }
}
</style>
+ root <<orange>>
++ hoge <<pink>>
**:multi
line <<pink>>;
@endmindmap
```

- `<style>` でスタイルを定義できる
- 各ノードの末尾に `<<クラス名>>` と指定することで、スタイルのクラスを指定できる

## 箱を消す
```text
@startmindmap
+ root
++ hoge
+++_ foo
+++_ bar
--_ fizz
--_ buzz
@endmindmap
```

```plantuml
@startmindmap
+ root
++ hoge
+++_ foo
+++_ bar
--_ fizz
--_ buzz
@endmindmap
```


- ノードの記号の最後に `_` をつけることで、箱を消すことができる

# 参考
- [シンプルなテキストファイルで UML が書ける、オープンソースのツール](https://plantuml.com/ja/)