Choque con la opción "inglés" en clase personalizada y "babel"

Choque con la opción "inglés" en clase personalizada y "babel"

Estoy escribiendo un archivo de clase que toma una opción englishy luego carga la articleclase. La englishopción definida en la nueva clase.esnopasó a article. Sin embargo, si cargo babelcon la opción USenglish, aparece la advertencia

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

como si englishhubiera sido pasado a la articleclase.

Así es como paso las opciones a mi clase:

\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}

El código

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

produce la babeladvertencia anterior. ¿Cómo puedo arreglar esto?

Entiendo que una advertencia no es un error, pero (1) quiero asegurarme de que el alcance de la englishopción que defino esté limitado myclassy no sea heredado por article, (2) Realmente me gustaría tener una plantilla sin advertencias y (3) me gustaría cargar la menor cantidad de paquetes posible (por lo tanto, me gustaría evitar invocarlos silencesolo para esto).

Respuesta1

Convirtiendo mi comentario en una respuesta.

LaTeX mantiene una lista de opciones globales (llamada \@classoptionslist) que contiene las opciones pasadas a \documentclass. Estas opciones se reenvían de forma predeterminada a cada paquete que se carga después \documentclass(esto depende de la interfaz utilizada en los diferentes paquetes, la interfaz LaTeX estándar recoge las opciones globales, pero paquetes como pgfopts, l3keys2eo expkv-optproporcionan mecanismos para pasar solo la lista de opciones locales ).

Puede eliminar opciones \@classoptionslistutilizando la macro LaTeX \@removeelementque toma tres argumentos, el elemento que debe eliminarse, la lista completa y la macro en la que debe almacenarse la lista filtrada.

Con este conocimiento, puede modificar su archivo de clase para usarlo

\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}

lo que eliminaría englishde la lista de opciones globales.


Sin embargo, como otros han señalado (gracias @moewe), podría ser una mejor idea cooperar con babelo usar nombres diferentes. Por eso, lo siguiente sugiere utilizar una opción clave=valor con un nombre de opción distinto (que es mucho menos probable que entre en conflicto) para el idioma de sus plantillas. Lo uso expkv-optpara esto, pero también se podría lograr lo mismo usando pgfkeyswith pgfopts, or l3keysand l3keys2e, or kvoptions, or.... (existen muchas soluciones clave=valor).

Los siguientes implementos englishy germanopciones para 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}

Documento:

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

\usepackage[USenglish]{babel}

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

ingrese la descripción de la imagen aquí

Respuesta2

Dependerá de la naturaleza exacta de su plantilla y de la localización que proporcione, pero para una determinada clase de funciones de localización probablemente sería mejor si su plantilla pudiera simplemente reaccionar al idioma establecido por el usuario a través de babel(y posiblemente polyglossia).

Desafortunadamente, actualmente existen dos sistemas para la localización de documentos en LaTeX babely polyglossia. Los dos tienen enfoques ligeramente diferentes en algunas áreas y no tienen una interfaz unificada. No hace mucho se hizo un esfuerzo por ofrecer babelcaracterísticas equivalentes a polyglossiapara facilitar a los desarrolladores la escritura de paquetes compatibles con la configuración regional, pero todavía hay que escribir código diferente para babely polyglossia.

Para traducciones simples de cadenas, babelpuede hacer algo como lo siguiente.

\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}

Simplemente define una nueva macro para su cadena y luego la usa \apptopara inyectar su traducción para el <language>idioma \captions<language>. (Esto se hace en un \AtBeginDocumentgancho para garantizar que las \captions<language>macros ya existan y que nuestros cambios no se sobrescriban. Obtener el momento adecuado puede ser un poco complicado).

Paquetes comotracklang,iflang,translatorytranslationsTambién te puedo ayudar con esto.

información relacionada