我想按照建议使用 BibLaTeX 引用 ISO 标准这里。
但是,对于字母引用样式,\cite{iso704} 的标签是“ISO00”,而我想要的是“ISO 704:2000”。该样式对于其他所有内容都适用,因此我不想切换整个样式。
所以我做了以下事情:
\begin{filecontents}{iso.bib}
@Techreport{ISO704,
Title = {Terminology work - Principles and methods},
Author = {{ISO/TC 37}},
Date = {2000-11},
Institution = {ISO International Organization for Standardization},
Number = {704},
Type = {ISO},
Comment = {Revised by ISO 704:2009, Revises ISO 704:1987},
Keywords = {Definitions, General section, Methods, Terminology},
}
\end{filecontents}
\documentclass{article}
\usepackage[style=alphabetic]{biblatex}
\addbibresource{iso.bib}
\DeclareLabelalphaTemplate[]{
\labelelement{\field[]{type}}
\labelelement{\literal{~}}
\labelelement{\field[]{number}}
\labelelement{\literal{:}}
\labelelement{
\field[strwidth=4,strside=right]{year}
}
}
\begin{document}
Actual Output: \cite{ISO704} %ISO00 - Expected Output: [ISO 704:2000]
\end{document}
我的问题是,我必须选择进入 [] 的正确的条目类型(带有子类型 ISO 的技术报告),这样才不会影响所有其他标签。
但是,我找不到任何关于如何选择适当条目类型的解决方案。在 BibLaTeX 手册中,他们提到了类似 @techreport 的东西,但对我来说,这甚至不起作用。
答案1
这有点邪恶,在biblatex
使用中@techreport
只是一种使用类型@report
并将字段设置type
为的奇特方式,在您的情况下techreporrt
它会立即被您的覆盖。type = {ISO}
.bib
因此,从内部来看, a@techreport
就是@report
。
所以你需要的是
\DeclareLabelalphaTemplate[report]{
\labelelement{\field{type}}
\labelelement{\literal{~}}
\labelelement{\field{number}}
\labelelement{\literal{:}}
\labelelement{
\field[strwidth=4,strside=right]{year}
}
}
也许biblatex
文档对此并不十分清楚,因为第 12 页上说
[
@techreport
与] [ 类似,不同@report
之处在于该type
字段是可选的,并且默认为本地化术语“技术报告”。您仍可以使用类型字段来覆盖该字段。
不过,你可以在biblatex.def
\map{
\step[typesource=techreport, typetarget=report, final]
\step[fieldset=type, fieldvalue=techreport]
}
这清楚地表明 a@techreport
转换为 a @report
。
因为\DeclareLabelalphaTemplate
只能通过条目类型来区分,如果您想要更精细的东西,则需要走不同的路径。
例如,您可以shorthand
使用以下代码自动设置字段
\DeclareSourcemap{
\maps[datatype=bibtex]{
\map[overwrite]{
\pertype{techreport}
\step[fieldsource=type, match=\regexp{ISO}, final]
\step[fieldset=shorthand, fieldvalue={ISO\,}]
\step[fieldsource=number, final]
\step[fieldset=shorthand, origfieldval, append]
}
\map[overwrite]{
\pertype{techreport}
\step[fieldsource=type, match=\regexp{ISO}, final]
\step[fieldsource=year, match=\regexp{\A(.*)\Z}]
\step[fieldsource=date, match=\regexp{([0-9]{4}?)}]
\step[fieldset=shorthand, fieldvalue={:$1}, append]
}
}
}
但是,由于此代码的性质,sshorthand
的字段将被所需的格式覆盖。@techreport
type = {ISO}
为了避免这个缺点,我们可以使用稍长的绕组
\DeclareSourcemap{
\maps[datatype=bibtex]{
\map[overwrite]{
\pertype{techreport}
\step[fieldsource=type, match=\regexp{ISO}, final]
\step[fieldset=safeshorthand, fieldvalue={ISO\,}]
\step[fieldsource=number, final]
\step[fieldset=safeshorthand, origfieldval, append]
}
\map[overwrite]{
\pertype{techreport}
\step[fieldsource=type, match=\regexp{ISO}, final]
\step[fieldsource=year, match=\regexp{\A(.*)\Z}]
\step[fieldsource=date, match=\regexp{([0-9]{4}?)}]
\step[fieldset=safeshorthand, fieldvalue={:$1}, append]
}
\map{
\step[fieldsource=safeshorthand, final]
\step[fieldset=shorthand, origfieldval]
}
}
}
在这里,我们在一个字段中构建所需的标签safeshorthand
,并且仅当该字段为shorthand
空时才将其复制到该字段。
答案2
只是为了延续@moewe回答:我随后还必须添加德国 DIN 规范。因此,我扩展了代码如下:
\DeclareSourcemap{
\maps[datatype=bibtex]{
\map[overwrite]{
\pertype{techreport}
\step[fieldsource=type, match=\regexp{(ISO|DIN)}, final]
\step[fieldset=safeshorthand, origfieldval]
\step[fieldset=safeshorthand, fieldvalue={\,}, append]
}
\map[overwrite]{
\pertype{techreport}
\step[fieldsource=type, match=\regexp{(ISO|DIN)}, final]
\step[fieldsource=number, final]
\step[fieldset=safeshorthand, origfieldval, append]
}
\map[overwrite]{
\pertype{techreport}
\step[fieldsource=type, match=\regexp{(ISO|DIN)}, final]
\step[fieldsource=year, match=\regexp{\A(.*)\Z}]
\step[fieldsource=date, match=\regexp{([0-9]{4}?)}]
\step[fieldset=safeshorthand, fieldvalue={:$1}, append]
}
\map{
\step[fieldsource=safeshorthand, final]
\step[fieldset=shorthand, origfieldval]
}
}
}
更通用的选择可能是使用类型Standard
并在数字字段中使用ISO 740
或:DIN 2230
@report
\DeclareSourcemap{
\maps[datatype=bibtex]{
\map[overwrite]{
\pertype{techreport}
\step[fieldsource=type, match=\regexp{Standard}, final]
\step[fieldsource=number, final]
\step[fieldset=safeshorthand, origfieldval, append]
}
\map[overwrite]{
\pertype{techreport}
\step[fieldsource=type, match=\regexp{Standard}, final]
\step[fieldsource=year, match=\regexp{\A(.*)\Z}]
\step[fieldsource=date, match=\regexp{([0-9]{4}?)}]
\step[fieldset=safeshorthand, fieldvalue={:$1}, append]
}
\map{
\step[fieldsource=safeshorthand, final]
\step[fieldset=shorthand, origfieldval]
}
}
}
这可能并不完美,因为可能在某个时候,人们应该定义一个新的条目类型,例如@standard
用于处理一般标准。但它与 Jabref 等引文管理器配合使用,无需声明新的条目类型。