Избыточные поля в biblatex не могли быть удалены при использовании \fullcite

Избыточные поля в biblatex не могли быть удалены при использовании \fullcite

Сочетание biblatex-chicagoи Zotero производит много избыточных полей в библиографии. Эту проблему можно решить, добавив в преамбулу предостережения вроде этого:

\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выполняет свои действия в каждом цитируемом пункте. (См. стр. 228-229biblatexдокументация).

Итак, чтобы избавиться, скажем, от titleединственного в цитатах, вы бы пошли с \AtEveryCitekey{\clearfield{title}}- titleтогда игнорируется в цитатах, но все еще печатается в библиографии. Аналогично, \AtEveryBibitem{\clearfield{urlyear}\clearfield{urlmonth}\clearfield{urlday}}избавляется от даты 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и @book.


По техническим причинам (я мог бы подумать о возможном создании даты метки) лучше избавиться от даты URL как можно раньше, если вы вообще не хотите ее использовать. Здесь вступает в дело SourceMapping Бибера (см. §4.5.2Динамическое изменение данных, стр. 148-156док).

Мы хотим избавиться от urldateполя в вашем .bibфайле, поэтому просто устанавливаем его на null.

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

С помощью sourcemapping ограничения по типу могут быть наложены \pertypeследующим образом:

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

Эта карта теперь применима только к @articles и @books. К сожалению, \pertypeнельзя использовать отрицания, как мы делали выше (например, «применять это только к записям, которые не являются @online»), возможно, это заслуживает запроса на функцию (- это стоило одного инаше желание было исполнено).

Так как поле даты немного специфично в том, как оно обрабатывается biblatex. В документе оно доступно в виде трех полей year, monthи day(чтобы можно было использовать \AtEveryCitekey{\clearfield{month}}без каких-либо проблем), для целей сопоставления источников (помните, сопоставление источников — один из первых шагов, которые Бибер предпринимает с файлом, на этом этапе ничего не было интерпретировано или прочитано из файла) часто дата вводится как 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}

Связанный контент