为何地图不起作用?

为何地图不起作用?

我想在我的文件中使用一个自定义字段bib,该字段未在我的 BibLaTeX 数据模型中定义。我希望通过通常的\DeclareSourcemap构造来映射此字段,如§4.5.3,到我的数据模型中定义的,而且已在使用中

具体来说,我有一个@Patent包含字段的条目type,我已将其设置为 BibLaTeX 定义的patrequsbibstring。我还使用自定义字段appnumber来编码 USPTO 申请号(我已经将其用于numberUSPTO 专利号)。

由于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}

得出:

上述完整引文的 pdfLaTeX 渲染输出。

然而,我想要类似的东西(也许还需要一些更好的标点符号来区分appnumbernumber

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}

但这实在太恶劣了。

相关内容