Sie sind hier

Konflikt zwischen \makebox und \MakeUppercase beim Umdefinieren von \chapterformat und\size@chapter

Hallo,

um ein Dokumentenlayout an eine Word-Vorlage anzupassen (ja ich weiß, schrecklich...), muß ich die Schriftgrößen in Überschriften ändern und zudem Überschriften auf Kapitelebene in Großbuchstaben setzen.

Dazu habe ich \size@chapter¹ (und auch die anderen \size@...¹) entsprechend umdefiniert und zudem ein \MakeUppercase¹ in \size@chapter¹ eingeführt. Für sich allein klappt das prima.

Zusätzlich soll der Beginn des Überschrifttextes um 1.5 cm eingerückt werden, und die Kapitel- bzw. Abschnittsnummer in den entstehenden Freiraum eingefügt werden. Dazu habe ich \chapterformat¹ und \othersectionlevelsformat¹ in Anlehnung an den scrguide's (Seite 115 und folgende) mit einer \makebox¹ um die Kapitel- bzw. Abschnittszähler herum umdefiniert (siehe Beispiel unten). Für sich allein (ohne Verwendung von \MakeUppercase¹ in der \size@chapter¹ Definition) klappt das auch so wie es soll.

Wenn beide Definitionen wirksam sind, gibt es allerdings eine Fehlermeldung:

Chapter 1.
! Use of \@makepicbox doesn't match its definition.
<argument> \def 
 
l.16 \blinddocument
 
?

Wenn man das \MakeUppercase¹ in einer anderen \size@...¹ Definition benutzt (etwa in \size@section¹) gibt es ebenfalls Fehlermeldungen, wenn auch andere.

Offensichtlich vertragen sich also eine Umdefinition von \chapterformat¹ oder \othersectionlevelsformat¹ mittels einer \makebox¹ nicht mit dem Standardbefehl \MakeUppercase¹ in einer zugehörigen \size@...¹ Definition. Woran liegt das, und gibt es einen "way around"?

Der folgende code generiert die o.a. Fehlermeldung:

\documentclass[headsepline=true]{scrreprt}
 
\usepackage[english]{babel}
\usepackage{blindtext} 
 
\makeatletter
\renewcommand*{\size@chapter}{\normalsize\MakeUppercase}
\renewcommand*{\size@section}{\normalsize}
\makeatother
 
