ifpackageloaded 问题

ifpackageloaded 问题

为什么我评论时\usepackage{geometry}出现错误?

\documentclass{book}

\usepackage{geometry}

\makeatletter
\@ifpackageloaded{geometry}
 {                               % i the package was loaded 
    \newcommand*{\qw}{\itshape}  % this is enabled, else is not enabled.                                                                                               
 }{}
\makeatother

\begin{document}
\qw hallo
\end{document}

答案1

LaTeX 定义了几个条件宏,其语法与原始的

\if?<condition><true>\else<false>\fi

其中\if?表示任何原始条件。LaTeX 定义的条件具有以下形式

\@ifsomething{<arg>}{<true>}{<false>}

或者

\@ifsomething{<arg1>}{<arg2>}{<true>}{<false>}

第一类条件是\@ifundefined\@ifpackageloaded;第二类条件是\@ifpackagelater\@ifpackagewith。 区分的动机是,在第二种情况下,我们需要更多的东西来检查条件(例如,包名称和选项名称\@ifpackagewith)。

当条件满足或不满足时,分别执行<true>和代码。所以<false>

\@ifpackageloaded{geometry}
  {\newcommand\qw{\itshape}}
  {\newcommand\qw{\bfseries}}

是答案。当然,任一参数都可以为空。

您可以在以下位置找到意大利语的示例\@ifpackageloaded和更多信息这本书(主要问题见第 78 页)

笔记还有没有“假”分支;如果未定义,\@ifdefinable<control sequence>{<true>}它将执行代码,否则引发错误(忽略代码)。<true><control sequence><true>

答案2

else 部分应该放在第二个参数中:

\documentclass{book}

%\usepackage{geometry}

\makeatletter
\@ifpackageloaded{geometry}
 {% if the package was loaded
  \newcommand*{\qw}{\itshape}%
 }
 {%else:
  \newcommand*{\qw}{\bfseries}%
 }
\makeatother

\begin{document}
\qw hallo
\end{document}

答案3

我认为你想要的是

\documentclass{book}

\usepackage{geometry}

\makeatletter
\@ifpackageloaded{geometry}
 {
    \newcommand*{\qw}{\itshape}  % this is enabled
 }{
    \newcommand*{\qw}{\bfseries} % this is enabled?
}
\makeatother

\begin{document}
\qw hallo
\end{document}

接受\@ifpackageloaded两个参数:如果包已加载或未加载,该做什么。你\if实际上什么也不做。

编辑:问题似乎已经改变

现在的问题是,如果未加载包,则宏\qw不会得到定义。类似这样的内容可能就是您想要的

\documentclass{book}

\usepackage{geometry}

\makeatletter
\@ifpackageloaded{geometry}
 {
    \newcommand*{\qw}{\itshape}  % this is enabled
 }{
    \newcommand*{\qw}{} % this is enabled?
}
\makeatother

\begin{document}
\qw hallo
\end{document}

相关内容