XeLaTeX+bidi 的 pdflastxpos 值错误

XeLaTeX+bidi 的 pdflastxpos 值错误

Vala 的回答帮助我重新表述了我的问题。请参阅下面的原文。

为了pdfsavepos获取页面上文本的绝对位置,我在从右到左模式下使用 XeLaTeX 时遇到了以下问题。示例代码

\documentclass{article}
\usepackage[paperwidth=20000000sp,paperheight=10000000sp,
            hmargin=2000000sp,vmargin=1000000sp]{geometry}
\usepackage[enable,step=1000000sp,tr]{bidipagegrid}
\usepackage{bidi}
\begin{document}

\makeatletter
\def\where#1{\pdfsavepos\write-1{XPOS(#1)=\the\pdflastxpos}%
  \if@RTL\immediate\write-1{XPOS(#1) is RTL}\fi\ignorespaces}
\makeatother

\noindent \where{A1}AA\where{A2}

\begin{itemize}
  \item[\where{X1}X\where{X2}] 
    \hspace*{0pt}\where{D1}DtoD\where{D2}{} xxx \LR{x\where{E1}EtoE\where{E2}x}
\end{itemize}

\setRL

\noindent \where{B1}BB\where{B2}{} \LR{x\where{C1}CtoC\where{C2}x}

\begin{itemize}
  \item[\where{Y1}Y\where{Y2}] 
    \hspace*{0pt}\where{G1}GtoG\where{G2}{} xxx \LR{x\where{H1}HtoH\where{H2}x}
\end{itemize}

\end{document}

在日志文件中输出以下值:

XPOS(B1) is RTL  XPOS(B2) is RTL
XPOS(Y1) is RTL  XPOS(Y2) is RTL
XPOS(G1) is RTL  XPOS(G2) is RTL
XPOS(A1)=2,000,000 XPOS(A2)=2,983,042
XPOS(X1)=2,819,201 XPOS(X2)=3,310,722
XPOS(D1)=3,638,402 XPOS(D2)=5,222,192
XPOS(E1)=7,042,642 XPOS(E2)=8,517,206
XPOS(B1)=2,000,000 XPOS(B2)=2,928,430
XPOS(C1)=3,492,769 XPOS(C2)=5,021,945
XPOS(Y1)=1,180,799 XPOS(Y2)=1,672,320
XPOS(G1)=2,000,000 XPOS(G2)=3,611,096
XPOS(H1)=5,431,546 XPOS(H2)=6,997,132

并生成以下页面(网格步长为 1,000,000sp): 示例页面输出

我想知道页面上的标记位置。对于 A、X、D、E(全部为 LTR 模式)甚至 B(B 为 RTL,因此从右侧计算)来说,这似乎很容易,但我对 C(LTR 文本但从右侧测量,并且 C1 和 C2 已切换)、G(似乎已移位)和 H(均已移位和切换)有疑问。有人能帮我从pdflastposx输出中获取绝对位置吗?

原问题,供参考。

以下代码为从右到左书写部分 (B) 提供了错误的 X 位置值。

\documentclass{article}
\usepackage{bidi}
\begin{document}
\makeatletter
\def\where#1{\pdfsavepos\write-1{XPOS(#1)=\the\pdflastxpos}%
  \if@RTL\immediate\write-1{XPOS(#1) is RTL}\fi\ignorespaces}
\makeatother

\where{A0} First \where{A1} line here in RTL mode...

\setRL

\where{B0} Second \where{B1} one \LR{h\where{B2}er\where{B3}e}

\end{document}

似乎其中一些 X 值从右到左增加:日志文件获取

XPOS(B0) is RTL
XPOS(B1) is RTL
XPOS(A0)=8799518
XPOS(A1)=11380911
XPOS(B0)=8799518
XPOS(B1)=12003504
XPOS(B2)=13569089
XPOS(B3)=14117043

但我认为我们应该有 A0 < A1 < B2 < B3 < B1 < B0(如果查看 PDF)。有人能给我一些提示来获取正确的值吗?

请注意,使用旧版本的 texlive(2012-06-11 来自 debian squeeze),我得到

XPOS(B0) is RTL
XPOS(B1) is RTL
XPOS(A0)=8799518
XPOS(A1)=11380911
XPOS(B0)=8799518
XPOS(B2)=26164732
XPOS(B3)=26712686
XPOS(B1)=26712686

得到相同的 PDF 结果。

答案1

以下代码为从右到左书写部分 (B) 提供了错误的 X 位置值。

不,这并没有错。

看起来其中一些 X 值从右到左增加。

事情本该如此。

但我认为我们应该有 A0 < A1 < B2 < B3 < B1 < B0(如果查看 PDF)。

不,你错了。当你处于 LTR 模式时,参考点的 x 坐标位于 pdf 的左侧(线条开始的位置),而当你处于 RTL 模式时,参考点的 x 坐标位于 pdf 的右侧(线条开始的位置),这是完全可以接受且合乎逻辑的。

确实,您应该有 A0=B0、A1~=B1 且 A0 < A1 < B2 < B3,这就是您所拥有的。

有人能给我一些线索来获得正确的价值观吗?

它已经为您提供了正确的值。无论如何,bidi包与此无关。这一切都发生在引擎级别。

相关内容