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}

이제 우리는 임의의 URL을 생성할 수 있으므로 이 모든 것을 하드 코딩하는 것보다 더 나은 biber 소스 맵 기능을 사용하여 실제 작업을 수행합니다.

\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)에는 모든 구성을 수행하는 일반 LaTeX3 프로그래밍 지원 시스템과 함께 URL 인코딩을 위한 코드가 포함되어 있습니다. ( +전달하는 필드 사이에 인코딩되지 않은 채로 남아 있도록 비트 단위로 인코딩을 수행해야 합니다 .)

\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를 사용하면 훨씬 더 쉽게 수행될 수 있을 것입니다!

관련 정보