Ich möchte ein eigenes Paket schreiben, das einen \affidavit
Befehl bereitstellt, der einen Standardtext in zwei Sprachen (Deutsch und Englisch) erzeugt.
Minimales funktionierendes Beispiel dieses Pakets:
\def\fileversion{0.1}
\def\filedate{2014/12/10}
\NeedsTeXFormat{LaTeX2e}
\RequirePackage[ngerman,english]{babel}
\ProvidesPackage{myaffidavit}
[\filedate\space\fileversion\space
My affidavit package]
\newcommand{\affidavit}{
\begin{otherlanguage}{ngerman}
This text will be in german stating some standard information (juristic)...
It should use correct hyphenation for german texts.
\end{otherlanguage}
\begin{otherlanguage}{english}
This text will be in english stating the same information as the german one above...
Of course this should automatically use correct hyphenation for english texts.
\end{otherlanguage}
}
Da ich keine Kontrolle darüber habe, wie meine Benutzer mit meinem Paket arbeiten, könnte mancher Benutzer versuchen, das folgende minimale Arbeitsbeispiel eines Latex-Dokuments zu verwenden:
\documentclass{article}
\usepackage[ngerman]{babel}
\usepackage{myaffidavit}
\begin{document}
Hallo Welt!
\affidavit
\end{document}
Was zu diesem Fehler führt:LaTeX Error: Option clash for package babel
Meine Frage ist:
Wie kann ich ein Paket schreiben, das Text in verschiedenen Sprachen ausgibt (unter Verwendung korrekter Silbentrennung), ohne die Benutzer meines Pakets auf die in meinem Paket geladenen Sprachen zu beschränken?Und natürlich könnte ich, wenn mein Benutzer Babel und mein Paket umgekehrt lädt, weder Deutsch noch Englisch in meinem Paket verwenden, wenn der Benutzer diese Sprachen nicht auch in seinem Latex-Dokument angegeben hat. (Und es würde einen Optionskonflikt geben, wenn mein Paket versuchen würde, zusätzliche Sprachen zu laden, nachdem Babel bereits vom Benutzer im Hauptdokument geladen wurde.)
Präziser sein:Der Punkt ist, wenn ich die Sprachen, die mein Paket verwenden soll, in meinem Paket mithilfe der Paketoptionen für Babel wie folgt angebe \RequirePackage[ngerman,english]{babel}
, verursacht mein Paket höchstwahrscheinlich einen Optionenkonflikt, wenn der Benutzer meines Pakets auch das Babel-Paket lädt.
Aber:Wenn der Benutzer meines Pakets die Sprache, die er verwenden möchte, als Klassenoption angibt (wie in den Kommentaren vorgeschlagen), dann würde es immer noch zu einem „Optionskonflikt“ (sozusagen) kommen, da beim ersten Laden von Babel im Dokument immer noch angegeben wird, welche Sprachdefinitionen geladen werden (die als Klassenoptionen angegebenen). Und die Verwendung des \myaffidavit
Befehls führt dann zu Fehlern, da versucht wird, Sprachen zu verwenden, die nicht definiert/geladen sind.
Ich schreibe ein Paket und möchte den Benutzer nicht zwingen, auch beim Laden von Babel die in meinem Paket verwendeten Sprachen anzugeben. Ich möchte, dass es transparent ist. Angenommen, mein Benutzer möchte auf Italienisch schreiben und lädt Babel daher mit der italienischen Sprachoption. Wenn er sie beim Laden von Babel als Option angibt, \usepackage[italian]{babel}
kommt es zu einem Optionskonflikt. Wenn er Italienisch als Klassenoption angibt, kommt es nicht zu einem Optionskonflikt, aber die Standardsprache wird nicht mehr Italienisch sein, wenn er auch mein Affidavit-Paket lädt.Das ist nicht transparent! Und ich möchte nicht, dass mein Paket so aufdringlich ist.
Antwort1
Hier ist etwas, womit Sie spielen können:
\documentclass[12pt]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[paperwidth=9cm, paperheight=10cm, showframe]{geometry}
\parindent 0pt%
%\usepackage[american, british]{babel}
%\usepackage{datetime}
\def\germtoday{% Example format: Date Month Year
\number\day\space
\ifcase\month\or
Januar%
\or Februar%
\or März%
\or April%
\or Mai%
\or Juni%
\or Juli%
\or August%
\or September%
\or Oktober%
\or November%
\or Dezember%
\fi
\space\number\year}
\newcommand\germanaffidavit{
\begingroup
\language=31%
The language is \the\language. {\germtoday}
% \showhyphens{% Useful to test how words are being hyphenated
This text will be in Language stating the same information as the
Language one above. Of course this should automatically use
correct hyphenation for Language texts.
% }
\endgroup}
\newcommand\englishaffidavit{%
\begingroup
\language=0
The language is \the\language. \today
% \showhyphens{%
This text will be in Language stating the same information as the
Language one above. Of course this should automatically use
correct hyphenation for Language texts.
% }
\endgroup}
\newcommand\affidavit{\germanaffidavit\newpage\englishaffidavit}
\begin{document}
The language is \the\language
This text will be in Language stating the same information as the
Language one above. Of course this should automatically use
correct hyphenation for Language texts.
\newpage
\affidavit
\newpage
The language is \the\language
This text will be in Language stating the same information as the
Language one above. Of course this should automatically use
correct hyphenation for Language texts.
\end{document}
Bemerkungen
Beim Ausschalten
babel
zweimal kompilieren um die Fehlermeldung loszuwerden.Ich würde eher einen benutzerdefinierten Datumsbefehl verwenden, um die Abhängigkeit von anderen Paketen zu vermeiden, um es „richtig“ zu machen. Was ich hier vorgeschlagen habe, soll die Möglichkeiten veranschaulichen und ist nicht endgültig oder gar standardkonform.
Entfernen Sie die Kommentarzeichen aus dem
\showhyphens
Befehl, um zu prüfen, ob TeX die Silbentrennung richtig vornimmt (beachten Sie, dass die Ausgabe im.log
) gedruckt wird.
Antwort2
Ich bin kürzlich über diese Frage gestolpert, da ich genau das gleiche Problem hatte, die hier gegebene Lösung mich jedoch nicht zufriedenstellte. Daher werde ich versuchen, die Lösung zu erklären, die ich gefunden habe, in der Hoffnung, dass sie für andere Leute, die nach dem Gleichen suchen, hilfreich sein wird.
Der Punkt ist, dass wir die Babel-Übersetzung für eine Sprache spezialisieren möchten, aber nicht verbieten möchten, alle anderen Sprachen zu laden, die wir nicht spezialisiert haben. Dies könnte nur dann erfolgen, wenn Sie die Übersetzung neu definierennachdas babel
Paket ist geladen und die Sprache(n) wurden ausgewählt. Das Problem ist jedoch, dass Sie es aus einer .cls
oder einer .sty
Datei neu definieren. Daher habe ich das \AtBeginDocument{}
Makro in Kombination mit einem Test verwendet, ob das babel
Paket vorhanden ist (oder nicht). Ich habe diesen Trick in der akletter
Klasse gefunden. Hier ist der endgültige Code (Neudefinition des Namens des Inhaltsverzeichnisabschnitts für die französische Übersetzung):
\AtBeginDocument{%
\@ifpackageloaded{babel}{%
%%% French
\addto{\extrasfrench}{%
\def\frenchcontentsname{Sommaire}%
}
}{}
}
Beachten Sie auch, dass ich „Saber“ nicht verwendet habe \captionsfrench
, \extrasfrench
um den Sprachwähler zu umgehen, wenn eine Sprache ausgewählt wird und das Dokument mehrsprachig ist.
Nun, ich hoffe, das hilft! Kommentare, falls etwas an diesem Code verbessert werden könnte, sind willkommen.
Antwort3
Wenn Sie mit bestimmten Optionen laden , muss babel
jeder, der andere Optionen übergeben möchte, einen Befehl wie diesen aufrufen:babel
\PassOptionsToPackage{italian}{babel}
bevor Sie Ihr Paket anfordern. Sie können dies in das Handbuch schreiben, und dann ist es nicht Ihre Schuld, wenn sie es nicht lesen.
Alternativ können Sie das Paket ohne bestimmte Optionen anfordern und Ihre Sprachen mit hinzufügen \babelprovide
. Dies ist nicht die empfohlene Methode zum Laden von Deutsch oder Englisch, sollte aber funktionieren und einen Optionskonflikt vermeiden, wenn der Benutzer babel
vor Ihrem Paket lädt.
Wenn Ihr Paket das Laden entweder davor oder danach unterstützen muss babel
, müssen Sie das Laden babel
und alle davon abhängigen Befehle mindestens bis verschieben \AtEndPreamble
und dann die gesamte Konfiguration ohne Paketoptionen durchführen.