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 生成的作者索引中的排序。我没能一步完成所有操作。
到目前为止,这段代码运行良好,所以我想分享它。欢迎任何改进建议。
伊夫