Hugo

Hugo 添加 Markdown 表格标题

警告
本文最后更新于 2026-04-01,文中内容可能已过时。

表格是博客中常用的信息展示方式,而表题能够帮助读者理解表格内容并方便文内引用,但 Hugo 默认的 Markdown 表格语法不包含表题功能。

表 1:核心团队成员
姓名角色
张三作者
李四编辑

下面介绍渲染钩子和属性块的配置步骤,以及如何在 Markdown 中为表格添加表题,以实现如上效果。

开启 Hugo 属性块支持

Hugo 默认使用 Goldmark 作为 Markdown 渲染器,它支持为块级元素(如表格)添加自定义属性。1

修改主题配置文件:

TOMLconfig/default/hugo.toml
1
2
[markup.goldmark.parser.attribute]
  block = true

启用此配置后,Goldmark 将解析表格下方的 { caption="..." } 属性块,并渲染为表格标题。

创建表格渲染钩子

创建以下文件:

HTMLlayouts/_markup/render-table.html
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
{{- /* 覆盖来源:FixIt/layouts/_markup/render-table.html */ -}}

{{- /*
  Add a table wrapper to better style overflow tables
  The reset of the template is the same as the default render-table.html
  See https://gohugo.io/render-hooks/tables/
*/ -}}
<div class="table-wrapper">
  <table
    {{- range $k, $v := .Attributes }}
      {{- if $v }}
        {{- printf " %s=%q" $k $v | safeHTMLAttr }}
      {{- end }}
    {{- end }}>

    {{- /* ======================== 修改点 1:开始 ======================== */ -}}
    {{- /* 支持 `caption` 属性,渲染表格表题,样式由 SCSS 控制 */ -}}
    {{- with .Attributes.caption }}
      <caption>{{ . | $.Page.RenderString }}</caption>
    {{- end }}
    {{- /* ======================== 修改点 1:结束 ======================== */ -}}
    
    <thead>
      {{- range .THead }}
          <tr>
          {{- range . }}
            <th
              {{- /* ======================== 修改点 2开始 ======================== */ -}}
              {{- /* 修改对齐方式便于 SCSS 统一样式 */ -}}
              {{- with .Alignment }}
                {{- printf " class=%q" (printf "text-align-%s" .) | safeHTMLAttr }}
              {{- end -}}
              {{- /* ======================== 修改点 2结束 ======================== */ -}}
            >
              {{- .Text -}}
            </th>
          {{- end }}
        </tr>
      {{- end }}
    </thead>
    <tbody>
      {{- range .TBody }}
        <tr>
          {{- range . }}
            <td
              {{- /* ======================== 修改点 3开始 ======================== */ -}}
              {{- /* 修改对齐方式便于 SCSS 统一样式 */ -}}
              {{- with .Alignment }}
                {{- printf " class=%q" (printf "text-align-%s" .) | safeHTMLAttr }}
              {{- end -}}
              {{- /* ======================== 修改点 3结束 ======================== */ -}}
            >
              {{- .Text -}}
            </td>
          {{- end }}
        </tr>
      {{- end }}
    </tbody>
  </table>
</div>
  • 模板保留了 FixIt 主题的 table-wrapper 滚动容器,并新增对 <caption> 标签的支持。
  • 通过 {{- with .Attributes.caption }} 判断是否存在 caption 属性,如果存在则渲染。
  • 其余部分与默认的表格渲染钩子保持一致,确保表格能够正确显示。

添加 CSS 样式

创建以下文件:

SCSSassets/css/_override.scss
1
2
3
4
5
6
7
:root {
  --c-meta: #8b949e;
}

[data-theme="dark"] {
  --c-meta: #7d8792;
}    

创建以下文件:

SCSSassets/css/_override.scss
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
:root {
  // 字号
  --c-font-base: clamp(0.96875rem, 0.85rem + 0.2vw, 1rem);
  --c-font-xxs: calc(0.625 * var(--c-font-base));
  --c-font-xs: calc(0.75  * var(--c-font-base));
  --c-font-s: calc(0.875 * var(--c-font-base));
  --c-font-m: var(--c-font-base); 
  --c-font-l: calc(1.125 * var(--c-font-base));
  --c-font-xl: calc(1.25 * var(--c-font-base));
  --c-font-xxl: calc(1.5 * var(--c-font-base));
  --c-font-xxxl: calc(1.75 * var(--c-font-base));

  // 边距
  --c-space-1: 0.25rem;   /* 1 unit = 4px */
  --c-space-2: calc(var(--c-space-1) * 2);    /* 0.5rem */
  --c-space-4: calc(var(--c-space-1) * 4);    /* 1rem   */
  --c-space-6: calc(var(--c-space-1) * 6);    /* 1.5rem */
  --c-space-8: calc(var(--c-space-1) * 8);    /* 2rem   */
  --c-space-10: calc(var(--c-space-1) * 10);  /* 2.5rem */
  --c-space-12: calc(var(--c-space-1) * 12);  /* 3rem   */

  @media (max-width: 680px) { --c-space-1: 0.22rem; }
  @media (min-width: 681px) and (max-width: 1200px) { --c-space-1: 0.23rem; } 

  // 颜色
  --c-meta: #8b949e;
}

[data-theme="dark"] {
  // 颜色 
  --c-meta: #7d8792;
}

创建以下文件:

SCSSassets/css/_custom.scss
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
// ========= 全局 =========

// 全局字体
body { font-size: var(--c-font-m); }
h1 { font-size: var(--c-font-xxl); }
h2 { font-size: var(--c-font-xl); }
h3, h4 { font-size: var(--c-font-l); }

// ========= 文章页 =========

.single {
  .content {
    .table-wrapper {
      text-align: left;
      overflow-x: auto;
      font-size: var(--c-font-s);

      > table {
        width: 100%;
        max-width: none;
        white-space: nowrap;
        min-width: max-content;
        -webkit-overflow-scrolling: touch;
      }

      caption {
        caption-side: top;
        text-align: center;
        color: var(--c-meta);
        font-size: var(--c-font-s);
        margin-bottom: var(--c-space-2);
      }
    }
  }
}

表题显示在表格下方:caption-side: top 改为 bottommargin-bottom 改为 margin-top

在 Markdown 中使用

表格下方紧贴一行添加属性块即可添加表题,例如:

Markdown
1
2
3
4
5
| 姓名 | 角色 |
| :--- | :--- |
| 张三 | 作者 |
| 李四 | 编辑 |
{ caption="**表 1**:核心团队成员" }

注意事项

  • 属性块 { caption="..." } 必须紧贴表格的最后一行,否则 Goldmark 将无法识别。
  • 表题支持 Markdown 语法(如 **加粗**),渲染后会居中显示在表格的上方。

编辑器兼容提示

  • Typora:普通编辑视图中的属性块会显示在表格内部,需切换至源代码模式(Ctrl+/),确保属性块紧贴表格下方,以便正确渲染。
  • VSCode + Prettier:启用 Prettier 后,保存 Markdown 文件可能会插入空行,导致 Goldmark 无法渲染表题,可在项目根目录创建 .prettierignore 文件并添加 *.md,忽略其格式化。
留言交流