重置类中的 RequirePackage 参数,允许后续使用包调用

重置类中的 RequirePackage 参数,允许后续使用包调用

我如何允许某人使用我的自定义文档类访问\usepackage我已\RequirePackage使用特定选项设置的某个库?最佳情况下,当他们调用时\usepackage,它会像重新导入包一样运行,仅使用他们提供的参数(可能没有)。

例如,我只想默认提供\llbracket来自\rrbracket包的内容,但允许用户在其文档中stmaryrd导入其余内容(如果他们愿意的话)。stmaryrd

这是我的课程stmaryrdsubset.cls

\ProvidesClass{stmaryrdsubset}[2017/03/14 minimal with llbracket+rrbracket from stmaryrd]
\LoadClass{minimal}
\RequirePackage[only,llbracket,rrbracket]{stmaryrd}

这在提供括号命令时非常有效,但是当文档(stmaryrdfull.tex)尝试重新使用该包时,什么也不会发生:

\documentclass{stmaryrdsubset}
\usepackage{stmaryrd}
\begin{document}
Yay for $\llbracket\textrm{double brackets}\rrbracket$

This is a cool symbol: $\bindnasrepma$ (it's like an upside-down ampersand!)
\end{document}

会产生错误:

! 未定义控制序列。\bindnasrepma

不完整的结果如下:

编译 stmaryrdfull.tex 的结果

(很酷的符号,bindnasrepma 代码片段, 不见了)

我怀疑一种解决方法是推迟要求该包,直到\AtBeginDocument或大约那个时间,让用户有机会\usepackage{stmaryrd}先在他们的序言中使用它,然后\RequirePackage[only,...]{stmaryrd}在最后一刻调用我自己的包。也许有一种更干净、更直接的方法?

答案1

没有通用的方法可以做到这一点。

通常情况下,latex 会检测包是否已加载,并阻止再次加载。您可以通过取消定义记录上一次加载的宏来关闭该检查。

添加

\expandafter\let\csname [email protected]\endcsname\relax

到课程结束时,你将在终端上看到

..
Document Class: minimal 2001/05/25 Standard LaTeX minimal class
) (/usr/local/texlive/2016/texmf-dist/tex/latex/stmaryrd/stmaryrd.sty))
(/usr/local/texlive/2016/texmf-dist/tex/latex/stmaryrd/stmaryrd.sty)

因此该包被加载了两次。

fontenc这样做是为了使用

\usepackage[T1]{fontenc}

然后

\usepackage[T2]{fontenc}

但整个字体声明机制都是为了支持重新运行而编写的。

如果您在两次加载包的情况下运行示例,stmaryrd则会得到完全相同的错误,因为原始only选项设置的所有内部设置仍然有效,因此本质上它在第二次加载时不执行任何操作。

您可以撤消这些开关,但这样您很可能会实际指定两种使用相同底层字体的数学字体。由于 classic tex 在任何表达式中仅允许使用 16 种数学字体,这不是一个好计划。您想使用现有的已分配的数学字体,而该包没有代码来执行此操作,因此基本上您需要重写整个包。

更好的计划是让类别有选项可以只使用这些字符或所有字符,然后根据所使用的文档类别选项以不同的方式加载 stmaryrd。

相关内容