引自biblatex
手动的:
[ ] 选项控制在加载包并且参考书目条目包含连字符字段 [...] 时
babel
使用哪种语言环境 。请注意,如果加载,则会自动调整为主文档语言 。在多语言文档中,就引用和参考书目的默认语言而言,它还将不断调整为当前语言。此选项用于在参考书目中按条目切换语言。babel
biblatex
babel
假设在主要语言为“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%
但是,polyglossia
xelatex 中存在同样的问题,并且这个技巧不起作用,我不知道如何解决这个问题。
无论如何,如果你不需要法语polyglossia
,这是目前的解决方案
\makeatletter
\AtEveryCitekey{%
\ifcsdef{abx@field@hyphenation}{%
\edef\blx@languagename{\abx@field@hyphenation}%
\select@language\abx@field@hyphenation%
\blx@hyphenreset%
}{}%
}
\makeatother
答案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}}%
更新:这不适用于biblatex
2.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}}