非英语字符无法在 \AtBeginDocument 中正确加载

非英语字符无法在 \AtBeginDocument 中正确加载

请参阅下面给出的 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} ,在序言的最后。代码在字体选择表设置后执行,因此文档的正常字体是当前字体。但是,代码作为序言的一部分执行,因此您无法用它进行任何排版。

我正在使用xelatexUbuntu 21.04 自带的。

提到的非英语字体可以从以下网址下载这里。

答案1

它不起作用,\AtBeginDocument因为语言仍然是英语。polyglossia 稍后选择主要语言。

因此,您可以通过在命令中强制使用孟加拉语来使其工作。

\newcommand\executefirst{\selectlanguage{bengali}....

begindocument但是正如 lthooks-doc.pdf 中关于与之一起使用的钩子 所述\AtBeginDocument

由于我们仍处于 LATEX 的初始化阶段,而不是文档主体,因此不应使用钩子来添加排版材料。

而是使用(使用当前的 LaTeX,使用较旧的 tex 系统,使用 etoolbox 中的命令)钩子begindocument/end

  \AddToHook{begindocument/end}{\executefirst}

相关内容