Biblatex: MakeSentenceCase funktioniert nicht

Erstellung eines Literaturverzeichnisses mit BibTeX, Biber, BibLaTeX und Co.


secretagent
Forum-Newbie
Forum-Newbie
Beiträge: 4
Registriert: So 29. Apr 2018, 09:53

Biblatex: MakeSentenceCase funktioniert nicht

Beitrag von secretagent »

Guten Tag,

für meine wissenschaftliche Arbeit will ich im Literaturverzeichnis alle Titel von Artikeln im sogenannten "Sentence Case" ausgeben lassen, d.h. das erste Wort hat einen großen Anfangsbuchstaben, alle folgenden Wörter erscheinen durchgängig in Kleinbuchstaben. In Biblatex gibt es dafür den Befehl \MakeSentenceCase.
Wenn ich diesen Befehl aber in der Präambel meines Dokumentes verwende, gibt mir Latex eine Fehlermeldung aus.

Minimalbeispiel:
\begin{filecontents}{testbib.bib} 
@Article{Arogeti2010,
  author   = {S. A. Arogeti and D. Wang and C. B. Low},
  title    = {Mode Identification of Hybrid Systems in the Presence of Fault},
  journal  = {IEEE Transactions on Industrial Electronics},
  year     = {2010},
  volume   = {57},
  number   = {4},
  month    = {April},
  pages    = {1452-1467}
}   
\end{filecontents}

\documentclass{scrbook}
\usepackage{scrlayer-scrpage}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[english]{babel}

\usepackage[backend=biber]{biblatex}
\addbibresource{testbib.bib}

