我希望 Biblatex 中的文章标题采用句子大小写(第一个单词大写,其余小写,用 {} 覆盖),这是 Bibtex 中的默认设置。
我试过:
\DeclareFieldFormat{titlecase}{\MakeSentenceCase{#1}}
然而,它也会将其他字段转换为句子大小写,例如 booktile:
[Pai99] P Paillier. “ Public-key cryptosystems based on composite degree residuosity classes”. Eurocrypt. 1999
我想要:
[Pai99] P Paillier. “ Public-key cryptosystems based on composite degree residuosity classes”. EUROCRYPT. 1999
(假设 .bib 文件中的 booktitle 是 EUROCRYPT)
除了在每个书名条目中添加 {} 之外,还有其他方法可以做到这一点吗?
答案1
格式定义
\DeclareFieldFormat{titlecase}{\MakeSentenceCase{#1}}
使全部句子大小写的标题,这不是您想要的。需要根据条目和字段类型打印标题。例如,对于字段,title
我们需要以不同的方式处理@article
和@book
条目。对于@inproceedings
条目,我们需要以不同的方式处理title
和booktitle
字段。
为此,我们可以重新定义title
bibmacro 以在句子大小写中打印title
字段@article
和任何@in*
条目类型。采用在中找到的原始定义biblatex.def
:
\DeclareFieldFormat{sentencecase}{\MakeSentenceCase{#1}}
\renewbibmacro*{title}{%
\ifthenelse{\iffieldundef{title}\AND\iffieldundef{subtitle}}
{}
{\ifthenelse{\ifentrytype{article}\OR\ifentrytype{inbook}%
\OR\ifentrytype{incollection}\OR\ifentrytype{inproceedings}%
\OR\ifentrytype{inreference}}
{\printtext[title]{%
\printfield[sentencecase]{title}%
\setunit{\subtitlepunct}%
\printfield[sentencecase]{subtitle}}}%
{\printtext[title]{%
\printfield[titlecase]{title}%
\setunit{\subtitlepunct}%
\printfield[titlecase]{subtitle}}}%
\newunit}%
\printfield{titleaddon}}
或者,我们可以直接识别类似书籍的条目,并将句子大小写应用于其他所有内容。这比较棘手,因为更多类型符合类似书籍的参考条件,并且这些来源的标题由多个宏打印。其中包括:、、、和biblatex.def
。title
为了避免重新定义所有这些,您可以重新定义格式。booktitle
maintitle
journal
periodical
issue
titlecase
\DeclareFieldFormat{titlecase}{\MakeTitleCase{#1}}
\newrobustcmd{\MakeTitleCase}[1]{%
\ifthenelse{\ifcurrentfield{booktitle}\OR\ifcurrentfield{booksubtitle}%
\OR\ifcurrentfield{maintitle}\OR\ifcurrentfield{mainsubtitle}%
\OR\ifcurrentfield{journaltitle}\OR\ifcurrentfield{journalsubtitle}%
\OR\ifcurrentfield{issuetitle}\OR\ifcurrentfield{issuesubtitle}%
\OR\ifentrytype{book}\OR\ifentrytype{mvbook}\OR\ifentrytype{bookinbook}%
\OR\ifentrytype{booklet}\OR\ifentrytype{suppbook}%
\OR\ifentrytype{collection}\OR\ifentrytype{mvcollection}%
\OR\ifentrytype{suppcollection}\OR\ifentrytype{manual}%
\OR\ifentrytype{periodical}\OR\ifentrytype{suppperiodical}%
\OR\ifentrytype{proceedings}\OR\ifentrytype{mvproceedings}%
\OR\ifentrytype{reference}\OR\ifentrytype{mvreference}%
\OR\ifentrytype{report}\OR\ifentrytype{thesis}}
{#1}
{\MakeSentenceCase{#1}}}
编辑经过@moewe:请注意,
biblatex
文档建议使用星号格式\MakeSentenceCase*
而不是\MakeSentenceCase
。带星号的宏会考虑条目的语言(如字段中所示langid
,或假设当前语言),并且仅在适当的地方应用句子大小写(默认情况下仅适用于英语出版物)。
答案2
biblatex-ext
引入了新的字段格式,以便更好地控制标题大小写。标准biblatex
格式titlecase
适用于所有标题类字段,biblatex-ext
而
titlecase:title
titlecase:booktitle
titlecase:maintitle
titlecase:maintitle
titlecase:journaltitle
titlecase:issuetitle
仅适用于其名称中的特定字段。通常,这些字段格式可以根据类型定义。请参阅第 21-22 页biblatex-ext
文档。(当然biblatex-ext
还是支持标准titlecase
格式。)
如果你只想要标题用句子大小写引号括起来的条目标题,则使用
\documentclass[british]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{babel}
\usepackage{csquotes}
\usepackage[style=ext-authoryear, backend=biber]{biblatex}
\DeclareFieldFormat
[article,inbook,incollection,inproceedings,patent,thesis,unpublished]
{titlecase:title}{\MakeSentenceCase*{#1}}
\addbibresource{biblatex-examples.bib}
\begin{document}
\nocite{springer,weinberg,doody,maron,pines}
\printbibliography
\end{document}