Quero escrever meu próprio pacote que forneça um \affidavit
comando que produza algum texto padrão em dois idiomas (ngerman e inglês).
Exemplo mínimo de trabalho deste pacote:
\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 eu não controlo como meus usuários estão trabalhando com meu pacote, alguns usuários podem tentar usar o seguinte exemplo mínimo de trabalho de um documento látex:
\documentclass{article}
\usepackage[ngerman]{babel}
\usepackage{myaffidavit}
\begin{document}
Hallo Welt!
\affidavit
\end{document}
O que resulta neste erro:LaTeX Error: Option clash for package babel
Minha pergunta é:
Como posso escrever um pacote que produza texto em diferentes idiomas (usando a hifenização correta) sem restringir o usuário do meu pacote aos idiomas carregados no meu pacote.E, claro, se meu usuário carregar o babel e meu pacote ao contrário, eu não seria capaz de usar ngerman ou english em meu pacote, se o usuário não especificasse esses idiomas em seu documento latex também. (E haveria um conflito de opções se meu pacote tentasse carregar idiomas adicionais após o babel já ter sido carregado pelo usuário no documento principal)
Para ser mais preciso:A questão é que, quando eu especifico os idiomas que meu pacote usará dentro do meu pacote usando as opções de pacote para babel como esta \RequirePackage[ngerman,english]{babel}
, meu pacote provavelmente estará produzindo um conflito de opções quando o usuário do meu pacote carregar o pacote babel também.
Mas:Se o usuário do meu pacote especificar o idioma que deseja usar como opção de classe (como sugerido nos comentários), ainda haveria um "conflito de opções" (mais ou menos), porque o primeiro carregamento do babel dentro do documento ainda especifica quais definições de linguagem estão sendo carregadas (aquelas especificadas como opções de classe). E usar o \myaffidavit
comando produz erros, porque tenta usar linguagens que não estão definidas/carregadas.
Estou escrevendo um pacote e não quero forçar o usuário a especificar os idiomas usados dentro do meu pacote, também quando ele estiver carregando o babel. Quero que seja transparente. Digamos que meu usuário queira escrever em italiano, então ele está carregando o babel com a opção de idioma italiano. Se ele especificar isso como uma opção ao carregar o babel, \usepackage[italian]{babel}
haverá um conflito de opções. Quando ele especifica o italiano como uma opção de classe, não há conflito de opções, mas o idioma padrão não será mais o italiano, quando ele também estiver carregando meu pacote de declaração.Isso não é transparente! E não quero que meu pacote seja tão intrusivo.
Responder1
Aqui está algo com o qual você pode brincar:
\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}
Observações
Ao desligar
babel
, compile duas vezes para se livrar da mensagem de erro.Eu estaria inclinado a usar um comando de data personalizado para evitar a dependência de outros pacotes para acertar; o que sugeri aqui pretende ser ilustrativo das possibilidades, não definitivo ou mesmo compatível com os padrões.
Remova o comentário do
\showhyphens
comando para verificar se o TeX está hifenizando as coisas corretamente (observe que a saída é impressa no arquivo.log
)
Responder2
Me deparei com essa questão recentemente porque tive exatamente o mesmo problema, mas a solução dada aqui não foi satisfatória para mim, então tentarei explicar a solução que encontrei com a esperança de que seja útil para outras pessoas que procuram o mesmo coisa.
A questão é que queremos especializar a tradução do babel para um idioma, mas não proibir carregar todos os outros idiomas que não especializamos. Isso poderia ser feito se e somente se você redefinir a traduçãodepoiso babel
pacote é carregado e os idiomas foram selecionados. Mas, o problema é que você está redefinindo-o a partir de um arquivo .cls
ou .sty
arquivo. Então, usei a \AtBeginDocument{}
macro combinada com um teste de presença (ou não) do babel
pacote. Encontrei esse truque na akletter
aula. Aqui está o código final (redefinindo o nome da seção do índice para tradução para o francês):
\AtBeginDocument{%
\@ifpackageloaded{babel}{%
%%% French
\addto{\extrasfrench}{%
\def\frenchcontentsname{Sommaire}%
}
}{}
}
Observe também que não usei \captionsfrench
mas \extrasfrench
para contornar o seletor de idioma se um for escolhido e o documento for multilíngue.
Bem, espero que isso ajude! Quaisquer comentários são bem-vindos se algo puder ser melhorado neste código.
Responder3
Se você carregar babel
opções específicas, qualquer pessoa que queira passar babel
opções diferentes precisará chamar um comando como
\PassOptionsToPackage{italian}{babel}
antes de ligar para o seu pacote. Você pode colocar isso no manual e então não será sua culpa se eles não o lerem.
Alternativamente, você pode solicitar o pacote sem opções específicas e adicionar seus idiomas com \babelprovide
. Esta não é a forma recomendada de carregar alemão ou inglês, mas deve funcionar e evitará um conflito de opções se o usuário carregar babel
antes do seu pacote.
Se você precisar que seu pacote suporte o carregamento babel
antes ou depois dele, você precisará adiar o carregamento babel
e todos os comandos que dependem dele até pelo menos \AtEndPreamble
, e então fazer toda a sua configuração sem opções de pacote.