在 XeTeX 中自动调整字母间距(跟踪)

在 XeTeX 中自动调整字母间距(跟踪)

背景:我们知道,在不使用连字符的情况下,获得完全对齐的文本是一个难题,而且必然需要可怕的空格。如果字母间距也可以增加,而不仅仅是单词间距,情况会略有改善。以下是来自soul文档

3.5 卑鄙的伎俩

窄列很难设置,因为它们不允许太多的间距灵活性,因此长单词通常会导致框过满。可以使用宏\so在单个字符之间插入可拉伸性。表 2 显示...

表 2 摘自灵魂文献

中间的是我想要的(虽然不会有那么多字母间距!),在 XeTeX 中。(必须使用 XeTeX,因为文档需要 OpenType 字体,最好是 Unicode 输入,而 LuaTeX 不支持我需要的脚本。)我希望它适用于整本书,而不必用 围绕每个段落\foo{...}

这是一份文件:

\documentclass{article}
\usepackage{fontspec}
\usepackage{polyglossia}
\setmainlanguage{kannada}
\setmainfont{Noto Sans Kannada}

\begin{document}

\hsize=300pt
\hyphenpenalty=10000
\emergencystretch=100em

ಶ್ರೀವನಿತೆಯರಸನೆ ವಿಮಲ ರಾಜೀವ ಪೀಠನ ಪಿತನೆ ಜಗಕತಿ ಪಾವನನೆ ಸನಕಾದಿ
ಸಜ್ಜನನಿಕರ ದಾತಾರ. ರಾವಾಣಾಸುರ ಮಥನ ಶ್ರವಣ ಸುಧಾ ವಿನೂತನ ಕಥನ,
ಕಾರಣ ಕಾವುದಾನತ ಜನವ. ಗದುಗಿನ ವೀರನಾರಯಣ ಶರಣಸಂಗವ್ಯಸನ.
ಭುಜಗಾಭರಣನಮರ ಕಿರೀಟ ಮಂಡಿತಚರಣ ಚಾರುಚರಿತ್ರ. ನಿರುಪಮ ಭಾಳಶಿಖಿನೇತ್ರ
ಕರಣನಿರ್ಮಲ ಭಜಕರಘ. ಸಂಹರಣ ದಂತಿ. ಚಮೂರು ಚರ್ಮಾಂಬರನೆ
ಸಲಹುಗೆ ಭಕುತ ಜನರನು ಪಾರ್ವತೀರಮಣ. ವರಮಣಿಗಳಿಂದೆಸೆವ ಮೌಳಿಯ
ಸರಸಿಜಾರಿಯ ಕಿರಣದೋಳಿಯ ವಿರಚಿಸಿದ ಸಿಂಧೂರಭಾಳದಿ ಕುಣಿವ ಕುಂತಳದ
ಕರಿ ನಿಭಾಕೃತಿಯೆನಿಪ ವದನದ ಕರದ ಪಾಶದ ಮೋದಕದ ವಿಸ್ತರದ ಗಣಪತಿ
ಮಾಡೆಮಗೆ ನಿರ್ವಿಘ್ನದಾಯಕವ.

\end{document}

产生

输出,xelatex

请注意,特别是第 9 行中的第 6 行上的宽空格。我想通过稍微增加该行字母之间的空格(字母间距,又称跟踪)来减少这些空格。

一般来说,当一行内容不够饱满时,我想增加字母之间的间距,增加的量最多为我认为在审美上可以接受的某个限度,但默认情况下保持它们的正常值。(也就是说,只在必要时拉伸,并且只在某个限度内拉伸。)我知道人们对这样做的排版适当性有不同的看法,但在这种情况下,我试图匹配现有书籍的外观,而出版商似乎已经这样做了。

我在此网站上找到的所有问题都是关于不加区别地持续增加字母间距的:

我已经阅读TeX 字母间距常见问题解答并查看letterspacing.tex(记录在TUGboat), 在microtype以及soul,在所有这些中我只找到了“全局增加字母间距”而不是我正在寻找的功能(除了上述来自文档的注释soul)。

答案1

microtype 有一点帮助,但你可以通过字符类添加空格:

在此处输入图片描述

\documentclass{article}
\usepackage{fontspec}
\usepackage{polyglossia}
\setmainlanguage{kannada}
\setmainfont{NotoSansKannada-Regular.ttf}
\XeTeXinterchartokenstate=1
\newXeTeXintercharclass\Kclass
\newXeTeXintercharclass\Kclassb
\makeatletter
\count@"00C80
\loop
\XeTeXcharclass\count@=\Kclass
\ifnum\count@<"00D00
\advance\count@\@ne
\repeat

