Vincular automáticamente una entrada de bibliografía a Google Scholar cuando no hay ningún campo de URL presente

Vincular automáticamente una entrada de bibliografía a Google Scholar cuando no hay ningún campo de URL presente

Algo que pensé que sería absolutamente sorprendente pero que va más allá de mis habilidades en BibLaTeX: siempre que no haya un campo de URL, genere un enlace que busque el título, los autores y el año en Google Scholar. Entonces, para un artículo llamado "Rocket Science", escrito por J. Doe en 1999, el enlace http://scholar.google.com/scholar?q=%22Rocket+Science%22+author%3Adoe&as_ylo=1999&as_yhi=1999se generaría y se colocaría en el nombre del artículo de la entrada de bibliografía o donde fuera conveniente.

Creo que el título, el año y el autor exactos casi siempre deberían ser inequívocos y estar disponibles. Así es como se vería la consulta críptica anterior al ingresarla:

captura de pantalla del resultado de la consulta de búsqueda

Así que si a alguien le gustó la ideaySi tuviera el biblatex-fu para implementarlo, estaría totalmente entusiasmado :)

Respuesta1

Aquí hay una solución que requiere biblatex 2.3 y biber 1.3 (ambos en DEV en SF). En primer lugar, permitamos un nuevo campo "AUTOURL" en todas las entradas para poder completarlo, ya que probablemente no queramos utilizar el campo URL, ya que se puede imprimir en la bibliografía. Podemos cambiar nuestro controlador para probar el campo AUTOURL y agregar un hipervínculo en el título o lo que sea. Aquí me estoy concentrando sólo en generar los datos de la URL para esto.

Añade esto a tubiblatex-dm.cfg

\DeclareDatamodelEntryfields{autourl}
\DeclareDatamodelFields[type=field, datatype=uri]{autourl}

Ahora hacemos el trabajo real con la función biber sourcemap, que es mejor que codificar todo esto, ya que luego podemos crear URL arbitrarias:

