稍微改变一下话题如何神奇地将文件字段添加到 bib 文件中的每个条目中?。
我有以下内容:
\DeclareSourcemap{
\maps[datatype=bibtex,overwrite=true]{
\map{
\step[fieldsource=entrykey]
\step[fieldset=file, fieldvalue={ref/}]
\step[fieldsource=entrysubtype]
\step[fieldset=file, origfieldval, append]
\step[fieldset=file, fieldvalue={/}, append]
\step[fieldsource=entrykey]
\step[fieldset=file, origfieldval, append]
\step[fieldset=file, fieldvalue={.pdf}, append]
}
}
}
围兜里写道:
@string { subtype = "thesubtype" }
bib 文件的名称是thesubtype.bib
。
我不想(手动)在 bib 中设置 的值,而是subtype
想以编程方式在 上设置它DeclareSourcemap
。哪种方法可能比较好?
我猜一种方法可能是通过一些 python。我听说 lualatex 带来了 lua 语言,好奇这是否可以在这里使用。
答案1
文件名.bib
无法用于源映射或其他操作。但至少在 Biber 处理的早期阶段,该名称是已知的\perdatasource
(我推测它后来被遗忘了)。如果您认为访问文件名对公众来说是一个有用的功能,请说明确切地你想要的(你想让一个条目的文件名基本上作为一个普通.bib
字段吗?你想在源映射中引用文件名吗?)并在https://github.com/plk/biber/issues。
与此同时,这里有一个变通方法,使用\perdatasource
和包含来\addbibresource
将冗余度保持在最低限度。该解决方案利用了这一点,\perdatasource
使我们能够一瞥.bib
文件名。由于文档中的每个文件都需要一个这样的\perdatasource
映射.bib
,因此将源映射与\addbibresource
直接组合起来似乎是很自然的。
注意\addentrysubtyperesource
采用.bib
文件名没有文件扩展名(与\addbibresource
需要扩展名不同)。
还要注意的是,示例中有多个源映射,它们的顺序很重要。调用\addentrysubtyperesource
应该在任何其他源映射构造之前进行。
\documentclass[british]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{babel}
\usepackage{csquotes}
\usepackage[style=authoryear, backend=biber]{biblatex}
\newcommand*{\addentrysubtyperesource}[1]{%
\addbibresource{#1.bib}
\DeclareSourcemap{
\maps[datatype=bibtex,overwrite=true]{
\map{
\perdatasource{#1.bib}
\step[fieldset=entrysubtype, fieldvalue={#1}]
}
}
}
}
\addentrysubtyperesource{\jobname-one}
\addentrysubtyperesource{\jobname-two}
\DeclareSourcemap{
\maps[datatype=bibtex,overwrite=true]{
\map{
\step[fieldsource=entrykey]
\step[fieldset=file, fieldvalue={ref/}]
\step[fieldsource=entrysubtype]
\step[fieldset=file, origfieldval, append]
\step[fieldset=file, fieldvalue={/}, append]
\step[fieldsource=entrykey]
\step[fieldset=file, origfieldval, append]
\step[fieldset=file, fieldvalue={.pdf}, append]
}
}
}
% just to print the 'file' field
\DeclareFieldFormat{file}{file: \path{#1}}
\renewbibmacro{finentry}{\printfield{file}\finentry}
\usepackage{filecontents}
\begin{filecontents}{\jobname-one.bib}
@book{appleby,
author = {Humphrey Appleby},
title = {On the Importance of the Civil Service},
date = {1980},
}
\end{filecontents}
\begin{filecontents}{\jobname-two.bib}
@article{sigfridsson,
author = {Emma Sigfridsson},
title = {Chemistry},
date = {1998},
journal = {Journal of Chemisty},
volume = {48},
number = {2},
pages = {135-164},
}
\end{filecontents}
\begin{document}
\cite{sigfridsson,appleby}
\printbibliography
\end{document}