Markdown 表格:对齐、竖线与单元格换行
Markdown 表格由一行表头、一行用连字符写的分隔行,加上每行一条的数据行组成,单元格之间用竖线隔开,分隔行里的冒号决定对齐方式。单元格里要写竖线就写成 \|,要在单元格里换行就写 <br>。它是 GitHub Flavored Markdown 的扩展,不属于 CommonMark 核心,限制也很明确,一个单元格只能有一行,也不能合并单元格,需要更多时就退回 HTML 的 <table>。
基本写法
| 工具 | 形态 | 价格 |
| :------ | :--: | ---: |
| Pandoc | 命令行 | 免费 |
| 妙言 | 应用 | 免费 |
表头行和分隔行的单元格数量必须一样,否则整块内容会保持为普通文字,这条规则和本文后面的几条都来自 GFM 规范。分隔行里只能有连字符和可选的冒号,冒号在左(:---)是左对齐,两边都有(:---:)是居中,在右(---:)是右对齐,没有冒号就用渲染器的默认方式。
源码里各列不需要对齐,示例里的空格只是方便人读原文。每行开头和结尾的竖线可以省略,不过规范建议保留,既清楚,也能避免解析歧义。数据行比较宽容,单元格比表头少就补上空单元格,多出来的会被忽略。表格在第一个空行处结束,遇到引用这类其他块级结构时也会结束。
单元格里能放什么
单元格里只能放行内 Markdown,强调、链接、图片、行内代码和删除线都可以。列表、标题和围栏代码块不行,规范明确说表格里不能插入块级元素。
竖线。 竖线是列分隔符,要显示一个字面的竖线就必须写成 \|。规范自己的例子说明,行内代码和加粗里也要这样写,`\|` 会渲染成里面是一个普通竖线的代码片段。单元格里直接写 a|b 而不加反斜杠,会多出一列。
换行。 一行表格就是源码里的一行,没法在单元格里按回车,只能用 <br>:
| 步骤 | 说明 |
| ---- | --------------------------- |
| 1 | 打开文件<br>按保存 |
渲染器允许行内 HTML 时才有效,妙言的预览允许。行尾的反斜杠在这里帮不上忙,因为单元格后面没有下一行源码可以续。如果查看器把 HTML 转义了,<br> 会原样显示出来,这时更好的办法是调整数据结构。
行内代码和公式。 行内代码除了竖线规则之外没有别的限制。公式方面,妙言的渲染器在表格解析之前,会把 $...$、$$...$$、\(...\) 和 \[...\] 里的每个字符都先遮蔽起来,所以单元格里的 $n$ 是安全的,按源码来看公式里的 | 同样会被遮蔽。这是这个渲染器自己的行为,换一个工具不要想当然,写绝对值这类符号,用 \vert 在任何 KaTeX 渲染器里都不用担心。分隔符见 Markdown 里写 LaTeX 公式。
表格做不到的事
没有合并单元格,没有跨行,没有多段落单元格,单元格里不能放列表,也不能设置列宽,这套语法描述的只是一个普通网格。需要合并表头或者单元格里放列表时,就用 HTML 写表格:
<table>
<tr><th colspan="2">导出</th></tr>
<tr><td>PDF</td><td>A4 页面</td></tr>
</table>
妙言的预览会放行原始 HTML,所以这样能渲染,但不是每个渲染器都允许原始 HTML,要在笔记最终阅读的地方测一遍。代价是 HTML 表格比竖线表格难改,差异对比也不清楚。
更好的办法常常是改数据。需要列表的单元格,多半更适合做成标题下面的一个列表,需要合并单元格的表格,往往本来就是两张表。
妙言里的宽表格
在屏幕上,妙言给每个表格套了一层可滚动的容器。表格至少和正文一样宽,某个单元格里有缩不下去的内容,比如很长的网址或公式时,表格会超出正文宽度,在自己的框里横向滚动,不会把整个页面撑宽。文字在空格处换行,没有空格的长字符串会保持原宽并让表格出现滚动,而不是被从单词中间截断。
PDF 和图片导出没法滚动,所以导出样式会撤掉这一层。滚动容器不再裁剪,表格被设成页面宽度的固定布局,各列等宽。结果是一列很长、几列很短的表格,在纸上会被压成等宽的几列。导出的表格显得局促时,缩短最长的单元格、删一列,或者把表格拆开。导出的步骤见在 Mac 上把 Markdown 转成 PDF,打印样式还要求表格不要跨页拆开。
从电子表格得到表格
妙言没有 CSV 或 TSV 导入,也不会在粘贴时把制表符分隔的文字变成竖线表格。它转换的是 HTML,粘贴带 <table> 的富文本,比如网页上的表格,会写成竖线表格。没有 <th> 时第一行当表头,单元格里的竖线转义成 \|,单元格内部的换行变成空格。如果来源应用只在剪贴板里放了制表符分隔的纯文本,粘贴出来的是制表符,不是竖线。
对于 CSV 或 TSV 文件,Pandoc 的输入格式里有 csv 和 tsv,输出格式里有 gfm,所以转换大致是 pandoc -f csv -t gfm data.csv,得到的竖线表格可以贴进笔记,只是单元格长了源码会参差不齐。用命令行创建笔记见在终端里使用 Markdown 笔记:miao 命令行。
常见问题
为什么我的 Markdown 表格没有渲染?
多半是分隔行的单元格数和表头行不一致,把两行的数量改成相同即可。
单元格里可以多行吗?
竖线语法不行。换行用 <br>,要写段落和列表就用 HTML 表格。
能合并单元格吗?
不能,用带 colspan 或 rowspan 的 HTML 表格。
单元格里怎么写竖线字符?
写成 \|,在行内代码里也一样。
