summaryrefslogtreecommitdiff
path: root/macros/generic/catcodes/use
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/generic/catcodes/use
Initial commit
Diffstat (limited to 'macros/generic/catcodes/use')
-rw-r--r--macros/generic/catcodes/use/actcodes.sty147
-rw-r--r--macros/generic/catcodes/use/catchdq.sty142
-rw-r--r--macros/generic/catcodes/use/stacklet.sty123
3 files changed, 412 insertions, 0 deletions
diff --git a/macros/generic/catcodes/use/actcodes.sty b/macros/generic/catcodes/use/actcodes.sty
new file mode 100644
index 0000000000..f868dec158
--- /dev/null
+++ b/macros/generic/catcodes/use/actcodes.sty
@@ -0,0 +1,147 @@
+ \input plainpkg
+\ProvidesPackage{actcodes}[2012/11/07 v0.2a active characters (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
+%%
+%% == Purpose and Usage ==
+%% The package derives from switching category codes
+%% in the 'nicetext' and 'morehype' bundles and should
+%% improve them.
+%%
+%% === Installing and Calling ===
+%% The file `actcodes.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 files `plainpkg.tex' and `stacklet.sty' %% stacklet 2012/09/19
+%% must be installed likewise.
+%%
+%% \emph{With} \LaTeX, the file should be loaded by `\RequirePackage{actcodes}'
+%% or `\usepackage{actcodes}'.
+%%
+%% \emph{Without} \LaTeX, load it by `\input actcodes.sty'.
+%%
+%% As explained in `plainpgk-doc.pdf', however, ``generic"
+%% packages based on 'plainpkg' should load 'actcodes' by
+%% `\RequirePackage{actcodes}'.
+%%
+%% === Commands and Syntax ===
+%% \label{sec:actcodes-cmds}
+%% 'actcodes.sty' provides \ |\MakeActive|, |\MakeActiveAss|,
+%% |\MakeActiveDef|, |\MakeActiveLet|,
+%% |\MakeOther|, |\MakeActiveOther| \ with rather obvious
+%% syntax---you find more detailed descriptions
+%% mixed with implementation below ... TODO
+%% ---Without \LaTeX, the latter's internal |\@gobble<arg>|
+%% is provided as well.
+%%
+%% == The Code ==
+%% === Our Private Letters ===
+\PushCatMakeLetterAt
+%%
+%% === The Core ===
+%% |\MakeActiveAss<ass-fun>\<char><ass-args>| ``activates" <char>
+%% and then applies assignment function <ass-fun> with arguments
+%% <ass-args> to it. The code derives from \LaTeX's
+%% `\@sverb' and `\do@noligs' and was also discussed
+%% on the \acro{LATEX-L} mailing list September 2010
+%% (Will Robertson; Heiko Oberdiek).
+%% The present definition generalizes
+%% `\MakeActiveDef' and `\MakeActiveLet' of my earlier packages.
+\gdef\MakeActiveAss#1#2{%
+ \MakeActive#2%
+ \begingroup \lccode`\~`#2\relax \lowercase{\endgroup #1~}}
+%% I was reluctant to provide |\MakeActive\<char>|,
+%% but with 'catchdq.sty', it would be better ... %% 2012/09/16
+\gdef\MakeActive#1{\catcode`#1\active}
+%% ... it just ``revives" the meaning that the corresponding
+%% active-character token last time ...
+%%
+%% === \cs{def} and \cs{let} ===
+%% |\MakeActiveDef\<char><parameters>{<replace>}|
+%% has been employed in 'fifinddo' and 'blog'
+%% (which is based on 'fifinddo') so far.
+\gdef\MakeActiveDef{\MakeActiveAss\def}
+%% W.r.t.\ the definition of this `\MakeActiveDef',
+%% Heiko Oberdiek remarked that it allows \emph{macro parameters},
+%% as opposed to my earlier definition in 'fifinddo'.
+%% Without parameters, this kind of macro has been used for
+%% conversion of text encodings ('atari.fdf',
+%% and I thought this was the idea of \ctanpkgref{stringenc} ...).
+%%
+%% |\MakeActiveLet\<char><cmd>| has been provided in 'niceverb' so far.
+%% The present package has been made in order to have
+%% `\MakeActiveLet' with 'blog.sty' as well, it was too annoying
+%% to use `\MakeActiveDef' there so often.
+\gdef\MakeActiveLet{\MakeActiveAss\let}
+%%
+%% === Switching Back \textellipsis ===
+%% Sometimes, the ``active" behaviour of <char> is too difficult,
+%% and you may want to switch bach to its ``simple" way ...
+%% This may work by |\MakeOther\<char>| ...
+%% with \LaTeX, `\MakeOther' just is `\@makeother' ...
+\ifltx \global\let\MakeOther\@makeother
+\else \gdef\MakeOther#1{\catcode`#112\relax}
+\fi
+%% But within a macro (or other) argument, you can't change the `\catcode'.
+%% (I~lost some time by not realizing that it was within a large argument
+%% where I tried to switch the `\catcode'.)
+%% Anyway or in certain cases, it may be better to keep a character
+%% ``active" throughout a document and just to change the \emph{expansion}
+%% of the ``active-character token." This can be done with
+%% `\MakeActiveLet' and `\MakeActiveDef' in certain cases already.
+%% E.g., when the \emph{``blank space"} has been ``activated" by
+%% `\obeylines', `\MakeActiveLet\ \space' ``undoes" this half-way,
+%% while it does not restore ``argument skipping" and
+%% ``compressing blank spaces."
+%%
+%% When character <char> should be ``active" for some time,
+%% but for certain moments you prefer that it behaves like an
+%% ``other character", you can switch to its ``other" expansion by
+%% |\MakeActiveOther\<char>|:
+\gdef\MakeActiveOther#1{%
+ \MakeActiveAss\edef#1{\expandafter\@gobble\string#1}}
+%% `\MakeActiveOther' uses \LaTeX's |\@gobble<arg>|,
+%% \emph{without} \LaTeX, 'actcodes' provides it:
+\ifltx\else \long\gdef\@gobble#1{} \fi
+% \show_ \MakeActiveOther\_ \show_ \expandafter\show_
+%% I am \emph{not} providing a version \emph{without}
+%% the `\catcode' change, although the latter is superfluous here
+%% TODO ...
+%%
+%% `niceverb' also provides |\MakeNormal\<char>|, it may migrate %% |...| 2012/11/07
+%% to here in the future, and there may be |\MakeActiveNormal\<char>|
+%% extending the above `\MakeActiveOther' TODO ...
+%%
+%% Also, a \emph{stack} might be used as in 'stacklet',
+%% even to switch \emph{meanings} of active-character tokens ...
+%% not sure TODO ...
+%%
+%% \ctanpkgref{babel} does similar things, but I never have ... TODO
+%%
+%% === Leaving and Version History ===
+\PopLetterCatAt
+\endinput
+%%
+%% VERSION HISTORY
+
+v0.1 2012/08/26 started, almost completed
+ 2012/08/27 completed; realizing \Push...At ..., bug fixes
+v0.2 2012/08/28 \global\let, \def -> \gdef
+ 2012/09/16 \MakeActive
+ 2012/09/19 doc.: stacklet
+v0.2a 2012/11/07 doc.: |...| on \MakeNormal
diff --git a/macros/generic/catcodes/use/catchdq.sty b/macros/generic/catcodes/use/catchdq.sty
new file mode 100644
index 0000000000..4004ca7cd2
--- /dev/null
+++ b/macros/generic/catcodes/use/catchdq.sty
@@ -0,0 +1,142 @@
+ \input plainpkg
+\ProvidesPackage{catchdq}[2015/05/22 v0.21 typographic dqs (UL)]
+%% %% rm. "simple" -- too long -- 2015/05/22
+%%
+%% Copyright (C) 2012 2015 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
+%%
+%% == Purpose and Usage ==
+%%
+%% === Installing and Calling ===
+%% The file `catchdq.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 files `plainpkg.tex' and `stacklet.sty' %% stacklet 2012/09/19
+%% must be installed likewise.
+%%
+%% \emph{With} \LaTeX, the file should be loaded by `\RequirePackage{catchdq}'
+%% or `\usepackage{catchdq}'.
+%%
+%% \emph{Without} \LaTeX, load it by `\input catchdq.sty'.
+%%
+%% As explained in `plainpgk-doc.pdf', however, ``generic"
+%% packages based on 'plainpkg' should load 'catchdq' by
+%% `\RequirePackage{catchdq}'.
+%%
+%% === Commands and Syntax ===
+%% \label{sec:catchdq-cmds}
+%% 'catchdq.sty' (indirectly) allows using |"<no-dqs>"|
+%% for surrounding <no-dqs> with typographical quotation marks,
+%% using that double quote |"| as an active character.
+%% As rendering that `"' active during defining macros can
+%% corrupt the latter, the user (or package writer) must
+%% activate that `"' explicitly by |\catchdqs|.
+%%
+%% Further difficulties may arise after `\catchdqs',
+%% various ways to get around them are described in the remaing sections.
+%%
+%% == The Code ==
+%% === Required ===
+%% The package is an application (of ideas of) 'actcodes.sty':
+\RequirePackage{actcodes}
+%%
+%% === The Core: \cs{catchdq} ===
+%% % \label{sec:catchdq-core}
+%% |\catchdq<no-dqs>"| will expand to |\dqtd{<no-dqs>}|,
+%% provided the \acro{ASCII} double quote is an active character:
+{\MakeActive\"\gdef\catchdq#1"{\dqtd{#1}}}
+%%
+%% === What Double Quotes Actually Are ===
+%% |\dqtd| in turn is a kind of ``variable." 'blog.sty' offered
+%% |\endqtd| for English typographical double quotes,
+%% |\dedqtd| for German ones, and |\asciidqtd| for ``non-typographical"
+%% double quotes (as needed for \acro{XML} attributes).
+%% |\asciidq| accesses a single \acro{ASCII} double quote,
+%% |\enldq| a single English typographical left one,
+%% |\enrdq| a single English typographical right one.
+%% (It may be useful to access them indepentently of each other,
+%% in certain complex situations ...)
+%% 'blog.sty', dealing with \acro{HTML}, of course has different ideas
+%% about them TODO.
+\gdef\asciidq{"}
+\gdef\asciidqtd#1{"#1"}
+%% We allow loading 'catchdq' \emph{after} another package
+%% (such as 'blog.sty') has chosen meanings for `\endqtd' and the
+%% like. Before v0.21, definedness was tested by
+%% `\ifx'...`\undefined', which two times fell
+%% prey to some earlier `\@ifundefined'. So now:
+\begingroup \escapechar=-1
+\def\provass#1#2#3{%
+ \expandafter\ifx\csname \string#2\endcsname\relax #1#2#3\fi}
+\provass \gdef \enldq {{``}}
+\provass {\global\let} \enrdq \asciidq
+\provass \gdef \endqtd {#1{\enldq#1\enrdq}}
+%% Typographical alternatives to `\endqtd' may be obtained
+%% from \ctanpkgstyref{ngerman} or so, if you are smart ...
+%% %% <- 2012/09/20 ->
+%% (see Section~\ref{sec:sw} for how it works):
+\provass \gdef \dedqtd {#1{\glqq#1\grqq}}
+%% 'blog.sty', dealing with \acro{HTML}, had a different idea
+%% about `\endqtd' of course. It has also used the mechanism of
+%% the \ctanpkgref{langcode} package that allows using `\dqtd' and other
+%% language-depended constructs with an ``implicit" choice according
+%% to the ``current language code," which should appear soon.
+%%
+%% === Switching ===
+%% \label{sec:sw}
+%% 'blog.sty' usually does a single switch which gets a new name now:
+%% |\catchdqs|.
+\gdef\catchdqs{\MakeActiveLet\"\catchdq}
+%% After this, |"<no-dqs>"| will expand to `\dqtd{#1}'.
+%% The default expansion for |\dqtd| will be |\endqtd|:
+\provass {\global\let} \dqtd \endqtd
+%% Might be done by |\endqs|---when there are alternatives,
+%% but 'blog.sty' and 'langcode.sty' do this in a different way ... TODO
+% \gdef\endqs{\let\dqtd\endqtd}
+% \ifx\dqtd\undefined \global\endqs \fi
+\endgroup
+%% \catchdqs Actually, here is a little "Tessst"~...
+%% \let\dqtd\dedqtd \ and here with "doytshe doppleta unf..." $\dots$ \
+%% %% anf -> unf 2015/05/22
+%% The latter has been achieved by
+%% \[`\usepackage{ngerman} \originalTeX'\]
+%% \MakeOther\"
+%%
+%% |\MakeOther\"| may switch off catching mode (---done just before,
+%% as \ctanpkgref{niceverb} at present doesn't render it verbatim).
+%% 'actcodes' suggests
+%% a different way to return from the `\catchdqs' state:
+%% Let the character active and change its meaning only, let it
+%% \emph{expand} to its ``other" version---by |\activeasciidqs|?
+%% |\MakeActiveOther\"| and \catchdqs
+%% \let"\asciidq
+%% |\let"\asciidq| (it works!) or |\MakeActiveLet\"\asciidq|
+%% (abbreviate as `\activeasciidqs'?) ... In 'blog.sty', there never
+%% was a need for switching back. We must rework interaction with
+%% 'niceverb' and can perhaps simplify the latter, ... TODO
+%%
+%% === Leaving and Version History ===
+\endinput
+%%
+%% VERSION HISTORY
+
+v0.1 2010/11/13 in texblog.fdf
+v0.2 2012/09/17 own file, new ideas ...
+ 2012/09/19 doc: stacklet
+ 2012/09/20 \dedqtd conditionally; reworked doc.,
+ tested ngerman.sty
+v0.21 2015/05/22 better test for undefinedness
diff --git a/macros/generic/catcodes/use/stacklet.sty b/macros/generic/catcodes/use/stacklet.sty
new file mode 100644
index 0000000000..b2f3ee4cf6
--- /dev/null
+++ b/macros/generic/catcodes/use/stacklet.sty
@@ -0,0 +1,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