Sie sind hier

Kolumne kurz -- Inhaltsverz. lang

Es wird nicht selten durchaus berechtigt der Wunsch geäußert, den Kolumnentitel, der z.B. von \section herkommt, zu verkürzen, den Eintrag im Inhaltsverzeichnis aber in Langform zu belassen (da ist ja genügend Platz). Empfohlen wird dann häufig:

\section{LANG\protect\sectionmark{KURZ}}
\sectionmark{KURZ}

oder ähnlich. Das ist nicht sehr elegant. Ich würde mich freuen, wenn die KOMA-Script-Klassen oder eines der dazugehörenden Pakete dafür einen Automatismus böten. Ich würde dann wie üblich

\section[KURZ]{LANG}

schreiben wollen aber mit dem oben genannten Effekt.

...Rolf

forum: 
Bild von Markus Kohm

Grundsätzlich hast Du mit Deinem Anliegen absolut Recht, weshalb ich an der Stelle schon seit Jahren ansetzen will. Für eine ordentlich gebaute Lösung, müsste man allerdings das Kernel-Makro \@sect (und je nach Lösung auch noch \@startsection) ändern. In \@sect wird nämlich \...mark mit dem entsprechenden Argument aufgerufen, um den Kolumnentitel zu setzen, und \addcontentsline mit (derzeit) demselben Argument, um den Inhaltsverzeichniseintrag zu erzeugen. An der Stelle müsste man je nach Einstellung ein anderes Argument angegeben.

Dann wäre noch zu entscheiden, wie genau die neue Syntax lauten soll. Die einfachste Lösung wäre tatsächlich, wenn man unabhängig vom Gliederungsbefehl global über eine Option steuern würde, welches Argument für das Inhaltsverzeichnis und welches für den Kolumnentitel zu verwenden wäre, also etwas wie:

\KOMAoptions{head=optionalarg,toc=mandatoryarg}
\section[optional]{mandatory}

Dann stellt sich natürlich die Frage: Was ist, wenn nun jemand für Inhaltsverzeichnis, Kolumnentitel und Überschrift drei unterschiedliche Angaben haben will. Also müsste man den Gliederungsbefehl noch um ein weiteres optionales Argument erweitern:

\KOMAoptions{head=firstoptionalarg,toc=secondoptionarg}
\section[firstoptionalarg][secondoptionalarg]{mandatoryarg}

Dann müsste man aber außerdem wählen können, was passieren soll, wenn nur ein optionales Argument angegeben ist, also etwas wie:

\KOMAoptions{head=firstoptionalarg,toc=firstorsecondoptionalarg}

Damit hätten wir dann bei nur einem optionalen Argument für Kopf und Verzeichnis dieses, also das Standardverhalten, während

\KOMAoptions{head=firstoptionalarg,toc=secondoptionalormandatoryarg}

bei nur einem optionalen Argument für das Inhaltsverzeichnis das nicht optionale Argument verwenden würden.

Da stellt sich mir die Frage, ob nicht etwas wie:

\KOMAoptions{disposition=extended}
\section[toc={Inhaltsverzeichniseintrag},head={Kopfzeile}]{Überschrift}
\section[toc={Inhaltsverzeichniseintrag}]{Überschrift und Kopfzeile}
\section[head={Kopfzeile}]{Überschrift und Inhaltsverzeichniseintrag}
\section[headtoc={Kopfzeile und Inhaltsverzeichniseintrag}]{Überschrift}

besser wäre. Man könnte dabei sogar so weit gehe, dass wenn das optionale Argument nicht mit toc=, head= oder headtoc= beginnt, das Verhalten

\section[Kopfzeile und Inhaltsverzeichniseintrag]{Überschrift}

verwendet wird.

Sowohl wenn man das optionale Argument mit einer key=value-Syntax versieht, als auch wenn ein zusätzliches optionales Argument eingeführt wird, müsste man ebenfalls \@startsection ändern und ggf. sogar \@sect um ein optionales Argument erweitern.

Wenn ich nun einmal eine kurze Suche im latex-Baum von TeX-Live 2009 mache, dann finde ich über 36 Pakete und Dateien, die von Paketen geladen werden, die \@sect umdefinieren, und 9, die \@startsection umdefinieren, wobei ich nur die gezählt habe, die das mit \def machen. Dabei sind auch prominente Pakete wie hyperref. Eine entsprechende Änderung hätte also das Potential, dass all diese Pakete nicht mehr mit KOMA-Script funktionieren oder für jedes dieser Pakete eine Sonderlösung zu implementieren wäre, die bei jeder neuen Release dieser Pakete zu überprüfen wäre.

Aus diesem Grund, tue ich mich seit Jahren schwer, eine entsprechende Erweiterung in KOMA-Script einzubauen, obwohl ich Dir grundsätzlich zustimme.

Deine Argumentation ist gut begründet. Das Grundproblem liegt -- wie oft -- an der Struktur des LaTeX-Kerns und an Altlasten, an denen nicht mehr gerührt werden darf (was sicher auch sein Gutes hat). Ich selbst nutze eine auf "scrbook" aufbauende Klasse und kann festlegen, wie sie sich verhalten soll, brauche also keine Rücksicht auf sich widersprechende Wünsche oder exotische Pakete zu nehmen. Meine derzeitige Lösung sieht daher folgendermaßen aus:

