\llap 之谜与 TeX--XeT

\llap 之谜与 TeX--XeT

考虑

\documentclass{article}
\usepackage{xecolor} % loads fontspec by default
\setmainfont{Times New Roman}
\begin{document}
\fontsize{60}{70}\selectfont


TEST\llap{\textxecolor{red}{TEST}}
\end{document}

正如预期的那样,TEST将为红色。然而

\documentclass{article}
\usepackage{xecolor} % loads fontspec by default
\setmainfont{Times New Roman}
\TeXXeTstate=1
\begin{document}
\fontsize{60}{70}\selectfont


\beginR TEST\llap{\textxecolor{red}{TEST}}\endR
\end{document}

TEST会变成黑色。这是什么原因?

答案1

最初,我以为可以通过使用支持的 LaTeX 语法\makebox[0pt][l]{<content>}而不是纯 TeX来解决这个问题\llap,但行为是一样的。这些\Xlap命令在某些地方会引起问题,因为它们是\hboxes(TeX 基元),而不是\mboxes(LaTeX 宏)。查看更多详细信息这里. 无论如何都值得注意。

如下所示,两种语法产生相同的结果。不同之处在于 LaTeX 扫描输入的方向。简而言之,在 LTR 模式下,它会在页面上的同一位置打印黑色,然后打印红色。因此结果是红色。相反,在 RTL 模式下,它会在页面上的同一位置打印红色,然后打印黑色。

我们可以通过反转原始文本和重叠框的顺序来看到这种效果:

\documentclass{article}
\usepackage{xecolor} % loads fontspec by default
\setmainfont{Times New Roman}
\TeXXeTstate=1
\newcommand{\tk}{\textxecolor{black}{TEST}}
\newcommand{\tr}{\textxecolor{red}{TEST}}

\begin{document}
Original:

\tk\llap{\tr}

\beginR\tk\llap{\tr}\endR

\LaTeX\ syntax:

\tk\makebox[0pt][r]{\tr}

\beginR\tk\makebox[0pt][r]{\tr}\endR

\LaTeX\ syntax, order reversed:

\makebox[0pt][l]{\tr}\tk

\beginR\makebox[0pt][l]{\tr}\tk\endR
\end{document}

输出

在此处输入图片描述

答案2

这是当前版本 XeTeX 中使用的 TeX-XeT 双向扩展(来自 e-TeX)的一个错误,它会在从右到左的模式下反转节点的顺序,从而反转彩色文本的顺序。

XeTeX 的下一个版本恢复为 (Knuth 和 Pierre MacKay) 的原始 TeX-XeT 扩展,它不会“物理地”反转节点,而是在文件中输出标记DVI从右到左文本的开始和结束的特殊操作码,并将实际反转工作交给驱动程序。驱动程序 (xdvipdfmx此处) 已更新为支持新的操作码,它不会物理地反转文本,而是保持文本的逻辑顺序,只更改 X 位置以使其看起来反​​转。这保持了节点的逻辑顺序,因此颜色和其他特殊功能将以正确的顺序应用。

相关内容