![\llap 之谜与 TeX--XeT](https://linux22.com/image/294304/%5Cllap%20%E4%B9%8B%E8%B0%9C%E4%B8%8E%20TeX--XeT.png)
考虑
\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
命令在某些地方会引起问题,因为它们是\hbox
es(TeX 基元),而不是\mbox
es(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 位置以使其看起来反转。这保持了节点的逻辑顺序,因此颜色和其他特殊功能将以正确的顺序应用。