URL フィールドが存在しない場合は、参考文献エントリを Google Scholar に自動的にリンクします

URL フィールドが存在しない場合は、参考文献エントリを Google Scholar に自動的にリンクします

絶対に素晴らしいと思ったのですが、私の BibLaTeX スキルをはるかに超える機能があります。URL フィールドがない場合は常に、Google Scholar でタイトル、著者、年を検索するリンクを生成します。つまり、1999 年に J. Doe が執筆した「Rocket Science」という論文の場合、リンクがhttp://scholar.google.com/scholar?q=%22Rocket+Science%22+author%3Adoe&as_ylo=1999&as_yhi=1999生成され、参考文献のエントリの論文名または便利な場所に配置されます。

正確なタイトル、年、著者は、ほとんどの場合、明確で利用可能であるべきだと思います。上記の不可解なクエリを入力すると、次のようになります。

検索クエリの結果のスクリーンキャプチャ

もし誰かがこのアイデアを気に入ってくれたらそしてそれを実装する biblatex の力があれば、私はとても興奮するでしょう :)

答え1

これは、biblatex 2.3 と biber 1.3 (どちらも SF の DEV 版) を必要とするソリューションです。まず、すべてのエントリに新しい「AUTOURL」フィールドを許可して、このフィールドに値を入力できるようにします。URL フィールドは参考文献に印刷できるため、おそらく使用したくないでしょう。ドライバーを変更して、AUTOURL フィールドをテストし、タイトルなどにハイパーリンクを追加できます。ここでは、このための URL データの生成だけに集中します。

これをあなたのbiblatex-dm.cfg

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

ここで、biber ソースマップ機能を使用して実際の作業を行います。この機能は、任意の URL を作成できるため、すべてをハードコーディングするよりも優れています。

\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 は、他のフィールドの一部に挿入された結果 URL に含まれる UTF-8 または LaTeX 文字マクロも URL エスケープするので、心配する必要はありません。

これにより、.bbl のフィールドは次のようになります。

ここに画像の説明を入力してください

これを、TITLE フィールド形式などのロジックで「AUTOURL」フィールドとして参照し、ハイパー参照リンクとして追加することができます。簡単な例を挙げると、次のようになります。

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

以下は、デフォルト構成を変更せずにすべてのエントリ タイプで機能し、カスタム URL が利用できない場合にのみ自動生成された URL を使用する、より洗練された例です。

\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の置換には フィールドのみが使用され、またはautourlから生成された URL は置換されません。製品版では も考慮され、欠落したフィールドに対してより堅牢にする必要があります。doieprint\ifhyperref

答え2

第二バージョン

biblatex扱いにくい文字がスペースだけであると仮定すれば、ほとんどの作業は を使用して行うことができます。変換を行うために、姓を+区切り文字を使用して一時変数に保存するだけの特別な名前形式を使用しました。タイトルは\%22(エンコードされた"") で囲まれ、最初の年と最後の年は同じ値に設定されます (年の有効性はチェックされません)。

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

expl3ビルド前の「すべて置換」コマンドをロードしましたが、これなしでも再コーディングできますexpl3。これはここでの重要なポイントではないので、気にしていません。

最初のバージョン

ここで必要な作業のほとんどは、内部フォーマットからデータを取り出しbiblatex、URL文字列に正しくエスケープすることです。これは特に著者部分に当てはまります。これは削除する括弧がたくさんあるため、扱いにくいです。私は実験的なLaTeX3を使用してこれに取り組むことにしました。l3strモジュール (編集: 2013 年 1 月にエンコード関数は に移動されましたl3str-convert) には、URL エンコードのコードと、すべての構築を行う一般的な LaTeX3 プログラミング サポート システムが含まれています。(エンコードはビット単位で行う必要があるため、+渡すフィールド間ではエンコードされません。)

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

著者の姓のみを使用する検索を構築し、エンコード前に非改行スペースを通常のスペースに変換しました。

PLK が指摘しているように、これはおそらく、早い段階で biber を使用すると、より簡単に実行できるでしょう。

関連情報