
Cuando abro el pdf generado, pdflatex
por ejemplo, en Firefox, la URL al pasar el cursor sobre una referencia muestra la clave bib interna. ¿Cómo puedo prevenir esto?
Considere el siguiente MWE:
mwe.tex
\documentclass{article}
\usepackage[backend=biber]{biblatex}
\addbibresource{bib.bib}
\usepackage{hyperref}
\begin{document}
Test\cite{secretbibkey}
\printbibliography
\end{document}
babero.babero
@article{secretbibkey,
author = {Joe},
title = {Just a title},
number = {ABCD-E/2008/ab/1234},
institution = {University},
year = {2008}
}
Ahora mira la siguiente captura de pantalla:
Muestra la clave bib que utilicé al pasar el cursor sobre la cita (aparentemente la captura de pantalla no incluye mi cursor, pero estaba encima del "1" verde). ¿Hay alguna forma de aleatorizar/anonimizar estas claves de URL?
Respuesta1
Puedes probar algo como esto. No estoy seguro de si \int_to_alpha
maneja todos los caracteres y entradas que pueden aparecer en un destino, y si puede llevar a destinos idénticos, pero fue la mejor función expandible que encontré por ahora. Codificará todos los destinos, también el de secciones y etiquetas. Para codificar sólo las claves babero se necesitarían varios cambios en el biblatex
código.
\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}
Respuesta2
Si desea ocultar todo el etiquetado interno, Ulrike'srespuestaes mucho mejor, pero aquí hay una manera de ofuscar solo los enlaces creados mediante biblatex
hashes MD5 (creo que los hash MD5 ya no se recomiendan para nada crítico para la seguridad, pero podría ser suficiente para sus propósitos).
El comando \blx@mdfivesum
utilizado aquí requiere una versión relativamente reciente biblatex
. Si estás atrapado con algo viejo biblatex
, cárgate \usepackage{pdftexcmds}
y di \let\blx@mdfivesum\pdf@mdfivesum
.
La idea es cambiar todos los comandos de enlace de usar la clave de entrada a una versión hash de la clave de entrada.
\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}
En caso de que prefiera un designador numérico (que, a diferencia del hash anterior, no se deriva en absoluto de la clave de entrada), utilice lo siguiente
\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}
Respuesta3
Puede posprocesar el pdf creado con algunas herramientas de línea de comandos para buscar claves de citas y reemplazarlas en la fuente del pdf.
Primero debe descomprimir el pdf para permitir la búsqueda textual y reemplazarlo, por ejemplo con pdftk
.
En el pdf sin comprimir los enlaces se ven así:
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
y las partes correspondientes más abajo:
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
Ahora puede encontrar grep
la fuente del patrón /D (cite.0@[some key])
y almacenar solo la parte clave.
Luego, al recorrer todas las claves, puede generar una clave de reemplazo, por ejemplo, la md5
suma de verificación (que razonablemente se puede esperar que sea única para cada clave).
A continuación, puede reemplazar todas las apariciones de la clave con el reemplazo usando sed
.
Al final del ciclo, vuelves a comprimir el pdf pdftk
y listo.
Guión completo (llamar con 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
Información sobre herramientas del enlace resultante en Firefox:
Bonificación adicional: el enlace aún funciona.