Biblatex 定制:通过连字符定义的作者姓名格式(本地化)

Biblatex 定制:通过连字符定义的作者姓名格式(本地化)

我尝试使用 比布拉特克斯(需定制)匈牙利语 babel 语言定义文件。匈牙利语的 babel 语言被称为magyar(意思是:匈牙利语)。

我正在写一篇文章,其中还引用了英语和匈牙利语文章。我设法创建匈牙利语基于英文.lbx能够在参考书目中使用匈牙利语文本,具体说明hyphenation = {magyar}如下围兜文件,并且它运行起来非常好。

问题是我想进一步修改参考书目的格式,因为匈牙利语中姓氏和名字的顺序是相反的,例如匈牙利语儒勒·凡尔纳写成如下:凡尔纳

这是在huplain.bst与 BibTeX 一起使用(使用指定选项huname =1),但不幸的是它不适用于作者年份格式的引用(例如 natbib 或 babelbib),这就是为什么我不得不寻找其他解决方案。对我来说,修改 biblatex 的代码似乎是最简单的方法。

有人知道我该如何放置一些条件语句,以便能够\DeclareNameFormat{labelname}以相反的顺序列出匈牙利名字,而姓氏和名字之间没有逗号吗?我希望可以做到。谢谢阅读!


編輯基于@michal.h21 的回答

我已在匈牙利基于@michal.h21的回答和评论,关于本主题结果的语言。您可以找到它这里

大多数重要功能都有效,一些次要部分则不那么吸引人,但总能以某种方式发挥作用。欢迎提出任何额外的意见!

答案1

您可以尝试在 lbx 文件的 \DeclareBibliographyExtras 部分中定义格式化命令。

因此在 magyar.lbx 中

\protected\def\nameprint#1#2{#1\space#2}

和英语.lbx

\protected\def\nameprint#1#2{#2\addcomma\space#1}

并在 bbx 中定义名称格式:

