类似的问题根据字段更改语言,但是: (1) 我对拉丁语和希腊语使用不同的字体,并且 (2) 我对标题使用自动句子大小写。
- 相同字体的语言与
autolang=hyphen
包选项配合使用效果很好。不同字体(\greekfont
在本例中)则不行。autolang=other
(*
)还会导致参考书目术语(如“in”或“volume”)的翻译,而我不想这样做。 - 不修改大小写不会对单个 bib 字段的临时处理造成任何问题
\selectlanguage{greek}
。修改大小写会将命令视为首字母,导致“实际”标题以小写开头。 - 使用
\selectlanguage
会导致条目将作者排序为以“greek”开头,位于“Greej”和“Greel”之间。 - 如果
author
以改变的顺序打印(“Smith, J.”⇒“J. Smith”),则名字/首字母不会受到影响\selectlanguage
。
我认为一个可能的解决方案可能涉及一个新版本,autolang
该版本仅影响某些字段,仅影响用户给定的字段,或排除内部参考书目字符串。
如何设置单个参考书目条目字段的语言并使其表现得像常规条目一样?
梅威瑟:
\documentclass{article}
\usepackage{filecontents,fontspec,polyglossia}
\setmainfont{Latin Modern Mono}
\newfontfamily\greekfont{GFS Didot}[Color=CC0000]
\setmainlanguage{english}
\setotherlanguage{greek}
\usepackage[backend=biber,autolang=hyphen]{biblatex}
\DeclareFieldFormat{titlecase}{\MakeSentenceCase{#1}}
\begin{filecontents}{\jobname.bib}
@other{sortexample1,
author={Greej},
title={Latin alphabet},
langid={english},
}
@other{sortexample2,
author={Greel},
title={Latin alphabet},
langid={english},
}
@article{greekexample,
author={\selectlanguage{greek}Ἀριστοτέλης, Ἀ.},
journal={\selectlanguage{greek}Αὐτῆς},
title={\selectlanguage{greek}Ὑπῆρξε},
year={2000},
volume={5},
langid={greek},
}
\end{filecontents}
\addbibresource{\jobname.bib}
\begin{document}
\nocite{*}
\printbibliography
\end{document}
答案1
这很棘手。默认情况下,biblatex
整个参考书目条目都使用一种语言环境。这意味着整个条目(不仅是数据,还有自动生成的文本和标点符号)都使用同一种语言。
我绝对可以看到您想要获得的东西的吸引力,特别是当您必须切换语言才能获得正确的字体时。
原则上有两种方法可以做到这一点
将整个条目包装在
otherlanguage
环境中,并切换回所有 bibstring 的语言。这听起来很有吸引力,而且可能相当容易实现。但这会将条目排版为基本上完全外语,并且只会将字符串切换回主语言:在您的示例中,所有标点符号都将以红色排版。修补所有字段格式,以便它们在最内层将语言切换为源语言。我们不能简单地在更高级别进行更改,因为这样
\DeclareFieldFormat{volume}{\bibstring{volume}~#1}
会以错误的语言显示出来。所以我们本质上将其变成了\DeclareFieldFormat{volume}{\bibstring{volume}~<foreignlanguage>#1<end-foreignlanguage>}
。这将语言更改保持在最低限度,并且仅限于实际输入数据。- 您的 MWE 包含一个不起作用的情况:
\DeclareFieldFormat{titlecase}{\MakeSentenceCase{#1}}
无法\MakeSentenceCase
处理传递给其参数的语言环境。
- 您的 MWE 包含一个不起作用的情况:
MWE 实施选项 2
\documentclass{article}
\usepackage{filecontents,fontspec,polyglossia}
\setmainfont{Latin Modern Mono}
\newfontfamily\greekfont{GFS Didot}[Color=CC0000]
\setmainlanguage{english}
\setotherlanguage{greek}
\usepackage[backend=biber,autolang=hyphen]{biblatex}
\makeatletter
\def\blx@beglang@fake{%
\blx@clearlang
\begingroup
\ifdef\abx@field@langid
{\ifdef\abx@field@langidopts
{\csname\abx@field@langid\expandafter\endcsname\expandafter[\abx@field@langidopts]}
{\csname\abx@field@langid\endcsname}}
{}}
\def\blx@endlang@fake{%
\csname end\abx@field@langid\endcsname
\endgroup}
\renewrobustcmd*{\blx@imc@printfield}[2][]{%
\blx@imc@iffieldundef{#2}
{\blx@nounit}
{\blx@getformat\blx@theformat{ffd}{#1}{#2}%
\ifdefvoid\blx@theformat
{\blx@nounit}
{\blx@begunit
\let\blx@theformat@outer\blx@theformat
\def\blx@theformat##1{\blx@theformat@outer{\blx@beglang@fake ##1\blx@endlang@fake}}%
\edef\currentfield{#2}%
\expandafter\expandafter
\expandafter\blx@theformat
\expandafter\expandafter
\expandafter{\csname abx@field@#2\endcsname}%
\blx@endunit}}}
\long\def\blx@nameparser@i#1#2{%
\begingroup
\ifblank{#1}
{}
{\setkeys{blx@opt@name}{#1}}%
\setkeys{blx@opt@namepart}{#2}%
\blx@beglang@fake\blx@theformat{#2}\blx@endlang@fake
\endgroup}
\long\def\blx@listparser#1{%
\ifblank{#1}
{\blx@listbreak}
{\ifnum\c@listcount<\c@liststart
\else
\blx@beglang@fake\blx@theformat{#1}\blx@endlang@fake
\fi
\advance\c@listcount\@ne
\ifnum\c@listcount>\c@liststop
\expandafter\blx@listbreak
\fi
\blx@listparser}}
\makeatother
\DeclareFieldFormat{titlecase}{#1}
\begin{filecontents}{\jobname.bib}
@other{sortexample1,
author={Greej},
title={Latin alphabet},
langid={english},
}
@other{sortexample2,
author={Greel},
title={Latin alphabet},
langid={english},
}
@book{greekexample,
author={Ἀριστοτέλης, Ἀ.},
publisher={Αὐτῆς},
title={Ὑπῆρξε},
year={2000},
volume={5},
langid={greek},
}
\end{filecontents}
\addbibresource{\jobname.bib}
\begin{document}
\nocite{*}
\printbibliography
\end{document}
如果你确实需要这个,请打开一个功能请求https://github.com/plk/biblatex/issues。我不能保证很快就会看到这一点,但至少届时会记录下来并与其他人分享他们的想法。