Я ищу способ сделать так, чтобы biblatex
URL-адреса выводились только на печать, если не указан DOI (в моем случае DOI в любом случае ведут к ссылкам в ссылках, что делает URL-адрес избыточным).
Я придумал это (но, похоже, это вызывает бесконечный цикл, поскольку компиляция не завершается...):
\renewbibmacro*{url+urldate}{%
\iffieldundef{doi}
{\usebibmacro{url+urldate}}
{}%
}
похоже, сохранение макроса с помощью \let
не работает из-за +
...
есть идеи, как это правильно сделать?
М(Н)ВЕБ:
\documentclass{article}
\usepackage[style=authoryear-comp]{biblatex}
\usepackage{hyperref}
%\renewbibmacro*{url+urldate}{%
% \iffieldundef{doi}
% {\usebibmacro{url+urldate}}
% {}%
%
\addbibresource{\jobname.bib}
\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
@book{key,
author = {Author, A.},
year = {2001},
title = {Title},
publisher = {Publisher},
archivePrefix = {arXiv},
arxivId = {1607.07249},
doi = {10.1007/978-3-319-49004-5_22},
eprint = {1607.07249},
url = {http://link.springer.com/10.1007/978-3-319-49004-5_22},
}
\end{filecontents}
\begin{document}
\nocite{*}
\printbibliography
\end{document}
решение1
Нет \letbibmacro
(и вы можете подать запрос на функцию), но создать ее несложно:
\documentclass{article}
\usepackage[style=authoryear-comp]{biblatex}
\usepackage{hyperref}
\newcommand{\letbibmacro}[2]{%
\csletcs{abx@macro@#1}{abx@macro@#2}%
}
\letbibmacro{orig-url+urldate}{url+urldate}
\renewbibmacro*{url+urldate}{%
\iffieldundef{doi}
{\usebibmacro{orig-url+urldate}}
{}%
}
\addbibresource{\jobname.bib}
\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
@book{key,
author = {Author, A.},
year = {2001},
title = {Title},
publisher = {Publisher},
archivePrefix = {arXiv},
arxivId = {1607.07249},
doi = {10.1007/978-3-319-49004-5_22},
eprint = {1607.07249},
url = {http://link.springer.com/10.1007/978-3-319-49004-5{\_}22},
}
@book{key2,
author = {Author, A.},
year = {2001},
title = {Title},
publisher = {Publisher},
archivePrefix = {arXiv},
arxivId = {1607.07249},
eprint = {1607.07249},
url = {http://link.springer.com/10.1007/978-3-319-49004-5{\_}22},
}
\end{filecontents}
\begin{document}
\nocite{*}
\printbibliography
\end{document}
решение2
Вы уже получили отличные ответы на заданный вами вопрос, поэтому я подумал, что стоит добавить два решения проблемы, которую вы хотите решить.
Вы можете использовать
\DeclareSourcemap{
\maps[datatype=bibtex]{
\map{
\step[fieldsource=doi, final]
\step[fieldset=url, null]
\step[fieldset=urldate, null]
}
}
}
или
\AtEveryBibitem{%
\iffieldundef{doi}
{}
{\clearfield{url}\clearfield{urlyear}}%
}
не печатать URL, если присутствует DOI.
решение3
Чтобы условно вывести URL, вы можете обернуть его в\iffieldundef{doi}{}{}
\documentclass{article}
\usepackage[style=authoryear-comp]{biblatex}
\usepackage{hyperref}
% print url if no doi
\renewbibmacro*{doi+eprint+url}{%
\printfield{doi}
\newunit\newblock
\iftoggle{bbx:eprint}{
\usebibmacro{eprint}
}{}%
\newunit\newblock
\iffieldundef{doi}{
\usebibmacro{url+urldate}}
{}
}
\addbibresource{\jobname.bib}
\usepackage{filecontents}
\begin{filecontents*}{\jobname.bib}
@book{key,
author = {Author, A.},
year = {2001},
title = {Title},
publisher = {Publisher},
archivePrefix = {arXiv},
arxivId = {1607.07249},
doi = {10.1007/978-3-319-49004-5_22},
eprint = {1607.07249},
url = {http://link.springer.com/10.1007/978-3-319-49004-5{\_}22},
}
@book{keyx,
author = {Author, A.},
year = {2001},
title = {Title},
publisher = {Publisher},
archivePrefix = {arXiv},
arxivId = {1607.07249},
url = {http://link.springer.com/10.1007/978-3-319-49004-5{\_}22},
}
\end{filecontents*}
\begin{document}
\nocite{*}
\printbibliography
\end{document}