拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

LaTeX字体字号修改全指南:从文档类到局部控制

LaTeX字体字号修改全指南:从文档类到局部控制 写LaTeX文档久了会发现一个特别反直觉的现象排版引擎本身提供了非常灵活的字体控制能力但真正用起来传统工具链给文档设定字体时选项远没有Word那么直观。刚上手或者用模板写到一半想调整标题、表格、代码块字号时十个人有九个会在各种命令之间反复试错。这篇文章就把我在实际写作中积累的字体字号修改方法完整梳理一遍从最基础的文档类选项到局部调字号的精细控制再到CTeX中文字体和自定义命令全部给出来可以直接抄作业。1. 先厘清思路LaTeX修改字体字号的两条主线我一直觉得弄明白LaTeX的字体机制比记住几个命令重要得多。整个体系可以拆成两条主要路径来理解。第一条路径是文档类级的“全局字阶”就是你在\documentclass里看到的那几个选项。article、report、book这些标准文档类默认支持三个级别10pt、11pt、12pt。注意这里只能在这三个值里选一个写13pt会直接报错自定义类或KOMA-Script除外。这个设定其实是沿用TeX引擎的古老传统——现代排版系统用pt作为基本单位而LaTeX内核只预定义了三个字阶。实际写作时期刊模板一般要求10pt书籍通常偏好12pt这是我在实际使用中最常遇到的初始选择。第二条路径是“局部字阶”也就是在正文任意位置临时调整字号。LaTeX内核里预置了十档命令从\tiny到\Huge它们是按倍数关系排列的每档大约按1.2倍递增相当于音乐里的十二平均律思路。这里有个原则性认知\small、\large等等不是“加上去就变大”的开关它们是“声明式”命令从使用位置起到当前组结束全文生效。所以要在某个段落末尾用{\large 这是一个大号标题}这种花括号局部作用域包起来否则后面的文字全部会受影响。搞明白这两条主线之后剩下的问题就变成了改哪个位置改多大改什么字体衬线、无衬线还是等宽这三层需求正好对应文档类选项、字阶命令、字体族命令串起来就能覆盖绝大部分场景。很多人一开始会忽略“组(Group)”这个概念直接导致“后面所有文字都变大了”的经典翻车现场。所谓组就是一对花括号{ ... }围起来的作用域也可以是环境比如\begin{center}到\end{center}。所有在上述声明式命令在组结束时都会自动失效这是理解局部字阶的关键。举个例子{\large 这里变大}结束之后后面文字恢复原状。如果你在一个环境里写了\large没加括号这个环境结束的位置就是天然的作用域边界。掌握这个逻辑之后局部字体控制基本不会再出错。2. 基础操作文档类选项与标准字阶命令2.1 文档类字阶的整体选择最常用的设置方式是这样\documentclass[12pt]{article}如果什么都不写默认是10pt。这与我们平时看到的Word默认五号字约10.5pt相比LaTeX的10pt显得偏小。尤其打印论文或者给导师审阅时建议直接用12pt阅读体验会好很多。如果模板里已经定义了11pt你又想全局变大可以直接改成12pt试试多数标准类都能正常工作。这里补充一个常见误解[12pt]改变的是正文的基准字号而各级标题、脚注、页码的字号是按这个基准按比例缩放推导出来的不是每个元素都单独写死。所以当你全局从10pt切到12pt时\section标题也会相应变大整体比例保持协调。这个设计思路跟Word的“正文样式-标题样式”联动有异曲同工之妙。\documentclass[12pt]{article} \begin{document} 正文会以12pt为基准排版。 \end{document}如果某些期刊模板硬性要求11pt那就不能任性改。很多时候模板自带的\documentclass里直接写死了这时再去加[12pt]会冲突轻则报错重则模板样式错乱。我的经验是先打开主.tex文件看\documentclass那行确认有没有类选项再决定在哪里改。2.2 十档字阶命令对照LaTeX预置的字阶命令从大到小我用一张表整理出来对比方便查阅命令对应字号近似视觉感受\tiny5pt极小只适合脚注内嵌或表格角落\scriptsize7pt脚注大小适合表格辅助文字\footnotesize8pt标准脚注字号\small9pt比正文略小适合证明细节、注释\normalsize10pt默认正文大小随文档类变化\large12pt小标题、强调段落\Large14.4pt一级标题、章节标题\LARGE17.28pt大标题、书名\huge20.74pt封面标题级别\Huge24.88pt最大极端情况使用注意这十档是“声明式命令”。声明式命令和“参数式命令”有本质区别参数式命令像函数调用消费掉一个参数声明式命令则是在当前位置打开一个“开关”。因此使用时要格外小心作用域。正确写法是这样的{\large 这一段会变大。} 后面恢复正常。 \begin{quote} \small 整个引用块变小。 \end{quote}这里有一个实战细节经常被忽略如果把\large直接写在段落中间而没有分组那么这个段落从\large开始到段落结尾都会变大但下一段又会恢复。为什么因为LaTeX的段落结束时会隐式地关闭一个组。所以有时你看到“只变一段”的效果其实不一定是你写对了可能是段落的边界帮你兜底了。我自己的习惯是永远显式使用花括号分组不依赖这种隐式规则这样逻辑清晰通用性也强。2.3 精确字号设置用\fontsize和\selectfont内置十档不够用怎么办比如海报、PPT、或者论文封面需要“正好16.5pt”这就要用更底层的两个命令{\fontsize{16.5pt}{19.8pt}\selectfont 这是一个精确字号的文本}\fontsize有两个参数第一个是字号第二个是行距。行距参数很关键在LaTeX里它一般取字号乘以1.2所以16.5pt配19.8pt16.5×1.2正好。写\fontsize{16.5pt}{20pt}当然也行只是行距视觉上会稍微松一点。这一组命令配合前文说的\normalsize有个等价关系\normalsize本质上也是调用\fontsize加上一系列间距参数。区别在于\normalsize是预先算好的“规范值”\fontsize则允许你自由指定。所以当模板给出的字号不是标准档位时直接用\fontsize是唯一可靠方案。我对这个命令的定位是“特殊尺寸专用”常规场景还是用\large这类命令更好因为LaTeX里字号的连带效应段间距、行距、缩进会跟着一起调整而手写\fontsize需要自己处理所有连带影响。3. 字体族切换拉丁字体与中文工具的联动3.1 三种标准字体族的切换LaTeX内核预设了三类字体族对应英文排版的经典三类\textrm{...}罗马体衬线体正文默认\textsf{...}无衬线体类似Arial或Helvetica\texttt{...}等宽体类似Courier或Consolas它们的适用范围有讲究。论文正文一定是罗马体强调词汇时如果全用\textbf会显得太粗暴有时换成\textsf反而能在视觉上有一种“中性强调”的效果。表格里我常用\small\textsf组合让表头从正文中脱离开来整体清爽不少。代码和路径则必须用\texttt因为它保证每个字符等宽这对URL、文件名、函数名的一致性和对齐至关重要。切换命令格式上有两种写法\textsf{这段文字无衬线} {\sffamily 这段也无衬线且持续生效直到组结束}\textsf是“参数式命令”只作用于花括号里的文字适合嵌入短语\sffamily是“声明式命令”影响从当前位置到组结束的所有内容。我的经验是短词用\textsf长段落用{\sffamily ...}。这个原则适用于所有字体族命令包括\rmfamily、\ttfamily。另外这两个系列还有对应的“伪粗体”版本\textbf、\textsf{\textbf{...}}等组合起来可以实现精致的排版层次。罗马体、无衬线体、等宽体这三种字体族之间的切换我画成一个可以套用的基本骨架{\sffamily\large 无衬线大字标题} {\ttfamily\small 等宽小字用于代码片段或路径} \textrm{默认罗马体正文}嵌套使用时小心一点{\sffamily \textbf{文字}}里先声明无衬线族再启用粗体最后效果是“无衬线粗体”。顺序上声明命令先写参数命令包在外面这个顺序是LaTeX语法自然决定的习惯了就好。3.2 CTeX中文字体的实际用法在中文环境中ctex宏包或文档类几乎成了标配。它的出现解决了中文LaTeX长期以来的老大难中文没有统一的字体接口。用XeLaTeX引擎编译时ctex可以自动调用系统中文字体Windows下通常是宋体、黑体、楷体、仿宋macOS下是宋体-简、黑体-简、楷体-简、仿宋-简Linux下则需要手动指定。最省事的方案直接写\documentclass[fontsetwindows]{ctexart} % 或者 fontsetmac / fontsetfandolfontset选项可以指定系统字体集。如果你不知道自己的字体环境用fontsetfandol最保险因为Fandol字体是一套开源中文字体随TeX发行版自动安装不依赖系统。我测试过fandol的显示效果宋体部分跟中易宋体略有差异但改格式提交论文时完全够用。ctex提供了一套中文对应的字族命令\songti宋体正文默认\heiti黑体标题常用\kaiti楷体引言、注释常用\fangsong仿宋公文风格这些也是声明式命令按前文原则使用{\heiti\large 这是黑体大号标题} {\kaiti 这是楷体正文适合引用或批注。}需要注意ctex里这些命令与\textrm这类拉丁命令完全独立中文和英文混排时各自按各自字体渲染。同一个段落里中文走宋体英文走默认罗马体通常是Computer Modern或Times这是正常现象不要觉得是bug。还有一个高频需求全局把中文正文设置成某个字体比如“全文档我要楷体”。可以用\ctexset{ punctquanjiao, } \renewcommand{\songti}{...} % 这种方式不推荐实际上ctex提供了更优雅的方案\documentclass[fontsetwindows, zihao12]{ctexart} % zihao12 相当于直接给整个文档设定为12pt基准zihao选项最直观地对应中文排版的“字号”概念zihao5是五号约10.5ptzihao4是小四约12ptzihao3是三号约16pt。写论文时直接zihao12对应小四最省心。这也是ctex比原生LaTeX更友好的地方。3.3 用fontspec宏包自由指定字体如果已经用了ctexart再想针对西文或者某些特殊字体做调整fontspec宏包是XeLaTeX引擎下最灵活的字体接口。通过\setmainfont、\setsansfont、\setmonofont可以指定任意已安装字体\usepackage{fontspec} \setmainfont{Times New Roman} \setsansfont{Arial} \setmonofont{Consolas}这行配置之后全文正文就变成Times New Roman了标题用Arial代码用Consolas。这里有个容易犯错的地方\setmainfont{Times New Roman}用的是系统字体名称不同系统可能略有差异。Windows下写Times New Roman没问题macOS下也通用。如果字体名带空格或者特殊字符推荐使用\setmainfont{Times New Roman}[LigaturesTeX]可以开启常见的Ligature特性如fi、fl连字这对英文阅读体验提升明显。有人会问fontspec和ctex的关系是什么其实ctex在XeLaTeX下底层已经加载了xeCJK而xeCJK本质上也是fontspec扩展出的中文接口。所以两者不是二选一而是经常配合使用用ctex处理中文用fontspec处理西文。一个常见的初始化骨架\documentclass[fontsetwindows]{ctexart} \usepackage{fontspec} \setmainfont{Times New Roman} \setmonofont{Consolas} \setsansfont{Arial}这样配置的结果是中文宋体英文Times代码Consolas。这是我最常用的学术写作组合实测下来很稳而且在不做任何额外调整的情况下打印效果和PDF阅读效果都相当规范。4. 进阶技巧按需定制字号与字体风格4.1 给文档类添加自定义字号选项有一些模板需要用到非标准字号作为全局基准比如某些课程报告要求14pt。直接写\documentclass[14pt]{article}会直接报错因为标准类不支持这个值。这时有两条路第一种用\usepackage{anyfontsize}它能让\fontsize接受任意数值不被限制在10-12pt。配置方式\usepackage{anyfontsize} \renewcommand{\normalsize}{\fontsize{14pt}{16.8pt}\selectfont}注意\renewcommand{\normalsize}这个操作它会把默认的字号定义覆盖成你指定的值。效果上全文所有标记为“正文大小”的文字都会变成14pt段落间距也会相应调整。第二种如果不想改全局\normalsize而是希望在\documentclass[12pt]基础上标题或者某部分用18pt直接用{\fontsize{18pt}{21.6pt}\selectfont 我需要18pt的大字号}这比第一种更克制不会影响正文其他元素。我个人其实不太推荐动\normalsize因为它影响面太广可能之后的表格、脚注、页眉都会跟着变排查起来比较费劲。如果只是为了个别元素局部\fontsize足够了。4.2 自定义一个“新命令”来复用字号样式如果文档里频繁出现同一种字号和字族组合比如“每个例题的小标题都用\large\sffamily\bfseries”每次手写这一串很容易漏掉或者弄错。更好的做法是定义一个新命令\newcommand{\exmplhead}[1]{{\large\sffamily\bfseries #1}}然后正文里写\exmplhead{例题1} 具体内容……这个命令的作用是接收一个参数用“大号无衬线粗体”渲染它。这样写的好处一目了然以后想统一改“示例标题”的样式只改一处定义全文同步更新。这对长文档尤其重要——我写博士论文时曾经因为要改所有标题的字号全局搜索替换了三次后来学乖了所有可复用的样式全部定义成命令改一处即可。更进一步可以定义带默认参数的命令生成一个“假环境”\newcommand{\noteblock}[1]{% \par\medskip {\small\itshape\noindent\textbf{Note:}\ #1} \par\medskip }调用方式\noteblock{这里是一个需要注意的细节以斜体呈现。}这里用\par\medskip保证上下留白\noindent消除段首缩进。这些细节组合在一起做出的效果贴合书籍排版里“注记块”的观感。4.3 字号与字族组合的综合案例把前面讲到的思路整合起来我放一个我在实际写作中经常使用的“混合字体”案例。假设要写一段代码说明文字我希望代码本身等宽小字代码前面的说明用楷体代码后面的总结用宋体{\kaiti 下面这段代码演示如何设置字体} {\ttfamily\small \begin{verbatim} \documentclass[12pt]{article} \usepackage{ctex} \begin{document} \end{document} \end{verbatim} } {\songti 以上代码可用XeLaTeX直接编译。}这种“字体提示代码文字说明”的结构在技术文档里非常常见。通过不同字体族切换读者一眼就能区分代码和正文不需要额外加大量分隔符。表格中的字号处理也是一个常见场景行数多的时候默认字号太大很容易撑爆表格。我常用的做法{\small \begin{tabular}{ccc} A列 B列 C列 \\ 1 2 3 \\ \end{tabular} }如果表格实在太大可以考虑用\resizebox配合字号调整。但我的原则是能控制字号就别缩放缩放的表格字体看起来会变形打印时清晰度也受影响。5. 实战经验常见问题排查与避坑指南5.1 字号命令作用域失控这是新人翻车最多的地方。症状正文中间写了\large结果后面所有段落都变大了。原因没有加花括号分组或所使用的环境边界比预想更大。排查思路找到目标文本的上一级组边界逐层向外面看。举个例子\begin{document} \large 正文内容…… \end{document}这里\large写在\begin{document}之后没有额外分组作用域会持续到\end{document}全文都是大号。正确写法\begin{document} {\large 只这几句变大。} 正文恢复正常。 \end{document}我自己的习惯是任何可能影响范围超出一个段落的声明式命令都要显式加花括号。而且花括号要紧贴着命令和内容的边界避免出现多余空格影响排版判断。5.2 CTeX编译引擎与字体兼容性中文字体设置最典型的问题是 “Missing character: There is no ... in font ...” 或者编译直接卡住。通常原因是编译器选错了引擎、字体集设置与实际系统不匹配。解决方案使用ctexart或ctex文档类时一定用XeLaTeX编译TeXStudio中快捷键一般是工具→命令→XeLaTeX或点击“XeLaTeX”按钮不要用pdfLaTeX。fontsetwindows只在Windows系统有效macOS用fontsetmacLinux如果不确定就用fontsetfandol。如果仍然出现缺字体报错执行fc-list :langzhLinux/macOS查看系统已装中文字体。在Windows下我遇到过的坑是某些电脑只装了Office默认的中文字体正常场景下fontsetwindows没问题但如果精简版系统删掉了“仿宋”等字体编译到\fangsong时就会报缺失。稳妥的做法是全局都用fandol等于自带字体包完全绕开系统依赖。5.3 数学模式中的字号设置数学公式中的字号控制跟文本不太一样。文本中的\large不适用于数学模式。在数学环境里需要使用\displaystyle、\textstyle、\scriptstyle等或者用\larger这样的宏包命令\usepackage{relsize} \[ \larger[2] x^2 y^2 z^2 \]relsize宏包的\larger[n]可以让公式按字号档位整体放大\smaller[n]缩小。没有这个宏包时数学公式一般继承环境所在文本的字号所以“把公式变大”最朴素的办法还是把外层文本字号调大{\large \[ x^2 y^2 z^2 \] }因为\[ ... \]是数学显示环境外层分组仍然有效。我实际写文档时尤其在讲推导细节需要强调重点公式时常用这个技巧。在表格或脚注里公式则自然继承表格/脚注的\small等字号不必手动处理。5.4 字号修改与页面布局的关系调整字号后有一件事总被忽略字号的全局变化可能引发页面边距、行距、段距的连锁反应。12pt的正文比10pt需要更大的行距如果模板的行距写死了比如某些期刊模板用\baselineskip固定值就会出现文字重叠或者行距过密。解决方案是给全局设置行距\usepackage{setspace} \setstretch{1.5} % 1.5倍行距常见于学位论文或者用\linespread{1.3}直接调整基线拉伸倍率。注意\linespread应该在正文开始前设置。一般而言12pt配1.3倍行距、Times New Roman字体是学术论文最常见的组合。我用博士论文模板时就靠这几个设置统一解决了“字号变大但行距没跟上”的违和感。还有一个页面布局细节局部改字号可能导致\section标题与前后文字的间距失衡。比如标题字号变大但\vspace还是默认值视觉上标题离上文很近、离下文很远。这时用\titlespacingtitlesec宏包微调\usepackage{titlesec} \titlespacing*{\section}{0pt}{20pt}{10pt}这个命令的三个数值分别是左缩进、上方间距、下方间距。我自己实践下来中文文档加上\CTEXsetup或\ctexset配合 titlesec 调整标题间距是常规操作。6. 一套拿来即用的字体设置模板写到最后我把最常用的一套模板贴出来这个模板我用了很多年兼容四个不同编译环境处理中文和西文都靠谱也是我每次新建文档的起点。% !TEX program xelatex \documentclass[fontsetfandol, zihao12]{ctexart} % 西文字体设置 \usepackage{fontspec} \setmainfont{Times New Roman} \setsansfont{Arial} \setmonofont{Consolas} % 使字号命令可用任意值 \usepackage{anyfontsize} % 行距设置 \usepackage{setspace} \setstretch{1.3} % 自定义命令示例标题 \newcommand{\exhead}[1]{{\large\sffamily\bfseries #1}} \begin{document} \section*{概要} {\kaiti 这是一段楷体引言适合展示风格差异。} 正文默认宋体小四英文Times New Roman {\large 这里是局部放大文字}正常文字恢复原状。 \exhead{自定义命令效果} 只需要输入命令就能获得一致的标题样式。 \end{document}把这套模板拆开逐项看第一行% !TEX program xelatex是给TeXStudio、VS Code LaTeX插件看的编译引擎标注双击编译时自动选择XeLaTeX省去手动切换。fontsetfandol保证任意系统都能编译通过不会因为本机字体缺失而报错。zihao12把中文文档的基准字号定为小四符合多数中文课程报告、学期论文的要求。setstretch{1.3}给出比较舒适的行距既不像单倍那么挤也不会太稀疏。自定义命令把样式集中管理后面正文里无需重复写一串样式声明。这套模板在Windows和macOS上都跑过配合TeXLive 2021以上版本、CTeX套装基本不会出问题。唯一需要留意的是fontspec里的字体名必须在系统里存在如果实际环境中没有Times New Roman或ConsolasLinux常见把\setmainfont那几行注释掉或者换成系统已有的Liberation Serif等即可。字体字号控制是所有LaTeX基本功里的基本功但正是因为看起来简单反而很少有人系统梳理过。写这篇的起因是我在答辩前一周帮同学改论文格式发现他对\large和\large{}的区别完全蒙圈愤而改了几十处。希望这篇总结能帮你绕开我当年踩过的那些坑。把前四章的思路连贯起来后就会发现LaTeX的字体逻辑其实非常自洽先定全局字号基调再用十档标准命令和\fontsize处理局部精确需求最后用字体族命令区分中文、西文和代码。熟练之后改字号这件事就是顺手的事真正的时间应该花在内容本身。
返回列表