我想创建一个用于测试不同软件包的文档,我想知道是否可以使用命令,以便只有加载了相应的软件包时才读取部分代码。我想到了这个,但它会抛出一个错误,我不知道如何修复。
\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
从更改minimal
为article
。
答案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@ifundefined
,ltxcmds
但也许我简化得太多了!此外,这似乎可以在没有\makeatletter
and 的情况下工作\makeatother
……但真的是这样吗?