![为何地图不起作用?](https://linux22.com/image/383814/%E4%B8%BA%E4%BD%95%E5%9C%B0%E5%9B%BE%E4%B8%8D%E8%B5%B7%E4%BD%9C%E7%94%A8%EF%BC%9F.png)
我想在我的文件中使用一个自定义字段bib
,该字段未在我的 BibLaTeX 数据模型中定义。我希望通过通常的\DeclareSourcemap
构造来映射此字段,如§4.5.3,到我的数据模型中定义的,而且已在使用中。
具体来说,我有一个@Patent
包含字段的条目type
,我已将其设置为 BibLaTeX 定义的patrequs
bibstring。我还使用自定义字段appnumber
来编码 USPTO 申请号(我已经将其用于number
USPTO 专利号)。
由于appnumber
我的数据模型中没有定义,并且我希望避免手动定义,因此我想要地图这是附加到最后插入的字符串否则我的type
就会扩大到。
看起来这需要两个\step
命令。下面的命令有效,但在 bibstring 插值之前附加,这也许很明显,但不是我希望实现的。
\DeclareSourcemap{
\maps[datatype=bibtex, overwrite]{
\map{
\pertype{patent}
\step[fieldsource=appnumber]
\step[fieldset=type, origfieldval, append]
}
}
}
这产生的patrequsNN/XXX,XXX
不是期望的结果U.S. patent request NN/XXX,XXX
。
请找一个样本@Patent
条目(改编自 Sandra Mau 的网页,假设美国专利尚未获得批准)以及下面作为 MWE 的期望输出示例(和可在 Overleaf 上获取):
@Patent{EHLINGER:2006:biblatex,
author = {EHLINGER, JR., Philip Charles},
title = {Device for the treatment of hiccups},
year = {2006},
month = {06},
day = {13},
number = {7062320},
kind = {B2},
appnumber = {10/684,114},
type = {patrequs},
url = {http://www.patentlens.net/patentlens/patent/US_7062320/},
IPC_class = {A61N 1/04},
US_class = {607 2},
}
将上述bib
文件另存为后mwe.bib
,以下内容(取决于个人风格和其他配置)应重现类似如下的输出:
\documentclass{article}
\usepackage[backend=biber, style=biblatex-cse, autopunct, autocite=superscript, doi=false, url=false, isbn=false]{biblatex}
\DeclareSourcemap{
\maps[datatype=bibtex, overwrite]{
\map{ % clear patent scope, obviating output of redundant info. for US patents
\pertype{patent}
\step[fieldset=location, null]
\step[fieldset=kind, null] % we include the USPTO kind codes, but do not use them
% we use the field "appnumber" to store the USPTO application number
% we simply map it to be appended to the "type" field, in the standard data model
% Adapted from: https://tex.stackexchange.com/q/454008/134641
\step[fieldsource=appnumber]
\step[fieldset=type, origfieldval, append]
}
}
}
\addbibresource{mwe.bib}
\begin{document}
\fullcite{EHLINGER:2006:biblatex}
\end{document}
得出:
然而,我想要类似的东西(也许还需要一些更好的标点符号来区分appnumber
)number
:
EHLINGER JR. PC. 2006. 治疗打嗝的装置。美国专利申请 10/684,114 7062320。
是否有人可以修复此问题,以便(1)附加发生(或等同于)bibstring插值后的结果,(2)轻松地在字段之间添加空格(即无需我修改底层样式),或者(3)建议一些可行的替代方法来正确编码和排版USPTO申请号?
答案1
为何地图不起作用?
Biber 对 的 bibstring 一无所知biblatex
。因此它不知道patrequs
扩展为“美国专利请求”。bibstring 只是在biblatex
最后一刻通过以下方式“扩展”的:
\DeclareFieldFormat{type}{\ifbibstring{#1}{\bibstring{#1}}{#1}}
这意味着biblatex
采用 Biber 生成的字段内容type
并检查它是否与 bibstring 的名称一致(如有patrequs
必要),如果是,则打印相应的 bibstring,如果不是,则按原样打印文本。
因此type = {patrequs},
扩展为“美国专利请求”。从各方面来看,您的映射都会变成
type = {patrequs},
appnumber = {10/684,114},
进入
type = {patrequs10/684,114},
不幸的是,patrequs10/684,114
这不是一个已知的 bibstring,因此文本被逐字打印,并且 bibstring 未扩展。
我怎样才能让它工作?
只需打印appnumber
我认为最好的解决方案是修改您使用的在适当位置打印的样式appnumber
并完成它。
由于appnumber
不是数据模型中的已知字段,因此不一定需要自定义.dbx
文件。请参阅将字段“tome”添加到 biblatex 条目。我承认这看起来有点麻烦。
.dbx
如果将该字段重新映射到保留的特殊字段(例如) ,则可以避免使用该文件usera
,但您仍然必须告诉样式使用它。
A糟糕的黑客
\DeclareSourcemap{
\maps[datatype=bibtex, overwrite]{
\map{
\pertype{patent}
\step[fieldset=location, null]
}
\map{
\pertype{patent}
\step[fieldsource=appnumber, final]
\step[fieldsource=type, match=\regexp{\A(.*)\Z}, replace=\regexp{\\ifbibstring\{$1\}\{\\bibstring\{$1\}\}\{$1\}\x{20}}]
\step[fieldsource=appnumber]
\step[fieldset=type, origfieldval, append]
}
}
}
本质上重新创建了扩展源映射中的 bibstring 的字段格式,并允许
type = {patrequs},
appnumber = {10/684,114},
作为
type = {\ifbibstring{patrequs}{\bibstring{patrequs}}{patrequs} 10/684,114}
但这实在太恶劣了。