![Автоматически связывать библиографическую запись с Google Scholar, если поле URL отсутствует](https://rvso.com/image/254699/%D0%90%D0%B2%D1%82%D0%BE%D0%BC%D0%B0%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%20%D1%81%D0%B2%D1%8F%D0%B7%D1%8B%D0%B2%D0%B0%D1%82%D1%8C%20%D0%B1%D0%B8%D0%B1%D0%BB%D0%B8%D0%BE%D0%B3%D1%80%D0%B0%D1%84%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D1%83%D1%8E%20%D0%B7%D0%B0%D0%BF%D0%B8%D1%81%D1%8C%20%D1%81%20Google%20Scholar%2C%20%D0%B5%D1%81%D0%BB%D0%B8%20%D0%BF%D0%BE%D0%BB%D0%B5%20URL%20%D0%BE%D1%82%D1%81%D1%83%D1%82%D1%81%D1%82%D0%B2%D1%83%D0%B5%D1%82.png)
Что-то, что я считал абсолютно потрясающим, но это выходит за рамки моих навыков BibLaTeX: всякий раз, когда нет поля URL, сгенерировать ссылку, которая ищет название, авторов и год в Google Scholar. Так, для статьи под названием "Rocket Science", написанной Дж. Доу в 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 (оба в DEV на SF). Во-первых, давайте разрешим новое поле "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 появится поле следующего вида:
На которое вы можете ссылаться как на поле "AUTOURL" в какой-то логике, например, в формате поля TITLE, чтобы добавить его как гиперссылку. Вот простой пример:
\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. Это особенно касается части автора, которая сложна, поскольку нужно убрать различные скобки. Я решил заняться этим с помощью экспериментального LaTeX3l3str
модуль (изменение: в январе 2013 года функции кодирования были перемещены в 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}
Я настроил поиск так, чтобы использовались только фамилии авторов, а все неразрывные пробелы перед кодированием были преобразованы в обычные.
Как отмечает ПЛК, это, вероятно, можно было бы сделать гораздо проще, используя бибер на более ранней стадии!