\DeclareSourcemap{
  \maps[datatype=bibtex]{
     \map[overwrite]{
      \step[fieldset=autourl, fieldvalue={http://scholar.google.com/scholar?q="}]
      \step[fieldsource=title]
      \step[fieldset=autourl, origfieldval, append]
      \step[fieldset=autourl, fieldvalue={"+author:}, append]
      \step[fieldsource=author, match=\regexp{\A([^,]+)\s*,}]
      \step[fieldset=autourl, fieldvalue={$1}, append]
      \step[fieldset=autourl, fieldvalue={&as_ylo=}, append]
      \step[fieldsource=year]
      \step[fieldset=autourl, origfieldval, append]
      \step[fieldset=autourl, fieldvalue={&as_yhi=}, append]
      \step[fieldset=autourl, origfieldval, append]
    }
  }
}

Biber también escapará de la URL de cualquier macro de caracteres UTF-8 o LaTeX que termine en la URL debido al empalme en partes de otros campos, por lo que no tiene que preocuparse por eso.

Esto da como resultado un campo en el .bbl como este:

ingrese la descripción de la imagen aquí

Al que puede hacer referencia como el campo "AUTOURL" en alguna lógica, como el formato del campo TÍTULO, para agregarlo como un enlace de hiperreferencia. Para tomar un ejemplo simple:

\DeclareFieldFormat{title}{\href{\thefield{autourl}}{#1}}

Aquí hay un ejemplo más sofisticado que funciona para todos los tipos de entrada en su configuración predeterminada sin cambiarla y usa la URL generada automáticamente solo cuando no hay ninguna personalizada disponible:

\DeclareFieldFormat{title}{\iffieldundef{url}{\href{\thefield{autourl}}{\mkbibemph{#1}}}{\href{\thefield{url}}{\mkbibemph{#1}}}}
\DeclareFieldFormat[article,inbook,incollection,inproceedings,patent,thesis,unpublished]{title}{\iffieldundef{url}{\href{\thefield{autourl}}{\mkbibquote{#1\isdot}}}{\href{\thefield{url}}{\mkbibquote{#1\isdot}}}}
\DeclareFieldFormat[suppbook,suppcollection,suppperiodical]{title}{\iffieldundef{url}{\href{\thefield{autourl}}{#1}}{\href{\thefield{url}}{#1}}}

Sólo urlse utiliza el campo para reemplazar autourl, no las URL generadas a partir de doio eprint. Una versión de producción también debería respetar \ifhyperrefy hacerse más robusta contra los campos faltantes.

Respuesta2

Segunda versión

La mayor parte del trabajo se puede realizar biblatexsi asumimos que los únicos caracteres complicados son los espacios. Para realizar la conversión, he usado un formato de nombre especial que simplemente guarda los apellidos en una variable temporal para +separarlos. El título está rodeado por \%22(codificado ""), y el primer y el último año tienen el mismo valor (no se verifica la validez del año).

\begin{filecontents}{\jobname.bib}
@article{test,
  author = {Doe, J. and Other, Arthur N.},
  title  = {Rocket Science},
  year   = {1999},
}
\end{filecontents}
\documentclass{article}
\usepackage{expl3}
\usepackage[backend=bibtex]{biblatex}
\bibliography{\jobname}

\ExplSyntaxOn
\char_set_catcode_space:N \ %
\cs_new_protected:Npn\spacetoplus#1%
  {\tl_greplace_all:Nnn#1{ }{+}}
\ExplSyntaxOff
\makeatletter
\DeclareNameFormat{searchurl}{%
  \ifnumequal{\value{listcount}}{1}
    {}
    {\gappto{\bbx@gtempa}{+}}%
  \xdef\bbx@gtempa{%
    \unexpanded\expandafter{\bbx@gtempa}%
    author\@percentchar 3A%
    \unexpanded{#1}%
  }%
}

\newbibmacro*{url+urldate}{%
  \iffieldundef{url}
    {%
      \savefield{title}{\bbx@gtempa}%
      \xdef\bbx@gtempa{%
        http://scholar.google.com/scholar?q=
        \@percentchar
        22%
        \unexpanded\expandafter{\bbx@gtempa}%
      }
      \xdef\bbx@gtempa{%
        \unexpanded\expandafter{\bbx@gtempa}%
        \@percentchar 22+%
      }
      \printnames[searchurl]{author}%
      \edef\bbx@tempa{&as_ylo=\thefield{year}&as_yhi=\thefield{year}}%
      \xdef\bbx@gtempa{%
        \unexpanded\expandafter{\bbx@gtempa}%
        \unexpanded\expandafter{\bbx@tempa}%
      }%
      \spacetoplus{\bbx@gtempa}%
      \restorefield{url}{\bbx@gtempa}%
    }
    {}%
  \printfield{url}%
  \iffieldundef{urlyear}
    {}
    {\setunit*{\addspace}%
     \printurldate}}
\makeatother
\begin{document}
\cite{test}
\printbibliography
\end{document}

Lo cargué expl3para un comando previo a la compilación 'reemplazar todo', pero esto podría recodificarse sin expl3. Como ese no es el punto clave aquí, ¡no me he molestado!

Primera versión

La mayor parte del trabajo requerido aquí es sacar los datos del biblatexformato interno de y escaparlos correctamente a una cadena URL. Esto es particularmente cierto para la parte del autor, que es complicada ya que hay varios tirantes que quitar. He decidido abordar esto usando el LaTeX3 experimental.l3strmódulo (editar: en enero de 2013 las funciones de codificación se trasladaron a l3str-convert), que incluye código para la codificación de URL, junto con el sistema general de soporte de programación LaTeX3 para realizar toda la construcción. (Debe realizar la codificación en bits para que +quede sin codificar entre los campos que pasa).

\begin{filecontents}{\jobname.bib}
@article{test,
  author = {Doe, J. and Other, Arthur N.},
  title  = {Rocket Science},
  year   = {1999},
}
\end{filecontents}
\documentclass{article}
\usepackage{expl3,l3str-convert}
\usepackage[backend=bibtex]{biblatex}
\bibliography{\jobname}
\ExplSyntaxOn
\str_new:N \__searchurl_search_str
\str_new:N \__searchurl_tmp_str
\tl_new:N \__searchurl_tmp_tl
\cs_new_protected_nopar:Npn \createsearchurl
  {
    \str_set:Nn \__searchurl_search_str
      { http://scholar.google.com/scholar?q= }
    \savefield* { year } { \__searchurl_tmp_tl }
    \cs_if_exist:NT \__searchurl_tmp_tl
      { \str_put_right:NV \__searchurl_search_str \__searchurl_tmp_tl }
    \clist_map_function:nN { title , journal } \__searchurl_add_field:n
    \savename* { author } { \__searchurl_tmp_tl }
    \cs_if_exist:NT \__searchurl_tmp_tl
      { \__searchurl_convert_authors: }
    \restorefield { url } { \__searchurl_search_str }
  }
\cs_new_protected:Npn \__searchurl_add_field:n #1
  {
    \savefield* {#1} { \__searchurl_tmp_tl }
    \cs_if_exist:NT \__searchurl_tmp_tl
      {
        \str_set_convert:NVnn \__searchurl_tmp_str
          \__searchurl_tmp_tl { } { latin1 / url }  
        \str_put_left:Nn \__searchurl_tmp_str { + }
        \str_put_right:NV \__searchurl_search_str \__searchurl_tmp_str   
      }
  }
\cs_new_protected_nopar:Npn \__searchurl_convert_authors:
  {
    \exp_after:wN \__searchurl_convert_authors:nn
      \__searchurl_tmp_tl
  }
\cs_new_protected_nopar:Npn \__searchurl_convert_authors:nn #1#2
  {
    \tl_map_inline:nn {#2} 
      { \__searchurl_convert_authors:nnnnnnnnn ##1 }
  }
\group_begin:
  \char_set_catcode_active:N \~
  \char_set_catcode_space:N \ %
  \cs_new_protected_nopar:Npn\__searchurl_convert_authors:nnnnnnnnn%
    #1#2#3#4#5#6#7#8#9%
    {%
      \tl_set:Nn\__searchurl_tmp_tl{#2}%
      \tl_replace_all:Nnn\__searchurl_tmp_tl{~}{ }% 
      \str_set_convert:NVnn\__searchurl_tmp_str
        \__searchurl_tmp_tl{}{latin1/url}%
      \str_put_left:Nn\__searchurl_tmp_str{+}%
      \str_put_right:NV\__searchurl_search_str\__searchurl_tmp_str
    }%
\group_end:
\cs_generate_variant:Nn \str_set_convert:Nnnn { NV }
\cs_generate_variant:Nn \str_put_right:Nn { NV }
\ExplSyntaxOff

\newbibmacro*{url+urldate}{%
  \iffieldundef{url}
    {\createsearchurl}
    {}%
  \printfield{url}%
  \iffieldundef{urlyear}
    {}
    {\setunit*{\addspace}%
     \printurldate}}

\begin{document}
\cite{test}
\printbibliography
\end{document}

He creado la búsqueda para usar solo los apellidos de los autores, y los espacios que no se separan se convierten a espacios normales antes de codificar.

Como señala PLK, esto probablemente podría hacerse más fácilmente usando biber en una etapa anterior.

información relacionada