\XeTeXcharclass"0C81=\Kclassb
\XeTeXcharclass"0C82=\Kclassb
\XeTeXcharclass"0C83=\Kclassb
\XeTeXcharclass"0CBC=\Kclassb
\XeTeXcharclass"0CBE=\Kclassb
\XeTeXcharclass"0CBF=\Kclassb
\XeTeXcharclass"0CC0=\Kclassb
\XeTeXcharclass"0CC1=\Kclassb
\XeTeXcharclass"0CC2=\Kclassb
\XeTeXcharclass"0CC3=\Kclassb
\XeTeXcharclass"0CC4=\Kclassb
\XeTeXcharclass"0CC6=\Kclassb
\XeTeXcharclass"0CC7=\Kclassb
\XeTeXcharclass"0CC8=\Kclassb
\XeTeXcharclass"0CCA=\Kclassb
\XeTeXcharclass"0CCB=\Kclassb
\XeTeXcharclass"0CCC=\Kclassb
\XeTeXcharclass"0CCD=0 % Don't insert hskip before or after this character
\XeTeXcharclass"0CD5=\Kclassb
\XeTeXcharclass"0CD6=\Kclassb
\XeTeXcharclass"0CE2=\Kclassb
\XeTeXcharclass"0CE3=\Kclassb
\XeTeXcharclass"0CF1=\Kclassb
\XeTeXcharclass"0CF2=\Kclassb

\XeTeXinterchartoks\Kclass\Kclass{\nobreak\hskip0pt plus .5pt\relax}
\XeTeXinterchartoks\Kclassb\Kclass{\nobreak\hskip0pt plus .5pt\relax}
\makeatother

\usepackage{microtype}
\begin{document}
\XeTeXinterchartokenstate=1
\hsize=300pt
\hyphenpenalty=10000
\emergencystretch=100em

ಶ್ರೀವನಿತೆಯರಸನೆ ವಿಮಲ ರಾಜೀವ ಪೀಠನ ಪಿತನೆ ಜಗಕತಿ ಪಾವನನೆ ಸನಕಾದಿ
ಸಜ್ಜನನಿಕರ ದಾತಾರ. ರಾವಾಣಾಸುರ ಮಥನ ಶ್ರವಣ ಸುಧಾ ವಿನೂತನ ಕಥನ,
ಕಾರಣ ಕಾವುದಾನತ ಜನವ. ಗದುಗಿನ ವೀರನಾರಯಣ ಶರಣಸಂಗವ್ಯಸನ.
ಭುಜಗಾಭರಣನಮರ ಕಿರೀಟ ಮಂಡಿತಚರಣ ಚಾರುಚರಿತ್ರ. ನಿರುಪಮ ಭಾಳಶಿಖಿನೇತ್ರ
ಕರಣನಿರ್ಮಲ ಭಜಕರಘ. ಸಂಹರಣ ದಂತಿ. ಚಮೂರು ಚರ್ಮಾಂಬರನೆ
ಸಲಹುಗೆ ಭಕುತ ಜನರನು ಪಾರ್ವತೀರಮಣ. ವರಮಣಿಗಳಿಂದೆಸೆವ ಮೌಳಿಯ
ಸರಸಿಜಾರಿಯ ಕಿರಣದೋಳಿಯ ವಿರಚಿಸಿದ ಸಿಂಧೂರಭಾಳದಿ ಕುಣಿವ ಕುಂತಳದ
ಕರಿ ನಿಭಾಕೃತಿಯೆನಿಪ ವದನದ ಕರದ ಪಾಶದ ಮೋದಕದ ವಿಸ್ತರದ ಗಣಪತಿ
ಮಾಡೆಮಗೆ ನಿರ್ವಿಘ್ನದಾಯಕವ.

\XeTeXinterchartokenstate=0


ಶ್ರೀವನಿತೆಯರಸನೆ ವಿಮಲ ರಾಜೀವ ಪೀಠನ ಪಿತನೆ ಜಗಕತಿ ಪಾವನನೆ ಸನಕಾದಿ
ಸಜ್ಜನನಿಕರ ದಾತಾರ. ರಾವಾಣಾಸುರ ಮಥನ ಶ್ರವಣ ಸುಧಾ ವಿನೂತನ ಕಥನ,
ಕಾರಣ ಕಾವುದಾನತ ಜನವ. ಗದುಗಿನ ವೀರನಾರಯಣ ಶರಣಸಂಗವ್ಯಸನ.
ಭುಜಗಾಭರಣನಮರ ಕಿರೀಟ ಮಂಡಿತಚರಣ ಚಾರುಚರಿತ್ರ. ನಿರುಪಮ ಭಾಳಶಿಖಿನೇತ್ರ
ಕರಣನಿರ್ಮಲ ಭಜಕರಘ. ಸಂಹರಣ ದಂತಿ. ಚಮೂರು ಚರ್ಮಾಂಬರನೆ
ಸಲಹುಗೆ ಭಕುತ ಜನರನು ಪಾರ್ವತೀರಮಣ. ವರಮಣಿಗಳಿಂದೆಸೆವ ಮೌಳಿಯ
ಸರಸಿಜಾರಿಯ ಕಿರಣದೋಳಿಯ ವಿರಚಿಸಿದ ಸಿಂಧೂರಭಾಳದಿ ಕುಣಿವ ಕುಂತಳದ
ಕರಿ ನಿಭಾಕೃತಿಯೆನಿಪ ವದನದ ಕರದ ಪಾಶದ ಮೋದಕದ ವಿಸ್ತರದ ಗಣಪತಿ
ಮಾಡೆಮಗೆ ನಿರ್ವಿಘ್ನದಾಯಕವ.

\end{document}

这里我把整个范围赋予了 Kclass 类,但随后又将组合字符重新分配给了 Kclassb 类,这样基数和组合字符之间就不会插入空格。希望它比只使用一个类的第一个版本更具可读性,但由于我看不懂,所以很难确定。如果某些字符可以有比其他字符更大的空格,则可以使用更多类。

相关内容