XeLaTeX 中文删除线自动换行问题的解决方案
摘要: 本文旨在解决在 XeLaTeX 环境下,为中文文本添加删除线时遇到的无法自动换行的普遍问题。文章对比了 ulem
和 soul
等常见方案的局限性,并最终提出并详细解释了使用 ulem
宏包结合 xeCJKfntef
宏包的稳定解决方案。
1. 问题描述
在 XeLaTeX 环境下使用 ctex
或 xeCJK
宏包处理中文文档时,一个常见的需求是为文本(如修订稿中的删除内容)添加删除线。理想的效果是,当这段文本过长需要换行时,删除线也能随之在行末断开,并在下一行继续。
然而,标准的解决方案往往无法满足这一需求。
2. 常见方案及其局限性
2.1 ulem
宏包
ulem
宏包提供的 \sout
命令是添加删除线的常用方法。
- 问题: 该命令不支持自动换行。其原理是将内容放置于一个不可断开的盒子(box)中,导致长文本和删除线一起溢出页面边界。
2.2 soul
宏包
为解决 ulem
的换行问题,soul
宏包应运而生。它的 \st
命令支持文本换行。
- 问题:
soul
宏包在处理中文环境时表现不稳定。当删除线内的文本包含由ctex
或xeCJK
处理过的中文标点(如,
、(
、“
)时,极易触发Package soul Error: Reconstruction failed
的编译错误。这是因为soul
的文本扫描机制无法处理xeCJK
为优化排版而生成的复杂内部结构。
3. 推荐解决方案:ulem
+ xeCJKfntef
经过测试,目前在 XeLaTeX 环境下最稳定、轻量的解决方案是联合使用 ulem
宏包与 xeCJKfntef
宏包。
-
工作原理:
ulem
宏包提供基础的删除线命令\sout
。xeCJKfntef
宏包作为xeCJK
环境的增强工具集,它包含一个关键功能:修正ulem
的内部机制,使其能够识别中文字符的边界并正确处理断行。- 此外,
xeCJKfntef
还提供了一个增强版的删除线命令\CJKsout
,它不仅解决了换行问题,还允许对删除线和文本的格式进行分别定制。
-
核心优势:
- 稳定性高: 专门为 CJK 环境设计,与中文标点兼容性好,不会出现
soul
包的崩溃问题。 - 功能强大:
\CJKsout
命令提供了format
(定义删除线格式)和textformat
(定义文本格式)等选项,方便进行颜色等样式的定制。 - 轻量级: 无需引入
tikz
等大型绘图引擎,编译速度快。
- 稳定性高: 专门为 CJK 环境设计,与中文标点兼容性好,不会出现
4. 代码实现
以下是一个完整的最小工作示例(MWE),展示了如何定义一个满足需求的修订命令 \ruixu
。
% !TEX program = xelatex\documentclass{ctexart}% --- 导言区 ---% 1. 颜色支持
\usepackage{xcolor}% 2. 解决方案的核心:
% 首先加载 ulem 作为基础。
\usepackage{ulem}
% 然后加载 xeCJKfntef 对其进行中文环境下的修正和增强。
\usepackage{xeCJKfntef}% 3. 定义自定义修订命令 \ruixu
% 用法: \ruixu{被删除的旧文本}{新增的新文本}
\newcommand{\ruixu}[2]{%% 使用 \CJKsout 命令处理删除文本% 它接受一个可选参数用于格式化:% - format: 定义删除线本身的格式。这里设置为红色。% - textformat: 定义被划掉的文本的格式。这里也设置为红色,以符合视觉习惯。{\CJKsout[format=\color{red}, textformat=\color{red}]{#1}}%% 在删除内容和新增内容之间加一个空格\ %% 新增的文本使用 \textcolor 设置为蓝色\textcolor{blue}{#2}%
}% --- 文档主体 ---
\begin{document}\section{方案效果展示}\subsection{长句换行测试}
\noindent % 取消段首缩进以便观察
\ruixu{前述实验结果系统性地验证了XXX框架,特别是其核心的XXXX机制,在XXX方面的有效性与鲁棒性。}{前述实验结果已系统性验证了XXXX 框架(尤其其XXXX机制)在抑制XXXX方面的有效性与鲁棒性。}\vspace{1cm}\subsection{包含多种标点的长句测试}
\noindent
\ruixu{这是一个非常长的、用来演示的句子,目的是为了确认 \texttt{xeCJKfntef} 宏包提供的删除线功能是否真的可以像普通文本那样,在到达页面边界时自动地、优雅地进行换行处理(即使包含括号)。它能处理“中文引号”吗?答案是肯定的!}{与此同时,这是新增的文本部分,它应该能够和前面的删除文本和谐地共存并一起参与排版。}\end{document}
5. 效果展示
6. 总结
对于需要在 XeLaTeX 环境下实现可自动换行的中文删除线功能的用户而言,ulem
与 xeCJKfntef
宏包的组合提供了一个稳定、高效且易于定制的解决方案。