![用文字拼写出卷数和版本号 - Biblatex 用德语吗?](https://linux22.com/image/236606/%E7%94%A8%E6%96%87%E5%AD%97%E6%8B%BC%E5%86%99%E5%87%BA%E5%8D%B7%E6%95%B0%E5%92%8C%E7%89%88%E6%9C%AC%E5%8F%B7%20-%20Biblatex%20%E7%94%A8%E5%BE%B7%E8%AF%AD%E5%90%97%EF%BC%9F.png)
是否可以让 Biblatex 输出单词“Second”(德语)而不是数字 2?
例如这是我的序言:
\usepackage[utf8]{inputenc}
\usepackage[
sorting=none,
backend=biber,
babel=other]{biblatex}
\usepackage{csquotes}
\usepackage[german,american]{babel}
\addbibresource{references.bib}
以下是我的参考书目条目:
@book{Cantor,
author="Cantor, Moritz.",
title="Vorlesungen über Geschichte der Mathematik. (von 1200 - 1668).",
language={German},
volume={2},
edition={2},
address="Leipzig",
publisher="Druck und Verlag von B.G. Teubner",
date={1900},
pagetotal="XII + 943 S.",
hyphenation={ngerman},
note="(in Germ.)",
}
但是,当我在其上运行 Babel+Biblatex 时,它输出:
Moritz. Cantor. Vorlesungen uber Geschichte der Mathematik. (von 1200 - 1668).
German. 2. Aufl. Bd. 2. (in Germ.) Leipzig: Druck und Verlag von B.G. Teubner,
1900. XII + 943 S.
我希望它输出“Zweite Auflage”和“Zweiter Band”而不是“2.Aufl”。和“Bd. 2”。
有人知道使用 biblatex 是否可以实现这个功能吗?
答案1
您可以使用该fmtcount
包来实现此目的,并相应地重新定义字段格式。对于版本,您只需重新定义\mkbibordedition
宏即可。最好在里面执行此操作\DefineBibliographyExtras
,因为这是一个特定于语言的字符串:
\DefineBibliographyExtras{ngerman}{%
\renewcommand*{\mkbibordedition}[1]{\Ordinalstringnum{#1}[f]}
}
为了实现此功能,您需要修复当前fmtcount
版本的错误(软件包的作者知道这个错误)。请参阅下面的最小示例。
体积略有不同,因为原始定义(取自biblatex.def
)是
\DeclareFieldFormat{volume}{\bibstring{volume}~#1}% volume of a book
我们需要一个辅助宏将整数转换为序数,例如\mkbibordvolume
,然后我们可以在“volume”字段格式中使用它:
\newcommand*{\mkbibordvolume}[1]{\Ordinalstringnum{#1}[m]}
再次强调,这是特定于语言的,因此最好的方法是像 一样处理它\mkbibordedition
。因此,总而言之,您将获得:
\newcommand*{\mkbibordvolume}{}
\usepackage{fmtcount}
\DefineBibliographyExtras{ngerman}{%
\renewcommand*{\mkbibordedition}[1]{\Ordinalstringnum{#1}[f]}
\renewcommand*{\mkbibordvolume}[1]{\Ordinalstringnum{#1}[m]}
}
\DeclareFieldFormat{volume}{\mkbibordvolume{#1}~\bibstring{volume}}
如果您希望用“Band”代替“Bd.”,用“Auflage”代替“Aufl.”,只需使用选项abbreviate=false
(如下例所示)。如果您希望除这两个字符串外其他所有内容都缩写,请使用\DefineBibliographyStrings
(有关详细信息,请参阅手册)。
我根据您的代码片段制作了一个完整的最小工作示例:
\documentclass[german,ngerman]{scrartcl}
\listfiles
\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
@book{Cantor,
author={Cantor, Moritz},
title={Vorlesungen über Geschichte der Mathematik (von 1200--1668)},
language={german},
volume={2},
edition={2},
address={Leipzig},
publisher={Teubner},
date={1900},
hyphenation={german}
}
\end{filecontents}
\usepackage[T1]{fontenc}
\usepackage[latin1]{inputenc}
\usepackage{babel,csquotes}
\usepackage[
sorting=none,
backend=biber,
babel=other,
abbreviate=false
]{biblatex}
\addbibresource{\jobname.bib}
\newcommand*{\mkbibordvolume}{}
\usepackage{fmtcount}
\DefineBibliographyExtras{ngerman}{%
\renewcommand*{\mkbibordedition}[1]{\Ordinalstringnum{#1}[f]}
\renewcommand*{\mkbibordvolume}[1]{\Ordinalstringnum{#1}[m]}
}
\DeclareFieldFormat{volume}{\mkbibordvolume{#1}~\bibstring{volume}}
% Bugfix für fmtcount:
\makeatletter
\DeclareRobustCommand{\@OrdinalstringMgerman}[2]{%
\@ordinalstringMgerman{#1}{\@@num@str}%
\protected@edef#2{\protect\MakeUppercase\@@num@str}%
}
\DeclareRobustCommand{\@OrdinalstringFgerman}[2]{%
\@ordinalstringFgerman{#1}{\@@num@str}%
\protected@edef#2{\protect\MakeUppercase\@@num@str}%
}
\DeclareRobustCommand{\@OrdinalstringNgerman}[2]{%
\@ordinalstringNgerman{#1}{\@@num@str}%
\protected@edef#2{\protect\MakeUppercase\@@num@str}%
}
\makeatother
\begin{document}
\cite{Cantor}
\printbibliography
\end{document}