复合字符的字距调整问题

复合字符的字距调整问题

我正在尝试排版一本使用罗马尼亚语变音符号的书。由于我必须使用特定字体,所以我必须使用类似这样的字体来“构造”字符:

\newcommand\chara {a}
\newcommand\charA {A}
\makeatletter
\def\kernbrevea#1{\kern#1\dimexpr0.47em-\strip@pt\fontdimen1\font\dimexpr-0.2em\relax\relax}
\def\kernbreveA#1{\kern#1\dimexpr0.56em-\strip@pt\fontdimen1\font\dimexpr-0.34em\relax\relax}
\makeatother

\catcode`\ă=\active
\def ă{\raisebox{.0em}\u\kernbrevea{-}{\chara}\kernbrevea{+}\kernbrevea{-}}

\catcode`\Ă=\active
\def Ă{\raisebox{.24em}\u\kernbreveA{-}{\charA}\kernbreveA{+}\kernbreveA{-}}

结果令人满意。我设法构建了对使用我需要的 truetype 文件的支持(按照我在网上找到的各种教程),它似乎工作正常,除了当这个字母在段落的行末结束的情况。就像这样:

带有短字母的 a 显然没有与文本的其余部分右对齐,而它应该是

我怀疑上面的 \def 命令后面的代码有问题,但我不得不承认我对 LaTeX 完全是新手,我放弃了尝试理解所列命令的语法……我几乎没有改变地从另一个示例中获取它们,而且可能非常愚蠢,我不知道。有人能帮我解决这个问题吗?

我知道我应该切换到另一种没有问题的字体,但不幸的是,我必须使用 ElegantGaramond 的这个特定变体。

谢谢你!

后期编辑

好的,两个主要问题已经解决:使用罗马尼亚语变音符号和损坏的(可能)字体。LaTeX 尽了最大努力,让我能够展示这些。

但现在我有一个恼人的问题。这是我隔离的代码,其中包含了我感兴趣的所有内容:

\documentclass[10pt,a4paper,openany]{book}
\usepackage[utf8]{inputenc}

\usepackage[T1]{fontenc}
\usepackage[romanian]{babel}
\usepackage{pxfonts}

\usepackage{eg}
\pdfmapfile{+eg.map}

\begin{document}

\newcommand\chara{a}
\newcommand\charA{A}
\newcommand\chars{s}
\newcommand\charS{S}
\newcommand\chart{t}
\newcommand\charT{T}

\makeatletter
\def\kernbrevea#1{\kern#1\dimexpr0.47em-\strip@pt\fontdimen1\font\dimexpr-0.2em\relax\relax}
\def\kernbreveA#1{\kern#1\dimexpr0.56em-\strip@pt\fontdimen1\font\dimexpr-0.34em\relax\relax}
\makeatother

\catcode`ă =\active
\def ă{\raisebox{.0em}\u\kernbrevea{-}{\chara}}

\catcode`Ă=\active
\def Ă{\raisebox{.24em}\u\kernbreveA{-}{\charA}\kernbreveA{+}\kernbreveA{-}}


\catcode`ş=\active
\def ş{\c{\chars}}
\catcode`Ş=\active
\def Ş{\c{\charS}}
\catcode`ţ=\active
\def ţ{\c{\chart}}
\catcode`Ţ=\active
\def Ţ{\c{\charT}}

Some test text using romanian diacritics:

şŞţŢăĂîÎâÂ

Kerning: hăh măh xăx VĂV WĂW

\end{document}

渲染效果如下图所示:

在此处输入图片描述

因此文本看起来不错,但出现了一些不需要的内容。显然,两次出现的“=,”不是故意的……好吧,我可以理解是“\catcode`\ă=\active”行中的某些内容产生了这种情况,因为在日志中我有以下内容:

! Missing number, treated as zero.
<to be read again> 
                   \protect 
l.26 \catcode`ă
                 =\active
A number should have been here; I inserted `0'.
(If you can't figure out why I needed to see a number,
look up `weird error' in the index to The TeXbook.)


! Package inputenc Error: Keyboard character used is undefined
(inputenc)                in inputencoding `utf8'.

See the inputenc package documentation for explanation.
Type  H <return>  for immediate help.
 ...                                              

l.26 \catcode`ă
                 =\active
You need to provide a definition with \DeclareInputText 
or \DeclareInputMath before using this key.

! Missing number, treated as zero.
<to be read again> 
                   \protect 

并且 ș 定义会产生两个类似的错误。我不明白的是为什么其他定义(形式或语法显然相同)没有产生错误?

我制作了一个 zip 文件all.zip 可在 wetransfer 上获取 10 天它可能包含重现文档的所有文件,以防有人想要复制问题。很可能我对 LaTeX 一窍不通,无法理解问题出在哪里。我所能做的就是困惑地看着代码……

感谢您的帮助。

答案1

问题是如果紧排字符后面紧跟着粘连符(比如一个空格),它就会变成可行的换行点,并且会和后面的粘连符一起在换行处消失。

但是,就你的情况而言,字距,因此只有第二个可以被视为换行符,而第一个保持不变(这是一个正字距)。

我不明白两个尾随的字距相互抵消的原因(除非后面跟着粘连符)。

只需将其移除即可。

对你的宏有一个不同的建议,假设\u{a}并且\u{A}不会产生正确的输出:

\documentclass{article}
\usepackage[latin2]{inputenc}

\newcommand{\abreve}{\addbreve{a}}
\newommand{\Abreve}{\addbreve{A}}

\newcommand{\addbreve}[1]{%
  \leavevmode\vbox{\offinterlineskip
    \ialign{\hfil##\hfil\cr\u{}\cr\noalign{\vskip-1ex}#1\cr}%
  }%
}

\catcode`ă=\active \protected\def ă{\abreve}
\catcode`Ă=\active \protected\def Ă{\Abreve}
\lccode`Ă=`ă
\uccode`ă=`Ă

\begin{document}

destinată să

\MakeUppercase{destinată să}

\end{document}

您可以更自由地调整重音的间距和定位,也许可以对 ă 和 ă 的情况进行不同的分支。

在此处输入图片描述

如果使用utf8as 编码,方法应该有点不同:

\documentclass[10pt,a4paper,openany]{book}
\usepackage[utf8]{inputenc}

\usepackage[T1]{fontenc}
\usepackage[romanian]{babel}
\usepackage{pxfonts}
\usepackage{newunicodechar}
\usepackage{etoolbox}

\usepackage{eg}
\pdfmapfile{+eg.map}

\makeatletter
\def\kernbrevea#1{\kern#1\dimexpr0.47em-\strip@pt\fontdimen1\font\dimexpr-0.2em\relax\relax}
\def\kernbreveA#1{\kern#1\dimexpr0.56em-\strip@pt\fontdimen1\font\dimexpr-0.34em\relax\relax}
\makeatother

\newunicodechar{ă}{\raisebox{.0em}\u\kernbrevea{-}{a}}
\newunicodechar{Ă}{\raisebox{.24em}\u\kernbreveA{-}{A}}

\begin{document}

Some test text using romanian diacritics:

şŞţŢăĂîÎâÂ

Kerning: hăh măh xăx VĂV WĂW

\MakeUppercase{ă}

\end{document}

不需要为其他字符给出定义。

相关内容