如何使用 Biblatex 缩写多个字母的名字?

如何使用 Biblatex 缩写多个字母的名字?

Biblatex 实现了一种缩写名字的机制:它只打印名字的第一个字符。例如,“Philippe”缩写为“P。”。

然而,有些语言要求某些名字采用不同的缩写。

在法语中,所有以一对辅音开头并组成一个音素的名字都必须缩写为这对辅音。例如,“Philippe”必须缩写为“Ph.”,而不是“P.”。

使用 LaTeX 解决此问题的一种方法是使用 \relax 保护名字的起始辅音对:如果 biblatex(或 bibtex)检测到 {\relax{}Ph}ilippe 是名字,则会根据需要将其缩写为“Ph.”。

此处公开了此解决方案: BibTeX:将名字缩写为 2 个或 3 个字母(而不是 1 个)

然而,该解决方案需要在.bib文件中手动插入\relax命令,非常繁琐。

答案1

我实现了以下代码自动地将以 Ph、Th 或 Ch 开头的名字缩写为该首辅音对。无需在 .bib 文件中手动插入 \relax。

\DeclareSourcemap{%
  \maps[datatype=bibtex]{%
    \map{%
      \stepfixfirstnameabbr{author}%
      \stepfixfirstnameabbr{editor}%
      \stepfixfirstnameabbr{editora}%
      \stepfixfirstnameabbr{editorb}%
      \stepfixfirstnameabbr{editorc}%
    }}}

\newcommand{\stepfixfirstnameabbr}[1]{
  % step 1
  \step[fieldsource=#2,
    match={\regexp{([^,]\s+)\b(Ch|Th|Ph)(\S*(\s+and|$))}},
    replace={\regexp{$1\{$2\}$3}}]%
  % step 2
  \step[fieldsource=#2,
    match={\regexp{(^|[^,]\s+)\b(Ch|Th|Ph)(\S*,)}},
    replace={\regexp{$1\{$2\}$3}}]%
  % step 3
  \step[fieldsource=#2,
    match={\regexp{\b(Ch|Th|Ph)([^\}])}},
    replace={\regexp{\{\\relax\{\}$1\}$2}}]%
}

步骤1解析以“firstname lastname”形式编写的姓名字段。如果匹配 Ch、Th 或 Ch,则会包装姓氏的开头。

Philippe Charmet and Charmet, Philippe
=> Philippe {Ch}armet and Charmet, Philippe

第2步解析以“lastname, firstname”形式编写的姓名字段。如果匹配 Ch、Th 或 Ch,则会包装姓氏的开头。

Philippe {Ch}armet and Charmet, Philippe
=> Philippe {Ch}armet and {Ch}armet, Philippe

步骤3将 Th、Ch 或 Th 与名字开头的单词 Relax 包装在一起,如下所示:

Philippe {Ch}armet and {Ch}armet, Philippe
=> {\relax{}Ph}ilippe {Ch}armet and {Ch}armet, {\relax{}Ph}ilippe

步骤 1 和 2 乍一看似乎毫无用处,但其实不然:重要的是不要在姓氏开头插入 \relax,因为这会影响使用 makeindex 生成的作者索引中的排序。我没能一步完成所有操作。

到目前为止,这段代码运行良好,所以我想分享它。欢迎任何改进建议。

伊夫

相关内容