问题

问题

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上按预期运行。biblatexpolyglossia

问题的 MWEbabel现在产生了预期的(等效)输出。

polyglossia如果您在使用和时遇到任何问题biblatex,请更新您的系统,以便至少拥有biblatex3.14(和匹配的 Biber 版本)和polyglossia1.46。如果这没有帮助,请在以下位置打开错误报告https://github.com/plk/biblatex/issues

以下答案的其余部分仅用于学术目的。

特别要注意的是polyglossiahttps://github.com/reutenauer/polyglossia/issues/205) 是我在提出这个问题时打开的,已经解决了。

这不是一个完整的答案,但它描述了事情出错的原因polyglossia以及整个语言映射业务是如何运作的。

polyglossiabiblatex

polyglossia对 的支持充其量biblatex也只是零散的。我的建议是polyglossia尽可能避免使用,而使用babelpolyglossia曾经是某些语言的必备功能(尤其是非拉丁文字或 RTL 语言),但最近的发展表明这方面有所改善。对于其他语言(当然是西欧语言),选择babel并没有太大的优势(而且这种情况已经持续了相当长一段时间)。polyglossiababel

babel的语言与polyglossia主要语言+选项

迄今为止最棘手的问题是语言变体的检测。虽然babel它为遇到的每种变体或方言简单而天真地定义了一种新语言,但它polyglossia有一个更复杂的界面,可以设置主要语言,然后可以使用某些属性对其进行修改(例如,variant将其转换englishamericanbritishgerman转换为swissgermanaustrian;并spelling选择ngermangerman)。

变异检测

不幸的是,主语言的variantspelling体在各个语言中的实现并不统一,并且没有接口供包或类查找当前正在使用的变体。对于也想对语言变体采取行动的包来说,这是一个主要问题。实际上情况比这更糟糕,在某些情况下甚至不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方式与结果语言的名称之间不需要有联系。我相信这只能在侧面得到适当的解决,因为每个语言本质上都必须声明其polygossiababelpolyglossiagloss-....ldfbabel等效名称。一个非常基本的概念证明可以在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\extrasgermanbiblatex必须从语言计算基础语言babel,所有变体更改都必须进行之内 \extras<main-language>。但正如上面提到的,变体没有统一的实现,因此这需要对gloss-....ldfs 有深入的了解。

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.lbxngerman-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.lbxngerman-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-testamerican和从继承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}

在此处输入图片描述

相关内容