Konflikt mit der Option „Englisch“ in benutzerdefinierter Klasse und „Babel“

Konflikt mit der Option „Englisch“ in benutzerdefinierter Klasse und „Babel“

Ich schreibe eine Klassendatei, die eine Option annimmt und dann die Klasse englishlädt . Die in der neuen Klasse definierte OptionarticleenglishIstnichtweitergereicht an article. Wenn ich dann jedoch babelmit Option lade USenglish, dann bekomme ich die Warnung

Package Babel Warning: The package option `english' should not be used
(Babel)                with a more specific one (like `USenglish')

als ob englishes an die articleKlasse weitergegeben worden wäre.

So übergebe ich die Optionen an meine Klasse:

\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{myclass}[2020/11/07 myclass template]

\newif\ifEnglish\Englishfalse

\DeclareOption{english}{\Englishtrue}
\DeclareOption*{\ClassWarning{myclass}{Unknown option `\CurrentOption'}}
\ProcessOptions\relax

\LoadClass[10pt, a4paper, oneside]{article}

Der Code

\documentclass[english]{myclass}
\usepackage[USenglish]{babel}

erzeugt die babelobige Warnung. Wie kann ich das beheben?

Mir ist bewusst, dass eine Warnung kein Fehler ist, aber (1) ich möchte sicherstellen, dass der Umfang der englishvon mir definierten Option auf beschränkt ist myclassund nicht von geerbt wird article, (2) ich hätte wirklich gern eine Vorlage ohne Warnungen und (3) ich möchte so wenig Pakete wie möglich laden (deshalb möchte ich einen Aufruf silencenur hierfür vermeiden).

Antwort1

Meinen Kommentar in eine Antwort umwandeln.

LaTeX verwaltet eine Liste globaler Optionen (diese wird genannt \@classoptionslist), die die an übergebenen Optionen enthält \documentclass. Diese Optionen werden standardmäßig an jedes Paket weitergeleitet, das danach geladen wird \documentclass(dies hängt von der in den verschiedenen Paketen verwendeten Schnittstelle ab; die Standardschnittstelle von LaTeX übernimmt die globalen Optionen, aber Pakete wie oder pgfoptsbieten Mechanismen, um nur die lokale Optionsliste zu übergeben).l3keys2eexpkv-opt

Sie können Optionen entfernen, \@classoptionslistindem Sie das LaTeX-Makro verwenden, \@removeelementdas drei Argumente annimmt: das zu entfernende Element, die vollständige Liste und das Makro, in dem die gefilterte Liste gespeichert werden soll.

Mit diesem Wissen können Sie Ihre Klassendatei ändern, um

\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{myclass}[2020/11/07 myclass template]

\newif\ifEnglish\Englishfalse

\DeclareOption{english}
  {%
    \Englishtrue
    \@expandtwoargs\@removeelement{english}\@classoptionslist\@classoptionslist
  }
\DeclareOption*{\ClassWarning{myclass}{Unknown option `\CurrentOption'}}
\ProcessOptions\relax

\LoadClass[10pt, a4paper, oneside]{article}

englishwodurch es aus der Liste der globalen Optionen entfernt wird .


Wie jedoch andere bereits angemerkt haben (danke @moewe), ist es möglicherweise eine bessere Idee, entweder mit zusammenzuarbeiten babeloder andere Namen zu verwenden. Aus diesem Grund wird im Folgenden vorgeschlagen, für Ihre Vorlagensprache eine Schlüssel=Wert-Option mit einem eindeutigen Optionsnamen zu verwenden (bei dem Konflikte viel seltener auftreten). Ich verwende hierfür, aber dasselbe könnte auch mit mit , oder und , oder , oder ... expkv-opterreicht werden (es gibt viele Schlüssel=Wert-Lösungen).pgfkeyspgfoptsl3keysl3keys2ekvoptions

Die folgenden Geräte englishund germanOptionen stehen für zur Verfügung template-language.

myclass.cls:

\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{myclass}[2020/11/07 myclass template]

\RequirePackage{expkv-opt, expkv-def}
\ekvdefinekeys{myclass}
  {
    choice template-language =
      {
        ,english = \Englishtrue  \Germanfalse
        ,german  = \Englishfalse \Germantrue
      }
  }

\newif\ifEnglish\Englishfalse
\newif\ifGerman\Germanfalse

\ekvoProcessGlobalOptions{myclass}
\ekvoProcessLocalOptions {myclass}

\LoadClass[10pt, a4paper, oneside]{article}

Dokumentieren:

\documentclass[template-language=english]{myclass}

\usepackage[USenglish]{babel}

\begin{document}
\ifEnglish English \fi
\ifGerman Deutscher \fi
Test
\end{document}

Bildbeschreibung hier eingeben

Antwort2

Dies hängt von der genauen Art Ihrer Vorlage und der von Ihrer Vorlage bereitgestellten Lokalisierung ab, aber für eine bestimmte Klasse von Lokalisierungsfunktionen wäre es wahrscheinlich am besten, wenn Ihre Vorlage einfach auf die vom Benutzer über babel(und möglicherweise polyglossia) eingestellte Sprache reagieren könnte.

Leider gibt es derzeit zwei Systeme zur Lokalisierung von Dokumenten in LaTeX, babelund polyglossia. Die beiden haben in einigen Bereichen leicht unterschiedliche Ansätze und keine einheitliche Schnittstelle. Vor nicht allzu langer Zeit gab es den Versuch, babeläquivalente Funktionen in anzubieten polyglossia, um Entwicklern das Schreiben von lokalisierungsfähigen Paketen zu erleichtern, aber man muss immer noch unterschiedlichen Code für babelund schreiben polyglossia.

Für einfache Übersetzungen von Zeichenfolgen babelkönnen Sie beispielsweise Folgendes tun.

\begin{filecontents}[overwrite]{myclass.cls}
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{myclass}[2020/11/07 myclass template]

\RequirePackage{etoolbox}

\newcommand*{\rabbit}{\textbf{??? rabbit is missing a translation}}

\AtBeginDocument{%
  \appto\captionsenglish{%
    \renewcommand{\rabbit}{rabbit}%
  }%
  \appto\captionsUSenglish{%
    \renewcommand{\rabbit}{rabbit}%
  }%
  \appto\captionsgerman{%
    \renewcommand{\rabbit}{Hase}%
  }%
  \appto\captionsngerman{%
    \renewcommand{\rabbit}{Hase}%
  }%
}

\LoadClass[10pt, a4paper, oneside]{article}
\end{filecontents}

\documentclass{myclass}

\usepackage[USenglish]{babel}

\begin{document}
Ohh, \rabbit!
\end{document}

Sie definieren einfach ein neues Makro für Ihren String und verwenden dann , \apptoum die Übersetzung für die Sprache <language>in einzufügen \captions<language>. (Dies geschieht in einem \AtBeginDocumentHook, um sicherzustellen, dass die \captions<language>Makros bereits vorhanden sind und unsere Änderungen nicht überschrieben werden. Das richtige Timing hinzubekommen, kann etwas mühsam sein.)

Pakete wietracklang,iflang,translatorUndtranslationskann Ihnen hierbei ebenfalls behilflich sein.

verwandte Informationen