以下 MWE 使用包提供的 PDF 辅助功能来替换字符串中与accsupp
对应的选择内容。BBB
ZZZ
AAABBBCCC
\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.pdf
XeTeX-notes.pdf
在文件中pgfsys-dvipdfm.def
可以找到以下“ugly hack”:
\def\pgfsys@invoke#1{\special{pdf: content Q #1 q}} % ugly, but necessary...
dvipdfmx
似乎支持一个新的关键字code
,pgfsys-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