biblatex:如何删除 authoryear 样式中年份周围的括号?

biblatex:如何删除 authoryear 样式中年份周围的括号?

标准authoryear样式是biblatex在参考书目中用括号括起年份,而在文本引用年份中不加括号:

  • Smith 2011 显示...(引文)

  • 史密斯,乔(2011)......(参考书目)

有没有(简单的)方法可以将它们变成:

  • Smith (2011) 指出...(引文)

  • 史密斯,乔。2011 年......(参考书目)

答案1

感谢 egreg 的出色回答biblatex:是否可以修补用 \newbibmacro 创建的宏?,本问题的解决方案很简单:使用新\patchbibmacro命令选择性地更改date+extradate命令选择性地更改bibmacro然而这个定义首先看起来像(假设存在一些常见的模式)。

\documentclass{article}

\usepackage[style=authoryear]{biblatex}

% By courtesy of Enrico Gregorio (egreg)
\makeatletter
\def\act@on@bibmacro#1#2{%
  \expandafter#1\csname abx@macro@\detokenize{#2}\endcsname
}
\def\patchbibmacro{\act@on@bibmacro\patchcmd}
\def\pretobibmacro{\act@on@bibmacro\pretocmd}
\def\apptobibmacro{\act@on@bibmacro\apptocmd}
\def\showbibmacro{\act@on@bibmacro\show}
\makeatother

\usepackage{filecontents}

\begin{filecontents}{\jobname.bib}
@misc{A01,
  author = {Author, A.},
  year = {2001},
  title = {Alpha},
}
\end{filecontents}

\addbibresource{\jobname.bib}

\nocite{*}

\begin{document}

\printbibliography

\patchbibmacro{date+extradate}{%
  \printtext[parens]%
}{%
  \setunit{\addperiod\space}%
  \printtext%
}{}{}

\printbibliography

\end{document}

编辑:有了 egreg 的事情就更容易了xpatch包裹:

\documentclass{article}

\usepackage[style=authoryear]{biblatex}

\usepackage{xpatch}

\usepackage{filecontents}

\begin{filecontents}{\jobname.bib}
@misc{A01,
  author = {Author, A.},
  year = {2001},
  title = {Alpha},
}
\end{filecontents}

\addbibresource{\jobname.bib}

\nocite{*}

\begin{document}

\printbibliography

\xpatchbibmacro{date+extradate}{%
  \printtext[parens]%
}{%
  \setunit{\addperiod\space}%
  \printtext%
}{}{}

\printbibliography

\end{document}

在此处输入图片描述

答案2

更新:可能会找到更好的参考书目解决方案这里

文内引用:替换\cite\textcite

参考书目:来自我的个人biblatex.cfg(加\makeatletter/ \makeatother):

\makeatletter
\ifcsundef{abx@macro@\detokenize{date+extrayear}}{%
  }{%
  \renewbibmacro*{date+extrayear}{%
    \iffieldundef{year}{%
      }{%
      \addperiod\space
      \printtext{\printdateextra}%
    }%
  }%
}
\makeatother

(也可以简单地重新定义date+extrayearbibmacro,但是如果切换到不包含此特定宏的样式,则会导致错误。)

编辑:Alan Munn 提醒我注意,我的重新定义基于一个过时的版本,而authoryear.bbx这个版本错误地仍包含在 MiKTeX 附带的 biblatex 版本中。如果正确安装了 biblatex 版本,我的“解决方案”可能对您有用,也可能对您没用。

编辑 2:MiKTeX 不是罪魁祸首。我首选的编辑器 (TeXworks) 不知何故显示了旧版本的内容authoryear.bbx

编辑 3:看来我的重新定义将与 authoryear 样式的默认设置一起使用,但如果您修改该mergedate选项(在 biblatex v1.1b 中得到改进),可能会破坏一些东西。

答案3

以下对我的问题第二部分的回答基于与步调一致在聊天中我们发现,v1.1b 中日期格式发生了重大变化,bibtex这使得他的原始答案可能存在问题。我感谢他的帮助。

对于问题的第一部分,他的回答是:要在文内引用年份周围加上括号,请使用\textcite命令系列。

要从参考书目年份中删除括号,需要对.bbx文件进行重大修改。(我在这里以示意图的形式描述了修改过程。)实际修改最好是单独.bbx文件的一部分。

biblatex文件包含以下代码来格式化各种日期字段。(这只是 5 个这样authoryear.bbx的代码块之一:\bbx@opt@mergedate@maximum、、和。)compactbasicminimumfalse

\def\bbx@opt@mergedate@basic{%
  \renewbibmacro*{date+extrayear}{%
    \iffieldundef{year}
      {}
      {\printtext[parens]{%
     \printfield{labelyear}%
     \printfield{extrayear}}}}%
  \renewbibmacro*{date}{%
    \iffieldundef{month}
      {}
      {\printdate}}%
  \renewbibmacro*{issue+date}{%
    \ifboolexpr{
      test {\iffieldundef{issue}}
      and
      test {\iffieldundef{month}}
    }
      {}
      {\printtext[parens]{%
     \printfield{issue}%
     \setunit*{\addspace}%
     \printdate}}%
    \newunit}%
}

格式化年份字段的代码的相关部分是:

  \renewbibmacro*{date+extrayear}{%
    \iffieldundef{year}
      {}
      {\printtext[parens]{%
     \printfield{labelyear}%
     \printfield{extrayear}}}}

请注意,这两个\printfield命令包含在一个\printtext[parens]命令中。这是需要更改的命令。因此,我们重新定义它而不使用格式[parens],另外我们添加标点符号和空格(将出现在作者姓名后面)。这是必要的,因为在没有括号括住年份的样式中,作者和年份都需要加标点。

所以重新定义的代码是:

  \renewbibmacro*{date+extrayear}{%
    \iffieldundef{year}
      {}
      {\printtext{%
     \addperiod\space\printfield{labelyear}%
     \printfield{extrayear}}}}

每个\bbx@opt@mergedate@...命令都需要进行相同的更改。

为了使这些更改生效,该.bbx文件还必须包含以下行:

\ExecuteBibliographyOptions{labelyear,sorting=nyt,pagetracker,mergedate}

.bbx此外,当年份为非数字时,需要将以下内容添加到文件以正确格式化额外的年份字段。(基于 lockstep 对此问题的回答:如何在 biblatex 中格式化 extrayear 字段

\DeclareFieldFormat{extrayear}{%
  \iffieldnums{labelyear}{%
    \mknumalph{#1}%
  }{%
    \mkbibparens{\mknumalph{#1}}%
  }%
}

如果这种改变不需要如此低级的编程,而可以由用户选择,那就太好了。但目前这似乎是实现它的最佳方式。

答案4

如果仅在年份周围使用括号,则还有一种更简单的方法,即重新定义括号标点符号。例如,如果您希望用逗号而不是括号括起年份,则可以这样做:

\renewcommand{\bibopenparen}{\addcomma\addspace}
\renewcommand{\bibcloseparen}{\addcomma\addspace}

但请注意,如果参考书目和/或引文中有其他括号,这可能会造成混乱。

相关内容