Bib 有条件渲染字段

Bib 有条件渲染字段

如果 bib latex 引用的类型是misc,那么如何让 biblatex/biber 仅呈现 URL 字段not article

答案1

biblatex支持源映射,让您可以即时编辑您的库。

\DeclareSourcemap{
  \maps[datatype=bibtex]{
    \map{
      \pernottype{misc} % only if type is not misc
      \step[fieldset=url, null] % delete field
    }
  }
}

这种风格需要花些时间去适应,但“语言”却出奇地强大。你基本上定义了每个条目要执行的步骤列表。你可以添加像\pernottype上面这样的限制,并且有一个final步骤选项,如果条件满足(或不满足,取决于条件),它会中断处理。以下代码片段在存在 DOI 时从数据库中删除 eprint 和 arXiv 条目

\DeclareSourcemap{
  \maps[datatype=bibtex]{
    \map{
      \step[fieldsource=doi, final] % stop if doi doesn't exist
      \step[fieldset=archiveprefix, null] % delete field
      \step[fieldset=arxivid, null] % delete field
      \step[fieldset=eprint, null] % delete field
    }
  }
}

整个语言记录在手动的

答案2

另一种方法是重新定义url+urldate宏,使其只针对@misc条目类型执行某些操作。尝试将其放入您的序言中:

\renewbibmacro*{url+urldate}{%
  \ifentrytype{misc}
    {\usebibmacro{url}%
     \iffieldundef{urlyear}
       {}
       {\setunit*{\addspace}%
        \usebibmacro{urldate}}}
    {}}

答案3

这些文件位于您的 texmf 中。

如果您不使用参考书目样式,请standard.bbx在名为 else的文件中搜索名为 的文件<your-bib-style>.bbx

在其中您会发现类似的行\DeclareBibliographyDriver{article}\RequireBibliographyStyle{<another-style>}(在这种情况下您应该搜索这些文件并对它们执行以下操作),在这些块内您会发现类似的行\usebibmacro{doi+eprint+url}

您会注意到大多数类型都使用此宏(包括articlemisc)。因此,您可以更改此特定 bibmacro 的定义以不打印 URL(或者如果您不想打印,则什么也不做,doi或者eprint两者皆可)。

然后,您可以复制的定义\DeclareBibliographyDrive{misc}并将其更改为使用另一个宏,而不是与\usebibmacro{doi+eprint+url}该原始定义相匹配的宏。

应用所有这些可获得standard.bbx以下结果:

\documentclass[]{article}


\usepackage[backend=biber,maxbibnames=6,firstinits=true,arxiv=false,doi=false,citestyle=authoryear-icomp,uniquename=false]{biblatex}
\usepackage{filecontents}

\begin{filecontents*}{\jobname.bib}
@article{article,
  author = {foo},
  title = {bar},
  journal = {baz},
  year = {2017},
  URL = {www.foo.bar}
}
@misc{misc,
  author = {foo},
  title = {bar},
  year = {2017},
  URL = {www.foo.bar}
}
\end{filecontents*}

\DeclareBibliographyDriver{misc}{%
  \usebibmacro{bibindex}%
  \usebibmacro{begentry}%
  \usebibmacro{author/editor+others/translator+others}%
  \setunit{\printdelim{nametitledelim}}\newblock
  \usebibmacro{title}%
  \newunit
  \printlist{language}%
  \newunit\newblock
  \usebibmacro{byauthor}%
  \newunit\newblock
  \usebibmacro{byeditor+others}%
  \newunit\newblock
  \printfield{howpublished}%
  \newunit\newblock
  \printfield{type}%
  \newunit
  \printfield{version}%
  \newunit
  \printfield{note}%
  \newunit\newblock
  \usebibmacro{organization+location+date}%
  \newunit\newblock
  \usebibmacro{doi+eprint+url2}%
  \newunit\newblock
  \usebibmacro{addendum+pubstate}%
  \setunit{\bibpagerefpunct}\newblock
  \usebibmacro{pageref}%
  \newunit\newblock
  \iftoggle{bbx:related}
    {\usebibmacro{related:init}%
     \usebibmacro{related}}
    {}%
  \usebibmacro{finentry}}


\newbibmacro*{doi+eprint+url2}{% original definition of doi+eprint+url
  \iftoggle{bbx:doi}
    {\printfield{doi}}
    {}%
  \newunit\newblock
  \iftoggle{bbx:eprint}
    {\usebibmacro{eprint}}
    {}%
  \newunit\newblock
  \iftoggle{bbx:url}
    {\usebibmacro{url+urldate}}
    {}}

\renewbibmacro*{doi+eprint+url}{%
  \iftoggle{bbx:doi}
    {\printfield{doi}}
    {}%
  \newunit\newblock
  \iftoggle{bbx:eprint}
    {\usebibmacro{eprint}}
    {}%
  \newunit\newblock% I don't know whether this should be removed, too, or not
}

\addbibresource{\jobname.bib}

\begin{document}
\cite{article}
\cite{misc}
\printbibliography
\end{document}

在此处输入图片描述

相关内容