옵션을 사용 english
하고 article
클래스를 로드하는 클래스 파일을 작성 중입니다. english
새 클래스에 정의된 옵션~이다~ 아니다전달 article
. 그러나 babel
option 으로 로드하면 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
내 의견을 답변으로 전환합니다.
\@classoptionslist
LaTeX는 에 전달된 옵션이 포함된 전역 옵션(이를 이라고 함) 목록을 유지 관리합니다 \documentclass
. 이러한 옵션은 기본적으로 이후에 로드되는 모든 패키지에 전달됩니다 \documentclass
(이는 다른 패키지에서 사용되는 인터페이스에 따라 다릅니다. 표준 LaTeX 인터페이스는 전역 옵션을 선택하지만 와 같은 패키지는 로컬 옵션 목록만 전달하는 메커니즘을 제공합니다 pgfopts
. ).l3keys2e
expkv-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
를 사용하여 동일한 결과를 얻을 수도 있습니다. (키=값 솔루션이 많이 있습니다.)pgfkeys
pgfopts
l3keys
l3keys2e
kvoptions
다음은 에 대한 선택 사항으로 english
및 을 구현합니다 .german
template-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
에 동등한 기능을 제공하려는 노력이 있었지만 여전히 및 에 대해 다른 코드를 작성해야 합니다 .polyglossia
babel
polyglossia
문자열을 간단하게 번역하려면 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
이것에 대해서도 도움을 줄 수 있습니다.