1. 项目概述:为什么LaTeX高亮是个“技术活”?
写论文、做报告,尤其是理工科的朋友,对LaTeX肯定不陌生。它排版出来的公式和文档结构那叫一个漂亮、专业。但不知道你有没有遇到过这样的尴尬:想在PDF里高亮一段关键文字,提醒审稿人或读者注意,结果发现LaTeX自带的\emph{}(强调)只是变个斜体,\textbf{}(加粗)又太生硬,完全不是Word里那种荧光笔划过的效果。这个需求,在准备毕业论文、投稿期刊(尤其是那些要求用LaTeX模板的,比如IEEE、Springer、Elsevier),或者撰写技术报告时特别常见。你辛辛苦苦调整好的公式和参考文献,却因为无法像在Word里那样轻松高亮文本而苦恼,感觉LaTeX在这一点上有点“不近人情”。
其实,LaTeX社区早就提供了多种解决方案,从简单到复杂,从兼容性一般到非常稳定。网上教程很多,但往往要么过于简单只给一个命令,要么过于复杂引入一堆宏包让人望而却步。更头疼的是,不同编译引擎(pdfLaTeX, XeLaTeX, LuaLaTeX)和不同文档类对高亮的支持度还不一样,稍有不慎就会报错,或者在其他人的电脑上编译不出来。所以,找到一个“简单有效”、兼容性好、并且效果稳定的方法,就成了很多LaTeX用户的刚需。今天,我就结合自己多年写论文和报告的经验,把几种主流的高亮方法掰开揉碎了讲清楚,告诉你每种方法的适用场景、潜在坑点,以及我最推荐的那个“一招鲜”方案。
2. 核心方案选型:从color到tcolorbox
给文本上色,最直接的联想就是颜色。LaTeX里处理颜色的宏包很多,我们得根据“高亮”这个特定需求来选型。高亮不是简单的变色,它通常需要背景色,并且最好能跨行、对中文友好、不与数学环境冲突。
2.1 基础方案:\colorbox命令
这是最入门的方法,不需要引入额外的宏包(只要用了xcolor或color),直接使用\colorbox{颜色}{文本}。
% 在导言区引入颜色支持 \usepackage{xcolor} % 在正文中使用 这是普通文本,\colorbox{yellow}{这是被高亮的文本},后面接着普通文本。优点:极其简单,无需学习新语法。缺点:
- 断行问题:
\colorbox生成的是一个不可断行的盒子。如果你的高亮文本很长,它会强行挤在一行,导致溢出页面边界。你只能手动在合适的位置插入\\或\newline来换行,但这会破坏段落结构。 - 间距问题:高亮块与周围文字的上下间距可能不协调,看起来有点“突”。
- 中文支持:对于中文,在有些环境下可能需要额外处理,但基本可用。
注意:
xcolor宏包比color功能更强大,是现代LaTeX文档的首选,建议总是使用\usepackage{xcolor}。
2.2 进阶方案:soul宏包
soul宏包设计初衷就是用于文本装饰,包括下划线、删除线、字母间距调整,以及我们需要的高亮。它最大的优点是支持自动断行。
\usepackage{soul} % 引入soul宏包 \usepackage{xcolor} % 用于定义高亮颜色 % 定义高亮命令,使用soul提供的\hl命令 \sethlcolor{yellow} % 设置高亮颜色为黄色 % 在正文中使用 这是普通文本,\hl{这是一段非常非常长的需要高亮的文本,它可以自动在行末进行换行,而不会导致盒子溢出页面边界,这对于长段落高亮非常友好。},后面接着普通文本。优点:
- 自动断行:解决了
\colorbox的最大痛点。 - 使用简单:一个
\hl{}命令走天下。 - 兼容性较好:对中文支持通常没问题。
缺点与坑点:
- 与某些命令/环境冲突:这是
soul最著名的“坑”。它不能直接用于包含\cite,\ref,\footnote等命令的文本,也不能用于数学环境($...$,\[...\])内部。否则会报错。- 错误示例:
\hl{请参见公式\ref{eq:1}和文献\cite{paper1}}会导致编译错误。 - 错误示例:
\hl{公式 $E=mc^2$ 很重要}也会报错。
- 错误示例:
- 颜色设置:需要用
\sethlcolor{颜色名}预先设置颜色,如果想在文中临时换色比较麻烦。
解决方案:对于包含脆弱命令的文本,可以使用\mbox或\protect进行保护,但这样会破坏高亮的连续性,变得很麻烦。因此,soul适合高亮纯文本段落,一旦涉及交叉引用、脚注、公式,就需要考虑其他方案。
2.3 推荐方案:soulutf8宏包
这是soul宏包的增强版,专门为了解决对UTF-8编码(也就是包含中文、日文等非ASCII字符)文本的支持问题,并修复了原soul的一些小bug。如果你的文档是中文的,或者包含大量特殊字符,强烈推荐使用soulutf8代替soul。
\usepackage{soulutf8} % 使用soulutf8替代soul \usepackage{xcolor} \sethlcolor{lightgray} % 设置为浅灰色,更接近打印效果 % 使用方式完全一样 这是普通文本,\hl{这是一段包含中文的、需要高亮的文本,比如“机器学习”和“深度学习”这些关键词。它同样支持自动换行。}优点:继承了soul的所有优点,同时更好地支持多语言文本,更稳定。缺点:依然无法处理包含\cite,\ref, 数学公式等“脆弱”内容的文本。
2.4 终极方案:tcolorbox宏包
如果你需要高亮的文本不是简单的句子,而是一整段包含公式、列表、引用甚至代码的复杂内容,那么tcolorbox宏包是你的不二之选。它虽然名字叫“colorbox”,但功能远超一个颜色盒子,是一个强大的创建彩色浮动框和盒子的工具。我们可以用它来模拟“高亮”效果。
\usepackage[most]{tcolorbox} % [most]选项载入了常用库,简化配置 \usepackage{xcolor} % 定义一个简洁的高亮环境,去掉所有边框和标题,只留背景色 \newtcbox{\myhl}[1][yellow]{ % 默认黄色,可以传入其他颜色 on line, % 行内模式 arc=0pt, outer arc=0pt, % 直角 colback=#1, % 背景色 colframe=#1, % 边框色(设为和背景一样,就看不见边框了) boxsep=0pt, % 盒子内边距 left=2pt, right=2pt, top=1pt, bottom=1pt, % 微调内边距 before upper=\strut, after upper=\strut, % 保持行高一致 boxrule=0pt, % 边框宽度为0 toprule=0pt, bottomrule=0pt, leftrule=0pt, rightrule=0pt % 确保所有边框线为0 } % 使用方式:作为命令 这是普通文本,\myhl{这里可以高亮任意内容,包括公式 $a^2+b^2=c^2$ 和引用\cite{key}},完全不会报错。优点:
- 无所不能:高亮内容可以包含任何东西——公式、列表、图表引用、脚注,甚至是另一个
tcolorbox。再也不用担心冲突。 - 高度可定制:你可以精细控制背景色、边框、圆角、内外边距、阴影等等,做出非常美观的效果。
- 稳定性极高:基于TikZ图形引擎,非常稳健。
缺点:
- 略微复杂:需要花几分钟定义一下样式(但定义一次,全文受益)。
- 编译稍慢:如果文档中使用了大量极其复杂的
tcolorbox,可能会轻微增加编译时间,但对于高亮这种简单应用,影响可忽略不计。
实操心得:对于99%的LaTeX高亮需求,我的建议是直接使用tcolorbox方案。虽然初期配置比soul多一步,但它一劳永逸地解决了所有兼容性问题。你永远不知道下一次需要高亮的内容里会不会冒出一个\ref或$...$。用tcolorbox,你可以放心地高亮任何内容。
3. 详细配置与实战:打造你的高亮工具箱
纸上得来终觉浅,绝知此事要躬行。下面我们就以最推荐的tcolorbox方案为主,soulutf8方案为辅,搭建一个实用、健壮的高亮工作流。
3.1 环境准备与宏包引入
首先,确保你的LaTeX发行版(TeX Live, MiKTeX, MacTeX等)是最新的。然后,在文档的导言区(\begin{document}之前)正确引入宏包。
\documentclass{article} % 或 report, book, ctexart等 \usepackage{xcolor} % 颜色支持,必须 \usepackage{soulutf8} % 备用方案,用于纯文本高亮 \usepackage[most]{tcolorbox} % 主力方案,[most]选项很重要 % 接下来定义高亮命令和环境提示:
tcolorbox的[most]选项自动加载了几乎所有常用库,避免了手动加载skins,breakable等库的麻烦,对于新手是最佳选择。
3.2 定义主力高亮命令\myhl
我们将定义一个名为\myhl的命令,它有一个可选参数用于指定颜色,默认是黄色(yellow)。
% 定义行内高亮命令 \myhl[颜色]{文本} \NewDocumentCommand{\myhl}{ O{yellow} m }{ % 使用更现代的 \NewDocumentCommand \tcbox[ on line, % 关键:行内盒子 colback=#1, % 背景色 colframe=#1, % 边框色(与背景同色,隐藏边框) boxsep=0pt, % 内容与盒子边缘的间距 left=2pt, right=2pt, top=1pt, bottom=0.5pt, % 微调左右和上下的内部填充,使其更紧凑 before upper=\strut, after upper=\strut, % \strut 确保行高一致,避免文字高低不齐 arc=0pt, outer arc=0pt, % 直角,不要圆角 boxrule=0pt, % 边框线宽度为0 toprule=0pt, bottomrule=0pt, leftrule=0pt, rightrule=0pt % 彻底移除所有边框线 ]{#2} }参数详解:
O{yellow} m:O{yellow}表示第一个参数是可选的(Optional),默认值是yellow;m表示第二个参数是必填的(Mandatory)文本内容。on line: 这是实现行内高亮的关键。没有它,tcolorbox会创建一个不换行的独立盒子,行为类似\colorbox。colback和colframe: 分别设置背景色和边框颜色。设为相同值以隐藏边框。boxsep,left,right,top,bottom: 控制内边距。boxsep是全局设置,再用left等微调。我这里的设置让高亮块在水平方向比文字稍微宽一点,垂直方向非常紧凑,视觉效果更接近荧光笔。\strut: 一个“隐形支柱”,它能确保每一行文本都有相同的高度和深度,避免因为高亮导致行高参差不齐。这是提升美观度的一个小技巧。arc=0pt: 设置盒子的圆角半径为0,即直角。如果你喜欢圆角效果,可以设为arc=2pt。
使用示例:
这是一个测试段落,用来展示\myhl{默认黄色高亮}的效果。 你也可以\myhl[green!30]{使用浅绿色},或者\myhl[cyan!20]{使用更淡的青色}。 高亮内部可以包含公式:\myhl{勾股定理 $a^2 + b^2 = c^2$},也可以包含引用:\myhl{参见章节\ref{sec:method}和文献\cite{author2023}}。3.3 定义备用高亮命令\texthl
虽然\myhl很强,但soulutf8的\hl命令在高亮大段纯文本时,有时断行算法更细腻。我们可以定义一个备用命令,专门处理不包含特殊命令的长段落。
% 定义备用高亮命令(基于soulutf8),仅用于纯文本 \sethlcolor{lightgray} % 设置soulutf8的默认高亮色为浅灰 \newcommand{\texthl}[1]{\hl{#1}} % 简单封装,保持用法一致使用策略:当你明确知道要高亮的是一大段没有任何\cite,\ref,$...$的纯文字时,用\texthl{}。其他所有情况,无脑用\myhl{}。
3.4 定义高亮环境highlightenv
有时候,我们需要高亮的不是一句话,而是连续的好几段文字。这时用命令包裹就不方便了。我们可以定义一个高亮环境。
% 定义高亮环境 highlightenv \newtcolorbox{highlightenv}[1][yellow]{ % 可选参数指定颜色 blanker, % 一个干净的预设样式,去掉了边框和标题 before skip=5pt, after skip=5pt, % 环境前后的垂直间距 left=5pt, right=5pt, top=3pt, bottom=3pt, % 内边距 colback=#1, % 背景色 breakable, % 允许跨页!这是环境相对于命令的最大优势 enhanced jigsaw % 与breakable配合,优化跨页断开的视觉效果 }关键参数:
blanker: 这是tcolorbox的一个内置样式,它移除了所有边框和标题,给我们一个干净的画布。breakable:至关重要!它允许这个彩色盒子在页面底部被断开,一部分留在当前页,剩余部分转到下一页。没有这个选项,长内容的高亮框会整体被推到下一页,留下难看的空白。enhanced jigsaw: 与breakable一起使用,让跨页断开处的边缘更平滑。
使用示例:
\begin{highlightenv}[green!15] % 使用浅绿色背景 这是一段需要被整体高亮的长内容。 它可以包含多个段落。 甚至可以在里面使用列表: \begin{itemize} \item 要点一 \item 要点二 \end{itemize} 或者行内公式 $f(x)$。 \end{highlightenv}4. 颜色选择与视觉优化
高亮是为了突出,不是为了刺眼。颜色选择很有讲究。
4.1 使用柔和的颜色
直接使用yellow可能在某些屏幕上过于鲜艳。xcolor宏包支持颜色混合和定义透明度(通过dvipsnames,svgnames,x11names选项获得更多颜色名,或者使用!语法混合)。
\usepackage[dvipsnames]{xcolor} % 载入更多颜色名称,如`LightGray`, `Apricot`推荐的高亮颜色(在\myhl[颜色]{}或\sethlcolor{颜色}中使用):
yellow!25或yellow!30: 低饱和度的黄色,最接近实体荧光笔。green!15或green!20: 非常淡的绿色,视觉上很舒适。cyan!15: 淡青色。lightgray或gray!10: 浅灰色,专业且不张扬,适合正式文档。Apricot!30: 杏黄色,温暖柔和。
定义自定义颜色:
\definecolor{myhighlight}{RGB}{255, 255, 200} % 一种淡黄色 \definecolor{myhighlight2}{HTML}{E6F3FF} % 一种淡蓝色,使用HTML十六进制码 % 使用 \myhl[myhighlight]{文本} \sethlcolor{myhighlight2}4.2 处理中文与字体
在中文文档(如使用ctex文档类或xeCJK宏包)中,高亮通常没有问题。但需要注意:
- 字体问题:极少数情况下,
soulutf8可能与某些中文字体产生细微兼容性问题。如果遇到,切换到tcolorbox方案几乎总能解决。 - 编译引擎:中文文档通常使用
XeLaTeX或LuaLaTeX编译。tcolorbox和soulutf8对它们都支持良好。确保你的编辑器(如VS Code with LaTeX Workshop, TeXstudio)配置的编译链是正确的。
在VS Code中配置LaTeX Workshop使用XeLaTeX: 在你的settings.json中,可以这样设置:
"latex-workshop.latex.tools": [ { "name": "xelatex", "command": "xelatex", "args": [ "-synctex=1", "-interaction=nonstopmode", "-file-line-error", "%DOC%" ] }, ], "latex-workshop.latex.recipes": [ { "name": "xelatex -> bibtex -> xelatex*2", "tools": ["xelatex", "bibtex", "xelatex", "xelatex"] } ]5. 常见问题与故障排除实录
即使方案再完美,实际使用中也可能遇到各种稀奇古怪的问题。下面是我踩过的一些坑和解决方法。
5.1 编译错误:“Undefined control sequence \hl”
- 问题:使用了
\hl命令,但忘记在导言区加载soul或soulutf8宏包。 - 解决:添加
\usepackage{soulutf8}。
5.2 编译错误:“Argument of @sect has an extra }” 或 “! Paragraph ended before \hl was complete”
- 问题:这是
soul宏包的经典冲突。你试图用\hl高亮包含了\cite,\ref,\footnote, 数学模式($...$)、\verb等“脆弱”(fragile)命令的文本。 - 解决:
- 最佳方案:换用
tcolorbox方案的\myhl命令,它免疫此问题。 - 临时方案:如果非要用
soul,需要对脆弱命令进行“保护”。但非常不推荐,因为会让代码很乱。% 不推荐的做法,仅作了解 \hl{请参见公式\mbox{\ref{eq:1}}和文献\mbox{\cite{paper1}}} % 或者使用 \protect,但效果不一定好
- 最佳方案:换用
5.3 高亮背景色覆盖了文字
- 问题:文字是黑色的,高亮背景色也是深色(如深蓝),导致文字看不清。
- 解决:选择浅色作为高亮背景。遵循“浅背景,深文字”的原则。使用上文推荐的
yellow!25,green!15等。
5.4 高亮导致行间距变大,排版变丑
- 问题:高亮块增加了行内盒子的高度和深度,导致LaTeX为了容纳它而增大了行距,使得段落看起来松散。
- 解决:
- 在
tcolorbox的\myhl定义中,我们已经通过before upper=\strut, after upper=\strut和精细的top,bottom参数来缓解此问题。 - 如果问题依然存在,可以尝试进一步减小
top和bottom的值,例如top=0.5pt, bottom=0pt。 - 对于
soul,这个问题不那么明显,但如果出现,可以尝试在\hl外套一个\smash命令(需引入amsmath宏包):\smash{\hl{...}}。但这可能会让高亮背景与上下行文字有轻微重叠。
- 在
5.5 高亮框不能跨页(仅针对tcolorbox环境)
- 问题:使用
highlightenv环境高亮很长内容时,整个盒子被推到了下一页,当前页留下大片空白。 - 解决:在定义环境时,必须加入
breakable和enhanced jigsaw这两个关键选项。确保你的定义中包含它们。
5.6 在列表环境(itemize, enumerate)内使用高亮导致缩进错乱
- 问题:在
\item后面直接使用高亮命令,可能会干扰列表的缩进机制。 - 解决:
- 将高亮内容用花括号
{}包裹起来:\item {\myhl{高亮内容}}。 - 或者,更稳妥的方法是,在
\item之后先开始一个段落:\item \myhl{高亮内容}(注意空格)。对于tcolorbox环境,通常直接使用即可。
- 将高亮内容用花括号
5.7 与hyperref宏包(用于生成超链接)的潜在冲突
- 问题:
hyperref宏包通常最后加载。如果高亮命令(特别是soul)与其冲突,可能导致PDF书签或链接错误。 - 解决:
- 确保
hyperref宏包在几乎所有其他宏包之后加载(除了极少数例外,如cleveref)。 - 使用
tcolorbox方案通常兼容性更好。你可以在加载tcolorbox时传入hyperref选项来获得更好的集成:\usepackage[most, hyperref]{tcolorbox}。
- 确保
5.8 高亮文本在生成的PDF中无法被正确搜索或复制
- 问题:这是由高亮的实现方式导致的。
soul和tcolorbox(默认)创建的是纯粹的图形元素,文字信息可能对PDF阅读器的搜索/复制功能不友好。 - 解决:
- 对于
tcolorbox,在定义\myhl时,可以尝试添加text选项,这能改善文本层信息:\tcbox[on line, colback=#1, colframe=#1, ..., **text**]{#2}。但效果因阅读器而异。 - 对于追求完美可访问性(如符合无障碍标准)的文档,可能需要更复杂的方案,但这超出了普通高亮的需求。对于绝大多数情况,当前方案生成的PDF在Adobe Reader、Preview等主流阅读器中搜索和复制是没问题的,可能只是在复制时会连带一些空白。
- 对于
6. 完整示例模板与使用建议
最后,给出一个整合了所有方案的、开箱即用的模板。你可以将其复制到你的文档导言区。
\documentclass{article} \usepackage[dvipsnames]{xcolor} % 颜色支持 \usepackage{soulutf8} % 备用方案:纯文本高亮 \usepackage[most, hyperref]{tcolorbox} % 主力方案,并兼容hyperref % ====== 定义主力高亮命令 ====== % 用法: \myhl[颜色]{文本}, 颜色可选,默认为浅黄 \NewDocumentCommand{\myhl}{ O{yellow!25} m }{ \tcbox[ on line, colback=#1, colframe=#1, boxsep=0pt, left=2pt, right=2pt, top=0.5pt, bottom=0pt, before upper=\strut, after upper=\strut, arc=0pt, boxrule=0pt, toprule=0pt, bottomrule=0pt, leftrule=0pt, rightrule=0pt ]{#2} } % ====== 定义备用高亮命令 (用于长纯文本) ====== \sethlcolor{LightGray!40} % 设置soulutf8的默认色 \newcommand{\texthl}[1]{\hl{#1}} % 简单封装 % ====== 定义高亮环境 (用于多段落/复杂内容) ====== % 用法: \begin{highlightenv}[颜色] ... \end{highlightenv} \newtcolorbox{highlightenv}[1][yellow!25]{ blanker, before skip=6pt plus 1pt minus 1pt, % 增加弹性间距 after skip=6pt plus 1pt minus 1pt, left=6pt, right=6pt, top=4pt, bottom=4pt, colback=#1, breakable, enhanced jigsaw } % ====== 其他文档设置 ====== \usepackage{blindtext} % 仅用于生成示例文本 \usepackage{hyperref} % 记得在最后加载(tcolorbox已通过选项兼容) \begin{document} \section{高亮功能测试} 这是一个测试段落,展示\myhl{默认黄色高亮}。 也可以使用\myhl[green!20]{自定义颜色},比如这个浅绿色。 高亮内包含公式:\myhl{爱因斯坦质能方程 $E=mc^2$} 和引用:\myhl{参见图\ref{fig:test}}。 \subsection{长文本高亮对比} 使用\texttt{soulutf8}高亮长纯文本:\texthl{\blindtext}。它在这里表现良好。 使用\texttt{tcolorbox}高亮长纯文本:\myhl{\blindtext}。它同样可以工作,并且能处理内部格式。 \subsection{高亮环境测试} \begin{highlightenv}[Apricot!30] % 使用杏黄色背景 这是一个高亮环境内的段落。环境适合高亮连续的多段内容。 这是第二段。环境可以跨页(如果内容足够长)。 环境内可以包含列表: \begin{itemize} \item 项目一 \item 项目二,包含一个\myhl{行内高亮} \end{itemize} 也可以包含数学公式: \[ \int_{-\infty}^{\infty} e^{-x^2} dx = \sqrt{\pi} \] \end{highlightenv} 环境外的正常文本。 \end{document}最终使用建议:
- 日常使用:将上述模板中的定义部分复制到你的论文或报告模板的导言区。之后在文中,绝大多数情况下只使用
\myhl{}命令。它简单、强大、兼容性好。 - 处理长纯文本:如果你高亮的是一整段没有任何特殊命令的英文或中文叙述,并且对
soul的断行效果有偏好,可以使用\texthl{}。 - 高亮大块区域:如果需要高亮一个定理、一个例子、或者连续的几个段落,使用
highlightenv环境。 - 颜色选择:在提交给期刊或用于正式打印的文档中,建议使用
LightGray,gray!10,yellow!25这类非常浅的颜色,避免影响印刷清晰度。在屏幕阅读的幻灯片或报告中,可以使用稍鲜艳的颜色。
高亮功能虽小,却能极大提升文档的可读性和重点信息的传递效率。希望这套经过实战检验的方案,能让你在LaTeX写作中彻底告别高亮焦虑,把精力真正集中在内容创作上。