我想重新创建当前的 makros 以在每个文档中工作。目前我正在执行此任务,如果加载了包,则将根据需要提供命令。
看看下面的 MWE,它按预期工作。
\documentclass{scrreprt}
\usepackage{xifthen}
\newboolean{pkglddebug}
\setboolean{pkglddebug}{true}
\newboolean{pkgldxcolor}
\setboolean{pkgldxcolor}{false}
\providecommand{\pkgldxcolortxt}{Package xcolor not loaded or missing}
% Comment this package in or out to see what will happen.
% \usepackage{xcolor}
\makeatletter
\@ifpackageloaded{xcolor}%
{
\setboolean{pkgldxcolor}{true}
\renewcommand{\pkgldxcolortxt}{Package loaded}
}
{
}
\makeatother
\ifthenelse{\boolean{pkgldxcolor}}%
{%
\providecommand{\test}[1]{\textcolor{red}{\textbf{#1}}}
}
{
\ifthenelse{\boolean{pkglddebug}}%
{%
\providecommand{\test}[1]{Need Package xcolor}
}
{
}
\providecommand{\test}[1]{\textbf{#1}} % or \providecommand{\test}{} if you don't want to access anything
\providecommand{\textcolor}[2]{Sorry, xcolor not loaded, you tried to make #2 in color #1}
}
\begin{document}
\begin{itemize}
\item \test{A}
\item \textcolor{red}{text}
\item \pkgldxcolortxt
\end{itemize}
\end{document}
如果您注释掉 xcolor,示例仍可编译。如果您设置了调试标志,您将看到为什么该命令无法按预期工作。
这是一个非常原始的例子,检查包是否已加载并告诉命令如何工作。
我的问题:有没有更好的方法来实现这个解决方案?第二个问题是,是否有任何好的方法来验证命令的输入,例如
\providecommand{\mytext}[1]{
\providecommand{\mytestinput}{#1}
\renewcommand{\mytestinput}{#1}
\ifthenelse{\equal{\mytestinput}{validate[a-zA-Z]}{}{\renewcommand{\mytestinput}{Defaultvalue}}
\textbf{#1}
}
在这种情况下,每次编译时该命令都会起作用,并且不可能发生错误的行为。
这是一个好主意吗?
答案1
引入\setboolean{pkgldxcolor}{true}
然后测试布尔值没有任何用处,为什么不简单地使用
\@ifpackageloaded{xcolor}
{% do nothing
}
{% define \textcolor etc
}
但在这种情况下,你似乎根本不需要测试,你可以,\usepackage{xcolor}
或者如果你不想强制加载颜色,只需
\providecommand{\textcolor}[2]{%
Sorry, xcolor not loaded, you tried to make #2 in color #1}
它不需要由包加载测试来保护,因为它根本不会执行任何操作,也不会被color
加载和定义\textcolor
。