某些前缀(又称“von”部分,又称小品词)以撇号或连字符结尾(“d'Ormesson”、“al-Hakim”)。这些前缀不得视为姓氏的一部分,以便在正文中允许使用“d'Ormesson”、“al-Hakim”等格式,但在参考文献列表中允许使用“Ormesson, Jean d'”、“Hakim, Tawfik al-”等格式。
由于 biblatex 不会解析d’
为d’Ormesson
前缀,因此必须在 von 和 Last 之间输入一个空格,如d’ Ormesson
。(我认为这是一个错误,但这不是我目前关心的问题。)
现在 biblatex 将名称拆分成元素,并且在渲染时在元素之间添加空格(使用\bibnamedelim
宏)。它才不是在一个愚蠢的撇号后添加一个空格(我认为这是正确的,预期的行为),但它做在智能撇号或连字符后添加一个空格(这是不正确的)。
建议的解决方案特许转售对于 bibtex,输入author = "d’\relax Ormesson, Jean",
对 biblatex 不起作用。
所以我的问题是:如何修复 biblatex 以将智能撇号和连字符视为哑撇号?
梅威瑟:
\documentclass{article}
\begin{filecontents}{\jobname.bib}
@book{orm-d,
author = {d' Ormesson-Dumb, Jean},
title = {Title: dumb apostrophe},
date = {2015},
}
@book{orm-s,
author = {d’ Ormesson-Smart, Jean},
title = {Title: smart apostrophe},
date = {2015},
}
@book{hak,
author = {al- Hakim, Tawfik},
title = {Title},
date = {2015},
}
\end{filecontents}
\usepackage[backend=biber, style=authoryear]{biblatex}
\addbibresource{\jobname.bib}
\usepackage{fontspec}
\setmainfont{Times}
\makeatletter
\AtBeginDocument{\toggletrue{blx@useprefix}}
\AtBeginBibliography{\togglefalse{blx@useprefix}}
\makeatother
\begin{document}
\section*{Text}
\cite{hak, orm-d, orm-s}
\printbibliography
\end{document}
输出:
文本
哈基姆 2015; d'Ormesson-Dumb 2015; 2015 年 Ormesson-Smart 奖
参考
Hakim,Tawfik al-(2015 年)。标题。
Ormesson-Dumb,Jean d'(2015 年)。标题:愚蠢的撇号。
Ormesson-Smart,Jean d'(2015)。标题:智能撇号。
预期的:
文本
哈基姆 2015; d'Ormesson-Dumb 2015; 2015 年奥梅森-智能奖
参考
Hakim,Tawfik al-(2015 年)。标题。
Ormesson-Dumb,Jean d'(2015 年)。标题:愚蠢的撇号。
Ormesson-Smart,Jean d'(2015)。标题:智能撇号。
注意:使用 xelatex/fontspec/Times,因为 pdflatex/default 字体根本不显示智能撇号。Mac OS X 10.10.5,TeX Live 2015。
答案1
编辑
从 3.2 版开始,biblatex
名字处理变得更加灵活。现在您可以指定姓氏前面的空格应被哪些字符吞掉\DeclarePrefChars
。
你可能至少想要
\DeclarePrefChars{'’}
默认值\DeclarePrefChars{'}
仅为(与早期版本的行为一致)。
另请参阅 §4.7.5配置标点和大写,第 216 页biblatex
文档。
保留此部分答案仅供历史目的。
宏name:
有一些特殊代码来处理此类名称前缀。您将感兴趣的命令称为\ifpunctmark{<char>}
,它检查刚刚打印的最后一个字符是否与一致<char>
。
默认命令有
\ifpunctmark{'}{}{\bibnamedelimc}
然后我们可以假装所有其他相关字符也是撇号
\sfcode`\-=\blx@sf@apo
\sfcode`\’=\blx@sf@apo
我们可以将其添加到\blx@namecodes
设置名称处理字符代码的宏中
\makeatletter
\def\blx@namecodes{%
\ifnum\sfcode`\A=\@m
\else
\blx@setazcodes
\fi
\sfcode`\'=\blx@sf@apo
\sfcode`\-=\blx@sf@apo
\sfcode`\’=\blx@sf@apo
}
\makeatother
如果您想将其与 (pdf)LaTeX 一起使用,则需要注释掉带有 unicode 字符’
( \sfcode`\’=\blx@sf@apo
) 的行。
完整版(使用 Linux Libertine 作为字体,因为我的系统上没有安装 Times)
\documentclass{article}
\usepackage[ngerman]{babel}
\usepackage[babel,german=guillemets]{csquotes}
\usepackage[backend=biber, style=authoryear]{biblatex}
\usepackage{filecontents}
\begin{filecontents*}{\jobname.bib}
@book{orm-d,
author = {d' Ormesson-Dumb, Jean},
title = {Title: dumb apostrophe},
date = {2015},
}
@book{orm-s,
author = {d’ Ormesson-Smart, Jean},
title = {Title: smart apostrophe},
date = {2015},
}
@book{hak,
author = {al- Hakim, Tawfik},
title = {Title},
date = {2015},
}
@book{von,
author = {von Scharnhorst, Johann},
title = {Title},
date = {2015},
}
@book{de,
author = {de Haan, Joop},
title = {Title},
date = {2015},
}
\end{filecontents*}
\addbibresource{\jobname.bib}
\addbibresource{biblatex-examples.bib}
\makeatletter
\def\blx@namecodes{%
\ifnum\sfcode`\A=\@m
\else
\blx@setazcodes
\fi
\sfcode`\'=\blx@sf@apo
\sfcode`\-=\blx@sf@apo
\sfcode`\’=\blx@sf@apo
}
\makeatother
\makeatletter
\AtBeginDocument{\toggletrue{blx@useprefix}}
\AtBeginBibliography{\togglefalse{blx@useprefix}}
\makeatother
\usepackage{fontspec}
\setmainfont{Linux Libertine}
\begin{document}
\cite{hak, orm-d, orm-s, von, de, vangennep, geer, worman, sigfridsson}
\printbibliography
\end{document}