내 질문은 다음과 같습니다

내 질문은 다음과 같습니다

\affidavit나는 두 가지 언어(ngerman과 English)로 표준 텍스트를 생성하는 명령을 제공하는 패키지를 직접 작성하고 싶습니다 .

이 패키지의 최소 작동 예:

\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}
}

내 사용자가 내 패키지로 작업하는 방식을 제어할 수 없으므로 일부 사용자는 다음과 같은 라텍스 문서의 최소 작업 예를 사용하려고 할 수 있습니다.

\documentclass{article}
\usepackage[ngerman]{babel}
\usepackage{myaffidavit}

\begin{document}
Hallo Welt!
\affidavit
\end{document}

이 오류가 발생합니다.LaTeX Error: Option clash for package babel


내 질문은 다음과 같습니다

내 패키지 사용자를 내 패키지에 로드된 언어로 제한하지 않고 다른 언어(올바른 하이픈 사용)로 텍스트를 출력하는 패키지를 어떻게 작성할 수 있습니까?

물론 사용자가 바벨과 내 패키지를 반대 방향으로 로드하는 경우 사용자가 라텍스 문서에서도 이 언어를 지정하지 않았다면 내 패키지에서 ngerman 또는 English를 사용할 수 없습니다. (그리고 사용자가 기본 문서에서 babel을 이미 로드한 후 내 패키지가 추가 언어를 로드하려고 하면 옵션 충돌이 발생합니다)

더 정확하게 말하자면:요점은 this 과 같은 babel에 대한 패키지 옵션을 사용하여 내 패키지가 내 패키지 내에서 사용할 언어를 지정할 때 \RequirePackage[ngerman,english]{babel}내 패키지 사용자가 babel 패키지도 로드할 때 내 패키지가 옵션 충돌을 일으킬 가능성이 높다는 것입니다.

하지만:내 패키지 사용자가 클래스 옵션으로 사용하려는 언어를 지정하는 경우(주석에서 제안한 대로) 여전히 "옵션 충돌"이 발생합니다. 문서 내부의 바벨의 첫 번째 로드가 여전히 이루어지기 때문입니다. 로드되는 언어 정의(클래스 옵션으로 지정된 언어 정의)를 지정합니다. 그리고 이 \myaffidavit명령을 사용하면 정의/로드되지 않은 언어를 사용하려고 하기 때문에 오류가 발생합니다.

나는 패키지를 작성 중이고 사용자가 바벨을 로드할 때 내 패키지 내에서 사용되는 언어를 지정하도록 강요하고 싶지 않습니다. 투명하게 하고 싶습니다. 내 사용자가 이탈리아어로 글을 쓰고 싶어서 이탈리아어 옵션으로 바벨을 로드하고 있다고 가정해 보겠습니다. Babel을 로드할 때 옵션으로 지정하면 \usepackage[italian]{babel}옵션 충돌이 발생합니다. 그가 이탈리아어를 수업 옵션으로 지정하면 옵션 충돌이 없지만 그가 내 진술서 패키지도 로드할 때 기본 언어는 더 이상 이탈리아어가 아닙니다.투명하지 않아요! 그리고 나는 내 패키지가 그렇게 거슬리는 것을 원하지 않습니다.

답변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오류 메시지를 제거하려면 두 번 컴파일하십시오.

  • 나는 '올바른' 결과를 얻기 위해 다른 패키지에 대한 의존성을 피하기 위해 사용자 정의 날짜 명령을 사용하고 싶습니다. 내가 여기서 제안한 것은 가능성을 예시하기 위한 것이지 최종적이거나 표준을 준수하는 것은 아닙니다.

  • TeX가 올바르게 하이픈을 연결했는지 확인하려면 명령 의 주석 처리를 제거하십시오. \showhyphens(출력은 에 인쇄됩니다 .log.)

답변2

나는 최근에 똑같은 문제가 있었기 때문에 이 질문을 우연히 발견했습니다. 그러나 여기에 제시된 해결책은 나에게 만족스럽지 않았습니다. 따라서 같은 문제를 찾는 다른 사람들에게 유용할 것이라는 희망을 가지고 제가 찾은 해결책을 설명하려고 노력할 것입니다. 물건.

요점은 우리가 한 언어에 대한 바벨 번역을 전문화하고 싶지만 전문화하지 않은 다른 모든 언어를 로드하는 것을 금지하지는 않는다는 것입니다. 이는 번역을 재정의하는 경우에만 수행될 수 있습니다.~ 후에패키지 babel가 로드되고 언어가 선택되었습니다. 그러나 문제는 .cls또는 파일 에서 재정의한다는 것입니다 .sty. 그래서 \AtBeginDocument{}패키지 유무에 대한 테스트와 함께 매크로를 사용했습니다 babel. 나는 akletter수업시간에 이 비법을 발견했다. 다음은 최종 코드입니다(프랑스어 번역을 위한 목차 섹션의 이름 재정의).

\AtBeginDocument{%
  \@ifpackageloaded{babel}{%
    %%% French
    \addto{\extrasfrench}{%
      \def\frenchcontentsname{Sommaire}%
    }
  }{}
}

또한 언어 선택기를 선택하고 문서가 다국어인 경우 언어 선택기를 사용하지 \captionsfrench않고 해결했습니다.\extrasfrench

음, 이것이 도움이 되었으면 좋겠습니다! 이 코드에서 개선할 점이 있다면 어떤 의견이라도 환영합니다.

답변3

특정 옵션을 로드하는 경우 다른 옵션을 babel전달하려는 사람은 누구나 babel다음과 같은 명령을 호출해야 합니다.

\PassOptionsToPackage{italian}{babel}

패키지를 호출하기 전에. 이것을 매뉴얼에 넣으면 그들이 그것을 읽지 않아도 그것은 당신의 잘못이 아닙니다.

또는 특별한 옵션 없이 패키지를 요구하고 를 사용하여 언어를 추가할 수 있습니다 \babelprovide. 이는 독일어나 영어를 로드하는 데 권장되는 방법은 아니지만 작동해야 하며 사용자가 babel패키지보다 먼저 로드하는 경우 옵션 충돌을 피할 수 있습니다.

패키지 babel이전 또는 이후 로드를 지원해야 하는 경우 babel최소한 까지 로드 및 이에 의존하는 모든 명령을 연기한 다음 \AtEndPreamble패키지 옵션 없이 모든 구성을 수행해야 합니다.

관련 정보