
Wenn ich das von z. B. Firefox generierte PDF öffne pdflatex
, wird beim Überfahren einer URL mit der Maus über eine Referenz der interne Bibkey angezeigt. Wie kann ich das verhindern?
Betrachten Sie das folgende MWE:
mwe.tex
\documentclass{article}
\usepackage[backend=biber]{biblatex}
\addbibresource{bib.bib}
\usepackage{hyperref}
\begin{document}
Test\cite{secretbibkey}
\printbibliography
\end{document}
bib.bib
@article{secretbibkey,
author = {Joe},
title = {Just a title},
number = {ABCD-E/2008/ab/1234},
institution = {University},
year = {2008}
}
Schauen Sie sich nun den folgenden Screenshot an:
Es zeigt den Bibkey, den ich verwendet habe, als ich mit der Maus über das Zitat gefahren bin (offenbar ist mein Cursor im Screenshot nicht zu sehen, aber er war über der grünen „1“). Gibt es eine Möglichkeit, diese URL-Schlüssel zufällig zu sortieren/anonymisieren?
Antwort1
Sie können so etwas versuchen. Ich bin nicht sicher, ob es \int_to_alpha
alle Zeichen und Eingaben verarbeitet, die in einem Ziel vorkommen können, und ob es zu identischen Zielen führen kann, aber es war die beste erweiterbare Funktion, die ich bisher gefunden habe. Es wird alle Ziele verschlüsseln, auch das zu Abschnitten und Beschriftungen. Nur Bib-Schlüssel zu verschlüsseln würde eine Reihe von Änderungen am biblatex
Code erfordern.
\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}
Antwort2
Wenn Sie alle internen Beschriftungen ausblenden möchten, UlrikesAntwortist viel schöner, aber hier ist eine Möglichkeit, nur die durch MD5-Hashes erstellten Links zu verschleiern biblatex
(ich glaube, MD5-Hashes werden für sicherheitskritische Zwecke nicht mehr empfohlen, aber für Ihre Zwecke könnte es ausreichen).
\blx@mdfivesum
Der hier verwendete Befehl erfordert eine relativ neue biblatex
Version. Wenn Sie mit einem alten nicht weiterkommen biblatex
, laden Sie \usepackage{pdftexcmds}
sich selbst und sagen Sie \let\blx@mdfivesum\pdf@mdfivesum
.
Die Idee besteht darin, alle Linkbefehle von der Verwendung des Eingabeschlüssels auf eine gehashte Version des Eingabeschlüssels umzustellen.
\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}
Falls Sie einen numerischen Bezeichner bevorzugen (der im Gegensatz zum Hash oben überhaupt nicht aus dem Eintragsschlüssel abgeleitet wird), verwenden Sie Folgendes
\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}
Antwort3
Sie können das erstellte PDF mit einigen Befehlszeilentools nachbearbeiten, um nach Zitatschlüsseln zu suchen und diese in der PDF-Quelle zu ersetzen.
Zuerst müssen Sie das PDF entpacken, um die textuelle Suche und Ersetzung zu ermöglichen, zum Beispiel mit pdftk
.
Im unkomprimierten PDF sehen die Links folgendermaßen aus:
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
und die entsprechenden Teile weiter unten:
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
Jetzt können Sie grep
die Quelle für das Muster verwenden /D (cite.0@[some key])
und nur den Schlüsselteil speichern.
Anschließend können Sie durch Ausführen einer Schleife über alle Schlüssel einen Ersatzschlüssel generieren, beispielsweise die md5
Prüfsumme (von der vernünftigerweise erwartet werden kann, dass sie für jeden Schlüssel eindeutig ist).
Als nächstes können Sie alle Vorkommen des Schlüssels durch den Ersatz mit ersetzen sed
.
Am Ende der Schleife komprimieren Sie das PDF erneut pdftk
und sind fertig.
Vollständiges Skript (Aufruf mit 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
Resultierender Link-Tooltip in Firefox:
Zusätzlicher Bonus: Der Link funktioniert immer noch.