사용자 정의 클래스 및 `babel`의 `english` 옵션과 충돌합니다.

사용자 정의 클래스 및 `babel`의 `english` 옵션과 충돌합니다.

옵션을 사용 english하고 article클래스를 로드하는 클래스 파일을 작성 중입니다. english새 클래스에 정의된 옵션~이다~ 아니다전달 article. 그러나 babeloption 으로 로드하면 USenglish경고가 표시됩니다.

Package Babel Warning: The package option `english' should not be used
(Babel)                with a more specific one (like `USenglish')

마치 수업 english에 전달된 것처럼 article.

수업에 옵션을 전달하는 방법은 다음과 같습니다.

\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{myclass}[2020/11/07 myclass template]

\newif\ifEnglish\Englishfalse

\DeclareOption{english}{\Englishtrue}
\DeclareOption*{\ClassWarning{myclass}{Unknown option `\CurrentOption'}}
\ProcessOptions\relax

\LoadClass[10pt, a4paper, oneside]{article}

코드

\documentclass[english]{myclass}
\usepackage[USenglish]{babel}

위의 경고가 생성됩니다 babel. 이 문제를 어떻게 해결할 수 있나요?

english나는 경고가 오류가 아니라는 것을 이해하지만 (1) 내가 정의한 옵션의 범위가 로 제한 myclass되고 에서 상속되지 않는지 확인하고 싶습니다 article. (2) 경고가 없는 템플릿을 정말로 갖고 싶습니다. , 그리고 (3) 가능한 한 적은 수의 패키지를 로드하고 싶습니다(따라서 silence이것에 대해서만 호출하는 것을 피하고 싶습니다).

답변1

내 의견을 답변으로 전환합니다.

\@classoptionslistLaTeX는 에 전달된 옵션이 포함된 전역 옵션(이를 이라고 함) 목록을 유지 관리합니다 \documentclass. 이러한 옵션은 기본적으로 이후에 로드되는 모든 패키지에 전달됩니다 \documentclass(이는 다른 패키지에서 사용되는 인터페이스에 따라 다릅니다. 표준 LaTeX 인터페이스는 전역 옵션을 선택하지만 와 같은 패키지는 로컬 옵션 목록만 전달하는 메커니즘을 제공합니다 pgfopts. ).l3keys2eexpkv-opt

세 개의 인수, 제거해야 할 요소, 전체 목록 및 필터링된 목록을 저장해야 하는 매크로를 \@classoptionslist사용하는 LaTeX 매크로를 사용하여 옵션을 제거할 수 있습니다 .\@removeelement

이 지식을 사용하면 사용할 클래스 파일을 변경할 수 있습니다.

\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{myclass}[2020/11/07 myclass template]

\newif\ifEnglish\Englishfalse

\DeclareOption{english}
  {%
    \Englishtrue
    \@expandtwoargs\@removeelement{english}\@classoptionslist\@classoptionslist
  }
\DeclareOption*{\ClassWarning{myclass}{Unknown option `\CurrentOption'}}
\ProcessOptions\relax

\LoadClass[10pt, a4paper, oneside]{article}

english전역 옵션 목록에서 제거됩니다 .


babel그러나 다른 사람들이 지적했듯이(@moewe에게 감사드립니다) 와 협력 하거나 다른 이름을 사용하는 것이 더 나을 수도 있습니다 . 따라서 다음은 템플릿 언어에 대해 고유한 옵션 이름(충돌 가능성이 훨씬 적음)과 함께 key=value 옵션을 사용하는 것을 제안합니다. 나는 이것을 위해 사용 하지만 with , or and , or , or... expkv-opt를 사용하여 동일한 결과를 얻을 수도 있습니다. (키=값 솔루션이 많이 있습니다.)pgfkeyspgfoptsl3keysl3keys2ekvoptions

다음은 에 대한 선택 사항으로 english및 을 구현합니다 .germantemplate-language

myclass.cls:

\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{myclass}[2020/11/07 myclass template]

\RequirePackage{expkv-opt, expkv-def}
\ekvdefinekeys{myclass}
  {
    choice template-language =
      {
        ,english = \Englishtrue  \Germanfalse
        ,german  = \Englishfalse \Germantrue
      }
  }

\newif\ifEnglish\Englishfalse
\newif\ifGerman\Germanfalse

\ekvoProcessGlobalOptions{myclass}
\ekvoProcessLocalOptions {myclass}

\LoadClass[10pt, a4paper, oneside]{article}

문서:

\documentclass[template-language=english]{myclass}

\usepackage[USenglish]{babel}

\begin{document}
\ifEnglish English \fi
\ifGerman Deutscher \fi
Test
\end{document}

여기에 이미지 설명을 입력하세요

답변2

babel이는 템플릿의 정확한 특성과 템플릿이 제공하는 현지화에 따라 다르지만, 특정 종류의 현지화 기능의 경우 템플릿이 (및 가능하면 polyglossia)을 통해 사용자가 설정한 언어에 간단히 반응할 수 있다면 가장 좋을 것입니다 .

안타깝게도 현재 LaTeX 문서 현지화를 위한 두 가지 시스템이 있습니다 babel. polyglossia둘은 일부 영역에서 접근 방식이 약간 다르며 통합 인터페이스가 없습니다. 얼마 전까지만 해도 개발자가 로케일 인식 패키지를 더 쉽게 작성할 수 있도록 babel에 동등한 기능을 제공하려는 노력이 있었지만 여전히 및 에 대해 다른 코드를 작성해야 합니다 .polyglossiababelpolyglossia

문자열을 간단하게 번역하려면 babel다음과 같이 할 수 있습니다.

\begin{filecontents}[overwrite]{myclass.cls}
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{myclass}[2020/11/07 myclass template]

\RequirePackage{etoolbox}

\newcommand*{\rabbit}{\textbf{??? rabbit is missing a translation}}

\AtBeginDocument{%
  \appto\captionsenglish{%
    \renewcommand{\rabbit}{rabbit}%
  }%
  \appto\captionsUSenglish{%
    \renewcommand{\rabbit}{rabbit}%
  }%
  \appto\captionsgerman{%
    \renewcommand{\rabbit}{Hase}%
  }%
  \appto\captionsngerman{%
    \renewcommand{\rabbit}{Hase}%
  }%
}

\LoadClass[10pt, a4paper, oneside]{article}
\end{filecontents}

\documentclass{myclass}

\usepackage[USenglish]{babel}

\begin{document}
Ohh, \rabbit!
\end{document}

문자열에 대한 새 매크로를 정의한 다음 해당 \appto언어에 대한 번역을 . (이 작업은 매크로가 이미 존재하는지 확인하고 변경 사항을 덮어쓰지 않았는지 확인하기 위해 후크 에서 수행됩니다 . 타이밍을 올바르게 맞추는 것은 약간 어려울 수 있습니다.)<language>\captions<language>\AtBeginDocument\captions<language>

다음과 같은 패키지tracklang,iflang,translator그리고translations이것에 대해서도 도움을 줄 수 있습니다.

관련 정보