![Bibliographieeintrag automatisch mit Google Scholar verknüpfen, wenn kein URL-Feld vorhanden ist](https://rvso.com/image/254699/Bibliographieeintrag%20automatisch%20mit%20Google%20Scholar%20verkn%C3%BCpfen%2C%20wenn%20kein%20URL-Feld%20vorhanden%20ist.png)
Ich dachte, das wäre absolut fantastisch, geht aber weit über meine BibLaTeX-Kenntnisse hinaus: Wenn kein URL-Feld vorhanden ist, generieren Sie einen Link, der bei Google Scholar nach Titel, Autoren und Jahr sucht. Für eine Arbeit mit dem Titel „Rocket Science“, die 1999 von J. Doe geschrieben wurde, http://scholar.google.com/scholar?q=%22Rocket+Science%22+author%3Adoe&as_ylo=1999&as_yhi=1999
würde der Link also generiert und unter den Titel der Arbeit im Bibliographieeintrag oder wo immer es praktisch wäre, gesetzt.
Ich denke, der genaue Titel, das Jahr und der Autor sollten fast immer eindeutig und verfügbar sein. So würde die obige kryptische Abfrage aussehen, wenn sie eingegeben würde:
Wenn also jemandem die Idee gefallen hatUndwenn ich das biblatex-wissen hätte, um es zu implementieren, wäre ich total begeistert :)
Antwort1
Hier ist eine Lösung, die Biblatex 2.3 und Biber 1.3 erfordert (beide in der Entwicklung auf SF). Lassen wir zunächst ein neues „AUTOURL“-Feld in allen Einträgen zu, damit wir es ausfüllen können, da wir das URL-Feld wahrscheinlich nicht verwenden möchten, da es in der Bibliographie gedruckt werden kann. Wir können unseren Treiber ändern, um das AUTOURL-Feld zu testen und einen Hyperlink zum Titel oder was auch immer hinzuzufügen. Hier konzentriere ich mich nur auf die Generierung der URL-Daten hierfür.
Fügen Sie dies zu Ihrembiblatex-dm.cfg
\DeclareDatamodelEntryfields{autourl}
\DeclareDatamodelFields[type=field, datatype=uri]{autourl}
Jetzt erledigen wir die eigentliche Arbeit mit der Biber-Sourcemap-Funktion. Das ist besser, als das alles fest zu codieren, da wir dann beliebige URLs erstellen können:
\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 maskiert außerdem alle UTF-8- oder LaTeX-Zeichenmakros, die durch das Einfügen von Teilen anderer Felder in die URL gelangen, sodass Sie sich darüber keine Gedanken machen müssen.
Daraus ergibt sich in der .bbl-Datei ein Feld wie dieses:
Sie können darauf in einer Logik wie dem Feld TITLE als „AUTOURL“-Feld verweisen, um es als Hyperref-Link hinzuzufügen. Hier ein einfaches Beispiel:
\DeclareFieldFormat{title}{\href{\thefield{autourl}}{#1}}
Hier ist ein ausgefeilteres Beispiel, das für alle Eintragstypen in ihrer Standardkonfiguration ohne Änderung funktioniert und die automatisch generierte URL nur dann verwendet, wenn keine benutzerdefinierte URL verfügbar ist:
\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}}}
url
Zum Ersetzen wird nur das Feld verwendet, nicht die aus oder autourl
generierten URLs . Eine Produktionsversion sollte fehlende Felder ebenfalls berücksichtigen und robuster dagegen gemacht werden.doi
eprint
\ifhyperref
Antwort2
Zweite Version
Die meiste Arbeit kann mit erledigt werden, biblatex
wenn wir davon ausgehen, dass die einzigen kniffligen Zeichen Leerzeichen sind. Für die Konvertierung habe ich ein spezielles Namensformat verwendet, das Nachnamen einfach in einer temporären Variable speichert und +
sie mit trennt. Der Titel ist von \%22
(codierten "
") umgeben und das erste und das letzte Jahr sind auf denselben Wert eingestellt (es gibt keine Überprüfung auf die Gültigkeit des Jahres).
\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}
Ich habe expl3
einen vorgefertigten Befehl zum Ersetzen aller geladen, aber dieser könnte ohne neu codiert werden expl3
. Da dies hier nicht der entscheidende Punkt ist, habe ich mir die Mühe nicht gemacht!
Erste Version
Der größte Teil der hier erforderlichen Arbeit besteht darin, die Daten aus biblatex
dem internen Format von zu holen und korrekt in eine URL-Zeichenfolge zu übertragen. Dies gilt insbesondere für den Autorteil, der schwierig ist, da mehrere Klammern entfernt werden müssen. Ich habe beschlossen, dies mit dem experimentellen LaTeX3 anzugehenl3str
Modul (Bearbeiten: im Januar 2013 wurden die Kodierungsfunktionen nach verschoben l3str-convert
), das Code für die URL-Kodierung sowie das allgemeine LaTeX3-Programmierunterstützungssystem für die gesamte Konstruktion enthält. (Sie müssen die Kodierung in Bits vornehmen, sodass +
zwischen den übergebenen Feldern nichts Kodiertes übrig bleibt.)
\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}
Ich habe die Suche so aufgebaut, dass nur die Nachnamen der Autoren verwendet werden und alle geschützten Leerzeichen vor der Kodierung in normale Leerzeichen umgewandelt werden.
Wie PLK anmerkt, wäre dies wahrscheinlich viel einfacher möglich, wenn man früher Biber verwendet hätte!