之前,我曾使用过 XeTeXinterchartoks,因为我想为大写字母使用不同的字体。使用 xelatex 编译时,代码完全按照我的要求运行。
但是,我最近换了笔记本电脑,并重新安装了 texlive-full。现在,当我编译代码时,我发现在看似随机的地方出现了缺失字符和多余的空格。
发生了什么事?我该如何解决这个问题?
我附上了一个 MWE,我在最初思考如何创建此代码时也用到了它(大写字母和大写字母的字体不同)
\documentclass[a4paper,11pt]{book}
\usepackage[default]{frcursive}
\XeTeXinterchartokenstate = 1\relax
\newXeTeXintercharclass\ucletterclass
\ExplSyntaxOn
\int_step_inline:nnnn {"0041}{1}{"005A}
{ \XeTeXcharclass #1 = \ucletterclass }
\ExplSyntaxOff
\XeTeXinterchartoks 0 \ucletterclass = {\begingroup \fontfamily{phv}\fontseries{m}\fontshape{n}\selectfont}
\XeTeXinterchartoks \ucletterclass 0 = {\endgroup}
\XeTeXinterchartoks 4095 \ucletterclass = {\begingroup \fontfamily{phv}\fontseries{m}\fontshape{n}\selectfont}
\XeTeXinterchartoks \ucletterclass 4095= {\endgroup}
\begin{document}
This is some text.
This is some text with an acronym in it GMT
This is some text with a proper name in it: London
\end{document}
答案1
该问题与 interchar 令牌无关
\documentclass[a4paper,11pt]{book}
\usepackage[default]{frcursive}
\showoutput
\begin{document}
This is some text.
This is some text with an acronym in it GMT
This is some text with a proper name in it: London
\end{document}
生产
使用 xelatex 和
使用 pdflatex 看起来不错,但 xpdf 却抱怨
Syntax Warning (27391): Badly formatted number
Syntax Warning (27393): Badly formatted number
这表明(我怀疑)字体在某处存在问题。
使用 xelatex 时 showoutput 日志是
....\T1/frc/m/n/10.95 s
....\T1/frc/m/n/10.95 ^^\ (ligature )
....\T1/frc/m/n/10.95 ^^@ (ligature )
....\T1/frc/m/n/10.95 o
....\T1/frc/m/n/10.95 ^^P (ligature )
....\T1/frc/m/n/10.95 m
....\T1/frc/m/n/10.95 ^^@ (ligature )
....\T1/frc/m/n/10.95 e
....\glue 5.65755 plus 1.88586 minus 1.88586
....\T1/frc/m/n/10.95 ^^F (ligature |)
....\T1/frc/m/n/10.95 t
....\T1/frc/m/n/10.95 ^^A (ligature )
....\T1/frc/m/n/10.95 e
....\T1/frc/m/n/10.95 ^^O (ligature )
....\T1/frc/m/n/10.95 x
....\T1/frc/m/n/10.95 ^^G (ligature )
....\T1/frc/m/n/10.95 t
....\glue 5.65755 plus 1.88586 minus 1.88586
....\T1/frc/m/n/10.95 ^^Q (ligature |)
....\T1/frc/m/n/10.95 w
....\T1/frc/m/n/10.95 ^^H (ligature )
....\T1/frc/m/n/10.95 i
....\T1/frc/m/n/10.95 ^^F (ligature )
....\T1/frc/m/n/10.95 t
....\T1/frc/m/n/10.95 ^^M (ligature )
....\T1/frc/m/n/10.95 h
....\T1/frc/m/n/10.95 ^^_ (ligature |)
....\glue 5.65755 plus 1.88586 minus 1.88586
....\T1/frc/m/n/10.95 ^^@ (ligature |)
....\T1/frc/m/n/10.95 a
....\T1/frc/m/n/10.95 ^^_ (ligature |)
....\glue 5.65755 plus 1.88586 minus 1.88586
....\T1/frc/m/n/10.95 ^^I (ligature |)
....\T1/frc/m/n/10.95 p
....\T1/frc/m/n/10.95 ^^F (ligature )
....\T1/frc/m/n/10.95 r
....\T1/frc/m/n/10.95 ^^@ (ligature )
....\T1/frc/m/n/10.95 o
....\T1/frc/m/n/10.95 ^^K (ligature )
....\T1/frc/m/n/10.95 p
....\T1/frc/m/n/10.95 ^^@ (ligature )
....\T1/frc/m/n/10.95 e
....\T1/frc/m/n/10.95 ^^G (ligature )
....\T1/frc/m/n/10.95 r
....\T1/frc/m/n/10.95 ^^_ (ligature |)
....\glue 5.65755 plus 1.88586 minus 1.88586
....\T1/frc/m/n/10.95 ^^Q (ligature |)
....\T1/frc/m/n/10.95 n
....\T1/frc/m/n/10.95 ^^@ (ligature )
....\T1/frc/m/n/10.95 a
....\T1/frc/m/n/10.95 ^^N (ligature )
....\T1/frc/m/n/10.95 m
....\T1/frc/m/n/10.95 ^^@ (ligature )
....\T1/frc/m/n/10.95 e
显示正在使用 T1 编码,这通常对 xelatex 来说并不好,但对于像这样的特殊字体来说可能是不可避免的。您不会收到来自 xetex 的警告,因为它“认为”字符在那里,但位置控制 K 中的连字符之后的所有文本都没有渲染。
使用 xelatex,我可以在 texlive 2020 中获得全文,并在 2021、2022、2023 中获得缺失文本
答案2
我无法告诉你如何修复,只能告诉你发生了什么变化。字体本身没有变化。但 XeTeX 处理它的方式不同。在 texlive 2019 中,如果你使用--output-driver="xdvipdfmx -vv"
xdvipdfmx 进行编译,你会收到警告(这是使用 o 和 e 进行的测试):
xdvipdfmx:warning: Glyph width mismatch for TFM and font (frcr10)
xdvipdfmx:warning: TFM: -30.1361 vs. Type1 font: 32738
但 xdvipfdmx 仍然使用 PDF 中的 TFM 值:
[... 0 0 -30.1 -30.1 0 0 ...]
在 texlive 2023 中,消息已经改变:
xdvipdfmx:warning: Intolerable difference in glyph width: font=frcr10, char=10
xdvipdfmx:warning: font: 32738 vs. tfm: -30.1361
PFB 现在包含字体值:
[... 0 32738 32738 0 ...]
这会将字符移出页面。
(使用 pdftex 时,值很奇怪:-30.-1 -30.-1
,adobe reader 似乎不介意,但在我的编辑器的 pdf 查看器中,字符也丢失了,lualatex 输出-30.1 -30.1
)。
总的来说,我认为这是字体的问题(还有其他关于丢失连字符等的报告)。