[Tex/LaTex] How to get BibLaTeX-chicago use title case capitalization

biblatexcapitalizationchicago-style

According to the 16th version of the Chicago Manual of Style, titles in the reference list are now supposed to be capitalized in title case style rather than sentence casing. Yet, as far as I understand, BibLaTeX-chicago (0.9.9b) does not seem to make any automatic changes to the capitalization of .bib-entries.

Is there any way (except for doing it manually for each entry, of course) to get BibLaTeX-chicago use title case capitalization for the entry field title in all entry-types (regardless of how the title is formatted in the .bib-field) ?

Here's a MEW:

\documentclass[12pt, a4paper]{article}
\usepackage[authordate,strict,backend=biber, cmsdate=old]{biblatex-chicago}
\begin{filecontents}{bibsample2.bib}
@BOOK{Smith2003,
 title = {This is the book title},
 publisher = {Penguin},
 year = {2003},
 author = {Smith, James},
 address = {London},
    }
@ARTICLE{Doe1970,
 author = {Doe, John J.},
 title = {this is the article title},
 journal = {Great Journal},
 year = {1970},
 volume = {40},
 pages = {207-234},
}
\end{filecontents}
\addbibresource{bibsample2.bib}
\begin{document}
\autocite{Smith2003}
\autocite{Doe1970}
\printbibliography
\end{document}

So, what I'm looking for is for these titles to be spelled as

This is the Book Title

This is the Article Title

in the output.

I'm using the latest version of BibLaTeX (2.5), Biber (1.5) and BibLaTeX-chicago (0.9.9b).

Any pointers are greatly appreciated..

Best Answer

Any automatic solution will have a hard time beating a human well-versed in the Chicago Manual of Style's headline-style capitalization rules. So you're probably better off formatting titles in your source file manually. Whenever the document language or bibliography format calls for sentence-style capitalization, it is relatively easy to apply with biblatex's \MakeSentenceCase macro.

That said you could write a new macro, say \MakeHeadlineCase, and apply it in the title formatting directives. Another approach is to use biber's sourcemap option. It supports regular expressions and modifies fields before biblatex even sees them, which means the solution is entirely style-independent.

A rough approximation to headline-style capitalization is implemented in the following source mapping. It uses the XML syntax of the biber configuration file biber.conf. You can also specify source mappings in the document preamble with biblatex's \DeclareSourcemap command.

<?xml version="1.0" encoding="UTF-8"?>
<config>
<sourcemap>
  <maps datatype="bibtex" map_overwrite="1">
  <map>
    <map_step map_field_source="TITLE"
              map_match="(^|\s)(\w+\S*w*)" map_replace="$1\u\L$2"/>
    <map_step map_field_source="TITLE"
              map_match="\-(\w+)" map_replace="\-\u\L$1"/>
    <map_step map_field_source="TITLE"
              map_match="(\s+|\-)(A(|n|nd|s|t)|F(or|rom)|I(n|s)|O(f|n|r)|T(he|o)|With)\b"
              map_replace="$1\L$2"/>
    <map_step map_field_source="TITLE"
              map_match="([:;]\s+)([a-z])" map_replace="$1\u$2"/>
  </map>
  </maps>
</sourcemap>
</config>

The first two steps capitalize words at the beginning of the string (^), after whitespace (\s) or following a hyphen (\-). The third map down-cases selected words after whitespace or a hyphen. The last map capitalizes words following a colon or semi-colon ([:;]).

Here's a self-contained example.

\documentclass{article}
\usepackage[backend=biber]{biblatex}
\usepackage{filecontents}

\begin{filecontents*}{biber.conf}
<?xml version="1.0" encoding="UTF-8"?>
<config>
<sourcemap>
  <maps datatype="bibtex" map_overwrite="1">
  <map>
    <map_step map_field_source="TITLE"
              map_match="(^|\s)(\w+\S*w*)" map_replace="$1\u\L$2"/>
    <map_step map_field_source="TITLE"
              map_match="\-(\w+)" map_replace="\-\u\L$1"/>
    <map_step map_field_source="TITLE"
              map_match="(\s+|\-)(A(|n|nd|s|t)|B(ut|y)|F(or|rom)|I(n|s)|O(f|n|r)|T(he|o)|With)\b"
              map_replace="$1\L$2"/>
    <map_step map_field_source="TITLE"
              map_match="([:;]\s+)([a-z])" map_replace="$1\u$2"/>
  </map>
  </maps>
</sourcemap>
</config>
\end{filecontents*}

\begin{filecontents*}{\jobname.bib}
@BOOK{Smith2003,
  title = {This is an off-the-hook book title, but it doesn't have a subtitle},
  publisher = {Penguin},
  year = {2003},
  author = {Smith, James},
  address = {London}}
@ARTICLE{Doe1970,
  author = {H{\"a}user, {\O}rnulf},
  title = {{\O}rnulf H{\"a}user's letter to the editor: an $\alpha$-to-$\omega$
           summary of $\epsilon$--improvement},
  journal = {Great Journal},
  year = {1970},
  volume = {40},
  pages = {207-234}}
\end{filecontents*}
\addbibresource{\jobname.bib}

\begin{document}
\nocite{*}
\printbibliography
\end{document}

enter image description here

Related Question