Markdown与Pandoc:文档写作与格式转换

1634 字
8 分钟
Markdown与Pandoc:文档写作与格式转换

Markdown 的核心优势:纯文本、可版本控制(Git 追踪变更)、写作和排版分离。Pandoc 作为通用文档转换器,可将 Markdown 转为 PDF、Word、HTML、LaTeX、slide 甚至 EPUB。本文覆盖实验记录模板、Pandoc 模板定制、文献引用、代码高亮和交叉引用,实现从实验记录到学术报告的统一工作流。

实测环境:Debian 13,Pandoc 3.6.2,LaTeX(TeX Live 2024)。

1. 环境搭建#

Terminal window
# 安装 Pandoc 和 LaTeX 引擎
sudo apt install pandoc texlive-xetex texlive-latex-extra \
texlive-fonts-recommended texlive-lang-chinese -y
# 安装中文字体(如果系统没有)
sudo apt install fonts-noto-cjk -y
# 验证
pandoc --version
xelatex --version

2. 生信实验记录 Markdown 模板#

# 实验记录:RNA-seq 差异表达分析
**日期:** 2026-01-10
**实验者:** 张三
**项目:** BRCA 肿瘤 vs 癌旁
**样本数:** 48 (24 tumor + 24 normal)
## 目的
鉴定 BRCA 肿瘤组织与配对癌旁组织之间的差异表达基因,为后续 WGCNA 和通路分析提供候选基因列表。
## 方法和参数
### 比对
- 工具:STAR 2.7.11b
- 参考基因组:GRCh38 (Ensembl release 113)
- 参数:`--outFilterMultimapNmax 20 --alignSJoverhangMin 8`
### 定量
- 工具:featureCounts (subread 2.0.6)
- 注释文件:`Homo_sapiens.GRCh38.113.gtf`
- 参数:`-p -B -C -s 2`
### 差异表达
- 工具:DESeq2 (R 4.4.1, Bioconductor 3.19)
- 模型:`~ batch + condition`
- 显著性阈值:|log2FC| > 1, padj < 0.05
## 结果摘要
| 比较 | 上调 | 下调 | 总计 |
|------|------|------|------|
| Tumor vs Normal | 1,247 | 893 | 2,140 |
## 问题和备注
1. 样本 BRCA_T_07 的 RIN 值偏低 (5.2),后续关注其是否偏离主成分。
2. batch2 的测序深度显著高于 batch1,已在 DESeq2 模型中加入 batch 协变量。
## 下一步
- [ ] GSEA 通路富集分析
- [ ] 与 TCGA-BRCA 公开数据比对验证

这种纯文本格式的优势:可以用 Git 追踪每次修改、用 grep 搜索任何关键词、任何文本编辑器都能打开。

3. Pandoc 转换——核心命令#

3.1 基础转换#

Terminal window
# Markdown → HTML
pandoc report.md -o report.html --standalone
# Markdown → DOCX(Word)
pandoc report.md -o report.docx
# Markdown → PDF(通过 LaTeX)
pandoc report.md -o report.pdf --pdf-engine=xelatex
# Markdown → LaTeX(只生成 .tex,不编译)
pandoc report.md -o report.tex
# Markdown → 幻灯片(reveal.js)
pandoc slides.md -t revealjs -s -o slides.html

3.2 带中文字体的 PDF#

Terminal window
# 中文字体是 Pandoc 生成 PDF 最常见的坑
pandoc report.md -o report.pdf \
--pdf-engine=xelatex \
-V mainfont="Noto Serif CJK SC" \
-V sansfont="Noto Sans CJK SC" \
-V monofont="Noto Sans Mono CJK SC" \
-V CJKmainfont="Noto Serif CJK SC"
# 或者用模板指定字体(推荐,见下文)

3.3 代码块高亮#

```bash
# 比对命令
STAR --genomeDir /opt/refs/GRCh38/star_index \
--readFilesIn sample_R1.fastq.gz sample_R2.fastq.gz \
--readFilesCommand zcat \
--outSAMtype BAM SortedByCoordinate \
--runThreadN 16 \
--outFileNamePrefix ./aligned/sample_
```

Pandoc 支持多种语法高亮风格:

Terminal window
# 查看可用高亮风格
pandoc --list-highlight-styles
# 指定风格
pandoc report.md -o report.pdf --highlight-style=tango

3.4 数学公式——LaTeX 原生支持#

在 Markdown 里写 LaTeX 公式,Pandoc 直接渲染:

差异表达分析中,DESeq2 使用负二项分布建模:
$$K_{ij} \sim \text{NB}(\mu_{ij}, \alpha_i)$$
其中 $K_{ij}$ 是基因 $i$ 在样本 $j$ 中的计数,$\mu_{ij}$ 是期望值,
$\alpha_i$ 是离散度参数。fold change 的收缩估计为:
$$\beta_i^{\text{MAP}} = \arg\max_{\beta} \left[ \log L(\beta | K_i) + \log p(\beta) \right]$$

渲染结果和 LaTeX 原生一致,写分析报告时可以直接嵌入统计模型的公式。

4. 文献引用——生信报告必备#

4.1 使用 BibTeX 引用#

# 在 Markdown 里引用文献
差异表达分析使用 DESeq2 [@love2014] 进行,
多重检验校正采用 Benjamini-Hochberg 方法 [@benjamini1995]
# 参考文献

准备一个 refs.bib 文件:

