Мой вопрос:

Мой вопрос:

Я хочу написать свой собственный пакет, который предоставляет \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}%
    }
  }{}
}

Обратите внимание, что я не использовал \captionsfrenchbut \extrasfrenchдля обхода выбора языка, если он выбран, а документ многоязычный.

Ну, надеюсь, это поможет! Буду рад любым комментариям, если что-то можно улучшить в этом коде.

решение3

Если вы загружаете babelопределенные параметры, любой, кто захочет передать babelдругие параметры, должен будет вызвать команду, например

\PassOptionsToPackage{italian}{babel}

прежде чем звонить в свой пакет. Вы можете вставить это в руководство, и тогда это не будет вашей виной, если они его не прочтут.

В качестве альтернативы вы можете запросить пакет без определенных опций и добавить свои языки с помощью \babelprovide. Это не рекомендуемый способ загрузки немецкого или английского языка, но он должен работать, и это позволит избежать конфликта опций, если пользователь загрузит его babelдо вашего пакета.

Если вам нужно, чтобы ваш пакет поддерживал загрузку babelлибо до, либо после него, вам нужно будет отложить загрузку babelи все зависящие от нее команды по крайней мере до \AtEndPreamble, а затем выполнить всю настройку без параметров пакета.

Связанный контент