我所在学院的书目指示要求将系列和编号放在参考文献的末尾,放在括号中,第一个括号前没有逗号(这是最难的部分)。我已经设法通过重新定义书籍驱动程序将系列和编号放在参考文献的末尾standard.bbx
,但我无法将它们放在括号中和删除第一个括号前的逗号。
换句话说...
- MWE 给出的答案是:CHAUCER Geoffrey,书名,第二版,伦敦:Scrooge Editions,2020 年,第 124 册。
- 我想要这个:乔瑟·杰弗里,书名,第二版,伦敦:Scrooge Editions,2020 年(收藏 124)。→ 括号,2020 后没有逗号
这是 MWE(我使用 xelatex 编译):
\documentclass{article}
\usepackage[style=verbose-trad3]{biblatex}
\usepackage[french]{babel}
\begin{filecontents}{bibdata.bib}
@book{livre,
author = {Geoffrey Chaucer},
title = {The book title},
edition = {2nd édition},
location = {London},
publisher = {Scrooge Editions},
year = {2020},
series = {Collection},
number = {124}
}
\end{filecontents}
\addbibresource{bibdata.bib}
\renewcommand{\newunitpunct}[0]{\addcomma\addspace}
\renewcommand{\revsdnamepunct}{\addspace}
\renewcommand{\subtitlepunct}[0]{\adddot\addspace}
\DeclareNameAlias{labelname}{family-given}
\DeclareNameAlias{sortname}{family-given}
\DeclareNameAlias{default}{family-given}
\DeclareBibliographyDriver{book}{%
\usebibmacro{bibindex}%
\usebibmacro{begentry}%
\usebibmacro{author/editor+others/translator+others}%
\setunit{\printdelim{nametitledelim}}\newblock
\usebibmacro{maintitle+title}%
\newunit
\printlist{language}%
\newunit\newblock
\usebibmacro{byauthor}%
\newunit\newblock
\usebibmacro{byeditor+others}%
\newunit\newblock
\printfield{edition}%
\newunit
\iffieldundef{maintitle}
{\printfield{volume}%
\printfield{part}}
{}%
\newunit
\printfield{volumes}%
\newunit\newblock
\usebibmacro{publisher+location+date}% I inteverted "publisher+location+date" and "series+number"
\newunit\newblock
\printfield{note}%
\newunit\newblock
\usebibmacro{series+number}%
\newunit\newblock
\usebibmacro{chapter+pages}%
\newunit
\printfield{pagetotal}%
\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}}
\begin{document}
Filling text\autocite{livre}
\end{document}
有人知道怎么做吗?我不是 LaTeX 专家,我刚开始了解 biblatex 宏的工作原理,所以如果你使用新命令,请向我解释它的作用。
答案1
要同时使用括号括住多个字段(例如系列和数字)您可以使用\printtext[parens]{...}
,但是我们需要避免在没有系列的情况下打印一对空的括号(我假设number
只能与一起出现series
),所以我们需要检查如果没有,series
并且\iffieldundef{series}
在这种情况下不执行任何操作。
\renewbibmacro*{series+number}{%
\iffieldundef{series}
{}
{\printtext[parens]{%
\printfield{series}%
\setunit*{\addspace}%
\printfield{number}}%
\newunit}}
该宏的默认定义可以在以下位置找到standard.bbx
(版本 3.14 中第 853-857 行)。
如果您想要检查series
和,因为您可以有一个包含空字段和非空字段number
的条目,因此通常会使用来组合两个测试。当在 中使用测试时,它们被包裹在一对花括号中并以关键字 为前缀。在里面,您可以使用逻辑运算符,并且可以使用括号进行分组。series
number
etoolbox
\ifboolexpr
\ifboolexpr
test
\ifboolexpr
and
or
not
\renewbibmacro*{series+number}{%
\ifboolexpr{ test {\iffieldundef{series}}
and test {\iffieldundef{number}}}
{}
{\printtext[parens]{%
\printfield{series}%
\setunit*{\addspace}%
\printfield{number}}%
\newunit}}
然后,只需重新排序参考书目驱动程序中的宏调用即可。最佳顺序取决于您想要的确切输出,如果您的条目有更多字段(note
,,,...),我选择的位置与 MWE 中的位置略有不同,但这只是我的直觉。isbn
pages
请注意,可能需要对@collection
、@proceedings
、@inbook
和驱动程序(也可能包括和)执行类似的操作。@incollection
@inproceedings
@manual
@dataset
为了在包含系列和数字的括号前只获得一个空格,我们将\newunit\newblock
其前面的替换为\setunit{\addspace}
。\newunit\newblock
插入标点符号\newunitpunct
和块标记(根据选项的设置,可能会或可能不会执行某些操作block
),\setunit{\addspace}
只打印一个空格。
\documentclass{article}
\usepackage[french]{babel}
\usepackage{csquotes}
\usepackage[style=verbose-trad3]{biblatex}
\renewcommand{\newunitpunct}{\addcomma\space}
\renewcommand{\subtitlepunct}{\addperiod\space}
\renewcommand{\revsdnamepunct}{}
\DeclareNameAlias{default}{family-given}
\DeclareNameAlias{labelname}{default}
\DeclareNameAlias{sortname}{default}
\renewbibmacro*{series+number}{%
\iffieldundef{series}
{}
{\printtext[parens]{%
\printfield{series}%
\setunit*{\addspace}%
\printfield{number}}%
\newunit}}
\DeclareBibliographyDriver{book}{%
\usebibmacro{bibindex}%
\usebibmacro{begentry}%
\usebibmacro{author/editor+others/translator+others}%
\setunit{\printdelim{nametitledelim}}\newblock
\usebibmacro{maintitle+title}%
\newunit
\printlist{language}%
\newunit\newblock
\usebibmacro{byauthor}%
\newunit\newblock
\usebibmacro{byeditor+others}%
\newunit\newblock
\printfield{edition}%
\newunit
\iffieldundef{maintitle}
{\printfield{volume}%
\printfield{part}}
{}%
\newunit
\printfield{volumes}%
\newunit\newblock
\printfield{note}%
\newunit\newblock
\usebibmacro{publisher+location+date}%
\setunit{\addspace}%
\usebibmacro{series+number}%
\newunit\newblock
\usebibmacro{chapter+pages}%
\newunit
\printfield{pagetotal}%
\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}}
\begin{filecontents}{\jobname.bib}
@book{livre,
author = {Geoffrey Chaucer},
title = {The Book Title},
edition = {2},
location = {London},
publisher = {Scrooge Editions},
year = {2020},
series = {Collection},
number = {124},
}
\end{filecontents}
\addbibresource{\jobname.bib}
\begin{document}
Filling text\autocite{livre}
\end{document}
请注意,我替换了你的
\renewcommand{\newunitpunct}[0]{\addcomma\addspace}
\renewcommand{\revsdnamepunct}{\addspace}
\renewcommand{\subtitlepunct}[0]{\adddot\addspace}
和
\renewcommand{\newunitpunct}{\addcomma\space}
\renewcommand{\subtitlepunct}{\addperiod\space}
\renewcommand{\revsdnamepunct}{}
如果您已经使用了一个\add...
命令,则下面的命令\addspace
可以替换为\space
。\addspace
只是在这里进行了一些额外的处理,这是不必要的,因为前一个\add...
命令已经完成了。通常的biblatex
习惯用法是 therefore\addcomma\space
而不是\addcomma\addspace
。
\adddot
插入缩写点(即缩写中的点,如“ie”),而\addperiod
插入句末句号/句号。通常\addperiod
是字段之间的标点符号。\adddot
仅缩写需要。两者之间的一个显著区别是biblatex
之后大写\addperiod
,但 之后不大写\adddot
。
\revsdnamepunct
不需要产生空格,因为空格已隐含在通过 的名称格式中。这可以从以下事实中看出:来自 的\bibnamedelimd
默认定义也不会插入空格。\newcommand*{\revsdnamepunct}{\addcomma}
biblatex.def
我还放弃了,[0]
因为我认为它只会在这里增加噪音。
至于名称格式,我认为顺序
\DeclareNameAlias{default}{family-given}
\DeclareNameAlias{labelname}{default}
\DeclareNameAlias{sortname}{default}
我使用的稍微自然一些。但它会产生与您的定义完全相同的结果。