我需要我的脚注和参考书目条目具有特定的外观。我快完成了,但我对编辑过的书籍/合集的编辑的外观感到困惑。目前,它在脚注中看起来像这样:
Brian Smith,《如何做到》知识大书,托尼·莱利 (Tony Riley) 编辑(牛津:牛津大学出版社,2012 年),第 12-34 页。
参考书目如下:
布莱恩·史密斯,《如何做到这一点》知识大书,托尼·莱利 (Tony Riley) 编辑(牛津:牛津大学出版社,2012 年),第 12-34 页。
我需要读的是:
Smith,Brian,《如何做到》摘自 Tony Riley 主编,知识大书(牛津:牛津大学出版社,2012 年),第 12-34 页。
那么,我该如何调整冗长的风格,使其读作“...Tony Riley(编辑)”而不是“由Tony Riley编辑”?
此外,编辑位于“in”之后,即书名之前。(“在 Tony Riley 编辑的书中),知识大书”而不是“在知识大书(由托尼·莱利编辑)?
PS:这是我的小例子:
\documentclass[paper=a4,fontsize=12pt]{scrartcl}
\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
@incollection{Smith2012,
Address = {Oxford},
Author = {Brian Smith},
Booktitle = {Big Book of Knowledge},
Editor = {Tony Riley},
Pages = {12-34},
Publisher = {Oxford University Press},
Title = {How to do it},
Year = {2012}}
\end{filecontents}
\usepackage[style=verbose-trad3,
natbib=true,
sortcites=true,
block=space,
isbn=false,
url=false,
doi=false,
dashed=false,
dateabbrev=false,
backend=biber,
bibencoding=utf8,
]{biblatex}
\renewcommand{\footcite}{\cite}
\usepackage[ngerman,british]{babel}
\usepackage[applemac]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[style=english,english=british]{csquotes}
\renewcommand*{\cite}{\autocite}
\renewcommand*{\newunitpunct}{\addcomma\space}
\usepackage{biblatex}
\renewbibmacro{in:}{%
\ifentrytype{article}{space}{%
\nopunct
\printtext{\bibstring{in}\nopunct\addspace}}}
\renewbibmacro*{publisher+location+date}{%
\nopunct% ADDED
\printtext[parens]{% ADDED
\printlist{location}%
\iflistundef{publisher}
{\setunit*{\addcomma\space}}
{\setunit*{\addcolon\space}}%
\printlist{publisher}%
\setunit*{\addcomma\space}%
\usebibmacro{date}%
}
\newunit}
\addbibresource{\jobname.bib}
\begin{document}
This is an example sentence.\cite{Smith2012}
\printbibliography
\end{document}
答案1
首先,编译您的文档时我收到一个错误:
! Package biblatex Error: 'backend' is load-time only option.
您应该转到backend=biber, bibencoding=utf8,
包选项。
incollection
要交换编辑器和书名的外观,您必须更改、等的定义inbook
。这应该不太难,您可以在文件中找到它们biblatex.def
。
然后,您需要重新定义 bibmacrobyeditor+others
以获得类似“John Doe (ed.)”的内容。以下重新定义 bibmacro 的代码byeditor+others
适用于您的示例,但您可能会遇到其他编辑器类型的一些问题:
\documentclass[paper=a4,fontsize=12pt]{scrartcl}
\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
@incollection{Smith2012,
Address = {Oxford},
Author = {Brian Smith},
Booktitle = {Big Book of Knowledge},
Editor = {Tony Riley},
Pages = {12-34},
Publisher = {Oxford University Press},
Title = {How to do it},
Year = {2012}}
\end{filecontents}
\usepackage[style=verbose-trad3,
natbib=true,
sortcites=true,
block=space,
isbn=false,
url=false,
doi=false,
dashed=false,
dateabbrev=false,
backend=biber,
bibencoding=utf8,
]{biblatex}
\renewcommand{\footcite}{\cite}
\usepackage[ngerman,british]{babel}
\usepackage[applemac]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[style=english,english=british]{csquotes}
\renewcommand*{\cite}{\autocite}
\renewcommand*{\newunitpunct}{\addcomma\space}
\usepackage{biblatex}
\renewbibmacro{in:}{%
\ifentrytype{article}{space}{%
\nopunct
\printtext{\bibstring{in}\nopunct\addspace}}}
\renewbibmacro*{publisher+location+date}{%
\nopunct% ADDED
\printtext[parens]{% ADDED
\printlist{location}%
\iflistundef{publisher}
{\setunit*{\addcomma\space}}
{\setunit*{\addcolon\space}}%
\printlist{publisher}%
\setunit*{\addcomma\space}%
\usebibmacro{date}%
}
\newunit}
\renewbibmacro*{byeditor+others}{%
\ifnameundef{editor}
{}
{\ifnamesequal{author}{editor}
{\bibnamedash}
{\printnames{editor}}%
\addspace
\mkbibparens{\usebibmacro{editorstrg}}%
\clearname{editor}}
{}}
\addbibresource{\jobname.bib}
\begin{document}
This is an example sentence.\cite{Smith2012}
\printbibliography
\end{document}
答案2
关于从“ed. by”到“(ed.)”的更改。自从发布接受的答案以来,这一点已经发生了变化。这变得非常混乱,但这是我到目前为止收集到的信息。顺便说一句,我强烈建议将这些内容放在您的主目录中,并且不要更改已安装的任何内容。这些文件的位置是 ~/texmf/tex/latex/biblatex。
总体目标是将 biblatex 使用的字符串“ed. by”替换为您想要的任何内容。然后将该文本放在编辑器后面并放在括号中。听起来很简单,对吧?这是 TLDR; 版本。
您需要将其放在序言中,以使 (ed.) 位于编辑之后。 \renewcommand*{\intitlepunct}{\space} 位将用 in 替换 in:。
\renewcommand*{\intitlepunct}{\space}
\renewbibmacro*{byeditor+others}{%
\ifnameundef{editor}
{}
{%\setunit{\addspace}%
\printnames[byeditor]{editor}%
\clearname{editor}%
\setunit{\addspace}%
\usebibmacro{byeditor+othersstrg}%
\newunit}%
\usebibmacro{byeditorx}%
\usebibmacro{bytranslator+others}}
\DefineBibliographyStrings{english}{%
byeditor = {ed\adddot}
}
还将 incollection 的驱动程序更改为以下内容。我相信这正是 OP 所追求的格式,但更改起来相当简单。(在本例中,authoryear-comp.bbx 位于但称为 standard.bbx)
\DeclareBibliographyDriver{incollection}{%
\usebibmacro{bibindex}%
\usebibmacro{begentry}%
\usebibmacro{author/translator+others}%
\setunit{\labelnamepunct}\newblock
\usebibmacro{title}%
\newunit
\printlist{language}%
\newunit\newblock
\usebibmacro{byauthor}%
\newunit\newblock
\usebibmacro{in:}%
\usebibmacro{byeditor+others}%
\newunit\newblock
\usebibmacro{maintitle+booktitle}%
\newunit\newblock
\usebibmacro{chapter+pages}%
\newunit\newblock
\printfield{edition}%
\newunit
\iffieldundef{maintitle}
{\printfield{volume}%
\printfield{part}}
{}%
\newunit
\printfield{volumes}%
\newunit\newblock
\usebibmacro{series+number}%
\newunit\newblock
\printfield{note}%
\newunit\newblock
\usebibmacro{publisher+location+date}%
\newunit\newblock
\iftoggle{bbx:isbn}
{\printfield{isbn}}
{}%
\newunit\newblock
\usebibmacro{doi+eprint+url}%
\newunit\newblock
\usebibmacro{addendum+pubstate}%
\setunit{\bibpagerefpunct}\newblock
\usebibmacro{pageref}%
\newunit\newblock
\iftoggle{bbx:related}
{\usebibmacro{related:init}%
\usebibmacro{related}}
{}%
\usebibmacro{finentry}}
下面是 TL 版本,但这正是正在发生的事情,也是为什么答案实际上比我迄今为止在互联网上找到的几乎所有其他答案都简单得多的原因。这是“biblatex 更改“ed. by””的第一个网站点击量,因此它得到了我的答案。
首先,我们需要弄清楚生成参考文献时发生了什么。我使用样式“authoryear-comp”,它具有关联的 bbx(参考文献部分中使用的样式)和 cbx(文本部分中使用的样式)。我需要将参考文献部分中的“ed.by”更改为 (ed.)。这意味着对 authoryear-comp.bbx 进行编辑。但除了导入 standard.bbx 文件外,什么也没有,所以我们改为转到那里。事实证明,我的参考文献是书中编辑的一章,显然是 incollection 类型。仍然不知道为什么。也不重要。在 standard.bbx 中搜索
\DeclareBibliographyDriver{incollection}{%
您将在这里更改参考文献的输出格式。如果您仔细查看,会发现没有明显的位置可以更改“ed. by”,但这里有一些代码块看起来很有希望:
\usebibmacro{byeditor+others}%
\newunit\newblock
现在我要做的就是找到 byeditor+others 的定义位置并编辑该宏以获得所需的输出。此宏(与几乎所有广泛使用的宏一样)位于文件 biblatex.def 中,其中包含以下代码块:
\newbibmacro*{byeditor+others}{%
\ifnameundef{editor}
{}
{\usebibmacro{byeditor+othersstrg}%
\setunit{\addspace}%
\printnames[byeditor]{editor}%
\clearname{editor}%
\newunit}%
\usebibmacro{byeditorx}%
\usebibmacro{bytranslator+others}}
经过仔细检查,当编辑器字段被定义时,它实际上只是调用 byeditor+othersstrg(确实如此,否则我为什么要费心写这些呢?)。
搜索 byeditor+othersstrg 得到以下结果:
\newbibmacro*{byeditor+othersstrg}{%
\iffieldundef{editortype}
{\def\abx@tempa{byeditor}}
{\edef\abx@tempa{by\thefield{editortype}}}%
\let\abx@tempb=\empty
\ifnamesequal{editor}{translator}
{\appto\abx@tempa{tr}%
\appto\abx@tempb{\clearname{translator}}}
{}%
\ifnamesequal{editor}{commentator}
{\appto\abx@tempa{co}%
\appto\abx@tempb{\clearname{commentator}}}
{\ifnamesequal{editor}{annotator}
{\appto\abx@tempa{an}%
\appto\abx@tempb{\clearname{annotator}}}
{}}%
\ifnamesequal{editor}{introduction}
{\appto\abx@tempa{in}%
\appto\abx@tempb{\clearname{introduction}}}
{\ifnamesequal{editor}{foreword}
{\appto\abx@tempa{fo}%
\appto\abx@tempb{\clearname{foreword}}}
{\ifnamesequal{editor}{afterword}
{\appto\abx@tempa{af}%
\appto\abx@tempb{\clearname{afterword}}}
{}}}%
\ifbibxstring{\abx@tempa}
{\printtext{\bibstring{\abx@tempa}}\abx@tempb}
{\usebibmacro{bytypestrg}{editor}{editor}}}
如果您不熟悉 latex 脚本并且不精通编码,那么它看起来就像是一堵巨大的无用文本墙。顺便说一句,作为一名专业程序员,这些都没有在代码中记录下来,这至少令人沮丧。为了测试一下发生了什么,我将倒数第二行从
\printtext{\bibstring{\abx@tempa}}\abx@tempb
到
\printtext[bold]{\bibstring{\abx@tempa}}\abx@tempb
只将“ed. by”加粗。因此输出“ed. by”的字符串只能是 \bibstring{\abx@tempa}。现在,正如手册第 202 页所示(我相信我们都有时间阅读几百页的优秀文档,它很棒但非常长),我们发现 bibstring 定义为 \bibstring[wrapper]{key}。这意味着 \abx@tempa 在某种程度上是一个字符串,事实也确实如此。对我来说,“editortype”字段未定义,这意味着变量 \abx@tempa 变为 \def\abx@tempa{byeditor} 或用普通的话来说:
\abx@tempa = "byeditor"
不要被调用相同内容的宏所欺骗。我相信这是已弃用的代码,但我没有理由这么认为。这意味着在某个地方,不知何故 \abx@tempa 本质上是一个字典值,而结果字符串是“ed. by”,由 \bibstring 返回。
魔法就在这里。此字符串在本地文件 *.lbx 中定义。这是所有基于语言的本地字符串的定义。由于我的措辞比较随意,应该很明显我是美国人,所以我转到 american.lbx 发现它实际上只是调用 english.lbx。搜索 byeditor 会让我找到第 240 行,内容如下:
byeditor = {{edited by}{ed\adddotspace by}},
biblatex 手册第 204 页也介绍了 byeditor。手册继续解释道,所有这些值都是由 \DeclareBibliographyStrings 设置的,而这正是需要覆盖的。现在,多亏了我可以将 biblatex 样式修改放在哪里?我可以告诉你,byeditor 可以在你的序言中重新定义。这让我想到了 TLDR 标记上方发布的答案。将此代码块放在你的序言中。
\DefineBibliographyStrings{english}{%
byeditor = {ed\adddot}
}
值得庆幸的是,\adddot 确实如您所想的那样。不要添加尾随空格,也不要使用 \adddotspace。我认为空格已被格式化删除或已在 biblatex 框架中考虑。
这将得到“ed.”而不是“ed. by”。剩下的就很简单了。只需使用括号环境打印文本,但这是在 biblatex.def 中完成的,因此如果您想将其放在序言中,则必须更新命令。这在 TLDR 版本的代码块中。
{\printtext[parens]{\bibstring{\abx@tempa}}\abx@tempb}
而且我想把它放在编辑器后面,byeditor+others 也应该重新定义,以便它在 (ed.) 中打印出来。
这是旧宏
\newbibmacro*{byeditor+others}{%
\ifnameundef{editor}
{}
{\usebibmacro{byeditor+othersstrg}%
\setunit{\addspace}%
\printnames[byeditor]{editor}%
\clearname{editor}%
\newunit}%
\usebibmacro{byeditorx}%
\usebibmacro{bytranslator+others}}
这是新的宏:
\newbibmacro*{byeditor+others}{%
\ifnameundef{editor}
{}
{%\setunit{\addspace}%
\printnames[byeditor]{editor}%
\clearname{editor}%
\setunit{\addspace}%
\usebibmacro{byeditor+othersstrg}%
\newunit}%
\usebibmacro{byeditorx}%
\usebibmacro{bytranslator+others}}
驱动程序也需要如上所述进行更新。这将重新排列输出格式,以便按照 OP 指定的正确顺序放置 in (ed.)。