在我们的团队中,我们在使用 babel 和 etoc 包并使用 xelatex 进行编译时遇到了中文文本换行的问题。只有当内容放在括号范围内时才会出现此问题。由于我们使用循环将总共 16 种语言的文件导入文档,因此我们依赖于该范围。它对所有其他语言都适用。
因此,这实际上发生在一个非常复杂的设置中,我们绝对需要大括号,但我们能够将其分解为以下 MWE:
\documentclass[a4paper]{article}
\usepackage[english]{babel}
\babelprovide[import]{chinese}
\usepackage{fontspec}
\setmainfont{FandolSong-Regular.otf}
\usepackage{etoc}
\begin{document}
{ % Usage of this brace triggers the problem
\selectlanguage{chinese}
\localtableofcontents
\section{简体中文}
简体中文简体中文。简体中文,简体中文。简体中文简体中文。简体中文,简体中文。简体中文简体中文。简体中文,简体中文。简体中文简体中文。简体中文,简体中文。简体中文简体中文。简体中文,简体中文。简体中文简体中文。简体中文,简体中文。简体中文简体中文。简体中文,简体中文。简体中文简体中文。简体中文,简体中文。简体中文简体中文。简体中文,简体中文。简体中文简体中文。简体中文,简体中文。
简体中文简体中文。简体中文,简体中文。简体中文简体中文。简体中文,简体中文。简体中文简体中文。简体中文,简体中文。简体中文简体中文。简体中文,简体中文。简体中文简体中文。简体中文,简体中文。简体中文简体中文。简体中文,简体中文。简体中文简体中文。简体中文,简体中文。简体中文简体中文。简体中文,简体中文。简体中文简体中文。简体中文,简体中文。简体中文简体中文。简体中文,简体中文。
} % Usage of this brace triggers the problem
\end{document}
如果没有括号,换行符是可以的。如果加上括号,行就会超出页面范围。(第一次编译运行后,换行符仍然没有问题。您必须编译两次。)
这里中文需要额外的选项吗?这是 babel 或 etoc 的一个 bug 吗?
注意:我们知道使用 lualatex 进行编译时不会出现此问题。但是目前无法切换到 lualatex,因为我们遇到了该引擎的大量性能问题 - 但这是另一个话题 ;)
答案1
经过一些实验,我认为\XeTeXlinebreaklocale
在作用域方面表现不佳。有时似乎是全局的,有时似乎是局部的。要么是我遗漏了什么,要么是 中存在一些错误xetex
。这是我在上面的评论中考虑的解决方法,遵循了 @UlrikeFischer 的建议,诚然,它效率不高。只需在加载后添加etoc
:
\addto\localtableofcontents{%
\expandafter\selectlanguage\expandafter{\languagename}}
这将重新选择当前语言并因此重置\XeTeXlinebreaklocale
。
答案2
换行由 的设置控制\XeTeXlinebreaklocale
。这是一个全局设置,因此会忽略组:
\documentclass[a4paper]{article}
\usepackage{fontspec}
\setmainfont{FandolSong-Regular.otf}
\begin{document}
\XeTeXlinebreaklocale "zh"
简体中文简体中文。简体中文,简体中文。简体中文简体
中文。简体中文,简体中文。简体中文简体中文。简体中文,简体中文。简体中文简体
中文。简体中文,简体中文。简体中文简体中文。简体中文,简体中文。简体中文简体
中文。简体中文,简体中文。简体中文简体中文。简体中文,简体中文。简体中文简体
中文。简体中文,简体中文。简体中文简体中文。简体中文,简体中文。简体中文简体
中文。简体中文,简体中文。
{\XeTeXlinebreaklocale ""
简体中文简体中文。简体中文,简体中文。简体中文简体中文。简体中文,简体中
文。简体中文简体中文。简体中文,简体中文。简体中文简体中文。简体中文,简体中
文。简体中文简体中文。简体中文,简体中文。简体中文简体中文。简体中文,简体中
文。简体中文简体中文。简体中文,简体中文。简体中文简体中文。简体中文,简体中
文。简体中文简体中文。简体中文,简体中文。简体中文简体中文。简体中文,简体中
文。}
简体中文简体中文。简体中文,简体中文。简体中文简体中文。简体中文,简体中
文。简体中文简体中文。简体中文,简体中文。简体中文简体中文。简体中文,简体中
文。简体中文简体中文。简体中文,简体中文。简体中文简体中文。简体中文,简体中
文。简体中文简体中文。简体中文,简体中文。简体中文简体中文。简体中文,简体中
文。简体中文简体中文。简体中文,简体中文。简体中文简体中文。简体中文,简体中
文。
\end{document}
现在,当你切换语言时,babel 还会将适当的语言切换写入 toc(和 aux 文件):
\babel@toc {english}{}\relax
\babel@toc {chinese}{}\relax
\etoc@startlocaltoc {1}
\contentsline {section}{\numberline {1}简体中文}{1}{}%
\babel@toc {english}{}\relax
如果目录中的最后一种语言是英语,它将\XeTeXlinebreaklocale
全局重置为空,因此您的换行不再起作用。
在复杂的文档中,不容易控制哪种语言切换位于目录末尾,因此最好将目录后的语言重置为正确的语言。
答案3
这不是对 OP 问题的直接回答,而是建议可能有一个相当简单的解决方案:从 XeLaTeX 切换到 LuaLaTeX。当然,OP 的代码在 LuaLaTeX 下编译得很好,无论有没有花括号。
% !TEX TS-program = lualatex
\documentclass[a4paper]{article}
\usepackage[english]{babel}
\babelprovide[import]{chinese}
\usepackage{fontspec}
\setmainfont{FandolSong Regular}
\usepackage{etoc}
\begin{document}
{ % Usage of this brace no longer triggers the problem
\selectlanguage{chinese}
\localtableofcontents
\vspace{7mm}\hrule % <-- new
\section{简体中文}
简体中文简体中文。简体中文,简体中文。简体中文简体中文。简体中文,简体中文。简体中文简体中文。简体中文,简体中文。简体中文简体中文。简体中文,简体中文。简体中文简体中文。简体中文,简体中文。简体中文简体中文。简体中文,简体中文。简体中文简体中文。简体中文,简体中文。简体中文简体中文。简体中文,简体中文。简体中文简体中文。简体中文,简体中文。简体中文简体中文。简体中文,简体中文。
简体中文简体中文。简体中文,简体中文。简体中文简体中文。简体中文,简体中文。简体中文简体中文。简体中文,简体中文。简体中文简体中文。简体中文,简体中文。简体中文简体中文。简体中文,简体中文。简体中文简体中文。简体中文,简体中文。简体中文简体中文。简体中文,简体中文。简体中文简体中文。简体中文,简体中文。简体中文简体中文。简体中文,简体中文。简体中文简体中文。简体中文,简体中文。
} % Usage of this brace no longer triggers the problem
\end{document}