如果 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}
。
您会注意到大多数类型都使用此宏(包括article
和misc
)。因此,您可以更改此特定 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}