我想了解更多有关 LaTeX 的临时命令,例如\@tempa, \@tempswatrue
特别是对于以下构造,我想知道我的替换是否正确:
% Provide bool for loaded package
\newcommand\isPackageLoaded[1]{%
\providebool{\tpl@idstring@#1}
\IfElsePackageLoaded{#1}{%
\setboolean{\tpl@idstring@#1}{true}%
}{%
\setboolean{\tpl@idstring@#1}{false}
}%
\boolean{\tpl@idstring@#1}%
}
替换为以下代码
\newcommand\isPackageLoaded[1]{%
\IfElsePackageLoaded{#1}{%
\@tempswatrue
}{%
\@tempswafalse
}%
\boolean{\@tempswa}%
}
编辑:我应该补充一点,第一个代码也是错误的:
! Undefined control sequence.
\isPackageLoaded #1->\providebool {\tpl@idstring@
#1} \IfElsePackageLoaded {...
EDIT2:处理布尔序列时,存在一些 iften 与 etoolbox 问题。
仅使用 ifthen 命令不起作用:
\newcommand\isPackageLoaded[1]{%
\provideboolean{tpl@package@#1}%
\IfElsePackageLoaded{#1}%
{\setboolean{tpl@package@#1}{true}}
{\setboolean{tpl@package@#1}{false}}%
\boolean{tpl@package@#1}%
}
\begin{document}
\ifthenelse{\isPackageLoaded{lmodern}}{lmodern loaded}{lmodern NOT loaded}
\end{document}
错误:
! Incomplete \iffalse; all text was ignored after line 35.
<inserted text>
\fi
如果我只使用 etoolbox cs:
\newcommand\isPackageLoaded[1]{%
\providebool{tpl@package@#1}%
\IfElsePackageLoaded{#1}%
{\setbool{tpl@package@#1}{true}}
{\setbool{tpl@package@#1}{false}}%
\boolean{tpl@package@#1}%
}
我收到错误:
! Missing = inserted for \ifnum.
<to be read again>
\escapechar
l.35 \ifthenelse{\isPackageLoaded{lmodern}}
{lmodern loaded}{lmodern NOT loaded}
I was expecting to see `<', `=', or `>'. Didn't.
看起来两者不能一起使用。但只使用其中一个对我来说不起作用。
答案1
\providebool
期望一个字符串作为其参数;所以
\providebool{tpl@idstring@#1}
应该是可行的方法。但是 LaTeX 已经提供了一个用于测试包是否已加载的命令:\@ifpackageloaded
。
然而,每次都说\@ifpackageloaded{somepackage}{true}{false}
可能会很麻烦,特别是在需要考虑多个包裹的情况下。
\newcommand\isPackageLoaded[1]{%
\providebool{tpl@p@#1}
\@ifpackageloaded{#1}
{\setboolean{tpl@p@#1}{true}}
{\setboolean{tpl@p@#1}{false}}%
}
然后你可以说
\isPackageLoaded{hyperref}
\isPackageLoaded{caption}
将布尔值设置为正确的值,例如,
\ifboolexpr{ bool {tpl@p@hyperref} and bool {tpl@p@caption} }
{ what to do in case both packages are loaded }
{ what to do otherwise }