von KOMA » Mi 26. Okt 2022, 09:18
Abc hat geschrieben: ↑Mi 26. Okt 2022, 02:55
Entferne die
Leerzeichen im Argument von
\extrasngerman oder benutze die Befehle des Abschnitts 12.4. Definition sprachabhängiger Bezeichner in der
KOMA-Script-Anleitung.
Genau. Auf ersteres habe ich ja bereits ganz zu Anfang der Diskussion hingewiesen. Das ist übrigens ein typischer Anfängerfehler. Wenn der Code also aus einer
Vorlage o. ä. stammt, weiß man jetzt bereits, was von dieser Quelle zu halten ist.
Und wer so eine ausführliche Dokumentpräambel postet, muss natürlich auch Kritik dafür vertragen. Daher noch ein paar weitere Hinweise zur Qualität der Präambel:
- Die Umdefinierung von \sfdefault und \ttdefault per
\renewcommand{\sfdefault}{lmss}
\renewcommand{\ttdefault}{lmtt}
ist überflüssiger Unsinn, weil das von dem zuvor geladenen Paket lmodern bereits erledigt wird. Das Paket selbst bietet übrigens über die wenig bekannte Option variablett auch die Möglichkeit eine nicht dicktengleiche und gefälligere Typewriter zu verwenden
- Die explizite Codierungseinstellung mit \usepackage[utf8]{inputenc} ist seit April 2018 nicht mehr notwendig. Da Support für Anwender von TeX-Distributionen vor dieser Zeit inzwischen zunehmend schwierig wird, empfehle ich inzwischen, diese Zeile wegzulassen, so dass es ggf. bei Anwendern total veralteter Distributionen sogar zu Fehlermeldungen kommt.
- Die Angabe der Sprache beim Laden von babel ist überflüssig, da diese bereits bei \documentclass gesetzt wurde. Dort sind sogar zwei Sprachen angegeben, was babel dann ebenfalls übernimmt. Sinnvoll kann allenfalls sein, beim Laden von babel die Hauptsprache noch explizit per main=ngerman zu setzen, damit man von etwaigen Umsortierungen der Optionen von \documentclass unabhängig wird. Dort kann es übrigens tatsächlich sinnvoll zu sein, vor ngerman auch noch german anzugeben, weil einige Pakete wie das beliebte nomencl zwar eine Option german aber unverständlicher Weise weder ngerman, noch austrian, naustrian, swiss oder nswiss kennen.
- Das auskommentierte selinput ist quasi doppelt überflüssig. Ohne die in der Doku erklärte Anweisung zur automatischen Feststellung der Codierung entspricht das Paket letztlich \usepackage[utf8]{inputenc}. Das ist also sowohl doppelt gemoppelt als auch per se unnötig.
- Das \usepackage{caption} zusätzlich zu \usepackage{subcaption} ist überflüssig, da letzteres Paket ersteres ohnehin lädt.
- Das \usepackage{textcomp} ist seit Ende 2018 überflüssig. Das Paket hat eigentlich nur noch aufgrund seiner Optionen eine Berechtigung und davon ist ja keine angegeben. Theoretisch könnte es noch wegen des Ladens von textcomp.cfg eine Berechtigung haben, aber das wäre für ein vollständiges Minimalbeispiel eher ein Problem als ein Nutzen.
- Wie man das Setzen von secnumdepth mit etwas mehr Informationsgehalt für Anwender vornehmen kann, ist den KOMA-Script-Anleitungen zu entnehmen.
- \parskip und \parindent sollte man min. bei KOMA-Script, aber eigentlich generell nicht auf diese Weise ändern. Siehe dazu: Wie der Absatzeinzug korrekt verhindert wird und für KOMA-Script die dort (u. a. nach dem Fazit noch einmal explizit) erwähnte Option und Anweisung.
- Zusätzlich zu xltabular auch noch ltxtable zu laden, halte ich für gefährlich, da das zweite Paket Anweisungen umdefiniert, die das erste verwendet. Entscheide dich für eines von beiden.
- Die Anweisung \pagestyle{scrheadings} nach dem Laden von scrlayer-scrpage ist überflüssig, da das vom Paket bereits erledigt wird.
- Die Anweisung \automark[section]{chapter} ist zwar korrekt, man kann sich das aber auch verkürzen, indem man direkt beim Laden von scrlayer-scrpage Option automark angibt.
- Ich empfehle, Option headsepline direkt bei \documentclass anzugeben. Dann reagieren die Klassen und auch das von den Klassen verwendete Paket typearea bereits beim Laden darauf. Im konkreten Beispiel ändert das aber nicht viel, da allein das Paket geometry zum Einstellen der Ränder verwendet wird. Dabei werden typografische Erwägungen ohnehin eher nicht berücksichtigt.
- Das Paket epic ist in Wirklichkeit ein alter LaTeX-2.09-Style aus der Mottenkiste und sollte im Zeitalter von pgf nicht mehr benötigt werden. Ich weiß ehrlich gesagt nicht einmal, ob es bei Verwendung von pdflatex (und erst Recht lualatex) überhaupt noch funktioniert. Schon zu meiner LaTeX-Frühzeit hat man übrigens stattdessen das verbesserte und inzwischen ebenfalls eingemottete eepic verwendet.
- Nach xltabular und ltxtable das Paket tabularx noch explizit zu laden, ist überflüssig.
- Das Paket chngcntr braucht es ebenfalls schon seit 2018 nicht mehr.
- Ich bezweifle, dass viele Anwender wissen, was die Einstellungen
\tolerance 1414
\hbadness 1414
\emergencystretch 1.5em
\hfuzz 0.3pt
\widowpenalty=10000
\vfuzz \hfuzz
\raggedbottom
bewirken. Die zugehörige de.comp.text.tex Nachricht zu finden, dürfte für die meisten schwierig werden. Gerade die Einstellung \widowpenalty=10000 sehe ich sehr kritisch. Mit dem dadurch erzwungenen Automatismus für die Verhinderung von Hurenkindern kann man sich einigen Ärger einhandeln. Die absolute, automatische Verhinderung sehen selbst renommierte Typografen in wissenschaftlichen Texten eher kritisch, weil man eben häufig einen höheren Preis dafür bezahlen muss.
- Die Anweisung \PassOptionsToPackage{hyphens}{url} irgendwo nach dem Laden von Paket url ist natürlich Unfug. Man kann einem bereits geladenen Paket keine Optionen mehr übergeben.
- AFAIR ist die Ladereihenfolge url, varioref, hyperref, cleveref ein einst verbreiteter Workaround, damit die Kombination von varioref, hyperref und cleveref manchmal funktioniert. Noch etwas mehr verbessern kann man seine Chancen indem man vor varioref auch noch nameref lädt. Tatsächlich ist aber die Kombination von varioref und hyperref ausdrücklich unsupported und nicht empfohlen. Siehe dazu Abschnitt 11.1.39 der aktuellen hyperref-Anleitung.
- Eine leere \hypersetup-Anweisung ist sinnloser Überfluss.
- Das Paket url nach hyperref noch ein weiteres Mal zu laden ist überflüssig. Da es bereits früher in der Dokumentpräambel geladen wurde, ist das sogar gefährlicher Unfug.
- Ich vermute stark, dass die Änderungen von \@pnumwidth, \@tocrmarg und \@dotsep einfach irgendwo abgekupfert wurden. Gerade die Änderung der ersten beiden kann natürlich sinnvoll sein, aber nur, wenn das jeweilige Verzeichnis auch danach verlangt. Häufig werden sie auch nicht für alle Verzeichnisse, sondern nur für das Inhaltsverzeichnis benötigt. Ich empfehle daher, sich den Sinn und ggf. die Notwendigkeit noch einmal vor Augen zu führen und das ggf. entsprechend anzupassen.
- Die Umdefinierung von \ref halte ich für fragwürdig. Damit ist es nicht mehr möglich Hinweise wie »siehe Abbildung 1 bis 5« zu schreiben, weil »siehe \autoref{fig:a} bis \ref{fig:a}« dann ja nicht mehr zu diesem Ergebnis führt. Darüber hinaus fehlt einem dann die Möglichkeit der Verwendung von \ref*, also ohne Link. Darauf verlassen sich ggf. aber auch Pakete. Nachdem man bereits Paket cleveref geladen hat, wäre ohnehin die Verwendung dessen Befehle für Verweise mit automatischem Namenspräfix zu empfehlen. Also ist diese Umdefinierung noch fragwürdiger, zumal sich cleveref natürlich auch auf die korrekte Funktion von \ref und \ref* verlässt.
- Zur Erweiterung von \extrasngerman brauche ich nichts mehr zu schreiben. Wie schlecht gemacht das ist, sollte inzwischen aus den bereits verlinkten Seiten bekannt sein.
- Die Umdefinierung von \tableofcontents ist fehlerhaft und kann sogar dazu führen, dass der Bookmark auf die Seite vor dem Inhaltsverzeichnis führt. Das darin enthaltene \mainmatter führt in Dokumenten ohne \frontmatter außerdem dazu, dass man mehrere Seiten 1 hat. Bei Dokumenten, bei denen nach dem Inhaltsverzeichnis weitere Verzeichnisse folgen, landen diese dann außerdem bereits im Hauptteil. Ich rate daher dazu, diese Umdefinierung komplett zu entfernen und ggf. \mainmatter an der richtigen Stelle im Dokument explizit einzufügen.
- Zwar funktioniert
\setkomafont{captionlabel}{\bfseries}
\setcapindent{1em}
dank Axels Einsatzes und Bestreben nach Kompatibilität trotz Verwendung von caption. Trotzdem empfehle ich, bei Einsatz dieses Pakets, alles was \caption betrifft, auch wirklich mit der Benutzerschnittstelle dieses Pakets zu lösen. Ein solches Vorgehen, also bei Ersatz von Funktionalitäten einer Klasse durch ein Paket Änderungen an dieser Funktionalität über das Paket vorzunehmen, sollte man sich generell angewöhnen.
- Wenn ich nichts übersehen habe, dann dient die Umdefinierung von \chapter im Anhang dazu, die Kapitelüberschriften dort von hinten durch die Brust mit dem Präfix Anhang zu versehen. Das kann KOMA-Script in mehrfacher Hinsicht besser. So wie es ist, ist es in mehrfacher Hinsicht Pfusch.
- Es gibt bei KOMA-Script bessere Möglichkeiten \suppressfloats bei jedem \section auszuführen. Das Paket placeins bietet übrigens selbst eine Möglichkeit, die aber auch nur funktioniert, solange man danach keine Änderung an \section über \RedeclareSectionCommand vornimmt.
Wer nun denkt, ich habe hier übertrieben, dem sei erwähnt, dass ich in der Stunde, die ich für obige Zusammenfassung benötigt habe, noch nicht einmal gründlich alles angeschaut habe. Was ich aber gerne zugebe ist, dass ich die Stunde vermutlich teilweise verschwendet habe, weil voraussichtlich die wenigsten dieser Hinweise auf fruchtbaren fallen und wir auch künftig von vielen der kritisierten Punkte nicht verschont bleiben werden. Wie ich darauf komme? Wir sehen das meiste davon leider nicht zum ersten Mal. Es wird immer wieder teilweise weit ausführlicher kritisiert und sogar explizit erklärt, wie man es besser macht.
[quote=Abc post_id=120182 time=1666745751]
Entferne die [url=https://sourceforge.net/p/koma-script/wiki-de/HowTo_AvoidSpaces/]Leerzeichen[/url] im Argument von [tt]\extrasngerman[/tt] oder benutze die Befehle des Abschnitts 12.4. Definition sprachabhängiger Bezeichner in der [ctan]KOMA-Script[/ctan]-Anleitung.
[/quote]
Genau. Auf ersteres habe ich ja bereits ganz zu Anfang der Diskussion hingewiesen. Das ist übrigens ein typischer Anfängerfehler. Wenn der Code also aus einer [url=https://sourceforge.net/p/koma-script/wiki-de/HowTo_Template/]Vorlage[/url] o. ä. stammt, weiß man jetzt bereits, was von dieser Quelle zu halten ist.
Und wer so eine ausführliche Dokumentpräambel postet, muss natürlich auch Kritik dafür vertragen. Daher noch ein paar weitere Hinweise zur Qualität der Präambel:
[list]
[*] Die Umdefinierung von [tt]\sfdefault[/tt] und [tt]\ttdefault[/tt] per [code]\renewcommand{\sfdefault}{lmss}
\renewcommand{\ttdefault}{lmtt}[/code] ist überflüssiger Unsinn, weil das von dem zuvor geladenen Paket [tt]lmodern[/tt] bereits erledigt wird. Das Paket selbst bietet übrigens über die wenig bekannte Option [tt]variablett[/tt] auch die Möglichkeit eine nicht dicktengleiche und [i]gefälligere[/i] Typewriter zu verwenden
[*] Die explizite Codierungseinstellung mit [tt]\usepackage[utf8]{inputenc}[/tt] ist seit April 2018 nicht mehr notwendig. Da Support für Anwender von TeX-Distributionen vor dieser Zeit inzwischen zunehmend schwierig wird, empfehle ich inzwischen, diese Zeile wegzulassen, so dass es ggf. bei Anwendern total veralteter Distributionen sogar zu Fehlermeldungen kommt.
[*] Die Angabe der Sprache beim Laden von [tt]babel[/tt] ist überflüssig, da diese bereits bei [tt]\documentclass[/tt] gesetzt wurde. Dort sind sogar zwei Sprachen angegeben, was [tt]babel[/tt] dann ebenfalls übernimmt. Sinnvoll kann allenfalls sein, beim Laden von [tt]babel[/tt] die Hauptsprache noch explizit per [tt]main=ngerman[/tt] zu setzen, damit man von etwaigen Umsortierungen der Optionen von [tt]\documentclass[/tt] unabhängig wird. Dort kann es übrigens tatsächlich sinnvoll zu sein, [i]vor[/i] [tt]ngerman[/tt] auch noch [tt]german[/tt] anzugeben, weil einige Pakete wie das beliebte [tt]nomencl[/tt] zwar eine Option [tt]german[/tt] aber unverständlicher Weise weder [tt]ngerman[/tt], noch [tt]austrian[/tt], [tt]naustrian[/tt], [tt]swiss[/tt] oder [tt]nswiss[/tt] kennen.
[*] Das auskommentierte [tt]selinput[/tt] ist quasi doppelt überflüssig. Ohne die in der Doku erklärte Anweisung zur automatischen Feststellung der Codierung entspricht das Paket letztlich [tt]\usepackage[utf8]{inputenc}[/tt]. Das ist also sowohl doppelt gemoppelt als auch per se unnötig.
[*] Das [tt]\usepackage{caption}[/tt] zusätzlich zu [tt]\usepackage{subcaption}[/tt] ist überflüssig, da letzteres Paket ersteres ohnehin lädt.
[*] Das [tt]\usepackage{textcomp}[/tt] ist seit Ende 2018 überflüssig. Das Paket hat eigentlich nur noch aufgrund seiner Optionen eine Berechtigung und davon ist ja keine angegeben. Theoretisch könnte es noch wegen des Ladens von [tt]textcomp.cfg[/tt] eine Berechtigung haben, aber das wäre für ein vollständiges Minimalbeispiel eher ein Problem als ein Nutzen.
[*] Wie man das Setzen von [tt]secnumdepth[/tt] mit etwas mehr Informationsgehalt für Anwender vornehmen kann, ist den [ctan]KOMA-Script[/ctan]-Anleitungen zu entnehmen.
[*] [tt]\parskip[/tt] und [tt]\parindent[/tt] sollte man min. bei KOMA-Script, aber eigentlich generell nicht auf diese Weise ändern. Siehe dazu: [url=https://sourceforge.net/p/koma-script/wiki-de/HowTo_NoParIndent/]Wie der Absatzeinzug korrekt verhindert wird[/url] und für KOMA-Script die dort (u. a. nach dem Fazit noch einmal explizit) erwähnte Option und Anweisung.
[*] Zusätzlich zu [tt]xltabular[/tt] auch noch [tt]ltxtable[/tt] zu laden, halte ich für gefährlich, da das zweite Paket Anweisungen umdefiniert, die das erste verwendet. Entscheide dich für eines von beiden.
[*] Die Anweisung [tt]\pagestyle{scrheadings}[/tt] nach dem Laden von [tt]scrlayer-scrpage[/tt] ist überflüssig, da das vom Paket bereits erledigt wird.
[*] Die Anweisung [tt]\automark[section]{chapter}[/tt] ist zwar korrekt, man kann sich das aber auch verkürzen, indem man direkt beim Laden von [tt]scrlayer-scrpage[/tt] Option [tt]automark[/tt] angibt.
[*] Ich empfehle, Option [tt]headsepline[/tt] direkt bei [tt]\documentclass[/tt] anzugeben. Dann reagieren die Klassen und auch das von den Klassen verwendete Paket [tt]typearea[/tt] bereits beim Laden darauf. Im konkreten Beispiel ändert das aber nicht viel, da allein das Paket [tt]geometry[/tt] zum Einstellen der Ränder verwendet wird. Dabei werden typografische Erwägungen ohnehin eher nicht berücksichtigt.
[*] Das Paket [tt]epic[/tt] ist in Wirklichkeit ein alter LaTeX-2.09-Style aus der Mottenkiste und sollte im Zeitalter von [ctan]pgf[/ctan] nicht mehr benötigt werden. Ich weiß ehrlich gesagt nicht einmal, ob es bei Verwendung von [tt]pdflatex[/tt] (und erst Recht [tt]lualatex[/tt]) überhaupt noch funktioniert. Schon zu meiner LaTeX-Frühzeit hat man übrigens stattdessen das verbesserte und inzwischen ebenfalls eingemottete [tt]eepic[/tt] verwendet.
[*] Nach [tt]xltabular[/tt] und [tt]ltxtable[/tt] das Paket [tt]tabularx[/tt] noch explizit zu laden, ist überflüssig.
[*] Das Paket [tt]chngcntr[/tt] braucht es ebenfalls schon seit 2018 nicht mehr.
[*] Ich bezweifle, dass viele Anwender wissen, was die Einstellungen
[code]
\tolerance 1414
\hbadness 1414
\emergencystretch 1.5em
\hfuzz 0.3pt
\widowpenalty=10000
\vfuzz \hfuzz
\raggedbottom
[/code]
bewirken. Die zugehörige de.comp.text.tex Nachricht zu finden, dürfte für die meisten schwierig werden. Gerade die Einstellung [tt]\widowpenalty=10000[/tt] sehe ich sehr kritisch. Mit dem dadurch erzwungenen Automatismus für die Verhinderung von Hurenkindern kann man sich einigen Ärger einhandeln. Die absolute, automatische Verhinderung sehen selbst renommierte Typografen in wissenschaftlichen Texten eher kritisch, weil man eben häufig einen höheren Preis dafür bezahlen muss.
[*]Die Anweisung [tt]\PassOptionsToPackage{hyphens}{url}[/tt] irgendwo nach dem Laden von Paket [tt]url[/tt] ist natürlich Unfug. Man kann einem bereits geladenen Paket keine Optionen mehr übergeben.
[*]AFAIR ist die Ladereihenfolge [tt]url[/tt], [tt]varioref[/tt], [tt]hyperref[/tt], [tt]cleveref[/tt] ein einst verbreiteter Workaround, damit die Kombination von [tt]varioref[/tt], [tt]hyperref[/tt] und [tt]cleveref[/tt] manchmal funktioniert. Noch etwas mehr verbessern kann man seine Chancen indem man vor [tt]varioref[/tt] auch noch [tt]nameref[/tt] lädt. Tatsächlich ist aber die Kombination von [tt]varioref[/tt] und [tt]hyperref[/tt] ausdrücklich [i]unsupported[/i] und nicht empfohlen. Siehe dazu Abschnitt 11.1.39 der aktuellen [doc]hyperref[/doc]-Anleitung.
[*] Eine leere [tt]\hypersetup[/tt]-Anweisung ist sinnloser Überfluss.
[*] Das Paket [tt]url[/tt] nach [tt]hyperref[/tt] noch ein weiteres Mal zu laden ist überflüssig. Da es bereits früher in der Dokumentpräambel geladen wurde, ist das sogar gefährlicher Unfug.
[*] Ich vermute stark, dass die Änderungen von [tt]\@pnumwidth[/tt], [tt]\@tocrmarg[/tt] und [tt]\@dotsep[/tt] einfach irgendwo abgekupfert wurden. Gerade die Änderung der ersten beiden kann natürlich sinnvoll sein, aber nur, wenn das jeweilige Verzeichnis auch danach verlangt. Häufig werden sie auch nicht für alle Verzeichnisse, sondern nur für das Inhaltsverzeichnis benötigt. Ich empfehle daher, sich den Sinn und ggf. die Notwendigkeit noch einmal vor Augen zu führen und das ggf. entsprechend anzupassen.
[*] Die Umdefinierung von [tt]\ref[/tt] halte ich für fragwürdig. Damit ist es nicht mehr möglich Hinweise wie »siehe Abbildung 1 bis 5« zu schreiben, weil »[tt]siehe \autoref{fig:a} bis \ref{fig:a}[/tt]« dann ja nicht mehr zu diesem Ergebnis führt. Darüber hinaus fehlt einem dann die Möglichkeit der Verwendung von [tt]\ref*[/tt], also ohne Link. Darauf verlassen sich ggf. aber auch Pakete. Nachdem man bereits Paket [tt]cleveref[/tt] geladen hat, wäre ohnehin die Verwendung dessen Befehle für Verweise mit automatischem Namenspräfix zu empfehlen. Also ist diese Umdefinierung noch fragwürdiger, zumal sich [tt]cleveref[/tt] natürlich auch auf die korrekte Funktion von [tt]\ref[/tt] und [tt]\ref*[/tt] verlässt.
[*] Zur Erweiterung von [tt]\extrasngerman[/tt] brauche ich nichts mehr zu schreiben. Wie schlecht gemacht das ist, sollte inzwischen aus den bereits verlinkten Seiten bekannt sein.
[*] Die Umdefinierung von [tt]\tableofcontents[/tt] ist fehlerhaft und kann sogar dazu führen, dass der Bookmark auf die Seite vor dem Inhaltsverzeichnis führt. Das darin enthaltene [tt]\mainmatter[/tt] führt in Dokumenten ohne [tt]\frontmatter[/tt] außerdem dazu, dass man mehrere Seiten 1 hat. Bei Dokumenten, bei denen nach dem Inhaltsverzeichnis weitere Verzeichnisse folgen, landen diese dann außerdem bereits im Hauptteil. Ich rate daher dazu, diese Umdefinierung komplett zu entfernen und ggf. [tt]\mainmatter[/tt] an der richtigen Stelle im Dokument explizit einzufügen.
[*] Zwar funktioniert
[code]
\setkomafont{captionlabel}{\bfseries}
\setcapindent{1em}
[/code]
dank Axels Einsatzes und Bestreben nach Kompatibilität trotz Verwendung von [ctan]caption[/ctan]. Trotzdem empfehle ich, bei Einsatz dieses Pakets, alles was [tt]\caption[/tt] betrifft, auch wirklich mit der Benutzerschnittstelle dieses Pakets zu lösen. Ein solches Vorgehen, also bei Ersatz von Funktionalitäten einer Klasse durch ein Paket Änderungen an dieser Funktionalität über das Paket vorzunehmen, sollte man sich generell angewöhnen.
[*] Wenn ich nichts übersehen habe, dann dient die Umdefinierung von [tt]\chapter[/tt] im Anhang dazu, die Kapitelüberschriften dort von hinten durch die Brust mit dem Präfix [tt]Anhang[/tt] zu versehen. Das kann KOMA-Script in mehrfacher Hinsicht besser. So wie es ist, ist es in mehrfacher Hinsicht Pfusch.
[*] Es gibt bei KOMA-Script bessere Möglichkeiten [tt]\suppressfloats[/tt] bei jedem [tt]\section[/tt] auszuführen. Das Paket [ctan]placeins[/ctan] bietet übrigens selbst eine Möglichkeit, die aber auch nur funktioniert, solange man danach keine Änderung an [tt]\section[/tt] über [tt]\RedeclareSectionCommand[/tt] vornimmt.
[/list]
Wer nun denkt, ich habe hier übertrieben, dem sei erwähnt, dass ich in der Stunde, die ich für obige Zusammenfassung benötigt habe, noch nicht einmal gründlich alles angeschaut habe. Was ich aber gerne zugebe ist, dass ich die Stunde vermutlich teilweise verschwendet habe, weil voraussichtlich die wenigsten dieser Hinweise auf fruchtbaren fallen und wir auch künftig von vielen der kritisierten Punkte nicht verschont bleiben werden. Wie ich darauf komme? Wir sehen das meiste davon leider nicht zum ersten Mal. Es wird immer wieder teilweise weit ausführlicher kritisiert und sogar explizit erklärt, wie man es besser macht.