biblatex:根据 bibentry 的“连字符”字段切换*引文*的语言

biblatex:根据 bibentry 的“连字符”字段切换*引文*的语言

引自biblatex手动的

[ ] 选项控制在加载包并且参考书目条目包含连字符字段 [...] 时 babel使用哪种语言环境 。请注意,如果加载,则会自动调整为主文档语言 。在多语言文档中,就引用和参考书目的默认语言而言,它还将不断调整为当前语言。此选项用于在参考书目中按条目切换语言。babelbiblatexbabel

假设在主要语言为“ngerman”的文本中,我引用了一个带有连字字段“english”的 bibentry。默认情况下,文内引用将使用连字模式“德语”也就是说,如果引用样式使用作者姓名、标题甚至完整的书目数据,这些项目的连字符很容易出错。例如:作者 William A. Fischel(美国人)应该连字符为“Fis-chel”,但德语连字符模式会变成“Fi-schel”。

我目前的解决方法是将任何此类作者都纳入 TeX 的连字例外列表中,但对于较长的文本来说,这种方法很笨拙,而且容易出错。(otherlanguage出于同样的原因,手动将每个引文括在适当的环境中不是一个选择。)我设想的解决方案是使用“连字”字段自动切换到正确的语言文内对于每个 citekey。biblatex提供了一个\AtEveryCitekey钩子(仅在序言中使用),因此原则上这应该是可能的。在下面的例子中,我展示了使用 可以一次性切换语言\AtNextCitekey

\documentclass{article}

\usepackage[english,ngerman]{babel}

\usepackage[style=authoryear,babel=hyphen]{biblatex}

\usepackage{filecontents}

\begin{filecontents}{\jobname.bib}
@book{Fis85,
  hyphenation = {english},
  author = {Fischel, William A.},
  year = {1985},
  title = {The economics of zoning laws: A property rights approach to American land use planning},
  location = {Baltimore},
  publisher = {Johns Hopkins University Press},
}
\end{filecontents}

\addbibresource{\jobname.bib}

\textwidth=290pt

% My current workaround: Include author names in the hyphenation exception list
% \hyphenation{Fis-chel}

% My envisaged solution: At every citekey, switch to the language defined in the bibentry's
%     "hyphenation" field. This doesn't work because babel strips away the escape character "\"
%     from "\thefield{hyphenation}"
% \AtEveryCitekey{\selectlanguage{\thefield{hyphenation}}}

\begin{document}

Dies hier ist ein Blindtext zum Testen von Textausgaben \autocite{Fis85}.

