biblatex:如何删除 von 和 Last 之间的空格?

biblatex:如何删除 von 和 Last 之间的空格?

某些前缀(又称“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}

示例输出

相关内容