资讯动态

Typora 中文学术排版 CSS 主题定制与 PDF 导出排错

发布时间:2026/10/29 20:12:04 来源:尧图企业网站定制
简介这份 Typora 中文学术风格主题面向撰写论文、报告与长文档的中文学术用户在官方 Academic 主题基础上调整正文与等宽字体正文采用华文中宋等宽字体采用 CamingoCode并强化代码块外边框样式适合追求严谨排版与舒适阅读的写作者替换使用。资源包共 14 个文件含 2 个 CSS 样式、8 个 woff 字体、2 个 PDF 许可说明及 1 个 TXT、1 个 MD 说明整体约 15.46MB字体与样式分离便于按需启用和二次修改。已有 453 人学习说明其在学术写作场景中具备一定参考价值。读者可获得一套可直接落地的中文 Typora 主题理解 Academic 风格的字体搭配逻辑并借助代码块外框、右对齐与居中对齐等方式改善论文与技术文档中的公式、示例代码与版式呈现对公式、代码与中文段落混排较友好能减少长文写作中的版式调试成本。1. 交稿前夜被格式打回这套中文学术 CSS 到底改了什么用 Typora 写完一章导出 PDF 一看段首不缩进标题层级没有编号图表题注跟正文一个字号参考文献的悬挂缩进全散。内容没问题格式被批注「像网页不像论文」。这套 Typora-Academic-Zh 干的就是这件事用一组 CSS 覆盖 Typora 默认主题把中文学术排版里那些手动调不完的规则固化成样式。它不是插件不改变 Markdown 语法装的是academic-zh.css这类主题文件核心是选择器和打印样式。适合用 Markdown 写课程报告、论文初稿、技术文档最后要交 PDF 的人也适合想改主题但不知道从哪个选择器下手的熟手。下面按「拆文件、装进去、调四件事、排五个坑」走一遍。2. 拆开 academic-zh.css从 #write 到标题层级的五个选择器2.1 主题文件清单与加载顺序拿到压缩包先别急着往主题目录里拖先把文件结构看清楚。常见结构是一个主 CSS、一个可选的暗色 CSS、一个字体目录和一份说明文件。不同版本可能多一个打印样式文件也可能把打印规则直接写在主 CSS 的media print里。文件名不一定叫academic-zh.css以压缩包实际文件名为准下面用这个名字代指主主题文件。文件/目录作用是否必须academic-zh.css主主题样式定义#write区域、标题、表格、代码块必须academic-zh-dark.css暗色变体主要覆盖颜色变量可选fonts/本地字体文件换机时减少字体缺失可选README.md安装步骤和参数说明建议看academic-zh.user.css用户覆盖文件自己新建不放压缩包自建Typora 加载主题时有一套固定顺序内置基础样式先加载然后加载当前选中的主题 CSS最后加载与主题同名的[theme].user.css。这意味着你不需要直接改academic-zh.css把想调的参数写进academic-zh.user.css就能覆盖升级主题时也不会把修改冲掉。主题 CSS 顶部通常用:root定义一组变量正文、标题、代码块都引用这些变量调参入口比较集中。/* 主题顶部的变量区变量名以实际文件为准 */ :root { --academic-font-body: SimSun, Songti SC, serif; --academic-font-heading: SimHei, Heiti SC, sans-serif; --academic-font-mono: Consolas, Menlo, monospace; --academic-body-size: 12pt; --academic-body-leading: 1.8; --academic-indent: 2em; }这段逻辑是把字体、字号、行高、缩进从具体规则里抽出来后面改一处就能影响全局。pt用于打印场景10.5pt 接近五号字12pt 接近小四1.8是无单位行高表示字号的 1.8 倍2em相对当前字号正好是两个汉字宽度。字体栈从具体字体写到通用族名前一个找不到就往后落最后用serif或sans-serif兜底。不要一上来把字体栈写成单一字体名换一台机器很容易翻车。2.2 从 #write 到标题层级选择器怎么写Typora 的编辑区容器是#write侧边栏、文件列表、偏好设置这些界面元素不在这个容器里。学术主题的所有排版规则都应该挂在#write下面否则暗色模式、侧边栏、导出预览容易被误伤。下面这段是正文和标题的骨架实际文件里可能拆得更细但选择器层级基本是这个思路。/* 正文区域控制行宽、字体、字号、行高和对齐 */ #write { max-width: 46em; margin: 0 auto; font-family: var(--academic-font-body); font-size: var(--academic-body-size); line-height: var(--academic-body-leading); color: #1a1a1a; text-align: justify; } /* 标题统一走黑体类字体字号逐级递减 */ #write h1, #write h2, #write h3, #write h4 { font-family: var(--academic-font-heading); font-weight: 700; line-height: 1.35; margin: 1.6em 0 0.8em; text-align: left; text-indent: 0; } #write h1 { font-size: 1.8em; } #write h2 { font-size: 1.5em; } #write h3 { font-size: 1.25em; }这段的逻辑是先把编辑区收窄到适合阅读的行宽再给标题单独一套字体和间距。max-width: 46em不是固定像素字号变了行宽会跟着变中文字符大约一行 46 字A4 纸上比较舒服。margin: 0 auto让编辑区居中预览时两侧留白text-align: justify两端对齐中文段落看起来更整齐但英文长单词可能被拉开技术文档里可以改回left。参数上重点看三个地方。line-height: 1.35是标题行高比正文紧防止多行标题散开margin: 1.6em 0 0.8em是标题上下的呼吸空间上边距大于下边距标题和它下面那段正文更近层级关系更清楚text-indent: 0必须写因为正文如果设了首行缩进标题会继承一级标题也跟着缩进两格看起来像正文。标题字号用em而不是rem避免 Typora 根字号变化时整篇比例失控。2.3 变量表与调参入口调参不要从颜色开始先把字号、行高、缩进、标题字重这四项定下来再考虑表格边框和代码块底色。下面这张表是常用变量和它们影响的范围实际变量名可能不同但含义大差不差。参数常见取值影响范围调整建议正文字号10.5pt / 12pt#write全局课程报告常用 12pt论文初稿常用 10.5pt正文行高1.75 / 1.8正文段落低于 1.6 会挤高于 2.0 会散首行缩进2em正文段落中文两字符不要用固定像素段间距0.3em0.5em段落之间有缩进时不要给太大段间距标题字重700h1h4不要用 900部分字体没有粗体回退编辑区行宽44em48em#write太宽眼睛累太窄表格放不下覆盖文件建议单独建一个academic-zh.user.css和主主题放在同一个主题文件夹。文件名必须和主题文件名对应主主题叫academic-zh.css覆盖文件就叫academic-zh.user.css。下面这段只改正文尺寸、行宽和左右内边距不动主题原文件。/* academic-zh.user.css只覆盖需要微调的参数 */ :root { --academic-body-size: 10.5pt; --academic-body-leading: 1.75; --academic-indent: 2em; } #write { max-width: 44em; padding: 0 2.2cm; }这段的逻辑是用变量覆盖字号和行高再用#write单独收窄行宽、加左右内边距。padding: 0 2.2cm是预览时的左右留白不等于打印页边距打印页边距要在media print里的page单独设后面会讲。max-width: 44em比默认的 46em 窄一点表格多的文档可以改回 48em。参数上注意10.5pt和12pt的差别在导出 PDF 时最明显预览时因为屏幕缩放很多人感觉不出来。1.75的行高适合五号字小四字可以到1.8。2em的缩进在字号变化时会自动跟着变不要写成24px这种固定值。覆盖文件里尽量少用!important一旦用多了后面想再覆盖就得加更多!important维护起来很麻烦。提示改主题前先把原academic-zh.css复制一份备份或者只动academic-zh.user.css。直接改主文件不是不行但主题一升级修改就容易被覆盖。3. 装进 Typora主题目录、user.css 覆盖与三组参数3.1 复制安装与主题切换安装步骤不复杂难的是别放错目录。打开 Typora 的偏好设置找到「外观」点「打开主题文件夹」系统会直接跳到正确位置不需要自己记路径。把academic-zh.css和可选的fonts/目录复制进去重启 Typora在「主题」菜单里选对应名称。菜单显示的是文件名去掉.css后的名字所以文件名不要随便改尤其不要改大小写有些系统区分大小写改完菜单里可能就找不到了。复制完先确认扩展名。常见翻车是文件实际叫academic-zh.css.txt资源管理器隐藏了已知扩展名看着像 CSS其实是文本文件。用文件管理器打开「显示文件扩展名」或者在终端里列一下目录确认是.css结尾。下面这条命令只是确认文件存在和扩展名不涉及具体路径在主题文件夹里执行即可。# 在主题文件夹内确认主样式和暗色样式存在 ls -l academic-zh.css academic-zh-dark.css这段的逻辑是用ls -l看文件名、扩展名和修改时间确认复制的是 CSS 而不是压缩包里的快捷方式。-l会多打一列权限和大小不影响判断。如果系统提示找不到文件先确认当前目录是不是主题文件夹再看文件名有没有多余后缀。暗色样式是可选的没有也不影响主主题使用。安装方式其实有三种适合不同阶段。直接复制主 CSS 最简单适合第一次试用academic-zh.user.css覆盖适合长期调参临时在开发者工具里改样式适合找选择器但不适合作为最终方案因为重启就没了。下面这张表是三种方式的取舍。方式适合场景风险升级时直接改主 CSS一次性使用、快速试验改错难回滚容易被覆盖academic-zh.user.css覆盖长期使用、多篇文档选择器优先级要写对基本不受影响开发者工具临时改找选择器、验证参数重启失效无影响3.2 用 user.css 做覆盖不动原文件覆盖文件的核心是「只写差异」。主题已经把大部分规则写好了你只需要把想改的变量和少数选择器重新赋值。下面这段是一个比较完整的覆盖模板包含正文、标题、表格和代码块四个入口实际使用时按需删减。/* academic-zh.user.css按差异覆盖不重复主题已有规则 */ :root { --academic-body-size: 10.5pt; --academic-body-leading: 1.75; } #write { max-width: 45em; padding: 0 2cm; } #write h1, #write h2, #write h3 { font-family: SimHei, Heiti SC, sans-serif; font-weight: 700; text-indent: 0; } #write table { font-size: 0.92em; line-height: 1.5; } #write pre, #write .md-fences { font-size: 0.9em; line-height: 1.55; }这段的逻辑是把最常调的四类元素单独拎出来正文控行宽和字号标题控字体和缩进表格控字号和行高代码块控字号和行高。#write table和#write .md-fences都限定在编辑区内不会影响侧边栏。表格字号用0.92em比正文小一点代码块用0.9em都是相对正文缩放正文改字号时它们会跟着变。参数上注意表格行高不要低于1.4否则中文表格里的字会贴边代码块行高可以到1.55比正文紧一点一屏能多看几行。padding: 0 2cm是预览留白如果导出 PDF 后发现左右边距不对不要在这里加去改page的margin。标题字体用系统自带黑体类字体不要硬写一个没安装的字体名否则会回退成默认字体标题和正文看起来一样。注意academic-zh.user.css不是所有旧版本都支持如果放进去没反应先确认当前 Typora 版本是否读取同名覆盖文件。不支持时再直接改主 CSS但一定要备份。3.3 字体与行距的三组参数怎么定字号、行高、缩进这三组参数没有唯一正确答案但有三套常用组合。课程报告通常要求正文小四、行距 1.5 倍左右论文初稿常用五号、行距 1.75 到 1.8技术文档可以稍小但行高不能太挤。下面这张表是常见场景的起点具体以学校或单位规范为准。场景正文字号行高首行缩进标题字体课程报告12pt1.61.72em黑体类论文初稿10.5pt1.751.82em黑体类技术文档11pt1.70 或 2em黑体类字体安装是另一个容易忽略的点。如果主题里用了本地fonts/目录的字体导出 PDF 的机器也要能访问这些字体否则 PDF 里会回退。更稳的做法是正文用系统自带宋体类字体标题用系统自带黑体类字体代码用等宽字体。下面这段是字体栈的写法从具体字体到通用族名逐级回退。/* 字体栈具体字体优先通用族名兜底 */ #write { font-family: SimSun, Songti SC, serif; font-size: 10.5pt; line-height: 1.75; text-indent: 2em; } #write h1, #write h2, #write h3, #write h4 { font-family: SimHei, Heiti SC, sans-serif; text-indent: 0; } #write code, #write pre { font-family: Consolas, Menlo, monospace; }这段的逻辑是正文走衬线字体标题走无衬线字体代码走等宽字体三类字体各司其职。text-indent: 2em写在#write上会继承所以标题、列表、代码块、表格都要单独重置为 0否则会连锁缩进。serif、sans-serif、monospace是通用族名前面的具体字体找不到时由系统决定回退字体。参数上注意10.5pt在小屏幕上预览会显得小这是正常的打印出来是五号字。行高1.75是折中值低于1.6中文段落会显得密高于1.85一页装不了多少字。首行缩进2em不要改成2chch是数字 0 的宽度中文场景不如em直观。字体栈里不要塞太多字体名三到四个足够塞多了反而不好判断到底命中了哪一个。4. 中文学术排版四件事缩进、编号、题注、参考文献4.1 首行缩进只作用于正文段落首行缩进是中文排版里最容易写错的一处。直接给#write p加text-indent: 2em看似能工作但列表项里的段落、引用里的段落、表格单元格里的段落都会跟着缩进代码块如果被包在p里也会中招。正确做法是先给正文段落加缩进再把不该缩进的子元素重置为 0。/* 正文段落首行缩进两字符 */ #write p { text-indent: 2em; margin: 0.4em 0; } /* 列表、引用、表格、代码块内部不缩进 */ #write li p, #write blockquote p, #write table p, #write .md-fences p, #write .md-table p { text-indent: 0; } /* 列表项本身也不缩进缩进交给列表标记 */ #write ul, #write ol, #write li { text-indent: 0; }这段的逻辑是「先继承再重置」#write p把缩进传给所有段落后面几组选择器把列表、引用、表格、代码块里的段落拉回 0。#write li p的优先级比#write p高能覆盖继承值。列表项li本身也重置避免列表标记和文字之间出现多余空白。参数上2em是两个汉字宽度随字号变化10.5pt 正文下大约是 21pt。margin: 0.4em 0是段间距有首行缩进时段间距不要太大否则段落之间空得太开反而不像论文。如果发现引用块第一行也缩进了检查blockquote p有没有写如果表格单元格里的文字缩进检查.md-table p有没有覆盖到。提示Typora 的源码模式里段落之间空一行不会产生额外空段落缩进由 CSS 控制不要为了缩进手动敲空格导出后会对不齐。4.2 标题自动编号的 CSS counter 写法学术排版里标题编号可以用 CSS counter 自动生成不用在 Markdown 里手写「1.」「1.1」。思路是在#write上重置二级计数器每个h2重置三级计数器然后用::before把编号插到标题前面。下面是一段两级编号的写法。/* 在编辑区重置二级标题计数器 */ #write { counter-reset: h2counter; } /* 每个二级标题重置三级计数器 */ #write h2 { counter-reset: h3counter; } /* 二级标题前插入 1、2、3 */ #write h2::before { counter-increment: h2counter; content: counter(h2counter) ; } /* 三级标题前插入 1.1、1.2 */ #write h3::before { counter-increment: h3counter; content: counter(h2counter) . counter(h3counter) ; }这段的逻辑是计数器跟着标题出现顺序走第一个h2让h2counter变成 1同时把h3counter重置它下面的h3从 1 开始递增插出来就是「1.1」。第二个h2把h2counter加到 2h3counter再次重置编号变成「2.1」。content里的空格是编号和标题文字之间的间隔不要用margin代替伪元素里的空格更稳。参数上注意counter-reset的位置写在#write上只重置一次写在h2上每个二级标题都重置三级。counter-increment写在::before里标题出现一次加一次。编号样式默认是阿拉伯数字如果要「第一章」这种中文数字CSS 的cjk-ideographic支持有限导出效果不稳定不建议在正式文档里用。这套写法有一个边界Typora 左侧大纲显示的是 Markdown 标题原文不会显示::before插入的编号。也就是说预览和 PDF 里有编号大纲里没有。如果学校要求大纲也带编号只能在 Markdown 里手写编号然后关掉 CSS counter。两者不要同时开否则会出现「1 1. 引言」这种重复编号。4.3 图表题注与参考文献的悬挂缩进Typora 没有原生的图表题注语法常见做法是用一段斜体文字模拟题注再用 CSS 把它变成居中、小字号、不缩进的块。Markdown 里写*图 1 系统结构*生成的 HTML 是pem图 1 系统结构/em/p可以用em:only-child命中「段落里只有一个斜体元素」的情况。/* 整段只有斜体时当作图表题注处理 */ #write p em:only-child { display: block; text-align: center; font-style: normal; font-size: 0.9em; text-indent: 0; margin: 0.3em 0 0.8em; }这段的逻辑是用display: block把行内斜体变成独立块text-align: center居中font-style: normal取消斜体font-size: 0.9em比正文小一号text-indent: 0抵消正文缩进。图题注放在图片下方表题注放在表格上方这是中文学术排版里比较常见的顺序。参数上0.9em是相对正文的缩放正文 10.5pt 时题注大约 9.45pt接近小五。margin: 0.3em 0 0.8em让题注和上方内容近一点、和下方正文远一点。如果题注没有居中检查段落里是不是还有别的行内元素em:only-child只在整个段落只有一个子元素时命中有多个元素时可以用#write p:has( em:first-child:last-child)但对旧渲染内核有兼容性要求。参考文献的悬挂缩进也是类似思路。Typora 没有专门的参考文献块常见做法是用引用块包住每条文献然后给引用块里的段落加负缩进。下面这段把引用块变成左侧竖线加悬挂缩进。/* 引用块作为参考文献容器 */ #write blockquote { border-left: 2px solid #999; padding-left: 1em; margin: 1em 0; color: #333; text-indent: 0; } /* 每条文献悬挂缩进首行突出后续行缩进 */ #write blockquote p { text-indent: -2em; padding-left: 2em; margin: 0.2em 0; }这段的逻辑是padding-left: 2em给整段留出左侧空间text-indent: -2em把首行往左拉 2em形成「序号顶格、后续行缩进」的悬挂效果。border-left是引用块的竖线如果参考文献不需要竖线把border-left改成none保留内边距即可。参数上2em对应序号[1]的宽度序号更长时可以加到2.5em。margin: 0.2em 0让每条文献之间稍微分开但不要太大参考文献通常连续排列。引用块里的多个段落都会悬挂如果只想让某几条悬挂可以把它们拆成单独的引用块或者改用 HTML 段落加类名但后者在 Typora 里写起来更麻烦日常用引用块足够。5. 常见问题排查五个翻车现场与修复顺序5.1 主题不显示与样式不生效现象一主题菜单里找不到新主题。打开主题文件夹发现文件叫academic-zh.css.txt或者文件被放在主题文件夹的子目录里。原因是系统隐藏了已知扩展名复制时又多带了一层后缀也可能是解压时多套了一个文件夹CSS 在academic-zh/academic-zh.cssTypora 只扫主题文件夹第一层。解决方法是打开「显示文件扩展名」把文件名改成.css结尾再把 CSS 移到主题文件夹根目录。改完重启 Typora菜单里应该出现对应名称。现象二主题能选但样式只生效一半。标题字体变了正文行距没变或者表格还是默认样式。常见原因是academic-zh.user.css里的选择器优先级不够被主题后面的规则覆盖也可能是覆盖文件里写了语法错误导致整段规则被浏览器丢弃。解决方法是先把覆盖文件临时改名确认主主题本身正常再逐段加回覆盖规则。CSS 里少一个分号、多一个花括号后面的规则可能全部失效这种问题没有报错只能靠二分法排查。现象三换电脑后字体全变了。主题里用了本地fonts/目录的字体换机时只复制了 CSS没复制字体目录或者用了系统没有的字体名回退到了默认字体。解决方法是把fonts/一起复制或者在字体栈里把系统自带字体放在前面。更稳的做法是正文和标题都用系统自带宋体类、黑体类字体代码用等宽字体减少对外部字体的依赖。5.2 缩进、编号、分页的连锁问题现象四列表、代码块、表格也缩进了。正文段落加了text-indent: 2em但只写了#write p没有重置子元素。列表项里的段落、引用里的段落、表格单元格里的段落都继承了缩进代码块如果被包在段落里也会中招。解决方法是补上#write li p、#write blockquote p、#write table p、#write .md-fences p这几组重置规则把text-indent设回 0。列表项本身也要重置缩进交给列表标记不要让文字再缩两格。现象五标题编号重复或者导出 PDF 后编号消失。重复编号通常是因为 Markdown 里手写了「## 1. 引言」CSS counter 又插了一个「1」变成「1 1. 引言」。二选一要么删掉手写编号要么关掉 counter。导出后编号消失先确认media print里有没有把::before覆盖掉再看导出的是不是「打印样式」而不是「预览样式」。标题编号和分页也有连锁h2后面如果紧跟表格表格可能被挤到下一页标题留在页底看起来像编号丢了其实是分页把内容拆开了。排查顺序建议从外到内先确认主题文件被加载再确认选择器命中最后确认打印样式。不要一上来就改主 CSS先用覆盖文件加一条显眼规则测试比如给#write加一个临时背景色能看到颜色说明加载链路通了再继续调具体样式。这样比盲改快得多也是我踩过几次坑之后固定下来的顺序。6. 验收与进阶预览和 PDF 不一致时先查这三处6.1 一张样张跑完再改正文改主题最怕拿正文试改坏了回滚麻烦还容易把内容格式带乱。我一般会准备一张固定样张里面放一级标题、三级标题、三段正文、有序列表、表格、代码块、脚注和引用块。每次改完 CSS先拿这张样张导出 PDF检查下面三处再动真实文档。检查项预览看什么PDF 看什么首行缩进正文段落缩两格列表和代码块不缩导出后缩进是否仍然是两字符标题编号二级、三级标题前有没有自动编号编号是否连续、有没有和手写编号重复分页表格、代码块有没有被切断标题是否落在页底表格是否跨页断裂打印样式单独放在media print里和屏幕预览分开调。下面这段是常用补丁A4 纸、页边距、取消编辑区最大宽度、防止标题落在页底、防止表格和代码块跨页断裂。/* 打印样式只影响导出 PDF不影响屏幕预览 */ media print { page { size: A4; margin: 2.5cm 2.2cm; } #write { max-width: none; padding: 0; font-size: 10.5pt; } /* 标题不要单独留在页底 */ #write h2, #write h3 { page-break-after: avoid; } /* 表格、代码块、引用块尽量不跨页 */ #write table, #write pre, #write blockquote { page-break-inside: avoid; } /* 打印时链接不要带颜色和下划线 */ #write a { color: #000; text-decoration: none; } }这段的逻辑是把屏幕预览和打印输出分开page控制纸张和页边距#write在打印时取消最大宽度让内容吃满版心page-break-after: avoid防止标题落在页底page-break-inside: avoid防止表格和代码块被切成两半。font-size: 10.5pt在打印时用绝对单位避免屏幕缩放影响。参数上margin: 2.5cm 2.2cm是上下 2.5cm、左右 2.2cm具体按学校规范改size: A4不要漏否则可能按 Letter 输出。page-break-inside: avoid对特别长的表格不适用长表格该跨页还是会跨页这时只能手动拆表。page在部分导出路径里支持不完整最终以实际 PDF 为准不要只看预览。从那以后我每次改主题都先拿一张带三级标题、表格、代码块和脚注的样张导出 PDF再动正文。希望帮到你。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