如果使用 \fullcite,则无法删除 biblatex 中的多余字段

如果使用 \fullcite,则无法删除 biblatex 中的多余字段

和 Zotero的结合biblatex-chicago会在参考书目中产生许多多余的文件。可以通过在序言中添加如下警告来解决此问题:

\AtEveryBibitem{%
\ifentrytype{online}
{}
{\clearfield{urlyear}\clearfield{urlmonth}\clearfield{urlday}}}

(在我之前的一个问题的回答中详细描述过:biblatex chicago 作者日期样式中的字段过多

这个解决方案对我来说效果很好,但现在我必须使用\fullcite命令制作大纲。不幸的是,这个解决方案不能解决参考书目本身之外的完整书目条目的问题。

以下是包含参考书目的代码(为了按正确顺序获取作者的名字和姓氏,我使用以下解决方案:Biblatex-chicago:\fullcite 翻转名字和姓氏):

\begin{filecontents*}{database.bib}
    @book{dalton_apartisan_2012,
        title = {The Apartisan American: Dealignment and Changing Electoral Politics},
        isbn = {9781452216942},
        url = {http://books.google.com/books?id=eYkczUyX5wMC},
        shorttitle = {The Apartisan American},
        pagetotal = {241},
        publisher = {{CQ} Press},
        author = {Dalton, Russell J.},
        urldate = {2014-04-03},
        date = {2012-02-22},
        langid = {english},
        keywords = {Political Science / Political Process / Elections, Political Science / Public Policy / General}
    }
\end{filecontents*}
\documentclass[11pt]{article}
\usepackage[hmargin=3cm,vmargin=3cm]{geometry}
\usepackage[onehalfspacing]{setspace}
\usepackage{amssymb,amsmath,amsthm}
\usepackage{booktabs,graphicx}
\usepackage{paralist}
\usepackage{cancel,soul}
\usepackage{enumitem}
\usepackage[authordate,backend=biber,bibencoding=utf8,bookpages=false,doi=only,isbn=false,footmarkoff]{biblatex-chicago}
\usepackage[colorlinks, pdfstartview={XYZ null null 1.25},bookmarksopen=true,bookmarksopenlevel=\maxdimen,citecolor={blue},urlcolor={blue}]{hyperref}
\addbibresource{database.bib}
\DeclareCiteCommand{\fullcite}
{\usebibmacro{prenote}}
{\usedriver
    {}
    {\thefield{entrytype}}}
{\multicitedelim}
{\usebibmacro{postnote}}
\AtEveryBibitem{%
    \ifthenelse{\ifentrytype{article}\OR\ifentrytype{book}\OR\ifentrytype{collection}\OR\ifentrytype{incollection}\OR\ifentrytype{mvbook}\OR\ifentrytype{mvcollection}\OR\ifentrytype{mvincollection}}
    {\clearfield{month}\clearfield{url}\clearfield{doi}\clearfield{urlyear}\clearfield{urlmonth}\clearfield{urlday}}}


\begin{document}
\begin{center}
{\huge Partisanship in Old, New and Non-Democracies}\\
\end{center}

\vspace{30pt}
\noindent\textbf{Instructor: }  \hfill
\textbf{Time and Location:} TBA\\
\textbf{Contact:} 
\hfill
\hfil \textbf{Office Hours:} TBA\\

\vspace{-20pt}



\subsection*{Partisanship in the United States}


\begin{enumerate}
    \item \parencite{dalton_apartisan_2012}
    \item \fullcite{dalton_apartisan_2012}
\end{enumerate}

\printbibliography[heading=bibintoc]

\end{document} 

以下是输出。请注意文内完整引用中的过多字段(它们在参考文献中不存在):

在此处输入图片描述

任何帮助,尤其是简单易行的解决方案,都将不胜感激。

答案1

如果您想urldate独立控制参考书目和引文,\AtEveryBibitem\AtEveryCitekey是可行的方法。

\AtEveryBibitem对参考书目中的每个条目执行其操作,而对\AtEveryCitekey引用的每个条目执行其操作。(参见biblatex文档)。

因此,要删除title引文中的唯一内容,您可以使用\AtEveryCitekey{\clearfield{title}}-title然后在引文中忽略该内容,但仍会打印在参考书目中。类似地,\AtEveryBibitem{\clearfield{urlyear}\clearfield{urlmonth}\clearfield{urlday}}删除参考书目中的 URL 日期,而不删除引文中的 URL 日期。

为了摆脱所有 URL 日期,你可以发出

\AtEveryBibitem{\clearfield{urlyear}\clearfield{urlmonth}\clearfield{urlday}}
\AtEveryCitekey{\clearfield{urlyear}\clearfield{urlmonth}\clearfield{urlday}}

类型限制可以通过或更复杂的结构来应用,\ifentrytype例如

\AtEveryBibitem{%
  \ifentrytype{online}
    {}
    {\clearfield{urlyear}\clearfield{urlmonth}\clearfield{urlday}}}

\AtEveryCitekey{%
  \ifboolexpr{test {\ifentrytype{article}} or test {\ifentrytype{book}}}
    {\clearfield{urlyear}\clearfield{urlmonth}\clearfield{urlday}}
    {}}

第一个例子删除除 之外的所有条目的 URL 日期@online,而第二个例子仅删除@article和 的URL 日期@book


出于技术原因(我想到可能的标签日期创建),如果您根本不想使用 URL 日期,最好尽早将其删除。这里 Biber 的源映射就派上用场了(参见 §4.5.2动态修改数据,第 148-156 页文档)。

我们想要删除文件urldate里的该字段.bib,所以我们只需将其设置为null

\DeclareSourcemap{
  \maps[datatype=bibtex]{
    \map{
      \step[fieldset=urldate, null]
    }
  }
}

使用源映射,可以\pertype像这样施加类型限制

\DeclareSourcemap{
  \maps[datatype=bibtex]{
    \map{
      \pertype{article}
      \pertype{book}
      \step[fieldset=urldate, null]
    }
  }
}

此映射现在仅适用于@articles 和@books。遗憾的是,由于\pertype不能像上面那样使用否定(如“仅将其应用于不是@online”的条目),也许这值得提出功能请求(- 值得一试)我们的愿望已经实现)。

由于日期字段的处理方式有些特殊biblatex。在文档中,它有三个字段yearmonthday(因此可以\AtEveryCitekey{\clearfield{month}}毫无问题地使用),出于源映射目的(请记住,源映射是 Biber 对文件采取的第一步,此时尚未解释或读取文件中的任何内容),日期通常输入为date = {YYYY-MM-DD},这就是为什么month在源映射中删除字段只会帮助那些将日期输入为的人 year = {2014}, month = {03}, day={04}(这是可能的,但稍微不太舒服)。但是我们可以做的是,我们可以使用 RegEx 将日期设置为仅包含年份

\DeclareSourcemap{
  \maps[datatype=bibtex]{
    \map{
      \step[fieldset=month, null]
      \step[fieldsource=date,
            match=\regexp{([0-9]{4})-[0-9]{2}(-[0-9]{2})*},
            replace=\regexp{$1}]
    }
  }
}

我们寻找“YYYY-MM-DD”格式的字符串,或者可能只是“YYYY-MM-DD”,并只保留“YYYY”部分,这样就只保留了年份。我们还将月份设置为,null以方便那些喜欢更详细地输入日期的人。

平均能量损失

\documentclass{article}
\usepackage[style=authoryear,backend=biber,mergedate=false]{biblatex}
\addbibresource{biblatex-examples.bib}

\DeclareSourcemap{
  \maps[datatype=bibtex]{
    \map{
      \pertype{online}
      \step[fieldset=urldate, null]
    }
    \map{
      \step[fieldset=month, null]
      \step[fieldsource=date,
            match=\regexp{([0-9]{4})-[0-9]{2}(-[0-9]{2})*},
            replace=\regexp{$1}]
    }
  }
}

\begin{document}
\cite{baez/online,itzhaki,markey}

\printbibliography
\end{document}

给予

在此处输入图片描述

以下是没有任何源映射的输出,以供比较

在此处输入图片描述

答案2

@moewe 的第二个解决方案对我来说是有效的(甚至适用于\fullcite),但我发现这里一个更短的解决方案:

\AtEveryCitekey{\UseBibitemHook}

相关内容