Eine _Anfängerin_ aus meinem aktuellen LaTeX-Kurs fragt mich, ob das richtig sei, dass optionale Argumente
nicht angeben werden _müssen_. Ja, meinte ich, deswegen gehören sie bei LaTeX meistens auch in den Teil
mit den eckigen Klammern. Daraufhin fragt sie mich, warum dann
\DeclareSectionCommand{subsubsubsection}
eine Fehlermeldung liefert? Da dachte ich, dass sie eigentlich recht hat und obiges nicht _zuerst_ einen Fehler
wegen fehlendem style= liefern sollte. Wichtiger wäre, dass _zuerst_ ein fehlendes level angemahnt
wird, denn den Rest könnte man irgendwie mit sinnvollen Vorgaben übernehmen.
Kurzum: Vielleicht sollte man die interne Bearbeitung dieses Makros so gestalten,
dass nur bei fehlendem level= eine Fehlermeldung kommt, anderenfalls (nur) eine Warnung und
die Übernahme der Werte, die dem Typ style=section entsprechen.
Die Reihenfolge ist doch wohl ziemlich egal
Welche fehlende Option zuerst gemeldet wird ist doch wohl ziemlich egal.
Warum sollte in jedem Fall
style=section
die richtige Voreinstellung sein? Theoretisch ist schon die Frage, oblevel
überhaupt notwendig ist, vom Stil abhängig. Deshalb muss zuerst auf den Stil geprüft werden und deshalb wird ein fehlender Stil auch zuerst gemeldet. Irgendwo logisch oder?Und warum sollte
style=section
immer die Voreinstellung sein? Da kommt dann irgendwann einer, der sagt, wenn er seinen Befehllsuperpart
nennt, ist doch eigentlich klar, dass der den Stilpart
und irgendwo oberhalb vonpart
angesiedelt sein muss. An anderer kommt dann und erklärt, dass er wenn erlevel=0
angibt, es doch klar ist, dass die Voreinstellung für den Stilchapter
sein muss (den es bei scrartcl gar nicht gibt)Und wieder einer kommt dann und sagt, dass es doch logisch ist, dass die korrekte Voreinstellung für
level
immer der kleinste positive Wert ist, der noch nicht verwendet wurde. Und wieder einer kommt und will stattdessen den nächsten Wert, relativ zum zuletzt verwendeten (den man am Anfang als Anwender eigentlich gar nicht kennt, weil man die Reihenfolge der Implementierung in KOMA-Script nicht kennt).Und wie ist das mit den Voreinstellungen für die Abstände und die übrigen Einstellungen? Woher sollen die kommen?
Ich in ziemlich sicher, dass es immer irgendjemanden geben wird, dem eine Voreinstellung nicht passt. Tatsächlich werde ich immer wieder gefragt, warum die Voreinstellungen so und nicht anders sind.
Ich habe mir das in dem Fall schon ziemlich gut überlegt und bin zu dem Schluss gekommen, dass es für vieles in Wirklichkeit keine wirklich guten Voreinstellungen gibt und es besser ist, dem Anwender zu sagen, was fehlt. Bei den Verzeichniseinträgen ist das tatsächlich ein wenig anders. Dort kann man aus dem Namen in gewissen Grenzen gute neue Werte ableiten. Vermutlich wäre es statt über den Namen auch über die numerische Ebene möglich, aber die Werte sind über die Namen gespeichert. Bei den Verzeichniseinträgen ist dafür der Stil in der Tat kein optionales Argument mehr. Als ich das implementiert habe, hatte ich bereits dazugelernt.
Übrigens: Was optional ist oder nicht, hängt davon ab, was bereits bekannt ist oder nicht. So funktioniert
\DeclareSectionCommand{section}
beispielsweise ganz ohne optionales Argument. Wann das gut ist? Lade mal titlesec. Soll ich jetzt wirklich zwei Befehle machen, einen mit einem optionalem und zwei obligatorischen Argumenten und einen mit einem optionalen und einem obligatorischen Argument und jeder muss die nur noch optionalen Optionen im optionalen Argument angeben und die noch obligatorischen Optionen im ersten obligatorischen Argument des Befehls mit den zwei obligatorischen Argumenten? Da wäre es doch leichter zu erklären, dass man im optionalen Argument nur die Optionen setzen muss die noch unbekannt sind oder die man ändern will und ggf. auch das komplette Argument weglassen kann, wenn bereits alle Optionen bekannt und korrekt voreingestellt sind. Generelle Regeln sind eben manchmal doch nicht ganz so einfach, wie sie auf den ersten Blick erscheinen. Bzw. die korrekte Regel für das optionale Argument lautet vielleicht schlicht ein wenig anders: Optionale Argumente dienen dazu, die Voreinstellung zu modifizieren. Wenn die Voreinstellung bereits den Anforderungen entspricht, kann man es daher weglassen. Wenn aber die Voreinstellung nicht den Anforderungen entspricht (und die Voreinstellung unbekannt entspricht eben nie den Anforderungen), dann muss man das optionale Argument eben verwenden.Wow, soviel Text habe ich noch nie auf dem Tablet getippt!