【Markdown】++で括った場合の動作について


更新

 Markdownには多くの方言がありますが、CommonMarkと、それを拡張したGitHub Flavored Markdown(GFM)が事実上の標準と言えます。

 Visual Studio 2022は、標準機能でMarkdownのプレビュー表示が可能です。基本的にはGFMに準拠して動作しているようですが、異なる点を見つけました。


世の中には2種類の言語しかない。C++か、C++以外か。

Visual Studio 2022

 半角の「++」で括られた箇所にて、「++」が消えて、下線が引かれています。HTMLで言うと、<ins>タグに変換されています。Visual Studio CodeやGitHubでは、どうでしょうか。

Visual Studio Code
GitHub

 このように問題無いです。実際、CommonMarkGFMの公式仕様を見ても、最新のVersion 0.30(GFMは0.29)では「++」は定義されていません。

 Markdownのパーサーとして、PythonではPython-Markdown、JavaScriptではmarkdown-itがあります。それぞれ、前者はmarkdown_del_ins、後者はmarkdown-it-insという、「++」を<ins>タグに変換する機能拡張が存在します。つまり、世の中には、そういう需要があるということです。

 いずれは、CommonMarkの仕様にも採用されるのでしょうか。それをGFMも取り入れたら、README.mdの表示に混乱が起きる気がします。

 ところで、Visual Studio 2022でもエスケープシーケンスを使用すると、「++」を正しく表示できます。具体的には、「+」の前に半角の「\」を置きます。要は、「++で括る」を破壊できればよいので、全部でも1か所でもOKです。


世の中には2種類の言語しかない。C\+\+か、C\+\+以外か。

世の中には2種類の言語しかない。C\++か、C++以外か。

Visual Studio 2022

 この方法は、Visual Studio CodeやGitHubでも従来通り問題無く表示します。

Visual Studio Code
GitHub

 他にも、Visual Studio 2022で「++」を表示する方法を発見しました。それは、前の「++」の直後、または後ろの「++」の直前に特定の半角文字を置くことです。US-ASCIIの0x20~0x7Eで確認したところ、「+、-、0~9、A~Z、a~z」以外の文字なら、「++」が消えません。ただし、エスケープシーケンスではないので、その文字自体も表示されます。空白以外は実用的ではないですね。

Visual Studio 2022

 markdown_del_insやmarkdown-it-insでは、どのような動作になるでしょうか。興味のある方は、ぜひ調べてみてください。

基本的なMarkdown


# 見出し
## 見出し
### 見出し
#### 見出し
##### 見出し
###### 見出し

* リスト
+ リスト
- リスト
  - 入れ子
    - 入れ子
1. リスト
1. リスト
   - 入れ子
     - 入れ子
1. リスト
   1. 入れ子
   1. 入れ子
   1. 入れ子
      1. 入れ子
      1. 入れ子
      1. 入れ子

***
---
___

*斜体italic*  
_斜体italic_  
**太字bold**  
__太字bold__  
***太字かつ斜体bold and italic***  
___太字かつ斜体bold and italic___  
++下線++  
~~取り消し~~

> 引用

```
コード
```

[リンク](https://hirokio.jp)

![画像](test.png)

|1列目|2列目|3列目|
|-----|-----|-----|
|セル |セル |セル |
|セル |セル |セル |
|セル |セル |セル |

|左寄せ|中央寄せ|右寄せ|
|:-----|:------:|-----:|
|セル  |セル    |セル  |
|セル  |セル    |セル  |
|セル  |セル    |セル  |

Visual Studio 2022