测试包(或包选项)是否已加载

测试包(或包选项)是否已加载

[french]{babel}(又名frenchb)与某些其他软件包不兼容,例如,因为它会尝试在分号前tikz插入。\thinspace

为了让这两个运行良好,你必须调用\shorthandoff{;}该文档。

现在我有一个使用 的包tikz,我想在本地禁用 的分号babel,而不是为整个文档禁用它。我可以破解.sty包的 来做到这一点,因为我知道我正在使用frenchb,但我宁愿做一些干净且可移植的事情。

有没有一种方法可以测试我的包是否frenchb已加载并在本地禁用分号管理babel,这样包就不会被黑客入侵?

编辑:

马丁的解决方案通常给我如下结论:

\RequirePackage{ifthen}
\newcommand{\@babel@loaded}{0}
\AtBeginDocument{\@ifpackageloaded{babel}                                                 
  {\renewcommand{\@babel@loaded}{1}}                                                      
  {\renewcommand{\@babel@loaded}{0}}                                                      
}
\newcommand{\somecommandusingsemicolon}{
  \ifthenelse{\@babel@loaded=1}{\shorthandoff{;}}{}  
  % code with semi-colon here
}

在 tikz 的具体情况下:

\AtBeginDocument{\@ifpackageloaded{babel}
  {%
    \g@addto@macro\tikz@installcommands{%
      \shorthandoff{;}%
    }
    \g@addto@macro\tikz@uninstallcommands{%
      \shorthandon{;}%
    }
  }
  {\relax}
}

答案1

您可以使用内部 LaTeX 宏\@ifpackageloaded来测试包是否已加载:

\@ifpackageloaded{<name>}{<true>}{<false>}

还有:

\@ifpackagewith{<name>}{<option-list>}{<true>}{<false>}
\@ifpackagelater{<name>}{<date YYYY/MM/DD>}{<true>}{<false>}

有关更多宏,请参阅链接的文档LaTeX 内部命令的文档参考?


在这种情况下,tikz最好将您的代码添加到宏\tikz@installcommands和中\tikz@uninstallcommands。第一个在开始时执行tikzpicture,并启用tikz仅在那里定义的所有命令,后者在节点内容开始时执行,并将定义更改回正常状态。这样,您就可以在节点内使用法语文本。

您可以使用以下命令向宏添加代码:

\AtBeginDocument{\@ifpackageloaded{babel}{%
    \g@addto@macro\tikz@installcommands{%
      \shorthandoff{;}%
    }%
    \g@addto@macro\tikz@uninstallcommands{%
      \shorthandon{;}%
    }%
}{}

我只是猜测这与\shorthandon是相反的\shorthandoff

答案2

在较新的 LaTeX 版本中,\@ifpackageloaded也可以\IfPackageLoadedTF

source2e.pdf 摘录

使用方式相同。


另一个选项是\ltx@ifpackageloadedltxcmds包中获取(包的主要优点是它可以从纯 TeX 中使用,但除了没有真正跟踪这一点ltxcmds之外,实际上没有标准化的机制来在纯 TeX 中加载包):\input

ltxcmds 包文档

相关内容