我想编写一个类来加载 babel 和其他语言感知包,并将该选项ngerman
作为默认值传递给它们。但如果选项中使用了另一种语言,\documentclass
那么应该使用该语言。我发现实现此行为的唯一方法是此代码
\ProvidesClass{mytest}[2013/11/27]
\RequirePackage{etoolbox}
\preto\@classoptionslist{ngerman,}
\LoadClass{article}
\RequirePackage{babel}
\endinput
然后就可以像这样使用并且\documentclass[english]{mytest}
按预期工作。
\documentclass{mytest}
\begin{document}
\bibname
\end{document}
但是这\preto\@classoptionslist{ngerman,}
看起来有点像 hack。真的没有其他方法可以将 a 中的默认选项传递给.cls
所有(或部分)包吗?
答案1
(我知道这个问题已经很老了,也许你已经找到了解决方案,但它仍然徘徊在未解答列表中。)
我想编写一个类来加载其他语言感知包并将该选项作为默认
babel
选项传递给它们所有。ngerman
您在此处的假设是,所有语言感知包都使用与 相同的选项列表babel
,但不幸的是事实并非如此。您可能有一个特定的语言感知包列表,您的类将加载这些包,您可以在其中验证这是否属实,但这并未考虑用户在加载您的类后可能想要加载的任何其他可能也需要语言支持的包。
另一个问题是,如果用户想要使用 XeLaTeX,会发生什么?在这种情况下,他们更有可能想要polyglossia
,这又带来了另一个问题。摘自polyglossia
手册:
polyglossia 不再支持将语言定义文件作为包选项加载!
它也不接受ngerman
作为语言名称。它必须german
与选项一起使用spelling=new
。
因此,即使您确实找到了一种简单的方法来添加到类选项列表中,考虑到它不包含任何其他语言名称,如果您的类的用户想要而不是,ngerman
您仍然无法实现预期的效果。polyglossia
babel
其他语言感知包呢?我遇到过至少一个类,其中使用 key=value 选项以 形式设置语言language=enGB
。鉴于带有 key=value 选项列表的包数量不断增加,可能有一些包也需要以这种方式设置语言。(我不记得有什么了,但我确实考虑过在我的一个带有 key=value 选项列表的包中这样做,尽管最后我认为这不是一个好主意。)
我认为大多数提供多语言支持的软件包都会检查babel
是否polyglossia
与标题机制集成(尤其是考虑到如果在多语言文档中不这样做可能会导致复杂情况)。但是,对于那些不这样做的软件包,根本无法保证它们会将其识别ngerman
为选项。
因此,似乎对您的问题唯一可行的解决方案就是,如果用户在文档类中未提供任何语言,则只集中精力获取babel
或polyglossia
设置德语作为默认语言,然后假设用户想要加载的任何其他具有多语言支持的包都会检查babel
或polyglossia
并从中获取语言列表。
我能想到的最简单的方法是:
\ProvidesClass{mytest}
\LoadClass{article}
\RequirePackage{tracklang}
\RequirePackage{afterpackage}
\RequirePackage{ifxetex}
\ifxetex
\newcommand{\@mytest@add@dialect}[1]{%
\AfterPackage{polyglossia}{\setotherlanguage{\TrackedLanguageFromDialect{#1}}}%
}
\else
\newcommand{\@mytest@add@dialect}[1]{%
\PassOptionsToPackage{#1}{babel}%
}
\fi
\AnyTrackedLanguages
{
\ForEachTrackedDialect{\this@dialect}{%
\expandafter\@mytest@add@dialect\expandafter{\this@dialect}}
}
{
\ifxetex
\AfterPackage{polyglossia}{\setmainlanguage[spelling=new]{german}}
\else
\PassOptionsToPackage{ngerman}{babel}
\fi
}
\ifxetex
\RequirePackage{polyglossia}
\else
\RequirePackage{babel}
\fi
\endinput
这样,ngerman
仅当用户未在文档类中指定任何语言选项时才会自动添加,因此如果他们不想要它,就不会添加它。
答案2
为了从未回答列表中找到这个问题,我将自己回答:
我认为目前没有比问题中提出的更好的解决方案。
答案3
为了在自定义类中支持多种语言,我将每种语言声明为一个选项,如下所示:
% Class declaration
\NeedsTeXFormat{LaTeX2e}[1994/06/01]
\ProvidesClass{liedjify}[2022/03/06 Class for high quality thesis at uds, Cameroon]
\DeclareOption{french}{
\PassOptionsToPackage{\CurrentOption}{babel}
}
\DeclareOption{english}{
\PassOptionsToPackage{\CurrentOption}{babel}
}
\DeclareOption{german}{
\PassOptionsToPackage{\CurrentOption}{babel}
}
%% Process given options
\ProcessOptions\relax
%% Load base
\LoadClass[a4paper]{extreport}
\RequirePackage{babel} % support multiple languages writing
%% Additional TeX/LaTeX code...
\endinput
然后用户可以将选定的语言传递给\documentclass
。
\documentclass[german]{liedjify}
以下是德语 ( )、法语 ( \documentclass[french]{liedjify}
) 和英语 ( )的一个有用示例\documentclass[english]{liedjify}
:
\documentclass[german]{liedjify}
\begin{document}
\chapter{Test}
See the chaper name for your language.
\end{document}