scrlttr2:仅当未使用 babel 时才读取 lco 文件;DeclareOption*;实际上:处理选项和 babel

scrlttr2:仅当未使用 babel 时才读取 lco 文件;DeclareOption*;实际上:处理选项和 babel

我有自己的使用 scrlttr2 的字母类:

%mwe.cls
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{mwe}[2010/11/19 mwe.cls]

\DeclareOption*{\PassOptionsToClass{\CurrentOption}{scrlttr2}}
\ProcessOptions\relax

%\RequirePackage{graphicx}
\RequirePackage[english]{babel}

\LoadClass{scrlttr2}

我想用 .lco 文件进行自定义,例如:

%mweelco.lco
\setkomavar{date}{.lco read!!}

现在我想在一封信中使用它:

\documentclass[mwelco]%
{mwe}%(1)
\begin{document}
\begin{letter}{--Im Hause--}
%\LoadLetterOptions{mwelco}%(2)
\opening{test}
Content
\end{letter}
\end{document}

我想将 (1) mwelco-option 作为 documentclass 的一个选项给出,并且不想 (2) 稍后在文件中使用 \LoadLetterOptions。

然而,只有 (2) 有效,而 (1) 无效。

更奇怪的是,如果我注释掉 babel,那么 (1) 和 (2) 就可以正常工作。此外,如果我注释掉 babel 并需要 graphicx(为了便于讨论),那么 (1) 和 (2) 也可以正常工作。

因此,DeclareOption* 和 babel 之间存在一些交互,这妨碍了我。(去年 9 月,使用较旧的 texlive,它可以工作。刚刚检查过,使用开箱即用的 teelive-2019 babel 可以与 (1) 和 (2) 配合使用。)我正在使用最新的 texlive-2020。

编辑(让我更好地解释一下“不起作用”): 我预期的行为是,在 tex 文件中说:\documentclass[mwelco]{mwe} 会导致 mwe.cls (A) 加载 scrlttr2,(B) 使 scrlttr2 加载 mwelco.lco 文件。但是这才不是发生。

实现此目的的两种方法是:(C) 注释掉所需的 babel 或 (D) 将其添加到\LoadLetterOptions{mwelco}letter.tex 中。显然,(C) 是不可接受的,而 (D) 则很笨拙,会将 letter 类别的选项传播到更靠后的位置。

因此,似乎甚至需要 babel \DeclareOption*{\PassOptionsToClass{\CurrentOption}{scrlttr2}} \ProcessOptions\relax软件包中的选项 mwelco 是否传递给 scrlttr2 似乎有副作用。这是我无法理解的。如果能帮助我避免这个问题,我将不胜感激。

答案1

加载包babel scrlttr2包装类中的类:

\begin{filecontents*}[overwrite]{testclass.cls}
\ProvidesClass{testclass}
\DeclareOption*{\PassOptionsToClass{\CurrentOption}{scrlttr2}}
\ProcessOptions\relax
\RequirePackage{graphicx}
\LoadClassWithOptions{scrlttr2}
\RequirePackage[english]{babel}% <- moved
\end{filecontents*}

\begin{filecontents*}{mwelco.lco}
\setkomavar{date}{.lco read!!}
\end{filecontents*}

\documentclass[mwelco]{testclass}
\begin{document}
\begin{letter}{--Im Hause--}
\opening{test}
Content
\end{letter}
\end{document}

相关内容