\renewcommand*{\chapterformat}{\makebox[1.5cm][l]{\thechapter\autodot\enskip}}
\renewcommand*{\othersectionlevelsformat}[3]{\makebox[1.5cm][l]{#3\autodot\enskip}}
 
\begin{document}
\tableofcontents
\blinddocument
\end{document}

Vielen Dank für die Hilfe,

Christian.

1  [Admin-Edit:] <code>...</code> eingefügt. Bitte künftig selbst beachten!

Bild von Markus Kohm

Zunächst sei erwähnt, dass die Umdefinierung von \size@chapter und \size@section als Umdefinierung interner Anweisungen nicht empfohlen werden kann. Außerdem ist sie überflüssig, das es mit \setkomafont eine wohldefinierte Schnittstelle für die Änderung der Schrift gibt:

\setkomafont{chapter}{\normalsize\MakeUppercase}
\setkomafont{section}{\normalsize}

Aber auch damit wirst Du nicht zum Ziel kommen, weil \MakeUppercase nun einmal eine in mehrerer Hinsicht stark limitierte Anweisung ist. Zum einen gilt das dafür, wo man diese Anweisung verwenden darf, zum anderen was man als Argumente dieser Anweisung verwenden darf und zum Dritten für das Ergebnis. Dein Beispiel lässt sich letztlich reduzieren zu:

\documentclass{minimal}
\begin{document}
\MakeUppercase{\makebox[1.5cm][l]{}}
\end{document}

Bereits das funktioniert nicht.

Wenn man erst einmal so weit ist, dann stellt sich die Frage, warum das nicht geht. Alle Anweisungen, die eine Sternform oder ein optionales Argument besitzen, sind bei LaTeX zerbrechlich. Zerbrechliche Anweisungen sind innerhalb von \MakeUppercase nicht erlaubt. AFAIK habe ich auf diese Problematik irgendwo in der KOMA-Script-Anleitung (oder nur im Buch?) hingewiesen. Also liegt der nächste Schritt nahe: Man erstellte eine Anweisung, die garantiert nicht zerbricht:

\documentclass[headsepline=true,headings=small]{scrreprt}
 
\usepackage[english]{babel}
\usepackage{blindtext} 
 
\setkomafont{chapter}{\normalsize\MakeUppercase}
\setkomafont{section}{\normalsize}
\DeclareRobustCommand*{\numberbox}[1]{\makebox[1.5cm][l]{#1}}
 
\renewcommand*{\chapterformat}{\numberbox{\thechapter\autodot\enskip}}
\renewcommand*{\othersectionlevelsformat}[3]{\numberbox{#3\autodot\enskip}}
 
\begin{document}
\tableofcontents
\blinddocument
\end{document}

Wichtig! Damit ist das Problem der Kombinierbarkeit gelöst. Nicht gelöst ist jedoch das Problem, dass das Ergebnis nichts taugt. Alle Typografen dieser Welt sind sich einig, dass im Versalsatz – das ist der Satz von ganzen Wörtern oder Passagen in Großbuchstaben – Sperrung unabdingbar ist. Dabei darf nicht einfach zwischen alle Zeichen ein fester Abstand eingebaut werden. Vielmehr muss ausgeglichen gesperrt werden. Die Pakete soul und microtype versuchen so etwas zwar (siehe deren Anleitungen für die entsprechenden Befehle), aber auch deren Lösung ist nur eine Notlösung. Dabei wird nämlich lediglich das vorhandene Kerning der nicht gesperrten Paare mit berücksichtigt. Schon das funktioniert nur bei einigen, wenigen Fonts, da Kerningtabellen für Versalien oft sehr unzureichend sind. Beim ausgeglichenen Sperren müssen aber zusätzlich die konkrete Formen der Buchstaben, also die Glyphen, mit einbezogen werden (Stichwort sei hier Lochbildner). Das ist mit TeX und keiner Erweiterung von TeX automatisch zu machen. Wirklich korrekten Versalsatz kann man daher nur manuell und nur mit entsprechendem Fachwissen erreichen. Ich selbst hasse Versalsatz, weil er mir immer viel Arbeit macht, ich aber mit dem Ergebnis nie ganz zufrieden bin.

Das Ergebnis obiger technischer Lösung kann also keinesfalls als typografisch brauchbare Lösung verstanden werden. Sie ist in meinen Augen absolut unbrauchbar und untauglich! Und diese Aussage ist mir so wichtig, dass ich ausnahmsweise sogar eine aktive Auszeichnung zur Hervorhebung verwende …

...für die technische Lösung meines Problems, die im Beispiel auch in der Tat funktioniert.

Bzgl. der Umdefinition der \size@... Befehle - wahrscheinlich bin ich beim Lesen des Codes auf die Idee gekommen, sie zu benutzen, da ich bis dahin lediglich ein \setkomafont{sectioning} verwendet hatte, aber verschiedene Größen für die einzelnen Überschriftsebenen brauchte. Zu einem anderen Zeitpunkt hatte ich den KOMA Script Guide dann ordentlicher gelesen und auch die seperaten Umschaltbefehle für die einzelnen Ebenen entdeckt, aber nicht alles entsprechend umgestrickt. Aus dem gleichen Grund ist das Beispiel auch nicht ganz so minimal ausgefallen, wie es hätte sein sollen - ich habe einen Teil meines Kontexts beibehalten, wahrscheinlich auch deshalb, weil ich sonst überhaupt keine Idee hätte, warum man eine \makebox in ein \MakeUppercase stecken sollte. Ich bitte um Entschuldigung.

Was die Typografie angeht - ja, Du hast recht. Ich würde von mir aus auch keinen Versalsatz benutzen. Es ist nur so (und diesen Hintergrund kann man in Minimalbeispielen halt nicht so einfach transportieren), daß die erwähnte Dokumentenklasse ein Versuch ist, auf LaTeX basierte technische Dokumente in einer ansonsten stark M$-Word orientierten Organisation einzuführen. Einige der Leute, die in ihren Dokumenten viele mathematische Formeln setzen müssen, wären darüber ganz glücklich. Die üblichen Entscheidungsträger (die in der Regel keine Formeln setzen müssen) erstmal damit zu überfahren, daß ihre seit 10 oder 15 Jahren verwendeten Vorlagen typografisch betrachtet Schrott sind, mag mein ästhetisches Empfinden befriedigen. Es hilft allerdings nicht unbedingt weiter, deren Akzeptanz für neue Arbeitsprozesse zu erreichen. Und ist somit der Arbeitserleichterung für die, die technische und wissenschaftliche Dokumente erstellen müssen, auch nicht nicht zuträglich. Stattdessen erhält die Wrapper-Klasse eben eine Option, LaTeX-Dokumente genauso hässlich aussehen zu lassen wie die derzeitigen Vorlagen - inklusive Überschriften in Großbuchstaben, wenn's denn sein muß.

Bild von Markus Kohm

Als Notlösung würde ich dann wenigstens das Tracking mit microtype einbauen:

\documentclass[headsepline=true,headings=small]{scrreprt}
 
\usepackage[english]{babel}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage{blindtext} 
 
\usepackage{microtype}% für automatische Sperrung
 
\setkomafont{chapter}{\normalsize
  \SetTracking{encoding = *}{50}% zusätzlich Sperrung definieren
  \lsstyle% und aktivieren
  \MakeUppercase}
\setkomafont{section}{\normalsize}
\DeclareRobustCommand*{\numberbox}[1]{\makebox[1.5cm][l]{#1}}
 
\renewcommand*{\chapterformat}{\numberbox{\thechapter\autodot\enskip}}
\renewcommand*{\othersectionlevelsformat}[3]{\numberbox{#3\autodot\enskip}}
 
\begin{document}
\tableofcontents
\blinddocument
\end{document}

Man sieht da aber, obwohl ich sehr, sehr moderat gesperrt habe, bei HEADING schon sehr deutlich die Grenzen des automatischen Sperrens. Eventuell könnte man das mit \SetExtraKerning noch ein wenig verbessern. Aber Du willst ja ohnehin kein optimales Ergebnis, sondern nur eines, das besser als Word ist. ;-)

Comments for "Konflikt zwischen \makebox und \MakeUppercase beim Umdefinieren von \chapterformat und\size@chapter" abonnieren