Estoy escribiendo un archivo de clase que toma una opción english
y luego carga la article
clase. La english
opción definida en la nueva clase.esnopasó a article
. Sin embargo, si cargo babel
con 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 english
hubiera sido pasado a la article
clase.
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 babel
advertencia anterior.
¿Cómo puedo arreglar esto?
Entiendo que una advertencia no es un error, pero (1) quiero asegurarme de que el alcance de la english
opción que defino esté limitado myclass
y 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 silence
solo 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
, l3keys2e
o expkv-opt
proporcionan mecanismos para pasar solo la lista de opciones locales ).
Puede eliminar opciones \@classoptionslist
utilizando la macro LaTeX \@removeelement
que 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 english
de la lista de opciones globales.
Sin embargo, como otros han señalado (gracias @moewe), podría ser una mejor idea cooperar con babel
o 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-opt
para esto, pero también se podría lograr lo mismo usando pgfkeys
with pgfopts
, or l3keys
and l3keys2e
, or kvoptions
, or.... (existen muchas soluciones clave=valor).
Los siguientes implementos english
y german
opciones 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}
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 babel
y 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 babel
características equivalentes a polyglossia
para facilitar a los desarrolladores la escritura de paquetes compatibles con la configuración regional, pero todavía hay que escribir código diferente para babel
y polyglossia
.
Para traducciones simples de cadenas, babel
puede 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 \appto
para inyectar su traducción para el <language>
idioma \captions<language>
. (Esto se hace en un \AtBeginDocument
gancho 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
,translator
ytranslations
También te puedo ayudar con esto.