LaTeX字体字号设置完全指南:从字族命令到中文字体切换
1. 从为什么改不生效说起字族命令与字体的生效范围先问一个问题你在Word里把一段文字选中点一下宋体就能换字体但在LaTeX里输入\textbf{你好}这段文字真的变成黑体了吗大概率没有——它只是把中文部分做了伪粗体处理底层字体仍然是宋体。这个认知差异正是大部分人第一次在LaTeX里折腾字体时最懵的地方。LaTeX的字体系统跟Word是两套逻辑。Word是所见即所得选中即改改的是字符本身的格式属性而LaTeX是宏包驱动的排版系统字体切换靠的是命令而且这些命令有明确的作用范围分组作用域。你写{\huge 这段变大}只有花括号里的内容变大你写\huge 这段变大那从这行开始后面所有内容都会变大一直大到下一个字号命令出现为止。这就是很多人改了没反应或者反应过头了的根本原因。以文档类为基础LaTeX默认提供了三个字族font family字族命令对应常见字体使用场景Roman罗马体\textrm{}/\rmfamilyTimes、Latin Modern Roman正文默认用于论文、书籍主体Sans Serif无衬线体\textsf{}/\sffamilyHelvetica、Source Sans标题、图表标注、演示文稿Typewriter等宽体\texttt{}/\ttfamilyCourier、Consolas代码块、路径、函数名、命令行这三个字族对应了两类用法一类是文本命令拿花括号包住目标文字如\texttt{code}另一类是声明命令切换当前作用域内的默认字族如{\ttfamily 这段是等宽字体}。新手最容易踩的第一个坑在LaTeX里改了字族但中文字体没跟着变。原因很简单——默认的LaTeX是给英文设计的中文字体需要额外的宏包支持而中文字库的切换命令通常是独立的比如\songti、\heiti跟西文的\rmfamily、\sffamily不是一回事。这个我在第3章会详细展开因为它是中文学术写作场景中最容易出问题的地方。2. 字号命令速查表从\tiny到\Huge以及那些看着差不多但就是不对的细节LaTeX的预定义字号命令一共有十个档位\tiny、\scriptsize、\footnotesize、\small、\normalsize、\large、\Large、\LARGE、\huge、\Huge。用起来很简单{\tiny 极小号} {\small 小号} {\normalsize 标准} {\large 大号} {\Huge 超大号}但这里有一个关键细节同一字号命令在不同文档类选项下的实际磅值pt是变化的。LaTeX文档类可以指定全局基准字号常见的是\documentclass[10pt]{article}、\documentclass[11pt]{article}、\documentclass[12pt]{article}。基准字号不同\normalsize对应的磅值就不同其余所有字号档位也都随之整体缩放。拿12pt文档举例几个常用档位的实际对应关系是命令实际字号12pt文档类下大致中文称呼\tiny6pt七号/小七号\scriptsize8pt小五号偏小\footnotesize9pt小五号\small10.95pt五号偏小\normalsize12pt小四号\large14.4pt四号\Large17.28pt三号\LARGE20.74pt二号\huge24.88pt一号\Huge24.88pt以上具体由类文件决定初号/小初号这个对应关系是我用实际排版结果对比出来的因为很多期刊模板比如Neurocomputing的Elsevier模板对字号有硬性要求你投出去之前最好知道自己用的命令到底对应的是几号字。比如审稿意见常写摘要用小五号对应到12pt文档里你应该用\footnotesize而不是\small。还有一个容易忽略的坑\normalsize永远锚定当前文档类的基准字号。如果你在[12pt]文档里用\small写了一行字然后下一段直接写正文正文字号会自动回到\normalsize也就是12pt。但如果你用了\fontsize{9pt}{12pt}\selectfont这种底层命令那从这行开始后面的所有文字都会停留在9pt除非你主动用\normalsize切回。所以我的建议是能不用底层命令就别用用完了立刻切回。关于中文语境下的仿宋、楷体、黑体等字号的精确切换必须依赖中文宏包提供的接口接下来重点说这个。3. 中文字体切换ctex方案与字体冲突实战排查如果你在论文里写中文几乎绕不开ctex宏包或者ctexart、ctexrep等文档类。ctex的价值在于它帮你把中文字体、排版习惯、章节格式统一接管了你要做的只是在导言区声明\usepackage[fontsetwindows]{ctex}或者直接用\documentclass{ctexart}。我以最常见的场景为例——用XeLaTeX编译、Windows系统、希望正文宋体、标题黑体、强调楷体\documentclass[12pt]{ctexart} \begin{document} 中文测试这是默认宋体。 {\heiti 这是黑体} {\kaishu 这是楷体} {\fangsong 这是仿宋} \end{document}对应关系非常直觉ctex声明命令对应中文字体页面效果\songti宋体SimSun正文标准\heiti黑体SimHei各级标题、强调\kaishu楷体KaiTi引文、批注、散文风\fangsong仿宋FangSong公文、摘要、规范文件这里要重点提醒别把\heiti当成粗体去用它跟西文的\textbfbold完全是两码事。\textbf对中文来说通常只是做伪粗体处理真正的黑体是一套独立字库字形上是等宽的笔画而不是加粗。很多人为了强调一句话直接上\heiti整个段落看起来像标题反而不协调。更规范的做法是中文正文强调用\textbf保持统一标题层级用\heiti拉开视觉层次。3.1 字体冲突ctex找不到字体的三种典型表现中文字体这个模块我实际踩过的坑比LaTeX本身多得多尤其在国内Linux发行版麒麟、统信UOS上写论文的时候。三个典型表现第一提示No font SimSun found。这是最常见的情况——ctex会按照fontset自动去系统里找宋体找不到就报错。解决方案有两条路一是安装字体把ttf/otf字体放到~/.fonts或者/usr/share/fonts里二是让ctex退回内置的Fandol字体\usepackage[fontsetfandol]{ctex}。Fandol是ctex自带的开源中文字库缺字不多应急完全够用但字形跟宋体有细微差异投期刊前记得跟编辑确认。第二编译通过但中文全是方框/乱码。这种通常是编码问题不是因为字体缺失。解决办法很直接用XeLaTeX配合ctex时默认要求而不是pdfLaTeX保证源文件UTF-8编码不再做任何额外的编码转换。一个常见的坑是有些编辑器会偷偷把文件保存成GBK/GB2312你编译半天全是乱码先在编辑器里把编码改回UTF-8。第三安装了字体但ctex还是找不到。这种最恼火。我遇到过一次明明fc-list里能看到SimSun但ctex依然报错。这是因为Windows下的中文字体通常是ttc格式TrueType Collectionctex的某些旧版本处理不了ttc。解决的办法是下载单发的ttf格式宋体放到字体目录或者直接换用\setCJKmainfont{SimSun}这种fontspec级别的指定方式\usepackage{fontspec} \usepackage{xeCJK} \setCJKmainfont{SimSun} \setCJKsansfont{SimHei} \setCJKmonofont{FangSong}这样写的好处是路径明确、依赖系统字体管理缺点是换了机器就得重新确认字体存在。在团队协作或投稿场景下我会优先推荐\usepackage[fontsetwindows]{ctex}让它自己去探测只有当你明确知道某个字体缺失且无替代时才手动指定单字体。3.2 解决改一个地方全文跟着变的作用域问题很多人在章节标题里改字体字号发现目录、页眉、参考文献全跟着变了。这又回到第一节说的作用域问题。ctex宏包本身对标题字体有一套管理机制章节标题默认按\heiti渲染你要改的是标题格式宏比如\ctexset里的配置而不是直接改变全局字体。举个例子\ctexset{ section { format \large\heiti, nameformat {\zihao{4}}, } }这里的\zihao是ctex提供的字号命令参数用中文习惯的中文数字比如\zihao{4}就是四号字\zihao{-4}是小四号。这套符号体系比\large、\Large更贴近中文排版习惯尤其适用于有明确几号字要求的学位论文模板。用\zihao{-4}还是\zihao{4}一个负号之差就是小四和四号的区别这种细节在盲审阶段经常是评审老师最先注意到的问题。4. 精确控制字号与自定义字族fontspec底层逻辑一劳永逸前面讲的方法基本能覆盖论文写作、报告排版的九成场景。但如果你做简历、幻灯片、海报、或者要完全匹配某个投稿模板的特殊要求标准的十个字号档位就不够用了。比如模板要求正文9.5pt标题15.75pt你用\large、\large±几档完全拼不出来。这时候就必须动用LaTeX的底层字号命令{\fontsize{9.5pt}{12pt}\selectfont 这里是正文}\fontsize有两个参数第一个是字号磅值第二个是行距磅值baselineskip。很多人只改第一个参数不改第二个结果文字变大了行与行之间挤成一团或者拉得过分空旷。我自己写简历的时候有一条经验行距取字号的1.3到1.5倍看起来最舒服。以9.5pt字号为例行距设在12.35pt即1.3倍比较紧凑设在14pt约1.47倍则宽松透气。实际用的时候可以先从1.3起步再微调。\selectfont的作用是让前面的\fontsize设置真正生效两者必须搭配使用只写\fontsize{}{}不写\selectfont等于白写。4.1 自定义新字族从每次重写到一条命令搞定当你需要频繁切换某种特定的中文字体西文字体组合时最好自己定义一个命令省得每次写一长串。用fontspec宏包可以这样做\usepackage{fontspec} \usepackage{xeCJK} % 定义一个新的中文无衬线字体命令 \newfontfamily\cnlight[Scale0.9]{Source Han Sans SC} \newCJKfontfamily\cnkai{KaiTi} {\cnlight 这是思源黑体的轻盈效果} {\cnkai 这是楷体段落适合强调手写质感}定义完好后续使用只需要在花括号里写命令名完全不用记忆底层字体名。这里有个小技巧[Scale0.9]表示缩放到基础字号的90%因为中文字体默认字面通常比西文偏大混排时中文不缩小一点会显得格外突兀。比例怎么调多排几行实际看看目标就是让中西文混排的视觉重量基本一致。4.2 行距与字号的联动改完字号不调行距的下场还有一个高频翻车点——行距。很多模板把正文设为小五号9pt但行距还是默认的1.2倍结果整个页面看起来又挤又闷。LaTeX里行距和字号是分开管理的字号变了行距不会自动跟着变除非用\fontsize同时设置了第二个参数。常见做法有两种% 方式一全局行距 \linespread{1.5} % 方式二局部精确控制 {\fontsize{10.5pt}{16pt}\selectfont 行距约1.52倍}论文场景下一般学校要求是小四号字、1.5倍行距对应\linespread{1.5}这个命令就可以。但要注意\linespread设置的是一个缩放系数的倍数它作用于全文它也不影响数学公式和表格中的行距。如果你是在表格里调整字号行距更可控的做法是只针对表格区域设置{\small \begin{tabular}{...} ... \end{tabular} }表格里字号变化之后行高问题通常在\renewcommand{\arraystretch}{1.2}这里调把网格整体撑开一点效果比逐行调\vspace干净得多。5. 常见投稿模板的字号适配Elsevier、学位论文、简历场景实操建议这一章是我自己写了几十篇不同要求文档之后摸索出的通用流程直接照着做能省下大量跟模板搏斗的时间。5.1 根据投稿要求换算字号很多期刊提供LaTeX模板但模板的默认字号可能跟稿约要求不完全一致。稿约常写正文小四号或双倍行距而模板实际是10pt基准加单倍行距。第一步永远是打开模板的documentclass那一行看基准字号是多少。如果稿约要求小四号≈12pt直接改\documentclass[12pt]{article}让系统全局适配。如果稿约只说了正文五号≈10.5pt那就保持10pt基准正文用\normalsize对应10pt基本贴合。如果某种特殊要求必须用非标磅值比如作者信息文字9pt那就用\fontsize{9pt}{12pt}\selectfont局部处理并确保改完后立刻\normalsize切回。很多Elsevier模板的坑在于模板默认的\normalsize是10pt但正文里还有表格、脚注、参考文献前缀这些局部字号设置你改动全局字号后这些局部设置需要重查一遍。我的习惯是编译出来后自己量一下PDF里几处文字的实际pt值用PDF阅读器的文本属性就能看到别用肉眼猜。5.2 标题、页眉、目录的字号调整路径经常有同学问标题字是不是调得越大越好答案是遵循模板定义优于手动覆盖。LaTeX的目录、页眉、章节号是自动交叉引用的如果你手动改了章节标题的字号很容易出现正文里标题很大目录里标题却仍是原样的不一致。标准做法是用ctexset或titlesec这两个宏包来统一管理标题格式。以titlesec为例\usepackage{titlesec} \titleformat{\section} {\Large\bfseries} % 标题样式 {\thesection} % 编号格式 {1em} % 编号和标题之间的间距 {} \titlespacing{\section} {0pt} % 左间距 {12pt} % 段前间距 {6pt} % 段后间距目录里的字号单独由\cftsecfont这类命令控制跟正文标题是两套配置。如果你在正文里改了标题字号目录还保持原样属于正常现象不要在正文里去强行改目录字号除非你确实需要目录层级区分更明显。5.3 简历场景一页纸的字号节奏最后聊个跟学术写作关系不大但很多人实际在弄的场景——LaTeX简历模板。简历模板通常对字号非常敏感因为核心目标就是一页纸塞下所有内容。我自己的经验参数是元素字号设置行距设置姓名\fontsize{22pt}{26pt}\selectfont26pt左右章节标题\fontsize{12pt}{16pt}\selectfont16pt正文条目\fontsize{10pt}{13pt}\selectfont13pt辅助信息时间、地点\fontsize{9pt}{12pt}\selectfont12pt简历场景最大的坑不是字号本身而是字号改完间距失衡。因为简历的排版密度很高每一行的行距、每个section之间的垂直间距都会显著影响整体观感。我通常在调完所有字号之后从头到尾把整页截图看一下有没有某个区块明显偏挤或偏空然后局部微调\vspace而不是全局调整。这样能保证一页纸的信息密度均匀。另外一个容易被忽视的细节是简历里的中文字体很多人直接用宋体排出来偏公文体不够现代。我建议中文简历正文可以用Source Han Sans SC思源黑体这类无衬线中文字体配合西文的Helvetica或者Inter整体风格更利落。做法就是用第4章的\newCJKfontfamily自定义一个新的中文字族然后正文段落切过去。实测下来同一份简历从宋体换到思源黑体视觉年龄至少年轻五岁招聘方对审美在线的第一印象会好不少。6. 换字体后的检查清单与看起来差不多陷阱改字体字号是一个不报错不等于正确的任务。LaTeX编译通过不代表字体真的生效了。我提炼了一份自查清单每次提交模板之前会过一遍确认编译引擎中文字体切换必须用XeLaTeX或LuaLaTeX用pdfLaTeX编ctex文件很多字体命令会直接报错或者静默降级。在PDF里点选文字看实际字体用阅读器的属性面板比如Adobe Acrobat的文本属性检查选定文字的字体名。这一步是铁证比看起来像靠谱得多。检查作用域是否泄漏在某段末尾加一个探测字符比如X把该段前后的字号对比一下确保声明命令确实只在需要范围内生效。检查中西文混排的基线对齐中文和西文同一段落里行高差异明显19.5pt的中文配12pt的西文会导致整行视觉重心不稳。把\setCJKmainfont的Scale调低一档或者手动调整\fontsize让两种文字的x-height近似。检查数学环境里的中文如果论文里有中文描述的数学公式比如其中x表示...这里的文字默认是数学斜体中文部分需要切到\textrm{}或\text{}里否则字形会异常。\text{}是amsmath宏包提供的标准接口比\mbox{}在间距处理上更自然。关于看起来差不多陷阱我再多说两句。很多人觉得宋体跟Fandol仿宋差不多改完字体编译通过就完事。但盲审老师对字体是敏感的而且有些学校有严格的格式规范会在答辩时用模板对照检查。就算字体A和字体B长得再像PDF元数据里记录的字体名完全不一样用程序一扫描就露馅。所以不要嫌麻烦投稿或提交前花两分钟做一次字体名检查能避免很多后续问题。7. 一个完整的实操小例子从导言区到正文把前面所有内容落到一个具体例子上。假设我现在要写一篇文章正文宋体小四一级标题黑体三号摘要楷体五号代码段等宽字体投给一个要求正文小四、1.5倍行距的国内期刊。\documentclass[12pt]{ctexart} \usepackage{geometry} \geometry{margin2.5cm} % 1.5倍行距 \linespread{1.5} % 标题样式黑体三号 \ctexset{ section { format \heiti\zihao{3}, } } \begin{document} \section{研究背景} 这是正文默认就是小四号宋体、1.5倍行距不需要额外设置。 \begin{quote} {\kaishu\zihao{5} 这是楷体五号的摘要或引文。} \end{quote} 代码段演示\texttt{model.fit(X_train, y_train)} \end{document}这个例子把本文大部分核心命令串起来了ctexart管中文字体\zihao管中文习惯字号\linespread管行距\heiti、\kaishu做字族切换。你在自己项目里遇到的具体要求基本就是把这些命令按需组合。我在实际使用中发现最省事的做法是给自己维护一个小文档里面放一段字号字体速测模板把十个预定义字号、四种中文字体、两三种自定义字体全部排在一页里并附上编译后的字体名对照。这样每次开新项目直接把模板复制过去看一遍心里就有数了不需要反复试错。这个方法我用了快十年每次帮同事排查字体问题时都用它做基准也算是在这上面踩过很多坑之后沉淀下来的一个小工具。