在下面的例子中,我无法accsupp
存储统一码替代文本。生成的 PDF 看起来符合预期,但可复制的文本不正确。我尝试了不同的accsupp
选项:method=plain
、、和。(手册是...=escape
...=pdfstringdef
unicode
accsupp
这里)。我尝试使用 Acrobat 9.4.1 (Linux) 和 Evince。我正在使用 LuaLaTeX 进行编译。
这个想法是,当我在下一个文档中选择公式时,文本ⅆa
就会被复制。(大多数情况下只会a
被复制。)
\documentclass{article}
\usepackage{fontspec}
\usepackage{accsupp}
\begin{document}
\BeginAccSupp{unicode,ActualText=ⅆa} %method=plain, ...=escape, ...=pdfstringdef
$da$
\EndAccSupp{}
\end{document}
答案1
LuaTeX/XeTeX 的大字符(超过 8 位的字符)尚未完全支持。解决方法:
\documentclass{article}
\usepackage{fontspec}
\usepackage{accsupp}
% \usepackage{luatex85} % might be needed as a workaround https://github.com/ho-tex/oberdiek/issues/36
\usepackage{tikz}%\usepackage{pgfmath}
\usepackage{stringenc}
\usepackage{pdfescape}
\makeatletter
\newcommand*{\BeginAccSuppUnicode}[1]{%
\EdefSanitize\asu@str{#1}%
\edef\asu@str{%
\expandafter\expandafter\expandafter\asu@ToSpaceOther
\expandafter\asu@str\space\@nil
}%
\expandafter\let\expandafter\asu@str\expandafter\@empty
\expandafter\asu@ToHexUC\asu@str\relax
\EdefUnescapeHex{\asu@str}{\asu@str}%
\StringEncodingConvert{\asu@str}{\asu@str}{utf32be}{utf16be}%
\EdefEscapeHex{\asu@str}{\asu@str}%
\BeginAccSupp{%
unicode,%
method=hex,%
ActualText=\asu@str
}%
}
\begingroup
\lccode`\9=`\ %
\lowercase{\endgroup
\def\asu@SpaceOther{9}%
}
\def\asu@ToSpaceOther#1 #2\@nil{%
#1%
\ifx\\#2\\%
\expandafter\@gobble
\else
\asu@SpaceOther
\expandafter\@firstofone
\fi
{\asu@ToSpaceOther#2\@nil}%
}
\def\asu@ToHexUC#1{%
\ifx#1\relax
\else
\pgfmathHex{\the\numexpr`#1+"10000000\relax}%
\edef\asu@str{%
\asu@str
0\expandafter\@gobble\pgfmathresult
}%
\expandafter\asu@ToHexUC
\fi
}
\makeatother
\begin{document}
\BeginAccSuppUnicode{ⅆa}
$da$
\EndAccSupp{}
\end{document}