括号内的中文文本不会换行

括号内的中文文本不会换行

在我们的团队中,我们在使用 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}

相关内容