Я хочу написать свой собственный пакет, который предоставляет \affidavit
команду, создающую некий стандартный текст на двух языках (немецком и английском).
Минимальный рабочий пример этого пакета:
\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}
}
Поскольку я не контролирую, как мои пользователи работают с моим пакетом, некоторые пользователи могут попытаться использовать следующий минимальный рабочий пример документа Latex:
\documentclass{article}
\usepackage[ngerman]{babel}
\usepackage{myaffidavit}
\begin{document}
Hallo Welt!
\affidavit
\end{document}
Что приводит к этой ошибке:LaTeX Error: Option clash for package babel
Мой вопрос:
Как написать пакет, который выводит текст на разных языках (используя правильную расстановку переносов), не ограничивая пользователя моего пакета языками, загруженными в мой пакет?И, конечно, если мой пользователь загрузит babel и мой пакет наоборот, я не смогу использовать ngerman или english в моем пакете, если пользователь не указал эти языки в своем документе latex. (И возникнет конфликт опций, если мой пакет попытается загрузить дополнительные языки после того, как babel уже был загружен пользователем в основной документ).
Если быть точнее:Дело в том, что когда я указываю языки, которые будет использовать мой пакет, с помощью параметров пакета для Babel, как здесь \RequirePackage[ngerman,english]{babel}
, мой пакет, скорее всего, создаст конфликт параметров, когда пользователь моего пакета также загрузит пакет Babel.
Но:Если пользователь моего пакета указывает язык, который он хочет использовать, как параметр класса (как предлагается в комментариях), то все равно будет "конфликт параметров" (своего рода), потому что первая загрузка babel внутри документа все еще указывает, какие определения языка загружаются (те, которые указаны как параметры класса). И использование команды \myaffidavit
затем приводит к ошибкам, потому что она пытается использовать языки, которые не определены/не загружены.
Я пишу пакет и не хочу заставлять пользователя указывать языки, используемые внутри моего пакета, а также при загрузке Babel. Я хочу, чтобы это было прозрачно. Допустим, мой пользователь хочет писать на итальянском, поэтому он загружает Babel с опцией итальянского языка. Если он указывает его как опцию при загрузке Babel с\usepackage[italian]{babel}
возникает конфликт опций. Когда он указывает итальянский как опцию класса, конфликта опций не происходит, но язык по умолчанию больше не будет итальянским, когда он также загружает мой пакет affidavit.Это не прозрачно! И я не хочу, чтобы моя посылка была такой навязчивой.
решение1
Вот с чем можно поиграть:
\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}
Замечания
При выключении
babel
выполните компиляцию дважды, чтобы избавиться от сообщения об ошибке.Я бы склонился к использованию пользовательской команды date, чтобы избежать зависимости от других пакетов для получения «правильного» результата; то, что я здесь предложил, призвано проиллюстрировать возможности, а не быть окончательным или даже соответствующим стандартам.
Раскомментируйте
\showhyphens
команду, чтобы убедиться, что TeX правильно расставляет переносы (обратите внимание, что вывод выводится в.log
).
решение2
Недавно я наткнулся на этот вопрос, потому что у меня была точно такая же проблема, но решение, предложенное здесь, меня не удовлетворило, поэтому я попытаюсь объяснить найденное мной решение в надежде, что оно будет полезно другим людям, ищущим то же самое.
Суть в том, что мы хотим специализировать перевод babel для одного языка, но не запрещать загружать все остальные языки, которые мы не специализировали. Это можно сделать, если и только если вы переопределите переводпослепакет babel
загружен и язык(и) выбран(ы). Но проблема в том, что вы переопределяете его из .cls
или .sty
файла. Поэтому я использовал \AtBeginDocument{}
макрос в сочетании с проверкой наличия (или отсутствия) пакета babel
. Я нашел этот трюк в akletter
классе. Вот окончательный код (переопределение имени раздела оглавления для французского перевода):
\AtBeginDocument{%
\@ifpackageloaded{babel}{%
%%% French
\addto{\extrasfrench}{%
\def\frenchcontentsname{Sommaire}%
}
}{}
}
Обратите внимание, что я не использовал \captionsfrench
but \extrasfrench
для обхода выбора языка, если он выбран, а документ многоязычный.
Ну, надеюсь, это поможет! Буду рад любым комментариям, если что-то можно улучшить в этом коде.
решение3
Если вы загружаете babel
определенные параметры, любой, кто захочет передать babel
другие параметры, должен будет вызвать команду, например
\PassOptionsToPackage{italian}{babel}
прежде чем звонить в свой пакет. Вы можете вставить это в руководство, и тогда это не будет вашей виной, если они его не прочтут.
В качестве альтернативы вы можете запросить пакет без определенных опций и добавить свои языки с помощью \babelprovide
. Это не рекомендуемый способ загрузки немецкого или английского языка, но он должен работать, и это позволит избежать конфликта опций, если пользователь загрузит его babel
до вашего пакета.
Если вам нужно, чтобы ваш пакет поддерживал загрузку babel
либо до, либо после него, вам нужно будет отложить загрузку babel
и все зависящие от нее команды по крайней мере до \AtEndPreamble
, а затем выполнить всю настройку без параметров пакета.