/usr/share/texlive/texmf-dist/tex/generic/catcodes/stacklet.sty is in texlive-generic-extra 2013.20140215-2.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 | \input plainpkg
\ProvidesPackage{stacklet}[2012/11/07 v0.3a private letters (UL)]
%%
%% Copyright (C) 2012 Uwe Lueck,
%% http://www.contact-ednotes.sty.de.vu
%% -- author-maintained in the sense of LPPL below --
%%
%% This file can be redistributed and/or modified under
%% the terms of the LaTeX Project Public License; either
%% version 1.3c of the License, or any later version.
%% The latest version of this license is in
%% http://www.latex-project.org/lppl.txt
%% There is NO WARRANTY (actually somewhat experimental).
%%
%% Please report bugs, problems, and suggestions via
%%
%% http://www.contact-ednotes.sty.de.vu
%%
%% == Usage ==
%% === Installing and Calling ===
%% The file `stacklet.sty' is provided ready,
%% installation only requires
%% putting it somewhere where \TeX\ finds it
%% (which may need updating the filename data
%% base).\urlfoot{ukfaqref}{inst-wlcf}
%% However, the file `plainpkg.tex' must be installed likewise.
%%
%% \emph{With} \LaTeX, the file should be loaded by `\RequirePackage{stacklet}'
%% or `\usepackage{stacklet}'.
%%
%% \emph{Without} \LaTeX, both `\input stacklet.sty' and
%% `\input plainpkg' load `stacklet.sty'.
%%
%% \filbreak %% 2012/11/07
%% === Commands and Syntax ===
%% \label{sec:stacklet-cmds}
%% 'stacklet.sty' provides
%% \[|\PushCatMakeLetter\<char>|
%% \quad \textit{and}\quad
%% |\PopLetterCat\<char>|\]
%% for getting ``private letters" and giving them back
%% their previous category code
%% in package files with or without \LaTeX.
%% As \LaTeX\ has its own stack for `@', there are also
%% \[|\PushCatMakeLetterAt|
%% \quad \textit{and}\quad
%% |\PopLetterCatAt|\]
%% that care for `@''s category code \emph{without} \LaTeX\ only.
%%
%% == The Code ==
%% === Name Space ===
%% Each ``private letter" <char> gets its own stack,
%% in some name space, determined by |\cat_stack|
%% (`\withcsname' is from 'plainpkg.tex'):
\withcsname\xdef cat_stack\endcsname{%
\noexpand\string \withcsname\noexpand cat_stack\endcsname
\noexpand\string}
%% I.e., ?`cat_stack' will expand to
%% \[?`string'\,?`cat_stack'\,?`string'\]
%% in the notation of the \ctanpkgref{dowith} package
%% documentation. %% 2012/11/06
% \withcsname\show cat_stack\endcsname
%%
%% === Pushing ===
%% |\PushCatMakeLetter\<char>| ...
\xdef\PushCatMakeLetter#1{%
\noexpand\withcsname
\withcsname\noexpand pushcat_makeletter\endcsname
\withcsname\noexpand cat_stack\endcsname#1\endcsname#1}
% \show\PushCatMakeLetter
\withcsname\gdef pushcat_makeletter\endcsname#1#2{%
%% #1 is the stack token, #2 is the ``quoted" character. Pushing~...
\xdef#1{\the\catcode`#2\relax%
%% ... the new entry. `\relax' separates entries,
%% braces instead tend to get lost in popping ...
%% If the stack has existed before,
%% its previous content is appended:
\ifx#1\relax \else #1\fi}%
%% I thought of storing `\catcode's hexadecimally (without braces)
%% using \LaTeX's `\hexnumber', but the latter has so many tokens~...
%% Finally rendering <char> a ``letter":
\catcode`#211\relax}
%% Now we can use a ``private letter stack" for our own package:
\PushCatMakeLetter\_
%%
%% === Popping ===
%% |\PopLetterCat\<char>| passes `\<char>', the corresponding
%% stack token, and the latter's expansion to `\popcat_'.
%% `\end' serves as argument delimiter for the end of the stack only:
\gdef\PopLetterCat#1{%
\expandafter\expandafter\expandafter
\popcat_\csname\cat_stack#1\expandafter\endcsname
\expandafter \end \csname\cat_stack#1\endcsname#1}
%% `\popcat_' parses the expansion, assigns the old
%% category code and and stores the reduced stack:
\gdef\popcat_#1\relax#2\end#3#4{\catcode`#4#1\gdef#3{#2}}
%% ... check existence? TODO
%%
%% === No `@' Stack with \LaTeX ===
%% |\PushCatMakeLetterAt| is like `\PushCatMakeLetter\@'
%% except that it has no effect under \LaTeX:
\gdef\PushCatMakeLetterAt{\ifltx\else\PushCatMakeLetter\@\fi}
%% |\PopLetterCatAt| by analogy ...
\gdef\PopLetterCatAt{\ifltx\else\PopLetterCat\@\fi}
%%
%% === Leaving the Package File ===
%% ... in our new way:
\PopLetterCat\_
\endinput
%%
%% === VERSION HISTORY ===
v0.1 2012/08/24 started
2012/08/25 completed
2012/08/26 extending doc.; \def\withcsname removed
v0.2 2012/08/26 \with_catstack containing \endcsname and with
three popping macros replaced by \csname
content \cat_stack, cf. memory.tex;
restructured
2012/08/27 \PushCatMakeLetterAt fixed
v0.3 2012/08/27 def.s global
v0.3a 2012/11/06 doc.: "documentation"
2012/11/07 \filbreak
|