当没有 URL 字段时自动将参考书目条目链接到 Google Scholar

当没有 URL 字段时自动将参考书目条目链接到 Google Scholar

我以为这绝对是一件了不起的事情,但这远远超出了我的 BibLaTeX 技能:只要没有 url 字段,就会生成一个链接,用于在 Google Scholar 上搜索标题、作者和年份。因此,对于 J. Doe 于 1999 年撰写的一篇名为“火箭科学”的论文,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 还会对由于与其他字段的部分拼接而出现在 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 可以更轻松地完成!

相关内容