Sie sind hier

Manipulation der Schriften mit \addtokomafont bzw. \setkomafont

Hallo Markus,

ich möchte für eine eigene Klasse Layout-Elemente erstellen, die lediglich mit der gleichen Schrifthöhe wie die bspw. die Kapitelüberschriften gesetzt werden, jedoch alle anderen Attribute der Schrift ignorieren. Deshalb wollte ich auf den Befehl \size@chapter zurückgreifen. Da ich die Kapitelüberschriften selbst jedoch \addtokomafont{chapter}{...} farbig setze ist mir aufgefallen, dass der Inhalt des zweiten Argumentes nicht an \scr@fnt@chapter sondern an \size@chapter angehängt wird. Mit \setkomafont verhält es sich genauso. Siehe das Beispiel.

Grüße
Falk

\documentclass{scrreprt}
\usepackage{color}
\begin{document}
\makeatletter
\let\@tempfont\scr@fnt@chapter%
\let\@tempsize\size@chapter%
\newcommand{\ausgabe}[1]{%
  \subsubsection{#1}
  \begin{tabular}{@{}ll}
  scr@fnt@chapter:           & \meaning\scr@fnt@chapter\\
  size@chapter:              & \meaning\size@chapter\\
  \tbs usekomafont{chapter}: & \usekomafont{chapter}Test\\
  \tbs size@chapter:         & \size@chapter Test
  \end{tabular}
}
\newcommand*{\tbs}{\textbackslash}
 
% Ist
\ausgabe{Standard}
\addtokomafont{chapter}{\color{red}}
\ausgabe{\tbs addtokomafont\{chapter\}\{\tbs color\{red\}\}}
\setkomafont{chapter}{\color{green}}
\ausgabe{\tbs setkomafont\{chapter\}\{\tbs color\{green\}\}}
 
% Änderung
\renewcommand*{\setkomafont}[2]{%
  %\expandafter\expandafter\expandafter\def\csname scr@fnt@#1\endcsname{#2}%
  \expandafter\def\csname scr@fnt@#1\endcsname{#2}%
}
\renewcommand*{\addtokomafont}[2]{%
%  \expandafter\expandafter\expandafter\l@addto@macro\csname scr@fnt@#1\endcsname{#2}%
  \expandafter\l@addto@macro\csname scr@fnt@#1\endcsname{#2}%
}
\let\scr@fnt@chapter\@tempfont%
\let\size@chapter\@tempsize%
 
% Soll
\ausgabe{Standard}
\addtokomafont{chapter}{\color{red}}
\ausgabe{\tbs addtokomafont\{chapter\}\{\tbs color\{red\}\}}
\setkomafont{chapter}{\color{green}}
\ausgabe{\tbs setkomafont\{chapter\}\{\tbs color\{green\}\}}
\end{document}
forum: 

Ich habe beim Durchforsten des Quelltextes gerade festgestellt, dass das Verhalten wohl so gewollt ist. Aber warum das so ist, erschließt sich mir nicht direkt...

Bild von Markus Kohm

Einst konnte man bei KOMA-Script nur die Schriftart aller Überschriften gemeinsam ändern. Dazu musste man die Anwenderanweisung \sectfont umdefinieren. Aber schon recht früh (vielleicht sogar von Anfang an, das weiß ich nicht mehr) konnte man drei unterschiedliche Größenabstufungen für die Überschriften insgesamt wählen. Dazu gab es intern Anweisungen, die via Option schlicht umdefiniert wurden. Das waren die \size@… Makros. Deren Namen hatte ich in der Anfangszeit mal verraten, insbesondere wenn Leute fragten, wie sie bestimmte Vorgaben bezüglich der Überschriften erfüllen können. Es gab auch ein paar andere Dinge, deren Schrift man über Umdefinierung einer Anwenderanweisung ändern konnte. Die Anzahl hielt sich aber sehr in Grenzen. Langsam wurden es ein paar mehr. Irgendwann war die Umdefinierungsgeschichte einfach unübersichtlich und nicht mehr zeitgemäß. Darüber hinaus waren einige Namen schlicht wenig passend. Deshalb wurde die Schnittstelle mit \setkomafont/\addtokomafont geschaffen. Da aber Kompatibilität zu früheren Versionen wichtig ist, wurden dabei nicht einfach alle Anwenderanweisungen und internen Makros neu benannt, sondern die früheren Anwenderanweisungen und internen Makros alle als intern deklariert und auf die neue Schnittstelle abgebildet. So funktionierten auch Dokumente weiter, die \sectfont oder \size@chapter umdefinieren.

Die Schnittstelle ist außerdem so flexibel gestaltet, dass ein und dasselbe Element auch unter unterschiedlichen Namen angesprochen werden kann.

Gleichzeitig ist aber nicht dokumentiert, wie das interne Makro heißt. Man sollte sich also nicht darauf verlassen. Schon gar nicht sollte man \setkomafont und \addtokomafont wie in Deinem Beispiel umdefinieren. Das haut überhaupt nicht hin. Generell kann ich nur davon abraten, sich auf die Namen oder Funktion von internen Makros zu verlassen. Beispielsweise fällt mir gerade ein, dass ich kürzlich an einer Stelle mehrere Makros komplett gestrichen habe, weil ich intern einiges umgestellt habe. Von anderen habe ich den Namen geändert, um sie zu vereinheitlichen und mir selbst das Leben zu erleichtern. Intern hält sich also die Kompatibilität in Grenzen und wird nicht um jeden Preis durchgezogen. Lediglich bei Makros, deren Änderbarkeit ich selbst in Tipps ohne den obligatorischen Hinweis, dass der Tipp mit Vorsicht zu genießen ist, verkündet habe, tue ich mich fast ebenso schwer wie bei Makros aus der Benutzerschnittstelle.

Danke für die ausführliche Antwort. Das Umdefinieren von \setkomafont und \addtokomafont habe ich auch bloß für das Beispiel gemacht, damit schnell klar wird, worauf ich hinaus will. In einem seriösen Dokument bzw. einer Wrapper-Klasse würde ich sowas nie machen. Ich wollte bloß wissen, ob das ganze Absicht ist. Da ich lediglich die Größen der Schriften brauche, werde ich mich ohne Sorge auf die \size@...-Makros berufen.

Bild von Markus Kohm

Die \size@…-Makros können durchaus mehr als nur die Größe enthalten. Wenn Du nur die Größe haben willst, dann:

\documentclass{scrbook}
 
\makeatletter
\providecommand*{\usesizeofkomafont}[1]{%
  \begingroup
    \usekomafont{#1}%
    \edef\reserved@a{\noexpand\endgroup
      \noexpand\fontsize{\f@size}{\f@baselineskip}}%
  \reserved@a\selectfont
}
\makeatother
 
\begin{document}
\usesizeofkomafont{disposition}\usesizeofkomafont{chapter}That's the size of
\KOMAScript's font element chapter.
\end{document}

Ich verwende hier \providecommand, weil in der nächsten KOMA-Script-Release eine verbesserte Fassung des Befehls enthalten sein wird, die auch dann noch funktioniert, wenn (entgegen der ursprünglichen Spezifikation) am Ende des Font-Elements eine Anweisung steht, die ein Argument erwartet.

Dass die size@...-Makros mehr als nur die Größe enthalten können, war mir bewusst. Deswegen habe diese auch in meiner Wrapper-Klasse mit \let\tud@size@...\size@... gesichert. So ist es natürlich wesentlich eleganter, danke dir.

Comments for "Manipulation der Schriften mit \addtokomafont bzw. \setkomafont" abonnieren