仅当加载包时才处理 LaTeX 代码

仅当加载包时才处理 LaTeX 代码

我想创建一个用于测试不同软件包的文档,我想知道是否可以使用命令,以便只有加载了相应的软件包时才读取部分代码。我想到了这个,但它会抛出一个错误,我不知道如何修复。

\documentclass{article}
\usepackage[utf8]{inputenc}

\makeatletter
\newcommand{\IfPackageLoaded}[3]{\@ifpackageloaded{#1}{#2}{#3}}
\makeatother

\begin{document}
\IfPackageLoaded{natbib}{natbib loaded}{natbib not loaded}
\end{document}

我收到此错误:

! LaTeX Error: Can be used only in preamble.

See the LaTeX manual or LaTeX Companion for explanation.
Type  H <return>  for immediate help.
 ...                                              

l.10 \IfPackageLoaded{natbib}{natbib loaded}
                                            {natbib not loaded}
Your command was ignored.
Type  I <command> <return>  to replace it with another command,
or  <return>  to continue without it.

\ltx@ifpackageloaded我也知道加载包时该命令存在ltxcmds,但是当我尝试使用它时

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{ltxcmds}

\begin{document}
\ltx@ifpackageloaded{natbib}{natbib loaded}{natbib not loaded}
\end{document}

我收到此错误信息:

! Undefined control sequence.
l.11 \ltx
         @ifpackageloaded{natbib}{natbib loaded}{natbib not loaded}
The control sequence at the end of the top line
of your error message was never \def'ed. If you have
misspelled it (e.g., `\hobx'), type `I' and the correct
spelling (e.g., `I\hbox'). Otherwise just continue,
and I'll forget about whatever was undefined.

有人能指出我做错了什么吗?

编辑:documentclass从更改minimalarticle

答案1

以下命令添加在 2021 年 11 月的版本中将其转换为 LaTeX,因此您不再需要定义自己的。

\IfPackageLoadedTF,,,,\IfPackageLoadedWithOptionsTF\IfClassLoadedTF\IfClassLoadedWithOptionsTF

\IfPackageLoadedTF{package name}{true code}{false code}

答案2

正如用户 Ulrike Fischer 和 moewe 指出的那样,这是有效的:

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{ltxcmds}

\makeatletter
\newcommand{\IfPackageLoaded}[3]{\ltx@ifpackageloaded{#1}{#2}{#3}}
\makeatother

\begin{document}
\IfPackageLoaded{natbib}{natbib loaded}{natbib not loaded}
\end{document}

答案3

尽管@Lashoun 的解决方案可能是最强大的,但我很好奇我们是否可以在不加载的情况下实现同样的事情ltxcmds

ltxcmds.sty阅读和的要点latex.ltx,似乎加载包(具体来说,\ProvidesPackage命令)定义了一个宏ver@{packagename}。因此,我们可以检查它是否定义如下:

\documentclass{article}
\usepackage{hyperref} % toggle me!
\newcommand{\ifloaded}[3]{%
  \expandafter\ifx\csname ver@#1\endcsname\relax%
    #3\else#2\fi}
\begin{document}
  \ifloaded{hyperref.sty}{yes}{no}
\end{document}

我很想知道专家们对这个简单解决方案的局限性的看法。我简化了 from 中的大部分代码\ltx@ifundefinedltxcmds但也许我简化得太多了!此外,这似乎可以在没有\makeatletterand 的情况下工作\makeatother……但真的是这样吗?

相关内容