在 BibLaTeX 中为 DeclareLabelalphaTemplate 选择(子)entrytype

在 BibLaTeX 中为 DeclareLabelalphaTemplate 选择(子)entrytype

我想按照建议使用 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的字段将被所需的格式覆盖。@techreporttype = {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 等引文管理器配合使用,无需声明新的条目类型。

相关内容