@article{love2014,
title={Moderated estimation of fold change and dispersion for RNA-seq data with DESeq2},
author={Love, Michael I and Huber, Wolfgang and Anders, Simon},
journal={Genome biology},
volume={15},
number={12},
pages={1--21},
year={2014},
publisher={Springer}
}
@article{benjamini1995,
title={Controlling the false discovery rate: a practical and powerful approach to multiple testing},
author={Benjamini, Yoav and Hochberg, Yosef},
journal={Journal of the Royal statistical society: series B},
volume={57},
number={1},
pages={289--300},
year={1995}
}

编译命令:

Terminal window
pandoc report.md -o report.pdf \
--pdf-engine=xelatex \
--citeproc \
--bibliography=refs.bib \
-V mainfont="Noto Serif CJK SC"
# --citeproc 启用文献处理

4.2 图片交叉引用#

Terminal window
# 需要 pandoc-crossref 过滤器
sudo apt install pandoc-crossref -y
![PCA 图展示样本聚类情况](figures/pca_plot.png){#fig:pca width=80%}
如 {@fig:pca} 所示,肿瘤和正常样本在第一主成分(PC1,解释 42% 方差)上清晰分离。

编译时加 --filter pandoc-crossref

Terminal window
pandoc report.md -o report.pdf --pdf-engine=xelatex --filter pandoc-crossref

5. 定制 Pandoc 模板#

5.1 创建生信报告模板#

Terminal window
# 查看默认 LaTeX 模板
pandoc -D latex > bioinfo-template.tex

在默认模板基础上修改——加实验室 Logo、页眉页脚、自定义标题页。然后用:

Terminal window
pandoc report.md -o report.pdf \
--pdf-engine=xelatex \
--template=bioinfo-template.tex \
-V mainfont="Noto Serif CJK SC"

5.2 YAML 元数据——文档信息集中管理#

在 Markdown 文件头部写 YAML 元数据,Pandoc 会自动提取:

---
title: "BRCA RNA-seq 差异表达分析报告"
author: "张三"
date: "2026-01-12"
institute: "XX 大学生物信息学实验室"
abstract: "本研究对 24 对 BRCA 肿瘤-癌旁组织进行 RNA-seq 分析,
识别出 2,140 个差异表达基因(|log2FC| > 1, padj < 0.05)。"
keywords: [BRCA, RNA-seq, 差异表达, DESeq2]
toc: true
toc-depth: 2
numbersections: true
---

编译后自动生成标题页、目录、章节编号。

6. 批量处理——分析报告自动化#

生信流程跑完后自动生成报告:

#!/bin/bash
# auto_report.sh —— 分析跑完后自动生成 PDF 报告
set -euo pipefail
PROJECT_DIR="$1"
REPORT_TEMPLATE="${PROJECT_DIR}/docs/report_template.md"
REPORT_OUT="${PROJECT_DIR}/results/analysis_report.pdf"
REF_BIB="${PROJECT_DIR}/docs/refs.bib"
FIG_DIR="${PROJECT_DIR}/results/figures"
# 1. 自动更新报告中的统计数字
sed -i "s/{{TOTAL_DEGS}}/$(cat ${PROJECT_DIR}/results/degs_count.txt)/g" \
"${REPORT_TEMPLATE}"
# 2. 生成 PDF
pandoc "${REPORT_TEMPLATE}" \
-o "${REPORT_OUT}" \
--pdf-engine=xelatex \
--citeproc \
--bibliography="${REF_BIB}" \
--filter pandoc-crossref \
--resource-path="${FIG_DIR}" \
-V mainfont="Noto Serif CJK SC" \
--toc \
--number-sections
echo "Report generated: ${REPORT_OUT}"

7. 踩坑记录#

坑1:中文 PDF 编译报错 “Missing character”。 默认 pdflatex 引擎不支持中文,必须用 --pdf-engine=xelatexlualatex。同时确认系统中安装了中文字体包(fonts-noto-cjkfonts-wqy-microhei)。

坑2:生信代码块的波浪线和反引号。 bash 代码里经常有 ${VAR} 这样的语法,在 Markdown 里写反引号代码块时注意用四个反引号(````)包裹含三个反引号的代码。或者干脆所有代码块都用四个反引号,免得出问题。

坑3:Pandoc 表格不支持合并单元格。 Markdown 表格本身是简化版的,不支持 rowspan/colspan。如果需要复杂表格,直接用 LaTeX 的 tabular 环境嵌在 Markdown 里,Pandoc 会透传。

坑4:DOCX 输出的样式丑得没法看。 Pandoc 默认 DOCX 样式非常基础。用 --reference-doc 指定一个样式模板:先 pandoc -o template.docx --print-default-data-file reference.docx,在 Word 里修改样式后,再 pandoc report.md -o report.docx --reference-doc=template.docx

坑5:文献引用不生效。 检查三个点:① BibTeX 文件编码是 UTF-8,② 引用 key 拼写一致(大小写敏感),③ --citeproc 参数是否加了。另外确认 pandoc-citeproc 已正确安装。

坑6:--resource-path 设错导致图片找不到。 如果 Markdown 里写 ![fig](figures/pca.png),且 --resource-path=results,那 Pandoc 会找 results/figures/pca.png。路径拼接逻辑有时不直观,建议用绝对路径或相对于 Markdown 文件的位置。


本文于 2026-01-12 在 Debian 13 上实测。

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

Markdown与Pandoc:文档写作与格式转换
https://fg.ink/posts/markdown-pandoc-writing/
作者
风观
发布于
2026-01-12
许可协议
CC BY-NC-SA 4.0
Profile Image of the Author
风观
风有来路,观有所思
分类
标签
站点统计
文章
52
分类
1
标签
38
总字数
64,085
运行时长
0
最后活动
0 天前

文章目录