更深入的分析

更深入的分析

以下 MWE 使用包提供的 PDF 辅助功能来替换字符串中与accsupp对应的选择内容。BBBZZZAAABBBCCC

\documentclass{article}
\usepackage{accsupp}
\begin{document}
AAA\BeginAccSupp{ActualText=ZZZ}BBB\EndAccSupp{}CCC
\end{document}

如果它编译成功,pdflatex一切就都正常了。

编译导致与xelatex对应的框严重错位ZZZ,如下图使用 生成的图片所示evince(其他查看器也显示同样的问题)。

结果

为什么会发生这种情况?该问题可以解决吗?

xelatex(我不能为了而放弃pdflatex。)


更深入的分析

我使用 解压 PDFqpdf并检查了输出。关键差异都在单个流中(即xelatex用生成的流替换一个pdflatex流并调整字体,一切都按预期运行)。

XeLaTeX 输出

stream
q 1 0 0 1 72 769.89 cm
BT
/F1 9.963 Tf 76.71 -62.76 Td[(AAA)]TJ
ET
q 1 0 0 1 99.13 -62.76 cm
/Span<</ActualText(ZZZ)>>BDC
Q
BT
/F1 9.963 Tf 99.13 -62.76 Td[(BBB)]TJ
ET
q 1 0 0 1 120.3 -62.76 cm
EMC
Q
BT
/F1 9.963 Tf 120.3 -62.76 Td[(CCC)]TJ 110.83 -567.88 Td[(1)]TJ
ET
Q
endstream

而 PDFLaTeX

stream
BT
/F8 9.9626 Tf 148.712 707.125 Td [(AAA)]TJ
ET
/Span<</ActualText(ZZZ)>>BDC
BT
/F8 9.9626 Tf 171.128 707.125 Td [(BBB)]TJ
ET
EMC
BT
/F8 9.9626 Tf 192.299 707.125 Td [(CCC)]TJ 110.834 -567.87 Td [(1)]TJ
ET
endstream

似乎唯一的区别是 XeLaTeX 更喜欢使用坐标变换来回跳转。也许这个原始代码可以帮助人们了解这种行为。

答案1

好问题,其中包括透彻的分析!

我没有找到任何 XeTeX 的官方文档来说明 pdfTeX 的等效功能\pdfliteral direct。 的手册中dvipdfm介绍了 XeTeX 的一些前身。或\special{pdf:content ...}中没有任何内容。xetex-reference.pdfXeTeX-notes.pdf

在文件中pgfsys-dvipdfm.def可以找到以下“ugly hack”:

\def\pgfsys@invoke#1{\special{pdf: content Q #1 q}} % ugly, but necessary...

dvipdfmx似乎支持一个新的关键字codepgfsys-dvipdfmx.def包含:

% `pdf:code' is an abbreviation of `pdf:literal direct', the idea of which
% came from pdfTeX's primitive \pdfliteral direct.
\def\pgfsys@invoke#1{\special{pdf:code #1}}

XeTeX 似乎也支持这一点。

因此以下补丁应该可以解决这个问题:

\documentclass{article}
\usepackage{accsupp}

\makeatletter
\def\ACCSUPP@bdc{%
  \special{pdf:code \ACCSUPP@span BDC}%
}
\def\ACCSUPP@emc{%
  \special{pdf:code EMC}%
}
\makeatother

\begin{document}
AAA\BeginAccSupp{ActualText=ZZZ}BBB\EndAccSupp{}CCC
\end{document}

PDF 页面流(重新格式化):

stream
q
  1 0 0 1 72 769.89 cm
  BT
    /F1 9.963 Tf
    76.71 -62.76 Td
    [(AAA)]TJ
  ET
  /Span<</ActualText(ZZZ)>>BDC
  BT
    /F1 9.963 Tf
    99.13 -62.76 Td
    [(BBB)]TJ
  ET
  EMC
  BT
    /F1 9.963 Tf
    120.3 -62.76 Td
    [(CCC)]TJ
    110.83 -567.88 Td
    [(1)]TJ
  ET
Q
endstream

相关内容