
Я использую frenchlinks
опцию hyperref, которая благодаря заботливой заботе XeLaTeX + Linux Libertine, даетдобросовестныйСсылки с малыми заглавными буквами на странице. Проблема в том, что когда я вырезаю и вставляю из сгенерированного PDF, я получаю юникодные малые заглавные буквы, хотя я бы предпочел ASCII.
Может ли кто-нибудь подсказать, как модифицировать этот MWE? (Я допустил ошибку в настройке?)
Обратите внимание, что для обновленного MWE я попытался применить патч, \href
используя принятый ответ от Исправление аргументов внутри макроса (без игральных костей).
Обновлено MWE
\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}
Оригинальный МВЭ
\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}
решение1
Макрос
\hrefnew
определен с новой функцией/ActualText
, но тело использует немодифицированную\href
.Макрос
\href
использует неопределенное значение\normalexpandarg
, полученное из пакета,xstring
который не загружен.Если используется метод
plain
с опциейunicode
, то аргумент должен быть допустимойUTF-16BE
строкой. В этом случае я бы позволилhyperref
сделать правильное преобразование с помощью методаpdfstringdef
:\BeginAccSupp{method=pdfstringdef,ActualText={#2}}
\href
не является хорошим кандидатом для переопределения из-за его особой обработки первого аргумента, который считывается с измененными catcodes. Поэтому лучшим кандидатом является внутренний \href@
:
\makeatletter
\let\href@old\href@
\renewcommand*{\href@}[2]{%
\href@old{#1}{%
\BeginAccSupp{%
method=pdfstringdef,%
ActualText={#2},%
}%
#2%
\EndAccSupp{}%
}%
}
\makeatletter