我有自己的使用 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}