当我编译以下代码时,我期望得到“是”,但得到的却是“否”。是否发生了一些微妙的事情,或者我的检查方法是否错误?如果是这样,我如何才能看到哪些选项已传递给babel
?(这是我正在编写的课程。)
\@ifpackageloaded{babel}
给出了“是”, 也是如此\usepackage[english]{babel}
。
\documentclass[english]{article}
\usepackage{babel}
\newcommand{\control}{undefined}
\makeatletter
\@ifpackagewith{babel}{english}
{\renewcommand{\control}{Yes}}
{\renewcommand{\control}{No}}
\makeatother
\begin{document}
\control
\end{document}
答案1
当你使用以下方式加载包时
\usepackage[a,b,c]{package}
宏被定义为扩展为;这样的宏用于。但是,全局选项不包括在列表中。因此,如果包知道选项,而您不知道\[email protected]
a,b,c
\@ifpackagewith
g
\documentclass[g]{article}
\usepackage[a,b,c]{package}
选项g
将要package
在选项之前传递给a
,b
和c
。然而代码
\@ifpackagewith{g}{package}{YES}{NO}
会走假枝。不幸?是的。
你能做些什么吗?当然可以,因为全局选项存储在 中\@classoptionslist
,但没有明确的接口。
该babel
包依赖于\date<language>
被定义为检查语言是否已被加载,无论是作为全局选项还是本地选项。
这是一个也检查全局选项expl3
的版本。\@ifpackagewith
\documentclass[english]{article}
\usepackage{babel}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\packageoptionsTF}{mmmm}
{
\stanton_package_options:nnTF { #1 } { #2 } { #3 } { #4 }
}
\cs_new_protected:Nn \stanton_package_options:nnTF
{
\clist_map_inline:nn { #2 }
{
\clist_if_in:cnTF { opt@#1.sty } { ##1 }
{ #3 } % it's a local option
{
\clist_if_in:cnTF { @classoptionslist } { ##1 }
{ #3 } % it's a global option
{ #4 }
}
}
}
\ExplSyntaxOff
\newcommand{\control}{undefined}
\newcommand{\ita}{}
\packageoptionsTF{babel}{english}{%
\renewcommand{\control}{Yes}%
}{%
\renewcommand{\control}{No}%
}
\packageoptionsTF{babel}{italian}{%
\renewcommand{\ita}{Yes}%
}{%
\renewcommand{\ita}{No}%
}
\begin{document}
\control
\ita
\end{document}
输出为
是
否