![重载 Biblatex 论文样式并定义](https://linux22.com/image/374831/%E9%87%8D%E8%BD%BD%20Biblatex%20%E8%AE%BA%E6%96%87%E6%A0%B7%E5%BC%8F%E5%B9%B6%E5%AE%9A%E4%B9%89.png)
在我的一份报告中,我需要区分几种“类型”的论文,这些论文基本上是法学博士论文和一种特殊的论文,称为“Thèse d'habilitation”,这是成为瑞士一些大学“正式”法学教授的先决条件。这是后续从我之前的问题
该条目应该仅与参考书目条目不同,这意味着类型应该是:
- 简单论文:“作者简介,标题,城市年份”
- 授权书应为:“作者在前,标题,授权书所在城市年份”
我的分析
因此,我碰到了 biblatex 文档第 13 页(2.1.2 类型别名)的类型重新定义,我的问题基本上是创建新的类型别名并将“类型”字段链接到正确的条目。这就是“biblatex”对“别名类型”phdthesis 和 master thesis 所做的,即:- 链接到论文条目类型 - 使用默认字符串定义字段“类型”
但是我被我所确定的 biblatex.cfg 文件中使用的代码所困扰:
% ------------------------------------------------------------------
% Driver sourcemaps
% ------------------------------------------------------------------
\DeclareDriverSourcemap[datatype=bibtex]{
\map{
\step[fieldset=day, null]
}
\map{
\step[typesource=conference, typetarget=inproceedings]
\step[typesource=electronic, typetarget=online]
\step[typesource=www, typetarget=online]
}
\map{
\step[typesource=mastersthesis, typetarget=thesis, final]
\step[fieldset=type, fieldvalue=mathesis]
}
\map{
\step[typesource=phdthesis, typetarget=thesis, final]
\step[fieldset=type, fieldvalue=phdthesis]
}
\map{
\step[typesource=techreport, typetarget=report, final]
\step[fieldset=type, fieldvalue=techreport]
}
\map{
\step[fieldsource=hyphenation, fieldtarget=langid]
\step[fieldsource=address, fieldtarget=location]
\step[fieldsource=school, fieldtarget=institution]
\step[fieldsource=annote, fieldtarget=annotation]
\step[fieldsource=archiveprefix, fieldtarget=eprinttype]
\step[fieldsource=journal, fieldtarget=journaltitle]
\step[fieldsource=primaryclass, fieldtarget=eprintclass]
\step[fieldsource=key, fieldtarget=sortkey]
\step[fieldsource=pdf, fieldtarget=file]
}
}
首先,我尝试在自定义 lbx 文件中声明一些新字段,如下图所示我的另一个问题.这给了我:
biblatex-xawi.lbx
\DefineBibliographyStrings{french}{typethesis = {Thèse}}
\DefineBibliographyStrings{french}{typethabilitation = {Thèse d'habilitation}}
我添加了 biblatex 源的复制粘贴:
biblatex-xawi.bbx
\DeclareDriverSourcemap[datatype=bibtex]{
\map{
\step[typesource=thesedroit, typetarget=thesis, final]
\step[fieldset=type, fieldvalue = typethesis]
}
\map{
\step[typesource=thesehabilitation, typetarget=thesis, final]
\step[fieldset=type, typethabilitation = phdthesis]
}
}
但和以前一样,我不太擅长 Biblatex 风格的创作,因为我遇到了一个错误:
Package xkeyval Error: `typethabilitation' undefined in families `blx@sourcemap@step'.
See the xkeyval package documentation for explanation.
Type H <return> for immediate help.
...
l.116 }
Try typing <return> to proceed.
If that doesn't work, type X <return> to quit.
我的问题
问题 1:一般来说,我如何创建“简单”别名,例如将我的条目类型“ouvragegeneral”重定向到“book”类型(以帮助用户)。
问题2:如果我需要创建别名并进行一些“管道”,我该如何创建我的 2 种论文类型?
已接受的答案和反馈
返回的错误是我的自定义字符串被定义但没有看到其他问题与答案在这里
答案1
@habilthesis
这是一个也映射到@thesis
的解决方案type
habilthesis
。它还将泛型类型添加thesis
到所有@thesis
没有显式 的条目type
。
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[french]{babel}
\usepackage[style=authoryear]{biblatex}
\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
@phdthesis{normalthesis,
author = {Author Normal},
title = {Title PhD Thesis},
date = {2016},
}
@thesis{mormalthesis,
author = {Author Mormal},
title = {Title PhD Thesis},
date = {2017},
type = {phdthesis},
}
@thesis{mythesis,
author = {Author These},
title = {Title Thèse},
date = {2014},
}
@habilthesis{habilthesis,
author = {Author Habilitation},
title = {Title Thése Habilitation},
date = {2014},
}
@thesis{habilthesis2,
author = {Author Habilitation},
title = {Title Thése Habilitation},
date = {2014},
type = {habilthesis},
}
\end{filecontents}
\addbibresource{\jobname.bib}
\NewBibliographyString{thesis,habilthesis}
\DefineBibliographyStrings{french}{
thesis = {thèse},
habilthesis = {thèse d'habilitation},
}
\DeclareStyleSourcemap{
\maps[datatype=bibtex,overwrite=false]{
\map{
\step[typesource=habilthesis, typetarget=thesis, final]
\step[fieldset=type, fieldvalue=habilthesis]
}
\map{
\pertype{thesis}
\step[fieldset=type, fieldvalue=thesis]
}
}
}
\begin{document}
\nocite{*}
\printbibliography
\end{document}
由于我们在另一个答案的评论中讨论过这个问题,所以我再补充几句。
@thesis
仅使用条目类型并在字段中提供论文类型是可能的,甚至在概念上更好type
。- 我看不出创建法语条目类型(如
@these
for )@thesis
或德语本地化(如@buch
for )有什么价值@book
。这将严重影响使用这些类型的文件的可移植性.bib
,并使其与任何其他样式本质上不兼容。由于人们无论如何都需要学习有效类型,我认为让他们学习英语类型是可以接受的。 - 理想情况下,' 命令' 和 'Biber 命令' 之间没有区别
biblatex
。就我而言,只有biblatex
命令,而且 BibTeX 或 BibTeX8 不支持其中的一小部分。BibTeX 现在被视为遗留后端,甚至文档biblatex
通常也假设新文档始终使用 Biber。一些命令在 Biber 级别触发效果,一些在biblatex
-级别触发效果,其他则在所有级别上起作用。'混合' 这些命令根本不被认为是不纯粹的,也没有理由阻止这样做。当然,如果您知道哪个命令在哪个级别更改了什么,这将极大地帮助您理解您的风格的运作方式,但您不应该仅仅为了避免而避免 Biber 级别。一些可以在 Biber 级别轻松完成的事情可以通过更多的工作和在该biblatex
级别上的一些粗糙边缘来重新创建 - 但一般来说,这样做没有什么意义。 - 该命令
\DeclareStyleSourcemap
已记录在biblatex
手册中。
答案2
我认为你把这个搞得太复杂了。entrytypethesis
应该可以以很少的开销(如果有的话)满足你的需求。
字段type
的thesis
工作方式如下。如果定义的字符串等于type
,则使用字符串,否则按原样使用该字段。
因此,有一个非常简单的替代方法,那就是直接在字段中写上“Thèse”或“Thèse d'habilitation” type
:
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[french]{babel}
\usepackage[style=authoryear]{biblatex}
\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
@thesis{normalthesis,
author = {Author Normal},
title = {Title Normal Thesis},
date = {2016},
type = {phdthesis},
}
@thesis{mythesis,
author = {Author These},
title = {Title Thèse},
date = {2014},
type = {Thèse},
}
@thesis{habilthesis,
author = {Author Habilitation},
title = {Title Thése Habilitation},
date = {2014},
type = {Thèse d'habilitation},
}
\end{filecontents}
\addbibresource{\jobname.bib}
\begin{document}
\nocite{*}
\printbibliography
\end{document}
如果您想要更自动化并最终实现本地化,您只需创建 bibstring 并将其定义为相关语言:
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[french]{babel}
\usepackage[style=authoryear]{biblatex}
\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
@thesis{normalthesis,
author = {Author Normal},
title = {Title Normal Thesis},
date = {2016},
type = {phdthesis},
}
@thesis{mythesis,
author = {Author These},
title = {Title Thèse},
date = {2014},
type = {mythesis},
}
@thesis{habilthesis,
author = {Author Habilitation},
title = {Title Thése Habilitation},
date = {2014},
type = {habilthesis},
}
\end{filecontents}
\addbibresource{\jobname.bib}
\NewBibliographyString{mythesis,habilthesis}
\DefineBibliographyStrings{french}{
mythesis = {Thèse},
habilthesis = {Thèse d'habilitation},
}
\begin{document}
\nocite{*}
\printbibliography
\end{document}
无论哪种方式,结果都是: