如何生成 unicode 可复制替代文本?(使用 accsupp)

如何生成 unicode 可复制替代文本?(使用 accsupp)

在下面的例子中,我无法accsupp存储统一码替代文本。生成的 PDF 看起来符合预期,但可复制的文本不正确。我尝试了不同的accsupp选项:method=plain、、和。(手册是...=escape...=pdfstringdefunicodeaccsupp这里)。我尝试使用 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}

相关内容