我正在使用这个 TeX.SE 答案按关键字进行过滤\nocite{*}
。但是,当使用继承时,这种方法存在一些问题crossref
。
因为每一个条目是nocite
d,即使条目本来会添加到文件中,.bbl
如果crossref
没有相关关键字,也会被此源映射过滤掉。从某种意义上说,这是可取的行为,因为我只希望将具有相关关键字的条目包含在印刷书目中。但它也有不良影响,即我确实想包含的条目无法通过 继承crossref
。
一个明显的解决方法是将相关关键字也添加到父条目中。但如上所述,这会导致条目也出现在印刷书目中。我想避免这种情况,而是让具有相关关键字的条目的父条目 1) 自动包含在文件中.bbl
,2) 根据mincrossrefs
参数设置包含在印刷书目中。
是否有其他方法可以获得我想要的结果,使用源映射还是其他方法?
请参阅下面的 MWE。期望的行为是inbookb
和inbookc
出现在印刷书目中,并且date
和分别继承booktitle
自和,而不包括和在印刷书目中。bookb
bookc
bookb
bookc
\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.bib
:include
\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}