diff options
author | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
commit | e0c6872cf40896c7be36b11dcc744620f10adf1d (patch) | |
tree | 60335e10d2f4354b0674ec22d7b53f0f8abee672 /macros/latex/contrib/morehype/use/blogexec.sty |
Initial commit
Diffstat (limited to 'macros/latex/contrib/morehype/use/blogexec.sty')
-rw-r--r-- | macros/latex/contrib/morehype/use/blogexec.sty | 290 |
1 files changed, 290 insertions, 0 deletions
diff --git a/macros/latex/contrib/morehype/use/blogexec.sty b/macros/latex/contrib/morehype/use/blogexec.sty new file mode 100644 index 0000000000..0767561cc8 --- /dev/null +++ b/macros/latex/contrib/morehype/use/blogexec.sty @@ -0,0 +1,290 @@ +\NeedsTeXFormat{LaTeX2e}[1994/12/01] %% \newcommand* etc. +\ProvidesPackage{blogexec}[2012/12/20 v0.21 + assignments with blog.sty (UL)] +%% copyright (C) 2011 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 +%% We did our best to help you, but there is NO WARRANTY. +%% +%% Please report bugs, problems, and suggestions via +%% +%% http://www.contact-ednotes.sty.de.vu +%% +%% == Requirements == +%% The \ctanpkgref{dowith} package is needed for managing +%% and running lists of macros to be intercepted: +\RequirePackage{dowith} +%% Admittedly, `\do' and `\@elt' lists (as discussed in `dowith.pdf') +%% would be faster than the 'dowith' method, which might be relevant +%% here (TODO: how much?). I may abandon 'dowith' later, I just cannot +%% afford removing it now (2011/11/05, TODO). +%% +%% == Processing Source Files == +%% With |\BlogInterceptExtra|, 'blog.sty' +%% deals with \emph{empty} input lines just like +%% \[`\BlogCopyFile[<changes>]{<src-file>}'\] +%% does; \emph{otherwise} the content of `\fdInputLine' is copied to +%% |\fdOutputCode|. Before the latter is writen to the output file +%% <output> (as determined by a recent `\ResultFile{<output>}'), +%% |\BlogInterceptions| is run, its purpose is to extract assignment and other +%% ``execution" commands and to turn `\fdOutputCode' into an +%% expandable macro. We use `\def' because 'blog.sty' may have +%% provided a preliminary definition earlier: +\def\blog@icl@xtra{% + \let\BlogProcessLine\BlogAllowIntercepting + \let\BlogInterceptions\AllBlogInterceptions} +\def\BlogInterceptExtra{\@ifstar@intercept@hash\blog@icl@xtra} +\def\@ifstar@intercept@hash#1{\@ifstar{#1\BlogInterceptHash}#1} +%% And this is the default setting (TODO!?): +\BlogInterceptExtra +%% Below, there are commands for restricted (faster---TODO: relevant? +%% or less complex, to reduce danger) +%% interception functionality. (Maybe the file should be restructured.) +%% |\AllBlogInterceptions| first is nothing: +\InitializeListMacro\AllBlogInterceptions +%% ---and should become more below. +%% +%% |\BlogAllowIntercepting| stores the difference to 'blog.sty': +\newcommand*{\BlogAllowIntercepting}{% + \let\fdOutputCode\fdInputLine + \BlogInterceptions +%% When, after removing the intercepted command, the line is +%% empty, it is \emph{not} written into output: + \ifx\fdOutputCode\@empty \else + \WriteResult{% + \ProcessExpandedWith\fdOutputCode\BlogOutputJob}% +%% ... enabling ``ligatures" with 'blog.sty' v0.7. %% 2011/11/21 + \fi} +%% ... TODO: in 'fifinddo' with something like `\fdInterceptions'? +%% +%% Especially for storing file-specific macro definitions +%% with `\EXECUTE' (below), a parameter character +%% (usually hash mark) is needed. +%% %% mod. 2011/11/20: +%% 'fifinddo.sty' (so far---2011/11/20) +%% does not include it with `\BasicNormalCatCodes', +%% and 'blog.sty' +%% does not include it with `\BlogCodes' +%% ---the following |\BlogInterceptHash| does. +%% Moreover, |\MakeHashParameter| enables such definitions +%% when placed in a source file within the argument of a +%% separate(!) `\EXECUTE'. +\providecommand*{\MakeHashParameter}{\catcode`\#6 } +\def\BlogInterceptHash{% + \ToListMacroAdd\BlogCodes\MakeHashParameter + \MakeHashParameter} +%% TODO: default? 0-arg interception? +%% +%% == Intercepting Single-Parameter Commands == +%% === The General Method === +%% Macros to be intercepted that have a single argument will be +%% collected in |\blogOneArgInterceptions|: +\InitializeListMacro\blogOneArgInterceptions +\ToListMacroAdd\AllBlogInterceptions{% + \DoWithAllIn\blogTryOneArgCmd + \blogOneArgInterceptions} +%% Here |\blogTryOneArgCmd{<cmd>}| creates a ``sandbox" for parsing +%% in a similar way as 'fifinddo' does it, searching for <cmd>. +%% The method there was made thinking of reading files with +%% ``plain text" category codes, not aware of 'blog.sty'. +%% Maybe this was a mistake, and I will reconsider it. +%% There I also introduce a separate sandbox macro +%% for each search pattern, thinking of different types of sandboxes. +%% This is not done/needed here (strangely, TODO).---The sandbox +%% starts with the parsing macro. The latter's name derives from +%% <cmd> by prefixing something to its name. +%% |\StripEsc| is a little helper for removing the backslash +%% from a macro name. +\providecommand*{\StripEsc}{\expandafter\@gobble\string} +%% Name spaces: %% 2012/08/29 +\newcommand*{\blog@x}{\StripEsc\blogx} +\newcommand*{\blogTryOneArgCmd}[1]{% + \csname \blog@x:\StripEsc#1\expandafter\endcsname + \fdOutputCode \@gobble#1\@empty\@nil} +%% Here, `\@empty' is the dummy argument for <cmd>---this is what +%% must be modified for <cmd> with more than one parameter. +%% At present (2011/11/05), that tail starting with `\@gobble' +%% may stay at the end of `\fdOutputCode' for each interception per +%% `\fdInputLine', until it expands to nothing in the `\write'. +%% +%% |\MakeBlogOneArgInterception{<cmd>}{<run>}{<write>}| \ \ +%% says that when <cmd> is found in `\fdOutputCode', +%% <run> should be executed, and `<cmd><arg>' should be replaced +%% by <write> in `\fdOutputCode' where <arg> is the argument for +%% <cmd> found in `\fdOutputCode'. Let <arc> be <arg> without +%% delimiting braces if `<arg>' is `{<arc>}' +%% (otherwise `<arc>' is the same as `<arg>'). +%% Then use `#2' for referring to <arc> inside <run> and <write>. +%% (Sorry, I cannot afford replacing `#2' by a more natural +%% placeholder right now.) +\begingroup + \catcode`\|\z@ |MakeOther|\% %% \z@ 2011/11/22 + |@ifdefinable|MakeBlogOneArgInterception{% + |gdef|MakeBlogOneArgInterception#1#2#3{% +%% First we add <cmd> to `\blogOneArgInterceptions', +%% unless it is already there: %% 2011/11/07 + |TestListMacroForToken|blogOneArgInterceptions#1% + |ifin@ + |PackageWarning{blogexec}{Redeclaring |string#1.}% + |else + |ToListMacroAdd|blogOneArgInterceptions#1% + |fi +%% Now the parsing macro is defined, together with the actions +%% depending on the result: +%% %% TODO csnames/namemod.sty 2011/11/22 + |@namedef{|blog@x:|StripEsc#1}##1#1##2##3|@nil{% +%% #3 will be empty if and only if <cmd> does \emph{not} occur +%% in `\fdOutputCode'. A backslash made ``other" will not occur +%% in `\fdOutputCode', therefore the following +%% `\ifx' becomes true if and only if #3 is empty, i.e., +%% <cmd> does \emph{not} occur in `\fdOutputCode': + |ifx\##3\% +%% In this case we just do nothing. + |else +%% Otherwise, we apply <run> and <write>: + #2% + |def|fdOutputCode{##1#3##3}% + |fi}% + }% + }% +|endgroup +%% %% was single `%' 2011/11/20 +%% === &\EXECUTE === +%% |\EXECUTE{<run>}| runs <run> and is removed from the +%% output line: +\MakeBlogOneArgInterception\EXECUTE{#2}{} +%% You can \strong{store settings} <set> for processing a source +%% file in this file by `\EXECUTE{<set>}' +%% (e.g., shorthand macros only useful in this single file). +%% You even can switch off the interception functionality +%% after running the other settings <set> +%% by `\EXECUTE{<set>\BlogCopyLines}'. +%% +%% `\EXECUTE{<run>}' may be a great relief thinking of pure +%% expansion with 'blog.sty'. You may be happy enough with it +%% and \emph{restrict} the interception functionality to `\EXECUTE' +%% by |\BlogInterceptExecute|. Its definition may be a +%% redefinition of the preliminary macro in 'blog.sty'. +%% (TODO: option for stopping here, avoid 'dowith'.) +\def\blog@icl@exec{% + \let\BlogProcessLine\BlogAllowIntercepting + \def\BlogInterceptions{\blogTryOneArgCmd\EXECUTE}} +\def\BlogInterceptExecute{\@ifstar@intercept@hash\blog@icl@exec} +%% +%% === &\begin\ and &\end === +%% At present (2011/11/06), only |\begin{<env>}| will run %% box 2012/08/28 +%% settings. Macros `\<env>' and `\end<env>' will expand +%% in the `.html' as with 'blog.sty' alone, not touched here. +%% Settings to be \emph{run} must be stored in a macro +%% `\blogx.b:<env>'. If this has not been done, only `\relax' +%% (from `\csname') will be ``run." +\MakeBlogOneArgInterception\begin{% +%% Indeed, we have a ``modified selection" from \LaTeX's original `\begin': + \@ifundefined{#2}% + {\def\@tempa{\@latex@error{Environment #2 undefined}\@eha}}% + {\def\@tempa{\def\@currenvir{#2}% +% \edef\@currenvline{\on@line}% %% not in source + \csname \blog@x.b:#2\endcsname}}% %% \StripEsc->: 2012/08/28 + \begingroup \@tempa}{% + \csname #2\endcsname} +%% % %% TODO single token!? %% rm. 2011/12/15 +%% \[|\MakeBlogBeginRun{<env>}<args>{<begin-code>}|\] resembles +%% \[`\newenvironment*{<env>}<args>{<begin-code>}{<end-code>}'\] except that +%% it does not have `{<end-code>}': +\newcommand*{\MakeBlogBeginRun}{\@makeblogbeginrun\newcommand} +%% v0.2 allows redefinition by +%% \[|\ChangeBlogBeginRun{<env>}<args>{<begin-code>}|\] +\newcommand*{\@makeblogbeginrun}[2]{% + \expandafter #1\expandafter *% + \csname \blog@x.b:#2\endcsname} %% \StripEsc->: 2012/08/28 +\newcommand*{\ChangeBlogBeginRun}{\@makeblogbeginrun\renewcommand} +%% Moreover, v0.2 allows copying that action by +%% \[|\CopyBlogBeginRunTo{<env>}{<enw>}|\] +\newcommand*{\CopyBlogBeginRunTo}[2]{% + \withcsname \let \blog@x.b:#2\expandafter\endcsname + \csname \blog@x.b:#1\endcsname} +%% |\end{<env>}|: +\MakeBlogOneArgInterception\end{\@checkend{#2}\endgroup}{\end{#2}} +% \expandafter\show\csname blogx:end\endcsname +%% \[|\BlogInterceptEnvironments|\] restricts interception functionality +%% to `\EXECUTE', `\begin', and `\end': +\def\blog@icl@envs{% + \BlogInterceptExecute + \ToListMacroAdd\BlogInterceptions{% + \blogTryOneArgCmd\begin\blogTryOneArgCmd\end}} +\def\BlogInterceptEnvironments{\@ifstar@intercept@hash\blog@icl@envs} +%% TODO: \ 1.~imitate \LaTeX's toggling with `\emph' +%% (redefine it in italic environments) +%% \ 2.~code indenting (cf.~\ctanpkgref{inputtrc}) +%% +%% === Skipping Source Code === +%% The |{noblog}| environment ``suppresses" \TeX~source +%% code in the sense that it does not produce \HTML~code---while +%% 'blog.sty''s `{commentlines}' produces an \HTML~comment. +\newenvironment*{noblog}{}{} %% 2012/03/04 from ... +\MakeBlogBeginRun{noblog}{% + \BlogInterceptEnvironments %% 2012/06/22 + \let\WriteResult\@gobble} +%% +%% === A Comfortable Table Environment === +%% As an application of |\MakeBlogBeginRun| for 'blog.sty''s +%% |{stdallrulestable}|, we provide \lq`|'\rq\ as an active character +%% invoking 'blog.sty''s `\endcell' (move to next cell) %% was \cr 2011/11/10 +%% and an active character \lq`&'\rq\ for `\figurespace', +%% i.e., a Unicode symbol for aligning figures. +%% Indeed, we are \emph{not} going back to \LaTeX\ and Plain \TeX\ +%% by using `&' for moving to the next cell, I consider the present +%% choice more intuitive. +\MakeBlogBeginRun{stdallrulestable}{% + \MakeActiveDef\|{\endcell}\MakeActiveDef\&{\figurespace}} +%% I hope nobody will confuse `&' and `8'. A little drawback may be +%% that you now can't use `&' for inserting \acro{HTML} entities. +%% However, recall that these settings are restricted to the +%% `{stdrulestable}' environment, and that you can use +%% `\MakeBlogBeginRun{stdallrulestable}' again for your own choice +%% of shorthands. +%% (TODO: `\MakeActiveLet') +%% +%% +%% == Intercepting Two-Parameter Macros == +%% Here especially I have a macro +%% |\labelsection{<label>}{<title>}| \emph{in mind} +%% (TODO). +%% It could be handled by the one-argument approach +%% by storing the first argument and inserting another macro +%% that reads the second argument. Therefore I am not sure ... +%% (2011/11/04) +%% +%% == Leaving and HISTORY == +\endinput +%% \enlargethispage{2\baselineskip} %% 2012/08/28 + VERSION HISTORY + +v0.1 2011/11/04 started; arrived at \EXECUTE + 2011/11/05 rm. \blogx@dummy, corrected loop, + \BlogInterceptExtra, \BlogInterceptExecute + 2011/11/06 \BlogAllowIntercepting, emptiness test + with "other" backslash, \begin/\end + 2011/11/07 debugging (\catcode... in \@ifdefinable); + warning on reusing interceptor, + \BlogInterceptEnvironments; + doc.: raise interception level in \EXECUTE + 2011/11/08 \BlogInterceptHash (understanding needed hours) + 2011/11/10 `v0.1' in \Provides..., doc. fix, + removing experimental code, doc. all 1-arg + interceptions in one section + 2011/11/20 \BlogInterceptHash improved + 2011/11/20 doc. `%' doubled + 2011/11/21 \BlogOutputJob + 2011/11/22 TODO + \z@ for \MakeBlogOne... + 2011/12/15 rm. TODO +v0.2 2012/08/28 \begin/\end revised (\StripEsc wrong) + 2012/08/29 \ChangeBlogBeginRun, \CopyBlogBeginRun, + \blog@x +v0.21 2012/12/20 {noblog} |