CommonMark や GFM でも説明リストを使いたい

# CommonMark や GFM でも説明リストを使いたい

説明リスト (description list) とは、用語と用語の説明をリスト化したものである。

CommonMark や GFM (GitHub Flavored Markdown) では説明リストを Markdown 記法で表現することが出来ない。HTML で表現することは出来るものの少々面倒くさい。これを Markdown のみで疑似的に表現する方法を考えたい。

## ■ 説明リストと定義リスト

説明リストは次のようなものを指す。（LaTeX から生成）

![description list for LaTeX](https://i.gyazo.com/7b768f5d7ea65e06c41e2e8f41991cb3.png)

基本的に、説明リスト (description list) と定義リスト (definition list) は混同され同じものを指していることが多い。

しかしながら、HTML では `<dl>`・`<dt>`・`<dd>` を利用するリストを**説明リスト**と称しており、定義リストではない。一方で、定義リストとして表現するには、`<dfn>` を利用する必要がある。（HTML4 以前では `<dl>` を **d**efinition **l**ist 要素と称されていたが、HTML5 (2014) 以降では **d**escription **l**ist 要素と称されている）

Markdown 系では、**定義リスト (definition list)** と称されている。

## ■ HTML における説明リスト

HTML では、[説明リスト (description list) 要素][dl] `<dl>`、[説明用語 (description term) 要素][dt] `<dt>`、[説明詳細 (description details) 要素][dd] `<dd>` を使うことで説明リストが表現される。

[dl]: https://developer.mozilla.org/ja/docs/Web/HTML/Element/dl
[dt]: https://developer.mozilla.org/ja/docs/Web/HTML/Element/dt
[dd]: https://developer.mozilla.org/ja/docs/Web/HTML/Element/dd

`<dt>` で示された用語を `<dd>` で用語の説明している。` 用語 ` を太字、` 用語の説明 ` をインデントされた行となっている。

```html
<dl>
  <dt>Qiita</dt>
  <dd>エンジニアに関する知識を記録・共有するためのサービス。</dd>
  <dt>Zenn</dt>
  <dd>エンジニアが技術・開発についての知見をシェアする場所。</dd>
</dl>
```

<dl>
  <dt>Qiita</dt>
  <dd>エンジニアに関する知識を記録・共有するためのサービス。</dd>
  <dt>Zenn</dt>
  <dd>エンジニアが技術・開発についての知見をシェアする場所。</dd>
</dl>

これはあくまで ` 用語 ` を説明している。**定義リスト**として表現するには、[定義 (definition) 要素][dfn] `<dfn>` を利用する必要があるようだ。

[dfn]: https://developer.mozilla.org/ja/docs/Web/HTML/Element/dfn

```html
<dl>
  <dt><dfn>Qiita</dfn></dt>
  <dd>エンジニアに関する知識を記録・共有するためのサービス。</dd>
  <dt><dfn>Zenn</dfn></dt>
  <dd>エンジニアが技術・開発についての知見をシェアする場所。</dd>
</dl>
```

<dl>
  <dt><dfn>Qiita</dfn></dt>
  <dd>エンジニアに関する知識を記録・共有するためのサービス。</dd>
  <dt><dfn>Zenn</dfn></dt>
  <dd>エンジニアが技術・開発についての知見をシェアする場所。</dd>
</dl>

ただし、Markdown パーサによっては `<dfn>` タグがサニタイズによって無視されることがある。Qiita では無効化されているようだ。

## ■ Markdown における定義リスト

Markdown では、定義リストは次のような拡張によって提供されることがある。

[markdown-it/markdown-it-deflist: definition list (`<dl>`) tag plugin for markdown-it markdown parser](https://github.com/markdown-it/markdown-it-deflist)

文法は Pandoc における definition list に準拠している。

```markdown
用語
: 用語の説明
```

HTML では以下のように解釈される。[<sup>[demo source]</sup>][markdown-it_html]

[markdown-it_html]: https://markdown-it.github.io/#md3=%7B%22source%22%3A%22%E7%94%A8%E8%AA%9E%5Cn%3A%20%E7%94%A8%E8%AA%9E%E3%81%AE%E8%AA%AC%E6%98%8E%22%2C%22defaults%22%3A%7B%22html%22%3Afalse%2C%22xhtmlOut%22%3Afalse%2C%22breaks%22%3Afalse%2C%22langPrefix%22%3A%22language-%22%2C%22linkify%22%3Atrue%2C%22typographer%22%3Atrue%2C%22_highlight%22%3Atrue%2C%22_strict%22%3Afalse%2C%22_view%22%3A%22src%22%7D%7D

```html
<dl>
<dt>用語</dt>
<dd>用語の説明</dd>
</dl>
```

しかしながら、これは HTML 的には説明リストである。

[markdown-it_dfn]: https://markdown-it.github.io/#md3=%7B%22source%22%3A%22%5Cn%3Cdl%3E%5Cn%20%20%3Cdt%3EQiita%3C%2Fdt%3E%5Cn%20%20%3Cdd%3E%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%AB%E9%96%A2%E3%81%99%E3%82%8B%E7%9F%A5%E8%AD%98%E3%82%92%E8%A8%98%E9%8C%B2%E3%83%BB%E5%85%B1%E6%9C%89%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AE%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%80%82%3C%2Fdd%3E%5Cn%20%20%3Cdt%3EZenn%3C%2Fdt%3E%5Cn%20%20%3Cdd%3E%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%8C%E6%8A%80%E8%A1%93%E3%83%BB%E9%96%8B%E7%99%BA%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6%E3%81%AE%E7%9F%A5%E8%A6%8B%E3%82%92%E3%82%B7%E3%82%A7%E3%82%A2%E3%81%99%E3%82%8B%E5%A0%B4%E6%89%80%E3%80%82%3C%2Fdd%3E%5Cn%3C%2Fdl%3E%5Cn%5Cn%3Cdl%3E%5Cn%20%20%3Cdt%3E%3Cdfn%3EQiita%3C%2Fdfn%3E%3C%2Fdt%3E%5Cn%20%20%3Cdd%3E%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%AB%E9%96%A2%E3%81%99%E3%82%8B%E7%9F%A5%E8%AD%98%E3%82%92%E8%A8%98%E9%8C%B2%E3%83%BB%E5%85%B1%E6%9C%89%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AE%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%80%82%3C%2Fdd%3E%5Cn%20%20%3Cdt%3E%3Cdfn%3EZenn%3C%2Fdfn%3E%3C%2Fdt%3E%5Cn%20%20%3Cdd%3E%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%8C%E6%8A%80%E8%A1%93%E3%83%BB%E9%96%8B%E7%99%BA%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6%E3%81%AE%E7%9F%A5%E8%A6%8B%E3%82%92%E3%82%B7%E3%82%A7%E3%82%A2%E3%81%99%E3%82%8B%E5%A0%B4%E6%89%80%E3%80%82%3C%2Fdd%3E%5Cn%3C%2Fdl%3E%22%2C%22defaults%22%3A%7B%22html%22%3Atrue%2C%22xhtmlOut%22%3Afalse%2C%22breaks%22%3Afalse%2C%22langPrefix%22%3A%22language-%22%2C%22linkify%22%3Atrue%2C%22typographer%22%3Atrue%2C%22_highlight%22%3Atrue%2C%22_strict%22%3Afalse%2C%22_view%22%3A%22html%22%7D%7D

## ■ Markdown で疑似的に表現する

CommonMark に準拠していて markdown-it-deflist などの拡張がない場合、説明リストは HTML で表現するしかない。しかし、HTML で表現するには少し面倒くさい。これを Markdown 記法のみで疑似的に表現したい。

そこで、以下のように番号なしリストを利用する。` 用語 ` を太字にしたリスト項目、` 用語の説明 ` をリストにネストされたパラグラフによって表現する。

```markdown
- **用語 1**:

    用語 1 の説明

- **用語 2**:

    用語 2 の説明
```

- **用語 1**:

    用語 1 の説明

- **用語 2**:

    用語 2 の説明

もしも、用語の説明に字下げを設けたい場合には、半角スペース (`&nbsp;`) や全角スペース (`&#12288;`) を利用しても良いだろう。HTML 参照エンティティを利用しないとインデントとして認識されるため注意が必要になる。

```markdown
- **全角スペースでの字下げ**:

    &#12288; `&#12288;` を行頭に挿入

- **半角スペース 4 個での字下げ**:

    &nbsp;&nbsp;&nbsp;&nbsp; `&nbsp;` 4 個を行頭に挿入
```

- **全角スペースでの字下げ**:

    &#12288; `&#12288;` を行頭に挿入

- **半角スペース 4 個での字下げ**:

    &nbsp;&nbsp;&nbsp;&nbsp; `&nbsp;` 4 個を行頭に挿入

ただし、この字下げはパラグラフ全体の字下げではないため、折り返しが含まれる場合は少し不格好になる。

# さいごに

説明リスト使いたい〜

# 追記

2023/01/26: Markdown での疑似的表現で、`**用語**` の後ろに `:` を置くようにしました。