\DeclareFieldFormat[article]{title}{\MakeSentenceCase{#1}}

\begin{document}
\MakeSentenceCase{This Is A Test For Sentence Case.}

\nocite{*}
\printbibliography
\end{document}
Fehlermeldung:
Zeile 30    Missing \endcsname inserted. \end
Zeile 30    Missing \endcsname inserted. \end
Außerdem wird der Befehl ignoriert, also der Titel wie in der Bib-Datei angegeben angezeigt.
Im Dokument selbst funktioniert der Befehl \MakeSentenceCase erstaunlicherweise. Es kann also nicht daran liegen, dass Latex den Befehl nicht kennt.
Ich verwende Miktex 2.9, TexStudio, pdftex, Biblatex 3.4, Biber 2.5. (Habe es aber auch schon mit Biblatex 3.7 und Biber 2.7 getestet.)

Wenn ich bei \DeclareFieldFormat das optionale Argument [article] weglasse, bekomme ich keine Fehlermeldung, aber der Sentence Case wird trotzdem ignoriert. Der Titel erscheint so, wie in der Bib-Datei angegeben.

Der Befehl \DeclareFieldFormat funktioniert nur, wenn ich anstatt "title" im entsprechenden Feld "titlecase" einfüge. Dann habe ich aber das Problem, dass nicht nur der Titel der Referenz im Sentence Case ausgegeben wird, sondern auch das Journal. (Dieses Problem wurde auch hier diskutiert: https://tex.stackexchange.com/questions ... n-biblatex;; ich verstehe aber nicht die Lösung, die dort vorgeschlagen wird.)

Könntet ihr das Minimalbeispiel mal kompilieren und gucken, ob das bei euch funktioniert oder welche Fehlermeldung bei euch erscheint? Ich wäre sehr dankbar.

Mit freundlichen Grüßen
Sebastian

PS:
Im Übrigen verstehe ich nicht, warum nicht automatisch Sentence Case für die Artikel im Literaturverzeichnis verwendet wird. In der Biblatex-Dokumentation steht nämlich folgendes:
By default, converting to sentence case is enabled for the following language identifiers:
american, british, canadian, english, australian, newzealand as well as the
aliases USenglish and UKenglish. Use \DeclareCaseLangs to extend or change this list.
Zuletzt geändert von secretagent am So 29. Apr 2018, 10:32, insgesamt 1-mal geändert.

Benutzeravatar
Johannes_B
Moderator
Moderator
Beiträge: 5079
Registriert: Do 1. Nov 2012, 14:55
Kontaktdaten:

Beitrag von Johannes_B »

Ehrlich gesagt verstehe ich dein Anliegen nicht ganz, wenn ich http://mrunix.de/forums/showthread.php? ... iert-nicht anschaue. Hast du Ulrikes Antwort und den Lösungsvorschlag gelesen?
TeXwelt - Fragen und Antworten Schaut vorbei und stellt Fragen.
LaTeX-Vorlagen?

Der Weg zum Ziel: Ruhe bewahren und durchatmen, Beiträge und unterstützende Links aufmerksam lesen, Lösungsansätze verstehen und ggf. nachfragen.

secretagent
Forum-Newbie
Forum-Newbie
Beiträge: 4
Registriert: So 29. Apr 2018, 09:53

Beitrag von secretagent »

Hallo Johannes,

ja, habe ich gelesen. Der Befehl "titlecase" hilft mir leider nicht weiter, weil dann auch der Journal-Titel im Sentence Case ausgegeben wird, d.h. es erscheint "Ieee transactions on industrial electronics". Das will ich natürlich nicht so haben.

Mein Anliegen ist, entweder von jemand anderem zu erfahren, ob das Minimalbeispiel bei ihm so funktioniert, wie es sein sollte, dann weiß ich, dass es irgendwie an meiner Latex-Konfiguration liegt.
Oder, zu erfahren, dass der Fehler ebenfalls auftritt. Dann verwende ich die Befehle vermutlich falsch.

Ich verstehe nicht, warum es nicht funktioniert, weil ich mich an die Anleitung aus der Biblatex 3.4 Dokumentation, Abschnitt 4.6.4 "Miscellaneous Commands", halte. Aber vielleicht habe ich etwas übersehen. Daher bin ich für Hinweise dankbar.

Ich stelle meine Anfrage hier, weil mir Ulrike dazu geraten hat.

Freundliche Grüße
Sebastian

Benutzeravatar
u_fischer
Forum-Meister
Forum-Meister
Beiträge: 4298
Registriert: Do 22. Nov 2012, 11:09
Kontaktdaten:

Beitrag von u_fischer »

Wenn der Journaltitle nicht geändert werden soll:

https://tex.stackexchange.com/questions ... 891#411891

Gast

Beitrag von Gast »

Ich bekomme den Fehler bei \DeclareFieldFormat[article]{title}{\MakeSentenceCase{#1}} auch mit der neusten Version von biblatex und gehe nicht davon aus, dass es eine Version gibt, in der es jemals funktioniert hat.
\DeclareFieldFormat[article]{titlecase}{\MakeSentenceCase{#1}} hingegen funktioniert prinzipiell, es macht nur nicht genau das, was Du Dir wünschst.

Um zu verstehen, wieso das so ist, sehen wir uns mal an, wie title und titlecase im Allgemeinen verwendet werden
\newbibmacro*{title}{%
  \ifboolexpr{
    test {\iffieldundef{title}}
    and
    test {\iffieldundef{subtitle}}
  }
    {}
    {\printtext[title]{%
       \printfield[titlecase]{title}%
       \setunit{\subtitlepunct}%
       \printfield[titlecase]{subtitle}}%
     \newunit}%
  \printfield{titleaddon}}
Dieser Abschnitt zeigt, dass normalerweise das Feldformat title nicht direkt auf den Feldinhalt des title-Feldes in der .bib-Datei losgelassen wird, sondern stattdessen "nachträglich" auf den ganzen Block mit den \printfield-Befehlen losgelassen wird.
Das Format titlecase hingegen bekommt den Feldinhalt unverändert kredenzt.
Das ist wichtig, da das Makro \MakeSentenceCase zu den etwas komplizierteren Makros gehört (meiner Meinung nach grenzt es fast an Schwarzmagie). Denn TeX ist nicht unbedingt für die Aufgabe prädestiniert, die es ausführt. Das führt dazu, dass dieses Makro gewissen Einschränkungen unterliegt, es ist sehr wählerisch, was seine Eingabewerte angeht.
Normaler Text wie Lorem ipsum dolor sit amet im Argument ist kein Problem, kompliziertere Konstrukte mit weiteren Makros hingegen können schwierig sein, ganz besonders, wenn die Ausgaben dieser Makros noch weiter verarbeitet werden müssen.

Im title-Format können wir \MakeSentenceCase also nicht verwenden, stattdessen gibt es titlecase.
Das Problem bei titlecase ist, dass biblatex da einen Alles-oder-Nichts-Ansatz hat: Entweder werden alle title-Artigen Felder behandelt oder keine. Das optionale Argument für den Typ hilft Dir nicht weiter, da Du hier die zwei Felder title und journaltitle unabhängig voneinander bearbeiten möchtest.

Wenn man das ordentlich machen möchte, würde ich
\renewbibmacro*{title}{%
  \ifboolexpr{
    test {\iffieldundef{title}}
    and
    test {\iffieldundef{subtitle}}
  }
    {}
    {\printtext[title]{%
       \printfield[titlecase:title]{title}%
       \setunit{\subtitlepunct}%
       \printfield[titlecase:title]{subtitle}}%
     \newunit}%
  \printfield{titleaddon}}

\renewbibmacro*{booktitle}{%
  \ifboolexpr{
    test {\iffieldundef{booktitle}}
    and
    test {\iffieldundef{booksubtitle}}
  }
    {}
    {\printtext[booktitle]{%
       \printfield[titlecase:booktitle]{booktitle}%
       \setunit{\subtitlepunct}%
       \printfield[titlecase:booktitle]{booksubtitle}}%
     \newunit}%
  \printfield{booktitleaddon}}

\renewbibmacro*{maintitle}{%
  \ifboolexpr{
    test {\iffieldundef{maintitle}}
    and
    test {\iffieldundef{mainsubtitle}}
  }
    {}
    {\printtext[maintitle]{%
       \printfield[titlecase:maintitle]{maintitle}%
       \setunit{\subtitlepunct}%
       \printfield[titlecase:maintitle]{mainsubtitle}}%
     \newunit}%
  \printfield{maintitleaddon}}

\renewbibmacro*{journal}{%
  \ifboolexpr{
    test {\iffieldundef{journaltitle}}
    and
    test {\iffieldundef{journalsubtitle}}
  }
    {}
    {\printtext[journaltitle]{%
       \printfield[titlecase:journaltitle]{journaltitle}%
       \setunit{\subtitlepunct}%
       \printfield[titlecase:journaltitle]{journalsubtitle}}}}

\renewbibmacro*{periodical}{%
  \ifboolexpr{
    test {\iffieldundef{title}}
    and
    test {\iffieldundef{subtitle}}
  }
    {}
    {\printtext[title]{%
       \printfield[titlecase:title]{title}%
       \setunit{\subtitlepunct}%
       \printfield[titlecase:title]{subtitle}}}}

\renewbibmacro*{issue}{%
  \ifboolexpr{
    test {\iffieldundef{issuetitle}}
    and
    test {\iffieldundef{issuesubtitle}}
  }
    {}
    {\printtext[issuetitle]{%
       \printfield[titlecase:issuetitle]{issuetitle}%
       \setunit{\subtitlepunct}%
       \printfield[titlecase:issuetitle]{issuesubtitle}}}}
empfehlen. Dann ist die Einstellung von titlecase für jedes title-artige Feld separat geregelt.
Du möchtest dann nur \DeclareFieldFormat{title}{\MakeSentenceCase*{#1}}.

Man beachte den Stern, denn \MakeSentenceCase* ist der Variante ohne Stern vorzuziehen.
Die gesternte Variante hört nämlich auf die Spracheinstellung, während die ungesternte und ungestüme Variante den Sentence Case auch bei Sprachen einsetzt, die damit nichts anfangen können.
Darauf bezieht sich auch die von Dir zitierte Stelle in der Dokuementation.
Das "y default, converting to sentence case is enabled for the following language identifiers" bedeutet dabei nicht, dass die Konversion automatisch stattfindet, es bedeutet lediglich, dass sie (nur) für diese Sprachen zur Anwendung kommt, wenn sie denn mit \MakeSentenceCase* angefordert wird. Die Stelle ist vielleicht etwas verwirrend, wenn sie aus dem Zusammenhang gerissen wird; wenn man den Satz im Kontext der Fußnote liest, in der er steht, impliziert er nicht mehr wirklich, dass die Case Conversion überall stattfindet. Mir fällt leider gerade keine klarere Formulierung ein, Verbesserungsvorschläge sind aber immer gerne gesehen: https://github.com/plk/biblatex/issues

Gast

Beitrag von Gast »

Meine Güte, ich bin ein Lappen:
Du möchtest dann natürlich
\DeclareFieldFormat{titlecase:issuetitle}{\MakeSentenceCase*{#1}}
und nicht \DeclareFieldFormat{title}{\MakeSentenceCase*{#1}}.

Eine fast gute Lösung wäre übrigens \DeclareFieldFormat{titlecase}{\ifcurrentfield{title}{\MakeSentenceCase*{#1}}{#1}}. Es wird dem Leser als Aufgabe überlassen, ein Problem damit zu finden (Tipp: man nutze subtitle) und eine verbesserte Lösung zu finden.

secretagent
Forum-Newbie
Forum-Newbie
Beiträge: 4
Registriert: So 29. Apr 2018, 09:53

Beitrag von secretagent »

@Ulrike: Danke für den Link. Für das Minimalbeispiel von oben funktioniert das soweit. Leider habe ich auch Einträge der Kategorien InProceedings, InBook, InCollection in meinem Literaturverzeichnis. Da gibt es jeweils ein 'booktitle' Feld, für das das verlinkte Makro angepasst werden müsste.

@Gast: Vielen herzlichen Dank!!! You made my day!
Ich hatte gehofft, dass Biblatex meinen Use Case nativ, d.h. ohne zusätzliche Makros, unterstützt. An die Programmierung eines Makros habe ich mich nicht herangetraut. Jetzt funktioniert, soweit ich das erkennen kann, alles wie es soll. (Bei über 200 Referenzen sieht man nicht gleich jedes Problem auf den ersten Blick.)

Leider wird das Schlüsselwort 'titlecase' nirgendwo in der Biblatex Dokumentation erwähnt, deshalb war mir die Verwendung unklar.

Mein funktionierendes Minimalbeispiel sieht nun folgendermaßen aus:
\begin{filecontents}{testbib.bib} 
@Article{Arogeti2010,
  author   = {S. A. Arogeti and D. Wang and C. B. Low},
  title    = {Mode Identification of Hybrid Systems in the Presence of Fault},
  journal  = {IEEE Transactions on Industrial Electronics},
  year     = {2010},
  volume   = {57},
  number   = {4},
  month    = {April},
  pages    = {1452-1467}
}

@InProceedings{Frisk2003,
  author    = {E. Frisk and D. Düştegör and M. Krysander and V. Cocquempot},
  title     = {Improving fault isolability properties by structural analysis of faulty behavior models: Application to the {DAMADICS} benchmark problem},
  booktitle = {5th IFAC Symposium on Fault Detection, Supervision and Safety of Technical Processes},
  year      = {2003},
  address   = {Washington DC, USA}
}
\end{filecontents}

\documentclass{scrbook}
\usepackage{scrlayer-scrpage}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[english]{babel}

\usepackage[backend=biber]{biblatex}
\addbibresource{testbib.bib}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Sentence Case for 'title field' but not for 'journal', 'booktitle', etc. fields

\renewbibmacro*{title}{%
  \ifboolexpr{
    test {\iffieldundef{title}}
    and
    test {\iffieldundef{subtitle}}
  }
    {}
    {\printtext[title]{%
       \printfield[titlecase:title]{title}%
       \setunit{\subtitlepunct}%
       \printfield[titlecase:title]{subtitle}}%
     \newunit}%
  \printfield{titleaddon}}

\renewbibmacro*{booktitle}{%
  \ifboolexpr{
    test {\iffieldundef{booktitle}}
    and
    test {\iffieldundef{booksubtitle}}
  }
    {}
    {\printtext[booktitle]{%
       \printfield[titlecase:booktitle]{booktitle}%
       \setunit{\subtitlepunct}%
       \printfield[titlecase:booktitle]{booksubtitle}}%
     \newunit}%
  \printfield{booktitleaddon}}

\renewbibmacro*{maintitle}{%
  \ifboolexpr{
    test {\iffieldundef{maintitle}}
    and
    test {\iffieldundef{mainsubtitle}}
  }
    {}
    {\printtext[maintitle]{%
       \printfield[titlecase:maintitle]{maintitle}%
       \setunit{\subtitlepunct}%
       \printfield[titlecase:maintitle]{mainsubtitle}}%
     \newunit}%
  \printfield{maintitleaddon}}

\renewbibmacro*{journal}{%
  \ifboolexpr{
    test {\iffieldundef{journaltitle}}
    and
    test {\iffieldundef{journalsubtitle}}
  }
    {}
    {\printtext[journaltitle]{%
       \printfield[titlecase:journaltitle]{journaltitle}%
       \setunit{\subtitlepunct}%
       \printfield[titlecase:journaltitle]{journalsubtitle}}}}

\renewbibmacro*{periodical}{%
  \ifboolexpr{
    test {\iffieldundef{title}}
    and
    test {\iffieldundef{subtitle}}
  }
    {}
    {\printtext[title]{%
       \printfield[titlecase:title]{title}%
       \setunit{\subtitlepunct}%
       \printfield[titlecase:title]{subtitle}}}}

\renewbibmacro*{issue}{%
  \ifboolexpr{
    test {\iffieldundef{issuetitle}}
    and
    test {\iffieldundef{issuesubtitle}}
  }
    {}
    {\printtext[issuetitle]{%
       \printfield[titlecase:issuetitle]{issuetitle}%
       \setunit{\subtitlepunct}%
       \printfield[titlecase:issuetitle]{issuesubtitle}}}}

\DeclareFieldFormat{titlecase:issuetitle}{\MakeSentenceCase*{#1}}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%% Alternative:
% \DeclareFieldFormat{titlecase}{\ifcurrentfield{title}{\MakeSentenceCase*{#1}}{#1}}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\begin{document}
\MakeSentenceCase{This Is A Test For Sentence Case.}

\nocite{*}
\printbibliography
\end{document}
Nochmals danke an alle Beteiligten!

Schöne Grüße und ein sonniges Wochenende,
Sebastian

Gast

Beitrag von Gast »

Ja, es ist vielleicht etwas ungut, dass in der biblatex-Anleitung das Format titlecase nicht erwähnt ist. Die meisten Makros und speziellen Formate der Standardstile sind nicht dokumentiert, da sie prinzipiell in jedem Stil unterschiedlich sein können.

Nur der Vollständigkeit halber, da das \DeclareFieldFormat{titlecase:issuetitle}{\MakeSentenceCase*{#1}} von oben recht blöde war, hier Dein Beispiel mit dem Code, den ich Dir vorschlagen würde und Vorschlägen zum Herumspielen nebst Beispielen (aus biblatex-examples.bib)
\documentclass{scrartcl}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[english]{babel}

\usepackage[backend=biber]{biblatex}
\begin{filecontents}{\jobname.bib}
@Article{Arogeti2010,
  author   = {S. A. Arogeti and D. Wang and C. B. Low},
  title    = {Mode Identification of Hybrid Systems in the Presence of Fault},
  journal  = {IEEE Transactions on Industrial Electronics},
  year     = {2010},
  volume   = {57},
  number   = {4},
  month    = 4,
  pages    = {1452-1467}
}

@InProceedings{Frisk2003,
  author    = {E. Frisk and D. Düştegör and M. Krysander and V. Cocquempot},
  title     = {Improving Fault Isolability Properties by Structural Analysis of Faulty Behavior Models: Application to the {DAMADICS} Benchmark Problem},
  booktitle = {5th IFAC Symposium on Fault Detection, Supervision and Safety of Technical Processes},
  year      = {2003},
  address   = {Washington DC, USA}
}
\end{filecontents}
\addbibresource{\jobname.bib}
\addbibresource{biblatex-examples.bib}

\DeclareFieldFormat{titlecase:title}{#1}
\renewbibmacro*{title}{%
  \ifboolexpr{
    test {\iffieldundef{title}}
    and
    test {\iffieldundef{subtitle}}
  }
    {}
    {\printtext[title]{%
       \printfield[titlecase:title]{title}%
       \setunit{\subtitlepunct}%
       \printfield[titlecase:title]{subtitle}}%
     \newunit}%
  \printfield{titleaddon}}

\DeclareFieldFormat{titlecase:booktitle}{#1}
\renewbibmacro*{booktitle}{%
  \ifboolexpr{
    test {\iffieldundef{booktitle}}
    and
    test {\iffieldundef{booksubtitle}}
  }
    {}
    {\printtext[booktitle]{%
       \printfield[titlecase:booktitle]{booktitle}%
       \setunit{\subtitlepunct}%
       \printfield[titlecase:booktitle]{booksubtitle}}%
     \newunit}%
  \printfield{booktitleaddon}}

\DeclareFieldFormat{titlecase:maintitle}{#1}
\renewbibmacro*{maintitle}{%
  \ifboolexpr{
    test {\iffieldundef{maintitle}}
    and
    test {\iffieldundef{mainsubtitle}}
  }
    {}
    {\printtext[maintitle]{%
       \printfield[titlecase:maintitle]{maintitle}%
       \setunit{\subtitlepunct}%
       \printfield[titlecase:maintitle]{mainsubtitle}}%
     \newunit}%
  \printfield{maintitleaddon}}

\DeclareFieldFormat{titlecase:journaltitle}{#1}
\renewbibmacro*{journal}{%
  \ifboolexpr{
    test {\iffieldundef{journaltitle}}
    and
    test {\iffieldundef{journalsubtitle}}
  }
    {}
    {\printtext[journaltitle]{%
       \printfield[titlecase:journaltitle]{journaltitle}%
       \setunit{\subtitlepunct}%
       \printfield[titlecase:journaltitle]{journalsubtitle}}}}

\renewbibmacro*{periodical}{%
  \ifboolexpr{
    test {\iffieldundef{title}}
    and
    test {\iffieldundef{subtitle}}
  }
    {}
    {\printtext[title]{%
       \printfield[titlecase:title]{title}%
       \setunit{\subtitlepunct}%
       \printfield[titlecase:title]{subtitle}}}}

\DeclareFieldFormat{titlecase:issuetitle}{#1}
\renewbibmacro*{issue}{%
  \ifboolexpr{
    test {\iffieldundef{issuetitle}}
    and
    test {\iffieldundef{issuesubtitle}}
  }
    {}
    {\printtext[issuetitle]{%
       \printfield[titlecase:issuetitle]{issuetitle}%
       \setunit{\subtitlepunct}%
       \printfield[titlecase:issuetitle]{issuesubtitle}}}}

\DeclareFieldFormat
  [article,inbook,incollection,inproceedings,patent,thesis,unpublished]
  {titlecase:title}{\MakeSentenceCase*{#1}}

%%% Man spiele und staune: Die drei Zeilen oben kommentieren, hier die Kommentare lösen und {\MakeSentenceCase*{#1}} und {#1} bunt mischen
%\DeclareFieldFormat{titlecase:title}{\MakeSentenceCase*{#1}}
%\DeclareFieldFormat{titlecase:maintitle}{#1}
%\DeclareFieldFormat{titlecase:booktitle}{#1}
%\DeclareFieldFormat{titlecase:journaltitle}{#1}
%\DeclareFieldFormat{titlecase:issuetitle}{\MakeSentenceCase*{#1}}

\begin{document}
\nocite{gerhardt,Arogeti2010,Frisk2003,sigfridsson,knuth:ct:b,westfahl:space,jcg}
\printbibliography
\end{document}

secretagent
Forum-Newbie
Forum-Newbie
Beiträge: 4
Registriert: So 29. Apr 2018, 09:53

Beitrag von secretagent »

Das ist interessant. Mit deinem Beispiel kann man alles einzeln steuern. Nice. :)

Allerdings liefert der Befehl
\DeclareFieldFormat{titlecase:title}{\MakeSentenceCase*{#1}}
eine Fehlermeldung:
Zeile 127: Missing number, treated as zero. \end
Zeile 127: Illegal unit of measure (pt inserted). \end
Zeile 127: Missing number, treated as zero. \end
Zeile 127: Illegal unit of measure (pt inserted). \end
Zeile 127: A <box> was supposed to be here. \end
Zeile 127: Missing number, treated as zero. \end
Zeile 127: Illegal unit of measure (pt inserted). \end
(Zeile 127 ist das Dokumentende.)

Alle anderen Befehle funktionieren. Merkwürdig. Im Makro oberhalb sieht es so aus, als wäre alles sauber definiert.


Für alle, die über eine Suchmaschine hierher gelangt sind: In meiner Beispielreferenz oben ist in einem Namen ein Sonderzeichen enthalten gewesen: Düştegör -> Düstegör.
Wenn man das Minimalbeispiel per Copy&Paste in Latex einfügt, bekommt man evtl. auch eine Fehlermeldung. Daher bitte erst den String 'ş' löschen, dann kompiliert Latex ohne Fehler.

Gruß
Sebastian

Gast

Beitrag von Gast »

Ach ja, blast, gut gesehen! Das hatte ich vergessen. Das ist ein Bug in biblatex-examples.bib, der mich schon seit Jahren nervt und vor ein paar Tagen behoben wurde, allerdings wurde dafür noch keine neue Version von biblatex veröffentlicht.

Wie erwähnt ist \MakeSentenceCase recht sensibel. So sensibel, dass Makros in der Eingabe auch mit geschweiften Klammern geschützt/versteckt werden müssen. Das hat man bei dem Eintrag knuth:ct:b aber vergessen, da dort das Makro ganz am Anfang steht und der Anfang eines Strings gegen die Änderung der Groß- und Kleinschreibung nicht geschützt werden muss, da er ja immer groß gelassen wird.

Die Lösung für unser Beispiel ist einfach: wir zitieren knuth:ct:d statt knuth:ct:b. Ich habe außerdem den Düştegör-Eintrag entfernt, da mich das beim Copy-und-Paste auch zunächst vor Rätsel gestellt hat.
\documentclass{scrartcl}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[english]{babel}

\usepackage[backend=biber]{biblatex}

\addbibresource{biblatex-examples.bib}

\DeclareFieldFormat{titlecase:title}{#1}
\renewbibmacro*{title}{%
  \ifboolexpr{
    test {\iffieldundef{title}}
    and
    test {\iffieldundef{subtitle}}
  }
    {}
    {\printtext[title]{%
       \printfield[titlecase:title]{title}%
       \setunit{\subtitlepunct}%
       \printfield[titlecase:title]{subtitle}}%
     \newunit}%
  \printfield{titleaddon}}

\DeclareFieldFormat{titlecase:booktitle}{#1}
\renewbibmacro*{booktitle}{%
  \ifboolexpr{
    test {\iffieldundef{booktitle}}
    and
    test {\iffieldundef{booksubtitle}}
  }
    {}
    {\printtext[booktitle]{%
       \printfield[titlecase:booktitle]{booktitle}%
       \setunit{\subtitlepunct}%
       \printfield[titlecase:booktitle]{booksubtitle}}%
     \newunit}%
  \printfield{booktitleaddon}}

\DeclareFieldFormat{titlecase:maintitle}{#1}
\renewbibmacro*{maintitle}{%
  \ifboolexpr{
    test {\iffieldundef{maintitle}}
    and
    test {\iffieldundef{mainsubtitle}}
  }
    {}
    {\printtext[maintitle]{%
       \printfield[titlecase:maintitle]{maintitle}%
       \setunit{\subtitlepunct}%
       \printfield[titlecase:maintitle]{mainsubtitle}}%
     \newunit}%
  \printfield{maintitleaddon}}

\DeclareFieldFormat{titlecase:journaltitle}{#1}
\renewbibmacro*{journal}{%
  \ifboolexpr{
    test {\iffieldundef{journaltitle}}
    and
    test {\iffieldundef{journalsubtitle}}
  }
    {}
    {\printtext[journaltitle]{%
       \printfield[titlecase:journaltitle]{journaltitle}%
       \setunit{\subtitlepunct}%
       \printfield[titlecase:journaltitle]{journalsubtitle}}}}

\renewbibmacro*{periodical}{%
  \ifboolexpr{
    test {\iffieldundef{title}}
    and
    test {\iffieldundef{subtitle}}
  }
    {}
    {\printtext[title]{%
       \printfield[titlecase:title]{title}%
       \setunit{\subtitlepunct}%
       \printfield[titlecase:title]{subtitle}}}}

\DeclareFieldFormat{titlecase:issuetitle}{#1}
\renewbibmacro*{issue}{%
  \ifboolexpr{
    test {\iffieldundef{issuetitle}}
    and
    test {\iffieldundef{issuesubtitle}}
  }
    {}
    {\printtext[issuetitle]{%
       \printfield[titlecase:issuetitle]{issuetitle}%
       \setunit{\subtitlepunct}%
       \printfield[titlecase:issuetitle]{issuesubtitle}}}}

\DeclareFieldFormat
  [article,inbook,incollection,inproceedings,patent,thesis,unpublished]
  {titlecase:title}{\MakeSentenceCase*{#1}}

%%% Man spiele und staune: Die drei Zeilen oben kommentieren, hier die Kommentare lösen und {\MakeSentenceCase*{#1}} und {#1} bunt mischen
%\DeclareFieldFormat{titlecase:title}{\MakeSentenceCase*{#1}}
%\DeclareFieldFormat{titlecase:maintitle}{#1}
%\DeclareFieldFormat{titlecase:booktitle}{#1}
%\DeclareFieldFormat{titlecase:journaltitle}{#1}
%\DeclareFieldFormat{titlecase:issuetitle}{\MakeSentenceCase*{#1}}

\begin{document}
\nocite{gerhardt,moraux,salam,sigfridsson,knuth:ct:d,westfahl:space,jcg}
\printbibliography
\end{document}

Antworten