summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/storecmd/storecmd.sty
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /macros/latex/contrib/storecmd/storecmd.sty
Initial commit
Diffstat (limited to 'macros/latex/contrib/storecmd/storecmd.sty')
-rw-r--r--macros/latex/contrib/storecmd/storecmd.sty280
1 files changed, 280 insertions, 0 deletions
diff --git a/macros/latex/contrib/storecmd/storecmd.sty b/macros/latex/contrib/storecmd/storecmd.sty
new file mode 100644
index 0000000000..08a81919d0
--- /dev/null
+++ b/macros/latex/contrib/storecmd/storecmd.sty
@@ -0,0 +1,280 @@
+%++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++%
+% %
+% This is file 'storecmd.sty', version 0.0.1, October 2011. %
+% %
+% This package and accompanying files may be distributed and/or %
+% modified under the conditions of the LaTeX Project Public License, %
+% either version 1.3 of this license or any later version. The latest %
+% version of this license is in http://www.latex-project.org/lppl.txt %
+% and version 1.3 or later is part of all distributions of LaTeX %
+% version 2005/12/01 or later. %
+% %
+% The LPPL maintenance status of this software is 'author-maintained'. %
+% %
+% This software is provided 'as it is', without warranty of any kind, %
+% either expressed or implied, including, but not limited to, the %
+% implied warranties of merchantability and fitness for a particular %
+% purpose. %
+% %
+% Copyright (c) 2011 Ahmed Musa (amusa22@gmail.com). %
+% %
+%++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++%
+
+\@ifpackageloaded{catoptions}{}{\RequirePackage{catoptions}[2011/08/07]}
+\UseNormalCatcodes
+\StyleFilePurpose{Store command name at definition time}
+\StyleFileRCSInfo
+$Id: storecmd.sty,v 0.0.1 2011/10/15 09:00:00 Ahmed Musa Exp $
+\ProvidesPackage{storecmd}[\StyleFileInfo]
+\NeedsTeXFormat{LaTeX2e}[2005/12/01]
+\SetStyleFileMessages[stcmd@]{info}{warn}{err}
+\RequirePackage{ltxtools}[2011/09/10]
+\robust@def*\stcmd@verbosewarn#1{\ifstcmd@verbose\stcmd@warn{#1}\fi}
+\robust@def*\stcmd@verboseinfo#1{\ifstcmd@verbose\stcmd@info{#1}\fi}
+\providecommand*\ifsentinelTF[1]{%
+ \edef\reserved@a{\unexpanded{#1}}%
+ \ifx\reserved@a\currsentinel\expandafter\@firstoftwo
+ \else\expandafter\@secondoftwo\fi
+}
+\robust@def*\stcmd@merge{\LTS@testopt\stcmd@m@rge,}
+\robust@def*\stcmd@m@rge[#1]#2#3{%
+ \trim@@spaces{#3}\LTS@tempa
+ \ifdefTF#2{}{\def#2{}}%
+ \xifinsetTF{#1\@space\LTS@tempa#1}{#1\@space#2#1}{}{%
+ \xdef#2{\csliststack{#1\@space}#2\expandcsonce\LTS@tempa}%
+ }%
+}
+\newvariables{if}[stcmd@]{storefile,storecmd,cmdescap,global,long,
+ protected,verbose}
+\robust@def*\stcmd@typeintocontinue{%
+ \message{^^JType x or X to quit, or <RETURN> to proceed^^J}%
+ {\endlinechar-1\global\read-1 to\@gtempa}%
+ \lowercase\expandafter{\expandafter\def\expandafter
+ \@gtempa\expandafter{\@gtempa}}%
+ \xifstrcmpTF\@gtempa{x}\LTS@emergencystop\relax
+}
+
+\docommalist{storerenew,overwrite,neversave,showsource}{%
+ \XDeclareSwitchOption{#1}[true](stcmd@){%
+ \ifdefswitchTF{stcmd@#1}{%
+ \stcmd@verboseinfo{'#1' set true\on@line}%
+ }{}%
+ }%
+}
+
+\XDeclareSwitchOption{verbose}[true](stcmd@){%
+ \ifdefswitchTF{stcmd@verbose}{%
+ \stcmd@info{'verbose' set true\on@line}%
+ }{}%
+}
+\XDeclareCommandOption{storefile}[cmdnamesfile](stcmd@){%
+ \ifblankTF{#1}{%
+ \stcmd@err{No storage file name}\@ehc
+ \stcmd@storefilefalse
+ }{%
+ \if\stcmd@overwrite\else
+ \IfFileExists\stcmd@storefile{%
+ \message{^^J! File '\stcmd@storefile' already exists:}%
+ \stcmd@typeintocontinue
+ }{}%
+ \fi
+ \stcmd@storefiletrue
+ \NewWrites[stcmd@]{outputcheck}%
+ \immediate\openout\stcmd@outputcheck=\stcmd@storefile\@space
+ \immediate\write\stcmd@outputcheck{\relax}%
+ \LTS@AfterEndDocument{\immediate\closeout\stcmd@outputcheck}%
+ }%
+}
+\XDeclareCommandOption{storecmd}[cmdnamesmacro](stcmd@){%
+ \def\stcmd@tempa##1{%
+ \message{^^J! Command '##1\stcmd@storecmd' already exists:}%
+ \stcmd@typeintocontinue
+ }%
+ \ifblankTF{#1}{%
+ \stcmd@err{No storage command name}\@ehc
+ \stcmd@storecmdfalse
+ }{%
+ \stcmd@storecmdtrue
+ \ifescapedTF{#1}{%
+ \if\stcmd@overwrite\else
+ \ifdefFT{#1}{}{\stcmd@tempa\expandcsonce}%
+ \fi
+ \stcmd@cmdescaptrue
+ \gdef#1{}%
+ }{%
+ \if\stcmd@overwrite\else
+ \ifcsndefFT{#1}{}{\stcmd@tempa\noexpandcsn}%
+ \fi
+ \stcmd@cmdescapfalse
+ \csn@gdef{#1}{}%
+ }%
+ }%
+}
+\XDeclareOption*{\stcmd@warn{Unknown option '\CurrentOption' ignored}}
+\XExecuteOptions{%
+ verbose=true,neversave=false,storerenew=false,overwrite=false,
+ showsource=false
+}
+\XProcessOptions*\relax
+\robust@def*\longcmd{\stcmd@longtrue}
+\robust@def*\globalcmd{\stcmd@globaltrue}
+\robust@def*\protectedcmd{\stcmd@protectedtrue}
+\robust@def*\stcmd@cmdprefixes@a{%
+ \ifstcmd@global\global\fi
+ \ifstcmd@long\long\fi
+ \ifstcmd@protected\protected\fi
+}
+\robust@def*\stcmd@cmdprefixes@b{%
+ \ifstcmd@global
+ \stcmd@globalfalse
+ \let\stcmd@global\global
+ \else
+ \let\stcmd@global\@empty
+ \fi
+ \ifstcmd@long
+ \stcmd@longfalse
+ \let\stcmd@long\long
+ \else
+ \let\stcmd@long\@empty
+ \fi
+ \ifstcmd@protected
+ \stcmd@protectedfalse\protected
+ \fi
+ \stcmd@global\stcmd@long
+}
+\robust@def*\defsavecmd{\cpt@starorlong\stcmd@defsavecmd}
+\robust@def*\newsavecmd{\cpt@starorlong\stcmd@newsavecmd}
+\robust@def*\renewsavecmd{\cpt@starorlong\stcmd@renewsavecmd}
+\robust@def*\stcmd@savecmd#1{%
+ \if\stcmd@neversave\else
+ \begingroup
+ \escapechar=92
+ \xdef\@gtempa{%
+ \expandafter\@gobble\string#1%
+ \if\stcmd@showsource
+ \@space(\ifx\@currname\@empty
+ \jobname.tex\else\@currname.\@currext\fi)%
+ \fi
+ }%
+ \endgroup
+ \ifstcmd@storefile
+ \immediate\write\stcmd@outputcheck{\@gtempa}%
+ \fi
+ \ifboolFT{stcmd@storecmd}{}{%
+ \cptexpanded{%
+ \stcmd@merge
+ \ifstcmd@cmdescap
+ \expandcsonce\stcmd@storecmd
+ \else
+ \noexpandcsn\stcmd@storecmd
+ \fi
+ {\@gtempa}%
+ }%
+ }%
+ \fi
+}
+\robust@def*\stcmd@defsavecmd#1{%
+ \ifdefFT{#1}{}{%
+ \if\stcmd@verbose
+ \stcmd@info{Command '\string#1' is redefined\on@line}%
+ \fi
+ }%
+ \stcmd@savecmd{#1}%
+ \stcmd@cmdprefixes@b\l@ngrel@x\def#1%
+}
+\robust@def*\stcmd@newsavecmd#1{%
+ \stcmd@savecmd{#1}%
+ \LTS@testopt{\stcmd@n@wc@mmand#1}{0}%
+}
+\robust@def*\stcmd@renewsavecmd#1{%
+ \ifdefTF{#1}{%
+ \if\stcmd@storerenew
+ \stcmd@savecmd{#1}%
+ \fi
+ \let\ifcsdefinable\rc@ifcsdefinable
+ \stcmd@n@wcommand#1%
+ }{%
+ \stcmd@err{Command '\string#1' is undefined:
+ \MessageBreak it can't be redefined}\@ehc
+ }%
+}
+\robust@def*\stcmd@newcommand{\cpt@starorlong\stcmd@n@wcommand}
+\robust@def*\stcmd@n@wcommand#1{\LTS@testopt{\stcmd@n@wc@mmand#1}0}
+\robust@def*\stcmd@n@wc@mmand#1[#2]{%
+ \ifnextisbrack{\stcmd@xargdef@a#1{#2}}{\stcmd@argdef@a#1{#2}}%
+}
+\robust@def\stcmd@argdef@a#1#2{%
+ \LTS@testpnopt{\stcmd@argdef@b{#1}{#2}}{}%
+}
+\robust@def\stcmd@argdef@b#1#2(#3)#4{%
+ \def\stcmd@tempd{#3}%
+ \ifcsdefinable#1{\stcmd@yargdef#1\@ne{#2}{#4}}%
+}
+\robust@def\stcmd@xargdef@a#1#2[#3]{%
+ \LTS@testpnopt{\stcmd@xargdef@b{#1}{#2}{#3}}{}%
+}
+\robust@def\stcmd@xargdef@b#1#2#3(#4)#5{%
+ \def\stcmd@tempd{#4}%
+ \ifcsdefinable#1{%
+ \stcmd@cmdprefixes@a
+ \expandafter\def\expandafter#1\expandafter{%
+ \expandafter\@protected@testopt\expandafter#1%
+ \csname\string#1\endcsname{#3}%
+ }%
+ \aftercsname\stcmd@yargdef{\string#1}\tw@{#2}{#5}%
+ }%
+}
+\robust@def\stcmd@yargdef#1#2#3{%
+ \ifnum#2=\tw@
+ \def\stcmd@tempb##11{[####1]}%
+ \else
+ \let\stcmd@tempb\@gobble
+ \fi
+ \expandafter\stcmd@zargdef\expandafter{\number#3}#1%
+}
+\robust@def\stcmd@zargdef#1#2{%
+ \begingroup
+ \def\stcmd@tempa##1#1##2##{%
+ \def\stcmd@tempc{\stcmd@cmdprefixes@b\l@ngrel@x}%
+ \cptexpandsecond{\expandafter\endgroup\stcmd@tempc
+ \expandafter\def\expandafter#2\stcmd@tempb##1#1}{\elt{#1}}%
+ }%
+ \@tempcnta\z@pt
+ \loop
+ \advance\@tempcnta\@ne
+ \csn@def{d\number\@tempcnta}{}%
+ \ifnum\@tempcnta<9\relax
+ \repeat
+ \ifx\stcmd@tempd\@empty\else
+ \@tempcnta\z@pt
+ \def\do##1##2{%
+ \ifstrcmpTF{##1}\zargdef@nil{}{%
+ \advance\@tempcnta\@ne
+ \ifnum\@tempcnta>#1\relax
+ \stcmd@err{Number of delimiters exceeds
+ number of parameters}\@ehc
+ \fi
+ \ifinsetTF{,##1,}{,1,2,3,4,5,6,7,8,9,}{}{%
+ \stcmd@err{Invalid delimiter syntax:
+ \MsgBrk no digit [1-9] found before delimiter}\@ehc
+ }%
+ \csn@def{d##1}{##2}\do
+ }%
+ }%
+ \expandafter\do\stcmd@tempd\zargdef@nil\zargdef@nil
+ \fi
+ \ifx\stcmd@tempb\@gobble\else
+ \expandafter\ifx\csname d1\endcsname\@empty\else
+ \stcmd@err{Argument one of command \string#2 is
+ \MsgBrk already delimited by '[]'}\@ehc
+ \fi
+ \fi
+ \def\elt##1{\expandcsnonce{d##1}}%
+ \edef\stcmd@tempc{0####1\ifx\stcmd@tempb\@gobble\elt1\fi
+ ####2\elt2####3\elt3####4\elt4####5\elt5####6\elt6%
+ ####7\elt7####8\elt8####9\elt9%
+ }%
+ \expandafter\stcmd@tempa\stcmd@tempc###1%
+}
+
+\endinput