我正在寻找在 XeTeX 中创建删除线文本的方法。经过一番谷歌搜索,我找到了两个据称可以做到这一点的软件包:ulem
和soul
。然而,事实证明,这两个软件包对我的文本都存在一些问题。
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
文档并没有真正说明这一点。
好吧,只要我实现了我的目标我就满意了,但如果有人能解释这些设置如何工作,我将不胜感激。