ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Typora公式自动编号与引用:从手动\tag到pandoc-crossref全自动化

2026/9/18 12:02:40 拓冰建站 浏览量
Typora公式自动编号与引用:从手动\tag到pandoc-crossref全自动化 用了小半年Typora之后我最大的感受是轻度记笔记的人根本碰不到公式编号这个需求一旦碰到就会非常难受。你自己写一段带编号的多行公式正文里写“如式(3)所示”一开始还挺顺利等公式堆到二三十个中途插了几条新公式后面的编号全得手工改正文里的引用更是改到怀疑人生。我也在网上搜过“Typora多行公式自动编号引用”出来的答案要么说“用\tag{}呗”要么直接劝你换编辑器没有一个能让我真正抄作业。折腾了一个周末之后我把Typora在公式编号这件事上的真实边界、两个能落地的半自动方案、以及一套接近全自动的pandoc-crossref导出链路全捋了一遍这篇就把实操过程和踩过的坑完整写清楚。1. 需求拆解公式编号这件事到底卡在哪一层先说结论Typora当前原生不支持“多行公式自动编号引用”这不是你配置不对而是它的架构压根没打算干这个。要理解为什么得先把“公式自动编号”拆成三个层次。第一层给多行公式一个编号。比如一个\begin{aligned}写的多行推导右边出现“(1)”“(2)”这一层看起来简单其实已经不容易。Typora的实时预览走的是MathJax渲染MathJax不是LaTeX编译器默认不会给公式自动生成编号。你用\begin{equation}写在Typora里预览时通常看到的还是一个无编号的公式块。第二层编号随着公式增删自动重排。你中间插了一条公式后面所有编号自动加一。这个能力需要编辑器维护一个全文档的公式计数器Typora的渲染模型里没有这玩意儿。第三层正文里的“引用”能动态指向公式编号。比如正文写“根据式(7)”公式顺序变了(7)要自动跟着变。这在LaTeX里靠\label和\ref解决在Word里靠题注和交叉引用解决但在Markdown生态里没有统一标准。三个层次叠加才是标题里“自动编号引用”的真正含义。Typora是个本地Markdown编辑器它的强项是让$$...$$里的LaTeX公式在光标附近立刻渲染成好看的样式但它不会像TeX编译器那样做两遍编译更不会维护一个跨文档范围的标签数据库。所以原生支持这件事短期别指望。打个比方Typora是给你现场备菜的厨师你点一道菜他立刻端上来但你要的是“整桌宴席按顺序自动排菜、菜单同步更新”——那是后厨团队的事。Typora没雇这个后厨你得自己在外面找。2. Typora 原生能力的边界\tag、\label 与变通方案既然原生的全自动没戏那就得先摸清楚Typora自己能干到哪一步再决定在哪里补工具。这一节把我实际验证过的边界讲清楚。2.1 \tag 手动编号最原始但最稳的底牌Typora对\tag{}的支持是没问题的。你在块级公式末尾加一个\tag{1}预览里公式右边就会出现“(1)”这个机制来自MathJax本身跟Typora的版本关系不大。$$ x \frac{-b \pm \sqrt{b^2-4ac}}{2a} \tag{1} $$像上面这种渲染效果就是公式末尾带一个手动指定的编号。好处是简单、可控、所见即所得坏处是“自动”两个字跟你彻底没关系。公式增删之后你得手动把所有\tag{n}的n改一遍。公式少的时候无所谓上了十几个之后就是纯粹的体力活而且特别容易漏改。2.2 \label 和 \eqref为什么时灵时不灵LaTeX用户一定想当然地试过这种写法$$ \begin{equation} x1 \label{eq:test} \end{equation} $$ 这里引用 \eqref{eq:test}我在Typora里实测下来是偶尔能用大多数时候不灵。原因很微妙MathJax的\label机制要求整个文档的数学块共享同一个计数器上下文但Typora的实时预览倾向于把每一个数学块当作独立片段渲染标签信息经常传不过去。结果就是预览里看到\eqref{eq:test}原样显示或者渲染成一个“??”。更麻烦的是这个问题没有统一开关给你调。Typora有主题定制能力但公式渲染配置没有被完全暴露出来。所以我的建议是不要在Typora里依赖\label/\eqref它今天能跑通不代表换了版本还能跑通不值得把正式文档押在上面。2.3 用CSS计数器给公式做“视觉编号”这个属于有点歪的玩法我在一些折腾主题的朋友那里见过自己也试过。Typora的主题本质是CSSTypora的块级公式元素在DOM里是可以被选中加样式的。于是有人给块级公式加计数器让每个公式块自动显示递增编号.md-math-block { counter-increment: math-counter; position: relative; } .md-math-block::before { content: ( counter(math-counter) ); position: absolute; right: 0; top: 50%; transform: translateY(-50%); }这套CSS放在你的Typora主题文件里重启之后每个块级公式的右侧会自动出现递增的“(1)(2)(3)”而且增删公式时它会自动重排。听起来是不是完美但有两个硬伤一是这个编号只活在“预览”里它不在Markdown源码里导出PDF或Word时不一定保留就算保留也很可能错位二是正文里的引用不可能自动指向这个CSS编号你还是得手写“式(3)”。如果你只是想自己在编辑的时候看得舒服这个方案可以玩但别把它当正经的交叉引用方案。类名在不同版本里可能改自己用开发者工具检查一下再写样式。2.4 HTML锚点让“引用”至少能点击跳转Typora支持内联HTML这给了第4个变通思路手动编号但用HTML锚点让正文引用能点击跳转。具体做法是在公式前面插入一个带id的不可见锚点span ideq1/span $$ x 1 \tag{1} $$ 根据[式(1)](#eq1)可以继续推导...这样在Typora里正文的“式(1)”会变成可点击链接点一下直接跳到对应公式。编号依然是手动的但至少解决了“引用跳转”的体验问题。对几十个公式以内的笔记型文档这套组合其实够用。3. 半自动方案手动编号 文末公式登记表如果你的文档公式数量在20条以内最省事的不是去装一堆工具而是建一张公式登记表。这是我后来在写技术笔记时常用的做法不追求全自动而是把“改编号”这件事变成一个不会出错的流程。具体操作分三步第一步在文末维护一个公式登记表。用Markdown表格把公式的语义、编号和标签列出来比如标签编号公式含义备注eq:snr1信噪比定义第三章开头eq:mse2均方误差公式依赖eq:snreq:llr3对数似然比推导较长第二步写公式时\tag{}里的编号严格按照表格来填。正文里凡是提到某个公式只写“式(编号)”同时在源码里加一个HTML锚点指向对应标签方便点击跳转。第三步当你在中间插入新公式只需要把登记表从插入位置往下全部1然后全局搜索旧的编号统一替换。因为登记表里已经标好了公式语义和正文引用的大致位置搜索替换比纯凭记忆靠谱得多。这套方案的优点是零依赖、完全可控Typora里所有能力都是原生支持的。缺点也很明显公式超过20个、或者经常在中间增删时维护成本开始直线上升。这时候就该上真正的全自动方案了。4. 全自动方案pandoc-crossref 接进 Typora 导出链路如果说前面都是手工活那这一节才是标题里“自动编号引用”的正解。思路很简单Typora负责写Pandoc负责编译pandoc-crossref负责编号和引用解析。你不在Typora的实时预览里看编号而是在导出PDF或Word时让pandoc-crossref自动算出编号、自动把引用替换成“式(2)”。4.1 全自动方案的整体工作流整个链路长这样你写Markdown时在公式块后面加一个{#eq:label}属性在正文里用eq:label来引用导出时pandoc看到--filter pandoc-crossref就会扫一遍文档里的所有公式标签给每个公式分配一个递进编号然后把正文里的eq:label全部替换成对应的编号文本。这意味着什么意味着你从此不再关心具体的数字。公式中间多插几条顺序全乱引用乱不乱不乱因为标签名是固定的。这正是“自动编号引用”该有的样子。4.2 安装 Pandoc、pandoc-crossref 和 TeX 引擎先安装Pandoc。Windows上可以用包管理器macOS上用Homebrewbrew install pandoc然后安装pandoc-crossref。这个工具从GitHub release页面下载对应平台的压缩包解压后放进PATH目录即可验证安装版本pandoc-crossref --version注意pandoc-crossref和pandoc之间有版本兼容性要求装完之后最好跑一下上面这个命令确认没有报错否则导出时会出现很诡异的“引用全部变成???”的问题。最后是TeX引擎因为导出PDF需要XeLaTeX把公式编排成版。安装TeX Live或BasicTeX/MiKTeX都行体积比较大但这一步躲不开。如果只是导出Word就可以不装但Word导出对公式的支持不如PDF完整。4.3 在 Typora 里配置自定义导出命令打开Typora的偏好设置找到“导出”添加一个自定义命令。参考配置如下pandoc $infile --filter pandoc-crossref --pdf-enginexelatex -V CJKmainfontNoto Serif CJK SC -o $outdir$basename.pdf如果你不想折腾PDF可以导DOCXpandoc $infile --filter pandoc-crossref -o $outdir$basename.docx这里需要注意Typora的自定义导出变量在不同版本里不完全一样我用的$infile、$outdir、$basename这套在常见版本里都能跑。命令装好之后还是在偏好设置的导出列表里点一下看到PDF生成成功才算通过。4.4 Markdown 里的写法公式属性和引用标签这是全自动方案的核心语法。公式写成一个独立的显示公式块然后在闭合的$$后面紧跟{#eq:label}注意中间不要有空行$$ SNR \frac{P_s}{P_n} $$ {#eq:snr}正文里引用它用eq:snr根据 eq:snr可以进一步推导接收端的误码率表现。如果你希望引用渲染成“式(1)”而不是“式1”可以在文档开头的YAML区里配置编号格式--- title: 信道SNR推导笔记 eqnPrefix: 式 eqnSuffix: ---具体的控制字段跟pandoc-crossref版本有关以该版本官方README为准。核心是它支持给公式编号和引用做前缀后缀定制。4.5 实际导出效果与“多行公式”场景我把一个包含几十条公式的Markdown文档跑了一遍导出PDF后所有公式后面自动带上了(1)(2)(3)这样的编号正文里所有eq:xxx都被替换成了对应的编号。中途我把第三条公式删掉重新导出编号全部自动重排了正文引用也跟着变了。这就是“自动编号”最爽的地方。多行公式怎么办我的实测经验是pandoc-crossref会把整个$$...$$块当作一个编号单元。如果你想给一个多行推导过程整体编一个号那就把整个\begin{aligned}包在一个$$...$$里然后在闭合后加{#eq:label}$$ \begin{aligned} a b c \\ d e \end{aligned} $$ {eq:aligned}这样多行公式整体一个编号。如果你非要“多行公式里每一行单独编号”那pandoc-crossref这个方案帮不了你那种需求建议直接去用真正的LaTeX编辑器。4.6 我踩过的四个坑这个方案坑不算少列一下我对付它们的办法。第一个坑是忘了写--filter pandoc-crossref结果导出后正文里的eq:xxx原样输出像个大bug。其实不是bug是过滤器没生效。第二个坑是pandoc和pandoc-crossref版本不匹配表现为引用全部变成(??)或者干脆报错。解决方法是把两者都升级到最新版然后再验证版本。第三个坑是中文PDF导出乱码或方框。问题出在XeLaTeX没有指定中文字体命令里加上-V CJKmainfontNoto Serif CJK SC或者你系统里的其他中文字体就能解决。第四个坑是Typora实时预览里{#eq:label}会被当作普通文本显示让编辑器看起来有点脏。这个没有完美解法我自己的习惯是需要管理公式编号的文档全程用“源码模式”写写完导出PDF再看效果。因为这毕竟是把编译工作外包给了Pandoc享受自动编号的代价就是不能再百分百依赖Typora的所见即所得。5. 如果你非要“边写边看到编号”三套替代工具实测pandoc-crossref方案有一个天然短板编辑器里看不到最终的编号效果。这对一部分人来说没法忍。我也试过几套替代方案简单说一下各自的情况。第一套VS Code LaTeX Workshop。这套本质上是把Markdown的舒适感彻底放弃直接用纯LaTeX写作。在.tex文件里\begin{equation} \label{eq:snr} ... \end{equation}配合\eqref{eq:snr}预览面板里实时编译编号和引用全都自动更新体验是最完整的。但代价也很明显你不再拥有Typora那种无缝的Markdown写作体验得适应LaTeX的编辑器环境。第二套Obsidian Pandoc插件 pandoc-crossref。Obsidian的社区有Pandoc导出插件也能接上pandoc-crossref过滤器原理跟Typora的自定义导出命令一样。Obsidian的好处是插件生态更活跃坏处是折腾成本比Typora更高而且实时预览里同样看不到最终编号。第三套TeXstudio。纯LaTeX编辑器适合写论文的人启动快、语法提示完善但对只写几千字笔记的人来说有点重。我的看法是如果你要写的是20页以上的技术手册、课程报告、论文直接上LaTeX工作流别用Typora硬扛如果你跟我一样平时在Typora里写博客、写笔记偶尔需要一两篇带公式编号的文档导出PDF那就用pandoc-crossref编辑期看不到编号是能接受的妥协。6. 按文档类型选方案我的实测建议表有朋友经常问我到底该用哪种方案我给一个按场景划分的选择表场景推荐方案理由笔记式短文公式少于10条手动\tag HTML锚点零依赖看得见摸得着课程笔记、技术总结公式20条左右手动编号 文末登记表维护成本可控不折腾工具正式报告、论文公式20条以上且频繁增删pandoc-crossref导出编号和引用自动跟随最省心期刊/学位论文要求公式编号层级复杂直接换TeXLaTeX天然支持别在Markdown上绕路如果你选了pandoc-crossref路线我再给你一个操作性建议不要一口气把整个文档写完再导出写两三个公式就导出一次PDF验证编号确认语法正确再继续。这样可以尽早发现{#eq:label}写错位置、过滤器路径不对等问题避免写完一大篇导出时崩掉回头排查的代价非常高。这套流程我前后用了大概两周才完全跑顺现在已经成了我处理长文档的固定姿势Typora写初稿pandoc-crossref出终稿中间那点“看不到编号”的小瑕疵跟它换回来的自动编号和引用能力相比完全不值一提。