Biblatex:按关键字过滤条目并在 bbl 中包含交叉引用父项?

Biblatex:按关键字过滤条目并在 bbl 中包含交叉引用父项?

我正在使用这个 TeX.SE 答案按关键字进行过滤\nocite{*}。但是,当使用继承时,这种方法存在一些问题crossref

因为每一个条目是nocited,即使条目本来会添加到文件中,.bbl如果crossref没有相关关键字,也会被此源映射过滤掉。从某种意义上说,这是可取的行为,因为我只希望将具有相关关键字的条目包含在印刷书目中。但它也有不良影响,即我确实想包含的条目无法通过 继承crossref

一个明显的解决方法是将相关关键字也添加到父条目中。但如上所述,这会导致条目也出现在印刷书目中。我想避免这种情况,而是让具有相关关键字的条目的父条目 1) 自动包含在文件中.bbl,2) 根据mincrossrefs参数设置包含在印刷书目中。

是否有其他方法可以获得我想要的结果,使用源映射还是其他方法?

请参阅下面的 MWE。期望的行为是inbookbinbookc出现在印刷书目中,并且date和分别继承booktitle自和,而不包括和在印刷书目中。bookbbookcbookbbookc

\documentclass{article}

\begin{filecontents}[force]{\jobname.bib}
  @book{booka,
    author = {Author Name},
    date = {2000},
    title = {Book Title},
    keywords = {include},
  }

  @inbook{inbooka,
    crossref = {booka},
    title = {Chapter Title},
    keywords = {include},
  }

  @book{bookb,
    author = {Author Name},
    date = {2001},
    title = {Second Book},
    keywords = {},
  }

  @inbook{inbookb,
    crossref = {bookb},
    title = {Second Chapter},
    keywords = {include},
  }

  @book{bookc,
    author = {Author Name},
    date = {2002},
    title = {Yet Another Book},
    keywords = {},
  }

  @inbook{inbookc,
    crossref = {bookc},
    title = {Yet Another Chapter},
    keywords = {},
  }
\end{filecontents}

\usepackage[%
    style=authoryear,%
  ]{biblatex}
  \addbibresource{\jobname.bib}

\DeclareSourcemap{
  \maps[datatype=bibtex]{
    \map{
      \step[nocited, final]
      \step[fieldsource=keywords, notmatch=include, final]
      \step[entrynull]
    }
  }
}

\begin{document}
  \cite{inbookc}
  \nocite{*}
  \printbibliography
\end{document}

答案1

编辑2024-03-18:由于内存限制,此选项似乎不适用于较大的.bib文件;切换到 LuaLaTeX 有一段时间有帮助,但之后我的文件再次变得太大。如果我能让我的正则表达式更节省内存,我不会感到惊讶,但最好的选择可能是编写一个外部脚本来生成我的输入键列表,可能使用库btparse而不是正则表达式。


我已经想到了一个不太好但足够好的解决方案来解决我的问题,使用正则表达式来解析文件.bib并提取相关的输入键。

相关代码如下所示;如果要重复使用它,需要更改相关值\jobname.bibinclude

\file_get:nnN {\jobname.bib} {
    \cctab_select:N \c_other_cctab
    \endlinechar=10~
} \l_tmpa_tl
\regex_replace_all:nnN { [^@]*@[a-z]+\{([^\,]+,)[^@]*keywords\ =\ \{[^\}]*include[^@]* } { <\1> } \l_tmpa_tl
\regex_replace_all:nnN { (?:^|>)[^><]*(?:$|<) } { } \l_tmpa_tl
%\str_set:NV \l_tmpa_str \l_tmpa_tl
\clist_set:NV \l_tmpa_clist \l_tmpa_tl

\NewDocumentCommand{\nocitetagged}{}{
  \clist_map_function:NN \l_tmpa_clist \nocite
}

以下是与问题相对应的完整 MWE:

\documentclass{article}

\begin{filecontents}[force]{\jobname.bib}
  @book{booka,
    author = {Author Name},
    date = {2000},
    title = {Book Title},
    keywords = {include},
  }

  @inbook{inbooka,
    crossref = {booka},
    title = {Chapter Title},
    keywords = {include},
  }

  @book{bookb,
    author = {Author Name},
    date = {2001},
    title = {Second Book},
    keywords = {},
  }

  @inbook{inbookb,
    crossref = {bookb},
    title = {Second Chapter},
    keywords = {include},
  }

  @book{bookc,
    author = {Author Name},
    date = {2002},
    title = {Yet Another Book},
    keywords = {},
  }

  @inbook{inbookc,
    crossref = {bookc},
    title = {Yet Another Chapter},
    keywords = {},
  }
\end{filecontents}

\usepackage[%
    style=authoryear,%
  ]{biblatex}
  \addbibresource{\jobname.bib}

\ExplSyntaxOn

\file_get:nnN {\jobname.bib} {
    \cctab_select:N \c_other_cctab
    \endlinechar=10~
} \l_tmpa_tl
\regex_replace_all:nnN { [^@]*@[a-z]+\{([^\,]+,)[^@]*keywords\ =\ \{[^\}]*include[^@]* } { <\1> } \l_tmpa_tl
\regex_replace_all:nnN { (?:^|>)[^><]*(?:$|<) } { } \l_tmpa_tl
%\str_set:NV \l_tmpa_str \l_tmpa_tl
\clist_set:NV \l_tmpa_clist \l_tmpa_tl

\NewDocumentCommand{\nocitetagged}{}{
  \clist_map_function:NN \l_tmpa_clist \nocite
}

\ExplSyntaxOff

\begin{document}
  \cite{inbookc}
  \nocitetagged
  \printbibliography
\end{document}

我发现这些 TeX.SE 答案很有帮助:12

相关内容