/ActualText em hiperlinks em letras maiúsculas

/ActualText em hiperlinks em letras maiúsculas

Estou utilizando a frenchlinksopção para hyperref, que devido aos cuidados solícitos do XeLaTeX + Linux Libertine, dágenuínolinks em letras maiúsculas na página. O problema é que, quando recorto e colo o PDF gerado, retiro letras maiúsculas Unicode, mas prefiro ASCII.

Alguém pode sugerir como modificar este MWE? (Cometi um erro na configuração?)

Observe que, para o MWE atualizado, tentei corrigir \hrefusando a resposta aceita de Corrigindo argumentos dentro de uma macro (sem dados).

MWE atualizado

\documentclass[article, a4paper, 12pt, oneside]{memoir}

\usepackage{xunicode}
\usepackage[MnSymbol]{mathspec}
%\defaultfontfeatures{Mapping=tex-text}

\setmainfont[Mapping= tex-text,  
     SmallCapsFont={Linux Libertine O},   
     SmallCapsFeatures= {Color=FFFFFF, RawFeature={+smcp,+hlig,+dlig}},   
     BoldFont={Linux Biolinum O Bold},   
%     BoldFeatures={Color = FFFFFF,SmallCapsFont={Linux Libertine Capitals O Bold},%
%       SmallCapsFeatures = { Color=FFFFFF,   RawFeature={+smcp,+hlig,+dlig}} },  
     ItalicFont={Linux Libertine O Italic},   
     ItalicFeatures={Color = FFFFFF,  %
       SmallCapsFont={Linux Libertine Capitals O Italic}, %
       SmallCapsFeatures = {Color=FFFFFF}},   
     BoldItalicFont={Linux Biolinum O},   
     BoldItalicFeatures={ Color = FFFFFF, %
      SmallCapsFont={Linux Libertine Capitals O Bold Italic},  %
      SmallCapsFeatures = { Color=FFFFFF,RawFeature={+smcp,+hlig,+dlig}}} ]{Linux Libertine O} 

\usepackage[linktoc=all,frenchlinks,pdfborderstyle={/S/U/W .5},citebordercolor={1 1 1},linkbordercolor={1 1 1},urlbordercolor={1 1 1}]{hyperref}

\usepackage{xstring}
\usepackage{accsupp}

\usepackage{etoolbox}
\catcode`\#=12
\newcommand{\newhref}{%
\normalexpandarg%
\patchcmd{\href}{#2}{%
 \BeginAccSupp{method=pdfstring,ActualText={#2}}%
 #2%
 \EndAccSupp{}%
}{}{}%
}
\catcode`\#=6

\begin{document}

Sexy tex: \newhref{http://tex.stackexchange.com}{sxe}.

\end{document}

MWE original

\documentclass[article, a4paper, 12pt, oneside]{memoir}

\usepackage{xunicode}
\usepackage[MnSymbol]{mathspec}
%\defaultfontfeatures{Mapping=tex-text}

\setmainfont[Mapping= tex-text,  
     SmallCapsFont={Linux Libertine O},   
     SmallCapsFeatures= {Color=FFFFFF, RawFeature={+smcp,+hlig,+dlig}},   
     BoldFont={Linux Biolinum O Bold},   
%     BoldFeatures={Color = FFFFFF,SmallCapsFont={Linux Libertine Capitals O Bold},%
%       SmallCapsFeatures = { Color=FFFFFF,   RawFeature={+smcp,+hlig,+dlig}} },  
     ItalicFont={Linux Libertine O Italic},   
     ItalicFeatures={Color = FFFFFF,  %
       SmallCapsFont={Linux Libertine Capitals O Italic}, %
       SmallCapsFeatures = {Color=FFFFFF}},   
     BoldItalicFont={Linux Biolinum O},   
     BoldItalicFeatures={ Color = FFFFFF, %
      SmallCapsFont={Linux Libertine Capitals O Bold Italic},  %
      SmallCapsFeatures = { Color=FFFFFF,RawFeature={+smcp,+hlig,+dlig}}} ]{Linux Libertine O} 

\usepackage[linktoc=all,frenchlinks,pdfborderstyle={/S/U/W .5},citebordercolor={1 1 1},linkbordercolor={1 1 1},urlbordercolor={1 1 1}]{hyperref}

\usepackage{xstring} % added as suggested in 1st given answer
\usepackage{accsupp}

\let\hrefold\href
\newcommand*{\hrefnew}[2]{%
\normalexpandarg%
\BeginAccSupp{method=plain,unicode,ActualText={#2}}%
\hrefold{#1}{#2}%
\EndAccSupp{}%
}

\begin{document}

Sexy tex: \href{http://tex.stackexchange.com}{sxe}.

\end{document}

Responder1

  • A macro \hrefnewé definida com o novo recurso /ActualText, mas o corpo está usando o não modificado \href.

  • A macro \hrefestá usando o indefinido \normalexpandargque vem do pacote xstringque não está carregado.

  • Se o método plaincom opção unicodefor usado, o argumento deverá ser uma UTF-16BEstring válida. Nesse caso eu deixaria hyperreffazer a conversão correta usando o método pdfstringdef:

    \BeginAccSupp{method=pdfstringdef,ActualText={#2}}
    

\hrefnão é um bom candidato para redefinição, devido ao tratamento especial do primeiro argumento que é lido com códigos de gato alterados. Portanto, um candidato melhor é o interno \href@:

\makeatletter
\let\href@old\href@
\renewcommand*{\href@}[2]{%
  \href@old{#1}{%
    \BeginAccSupp{%
      method=pdfstringdef,%
      ActualText={#2},%
    }%
      #2%
    \EndAccSupp{}%
  }%
}
\makeatletter

informação relacionada