![问题](https://linux22.com/image/376347/%E9%97%AE%E9%A2%98.png)
biblatex
我在使语言映射继承\DeclareLanguageMappingSuffix
和语言变体正常工作时遇到了问题polyglossia
。
考虑以下 MWE:
\documentclass{article}
\usepackage{filecontents}
\begin{filecontents}{english-test.lbx}
\InheritBibliographyExtras{english}
\DeclareBibliographyStrings{%
inherit = {english},
in = {in \textcolor{red}{(english)}}{in \textcolor{red}{(english)}},
pages = {pages \textcolor{red}{(english)}}{pp\adddot\space\textcolor{red}{(english)}}
}
\end{filecontents}
\begin{filecontents}{american-test.lbx}
\InheritBibliographyExtras{american}
\DeclareBibliographyStrings{%
inherit = {american},
in = {in \textcolor{blue}{(american)}}{in \textcolor{blue}{(american)}},
}
\end{filecontents}
\usepackage{xcolor}
\usepackage{csquotes}
\usepackage{polyglossia}
\setmainlanguage[variant=american]{english}
%\usepackage[american]{babel}% <- works with babel
\usepackage[style=verbose]{biblatex}
\DeclareLanguageMappingSuffix{-test}
\addbibresource{biblatex-examples.bib}
\begin{document}
\cite{westfahl:space}
\end{document}
它给出了以下输出(预期,因为biblatex
无法检测语言变体polyglossia
):
如果我们使用\usepackage[american]{babel}
,我们也会得到预期(和期望)的输出:
问题
我需要添加什么polyglossia
才能biblatex
同时加载american-test.lbx
和 english-test.lbx
?
无论添加什么也应该可以与之兼容babel
。
我尝试过的事情:
\usepackage[style=verbose,language=american]{biblatex}
(polyglossia
加载时被覆盖)\DeclareLanguageMapping{english}{american-test}
(永不加载english-test.lbx
)\DeclareLanguageMapping{english}{american}
(既不加载american-test.lbx
也不english-test.lbx
)
答案1
更新的所有多语言功能都应在v3.14(或更高版本)和v1.46(或更高版本)
biblatex
上按预期运行。biblatex
polyglossia
问题的 MWE
babel
现在产生了预期的(等效)输出。
polyglossia
如果您在使用和时遇到任何问题biblatex
,请更新您的系统,以便至少拥有biblatex
3.14(和匹配的 Biber 版本)和polyglossia
1.46。如果这没有帮助,请在以下位置打开错误报告https://github.com/plk/biblatex/issues。以下答案的其余部分仅用于学术目的。
特别要注意的是
polyglossia
(https://github.com/reutenauer/polyglossia/issues/205) 是我在提出这个问题时打开的,已经解决了。
这不是一个完整的答案,但它描述了事情出错的原因polyglossia
以及整个语言映射业务是如何运作的。
polyglossia
和biblatex
polyglossia
对 的支持充其量biblatex
也只是零散的。我的建议是polyglossia
尽可能避免使用,而使用babel
。polyglossia
曾经是某些语言的必备功能(尤其是非拉丁文字或 RTL 语言),但最近的发展表明这方面有所改善。对于其他语言(当然是西欧语言),选择babel
并没有太大的优势(而且这种情况已经持续了相当长一段时间)。polyglossia
babel
babel
的语言与polyglossia
主要语言+选项
迄今为止最棘手的问题是语言变体的检测。虽然babel
它为遇到的每种变体或方言简单而天真地定义了一种新语言,但它polyglossia
有一个更复杂的界面,可以设置主要语言,然后可以使用某些属性对其进行修改(例如,variant
将其转换english
为american
或british
或german
转换为swissgerman
或austrian
;并spelling
选择ngerman
或german
)。
变异检测
不幸的是,主语言的variant
变spelling
体在各个语言中的实现并不统一,并且没有接口供包或类查找当前正在使用的变体。对于也想对语言变体采取行动的包来说,这是一个主要问题。实际上情况比这更糟糕,在某些情况下甚至不polyglossia
知道哪个变体处于活动状态!请看以下人为的例子。
\documentclass{article}
\usepackage{xcolor}
\usepackage{polyglossia}
\setotherlanguage{english}
\setotherlanguage{dutch}
\setmainlanguage{german}
\def\month{1}% we need january where German German and Austrian German differ
\begin{document}
\tableofcontents
\begin{english}
\section{\protect\today}
\end{english}
\section{\protect\today}
\begin{german}[variant=austrian]
\section{\protect\textcolor{red}{\protect\today}}
\end{german}
\begin{dutch}
\section{\protect\today}
\end{dutch}
\end{document}
日期会改变目录中的语言,就像改变章节标题中的语言一样,但不会改变语言变体。我已在https://github.com/reutenauer/polyglossia/issues/205
查找要加载哪种语言
biblatex
主要适用于babel
处理语言的模型:每种方言都是一种新语言(语言之间可以有继承关系,但这对整体观点来说并不重要)。因此,首先必须有一个适当的接口来将polyglossia
主要语言+选项转换为babel
等效语言,然后才能知道要加载哪种语言。这种转换是一项不简单的任务,因为设置其主要语言和选项的biblatex
方式与结果语言的名称之间不需要有联系。我相信这只能在侧面得到适当的解决,因为每个语言本质上都必须声明其polygossia
babel
polyglossia
gloss-....ldf
babel
等效名称。一个非常基本的概念证明可以在https://github.com/moewew/polyglossia/tree/bblnames,当前版本的变更polyglossia
位于https://github.com/reutenauer/polyglossia/compare/master...moewew:bblnames。
使用有针对性的语言
即使在语言文件最终加载后, 的问题biblatex
也不会停止。 使用时,babel
只需将 bibstring 添加到 即可\extras<babel-language>
。 每当切换语言时都会调用该命令,因此会激活正确的字符串。 但是,polyglossia
只有\extras<base-language>
存在(没有 只有\extrasaustrian
)\extrasgerman
,biblatex
必须从语言计算基础语言babel
,所有变体更改都必须进行之内 \extras<main-language>
。但正如上面提到的,变体没有统一的实现,因此这需要对gloss-....ldf
s 有深入的了解。
biblatex
的语言映射
由于这个问题也与语言映射有关,并且最近发生了变化(在 3.11 版中,请参阅CHANGES.md
),现在让我解释一下这是如何运作的。
每当biblatex
尝试加载.lbx
文件时,它会首先尝试解决语言映射。
对于所有映射到 的语言,都有 的特定语言映射\DeclareLanguageMapping{<language>}{<new lbx file>}
和通用映射。特定映射优先于通用映射。\DeclareLanguageMappingSuffix{<suffix>}
<language>.lbx
<language><suffix>.lbx
.lbx
文件可以使用 或中的特殊 'bibstring'从其他.lbx
文件继承。未定义所有字符串或附加项的文件本身应始终从合理的来源继承未定义的内容(例如,请参阅\InheritBibliographyStrings{<lang>}
\InheritBibliographyExtras{<lang>}
inherit = {<lang>},
\DeclareBibliographyStrings
.lbx
更新后 biblatex' \DeclareLanguageMapping 出现问题)。
当biblatex
解决继承时,所有语言映射仍然适用。仅避免了无限递归。
假设我们有一个文件german.lbx
包含德语的所有定义。
文件ngerman.lbx
对于新的正字法规则,它继承自german
并且只改变了必要的内容,它看起来像这样(简化和缩短)
\ProvidesFile{ngerman.lbx}
\InheritBibliographyExtras{german}
\DeclareBibliographyStrings{%
inherit = {german},
citedas = {{im Folgenden zitiert als}{im Folgenden zit\adddotspace als}},
}
我们还有两个文件\DeclareLanguageMappingSuffix{-dp}
german-dp.lbx
\ProvidesFile{german-dp.lbx}
\InheritBibliographyExtras{german}
\DeclareBibliographyStrings{%
inherit = {german},
castle = {{Schloß}{Schloß}},
}
ngerman-dp.lbx
\ProvidesFile{ngerman-dp.lbx}
\InheritBibliographyExtras{ngerman}
\DeclareBibliographyStrings{%
inherit = {ngerman},
castle = {{Schloss}{Schloss}},
}
如果你现在biblatex
要求恩格尔曼,它就会调用我们设置的语言映射并打开ngerman-dp.lbx
。ngerman-dp.lbx
继承自恩格尔曼因此ngerman.lbx
打开了(我们不遵循映射,因为我们不想打开ngerman-dp.lbx
并陷入无限循环)。ngerman.lbx
术语继承自德语,这次映射被遵循,因此german-dp.lbx
被打开。german-dp.lbx
继承自德语最后german.lbx
被读取。以下列表按时间倒序显示打开的文件,因为inherit
始终是第一个关键字定义被后续文件覆盖
german.lbx
german-dp.lbx
ngerman.lbx
ngerman-dp.lbx
为了恩格尔曼你最终会得到
citedas = {{im Folgenden zitiert als}{im Folgenden zit\adddotspace als}},% ngerman.lbx
castle = {{Schloss}{Schloss}},% ngerman-dp.lbx
举一个奇怪的例子,现在假设除了上述情况之外
german.lbx
定义lipsum = {lorem}
ngerman.lbx
定义lipsum = {ipsum}
german-dp.lbx
定义lipsum = {dolor}
ngerman-dp.lbx
没有 的条目lipsum
。
我们最终会得到什么恩格尔曼(根据映射为ngerman-dp.lbx
)?列表显示我们得到了“ipsum”,即来自 的定义ngerman.lbx
。
我应该补充一点,我并不强烈倾向于声称这种继承链是正确的或至少是预期的。但我确实觉得设置文件的方式是.lbx
自然的,所以我准备接受由此产生的继承链作为自然的必然结果。
如果ngerman-dp.lbx
继承自德语-dp相反,我们会得到以下链
german.lbx
(继承自german-dp.lbx
)german-dp.lbx
(继承自ngerman-dp.lbx
)(german-dp-dp.lbx
ngerman-dp.lbx
继承德语-dp,这是应用后缀的结果,文件不存在,在警告后被忽略,而是german-dp.lbx
被加载)ngerman-dp.lbx
尤其是没有定义被ngerman.lbx
读取并且german-dp.lbx
获胜lipsum = {dolor}
。我们最终得到
citedas = {{im folgenden zitiert als}{im folgenden zit\adddotspace als}},% german.lbx
castle = {{Schloss}{Schloss}},% ngerman-dp.lbx
lipsum = {{dolor}{dolor}},% german-dp.lbx
ngerman-dp.lbx
必须重复ngerman.lbx
它想要保留的所有定义。
答案2
我认为,设置语言文件时最重要的是确保继承链正确。您想american-test
从american
和从继承english-test
,但不清楚哪个从哪个应该是直接父级:文件显示american
,但预期输出显示您english-test
至少希望赢得该pages
字段。
我会设置文件,以便它english-test
是直接父级以及映射,以克服多语种的缺陷。
\documentclass{article}
\usepackage{filecontents}
\begin{filecontents}{english-test.lbx}
\InheritBibliographyExtras{english}
\DeclareBibliographyStrings{%
inherit = {english},
in = {in \textcolor{red}{(english)}}{in \textcolor{red}{(english)}},
pages = {pages \textcolor{red}{(english)}}{pp\adddot\space\textcolor{red}{(english)}}
}
\end{filecontents}
\begin{filecontents}{american-test.lbx}
\InheritBibliographyExtras{english-test}
\DeclareBibliographyStrings{%
inherit = {english-test},
in = {in \textcolor{blue}{(american)}}{in \textcolor{blue}{(american)}},
}
\end{filecontents}
\usepackage{xcolor}
\usepackage{csquotes}
\usepackage{polyglossia}
\setmainlanguage[variant=american]{english}
%\usepackage[american]{babel}% <- works with babel
\usepackage[style=verbose]{biblatex}
\DeclareLanguageMappingSuffix{-test}
\DeclareLanguageMapping{english}{american-test}
\addbibresource{biblatex-examples.bib}
\begin{document}
\cite{westfahl:space}
\end{document}