\@ifpackagewith 的全局选项表现不符合我的预期

\@ifpackagewith 的全局选项表现不符合我的预期

当我编译以下代码时,我期望得到“是”,但得到的却是“否”。是否发生了一些微妙的事情,或者我的检查方法是否错误?如果是这样,我如何才能看到哪些选项已传递给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\@ifpackagewithg

\documentclass[g]{article}

\usepackage[a,b,c]{package}

选项g 将要package在选项之前传递给abc。然而代码

\@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}

输出为


相关内容