为什么我评论时\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}