我如何允许某人使用我的自定义文档类访问\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
不完整的结果如下:
我怀疑一种解决方法是推迟要求该包,直到\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。