
Когда я открываю pdf, сгенерированный pdflatex
в eg firefox, URL при наведении на ссылку показывает внутренний bibkey. Как мне предотвратить это?
Рассмотрим следующий MWE:
mwe.tex
\documentclass{article}
\usepackage[backend=biber]{biblatex}
\addbibresource{bib.bib}
\usepackage{hyperref}
\begin{document}
Test\cite{secretbibkey}
\printbibliography
\end{document}
нагрудник.нагрудник
@article{secretbibkey,
author = {Joe},
title = {Just a title},
number = {ABCD-E/2008/ab/1234},
institution = {University},
year = {2008}
}
Теперь посмотрите на следующий скриншот:
Он показывает биб-ключ, который я использовал при наведении курсора на цитату (судя по всему, на скриншоте нет моего курсора, но он был над зеленой «1»). Есть ли способ рандомизировать/анонимизировать эти URL-ключи?
решение1
Вы можете попробовать что-то вроде этого. Я не уверен, \int_to_alpha
обрабатывает ли он все символы и ввод, которые могут появиться в пункте назначения, и может ли он привести к идентичным пунктам назначения, но это была лучшая расширяемая функция, которую я нашел на данный момент. Она перемешает все пункты назначения, включая разделы и метки. Для перемешания только ключей bib потребуется внести ряд изменений в код biblatex
.
\documentclass{article}
\usepackage[backend=biber]{biblatex}
\addbibresource{test.bib}
\usepackage{hyperref}
\ExplSyntaxOn
\cs_new:Npn \pix_scrample_dest:n #1 {\int_eval:n{\int_from_alph:n{#1} + 2}} %2= secret number
\def\HyperDestNameFilter#1{\exp_args:Ne\tl_map_function:nN {#1}\pix_scrample_dest:n}
\ExplSyntaxOff
\begin{document}
Test\cite{secretbibkey}
\printbibliography
\end{document}
решение2
Если вы хотите скрыть всю внутреннюю маркировку, Ульрикеотвечатьгораздо лучше, но вот способ скрыть только ссылки, созданные с помощью biblatex
хэшей MD5 (я считаю, что хэши MD5 больше не рекомендуются для чего-либо, критически важного для безопасности, но для ваших целей этого может быть достаточно).
Команда, \blx@mdfivesum
используемая здесь, требует относительно недавней biblatex
версии. Если вы застряли со старой biblatex
, загрузите \usepackage{pdftexcmds}
себя и скажите \let\blx@mdfivesum\pdf@mdfivesum
.
Идея состоит в том, чтобы изменить использование ключа входа во всех командах ссылок на его хэшированную версию.
\documentclass[british]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{babel}
\usepackage{csquotes}
\usepackage[style=authoryear, backend=biber]{biblatex}
\usepackage{hyperref}
\makeatletter
\AtBeginDocument{%
\protected\def\blx@anchor{%
\xifinlist{\the\c@refsection @\blx@mdfivesum{\abx@field@entrykey}}{\blx@anchors}
{}
{\listxadd\blx@anchors{\the\c@refsection @\blx@mdfivesum{\abx@field@entrykey}}%
\hypertarget{cite.\the\c@refsection @\blx@mdfivesum{\abx@field@entrykey}}{}}}%
\ifundef\hyper@natanchorstart
{\long\def\blx@bibhyperref[#1]#2{%
\blx@sfsave\hyperlink{cite.\the\c@refsection @\blx@mdfivesum{#1}}{\blx@sfrest
#2%
\blx@sfsave}\blx@sfrest}%
\protected\long\def\blx@imc@bibhyperlink#1#2{%
\blx@sfsave\hyperlink{cite.\the\c@refsection:\blx@mdfivesum{#1}}{\blx@sfrest
#2%
\blx@sfsave}\blx@sfrest}%
\protected\long\def\blx@imc@bibhypertarget#1#2{%
\blx@sfsave\hypertarget{cite.\the\c@refsection:\blx@mdfivesum{#1}}{\blx@sfrest
#2%
\blx@sfsave}\blx@sfrest}}%
{\long\def\blx@bibhyperref[#1]#2{%
\blx@sfsave\hyper@natlinkstart{\the\c@refsection @\blx@mdfivesum{#1}}\blx@sfrest
#2%
\blx@sfsave\hyper@natlinkend\blx@sfrest}%
\protected\long\def\blx@imc@bibhyperlink#1#2{%
\blx@sfsave\hyper@natlinkstart{\the\c@refsection:\blx@mdfivesum{#1}}\blx@sfrest
#2%
\blx@sfsave\hyper@natlinkend\blx@sfrest}%
\protected\long\def\blx@imc@bibhypertarget#1#2{%
\blx@sfsave\hyper@natanchorstart{\the\c@refsection:\blx@mdfivesum{#1}}\blx@sfrest
#2%
\blx@sfsave\hyper@natanchorend\blx@sfrest}}}
\makeatother
\addbibresource{biblatex-examples.bib}
\begin{document}
\autocite{sigfridsson,worman,geer,nussbaum}
\printbibliography
\end{document}
Если вы предпочитаете числовое обозначение (которое, в отличие от хэша, приведенного выше, вообще не выводится из ключа входа), используйте следующее:
\documentclass[british]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{babel}
\usepackage{csquotes}
\usepackage[style=authoryear, backend=biber]{biblatex}
\usepackage{hyperref}
\makeatletter
\newcounter{blx@refnocount}
\newcommand*{\blx@getrefnocount}[1]{%
\xifinlistcs{#1}{blx@refcounts@\the\c@refsection}
{}
{\stepcounter{blx@refnocount}%
\csnumgdef{blx@refcount@\the\c@refsection @#1}{\value{blx@refnocount}}%
\listcsxadd{blx@refcounts@\the\c@refsection}{#1}}%
\letcs\blx@thisrefcount{blx@refcount@\the\c@refsection @#1}}
\AtBeginDocument{%
\ifundef\hyper@natanchorstart
{\protected\def\blx@anchor{%
\xifinlist{\the\c@refsection @\abx@field@entrykey}{\blx@anchors}
{}
{\listxadd\blx@anchors{\the\c@refsection @\abx@field@entrykey}%
\blx@getrefnocount{\abx@field@entrykey}%
\hypertarget{cite.\the\c@refsection @blxlinkno\blx@thisrefcount}{}}}%
\long\def\blx@bibhyperref[#1]#2{%
\blx@getrefnocount{#1}%
\blx@sfsave
\hyperlink{cite.\the\c@refsection @blxlinkno\blx@thisrefcount}
{\blx@sfrest
#2%
\blx@sfsave}\blx@sfrest}%
\protected\long\def\blx@imc@bibhyperlink#1#2{%
\blx@getrefnocount{#1}%
\blx@sfsave
\hyperlink{cite.\the\c@refsection:blxlinkno\blx@thisrefcount}
{\blx@sfrest
#2%
\blx@sfsave}\blx@sfrest}%
\protected\long\def\blx@imc@bibhypertarget#1#2{%
\blx@getrefnocount{#1}%
\blx@sfsave
\hypertarget{cite.\the\c@refsection:blxlinkno\blx@thisrefcount}
{\blx@sfrest
#2%
\blx@sfsave}\blx@sfrest}}%
{\protected\def\blx@anchor{%
\xifinlist{\the\c@refsection @\abx@field@entrykey}{\blx@anchors}
{}
{\listxadd\blx@anchors{\the\c@refsection @\abx@field@entrykey}%
\blx@getrefnocount{\abx@field@entrykey}%
\hyper@natanchorstart{\the\c@refsection @blxlinkno\blx@thisrefcount}%
\hyper@natanchorend}}%
\long\def\blx@bibhyperref[#1]#2{%
\blx@getrefnocount{#1}%
\blx@sfsave
\hyper@natlinkstart{\the\c@refsection @blxlinkno\blx@thisrefcount}%
\blx@sfrest
#2%
\blx@sfsave\hyper@natlinkend\blx@sfrest}%
\protected\long\def\blx@imc@bibhyperlink#1#2{%
\blx@getrefnocount{#1}%
\blx@sfsave
\hyper@natlinkstart{\the\c@refsection:blxlinkno\blx@thisrefcount}%
\blx@sfrest
#2%
\blx@sfsave\hyper@natlinkend\blx@sfrest}%
\protected\long\def\blx@imc@bibhypertarget#1#2{%
\blx@getrefnocount{#1}%
\blx@sfsave
\hyper@natanchorstart{\the\c@refsection:blxlinkno\blx@thisrefcount}%
\blx@sfrest
#2%
\blx@sfsave\hyper@natanchorend\blx@sfrest}}}
\makeatother
\addbibresource{biblatex-examples.bib}
\begin{document}
\autocite{sigfridsson,worman,geer,nussbaum}
\printbibliography
\autocite{sigfridsson,worman,geer,nussbaum}
\end{document}
решение3
Вы можете выполнить постобработку созданного PDF-файла с помощью некоторых инструментов командной строки для поиска ключей цитирования и замены их в исходном PDF-файле.
Сначала вам необходимо распаковать PDF-файл, чтобы можно было выполнять текстовый поиск и замену, например, с помощью pdftk
.
В несжатом PDF-файле ссылки выглядят так:
3 0 obj
<<
/Border [0 0 1]
/Subtype /Link
/H /I
/Type /Annot
/C [0 1 0]
/Rect [169.08 653.748 176.054 665.704]
/A
<<
/D (cite.0@secretbibkey)
/S /GoTo
>>
>>
endobj
и соответствующие части ниже:
34 0 obj
<<
/Names [(Doc-Start) 22 0 R (cite.0@secretbibkey) 21 0 R (page.1) 14 0 R (section*.1) 18 0 R]
/Limits [(Doc-Start) (section*.1)]
>>
endobj
Теперь вы можете grep
выбрать исходный код шаблона /D (cite.0@[some key])
и сохранить только ключевую часть.
Затем, перебрав все ключи, можно сгенерировать заменяющий ключ, например, md5
контрольную сумму (которая, как можно обоснованно ожидать, будет уникальной для каждого ключа).
Далее вы можете заменить все вхождения ключа на замену, используя sed
.
В конце цикла вы повторно сжимаете PDF-файл с помощью, pdftk
и все готово.
Полный сценарий (вызов с помощью bash myscript.sh mypdf.pdf
):
pdftk $1 output "raw$1" uncompress
grep -aoP "\/D \(\Kcite.0@[^\)]+(?=\))" "raw$1" | while read -r line ; do
echo $line
citehash=`echo $line|md5sum|awk '{ print $1 }'`
sed -i "s/$line/$citehash/g" "raw$1"
done
pdftk "raw$1" output $1 compress
Итоговая подсказка ссылки в Firefox:
Дополнительный бонус: ссылка все еще работает.