diff --git a/mkessler-findpackage.sty b/mkessler-findpackage.sty new file mode 100644 index 0000000..a1c89b3 --- /dev/null +++ b/mkessler-findpackage.sty @@ -0,0 +1,48 @@ +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{mkessler-findpackage}[2021-09-06 - Find a package that provides some command] + + +%%%% +% This is just a quick packaging of the post by +% 'Martin Nyolt' (https://tex.stackexchange.com/users/78783/martin-nyolt) +% found at +% https://tex.stackexchange.com/users/78783/martin-nyolt +% Note that SO answers are by default CC BY-SA 3.0 licensed, see +% https://creativecommons.org/licenses/by-sa/3.0/ + +\def\find@load#1[#2]#3[#4]{% + % load the package + \find@fileswith@pti@ns{#1}[#2]{#3}[#4]% + % check if commands exists now + \ifcsname\find@command\endcsname + \typeout{Package #3 introduces command \find@command.}% + % command has been found, revert to original version without checks + \let\@fileswith@pti@ns\find@fileswith@pti@ns + \else + % somehow, \@fileswith@pti@ns is restored after loading a package + % thus, patch it again + \let\@fileswith@pti@ns\find@load + \fi +}% + +\newcommand*{\findpackagebycommand}[1]{% + % using this multiple times - esp. when the package has not been found yet - + % will break things. Thus, check first that \find@command has never been defined before + \ifx\find@command\undefined + \def\find@command{#1}% + % first, check if this command is already defined + \ifcsname\find@command\endcsname + % in this case, just issue a warning and do nothing + \@latex@warning@no@line{Command \find@command \space is already defined}% + \else + % overwrite the internal \@fileswith@pti@ns command, which does the actual loading + % \@fileswith@pti@ns is used internally by \usepackage and \RequirePackage + \let\find@fileswith@pti@ns\@fileswith@pti@ns + \let\@fileswith@pti@ns\find@load + \fi + \else + % used multiple times - prevent and give a warning + \@latex@warning@no@line{You can use \protect\findpackagebycommand \space only once}% + \errmessage{Invalid use of command findpackagebycommand.}% + \fi +}