当前位置: 首页 > news >正文

XeLaTeX 中文删除线自动换行问题的解决方案

摘要: 本文旨在解决在 XeLaTeX 环境下,为中文文本添加删除线时遇到的无法自动换行的普遍问题。文章对比了 ulemsoul 等常见方案的局限性,并最终提出并详细解释了使用 ulem 宏包结合 xeCJKfntef 宏包的稳定解决方案。

1. 问题描述

在 XeLaTeX 环境下使用 ctexxeCJK 宏包处理中文文档时,一个常见的需求是为文本(如修订稿中的删除内容)添加删除线。理想的效果是,当这段文本过长需要换行时,删除线也能随之在行末断开,并在下一行继续。

然而,标准的解决方案往往无法满足这一需求。

2. 常见方案及其局限性
2.1 ulem 宏包

ulem 宏包提供的 \sout 命令是添加删除线的常用方法。

  • 问题: 该命令不支持自动换行。其原理是将内容放置于一个不可断开的盒子(box)中,导致长文本和删除线一起溢出页面边界。
2.2 soul 宏包

为解决 ulem 的换行问题,soul 宏包应运而生。它的 \st 命令支持文本换行。

  • 问题: soul 宏包在处理中文环境时表现不稳定。当删除线内的文本包含由 ctexxeCJK 处理过的中文标点(如 )时,极易触发 Package soul Error: Reconstruction failed 的编译错误。这是因为 soul 的文本扫描机制无法处理 xeCJK 为优化排版而生成的复杂内部结构。
3. 推荐解决方案:ulem + xeCJKfntef

经过测试,目前在 XeLaTeX 环境下最稳定、轻量的解决方案是联合使用 ulem 宏包与 xeCJKfntef 宏包。

  • 工作原理:

    1. ulem 宏包提供基础的删除线命令 \sout
    2. xeCJKfntef 宏包作为 xeCJK 环境的增强工具集,它包含一个关键功能:修正 ulem 的内部机制,使其能够识别中文字符的边界并正确处理断行。
    3. 此外,xeCJKfntef 还提供了一个增强版的删除线命令 \CJKsout,它不仅解决了换行问题,还允许对删除线和文本的格式进行分别定制。
  • 核心优势:

    • 稳定性高: 专门为 CJK 环境设计,与中文标点兼容性好,不会出现 soul 包的崩溃问题。
    • 功能强大: \CJKsout 命令提供了 format(定义删除线格式)和 textformat(定义文本格式)等选项,方便进行颜色等样式的定制。
    • 轻量级: 无需引入 tikz 等大型绘图引擎,编译速度快。
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 环境下实现可自动换行的中文删除线功能的用户而言,ulemxeCJKfntef 宏包的组合提供了一个稳定、高效且易于定制的解决方案。

http://www.dtcms.com/a/390971.html

相关文章:

  • R语言中的因子(Factor)详解 factor_path <- as.factor(char_path)
  • 软件测试之⾃动化测试常⽤函数(沉淀中)
  • 火山引擎多模态数据湖:基于 Daft 与 Lance,构筑 AI 时代数据湖新范式
  • 关于强化学习的一篇经典学习文章
  • 【JavaScript 性能优化实战】第四篇:webpack 与 vite 打包优化实战
  • maven-profile实现springboot多版本配置打包
  • OpenLayers地图交互 -- 章节二:绘制交互详解:从基础几何到复杂图形的完整绘制方案
  • Java 工厂模式 + 策略模式实战:工具管理器的设计与实现
  • 污水处理厂远程调试与智能化运维解决方案
  • 【提示工程】Ch2-提示技术(Prompt Technique)
  • vLLM - Worker
  • GitHub上面仓库名写错了,怎么改
  • 项目中的图形验证码是前端还是后端实现?
  • ✅ 基于Scrapy与朴素贝叶斯的校园舆情监测与预警系统 Django+B/S架构 可视化大屏 机器学习
  • Unity UI 插件 | Easy Popup System
  • AI证件照制作 API 快速生成证件照
  • @RequestParam和 @RequestBody能一起用吗
  • 构建高效的电商爬虫代理池:从架构设计到实战优化
  • 使用cJSON库实现JSON与C结构体的互转
  • Cursor :Python 运行路径设置自定义模块导入报错:No module named ‘xxx’ 的解决方案
  • 数图信息科技亮相唐山社区零售论坛,数字化赋能行业高质量发展
  • LLM大模型 - 实战篇 - Assistant API 原理与实战应用
  • python微博舆情分析系统 情感分析 爬虫 机器学习 新浪微博 数据采集 大数据技术(源码)✅
  • FreeRTOS消息队列剖析讲解(思路+源码)
  • Trillium Engineering-无人机万向节有效负载 - 用于战术 UAS 的 EO 和 EO/IR 无人机相机万向节
  • 【Linux网络】Socket编程预备
  • pyAutoGUI 模块主要功能介绍-(4)消息框功能
  • 自学嵌入式第四十三天:硬件方面-ARM体系架构
  • PDF清晰度提升的幕后英雄:ImprovePdf
  • 《中国垒球规则》快投垒球局面规则·垒球5号位