Bibliographieeintrag automatisch mit Google Scholar verknüpfen, wenn kein URL-Feld vorhanden ist

Bibliographieeintrag automatisch mit Google Scholar verknüpfen, wenn kein URL-Feld vorhanden ist

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=1999wü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:

Bildschirmaufnahme des Ergebnisses der Suchanfrage

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:

Bildbeschreibung hier eingeben

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}}}

urlZum Ersetzen wird nur das Feld verwendet, nicht die aus oder autourlgenerierten URLs . Eine Produktionsversion sollte fehlende Felder ebenfalls berücksichtigen und robuster dagegen gemacht werden.doieprint\ifhyperref

Antwort2

Zweite Version

Die meiste Arbeit kann mit erledigt werden, biblatexwenn 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 expl3einen 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 biblatexdem 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 anzugehenl3strModul (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!

verwandte Informationen