![URL 필드가 없을 때 참고문헌 항목을 Google Scholar에 자동으로 연결합니다.](https://rvso.com/image/254699/URL%20%ED%95%84%EB%93%9C%EA%B0%80%20%EC%97%86%EC%9D%84%20%EB%95%8C%20%EC%B0%B8%EA%B3%A0%EB%AC%B8%ED%97%8C%20%ED%95%AD%EB%AA%A9%EC%9D%84%20Google%20Scholar%EC%97%90%20%EC%9E%90%EB%8F%99%EC%9C%BC%EB%A1%9C%20%EC%97%B0%EA%B2%B0%ED%95%A9%EB%8B%88%EB%8B%A4..png)
정말 놀라운 일이라고 생각했지만 내 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은 사용되지 않습니다 . 프로덕션 버전은 또한 누락된 필드를 존중하고 더욱 강력하게 만들어야 합니다.doi
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
)에는 모든 구성을 수행하는 일반 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를 사용하면 훨씬 더 쉽게 수행될 수 있을 것입니다!