请参阅下面给出的 MWE,它使用孟加拉作为其主字体。该宏\executefirst
被执行两次。一次是通过\AtBeginDocument
,另一次直接在下一页执行。但是当涉及到非英文字符的渲染问题时,执行结果会有所不同。
\documentclass{article}
% For bilingual document
\usepackage{polyglossia}
\usepackage{fontspec}
% Bangla
\setmainlanguage[numerals=Devanagari]{bengali}
\newfontfamily\bengalifont[Script=Bengali,AutoFakeBold=4.0,AutoFakeSlant=0.4]{SolaimanLipi}
\newfontfamily\bengalifontbf[Script=Bengali,AutoFakeBold=4.0,AutoFakeSlant=0.4]{SolaimanLipi}
\newfontfamily\bengalifonttt[Script=Bengali,AutoFakeBold=4.0,AutoFakeSlant=0.4]{SolaimanLipi}
\newfontfamily\bengalifontsf[Script=Bengali,AutoFakeBold=4.0,AutoFakeSlant=0.4]{SolaimanLipi}
\setotherlanguage{english}
\defaultfontfeatures{Ligatures=TeX}
% Times New Roman used
\newfontfamily\englishfont[Mapping=tex-text, Ligatures=TeX]{Times New Roman}
\def\executefirst{
% Both of these are supposed to use the non-English font
English Text in Main non-English Font
বাংলা লেখা
% The following will use the English font
\begin{english}
English Text in Second (English) Font
\end{english}}
\AtBeginDocument{\executefirst}
\begin{document}
Page 1
\clearpage
\executefirst
Page 2
\end{document}
但正如上面已经提到的,两次执行的结果是不同的。
从第一次执行开始,仅有的英文字符(非英文主字体和(第二)英文字体)均显示。非英文文本缺失。
但是,第二次直接执行可以正确呈现所有字符。
这很奇怪。\AtBeginDocument
应该在执行任何代码之前正确加载所有字体表。
\AtBeginDocument
概要:
\AtBeginDocument{code}
保存代码并在执行时执行\begin{document}
,在序言的最后。代码在字体选择表设置后执行,因此文档的正常字体是当前字体。但是,代码作为序言的一部分执行,因此您无法用它进行任何排版。
我正在使用xelatex
Ubuntu 21.04 自带的。
提到的非英语字体可以从以下网址下载这里。)
答案1
它不起作用,\AtBeginDocument
因为语言仍然是英语。polyglossia 稍后选择主要语言。
因此,您可以通过在命令中强制使用孟加拉语来使其工作。
\newcommand\executefirst{\selectlanguage{bengali}....
begindocument
但是正如 lthooks-doc.pdf 中关于与之一起使用的钩子 所述\AtBeginDocument
:
由于我们仍处于 LATEX 的初始化阶段,而不是文档主体,因此不应使用钩子来添加排版材料。
而是使用(使用当前的 LaTeX,使用较旧的 tex 系统,使用 etoolbox 中的命令)钩子begindocument/end
:
\AddToHook{begindocument/end}{\executefirst}