기존 비브매크로 래핑

기존 비브매크로 래핑

biblatexDOI가 지정되지 않은 경우 인쇄 URL만 만드는 방법을 찾고 있습니다. 제 경우에는 DOI가 어쨌든 심판의 링크로 연결되어 URL이 중복되게 됩니다.

나는 이것을 생각해 냈습니다. (그러나 컴파일이 끝나지 않아 무한 루프를 일으키는 것 같습니다...):

\renewbibmacro*{url+urldate}{%
  \iffieldundef{doi}
    {\usebibmacro{url+urldate}}
    {}%
}

매크로 저장이 \let작동하지 않는 것 같습니다 +.

이 작업을 올바르게 수행하는 방법을 아시나요?

M(N)웹:

\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}}%
}

DOI가 있는 경우 URL을 인쇄하지 않습니다.

답변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}

관련 정보