PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Warnung beim Koma-Script mit babel und french



Magger
19-09-2011, 21:51
Hallo,

bei folgendem Minimalbeispiel:



\documentclass{scrartcl}

\usepackage[french,ngerman]{babel}
\usepackage[latin9]{inputenc}
\usepackage[T1]{fontenc}

\begin{document}

SI-System: \foreignlanguage{french}{Système International d'Unités}

\end{document}


bekomme ich folgende Warnung:



Package frenchb.ldf Warning: The definition of \@makecaption has been changed,
(frenchb.ldf) frenchb will NOT customise it;
(frenchb.ldf) reported on input line 10.


Was möchte mir die Warnung sagen? Wodurch kommt sie zustande? (Wenn man article verwendet, oder french weglässt, verschwindet die Warnung). Kann man die Warnung getrost ignorieren?

PS: Ich verwende MiKTeX 2.7/2.8/2.9 unter Windows XP Professional.

localghost
19-09-2011, 22:40
Offensichtlich reagiert babel (http://ctan.org/pkg/babel) mit dieser Sprachoption allergisch auf die Klassen von KOMA Script (http://ctan.org/pkg/koma-script). Denn die machen einiges anders als die Standard-Klassen. Und hier trifft es halt den Befehl \caption, genauer gesagt das Hilfs-Macro \@makecaption. Seine Form entspricht nicht den Erwartungen von babel (http://ctan.org/pkg/babel).


Thorsten

Schweinebacke
20-09-2011, 07:52
frenchb.ldf reagiert auf alles allergisch, was nicht Standardklasse ist:
\documentclass{article}

\usepackage{caption}
\usepackage[french,ngerman]{babel}
\usepackage[latin9]{inputenc}
\usepackage[T1]{fontenc}

\begin{document}

SI-System: \foreignlanguage{french}{Système International d'Unités}

\end{document} Es ist an der Stelle schlicht dumm. Bei KOMA-Script könnte es übrigens einfach \captionformat umdefinieren, um sein Ziel zu erreichen (ungetestet):

\renewcommand*{\captionformat}{\CaptionSeparator} Die Warnung verschwindet dadurch natürlich nicht. Genau für solche Dinge gibt es diese Schnittstelle in KOMA-Script aber. Laut Doku wurde die schon in der Frühphase von KOMA-Script für CJK eingeführt.

sommerfee
20-09-2011, 09:19
So herum geht es ohne Warnung:



\documentclass{article}

\usepackage[french,ngerman]{babel}
\usepackage[latin9]{inputenc}
\usepackage[T1]{fontenc}

\usepackage{caption}

\begin{document}

SI-System: \foreignlanguage{french}{Système International d'Unités}

\end{document}


Das funktioniert aber auch nur deswegen ohne Warnung und mit dem zu erwartenden Ergebnis, weil das caption-Paket explizit an die french-babel-Option angepasst ist. (Siehe auch Anleitung zum caption-Paket.)


Es ist an der Stelle schlicht dumm.

In der Tat.


Genau für solche Dinge gibt es diese Schnittstelle in KOMA-Script aber. Laut Doku wurde die schon in der Frühphase von KOMA-Script für CJK eingeführt.

Das caption-Paket gibt es auch schon seit 1994. Aber es ist sowieso völlig egal, welche Schnittstellen es schon wie lange gibt, der Löwenanteil der Pakete hat sowieso seine eigene Lösung, die in der Regel nur mit den Standardklassen wie gewünscht funktioniert.

u_fischer
20-09-2011, 10:49
Es ist an der Stelle schlicht dumm.

Wieso dumm? frenchb ändert normalerweise die \caption-Definition. Es unterlässt dies, wenn es erkennt, dass die Standarddefinition bereits vorher geändert wurde, weil es davon ausgeht, dass der Benutzer ja wohl die wusste was er tat und die Definition haben will. Ich nenne das nicht dumm, sondern rücksichtsvoll.

Wenn man die \caption-Definition von KOMA (oder caption) haben will, kann man die Warnung ignorieren. Wenn man unbedingt die frenchb-Definition haben will, kann man die \caption-Definition zurücksetzen:


\documentclass{scrartcl}

\usepackage[french,ngerman]{babel}
\makeatletter
\let\@makecaption\STD@makecaption
\makeatother
\usepackage[latin9]{inputenc}
\usepackage[T1]{fontenc}

\begin{document}

SI-System: \foreignlanguage{french}{Système International d'Unités}

\end{document}

Schweinebacke
20-09-2011, 16:40
Dumm ist frenchb.ldf insofern als es nur eine einzige Definition von \@makecaption kennt, nämlich die der Standardklassen. Immerhin ist es klüger implementiert als das frühere french-Paket und das damit verteilte french.ldf. Das hat nämlich keinerlei Sicherheitstests durchgeführt und beispielsweise \opening hart umdefiniert. Im KOMA-Script-Buch gibt es noch heute Hinweise auf Probleme mit diesem Paket und dass man bei früheren Versionen von babel deshalb eine andere französisch-Option als french verwenden sollte.

Auf die frenchb.ldf-Definition umzuschalten würde ich übrigens nicht unbedingt empfehlen. Damit funktionieren dann nämlich KOMA-Script-Erweiterungen von \@makecaption nicht mehr. Ich würde eher empfehlen, die Warnung zu ignorieren und die von mir gezeigte Umdefinierung von \captionformat zu verwenden. Dann funktionieren sowohl die KOMA-Script-Erweiterungen als auch die frenchb.ldf-Erweiterung, die letztlich nur darin besteht, bei französisch den Doppelpunkt zu ersetzen:
\documentclass{scrartcl}
% \KOMAoptions{captions=nooneline}% Ruhig mal ausprobieren
\usepackage[french,ngerman]{babel}
\usepackage[latin9]{inputenc}
\usepackage[T1]{fontenc}

\renewcommand*{\captionformat}{\CaptionSeparator}

\begin{document}

\begin{figure}
\caption{SI-System}
\end{figure}

\selectlanguage{french}
\begin{figure}
\caption{Système International d'Unités}
\end{figure}

\end{document}

Magger
20-09-2011, 22:14
@sommerfee:

Wenn ich statt article aber scrartcl wie in



\documentclass{scrartcl}

\usepackage[french,ngerman]{babel}
\usepackage[latin9]{inputenc}
\usepackage[T1]{fontenc}

\usepackage{caption}

\begin{document}

SI-System: \foreignlanguage{french}{Système International d'Unités}

\end{document}


verwende, bekomme ich trotzdem die Warnung angezeigt.

Ulrikes Lösung hilft mir wie immer weiter, auch wenn ich sie nicht wirklich verstehe.

Ich möchte ja auch gar keine Überschriften oder Bildbeschriftungen in französisch haben, sondern nur einzelne Wörter.

sommerfee
21-09-2011, 06:10
Wenn ich statt article aber scrartcl wie in
verwende, bekomme ich trotzdem die Warnung angezeigt.

Ja, und das soll auch so.

Das Problem an dieser Stelle ist, daß bei der Verwendung von article die Sache klar ist: Ich ziehe den Änderungswunsch des frenchb-Paketes bei mir nach, so daß man mit caption-Paket das gleiche Resultat hat wie ohne, solange man nicht explizit über das caption-Paket andere Optionen für den Trenner setzt. Also kann ich es mir an dieser Stelle erlauben, die Warnung des frenchb-Paketes zu unterdrücken.

Wird aber KOMA-Script geladen, stelle ich die Standardeinstellungen beim caption-Paket so um, daß die KOMA-Einstellungen verwendet werden, solange nicht explizit andere Optionen gesetzt sind. Was soll ich aber machen, wenn frenchb geladen wird? Dann gibt es im Gegensatz zu article/report/book nun ganze drei (statt zwei) Möglichkeiten, die caption-Einstellungen zu ändern. Ich muß mich in diesem Falle für eines von beiden entscheiden, KOMA oder frenchb, denn ich kann meine Standardeinstellungen nur auf eines von beiden mappen. Ich entscheide mich in diesem Falle für KOMA. Damit lasse ich aber den Änderungswunsch des frenchb-Paketes unter den Tisch fallen, und damit ist die Warnung leider richtig. (Und das erzielte Ergebnis wiederum identisch, mit oder ohne caption-Paket.)

Lösen könnte man dieses Problem wirklich nur, indem entweder KOMA-Script an das frenchb-Paket angepasst wird, oder andersherum (was ich besser fände). Dann würde beim Laden des caption-Paketes die Standardbelegung der Optionen auf die KOMA-Einstellungen gemappt werden, und die KOMA-Einstellungen wiederum auf diejenigen des frenchb-Paketes.

u_fischer
21-09-2011, 09:04
Ich möchte ja auch gar keine Überschriften oder Bildbeschriftungen in französisch haben, sondern nur einzelne Wörter.

Dann ist es doch völlig ok, dass french die \captions in Ruhe lässt. Normalerweise hat man eher das umgekehrte Problem: Das french Dinge ändert, obwohl es überhaupt nicht die Hauptsprache ist.

Betrachte die Warnung einfach als Information. (Eine Menge "Warnungen" sind eigentlich schlichte Informationen, aber es fehlt dafür ein \PackageInfo-Befehl, also werden sie mit \PackageWarning ausgegeben. Mit expl3 ändert sich das.)

Magger
21-09-2011, 12:30
@Ulrike: Danke für deine Erklärung, jetzt verstehe ich es. Ich benutze deine Befehle trotzdem, um die Warnung zu unterdrücken.

Offtopic an:

Ich will mal den Hintergrund erklären: Wir arbeiten hier mit mehreren Leuten an verschiedenen, teils wissenschaftlich, teils technischen Berichten. Weil das mit Office-Paketen nicht zufriedenstellend möglich ist, haben wir uns irgendwann mal für LaTeX und ein Versionskontrollsystem entschieden.

Ich bin aber der einzige, der sich so einigermaßen auskennt, und für die Präambel verantwortlich ist. Ich erstelle dann für den Kontext sinnvolle Befehle und Umgebungen, damit man das machen wann, wozu LaTeX am besten ist: Inhalt und Darstellung zu trennen. Die meisten anderen sind reine "Anwender", deren LaTeX-Verständnis mit den Fähigkeiten des TeXnicCenter übereinstimmt.

Damit am Ende ein brauchbarer Quelltext entsteht, habe ich den Leuten eingebläut, penibel darauf zu achten, dass nach dreimaligem Kompilieren keine Fehler und auch keine Warnungen auftreten. Das ist zwar keine hinreichende, aber zumindest eine notwendige Bedingung für einen fehlerfreien Quelltext und ein gutes Endergebnis.

Deshalb bin auch ich immer darauf bedacht, eine Praämbel zu haben, die von sich aus schon mal keine Warnungen produziert.

Trotzdem gibt es immer wieder Fälle, in denen das ohne wirkliche Expertenkenntnisse scheinbar nicht möglich ist, und das ist halt ein bisschen schade.

Offtopic aus.

Schweinebacke
21-09-2011, 13:16
aber es fehlt dafür ein \PackageInfo-Befehl
Dein Einwand verstehe ich nicht. LaTeX bietet doch bereits einen Befehl \PackageInfo. Paket scrbase stellt übrigens auch \PackageInfoNoLine bereit.

Schweinebacke
21-09-2011, 13:35
Damit am Ende ein brauchbarer Quelltext entsteht, habe ich den Leuten eingebläut, penibel darauf zu achten, dass nach dreimaligem Kompilieren keine Fehler und auch keine Warnungen auftreten. Das ist zwar keine hinreichende, aber zumindest eine notwendige Bedingung für einen fehlerfreien Quelltext und ein gutes Endergebnis.

Deshalb bin auch ich immer darauf bedacht, eine Praämbel zu haben, die von sich aus schon mal keine Warnungen produziert.
Wenn es nur darum geht, die Warnung auch noch los zu werden:
\documentclass{scrartcl}
%\KOMAoptions{captions=nooneline}% KOMA-Script-Funktionstest
\usepackage[french,ngerman]{babel}
\usepackage[latin9]{inputenc}
\usepackage[T1]{fontenc}

% Warnung von frenchb.ldf unterdrücken, ohne Funktionalität von KOMA-Script
% zu verlieren
\makeatletter
\let\FB@makecaption\@makecaption
\let\STD@makecaption\@makecaption
\makeatother
% Funktionalität von frenchb.ldf zu KOMA-Script hinzufügen
\renewcommand*{\captionformat}{\CaptionSeparator}

\begin{document}

\begin{figure}
\caption{SI-System}
\end{figure}

\selectlanguage{french}
\begin{figure}
\caption{Système International d'Unités}
\end{figure}

\end{document}
Mit der Lösung hat man die Warnung von frenchb.ldf nicht mehr und trotzdem die \@makecaption-Funktionalität sowohl von KOMA-Script als auch von frenchb.ldf.

Trotzdem: Warnung sind nur Warnungen und keine Fehler. Per Warnung werden Informationen ausgegeben, bei denen der Anwender selbst entscheiden kann, was richtig ist und was nicht. Ein komplexes Dokument ganz ohne Warnungen dürfte eher die Ausnahme als die Regel sein.

u_fischer
21-09-2011, 14:43
Ich benutze deine Befehle trotzdem, um die Warnung zu unterdrücken.

Meine Befehle unterdrücken nicht einfach eine Warnung. Sie ändern das Verhalten des Dokuments/der \caption. Benutze sie also nur, wenn du das Verhalten auch willst. Ansonsten lerne mit Warnungen/Meldungen zu leben.


Dein Einwand verstehe ich nicht. LaTeX bietet doch bereits einen Befehl \PackageInfo.

Ich weiß jetzt auch nicht mehr, was ich da eigentlich im Kopf hatte.