Open6

Markdown: 組み込みの表よりもっと複雑な表を作りたい

kabeyakabeya

題の通りなんですけども。
Markdownに組み込まれている標準的な表は、複雑なことができません。

  • セルの結合(行結合・列結合)ができない
  • 背景色や枠線の装飾ができない
  • セル内に複雑なレイアウトや図形的な表現ができない

ヘッダ行を2段組にしたりもできませんし、セルを適切な場所で改行させることもできない(自分でセル内テキストにBRタグを埋め込むことはできますが、異常に保守性・可読性が落ちますし)。

Mermaidのような、テキストベースのツールがなんかないのかと探しましたが、見つかりませんでした。

ChatGPTに聞いたところ以下を提案されました。

方法 セル結合 色・装飾 描画の自由度 Markdown互換性
Markdown表 × ×
HTML埋め込み ◯(一部制限あり)
Mermaid × 高(図として)
画像/SVG
拡張Markdown △(環境依存)

で、VS CodeのプレビューができればOKって限定したらどうなの?って聞いたところ、Markdown Preview Enhancedというプラグインを入れると、MermaidのほかLaTeXの表も入れられますよ、ということだったんですね。

「あれ、Zennは確か数式入れられるよね?TeX系の」ということで、表を試してみました(KaTeXというそうです)。

\begin{array}{|c|r|r|} \hline 項目 & 値1 & 値2 \\ 段組 & (X) & (Y) \\ \hline \hline A & 10 & 20 \\ B & 30 & 40 \\ 長い長い文字列が頭についたC &50 & 1260 \\ \hline \end{array}

改行をどうやったら入れられるのかはまだ分かっていませんが、ヘッダ2段組とかできるということは分かりました。
{tabular}には対応していないので{array}を使うようです。

$$$$で以下を囲みます。

\begin{array}{|c|r|r|}
\hline 
項目 & 値1 & 値2 \\
段組 & (X) & (Y) \\
\hline \hline
A & 10 & 20 \\
B & 30 & 40 \\
長い長い文字列が頭についたC &50 & 1260 \\
\hline
\end{array}
kabeyakabeya

{\multicolumn} {multiline}はNot supportedなんですね。残念。
(multirowもないようです)

kabeyakabeya

VS Code+Markdown Preview Enhancedの場合、設定で、Markdown-preview-enhanced: Enable Extended Table Syntaxをオンにすると、セルのマージなどができるようになるようです。

https://b1san-blog.com/post/vscode/vscode-md-jointable/

改行は依然brタグ頼みなんですかね。
元々、句読点かスペースかを入れるとそこにあわせて適当に改行してくれるので(狙っては改行できません)、もうそれでいくしかないのかなという気はします。

kabeyakabeya

HTML表も埋め込めるよ、とChatGPTは言うんですけども。

マイクロソフトのMarkdownリファレンスには、以下のようなことが書いてあります。

HTML テーブルは Microsoft Learn には推奨されません。 それらはソースで人間が判読できるようになっていません。このことは Markdown の重要な原則の 1 つです。

https://learn.microsoft.com/ja-jp/contribute/content/markdown-reference

kabeyakabeya

https://note.com/yuru_sha/n/nca33e4d9a2ac

にKaTeXでの複数行のやり方が載っていました。

\begin{array}{|c|r|r|} \hline 項目 & 値1 & 値2 \\ 段組 & (X) & (Y) \\ \hline \hline A & 10 & 20 \\ \hline B & 30 & 40 \\ \hline 長い長い文字列が\\頭についたC &50 & 1260 \\ \hline \begin{matrix} ということは \\ 3行で \\ 表示したりも \\ できる!? \\ \end{matrix} & 80 & 990 \\ \hline ↑4行じゃん! & 70 & 1\\ \hline \end{array}

$$$$で以下を囲みます。

\begin{array}{|c|r|r|}
\hline
項目 & 値1 & 値2 \\
段組 & (X) & (Y) \\
\hline \hline
A & 10 & 20 \\
\hline
B & 30 & 40 \\
\hline
長い長い文字列が\\頭についたC &50 & 1260 \\
\hline
\begin{matrix}
ということは \\
3行で \\
表示したりも \\
できる!? \\
\end{matrix} & 80 & 990 \\
\hline
↑4行じゃん! & 70 & 1\\
\hline
\end{array}

マイクロソフトの指摘じゃないですが、ちょっと可読性が問題ですかね。
でもやりたいことはおよそできそうです。

kabeyakabeya

でもやりたいことはおよそできそうです。

ウソでした。横方向の結合ができないのでした。
縦も、本来の意味の結合はできないので、セルごとに結合する行が違う場合などには対応できません。
あくまでセル内の改行だけですね。