标准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+extrayear
bibmacro,但是如果切换到不包含此特定宏的样式,则会导致错误。)
编辑: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
、、和。)compact
basic
minimum
false
\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}
但请注意,如果参考书目和/或引文中有其他括号,这可能会造成混乱。