Quiero escribir mi propio paquete que proporcione un \affidavit
comando que produzca texto estándar en dos idiomas (alemán e inglés).
Ejemplo de trabajo mínimo de este paquete:
\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}
}
Como no controlo cómo trabajan mis usuarios con mi paquete, algunos usuarios podrían intentar utilizar el siguiente ejemplo de trabajo mínimo de un documento de látex:
\documentclass{article}
\usepackage[ngerman]{babel}
\usepackage{myaffidavit}
\begin{document}
Hallo Welt!
\affidavit
\end{document}
Lo que resulta en este error:LaTeX Error: Option clash for package babel
Mi pregunta es:
¿Cómo puedo escribir un paquete que genere texto en diferentes idiomas (usando la separación de palabras correcta) sin restringir al usuario de mi paquete a los idiomas cargados en mi paquete?Y, por supuesto, si mi usuario carga babel y mi paquete al revés, no podría usar alemán o inglés en mi paquete, si el usuario no especifica estos idiomas en su documento de látex también. (Y habría un conflicto de opciones si mi paquete intentara cargar idiomas adicionales después de que el usuario ya hubiera cargado babel en el documento principal)
Ser más preciso:El punto es que, cuando especifico los idiomas que mi paquete va a usar dentro de mi paquete usando las opciones de paquete para babel de esta manera \RequirePackage[ngerman,english]{babel}
, lo más probable es que mi paquete produzca un conflicto de opciones cuando el usuario de mi paquete también carga el paquete de babel.
Pero:Si el usuario de mi paquete especifica el idioma que quiere usar como opción de clase (como se sugiere en los comentarios), entonces todavía habría un "choque de opciones" (más o menos), porque la primera carga de babel dentro del documento aún especifica qué definiciones de idioma se están cargando (las especificadas como opciones de clase). Y el uso del \myaffidavit
comando produce errores, porque intenta utilizar idiomas que no están definidos/cargados.
Estoy escribiendo un paquete y no quiero obligar al usuario a especificar los idiomas utilizados dentro de mi paquete, ni siquiera cuando está cargando Babel. Quiero que sea transparente. Digamos que mi usuario quiere escribir en italiano, por lo que está cargando babel con la opción de idioma italiano. Si lo especifica como una opción al cargar babel con\usepackage[italian]{babel}
hay un conflicto de opciones. Cuando especifica italiano como una opción de clase, no hay conflicto de opciones, pero el idioma predeterminado ya no será italiano cuando también carga mi paquete de declaración jurada.¡Eso no es transparente! Y no quiero que mi paquete sea tan intrusivo.
Respuesta1
Aquí tienes algo con lo que puedes jugar:
\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}
Observaciones
Al apagar
babel
, compile dos veces para deshacerse del mensaje de error.Me inclinaría a utilizar un comando de fecha personalizado para evitar la dependencia de otros paquetes para hacerlo "bien"; Lo que sugerí aquí pretende ser ilustrativo de las posibilidades, no definitivo ni siquiera compatible con los estándares.
Descomente el
\showhyphens
comando para verificar que TeX esté separando los elementos correctamente (tenga en cuenta que el resultado se imprime en.log
)
Respuesta2
Me encontré con esta pregunta recientemente porque tenía exactamente el mismo problema, pero la solución dada aquí no fue satisfactoria para mí, así que intentaré explicar la solución que encontré con la esperanza de que sea útil para otras personas que buscan lo mismo. cosa.
El punto es que queremos especializar la traducción de Babel para un idioma pero no prohibir cargar todos los demás idiomas en los que no nos especializamos. Esto se podría hacer si y sólo si se redefine la traducción.despuésel babel
paquete está cargado y los idiomas han sido seleccionados. Pero el problema es que lo estás redefiniendo desde un archivo .cls
o un .sty
archivo. Entonces, utilicé la \AtBeginDocument{}
macro combinada con una prueba sobre la presencia (o no) del babel
paquete. Encontré este truco en la akletter
clase. Aquí está el código final (redefiniendo el nombre de la sección de la tabla de contenido para la traducción al francés):
\AtBeginDocument{%
\@ifpackageloaded{babel}{%
%%% French
\addto{\extrasfrench}{%
\def\frenchcontentsname{Sommaire}%
}
}{}
}
Tenga en cuenta también que no utilicé \captionsfrench
sino \extrasfrench
solucionar el selector de idioma si se elige uno y el documento es multilingüe.
Bueno, espero que esto ayude! Cualquier comentario es bienvenido si se puede mejorar algo en este código.
Respuesta3
Si carga babel
con opciones particulares, cualquiera que quiera pasar babel
diferentes opciones deberá llamar a un comando como
\PassOptionsToPackage{italian}{babel}
antes de llamar a su paquete. Puedes poner esto en el manual y así no será tu culpa si no lo leen.
Alternativamente, puede solicitar el paquete sin opciones particulares y agregar sus idiomas con \babelprovide
. Esta no es la forma recomendada de cargar alemán o inglés, pero debería funcionar y evitará un conflicto de opciones si el usuario carga babel
antes que su paquete.
Si necesita que su paquete admita la carga babel
antes o después, deberá posponer la carga babel
y todos los comandos que dependen de él hasta al menos \AtEndPreamble
, luego realizar toda la configuración sin las opciones del paquete.