Meine Frage ist:

Meine Frage ist:

Ich möchte ein eigenes Paket schreiben, das einen \affidavitBefehl 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 \myaffidavitBefehls 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 babelzweimal 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 \showhyphensBefehl, 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 babelPaket ist geladen und die Sprache(n) wurden ausgewählt. Das Problem ist jedoch, dass Sie es aus einer .clsoder einer .styDatei neu definieren. Daher habe ich das \AtBeginDocument{}Makro in Kombination mit einem Test verwendet, ob das babelPaket vorhanden ist (oder nicht). Ich habe diesen Trick in der akletterKlasse 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, \extrasfrenchum 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 babeljeder, 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 babelvor Ihrem Paket lädt.

Wenn Ihr Paket das Laden entweder davor oder danach unterstützen muss babel, müssen Sie das Laden babelund alle davon abhängigen Befehle mindestens bis verschieben \AtEndPreambleund dann die gesamte Konfiguration ohne Paketoptionen durchführen.

verwandte Informationen