EB Garamond(粗体)小型大写字母在 lualatex 中“突然”不可用?

EB Garamond(粗体)小型大写字母在 lualatex 中“突然”不可用?

由于我可以为这个问题想出一个 MWE,所以我完全重写了这篇文章——如果你对我原来的问题感到好奇,请查看上次修订 (1)

考虑这个 MWE test.tex

\PassOptionsToPackage{dvipsnames}{xcolor}

% compile with: lualatex test.tex

\documentclass[10pt,a4paper]{article}

  \makeatletter
  \newcommand{\name}[1]{\def\@name{#1}}
  \makeatother

  \usepackage[margin=2cm]{geometry}
  \geometry{left=1.25cm,right=1.25cm,top=1.25cm,bottom=1.25cm}
  \usepackage{fontspec}
  \newfontfamily\titlenamefont{EB Garamond}[Ligatures=TeX]
  \usepackage[hidelinks=true]{hyperref}

\begin{document}

  \name{\hspace{4em}\addfontfeature{LetterSpace=10.0}\textsc{Brazen Discovery}}

  \begingroup
    \makeatletter
      {\ifcsname titlenamefont\endcsname\titlenamefont\fi \Huge\bfseries{\@name}\par}
    \makeatother
  \endgroup\medskip

  Testing some normal paragraph text here...

\end{document}

我有一个老的机器,有些硬件损坏,但在某些情况下仍然可以使用,装有 Ubuntu 14.04 和 TexLive 2014 或 2015(我一直将 TexLive 安装在“关闭”文件夹中,然后添加到/path/to/texlive/2014/bin/i386-linux$PATH

然后,我有一个新的机器,从头开始安装 Ubuntu 14.04,并从旧机器逐字复制 TexLive 2014 或 2015(但仍在同一路径)。编译过程在两台机器上运行正常,但字体有问题。

老的机器报告此情况:

$ uname -a
Linux myOldPC 4.4.0-57-generic #78~14.04.1-Ubuntu SMP Sat Dec 10 00:16:09 UTC 2016 i686 i686 i686 GNU/Linux
$ echo $(lsb_release -i -d -r -c)
Distributor ID: Ubuntu Description: Ubuntu 14.04.5 LTS Release: 14.04 Codename: trusty
$ tlmgr --version
tlmgr revision 39298 (2016-01-07 03:44:29 +0100)
tlmgr using installation: /path/to/texlive/2014
TeX Live (http://tug.org/texlive) version 2014
$ lualatex --version
This is LuaTeX, Version beta-0.80.0 (TeX Live 2015) (rev 5238)

当我使用 构建时lualatex test.tex,输出以以下内容结束:

$ lualatex test.tex
...
(/path/to/texlive/2014/texmf-dist/tex/latex/oberdiek/epstopdf-base.sty
(/path/to/texlive/2014/texmf-dist/tex/latex/oberdiek/grfext.sty)
(/path/to/texlive/2014/texmf-dist/tex/latex/latexconfig/epstopdf-sys.c
fg)) (/path/to/texlive/2014/texmf-dist/tex/latex/hyperref/nameref.sty
(/path/to/texlive/2014/texmf-dist/tex/generic/oberdiek/gettitlestring.
sty)) (./test.out) (./test.out) [1{~/.texlive2015/texmf-var/fo
nts/map/pdftex/updmap/pdftex.map}] (./test.aux))
 301 words of node memory still in use:
   3 hlist, 1 vlist, 1 rule, 2 glue, 3 attribute, 44 glue_spec, 3 attribute_list
, 1 write nodes
   avail lists: 2:42,3:4,4:38,5:22,6:65,7:2,8:2,9:13,10:5
</path/to/texlive/2014/texmf-dist/fonts/opentype/public/lm/lmroman10-re
gular.otf><~/.fonts/EBGaramond08-Regular.otf>
Output written on test.pdf (1 page, 8339 bytes).
Transcript written on test.log.

PDF 文档如下所示evince

测试版

...基本上,标题字体是粗体,并且是小写字母 - 并且嵌入在 PDF 中的字体是:

$ pdffonts test.pdf
name                                 type              encoding         emb sub uni object ID
------------------------------------ ----------------- ---------------- --- --- --- ---------
IJJDUA+EBGaramond08-Regular          CID Type 0C       Identity-H       yes yes yes      8  0
QXSXVQ+LMRoman10-Regular             CID Type 0C       Identity-H       yes yes yes      9  0

...即EBGaramond08-Regular包含在标题中(对应于日志<~/.fonts/EBGaramond08-Regular.otf>的最后几行lualatex)。

新的机器报告此情况:

$ uname -a
Linux myNewPC 4.4.0-101-generic #124~14.04.1-Ubuntu SMP Fri Nov 10 19:06:11 UTC 2017 i686 i686 i686 GNU/Linux
$ echo $(lsb_release -i -d -r -c)
Distributor ID: Ubuntu Description: Ubuntu 14.04.5 LTS Release: 14.04 Codename: trusty
$ tlmgr --version
tlmgr revision 39298 (2016-01-07 03:44:29 +0100)
tlmgr using installation: /path/to/texlive/2014
TeX Live (http://tug.org/texlive) version 2014
$ lualatex --version
This is LuaTeX, Version beta-0.80.0 (TeX Live 2015) (rev 5238)

因此,除了内核版本之外,其他一切都相同。当我使用 构建时lualatex test.tex,输出结果如下:

$ lualatex test.tex
...
(/path/to/texlive/2014/texmf-dist/tex/latex/oberdiek/epstopdf-base.sty
(/path/to/texlive/2014/texmf-dist/tex/latex/oberdiek/grfext.sty)
(/path/to/texlive/2014/texmf-dist/tex/latex/latexconfig/epstopdf-sys.c
fg)) (/path/to/texlive/2014/texmf-dist/tex/latex/hyperref/nameref.sty
(/path/to/texlive/2014/texmf-dist/tex/generic/oberdiek/gettitlestring.
sty)) (./test.out) (./test.out)

LaTeX Font Warning: Font shape `EU2/EBGaramond(0)/bx/n' undefined
(Font)              using `EU2/EBGaramond(0)/m/n' instead on input line 23.


LaTeX Font Warning: Font shape `EU2/EBGaramond(1)/bx/n' undefined
(Font)              using `EU2/EBGaramond(1)/m/n' instead on input line 23.



LaTeX Font Warning: Font shape `EU2/EBGaramond(1)/bx/sc' undefined
(Font)              using `EU2/EBGaramond(1)/bx/n' instead on input line 23.

[1{/path/to/texlive/2014/texmf-var/fonts/map/pdftex/updmap/pdftex.map}]
(./test.aux)

LaTeX Font Warning: Some font shapes were not available, defaults substituted.

)
 310 words of node memory still in use:
   3 hlist, 1 vlist, 1 rule, 2 glue, 1 kern, 4 attribute, 44 glue_spec, 4 attrib
ute_list, 1 write nodes
   avail lists: 2:40,3:4,4:37,5:22,6:65,7:2,8:2,9:13,10:5
</path/to/texlive/2014/texmf-dist/fonts/opentype/public/lm/lmroman10-re
gular.otf><~/.fonts/EBGaramond12-Regular.otf>
Output written on test.pdf (1 page, 7527 bytes).
Transcript written on test.log.

310 words of node memory因此,除了(与旧电脑的情况相比)的差异之外301 words of node memory,还有未定义的字体形状——就的情况下bx/sc,我猜这意味着粗体小型大写字母的形状是未定义的。

PDF 文档如下所示evince

测试新版本.png

...基本上,标题字体是不是加粗,并且不是小型大写字母 - PDF 中嵌入的字体为:

$ pdffonts test.pdf
name                                 type              encoding         emb sub uni object ID
------------------------------------ ----------------- ---------------- --- --- --- ---------
JYJWKP+EBGaramond12-Regular          CID Type 0C       Identity-H       yes yes yes      8  0
QXSXVQ+LMRoman10-Regular             CID Type 0C       Identity-H       yes yes yes      9  0

...即EBGaramond12-Regular包含在标题中(对应于<~/.fonts/EBGaramond12-Regular.otf>最后几行的lualatex) - 但是,它确实不是对应于EBGaramond08-Regular旧机器上的构建使用?!

所以,我想我的问题是:

  • 为什么lualatex在相同的操作系统环境下,对于完全相同的.tex源文件,可以在一种情况下(旧 PC 版本)选择一种字体系列,而在另一种情况下(新 PC 版本)选择另一种字体系列?
  • 如何在新机器上进行构建,执行与旧机器上相同的操作并生成相同的文档?

请注意,新旧机器都会报告此情况:

$ luaotfload-tool --find="EB Garamond"
luaotfload | resolve : Font "EB Garamond" found!
luaotfload | resolve : Resolved file name "~/.fonts/EBGaramond12-Regular.otf"

如果我在两个系统上查找 garamond OTF 字体并进行比较,我会得到:

# $ find / -xdev -iname '*garamond*.otf' 2>/dev/null | sort | tee findold # on old PC
# $ find / -xdev -iname '*garamond*.otf' 2>/dev/null | sort | tee findnew # on new PC
$ diff -U 100000 findold findnew
--- findold 2017-12-05 07:13:18.813205949 +0100
+++ findnew 2017-12-05 07:13:09.413124141 +0100
@@ -1,15 +1,11 @@
 ~/.fonts/EBGaramond08-Italic.otf
 ~/.fonts/EBGaramond08-Regular.otf
 ~/.fonts/EBGaramond12-AllSC.otf
 ~/.fonts/EBGaramond12-Italic.otf
 ~/.fonts/EBGaramond12-Regular.otf
 ~/.fonts/EBGaramond-InitialsF1.otf
 ~/.fonts/EBGaramond-InitialsF2.otf
 ~/.fonts/EBGaramond-Initials.otf
 ~/.fonts/EBGaramondSC08-Regular.otf
 ~/.fonts/EBGaramondSC12-Regular.otf
-~/.fonts/GaramondNo8-Italic.otf
-~/.fonts/GaramondNo8-Medium-Italic.otf
-~/.fonts/GaramondNo8-Medium.otf
-~/.fonts/GaramondNo8-Regular.otf

... 所以至少我有相同的 EBGaramond 文件名(我猜 GaramondNo8 是“URW Garamond”,而不是 EBGaramond)。结果,我也有完全相同的EBGaramond*.otf文件(显然,来自EBGaramond-0.016.zip- 请参阅过去的修订版以了解我在新电脑上安装它的代码):

# $ find / -xdev -iname '*ebgaramond*.otf' 2>/dev/null | sort | xargs ls -la | sed "s/$(whoami) $(whoami)//" | tee ls-laold # on old PC
$ find / -xdev -iname '*ebgaramond*.otf' 2>/dev/null | sort | xargs ls -la | sed "s/$(whoami) $(whoami)//" | tee ls-lanew # on new PC
-rw-r--r-- 1  200656 Apr  8  2014 ~/.fonts/EBGaramond08-Italic.otf
-rw-r--r-- 1  259968 Apr  8  2014 ~/.fonts/EBGaramond08-Regular.otf
-rw-r--r-- 1  212492 Apr  8  2014 ~/.fonts/EBGaramond12-AllSC.otf
-rw-r--r-- 1  298252 Apr  8  2014 ~/.fonts/EBGaramond12-Italic.otf
-rw-r--r-- 1  495300 Apr  8  2014 ~/.fonts/EBGaramond12-Regular.otf
-rw-r--r-- 1   60240 Apr  8  2014 ~/.fonts/EBGaramond-InitialsF1.otf
-rw-r--r-- 1    5120 Apr  8  2014 ~/.fonts/EBGaramond-InitialsF2.otf
-rw-r--r-- 1   78512 Apr  8  2014 ~/.fonts/EBGaramond-Initials.otf
-rw-r--r-- 1  226840 Apr  8  2014 ~/.fonts/EBGaramondSC08-Regular.otf
-rw-r--r-- 1  353364 Apr  8  2014 ~/.fonts/EBGaramondSC12-Regular.otf
$ diff -U 100000 --report-identical-files ls-laold ls-lanew
Files ls-laold and ls-lanew are identical

luatex-cache 名称中的相关条目在新旧 PC 上也相同:

$ zgrep -i ebgaramond /path/to/texlive/2014/texmf-var/luatex-cache/generic/names/luaotfload-names.lua.gz | grep -v '"full"' | grep fullpath | sort
   ["fullpath"]="~/.fonts/EBGaramond08-Italic.otf",
   ["fullpath"]="~/.fonts/EBGaramond08-Regular.otf",
   ["fullpath"]="~/.fonts/EBGaramond12-AllSC.otf",
   ["fullpath"]="~/.fonts/EBGaramond12-Italic.otf",
   ["fullpath"]="~/.fonts/EBGaramond12-Regular.otf",
   ["fullpath"]="~/.fonts/EBGaramond-InitialsF1.otf",
   ["fullpath"]="~/.fonts/EBGaramond-InitialsF2.otf",
   ["fullpath"]="~/.fonts/EBGaramond-Initials.otf",
   ["fullpath"]="~/.fonts/EBGaramondSC08-Regular.otf",
   ["fullpath"]="~/.fonts/EBGaramondSC12-Regular.otf",

...唯一的区别似乎在于 luatex-cache otf 字体:

# $ ls -la /path/to/texlive/2014/texmf-var/luatex-cache/generic/fonts/otf/ebgaramond* | sed "s/$(whoami) $(whoami)//" | tee luatex-cache-otf-old # on old PC
# $ ls -la /path/to/texlive/2014/texmf-var/luatex-cache/generic/fonts/otf/ebgaramond* | sed "s/$(whoami) $(whoami)//" | tee luatex-cache-otf-new # on new PC
$ diff -U 100000 luatex-cache-otf-old luatex-cache-otf-new
--- luatex-cache-otf-old    2017-12-05 07:48:06.679082205 +0100
+++ luatex-cache-otf-new    2017-12-05 07:45:15.625596626 +0100
@@ -1,6 +1,4 @@
--rw-rw-rw- 1  473749 Oct 28  2016 /path/to/texlive/2014/texmf-var/luatex-cache/generic/fonts/otf/ebgaramond08-regular.lua
--rw-rw-rw- 1  303043 Oct 28  2016 /path/to/texlive/2014/texmf-var/luatex-cache/generic/fonts/otf/ebgaramond08-regular.luc
--rw-rw-rw- 1  568196 Oct 28  2016 /path/to/texlive/2014/texmf-var/luatex-cache/generic/fonts/otf/ebgaramond12-italic.lua
--rw-rw-rw- 1  364914 Oct 28  2016 /path/to/texlive/2014/texmf-var/luatex-cache/generic/fonts/otf/ebgaramond12-italic.luc
--rw-rw-rw- 1  724218 Oct 28  2016 /path/to/texlive/2014/texmf-var/luatex-cache/generic/fonts/otf/ebgaramond12-regular.lua
--rw-rw-rw- 1  466820 Oct 28  2016 /path/to/texlive/2014/texmf-var/luatex-cache/generic/fonts/otf/ebgaramond12-regular.luc
+-rw-rw-rw- 1  568148 Dec  4 16:21 /path/to/texlive/2014/texmf-var/luatex-cache/generic/fonts/otf/ebgaramond12-italic.lua
+-rw-rw-rw- 1  364894 Dec  4 16:21 /path/to/texlive/2014/texmf-var/luatex-cache/generic/fonts/otf/ebgaramond12-italic.luc
+-rw-rw-rw- 1  724173 Dec  4 16:21 /path/to/texlive/2014/texmf-var/luatex-cache/generic/fonts/otf/ebgaramond12-regular.lua
+-rw-rw-rw- 1  466728 Dec  4 16:21 /path/to/texlive/2014/texmf-var/luatex-cache/generic/fonts/otf/ebgaramond12-regular.luc

ebgaramond12-italic.lua我尝试在新旧机器上进行差异分析,但变化实在太多,都是数字引用中的数字变化(如["slookups"]={ 983214, 983316, 983112, 983418 },),所以揭示不了太多信息。

除此之外,唯一明显的区别是新的机器,ebgaramond08-regular.lua/.luc无法生成texmf-var/luatex-cache/generic/fonts/otf/(如果它们在第一次运行中不存在,它们应该被生成lualatex)...并且,从lualatex日志中:

  • 老的机器用途~/.texlive2015/texmf-var/fonts/map/pdftex/updmap/pdftex.map(它也texmf-config~/.texlive2015
  • 新的机器没有~/.texlive2015,所以它使用/path/to/texlive/2014/texmf-var/fonts/map/pdftex/updmap/pdftex.map(显然?)
    • 但是,如果我updmap在新机器上运行,它~/.texlive2015/texmf-var会被创建(但~/.texlive2015/texmf-config没有),然后lualatex读取pdftex.map它 - 但字体的相同问题仍然存在..

我真的不知道如何从这里继续调试......

答案1

好吧,我想我已经在某种程度上解决了这个问题,但是它都是不完整的 - 所以如果有人知道我如何“修复”这个安装(但无需从头开始重新安装),我很乐意听到它。

问题是:在旧机器上,我确实使用install-tl脚本安装了 TexLive 2014 / 2015(但在“off”文件夹中,即非系统、额外安装的分区中的文件夹);在新机器上,我只是将安装从旧机器的“off”文件夹复制到新机器的“off”文件夹(即额外安装的分区,与旧机器上的“off”文件夹具有相同的路径(名称)。(我非常喜欢从外部安装的分区运行软件,对被视为操作系统安装树的干预最少)。

我曾假设,由于两个(旧的和新的)“off”文件夹具有相同的路径,我所需要做的就是将相同的内容添加/path/to/texlive/2014/bin/i386-linux$PATHin中.bashrc,事情就会同样起作用 - 通常它们确实如此(即可执行文件照常运行)。只是,我忘记了在 中创建了其他文件夹$HOME(显然是由install-tl或创建的tlmgr,尽管我不记得我是否手动创建了其中任何一个)。

因此,在确保与 OP 中所述相同的字体在新机器中与旧机器中的相同位置放置后,我重复了复制,这次使用文件$HOME夹:

rsync -aP oldPC.lan:/path/to/texlive /path/to/
rsync -aP oldPC.lan:~/.texlive2014 ~/
rsync -aP oldPC.lan:~/.texlive2015 ~/
rsync -aP oldPC.lan:~/texmf ~/

经过这次复制后,test.texOP 中的内容最终可以正常编译,没有关于字体形状未定义的投诉,并且 PDF 看起来与 OP 中的“旧”PC 示例相同。

我想,可以说,如果相同的字体文件在“新”PC 和“旧”PC 上位于相同的位置(即,texlive install/luatex-cache 期望它们所在的位置,如图所示fc-list),并且如果 texlive 安装在“新”PC 和“旧”PC 上的路径相同,那么使用上述文件夹复制,“旧”PC 中的缓存信息也将适用于“新”PC,并且 Latex 编译将以相同的方式执行。

但事实并非如此。在开始之前,请注意,只有在完成上述rsync复制后,此命令才会在“新”机器上显示与“旧”机器相同的输出:

$ kpsewhich --all updmap.cfg
~/.texlive2015/texmf-config/web2c/updmap.cfg
/path/to/texlive/texmf-local/web2c/updmap.cfg
/path/to/texlive/2014/texmf-dist/web2c/updmap.cfg

在复制之前,~/.texlive2015/texmf-config/web2c/updmap.cfg不会输出该行。正如 OP 中所述,即使之前不存在,updmap新机器也会创建;但是,是什么创建了?在这种情况下,我刚刚从“旧”机器复制到“新”机器,由于路径相同,所以一切正常 - 但我想使用某些工具生成会更合适(例如由生成;我曾希望有这样的一个,但没有。有,但它在“旧”和“新”机器上都报告相同的错误)。~/.texlive2015/texmf-var~/.texlive2015~/.texlive2015/texmf-config~/.texlive2015/texmf-config~/.texlive2015/texmf-config~/.texlive2015/texmf-varupdmaptlmgr --repairtlmgr check all

可能因为这个原因,我遇到了另一个字体问题:复制并确认可以正常test.tex工作后,我返回到导致此问题的原始文档,但无法编译它,因为找不到字体 Lato。因此,我将 Lato 文件复制到 luatex-cache 期望它们的位置(在本例中,在~/.fonts/“新”机器上),然后运行:

luaotfload-tool -vvv --update --force

... 但在此之后,找到了 Lato 字体 - 但 EB Garamond 又恢复到与 OP 中相同的错误!因此,在此之后,我不得不rsync再次重新运行复制过程以“撤消”效果luaotfload-tool(复制过程替换的唯一内容是luatex-cache 中的lato*文件ebgaramond*)- 然后最终像在“旧”机器上一样完成编译。

好吧,如果知道如何在“新”机器上恢复或修复复制的安装就太好了,而且luaotfload-tool调用结果也能正常运行编译过程 - 但我想,我的用例已经太模糊了,无法直接回答...

相关内容