summaryrefslogtreecommitdiff
path: root/macros/plain/contrib/transparent-io/TrIOsupport.org
diff options
context:
space:
mode:
Diffstat (limited to 'macros/plain/contrib/transparent-io/TrIOsupport.org')
-rw-r--r--macros/plain/contrib/transparent-io/TrIOsupport.org163
1 files changed, 163 insertions, 0 deletions
diff --git a/macros/plain/contrib/transparent-io/TrIOsupport.org b/macros/plain/contrib/transparent-io/TrIOsupport.org
new file mode 100644
index 0000000000..b62b15ded7
--- /dev/null
+++ b/macros/plain/contrib/transparent-io/TrIOsupport.org
@@ -0,0 +1,163 @@
+% \let-assignments of the used primitives, internal regeisters and quantities
+\let\TRIObegingroup\begingroup
+\let\TRIOendgroup\endgroup
+\let\TRIOexpandafter\expandafter
+\let\TRIOnoexpand\noexpand
+\let\TRIOdef\def
+\let\TRIOedef\edef
+\let\TRIOgdef\gdef
+\let\TRIOxdef\xdef
+\let\TRIOlet\let
+\let\TRIOfuturelet\futurelet
+\let\TRIOglobal\global
+\let\TRIOglobaldefs\globaldefs
+\let\TRIOifcase\ifcase
+\let\TRIOifcat\ifcat
+\let\TRIOifnum\ifnum
+\let\TRIOifx\ifx
+\let\TRIOor\or
+\let\TRIOelse\else
+\let\TRIOfi\fi
+\let\TRIOafterassignment=\afterassignment
+\let\TRIOimmediate\immediate
+\let\TRIOinput\input
+\let\TRIOread\read
+\let\TRIOwrite\write
+\let\TRIOthe\the
+\let\TRIOnumber\number
+\let\TRIOadvance\advance
+\let\TRIOcatcode\catcode
+\let\TRIOfont\font
+\let\TRIOinputlineno\inputlineno
+\let\TRIOrelax\relax
+\let\TRIOundefined\undefined
+%
+\let\TrIOspace\space
+%
+\catcode`@=11
+\def\wlog{\TRIOimmediate\write\m@ne}% avoid our macros for \immediate in \wlog
+\def\TrIOwlog{\TRIOimmediate\TRIOwrite\m@ne}% and provide version with our \write
+\def\TrIOmessage{\TRIOimmediate\TRIOwrite\sixt@@n}% can't use \newlinechar
+\catcode`@=12
+%
+% First: \afterassignment
+%
+\newif\ifTrIOsavedtoken % true: a token is stored by \afterassignment
+\newif\ifTrIOblockafterassignment % true: don't insert a token after an assignment
+\newif\ifTrIOusetokenlist % true: store the saved token in a token register
+\newtoks\TrIOtoken % the token register for \afterassignment
+\newtoks\TrIOtrafterassignment
+% \globaldefs
+\def\TrIOglobaldefs{% inform about \globaldefs>0 and switch to \globaldefs=0
+ \TRIOifnum\TRIOglobaldefs>0 \TrIOmessage{TrIO Info: globaldefs is >0 (store)}%
+ \TRIOafterassignment\TrIOsuspendafterassignment \TRIOglobaldefs=0
+ \TRIOdef\TrIOresetglobaldefs{\TrIOblockafterassignmentfalse
+ \TRIOafterassignment\TrIOinitafterassignment\TRIOglobaldefs=1 }%
+ \TRIOelse\TRIOifnum\TRIOglobaldefs<0
+ \TRIOafterassignment\TrIOsuspendafterassignment \TRIOglobaldefs=0
+ \TRIOdef\TrIOresetglobaldefs{\TrIOblockafterassignmentfalse
+ \TRIOafterassignment\TrIOinitafterassignment\TRIOglobaldefs=-1 }%
+ \TRIOelse \TrIOsuspendafterassignment
+ \TRIOdef\TrIOresetglobaldefs{\TrIOresumeafterassignment}%
+\TRIOfi\TRIOfi}
+% the replacement of the primitive
+\def\afterassignment{\TRIOthe\TrIOtrafterassignment}
+\TrIOtrafterassignment={\TrIOafterassignment}
+\def\TrIOafterassignment{% save a token for further inspection
+ \TRIObegingroup\TRIOendgroup % a trick to make the prefix \global invalid
+ \TrIOglobaldefs \TrIOsavedtokentrue % stop \globaldefs; store a token
+ \TRIOfuturelet\TrIOsavedtoken\TrIOchecktoken}% the token stays in the input
+% two more user commands for those who know the macros
+\def\TrIOsuspendafterassignment{% inactivate the application of the token
+ \TrIOblockafterassignmenttrue}
+\def\TrIOresumeafterassignment{% activate insertion of a stored token
+ \TrIOblockafterassignmentfalse\TrIOinitafterassignment}
+\def\TrIOinitafterassignment{\TRIOafterassignment\TrIOAFTERASSIGNMENT}
+% the internal macros
+\def\TrIOchecktoken{% check type of token, store a macro in token register
+ \TRIOifcat\TRIOnoexpand\TrIOsavedtoken\TRIOrelax
+ \TRIOlet\TrIOnext=\TrIOstoresavedtoken % save the macro in \TrIOtoken
+ \TRIOelse \TRIOlet\TrIOnext=\TrIOremovesavedtoken % otherwise remove token
+ \TRIOfi \TrIOnext}
+\def\TrIOstoresavedtoken#1{% #1: control sequence stored in token register
+ \TRIOlet\TrIOnext=\TRIOundefined
+ \TrIOusetokenlisttrue\TrIOtoken={#1}\TrIOresetglobaldefs}
+\def\TrIOremovesavedtoken{% the \TrIOsavedtoken is still part of the input
+ \TRIOlet\TrIOnext=\TRIOundefined
+ \TrIOusetokenlistfalse\TRIOafterassignment\TrIOresetglobaldefs
+ \TRIOlet\TrIOsavedtoken=}
+\def\TrIOAFTERASSIGNMENT{% use the stored token (sometimes)
+ \ifTrIOblockafterassignment % if true nothing to do
+ \TRIOelse\ifTrIOsavedtoken % otherwise only if a token is saved
+ \TRIOifnum\TRIOglobaldefs>0 \TrIOmessage{TrIO Info: globaldefs is 1 (apply)}%
+ \TRIOglobaldefs=0 \TrIOsavedtokenfalse
+ \TRIOglobaldefs=1 \TRIOelse \TrIOsavedtokenfalse \TRIOfi
+ \TRIOexpandafter\TRIOexpandafter\TRIOexpandafter\TrIOoutputtoken
+ \TRIOexpandafter % get rid of the 2 \fi with 3+1 \expandafter
+ \fi\fi}
+\def\TrIOoutputtoken{% output the token depending on its type
+ \ifTrIOusetokenlist \TRIOexpandafter\TRIOthe\TRIOexpandafter\TrIOtoken
+ \TRIOelse \TRIOexpandafter\TrIOsavedtoken \TRIOfi}
+%
+% Second: \input
+%
+% make sure that a file loaded via \input is always displayed on the terminal
+\let\batchmode\scrollmode \let\nonstopmode\scrollmode
+\def\TrIOcnt{0 }% an internal counter for each \input, \openin, \openout
+\countdef\TrIOcount=255 % counter for \TrIOcnt, stream numbers, etc.; used in a group
+\def\TrIOcountiocmd{% increment \TrIOcnt
+ \TrIOcount=\TrIOcnt \TRIOadvance \TrIOcount by 1
+ \TRIOxdef\TrIOcnt{\TRIOnumber\TrIOcount\TrIOspace}}
+\def\TrIOhandleglobaldefs{% inform about \globaldefs>0 and switch to \globaldefs=0
+ \TRIOifnum\TRIOglobaldefs>0 \TrIOmessage{TrIO Info: globaldefs is >0 (I/O)}%
+ \TRIOafterassignment\TrIOsuspendafterassignment \TRIOglobaldefs=0
+ \TRIOdef\TrIOendgroup{\TRIOendgroup % end a group opened earlier
+ \TRIOafterassignment\TrIOinitafterassignment \TRIOglobaldefs=1 }%
+ \TRIOelse \TrIOsuspendafterassignment \TRIOglobaldefs=0
+ \TRIOdef\TrIOendgroup{\TRIOendgroup\TrIOinitafterassignment}%
+ \TRIOfi}
+\def\TrIOsetcatcodes{% establish a few \catcodes
+ \TRIOedef\TrIOnext{\TRIOthe\TRIOcatcode`\%}{\TRIOcatcode`\%=\TrIOnext}%
+ \TRIOcatcode`\%=12 \TRIOlet\%=\TRIOcatcode
+ \%`\\=0 \%`\==12 \%`\`=12 \%`\1=12 \%`\2=12 }
+%
+% Third: \openin
+%
+\newtoks\TrIOtropenin
+\let\TRIOaAmNzZopenin=\openin % this name must be password protected
+%
+% Fourth: \immediate and \openout
+%
+\newif\ifTrIOimoo % true: \immediate is applied to \openout
+\newtoks\TrIOtrimmediate
+\newtoks\TrIOtropenout
+\let\TRIObBlOyYopenout=\openout % this name must be password protected
+%
+% Fifth: \special
+%
+\ifx y\disablespecial % deactivate \special; write to log file
+ \def\special{\TrIOwlog{<<< TrIO >>> Line \TRIOthe\inputlineno: special}\TrIOwlog}%
+ \let\TRIOhHJqsSspecial\special
+\else\ifx n\disablespecial % trace \special
+ \tracingoutput=1 \showboxdepth=10000 \showboxbreadth=10000
+ \let\tracingoutput=\tracinglostchars
+ \let\showboxdepth=\tracinglostchars \let\showboxbreadth=\tracinglostchars
+\fi\fi
+\let\disablespecial\undefined
+%
+% NO WARRANTY
+%
+\begingroup\newlinechar=`\^^J
+% This program is free software: you can redistribute it and/or modify
+% it under the terms of the GNU General Public License as published by
+% the Free Software Foundation, version 3 (GPL3).
+% If you change the next line to \iffalse please obey the GPL3 license
+% when you distribute such a changed macro file.
+\iftrue
+ \errhelp{This program is distributed in the hope that it will be
+ useful,^^Jbut WITHOUT ANY WARRANTY; without even the implied warranty
+ of^^JMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
+ the^^JGNU General Public License, version 3, for more
+ details.^^JType `x' if you want to stop the execution of TrIO now.}
+ \errmessage{The TrIO macros come with ABSOLUTELY NO WARRANTY; for details type `h'}
+\fi\endgroup