\newcommand\old@sect{}
\let\old@sect=\@sect
\def\@sect#1#2#3#4#5#6[#7]#8{%
  \old@sect{#1}{#2}{#3}{#4}{#5}{#6}[#8]{#8\sectionmark{#7}}%
  \sectionmark{#7}%
}
\newcommand\old@chapter{}
\let\old@chapter=\@chapter
\def\@chapter[#1]#2{%
  \old@chapter[#2]{#2\chaptermark{#1}}%
  \chaptermark{#1}
}

Sie harmoniert zumindest mit "hyperref", wenn man das Paket vorschriftsmäßig möglichst spät lädt.

...Rolf

Bild von Markus Kohm

Pragmatisch gesehen liefert Deine Lösung genau das, was Du haben willst. Sie bietet aber bei weitem nicht die Flexibilität, die ich im weiteren Verlauf meiner Antwort skizziert habe. Ich will nicht bestreiten, dass es vielleicht besser wäre, eine solch pragmatische Lösung in KOMA-Script einzubauen, statt mal wieder einer optimalen Lösung hinterher zu jagen und diese eventuell nie zu erreichen. Ich strebe aber nunmal für KOMA-Script – insbesondere seit Version 3.00 mit ihrer deutlich aufpolierten Benutzerschnittstelle – optimale Lösungen an.

BTW: Ich habe mal einen genaueren Blick auf hyperref geworfen. Die Umdefinierung von \@sect dort ist so, dass man vor dem Laden von nameref fast alles machen darf. Man könnte sogar am Ende ein weiteres Argument hinzufügen. Allerdings werden das 7. (das optionale) und das 8. Argument (normalerweise die Überschrift) intern von nameref auch noch anderweitig verwendet. Eine key-value-Erweiterung für das 7. Argument würde an der Stelle in die Hose gehen, müsste also bereits zu einem früheren Zeitpunkt (also \@startsection) erfolgen.

Allerdings beobachte ich bei KOMA-Script noch ein ganz anderes Problem. Was jahrelang als Segen angesehen wurde: dass man nicht Dutzende Pakete benötigt, wird langsam zum Fluch. Ich erlebe seit KOMA-Script 3.00 verstärkt, dass Leute Dinge nachfragen, die mit einem kurzen Blick in die KOMA-Script-Anleitung beantwortet werden können – oft sogar für Anfänger über das Stichwortverzeichnis oder einen klar abgegrenzten Abschnitt. Ich habe dafür zwei Ursachen ausgemacht:

  1. Anwender verwenden KOMA-Script, ohne zu wissen, dass sie das tun und dass es eine ausführliche Anleitung dazu gibt.
  2. Anwender trauen KOMA-Script nicht zu, auch für dieses Problem eine Lösung bereit zu stellen.

Im Ergebnis suchen die Leute dann nach Lösungen, die nicht in KOMA-Script enthalten sind. Das geht so weit, dass für Dinge, die KOMA-Script bereit stellt, interne KOMA-Script-Anweisungen durch Umdefinierungen, die eigentlich für die Standardklassen gedacht sind, ersetzt werden.

Im Ergebnis frage ich mich, ob es überhaupt sinnvoll ist, KOMA-Script selbst noch irgend etwas beizubringen. Vielleicht wäre es stattdessen besser, für jede Kleinigkeit ein eigenes Paket zu schreiben. Das würde beispielsweise bedeuten:

%% toclong.sty
%% Copyright (c) rolfn 2010
%%
%% This file may be distributed and/or modified under the
%% conditions of the LaTeX Project Public License, either version 1.3c
%% of this license or (at your option) any later version.
%% The latest version of this license is in
%%    http://www.latex-project.org/lppl.txt
%% and version 1.3c or later is part of all distributions of LaTeX
%% version 2005/12/01 or later.
%%
\ProvidesPackage{toclong}[2010/02/09 v0.1 mark uses mandatory argument]
\PackageError{toclong}{THIS IS AN ALPHA VERSION! DON'T USE IT}
  {There is no support for this package from any one!}
\ProcessOptions\relax
\@ifpackageloaded{nameref}{%
  \PackageError{toclong}{package must be loaded before `nameref'}{}%
}{}
\newcommand\toclong@sect{}
\let\toclong@sect=\@sect
\def\@sect#1#2#3#4#5#6[#7]#8{%
  \toclong@sect{#1}{#2}{#3}{#4}{#5}{#6}[#8]{#8\sectionmark{#7}}%
  \sectionmark{#7}%
}
\ifcsname @chapter\endcsname
  \newcommand\toclong@chapter{}
  \let\toclong@chapter=\@chapter
  \def\@chapter[#1]#2{%
    \toclong@chapter[#2]{#2\chaptermark{#1}}%
    \chaptermark{#1}%
  }
\fi
\endinput
% end of file `toclong.sty'

DISCLAIMER: Das Paket funktioniert so absichtlich nicht, weil ich natürlich keine Pakete von anderen Anwendern herausbringen kann!

Bild von Markus Kohm

Deine Anfrage hat mich dazu gebracht, eine lange hin und her gewälzte Idee aufzugreifen und in die Realität umzusetzen: eine Spielwiese für experimentelle, potentielle KOMA-Script-Erweiterungen.

Comments for "Kolumne kurz -- Inhaltsverz. lang" abonnieren