\DeclareNameFormat{default}{%
   \nameprint{#1}{#3}
   ..call macro for punctation
   ..call macro for and others
 }


编辑: 我昨天很匆忙,所以没有发布完整的示例。

DeclareNameFormat 是命令,它接受 8 个参数。它们是:

  • #1 姓氏。如果姓名仅由一个部分组成(例如,“亚里士多德”),则此部分将被视为姓氏。
  • #2 姓氏,以首字母表示。
  • #3 名字。此参数还包括所有中间名。
  • #4 名字以首字母表示。
  • #5 名称前缀,例如 von、van、of、da、de、del、della 等。请注意,在 BibTeX 文档中,名称前缀被称为名称的“von 部分”。
  • #6 姓名前缀,以首字母表示。
  • #7 名称 aYxes,例如 'junior'、'senior'、'der Jüngere'、'der Ältere' 等。请注意,在 BibTeX 文档中,名称 aYxes 被称为名称的“junior 部分”。
  • #8 名字 aYxes,以首字母缩写形式给出。

如果作者数量小于 \value{maxnames},则对列表中的每个名称调用此命令。如果您有 8 位作者,并且 maxnames 设置为 5,则它将仅打印不超过 \value{minnames} 的作者,我将此值设置为 3。

我们用完整的姓氏和名字调用命令 \nameprint。如果您需要姓名的其他部分,请使用上面列表中的某些参数。

然后我们必须在每个作者后面打印标点符号。我使用以下宏来实现:

\newbibmacro{names:separator}{%
  \ifthenelse{\value{listcount}<\value{liststop}}%
  {\addsemicolon\addspace}%
  {}%
 }

此宏会在除最后一位作者之外的每位作者后打印分号和空格。如果您想要除分号之外的其他标点符号,您可以用其他标点符号命令替换它。它们的列表位于 biblatex 手册第 155 页。或者您可以直接使用 \printtext 命令打印字符。

我的 andothers 宏如下所示:

\newbibmacro*{names:andothers}{%
 \ifboolexpr{%
   test {\ifnumequal{\value{listcount}}{\value{liststop}}}%
   and%
   test \ifmorenames%
 }{\bibsstring{andothers}}%
 {}%
}

我们不必在 andothers 之后添加标点符号,因为它会在 \DeclareBibliographyDriver 中使用下一个 \newunit 命令自动打印。

所以我的 \DeclareNameFormat 现在看起来像这样:

\DeclareNameFormat{default}{%
 \nameprint{#1}{#3}
 \usebibmacro{names:separator}%
 \usebibmacro{names:andothers}%
 }

现在我发现,我的第一个 \nameprint 版本不正确。Magyar 版本可能应该是:

 \protected\def\nameprint#1#2{#2\space#1}

英语:

\protected\def\nameprint#1#2{#1\addcomma\space#2}

您必须为参考书目中使用的每种语言定义此宏,否则您将收到有关未定义命令的错误消息。


根据此帖下方的评论进行另一项编辑:

您必须创建 bbx 和 cbx 文件。例如:

huglain.bbx

\ProvidesFile{hugplain.bbx}

\DeclareLanguageMapping{magyar}{magyar}
\RequireBibliographyStyle{authoryear}

\renewcommand*{\finalnamedelim}{%
  \ifnumgreater{\value{liststop}}{2}{\finalandcomma}{}%
  \addspace\bibsstring{and}\space}

\newbibmacro{names:separator}{%
  \ifthenelse{\value{listcount}<\value{liststop}}%
  {\addcomma\addspace}%
  {}%
 }

\newbibmacro{names:separator2}{%
  \ifthenelse{\value{listcount}<\value{liststop}}%
  {\addspace}%
  {}%
 }

\newbibmacro*{names:andothers}{%
 \ifboolexpr{%
   test {\ifnumequal{\value{listcount}}{\value{liststop}}}%
   and%
   test \ifmorenames%
 }{\bibsstring{andothers}\addcomma}%
 {}%
}

%\DeclareNameFormat{default}{%
% \nameprint{#1}{#3}
% \usebibmacro{names:separator}%
% \usebibmacro{names:andothers}%
% }

\DeclareNameFormat{sortname}{%
 \nameprint{#1}{#3}
 \usebibmacro{names:separator}%
 \usebibmacro{names:andothers}%
 }



\endinput

通知行

    \DeclareLanguageMapping{magyar}{magyar}

这是在加载您的 magyar.lbx 文件。在当前版本中,此文件根本没有使用,因此在您的引文中,姓氏前面是“and”,而不是“és”

hugplain.cbx相当简单

\ProvidesFile{hugplain.cbx}
\RequireCitationStyle{authoryear}
\endinput

在您的 tex 文件中,删除所有 biblatex 宏并使用 \usepackage[english,magyar]{babel} 调用 babel。最后一种语言是文档的主要语言。

在文件顶部匈牙利语,在 \PorvidesFile... 行下方添加行

\InheritBibliographyExtras{english}
\InheritBibliographyStrings{english}

并且参考书目字符串有误,请替换

bibliography     = {{Felhasznált\addspaceirodalom}{Felhasznált\addspaceirodalom}},

bibliography     = {{Felhasznált\addspace{}irodalom}{Felhasznált\addspace{}irodalom}},

最后,你应该在你的 bib 文件中为英文出版物添加连字符字段,除非你想有这样的引用Berk、Kriegler 和 Ylvisaker

答案2

我遇到了类似的问题,但引用了匈牙利和非匈牙利合著者的论文。因此,这种hyphenation方法对我来说没什么用。相反,我选择(错误地)使用名字中的 junior 部分。结果可能被用来吓唬小孩子。:-)

匈牙利作家可以写为Vezetéknév, HUN, Keresztnév,而非匈牙利作家则保持原样。

magyar.bbx

\ProvidesFile{magyar.bbx}

\DeclareLanguageMapping{magyar}{magyar}
\RequireBibliographyStyle{authoryear-comp}

\def\@magyarbbx@hun{HUN}

\DeclareNameFormat{sortname}{%
  \begingroup%
    \edef\juniorpart{#7}%
    \ifx\juniorpart\@magyarbbx@hun%
      % Hungarian name
      \usebibmacro{name:first-last}{#3}{#1}{#5}{\relax}%
    \else%
      % English name
      \ifnum\value{listcount}=1\relax%
        \usebibmacro{name:last-first}{#1}{#3}{#5}{#7}%
      \else%
        \usebibmacro{name:first-last}{#1}{#3}{#5}{#7}%
      \fi%
    \fi%
  \endgroup%
}

\endinput

magyar.cbx只是

\ProvidesFile{magyar.cbx}
\RequireCitationStyle{authoryear-comp}
\endinput

引用样式不需要修改的原因是,仅authoryear当两个作者的次要部分不同但名字/姓氏相同时,才会在引用中打印次要部分。

当然,如果匈牙利作者确实需要初级部分,这种方法就会失败,但通常情况并非如此。我想可以实施更复杂的检查和真正的引用风格。

相关内容