XeTeX 中西里尔文本的删除线保留连字符

XeTeX 中西里尔文本的删除线保留连字符

我正在寻找在 XeTeX 中创建删除线文本的方法。经过一番谷歌搜索,我找到了两个据称可以做到这一点的软件包:ulemsoul。然而,事实证明,这两个软件包对我的文本都存在一些问题。

ulem不提供自动连字功能,如果我只有几个词需要删除,这可能不是一个问题,但事实并非如此 - 我正在处理相当大的一段文本,手动连字会很困难。

sout如果不进行额外配置,则无法在 XeTeX 中正确处理西里尔文文本:它只会删除标点符号旁边的单词,并吞掉其余文本。它似乎可以很好地与 LaTeX 配合使用,但我想使用 Unicode 字体,这在 XeTeX 中会更容易。

为了说明上述内容,这里有一个小例子:

\documentclass[draft=true]{scrartcl}
\usepackage[cm-default]{fontspec}
\usepackage{xltxtra}
\setmainfont{Palatino Linotype}
\usepackage{polyglossia}
\setdefaultlanguage{russian}
\usepackage{microtype}

\usepackage{ulem}
\usepackage{soulutf8}  

\begin{document}
ulem:

\sout{Сшит колпак не по-колпаковски, вылит колокол не по-колоколовски. 
Надо колпак переколпаковать-перевыколпаковать, надо колокол 
переколоколовать-перевыколоколовать.}\\

soulutf8:

\st{Сшит колпак не по-колпаковски, вылит колокол не по-колоколовски. 
Надо колпак переколпаковать-перевыколпаковать, надо колокол 
переколоколовать-перевыколоколовать.}
\end{document}

其呈现形式如下:

乌勒姆与灵魂的比较

ulem如您所见,变体的行数过多,soul变体完全混乱。所以我想知道是否还有其他方法可以实现我的目标。

答案1

最终我找到了这个讨论:XeTeX 邮件列表中的讨论. 它解释了这种soul行为:

soul.sty 定义固定字体 \SOUL@tt (\font\SOUL@tt=ectt1000),并在分析输入时在各个地方使用它。显然,一旦单词以字体中不存在的字形结尾,就会出现问题,因为这会导致宽度为 0 的框,因此 soul 认为不再有东西需要处理。

后来在该线程中提出了一个解决方案。添加以下代码可使soul西里尔文脚本正常工作:

\makeatletter
\font\SOUL@tt="Palatino Linotype"
\setbox\z@\hbox{\SOUL@tt-}
\SOUL@ttwidth\wd\z@
\makeatother

带有附加选项的灵魂

我不完全理解这里第 3 行和第 4 行的用途。我以为第 2 行就足够了,但只有这一行,我收到了“重建失败”错误消息。soul文档并没有真正说明这一点。

好吧,只要我实现了我的目标我就满意了,但如果有人能解释这些设置如何工作,我将不胜感激。

相关内容