珠海网站建设专业公司邯郸兄弟建站
摘要: 本文旨在解决在 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 宏包的组合提供了一个稳定、高效且易于定制的解决方案。