% The following code line shows that my envisaged solution (see above) would work if
%     "\thefield{hyphenation}" would be expanded to (in this case) "english"
%     (Note: "\AtNextCitekey" is the "one-time" variant of  "\AtEveryCitekey"
\AtNextCitekey{\selectlanguage{english}}

Dies hier ist ein Blindtext zum Testen von Textausgaben \autocite{Fis85}.

Dies hier ist ein Blindtext zum Testen von Textausgaben \autocite{Fis85}.

\printbibliography

\end{document}

那么为什么我设想的解决方案不起作用呢?尝试

\AtEveryCitekey{\selectlanguage{\thefield{hyphenation}}}

导致以下错误消息:

包 babel 错误:您尚未定义语言 thefield{hyphenation}

也就是说,它不会扩展\thefield{hyphenation}为“英语”(正如我天真地假设的那样),而是babel去掉转义字符\\thefield{hyphenation}然后抱怨语言未知。(根据babel手动的,这种剥离是为了与german包(使用语法\selectlanguage{\german})兼容的原因。

仔细查看后biblatex.sty,我发现了以下代码片段,它修补了内部babel命令。它很可能揭示了需要做什么才能正确地将\thefield{hyphenation}上述示例中的“英语”扩展为“英语”——但说实话,我不知道这个代码片段到底做了什么。

\def\blx@mkbabel{%
  \patchcmd\bbl@set@language
    {\select@language}
    {\blx@langsetup\languagename\select@language}%
    {\ifdef\blx@thelangenv
       {\def\blx@beglang{%
          \blx@clearlang
      \begingroup
          \blx@imc@iffieldundef{hyphenation}
            {}
            {\blx@hook@initlang
         \def\blx@endlang{%
               \blx@hook@endlang
               \csname end\blx@thelangenv\endcsname
               \endgroup}%
             \csname\blx@thelangenv\expandafter\endcsname
               \expandafter{\abx@field@hyphenation}}}}
       {}%
     \blx@langsetup\bbl@main@language}
    {\blx@err@patch{'babel' package}%
     \blx@mknobabel}}

长话短说,问题:我怎样才能实现我设想的解决方案,即自动切换语言引文根据 bibentry 的“连字符”字段?

答案1

我认为这可行:

\makeatletter
\AtEveryCitekey{%
\blx@langsetup\abx@field@hyphenation%
\blx@hyphenreset%
}
\makeatother

\abx@field@hyphenation连字符值。如果设置了,可能需要进行一些测试。


编辑:

前段时间,我因为自己的引用风格有问题[1],所以在研究 biblatex 语言切换。我完全看不懂这段代码,所以最后只能用丑陋的 hack[2] 来结束。

但是当我昨天查看你发布的 biblatex 的 babel 补丁时,我发现了一行

\blx@langsetup\languagename\select@language

函数\blx@langsetup用于edef定义\blx@languagename,宏使用它\blx@hyphenreset来加载连字模式,然后加载给定语言的本地化字符串。因此,实际上,

\blx@langsetup\abx@field@hyphenation%

可以只使用

\edef\blx@languagename{\abx@field@hyphenation}%

然后是法语的问题。当用作主要文档语言时,

... (Fis-
el 1985)...

...(FISCHEL
1985)...

我认为只有法语存在问题,我尝试了捷克语、俄语和西班牙语,它们都可以正常使用。

有了babel,我们可以解决这个问题

\select@language\abx@field@hyphenation%

但是,polyglossiaxelatex 中存在同样的问题,并且这个技巧不起作用,我不知道如何解决这个问题。

无论如何,如果你不需要法语polyglossia,这是目前的解决方案

\makeatletter
\AtEveryCitekey{%
\ifcsdef{abx@field@hyphenation}{%
\edef\blx@languagename{\abx@field@hyphenation}%
\select@language\abx@field@hyphenation%
\blx@hyphenreset%
}{}%
}
\makeatother

[1]Biblatex - 在一个参考条目中使用两种语言

[2]Biblatex - 在一个参考条目中使用两种语言

答案2

michal.h21 的最新解决方案也适用于法语(至少在不使用的情况下polyglossia),但它的缺点是它还会切换“ibidem”、“sequens”和“sequentes”等术语的语言。因此,我改编了 michal.h21 的代码以仅切换连字模式:

\makeatletter
\AtEveryCitekey{%
  \ifcsdef{abx@field@hyphenation}{%
    \edef\blx@languagename{\abx@field@hyphenation}%
    \blx@hyphenreset
  }{%
  }%
}
\makeatother

对于法语,一个可能的解决方法是使用 michal.h21 的最新解决方案,但另外还要为特定文档中使用的每种语言重新定义“ibidem”及其同类词的本地化键,以便它们与主文档语言的键相匹配。

答案3

感谢@oleg 的提示,我在 SF 上提供的 biblatex 2.8a 开发版本中实现了此功能。请参阅 PDF 文档了解该language选项。基本上,只需设置language=auto为打开 bib 条目和引文的语言切换即可。

答案4

babel这是一个对选项敏感的解决方案biblatex。它包装了环境中的每个引用\blx@thelangenv,这取决于此选项。这也应该适用于polyglossia

\gpreto\blx@hook@citekey{%
  \ifdef\abx@field@hyphenation
    {\ifdef\blx@thelangenv
      {\edef\blx@temp@langenv{\noexpand\csname\blx@thelangenv\endcsname%
          {\abx@field@hyphenation}}%
       \blx@temp@langenv}
      {}}%
    {}}
\apptocmd{\blx@citeprint}{%
  \ifdef\abx@field@hyphenation
    {\ifdef\blx@thelangenv
      {\csname end\blx@thelangenv\endcsname}
      {}}%
    {}%
}{}{\blx@err@patch{citeprint command}}%

更新:这不适用于biblatex2.8 和polyglossia。相反,可以使用以下补丁(但:请参阅@PLK 的回答,biblatex将会原生支持该功能)

\patchcmd{\blx@citeprint}{\begingroup}{\begingroup\blx@beglang}
  {}{\blx@err@patch{citeprint command}}
\patchcmd{\blx@citeprint}{\endgroup}{\blx@endlang\endgroup}
  {}{\blx@err@patch{citeprint command}}

相关内容