當不存在 url 欄位時自動將參考書目條目連結到 Google Scholar

當不存在 url 欄位時自動將參考書目條目連結到 Google Scholar

我認為這絕對是令人驚奇的,但遠遠超出了我的 BibLaTeX 技能:只要沒有 url 字段,就生成一個在 Google Scholar 上搜尋標題、作者和年份的連結。因此,對於 J. Doe 在 1999 年撰寫的一篇名為“Rocket Science”的論文,將產生連結http://scholar.google.com/scholar?q=%22Rocket+Science%22+author%3Adoe&as_ylo=1999&as_yhi=1999並將其放在參考書目條目的論文名稱或任何方便的地方。

我認為確切的標題、年份和作者應該總是明確且可用的。這就是上面的神秘查詢在輸入時的樣子:

搜尋查詢結果的螢幕截圖

所以如果有人喜歡這個主意如果有 biblatex-fu 來實現它,我會非常興奮:)

答案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 sourcemap 功能進行真正的工作,這比硬編碼所有這些更好,因為我們可以建立任意 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 也會對任何 UTF-8 或 LaTeX 字元巨集進行 URL 轉義,這些巨集由於其他欄位的部分拼接而最終出現在 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,而不使用doi或產生的 URL eprint。生產版本也應該尊重\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 更容易完成!

相關內容