![Vincular automaticamente a entrada da bibliografia ao Google Acadêmico quando nenhum campo de URL estiver presente](https://rvso.com/image/254699/Vincular%20automaticamente%20a%20entrada%20da%20bibliografia%20ao%20Google%20Acad%C3%AAmico%20quando%20nenhum%20campo%20de%20URL%20estiver%20presente.png)
Algo que achei que seria absolutamente incrível, mas está muito além das minhas habilidades em BibLaTeX: sempre que não houver campo de url, gere um link que pesquise título, autores e ano no Google Scholar. Assim, para um artigo chamado "Rocket Science", escrito por J. Doe em 1999, o link http://scholar.google.com/scholar?q=%22Rocket+Science%22+author%3Adoe&as_ylo=1999&as_yhi=1999
seria gerado e colocado no nome do artigo da entrada bibliográfica ou onde fosse conveniente.
Acho que o título exato, o ano e o autor devem ser quase sempre inequívocos e disponíveis. Esta é a aparência da consulta enigmática acima quando inserida:
Então, se alguém gostou da ideiaetivesse o biblatex-fu para implementá-lo, eu ficaria totalmente animado :)
Responder1
Aqui está uma solução que requer biblatex 2.3 e biber 1.3 (ambos em DEV em SF). Primeiramente, vamos permitir um novo campo "AUTOURL" em todas as entradas para que possamos preenchê-lo, pois provavelmente não queremos usar o campo URL, pois ele pode ser impresso na bibliografia. Podemos alterar nosso driver para testar o campo AUTOURL e adicionar um hiperlink no título ou qualquer outra coisa. Aqui estou me concentrando apenas em gerar os dados de URL para isso.
Adicione isso ao seubiblatex-dm.cfg
\DeclareDatamodelEntryfields{autourl}
\DeclareDatamodelFields[type=field, datatype=uri]{autourl}
Agora fazemos o trabalho real com o recurso biber sourcemap, que é melhor do que codificar tudo isso, pois podemos criar URLs arbitrários:
\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 também escapará de URL de qualquer macro char UTF-8 ou LaTeX que acabe na URL devido à emenda em partes de outros campos, então você não precisa se preocupar com isso.
Isso resulta em um campo no .bbl como este:
Que você pode referenciar como o campo "AUTOURL" em alguma lógica, como o formato do campo TITLE, para adicioná-lo como um link de hiperref. Para dar um exemplo simples:
\DeclareFieldFormat{title}{\href{\thefield{autourl}}{#1}}
Aqui está um exemplo mais sofisticado que funciona para todos os tipos de entrada em sua configuração padrão sem alterá-la e usa o URL gerado automaticamente somente quando nenhum personalizado estiver disponível:
\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}}}
Apenas o url
campo é usado para substituir autourl
, não URLs gerados a partir de doi
ou eprint
. Uma versão de produção também deve respeitar \ifhyperref
e ser mais robusta contra campos ausentes.
Responder2
Segunda versão
A maior parte do trabalho pode ser feita biblatex
se assumirmos que os únicos caracteres complicados são espaços. Para fazer a conversão, usei um formato de nome especial que simplesmente salva os sobrenomes em uma variável temporária para +
separá-los. O título é circundado por \%22
(codificado "
"), e o primeiro e o último ano têm o mesmo valor (não há verificação da validade do ano).
\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}
Carreguei expl3
um comando pré-construído 'replace all', mas isso pode ser recodificado sem expl3
. Como esse não é o ponto chave aqui, não me preocupei!
Primeira versão
A maior parte do trabalho necessário aqui é retirar os dados do biblatex
formato interno e escapar corretamente para uma string de URL. Isso é particularmente verdadeiro para a parte do autor, que é complicada porque há vários colchetes para remover. Decidi resolver isso usando o LaTeX3 experimentall3str
módulo (editar: em janeiro de 2013 as funções de codificação foram movidas para l3str-convert
), que inclui código para a codificação de URL, junto com o sistema geral de suporte à programação LaTeX3 para fazer toda a construção. (Você tem que fazer a codificação em bits para que +
fique sem codificação entre os campos que você está passando.)
\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}
Eu construí a pesquisa para usar apenas sobrenomes de autores, com quaisquer espaços inseparáveis convertidos em normais antes da codificação.
Como observa PLK, isso provavelmente poderia ser feito com mais facilidade usando o biber em um estágio anterior!