summaryrefslogtreecommitdiff
path: root/language/ascii-cyrillic
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 /language/ascii-cyrillic
Initial commit
Diffstat (limited to 'language/ascii-cyrillic')
-rw-r--r--language/ascii-cyrillic/ascii-cy.pdfbin0 -> 22937 bytes
-rw-r--r--language/ascii-cyrillic/email-ru.tex3492
2 files changed, 3492 insertions, 0 deletions
diff --git a/language/ascii-cyrillic/ascii-cy.pdf b/language/ascii-cyrillic/ascii-cy.pdf
new file mode 100644
index 0000000000..eef516b462
--- /dev/null
+++ b/language/ascii-cyrillic/ascii-cy.pdf
Binary files differ
diff --git a/language/ascii-cyrillic/email-ru.tex b/language/ascii-cyrillic/email-ru.tex
new file mode 100644
index 0000000000..8f492579db
--- /dev/null
+++ b/language/ascii-cyrillic/email-ru.tex
@@ -0,0 +1,3492 @@
+
+ %%%% email-ru.tex
+ %% Author: Laurent Siebenmann,
+ %% Math B^at 425, Univ. Paris-Sud, 91405-Orsay
+ %% Email addresses: (use several) lcs@topo.math.u-psud.fr,
+ %% lcs@math.polytechnique.fr, laurent@math.toronto.edu
+ %%
+ %% Version 2001.02.06 of Feb 2001 (**beta**)
+ %% http://topo.math.u-psud.fr/~lcs/ASCII-Cyrillic/
+ %% Look for future versions on CTAN archives.
+ %%
+ %% Copyright conditions according to Gnu Public Licence.
+ %%
+ %% This utility converts a new *lossless* ASCII
+ %% transcription of Russian/Ukrainian text
+ %% -- called ASCII-Cyrillic --
+ %% to and from the 5 most used 8-bit Cyrillic
+ %% text file encodings. (Others can be introduced.)
+ %%
+ %% "email-ru.tex" is particularly useful for
+ %% persons outside of Russia obliged to use
+ %% a non-Cyrillic keyboard for typing Russian.
+ %%
+ %% It is also good for viewing Cyrillic
+ %% text files (including ".tex" files)
+ %% when one has no suitable Cyrillic screen font.
+ %%
+ %% It allows Cyrillic 8-bit text files to be sent
+ %% in the body of any email message.
+ %% This feature inspired the name "email-ru.tex".
+ %%
+ %% Launch "Plain TeX" of D. Knuth on this file.
+ %% The usual command line is simply:
+ %% tex email-ru <return>
+ %% Then follow instructions given on screen.
+ %% Documentation follows the last \endinput.
+ %%%%
+
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ %%%%%%%%%%%%%%%% Params and Tools %%%%%%%%%%%%%%%
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ \catcode`\@=11
+ \catcode`\/=13
+ \catcode`\|=13
+ \chardef\CatOne@=\catcode1\relax %% storage
+ \catcode1=13 % A syntactical trick for AccIN
+ %% \HiOctetsCat@{13} will be in force for assimilation
+ \errorcontextlines=20
+
+ \let\ex@\expandafter
+ \let\cs@\csname
+ \let\ecs@\endcsname
+ \let\ne@\noexpand
+ \def\@e{}
+
+ \endlinechar=-1
+
+ \def\Sharp@{\string##}
+
+ %%temporarily suppress Plain's logging of allocations
+ \let\wlog@ld\wlog
+ \def\wlog#1{\relax}
+
+ \newif \ifGoodOptions@
+
+ \def\empty{}
+ \def\Line@{}
+
+ \ex@\def\cs@ email-ru-version\ecs@{v2001.02.06}
+
+ %% Will use loops with fuller syntax
+ \def\Loop@#1\Repeat@{%
+ \def\Iterate@{#1\expandafter\Iterate@\fi}%
+ \Iterate@}
+
+ \def\iwr@{\immediate\write16}%
+ \def\wr@{\immediate\write\MainStreamOut@}%
+ %\def\Wr@#1{\iwr@{#1}\wr@{#1}} %% for tests
+ \let\Wr@\wr@ %% for tests
+
+ %\def\@EndLine{}%
+ \def\Gobble@#1{}%
+ \edef\OtherBacksl@{\ex@\Gobble@\string\\}%
+ \def\ExpTwiceAfter@{\ex@\ex@\ex@}%
+ \def\ExpThriceAfter@{\ex@\ExpTwiceAfter@\ex@}%
+ \def\ExpFourTimesAfter@{\ex@\ExpThriceAfter@\ex@}%
+
+
+ \ifx\undefined\@@end
+ \let\End\end
+ \else
+ \def\End{\cs@ @@end\ecs@}
+ \fi
+
+
+ %%%% WORD-PROCESSING MACROS from boxedeps.tex
+ %% %% \long was evicted for email-ru
+ %%% \IN@0#1@#2@ : Is 1st exp of #1 in 1st exp of #2 ??
+ %% Answer in \ifIN@
+ %\let\ex@\expandafter
+ \newif\ifIN@\def\IN@{\ex@\INN@\ex@}
+ \def\INN@0#1@#2@{\def\NI@##1#1##2##3\ENDNI@
+ {\ifx\m@rker##2\IN@false\else\IN@true\fi}%
+ \ex@\NI@#2@@#1\m@rker\ENDNI@}
+ \def\m@rker{\m@@rker}
+
+ %%% \SPLIT@0#1@#2@ : Split 1st exp of #2 at 1st exp of #1
+ %% \Initialtoks@ , \Terminaltoks@ will contain pieces
+ \newtoks\Initialtoks@ \newtoks\Terminaltoks@
+ \def\SPLIT@{\ex@\SPLITT@\ex@}
+ \def\SPLITT@0#1@#2@{\def\TTILPS@##1#1##2@{%
+ \Initialtoks@{##1}\Terminaltoks@{##2}}\ex@\TTILPS@#2@}
+
+ %%% \CHAIN@
+ \newtoks\Chaintoks@
+ \newtoks\Linktoks@
+ \def\CHAIN@{%
+ \edef\Chainholder@{\the\Chaintoks@\the\Linktoks@}%
+ \Chaintoks@\ex@{\Chainholder@}%
+ }
+
+ \newlinechar=`\^^J
+ \def\ChainLine@{\Linktoks@\ex@{\ex@^^J\Line@}\CHAIN@}
+
+
+
+
+
+ %%%%% ARITHMETIC MACRO \SetCharValue@#1
+ %% Supposing #1 has 1st expansion a character cat 11 ot 12
+ %% assign the octet to byte register \Char@
+ \def\SetCharValue@#1{\ex@\chardef\ex@\Char@\ex@`#1\relax}
+ %% \def\mac{a}\SetCharValue@{a}
+ %% \show\Char@\end
+
+ %%%%% \HiOctetsCat@#1
+ %%%
+ \def\HiOctetsCat@#1{%
+ \count255=128\relax
+ \Loop@
+ \catcode\count255=#1\relax
+ \advance\count255 by 1\relax
+ \ifnum
+ \count255<256\relax
+ \Repeat@
+ }
+
+ %%%%% \LowOctetsCat@#1
+ %%%
+ \def\LowOctetsCat@#1{%
+ \count255=0\relax
+ \Loop@
+ \catcode\count255=#1\relax
+ \advance\count255 by 1\relax
+ \ifnum
+ \count255<32\relax
+ \Repeat@
+ \catcode127=#1\relax
+ }
+
+ %%%%% \ASCIIOctetsCat@#1
+ %%%
+ \def\ASCIIOctetsCat@#1{%
+ \count255=32\relax
+ \Loop@
+ \catcode\count255=#1\relax
+ \advance\count255 by 1\relax
+ \ifnum
+ \count255<126\relax
+ \Repeat@
+ }
+
+ \def\MakeSlantPct@{\lccode`\~=`\%
+ \lowercase{\edef/{\string ~}}}%
+
+
+
+
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ %%%%%%%%%%%%%%%%%%% Tables %%%%%%%%%%%%%%%%%%%%
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+ %%% \@LigShorts...: Ru and Ukr variants
+ %% was \@HiOctetLigOutEncoding
+ \def\@LigShortsRu{%
+ /A A /B B /V V /G G /D D /E E /ZH ZH /Z Z %
+ /I I /ISHRT J /K K /L L /M M /N N /O O /P P %
+ /R R /S S /T T /U U /F F /H X /C TS /CH CH %
+ /SH SH /SHCH SHCH /HRDSN " %
+ /ERY Y /SFTSN ' /EREV E /YU JU /YA JA /YO E %
+ /a a /b b /v v /g g /d d /e e /zh zh /z z %
+ /i i /ishrt j /k k /l l /m m /n n /o o /p p %
+ /r r /s s /t t /u u /f f /h x /c ts /ch ch %
+ /sh sh /shch shch /hrdsn " %
+ /ery y /sftsn ' /erev e /yu ju /ya ja /yo e %
+ /USHRT U /ushrt u %% Byelorussian
+ /II II /ii ii %% Byelorussian (& Ukr)
+ %/textnumero No %
+ %/guillemotleft << %
+ %/guillemotright >> %
+ }
+
+
+ %%%%%% \@LigShortsUkr
+ %%% program also treats word-beginning phenomena:
+ %%% '{IE} => Ye, '{YI} => Yi, '{ISHRT} => Y
+ %%% '{YU} => Yu, '{YA} => Ya; also lower case
+ \def\@LigShortsUkr{\let\temp@=\0 \def\0{}%
+ /A A /B B /V V /G H /GUP G /D D /E E /IE IE /ZH ZH /Z Z %
+ /I Y /II I /YI I /ISHRT I /K K /L L /M M /N N /O O /P P %
+ /R R /S S /T T /U U /F F /H KH /C TS /CH Ch %
+ /SH Sh /SHCH Shch %% /HRDSN gone!
+ /APOS ' %
+ /SFTSN \0 /YU Iu /YA Ia %% avoid missing space problem
+ /a a /b b /v v /g h /gup g /d d /e e /ie ie /zh zh /z z %
+ /i y /ii i /yi i /ishrt i /k k /l l /m m /n n /o o /p p %
+ /r r /s s /t t /u u /f f /h kh /c ts /ch ch %
+ /sh sh /shch shch %% /hrdsn gone!
+ /sftsn \0 /yu iu /ya ia %% avoid missing space problem
+ /apos ' %
+ %/textnumero No %
+ %/guillemotleft << %
+ %/guillemotright >> %
+ \let\0=\temp@
+ }
+
+
+ %%%%% \@SetLigShorts: %% 8 to 7
+ %% s_ means short as function of LaTeX Tag
+ \def\@SetLigShorts{%
+ \def/##1 ##2 {\ex@\edef\cs@ ts_##1\ecs@{##2}%
+ }
+ \@TheLigShorts
+ }
+
+
+ %%%%%% \@AccShortsRu \@AccShortsUkr
+
+ \def\@AccShortsRu{%
+ /A A /B B /V V /G G /D D /E E /ZH 'G /ZH 'Z /Z Z %
+ /I I /ISHRT J /K K /L L /M M /N N /O O /P P %
+ /R R /S S /T T /U U /F F /H 'K /H X /C C /C 'T %% last dominates
+ /CH 'C /SH 'S /SH W /SHCH 'W /HRDSN Q %
+ /ERY Y /SFTSN H /EREV 'E /YU 'U /YA 'A /YO 'O %
+ /a a /b b /v v /g g /d d /e e /zh 'g /zh 'z /z z %
+ /i i /ishrt j /k k /l l /m m /n n /o o /p p %
+ /r r /s s /t t /u u /f f /h 'k /h x /c c /c 't /ch 'c %
+ /sh 's /sh w /shch 'w /hrdsn q %
+ /ery y /sftsn h /erev 'e /yu 'u /ya 'a /yo 'o %
+ %% Byelorussian
+ /USHRT 'V /ushrt 'v %% Byelorussian only
+ /II 'I /ii 'i %% Byelorussian (& Ukr but then I,i)
+ %% Following of questionable benefit
+ %/textnumero 'N %
+ %/guillemotleft '< %
+ %/guillemotright '> %
+ }
+
+ \def\@AccShortsUkr{%
+ /A A /B B /V V /G H /G G % preferred last
+ /GUP 'G /D D /E E /IE 'E /ZH 'Z /Z Z %
+ /I Y /II I /YI 'I /ISHRT J /K K /L L /M M /N N /O O /P P %
+ /R R /S S /T T /U U /F F /H 'K /H X /C C /C 'T /CH 'C %
+ /SH 'S /SH W /SHCH 'W %% HRDSN not Ukr
+ /YA 'A /YU 'U /SFTSN Q %% /YO 'O
+ /APOS '* %
+ %
+ /a a /b b /v v /g h /g g % preferred last
+ /gup 'g /d d /e e /ie 'e /zh 'z /z z %
+ /i y /ii i /yi 'i /ishrt j /k k /l l /m m /n n /o o /p p %
+ /r r /s s /t t /u u /f f /h 'k /h x /c c /c 't /ch 'c %
+ /sh 's /sh w /shch 'w %% hrdsn not ukr
+ /ya 'a /yu 'u /sftsn q %% /yo 'o
+ %
+ /apos '* %
+ }
+
+ \def\@SetAccOutShorts{%
+ \def/##1 ##2 {\ex@\def\cs@ ts_##1\ecs@{##2}}%
+ \@TheAccShorts
+ }
+
+ \def\@SetAccInShortsA{%
+ \def/##1 ##2 {\ex@\def\cs@ ts_##1\ecs@{##2}%
+ \ex@\edef\cs@ to_##1\ecs@{'\lbrace@##1\rbrace@}%% prelim background
+ }
+ \@TheAccShorts
+ }
+
+ \def\@SetAccInShortsB{%
+ \def/##1 ##2 {\ex@\edef\cs@ so_##2\ecs@{\cs@ to_##1\ecs@}}%
+ \@TheAccShorts
+ }
+
+
+ %%%%%%% \@LetterTags
+ %% list of all Cyrillic letter alphabetic tags used
+ %\def\@LetterTags{%
+ % %% Russian
+ % /A A /B B /V V /G G /D D /E E /ZH 'Z /Z Z %
+ % /I I /ISHRT J /K K /L L /M M /N N /O O /P P %
+ % /R R /S S /T T /U U /F F /H X /C 'T /CH C %
+ % /SH W /SHCH 'W /HRDSN Q %
+ % /ERY Y /SFTSN H /EREV 'E /YU 'U /YA 'A /YO 'O %
+ % %% + for Ukr, Byelorussian, Yug, Macedonian
+ % /DJE /DZE /DZHE /GJE /GUP /GUP /IE /II %
+ % /JE /KJE /LJE /NJE /TSJE /USHRT /YI %
+ % /APOS %
+ % %% + for Tatar and other
+ % /CHVCRS /KBEAK /NDSC /OTLD /SCHWA /SHHA /VCRS
+ % /Y /ZHDSC
+ % }
+
+ %%%%%% \@IdentifyAccInLetterTags
+ % %% \te_<tag> --> \@e if abstract letter exists else \relax
+ %\def\@IdentifyAccInLetterTags{%
+ % \def/##1 {\ex@\def\cs@ te_##1\ecs@{}}%
+ % \@LetterTags}
+
+ %%%%%%% \@DiacriticStrings
+ %% table with 3 columns, / active three arg
+ %% #1 = LaTeX tag if known, #2 = short in letters,
+ %% #3 short in freestyle.%
+ %% | gives syntactical workaround
+ %% to be '[<thestring>]
+\def\@DiacriticStrings{%
+ /Delta,Delta,Delta.%
+ |{quotedblbase}{LLQ}{,,}%
+ |{quotesinglbase}{llq}{,}%
+ /textquotedblleft,LQ,``.%
+ /textquotedblright,RQ,".
+ %%/textquotedblright,RQ,''.% omit?????????????
+ %% double fails to define '["] last one wins
+ %% simply because only the map T --> S tag
+ %% to short tag currently used
+ /textquoteleft,lq,`.%
+ /textquoteright,rq,'.%
+ /textnumero,No,No.%
+ /textblacksquare,blacksquare,blacksquare.%
+ /paragraph,par,P.%
+ /section,section,S.%
+ /approx,approx,\string~\string~.%
+ /textbullet,bullet,**.%
+ /textperiodcentered,cdot,cdot.%
+ /textbrokenbar,bbar,bbar.%
+ /textcent,cent,cent.%
+ /copyright,cp,copyright.%
+ /textcurrency,coin,currency.%
+ /dagger,dag,dag.%
+ /ddagger,ddag,ddag.%
+ /degree,deg,deg.%
+ /divide,divide,div.%
+ |{dots}{dots}{...}%
+ /euro,euro,euro.
+ /florin,florin,florin.%
+ /lnot,lnot,neg.%
+ /lessequal,leq,<=.%
+ /greaterequal,geq,>=.%
+ /guillemotleft,LG,<<.%
+ /guillemotright,RG,>>.%
+ /guilsinglleft,lg,<.%
+ /guilsinglright,rg,>.%
+ /infinity,infty,infty.%
+ /mu,mu,mu.%
+ /nobreakspace,nbsp,nbsp.%
+ /textemdash,emdash,---.%
+ /textendash,endash,--.%
+ |{notequal}{neq}{\string/=}%
+ /perthousand,perK,perK.%
+ /partialdiff,partial,partial.%
+ /pounds,pounds,pounds.%
+ /plusminus,pm,+-.%
+ /textregistered,reg,registered.%
+ /softhyphen,shy,\string\-.
+ /solidus,solidus,solidus.
+ /radical,surd,surd.%
+ /texttrademark,tm,trademark.%
+ %/ukrhard,rq,'.%
+ }
+
+
+ %%%%% \@SetDiacShorts defines some \TS_<tag> --> <7short>
+ %% Caps for diacritics, T for my tex tag, S for short
+ %% Extracts info from \@DiacriticStrings
+ \def\@SetDiacShorts{%
+ \def/##1,##2,##3.{\ex@\edef\cs@ TS_##2\ecs@{##3}}%
+ \def|##1##2##3{\ex@\edef\cs@ TS_##2\ecs@{##3}}%
+ \@DiacriticStrings
+ }
+
+
+ %%%%%%%% Encoding Vectors
+ %% Each defines meanings for 128--255
+ %% /??. letter with tag ??
+ %% |??. non-letter with tag ??
+ %% /. undefined 'meaningless'
+ %% /apos. Cyrillic apostrophe if used by language
+ %% and otherwise equivalent to |rq. (right quote)
+
+ %%%%%%% DosEncoding
+ %% Creator: Microsoft DOS code page 866
+ %% LaTeX Tag: cp866nav
+ %% Comment: Covers Russian, Byelorussian, Ukrainian
+ %%+ Many variants exist.
+ %%+ This is the New Alternative Variant (NAV)
+ \def\DosEncodingVect@{%
+ /A./B./V./G./D./E./ZH./Z.%% "80--
+ /I./ISHRT./K./L./M./N./O./P.%% --"8F
+ /R./S./T./U./F./H./C./CH.%% "90--
+ /SH./SHCH./HRDSN./ERY./SFTSN./EREV./YU./YA.%% --"9F
+ /a./b./v./g./d./e./zh./z.%% "A0--
+ /i./ishrt./k./l./m./n./o./p.%% --"AF
+ \.\.\.\.\.\.\.\.%% "B0--
+ \.\.\.\.\.\.\.\.%% --"BF
+ \.\.\.\.\.\.\.\.%% "C0--
+ \.\.\.\.\.\.\.\.%% --"CF
+ \.\.\.\.\.\.\.\.%% "D0--
+ \.\.\.\.\.\.\.\.%% --"DF
+ /r./s./t./u./f./h./c./ch.%% "E0--
+ /sh./shch./hrdsn./ery./sftsn./erev./yu./ya.%% --"EF
+ /YO./yo./GUP./gup./IE./ie./II./ii.%% "F0--
+ /YI./yi./USHRT./ushrt.|No.|LG.|RG.|nbsp.%% --"FF
+ }
+
+ %%%%%%% MacEncoding
+ %% LaTeX Tag: macukr
+ %% Comment: Covers Russian, Byelorussian, Ukrainian
+ \def\MacEncodingVect@{%
+ /A./B./V./G./D./E./ZH./Z.%% "80--
+ /I./ISHRT./K./L./M./N./O./P.%% --"8F
+ /R./S./T./U./F./H./C./CH.%% "90--
+ /SH./SHCH./HRDSN./ERY./SFTSN./EREV./YU./YA.%% --"9F
+ |dag.|deg./GUP.|pounds.|section.|cdot.|par./II.%% "A0--
+ |reg.|cp.|tm./TSJE./tsje.|neq./GJE./gje.%% --"AF
+ |infty.|pm.|leq.|geq./ii.|mu./gup./JE.%% "B0--
+ /IE./ie./YI./yi./LJE./lje./NJE./nje.%% --"BF
+ /je./DZE.|lnot.|surd.|florin.|approx.|Delta.|LG.%% "C0--
+ |RG.|dots.|nbsp./DJE./dje./KJE./kje./dze.%% --"CF
+ |endash.|emdash.|LQ.|RQ.|lq.\apos.|divide.|LLQ.%% "D0--
+ /USHRT./ushrt./DZHE./dzhe.|No./YO./yo./ya.%% --"DF
+ /a./b./v./g./d./e./zh./z.%% "E0--
+ /i./ishrt./k./l./m./n./o./p.%% --"EF
+ /r./s./t./u./f./h./c./ch.%% "F0--
+ /sh./shch./hrdsn./ery./sftsn./erev./yu.|coin.%% --"FF
+ }
+
+ %%%%%%% IsoEncoding
+ %% LaTeX Tag: ISO88595
+ %% Comment: ISO~8859-5 also called ISO-IR-144
+ %% Covers Russian, Byelorussian
+ %%+ but letter GUP gup of Ukrainian is missing
+ \def\IsoEncodingVect@{%
+ \.\.\.\.\.\.\.\.%% "80--
+ \.\.\.\.\.\.\.\.%% --"8F
+ \.\.\.\.\.\.\.\.%% "90--
+ \.\.\.\.\.\.\.\.%% --"9F
+ |nbsp./YO./TSJE./GJE./IE./DZE./II./YI.%% "A0--
+ /JE./LJE./NJE./DJE./KJE.|shy./USHRT./DZHE.%% --"AF
+ /A./B./V./G./D./E./ZH./Z.%% "B0--
+ /I./ISHRT./K./L./M./N./O./P.%% --"BF
+ /R./S./T./U./F./H./C./CH.%% "C0--
+ /SH./SHCH./HRDSN./ERY./SFTSN./EREV./YU./YA.%% --"CF
+ /a./b./v./g./d./e./zh./z.%% "D0--
+ /i./ishrt./k./l./m./n./o./p.%% --"DF
+ /r./s./t./u./f./h./c./ch.%% "E0--
+ /sh./shch./hrdsn./ery./sftsn./erev./yu./ya.%% --"EF
+ |No./yo./tsje./gje./ie./dze./ii./yi.%% "F0--
+ /je./lje./nje./dje./kje.|section./ushrt./dzhe.%% --"FF
+ }
+ %%
+
+ %%%%%%% WinEncoding
+ %% LaTeX Tag: cp1251
+ %% Comment: Microsoft Windows Cyrillic encoding
+ %%+ covers Russian, Byelorussian, Ukrainian
+ \def\WinEncodingVect@{%
+ /TSJE./GJE.|llq./gje.|LLQ.|dots.|dag.|ddag.%% "80--
+ |euro.|perK./LJE.|lg./NJE./KJE./DJE./DZHE.%% --"8F
+ /tsje.|lq.\apos.|LQ.|RQ.|bullet.|endash.|emdash.%% "90--
+ |solidus.|tm./lje.|rg./nje./kje./dje./dzhe.%% --"9F
+ |nbsp./USHRT./ushrt./JE.|coin./GUP.|bbar.|section.%% "A0--
+ /YO.|cp./IE.|LG.|lnot.|shy.|reg./YI.%% --"AF
+ |deg.|pm./II./ii./gup.|mu.|par.|cdot.%% "B0--
+ /yo.|No./ie.|RG./je./DZE./dze./yi.%% --"BF
+ /A./B./V./G./D./E./ZH./Z.%% "C0--
+ /I./ISHRT./K./L./M./N./O./P.%% --"CF
+ /R./S./T./U./F./H./C./CH.%% "D0--
+ /SH./SHCH./HRDSN./ERY./SFTSN./EREV./YU./YA.%% --"DF
+ /a./b./v./g./d./e./zh./z.%% "E0--
+ /i./ishrt./k./l./m./n./o./p.%% --"EF
+ /r./s./t./u./f./h./c./ch.%% "F0--
+ /sh./shch./hrdsn./ery./sftsn./erev./yu./ya.%% --"FF
+ }
+ %
+
+
+ %%%%%%% KoiEncoding "universal version"
+ %% LaTeX Tag: koi8-u
+ %% Comment: Russian, Byelorussian, Ukrainian
+ %%+ Devised for Internet use, 1993.
+ %%+ -u means 'unified'(?)
+ \def\KoiEncodingVect@{%
+ \.\.\.\.\.\.\.\.%% "80--
+ \.\.\.\.\.\.\.\.%% --"8F
+ \.|lq.\apos.|LQ.|RQ.|bullet.|endash.|emdash.%% "90--
+ |cp.|tm.|nbsp.|RG.|reg.|LG.|cdot.|coin.%% --"9F
+ |nbsp./tsje./gup./yo./ie./dze./ii./yi.%% "A0--
+ /je./lje./nje./dje./kje./gup./ushrt./dzhe.%% --"AF
+ |No./TSJE./GUP./YO./IE./DZE./II./YI.%% "B0--
+ /JE./LJE./NJE./DJE./KJE./GUP./USHRT./DZHE.%% --"BF
+ /yu./a./b./c./d./e./f./g.%% "C0--
+ /h./i./ishrt./k./l./m./n./o.%% --"CF
+ /p./ya./r./s./t./u./zh./v.%% "D0--
+ /sftsn./ery./z./sh./erev./shch./ch./hrdsn.%% --"DF
+ /YU./A./B./C./D./E./F./G.%% "E0--
+ /H./I./ISHRT./K./L./M./N./O.%% --"EF
+ /P./YA./R./S./T./U./ZH./V.%% "F0--
+ /SFTSN./ERY./Z./SH./EREV./SHCH./CH./HRDSN.%% --"FF
+ }
+
+
+ %%%%%%% NullEncoding
+ %%
+ \def\NullEncodingVect@{%
+ \.\.\.\.\.\.\.\.%% "80--
+ \.\.\.\.\.\.\.\.%% --"8F
+ \.\.\.\.\.\.\.\.%% "90--
+ \.\.\.\.\.\.\.\.%% --"9F
+ \.\.\.\.\.\.\.\.%% "A0--
+ \.\.\.\.\.\.\.\.%% --"AF
+ \.\.\.\.\.\.\.\.%% "B0--
+ \.\.\.\.\.\.\.\.%% --"BF
+ \.\.\.\.\.\.\.\.%% "C0--
+ \.\.\.\.\.\.\.\.%% --"CF
+ \.\.\.\.\.\.\.\.%% "D0--
+ \.\.\.\.\.\.\.\.%% --"DF
+ \.\.\.\.\.\.\.\.%% "E0--
+ \.\.\.\.\.\.\.\.%% --"EF
+ \.\.\.\.\.\.\.\.%% "F0--
+ \.\.\.\.\.\.\.\.%% --"FF
+ }
+
+
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+
+\HiOctetsCat@{13}
+
+\def\HighActiveOctetsHolder@{%
+ /^^80 80 /^^81 81 /^^82 82 /^^83 83 /^^84 84 /^^85 85 /^^86 86 %
+ /^^87 87 /^^88 88 /^^89 89 /^^8a 8a /^^8b 8b /^^8c 8c /^^8d 8d %
+ /^^8e 8e /^^8f 8f /^^90 90 /^^91 91 /^^92 92 /^^93 93 /^^94 94 %
+ /^^95 95 /^^96 96 /^^97 97 /^^98 98 /^^99 99 /^^9a 9a /^^9b 9b %
+ /^^9c 9c /^^9d 9d /^^9e 9e /^^9f 9f /^^a0 a0 /^^a1 a1 /^^a2 a2 %
+ /^^a3 a3 /^^a4 a4 /^^a5 a5 /^^a6 a6 /^^a7 a7 /^^a8 a8 /^^a9 a9 %
+ /^^aa aa /^^ab ab /^^ac ac /^^ad ad /^^ae ae /^^af af /^^b0 b0 %
+ /^^b1 b1 /^^b2 b2 /^^b3 b3 /^^b4 b4 /^^b5 b5 /^^b6 b6 /^^b7 b7 %
+ /^^b8 b8 /^^b9 b9 /^^ba ba /^^bb bb /^^bc bc /^^bd bd /^^be be %
+ /^^bf bf /^^c0 c0 /^^c1 c1 /^^c2 c2 /^^c3 c3 /^^c4 c4 /^^c5 c5 %
+ /^^c6 c6 /^^c7 c7 /^^c8 c8 /^^c9 c9 /^^ca ca /^^cb cb /^^cc cc %
+ /^^cd cd /^^ce ce /^^cf cf /^^d0 d0 /^^d1 d1 /^^d2 d2 /^^d3 d3 %
+ /^^d4 d4 /^^d5 d5 /^^d6 d6 /^^d7 d7 /^^d8 d8 /^^d9 d9 /^^da da %
+ /^^db db /^^dc dc /^^dd dd /^^de de /^^df df /^^e0 e0 /^^e1 e1 %
+ /^^e2 e2 /^^e3 e3 /^^e4 e4 /^^e5 e5 /^^e6 e6 /^^e7 e7 /^^e8 e8 %
+ /^^e9 e9 /^^ea ea /^^eb eb /^^ec ec /^^ed ed /^^ee ee /^^ef ef %
+ /^^f0 f0 /^^f1 f1 /^^f2 f2 /^^f3 f3 /^^f4 f4 /^^f5 f5 /^^f6 f6 %
+ /^^f7 f7 /^^f8 f8 /^^f9 f9 /^^fa fa /^^fb fb /^^fc fc /^^fd fd %
+ /^^fe fe /^^ff ff }%% watch space before brace
+
+%%% (what about CR and linefeed?)
+
+\begingroup
+
+ \LowOctetsCat@{13}%% localized
+
+ %\global\let^^0c=\relax %% Textures? Plain?; poluting??
+ \let^^0c=\relax %% localized
+
+ \gdef\LowActiveOctetsHolder@{%% watch gdef; will cleanup after
+ /^^00 00 /^^01 01 /^^02 02 /^^03 03 /^^04 04 /^^05 05 /^^06 06 %
+ /^^07 07 /^^08 08 /^^09 09 /^^0a 0a /^^0b 0b /^^0c 0c /^^0d 0d %
+ /^^0e 0e /^^0f 0f /^^10 10 /^^11 11 /^^12 12 /^^13 13 /^^14 14 %
+ /^^15 15 /^^16 16 /^^17 17 /^^18 18 /^^19 19 /^^1a 1a /^^1b 1b %
+ /^^1c 1c /^^1d 1d /^^1e 1e /^^1f 1f /^^7f 7f }
+
+ \endgroup
+ \let^^0c=\relax %% was \par for Textures
+
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ %%%%%%%%%%%%%% TRANSLATION MACROS %%%%%%%%%%%%%%
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ %%%%% Make sure chars >= 127 are ordinary (lccodes = 0)
+ %%%% This is default maybe to be changed
+ \def\HiOctetsZeroLCcodes@{%
+ \count255=128\relax
+ \Loop@
+ \lccode\count255=0\relax
+ \advance\count255 by 1\relax
+ \ifnum
+ \count255<256\relax
+ \Repeat@
+ }
+
+
+ %%%%% \PrepMoreLiveAccIn@
+ %% is one of two:
+ \def\PrepMoreLiveAccIn@{% maybe < and >
+ %%% \maybe@excl##1 : is tag active-alpha ??
+ \def\maybe@excl##1{%
+ \ifnum \lccode`##1>0 \@e
+ \ex@\@excl\ex@##1%% DON'T put tracer (...) on this line!
+ \else
+ \ex@##1%% nor this line --- because of macro soiling
+ \fi}
+ %
+ \lccode`.=`\}%
+ %%% \CyrLetter@##1: <diactag> --> \TO_ or puke
+ \lowercase{\def\CyrLetter@##1.{%
+ \ex@\ifx\cs@ to_\maybe@excl##1^^A\ecs@\relax
+ \(CyrLetter@_cont)'\lbrace@\CyrUniv@@##1.%
+ \else
+ \(CyrLetter@_bingo)\ex@\ex@\cs@ to_\maybe@excl##1^^A\ecs@
+ %% \(CyrDiac@_bingo)
+ \fi}}%%
+ \lccode`.=0%
+ %\show\CyrLetter@
+ %
+ %%% \CyrDiac@##1: <diactag> --> \TO_ or puke
+ \def\CyrDiac@##1]{%
+ \ex@\ifx\cs@ TO_\maybe@excl##1^^A\ecs@\relax
+ \(CyrDiac@_cont)'[\CyrUniv@@##1]%
+ \else
+ \(CyrDiac@_bingo)\ex@\ex@\cs@ TO_\maybe@excl##1^^A\ecs@
+ %% \(CyrDiac@_bingo)
+ \fi}%
+ %
+ %%% \CyrUniv@@##1 : second depth
+ \def\CyrUniv@@##1{%
+ \ifnum \lccode`##1>0 \@e
+ \(CyrUniv@@_lc)\string##1\ex@\@c@excl %%
+ \else
+ \ifx##1\@Excl
+ \(CyrUniv@@_e)\ex@\ex@\ex@\CyrUniv@@excl
+ \else
+ \(CyrUniv@@_o)\ex@\ex@\ex@##1%
+ \fi
+ \fi}
+ %
+ %%% \CyrUniv@@excl##1 : third depth
+ \def\CyrUniv@@excl##1{%
+ \ifnum \lccode`##1>0 \@e
+ \(CyrUniv@@excl_lc)\ex@ ##1%% do buggerall%%
+ \else
+ \ifx##1\@Excl
+ \(CyrUniv@@excl_Excl)\string!%% (@bs@excl_Excl)
+ \else
+ \if\noexpand ##1\string_%
+ \(CyrUniv@@excl_h)\ExpThriceAfter@\@@UlnCheck %%
+ \else
+ \(CyrUniv@@excl_o)\string!\ExpThriceAfter@ ##1%%
+ \fi
+ \fi
+ \fi
+ }%
+ %
+ \uccode`<=`<
+ \ex@\edef\cs@ so_'<\ecs@{\cs@ TO_LG\ecs@}%
+ \uccode`>=`>
+ \ex@\edef\cs@ so_'>\ecs@{\cs@ TO_RG\ecs@}%
+ \uccode`N=`N
+ \ex@\edef\cs@ so_'N\ecs@{\cs@ TO_No\ecs@}%
+ %
+ %%% Define \TO_"
+ %% Wanted the '["] --> (exp of) \TO_RQ, but table
+ %% only gave TS_
+ \ex@\ifx\cs@ TO_RQ\ecs@\relax
+ \ex@\edef\cs@ TO_"\ecs@{'["]}%
+ \else
+ \ex@\edef\cs@ TO_"\ecs@{\cs@ TO_RQ\ecs@}%
+ \fi
+ %\ex@\show\cs@ TO_"\ecs@
+ %
+ %%% Following are crucial and delicate matters
+ \uccode`\{=`\{
+ \ex@\let\cs@ so_'\lbrace@\ecs@\CyrLetter@
+ %% \so_<lbrace>#1=\CyrLetter@#1
+ \uccode`\[=`\[
+ \ex@\let\cs@ so_'[\ecs@\CyrDiac@ %
+ \ex@\def\cs@ so_''\ecs@{'}%
+ %
+ }%
+
+
+ \def\PrepMoreLiveRuAccIn@{%
+ \PrepMoreLiveAccIn@
+ %%% Following for rq-APOS confluence (Russian)
+ %% Here we know APOS has no short form
+ %\ex@\show\cs@ to_APOS\ecs@
+ %\ex@\show\cs@ TO_rq\ecs@
+ \ex@
+ \ifx\cs@ TO_rq\ecs@\relax
+ \else\ex@
+ \ifx\cs@ to_APOS\ecs@\relax %% is def needed?
+ \ex@\edef\cs@ to_APOS\ecs@{\cs@ TO_rq\ecs@}%
+ \ex@\edef\cs@ to_apos\ecs@{\cs@ TO_rq\ecs@}%
+ \fi
+ \fi
+ %\ex@\show\cs@ to_APOS\ecs@
+ %\ex@\show\cs@ to_apos\ecs@
+ }
+
+ %\iwr@{}%
+ %\iwr@{ temp@=\temp@}%
+ %\iwr@{temp@@=\temp@@}%
+ %\iwr@{}%
+ %\show\temp@
+ %\show\temp@@
+ %\read16 to \Junk
+ %\def\temp@@{'[rq]}%
+
+ \def\PrepMoreLiveUkrAccIn@{%
+ \PrepMoreLiveAccIn@
+ \uccode`*=`*
+ %%% Following for rq-APOS confluence (Ukr)
+ %\ex@\show\cs@ to_APOS\ecs@
+ %\ex@\show\cs@ TO_rq\ecs@
+ \ex@\let\ex@\temp@\cs@ TO_rq\ecs@
+ \ifx\temp@\relax
+ \else %%
+ \ex@\let\ex@\temp@\cs@ to_APOS\ecs@
+ \edef\temp@@{'\lbrace@ APOS\rbrace@}
+ \ifx\temp@\temp@@
+ \ex@\edef\cs@ to_APOS\ecs@{\cs@ TO_rq\ecs@}%
+ \ex@\edef\cs@ to_apos\ecs@{\cs@ TO_rq\ecs@}%
+ \fi
+ \fi
+ %\ex@\show\cs@ to_APOS\ecs@
+ %\ex@\show\cs@ to_apos\ecs@
+ %%%%% Set \so_'*, \to_apos, \to_APOS, to \TO_rq
+ %% when nothing better available
+ %% \so_'* --> \to_apos by \@SetAccInShorts
+ %\ex@\show\cs@ so_'*\ecs@
+ \ex@\edef\cs@ so_'*\ecs@{\cs@ to_apos\ecs@}%
+ }%
+
+ %%%%% Define category 12 braces
+ \lccode `\.=123\relax\lowercase{\def\lbrace@{.}}%
+ \lccode `\.=125\relax\lowercase{\def\rbrace@{.}}%
+ \lccode `\.=0\relax
+
+ %%%%% \@SetHighAccess
+ %% \c_128 etc. will be the ACTIVE char
+ %% \h_128 etc. will be lc hex value thereof
+ \def\@SetHighAccess{%
+ \def/##1 ##2 {\chardef\byte=`##1\relax
+ \let##1\relax %% preliminary for edef protection
+ \edef\temp@{\the\byte}%
+ \ex@\def\cs@ da_\temp@\ecs@{##1}%%
+ %% da_ for \the\byte ==> active character
+ \ex@\def\cs@ do_\temp@\ecs@{\string##1}%%
+ %% do_ for \the\byte ==> cat 12 char
+ \ex@\def\cs@ dh_\temp@\ecs@{##2}}%%
+ %% dh_ for \the\byte ==> lc hex string
+ \HighActiveOctetsHolder@
+ }
+
+ %%%%% \@HiOctetUkrLigOutDefs %% 8 to 7
+ %% \TheEightbitEncodingVect@ is typically \DosEncodingVect@
+ \def\@HiOctetUkrLigOutDefs{%
+ %%% Auxilliary tools for high octets:
+ \@SetLigShorts
+ %% \ts_<LaTeX letter Tag> --> short ASCII %% r-to-s
+ %% sets some \cs@ ts_<tag>\ecs@ to ASCII char, or ' and that
+ %% for example \_shch --> 'w
+ \@SetHighAccess %% \da_<decimal> --> active high octet
+ \@SetDiacShorts
+ %%% Defs of active char values '{...} '[...] !__xy and Acc shorts
+ %% /##1. %% where ##1 is LaTeX letter Tag
+ %% letter high active octet code \the\count255 -->
+ %% \ts_<LaTeX letter Tag> if it exists or '{<LaTeX letter Tag>}
+ %%% for letters
+ %% \ta_<LaTeX letter Tag> --> active high octet %% r-to-a
+ %% \ot_<other high octet> --> <LaTeX letter Tag> %% o-to-r
+ %
+ \def/##1.{\ex@\let\ex@\temp@\cs@ ts_##1\ecs@
+ \ifx\temp@\relax
+ \ex@\ex@\ex@\edef\cs@ da_\the\count255\ecs@{\lbrace@ ##1\rbrace@}%
+ \else
+ \ex@\ex@\ex@\edef\cs@ da_\the\count255\ecs@{\temp@}%
+ %% Here we know we have letter
+ %% with a short form \ts_<LaTeX letter Tag>
+ %% For Ukr context modif preps
+ %% need ability to access active octets of
+ %% \CYRIE,\cyrie,\CYRYI,\cyryi,\CYRISHRT,\cyrishrt
+ %% for example \ta_IE --> the active octet giving IE
+ %% so prepare this access for all shorts:
+ \edef\temp@{\ex@\ex@\ex@\ne@\cs@ da_\the\count255\ecs@}%
+ %\show\temp@
+ \ex@\let\cs@ ta_##1\ecs@\temp@ %%% defines \ta_<LaTeX letter Tag>
+ \edef\temp@{\ex@\string\temp@}%% the cat other octet
+ %\show\temp@
+ %% Want LaTeX letter Tag of octet when it exists, else \relax
+ \ex@\edef\cs@ ot_\temp@\ecs@{##1}%
+ %\ex@\show\cs@ ot_\temp@\ecs@
+ \fi
+ \advance\count255 by 1\relax}
+ %% |##1. %% where ##1 is my short tex diacritic tag for email-ru.tex
+ %% defines \da_<\the\count255> = <active high octet> --> or Acc short
+ \def|##1.{%
+ %% Here we know we have diacritic with a short form \TS_##1
+ %% For Ukr context modif preps need ability to
+ %% define active octets of these
+ %% for example \TA_LQ --> (the active octet '[LQ])
+ %% so prepare this access for all high diacritics:
+ \edef\temp@{\cs@ da_\the\count255\ecs@}
+ %% value is active high octet, still equal \relax
+ \ex@\edef\cs@ TA_##1\ecs@{\temp@}%% defines \TA_<my diac tag>
+ \ex@\edef\cs@ OT_\ex@\string\temp@\ecs@{##1}%
+ %% defines \OT_<my diac other octet>
+ %%%% *finally* the active high octet
+ %% value changes from \relax to [\TS_##1]
+ \ex@\ex@\ex@\edef\cs@ da_\the\count255\ecs@
+ {[\cs@ TS_##1\ecs@]\ne@\UkrWB@}%
+ \advance\count255 by 1\relax}
+ %% \. sets the active high octet equal to !__xy where "XY=\count255
+ \def\.{\ex@\ex@\ex@\edef\cs@ da_\the\count255\ecs@{%
+ !\string_\string_\cs@ dh_\the\count255\ecs@}%%
+ %% in short \def ^^xy{the string !__xy}
+ \advance\count255 by 1\relax}
+ %
+ %%%% \apos. just means |rq. as far as Ukr Translit concerned
+ %\def\APOS.{|rq.}%
+ \def\apos.{|rq.}%
+ %
+ \count 255=128\relax
+ %\show\TheEightbitEncodingVect@
+ \TheEightbitEncodingVect@
+ %% finally prevent softhyphen catalyzing:
+ \ex@\ex@\ex@\edef\cs@ TA_shy\ecs@{[\cs@ TS_shy\ecs@]}
+ }
+
+ %%%%% \@HiOctetRuLigOutDefs %% 8 to 7 %% use comments for Ukr
+ \def\@HiOctetRuLigOutDefs{%
+ %%%% Auxilliary tools for high octets:
+ \@SetLigShorts
+ \@SetHighAccess %% \da_<decimal> --> active high octet
+ \@SetDiacShorts
+ %%%% /##1.
+ \def/##1.{\ex@\let\ex@\temp@\cs@ ts_##1\ecs@
+ \ifx\temp@\relax
+ \ex@\ex@\ex@\edef\cs@ da_\the\count255\ecs@{\lbrace@ ##1\rbrace@}%
+ \else
+ \ex@\ex@\ex@\edef\cs@ da_\the\count255\ecs@{\temp@}%
+ \fi
+ \advance\count255 by 1\relax}
+ %%%% |##1.
+ %% defines \da_<\the\count255> = <active high octet> --> or Acc short
+ \def|##1.{%
+ \ex@\ex@\ex@\edef\cs@ da_\the\count255\ecs@{[\cs@ TS_##1\ecs@]}%
+ \advance\count255 by 1\relax}
+ %%%% \. sets the active high octet equal to !__xy where "XY=\count255
+ \def\.{\ex@\ex@\ex@\edef\cs@ da_\the\count255\ecs@{%
+ !\string_\string_\cs@ dh_\the\count255\ecs@}%%
+ %% in short \def ^^xy{the string !__xy}
+ \advance\count255 by 1\relax}
+ %
+ %%%% \apos. just means |rq. for now 26-11-00
+ \def\apos.{|rq.}
+ %
+ \count 255=128\relax
+ \TheEightbitEncodingVect@
+ }
+
+ %%%%% \@HiOctetAccOutDefs %% 8 to 7
+ %% \TheEightbitEncodingVect@ is typically \DosEncodingVect@
+ \def\@HiOctetAccOutDefs{%
+ %%% Auxilliary tools for high octets:
+ \@SetAccOutShorts
+ %% sets some \cs@ ts_<tag>\ecs@ to ASCII char, or ' and that
+ %% for example \_shch --> 'w
+ \@SetHighAccess
+ \@SetDiacShorts
+ %\ex@\show\cs@[lg]\ecs@
+ %%%% Defs of active char values '{...} '[...] !__xy and Acc shorts
+ %%% /##1. sets the active high octet equal to '{##1} or Acc short
+ \def/##1.{\ex@\let\ex@\temp@\cs@ ts_##1\ecs@
+ \ifx\temp@\relax
+ \ex@\ex@\ex@\edef\cs@ da_\the\count255\ecs@
+ {'\lbrace@ ##1\rbrace@}%
+ \else
+ \ex@\ex@\ex@\edef\cs@ da_\the\count255\ecs@{\temp@}%
+ \fi
+ \advance\count255 by 1\relax}%
+ %%% |##1. active high octet --> '[\TS_##1] or Acc short
+ \def|##1.{\ex@\let\ex@\temp@\cs@ ts_##1\ecs@ %% why this 24-11-00?
+ \ifx\temp@\relax
+ \ex@\ex@\ex@\edef\cs@ da_\the\count255\ecs@
+ {'[\cs@ TS_##1\ecs@]}%
+ \else
+ \ex@\ex@\ex@\edef\cs@ da_\the\count255\ecs@{\temp@}%
+ \fi
+ \advance\count255 by 1\relax}%
+ %%% \. sets the active high octet equal to !__xy where "XY=\count255
+ \def\.{\ex@\ex@\ex@\edef\cs@ da_\the\count255\ecs@{%
+ '\string_\string_\cs@ dh_\the\count255\ecs@}%
+ %% in short \def ^^xy{'__xy}
+ \advance\count255 by 1\relax}
+ %%% \apos. sets the active high octet equal to '* for Ukr
+ %% and otherwise to '[']
+ \def\apos.{%
+ \ex@\let\ex@\temp@\cs@ ts_apos\ecs@%
+ %\show\temp@ % normally '* (Ukr) or \relax (Ru)
+ \ifx\temp@\relax
+ \ex@\ex@\ex@\edef\cs@ da_\the\count255\ecs@{'[\cs@ TS_rq\ecs@]}%
+ \else
+ \ex@\ex@\ex@\edef\cs@ da_\the\count255\ecs@{\temp@}%
+ \fi
+ \advance\count255 by 1\relax}%
+ \count 255=128\relax
+ \TheEightbitEncodingVect@
+ }
+
+
+ %%%%%% \@HiOctetsAccInDefs %% 7 to 8
+ %% extracts all useful info from the
+ %% \TheEightbitEncodingVect@ which is typically \DosEncodingVect@
+ %% it will be (other high octet) valued functions:
+ %% \so_<7short>, \to_<latextag>,
+ %% \TO_<7short>, \TO_<mydiactag>, \ho_<hextag>
+ \def\@HiOctetsAccInDefs{%
+ %%%%% Extract info from \TheEightbitEncodingVect@
+ %%%% Auxilliary tools for high octets: (all are used)
+ \@SetHighAccess
+ %% \do_<decimal> --> <8other> **, \dh_<decimal> --> <hex> **
+ \@SetAccInShortsA %% \so_<tag> --> '{<tag>} as default
+ %% \ts_<tag> --> <7short>, eg. \ts_shch --> 'w **
+ \@SetDiacShorts %% \TS_<tag> --> <7short> **
+ %\@IdentifyAccInLetterTags %% \te_<tag> --> \@e when char "known"
+ %\ex@\show\cs@ te_gje\ecs@
+ %%%% \Set@ho and \The@o used thrice below,
+ %% defines \ho_<hex> --> cat 12 octet
+ \def\The@o{\cs@ do_\the\count255\ecs@}%
+ \def\Set@ho{\edef\The@hex{\cs@ dh_\the\count255\ecs@}%
+ \ex@\edef\cs@ ho_\The@hex\ecs@{\The@o}}%
+ %%%% \. Surely \ho_xy --> ^^xy where "XY=\count255
+ \def\.{\Set@ho \advance\count255 by 1\relax}%
+ %%%% /##1. where ##1 is <tag> = LaTeX cyrillic letter tag
+ \def/##1.{\Set@ho
+ %%% maybe \so_<7short> --> other high octet
+ \ex@\ifx\cs@ ts_##1\ecs@\relax
+ \else
+ \edef\temp@{\cs@ ts_##1\ecs@}
+ \ex@\edef\cs@ so_\temp@\ecs@{\The@o}%
+ \fi
+ %%% surely \to_<tag> --> other high octet
+ \ex@\edef\cs@ to_##1\ecs@{\The@o}%
+ \advance\count255 by 1\relax}%
+ %%%% |##1. where ##1 is <tag> = my tex diac tag
+ %%%xxx REVISE to elim TS_ and \@SetDiacShorts
+ %%%xxx and also diac table anomaly re '["]
+ \def|##1.{\Set@ho
+ %%% surely \TO_<7short> --> other high octet
+ \ex@\edef\cs@ TO_##1\ecs@{\The@o}%
+ \edef\temp@{\cs@ TS_##1\ecs@}
+ \ex@\edef\cs@ TO_\temp@\ecs@{\The@o}%
+ %%% surely \TO_<tag> --> other high octet
+ \ex@\edef\cs@ TO_##1\ecs@{\The@o}%
+ \advance\count255 by 1\relax }%
+ %
+ %%%% \apos. just means |rq. for now 26-11-00
+ \def\apos.{|rq.}
+ %
+ \count255=128\relax
+ \TheEightbitEncodingVect@
+ %
+ %%%%% Define active English letter A --> \so_A
+ %% and 'A --> '\so_A if nothing better
+ \def/##1{\lccode`\~=`##1
+ \lowercase{\edef~}{\cs@ so_##1\ecs@}%
+ \ex@\ifx\cs@ so_'##1\ecs@\relax
+ \ex@\edef\cs@ so_'##1\ecs@{'\cs@ so_##1\ecs@}%
+ \fi}
+ \LatinLettersholder@
+ \@SetAccInShortsB %% \so_'g ==> edef exp of \to_gup etc
+ }
+
+ %%%%%% \StrangeLowOctetsToCaskets@ %%%%% correct for CR & LF??
+ %
+ \edef\OctetCasket@#1 #2 {\edef#1{\string!\string_\string_#2}}%
+ %%\OctetCasket@^^ff ff --> {the string !__ff}
+ \def\StrangeLowOctetsToCaskets@{%
+ \let/\OctetCasket@
+ \LowActiveOctetsHolder@
+ %% \HighActiveOctetsHolder@ handled otherwise
+ }
+
+ %%%%%% \StrangeOctetResurections@ %%%%% correct for CR & LF??
+ %% unnecessary now
+ %%%% \cs@!xy\ecs@ gives resurected octet __xy
+ \def\OctetResurection@#1 #2 {%
+ \ex@\edef\cs@ ho_#2\ecs@{\string#1}%
+ %\ex@\show\cs@ ho_#2\ecs@
+ }
+ \def\StrangeOctetResurections@{%
+ \let/\OctetResurection@
+ \LowActiveOctetsHolder@
+ }
+
+%%%%%% \@IsDigitHolder \@IsDigitDefs
+ %
+\def\HexDigitsHolder@{/0/1/2/3/4/5/6/7/8/9/a/b/c/d/e/f}
+ %
+ \def\@IsDigit{0}%
+ \def\@IsDigitDefs{%
+ \def/##1{\ex@\def\cs@ x_##1\ecs@{0}}% %% 0 is sign of digit
+ \HexDigitsHolder@}
+
+ \def\LatinLettersholder@{%% cat is *letter* here
+ /A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z%
+ /a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z%
+ }%
+
+ %%%%%% \LatinLetterActiveAccOutDefs@
+ %%% for AccOut currently
+ \let\pEng@=\relax %% initial
+ \def\LatinLetterActiveAccOutDef@#1{%
+ \lccode`\~=`#1\relax\lccode`a=`#1\relax
+ \lowercase{\edef~{\pEng@ a}}}%
+ %
+ \def\LatinLetterActiveAccOutDefs@{%
+ \let/\LatinLetterActiveAccOutDef@
+ \LatinLettersholder@
+ \lccode`\~=0 \lccode`a=`a%% restorative measure
+ }%
+
+ %%%%%% \ActiveUkrLigOutDefs@
+ %%% for context sensitive, official Ukr lig transliteration
+ \def\ActiveUkrLigOutDefs@{%
+ \lccode`\~=13\relax
+ \lowercase{\let~\UkrLigOutEndLine@}%% it edefs to empty
+ %%%% \UkrWB@ Word-Beginning catalysis
+ %% High diacritics have \UkrWB@ catalytic
+ %% postfix by \@HiOctetUkrLigOutDefs
+ %%% ASCII chars 32--126 will have
+ %% \UkrWB@ catalytic postfix iff active
+ %% But just some diacritics will be activated by
+ %\lccode`\~=`\-\relax
+ %\lowercase{\def~{-\UkrWB@}}%
+ \count255=32\relax
+ \Loop@
+ \lccode`\~=\count255\relax
+ \lowercase{\edef~{\string~\ne@\UkrWB@}}%
+ \advance\count255 by 1\relax
+ \ifnum\count255>126\relax\else
+ \Repeat@
+ \lccode`\~=0\relax %% restorative
+ %%% \UkrWBShift@{##1}{##2}%
+ %% {LaTeX Tag}{Word Beginning transliteration}
+ \def\UkrWBShift@##1##2{%
+ \edef\temp@{\ex@\ex@\ex@\string\cs@ ta_##1\ecs@}%
+ %% cat other, high octet
+ %\show\temp@
+ \ex@\edef\cs@ wb_\temp@\ecs@{##2}%
+ %% ##2 is the catalyzed character(s), cat other, ASCII
+ %\ex@\show\cs@ wb_\temp@\ecs@
+ %% It serves in place of \ts_##1
+ }%
+ \UkrWBShift@{IE}{Ye}%
+ \UkrWBShift@{ie}{ye}%
+ \UkrWBShift@{YI}{Yi}%
+ \UkrWBShift@{yi}{yi}%
+ \UkrWBShift@{ISHRT}{Y}%
+ \UkrWBShift@{ishrt}{y}%
+ \UkrWBShift@{YU}{Yu}%
+ \UkrWBShift@{yu}{yu}%
+ \UkrWBShift@{YA}{Ya}%
+ \UkrWBShift@{ya}{ya}%
+ \def\UkrWB@##1{%
+ %% ##1 is a token and the interesting case is when it is
+ %% one of the 8 active chars \c_IE,...,\c_ya
+ \ex@\ifx\cs@ wb_\string##1\ecs@ \relax
+ %% if a context transformation is NOT defined
+ \ex@##1%
+ \else
+ \cs@ wb_\string##1\ecs@ %% dangerous but OK?
+ \fi
+ }%
+ %%% Post-Z catalysis:
+ %% \CYRZ\CYRG ==> ZGH, \CYRZ\cyrg ==> Zgh, \cyrz\cyrg ==> zgh
+ %%
+ \edef\temp@{\let\ne@\Ukr@G=\ex@\ex@\ex@\ne@\cs@ ta_G\ecs@}\temp@
+ \edef\temp@{\let\ne@\Ukr@g=\ex@\ex@\ex@\ne@\cs@ ta_g\ecs@}\temp@
+ %%\Ukr@G is expansion of \ta_G
+ %%\Ukr@g is expansion of \ta_g
+ \def\AfterUkrZorz@ ##1{%% checks for G,g ==> GH, gh
+ %(AfterUkrZorz@)
+ \ifx##1\Ukr@G
+ GH%
+ \else
+ \ifx##1\Ukr@g
+ gh%
+ \else
+ %(neither ta_G nor ta_g)%
+ \ex@\ex@\ex@##1%
+ \fi
+ \fi
+ }%
+ \ex@\ex@\ex@\def\cs@ ta_Z\ecs@{Z\AfterUkrZorz@}%
+ \ex@\ex@\ex@\def\cs@ ta_z\ecs@{z\AfterUkrZorz@}%
+ }
+
+ %%%%%% \ActiveRuLigOutDefs@
+ \let\ActiveRuLigOutDefs@\relax%
+
+ %%%%%% \PrimableTestPrep@
+ %% to help decide whether prime in 8-bit file should double
+ %% depends on whether following char (when char)
+ %% decision in \def\pr@
+ %%% N.B. More than Latin letters are primable
+ \def\PrimableTestPrep@{%
+ \def/##1{\uccode`##1=1}%
+ %% uccode=1 means *potentially* primable to us
+ \LatinLettersholder@/</>/*/[\ex@/\lbrace@ %
+ %% < > * cause all the fuss; others later??
+ }
+
+ %%%%%% \PrepFlagsAccOut@
+ %
+ \def\PrepFlagsAccOut@{%
+ \let\pEng@=\relax
+ %% English letter flag from \LatinLetterActiveAccOutDefs@
+ \let\pExcl@=\relax %% from active !
+ \let\pBs@=\relax %% from active \
+ \let\pPr@=\relax %% from active '
+ \let\pCR@=\relax %% from active ^^M as \endlinechar
+ %% initial
+ \lccode`\~=`\\\relax%% makes active \ --> \pBs@
+ \lowercase{\def~{\pBs@}}%
+ \lccode`\~=`!\relax%% makes active ! --> \pExcl@
+ \lowercase{\def~{\pExcl@}}%
+ \lccode`\~=`\'\relax%% makes active ' --> \pPr@
+ \lowercase{\def~{\pPr@}}%
+ \lccode`\~=9\relax%% makes active ^^09 --> !^^09 (string)
+ \lowercase{\edef~{\string!\string_\string_09}}%
+ \lccode`\~=13\relax%% makes active ^^0d = !^^0d (string)
+ \lowercase{\def~{\pCR@}}%
+ }%
+
+ %%%%%% \PrepFlagsAccIn@ for
+ %
+ \def\PrepFlagsAccIn@{%
+ \lccode`\~=`\\\relax%% makes active \ --> \@Bs
+ \lowercase{\let~\@Bs}%
+ \lccode`\~=`!\relax%% makes active ! --> \@Excl
+ \lowercase{\let~\@Excl}%
+ \lccode`\~=`\'\relax%% makes active ' --> \@Acc
+ \lowercase{\let~\@Acc}%
+ \lccode`\~=13\relax%% makes active ^^0d = \@EndLine (string)
+ \lowercase{\let~\@e}%
+ \let ^^A=\@e
+ }%
+
+
+
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ %%%%%%%%%%%%%% TransSetup %%%%%%%%%%%%%%
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ %%%%%% \TransSetupAccIn@ (8 out)
+ \def\TransSetupAccIn@{%
+ \HiOctetsZeroLCcodes@ %% default to change
+ \@HiOctetsAccInDefs
+ \ThePrepMoreLiveAccIn@
+ %% This one is \PrepMoreLiveRuAccIn@ or \PrepMoreLiveUkrAccIn@
+ \StrangeOctetResurections@
+ \PrepFlagsAccIn@
+ \endlinechar=13
+ %\show^^A
+ }
+
+
+ %%%%% \TransSetupAccOut@ (7 out)
+ \def\TransSetupAccOut@{%
+ \StrangeLowOctetsToCaskets@
+ \@HiOctetAccOutDefs
+ %% high octet to tag short or '{??} or '[??] or !__xy
+ %%\ex@\show\cs@ ts_APOS\ecs@
+ \LatinLetterActiveAccOutDefs@
+ \PrimableTestPrep@ %% to make \IFnextprimable@ work
+ \PrepFlagsAccOut@
+ \endlinechar=13 % will change later
+ }
+
+ %%%%% \TransSetupLigOut@
+ \def\TransSetupLigOut@{%
+ \StrangeLowOctetsToCaskets@
+ \@HiOctetLigOutDefs
+ %% is \@HiOctetRuLigOutDefs or \@HiOctetUkrLigOutDefs
+ \ActiveLigOutDefs@ %% \relax or \ActiveUkrLigOutDefs@
+ \endlinechar=-1\relax
+ }
+
+
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ %%%%%%%%%%%%%% CategorySetup %%%%%%%%%%%%%%
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ %%%%% \CategorySetup@ best done as a predefined macro
+ %% to avoid self-ref problems
+
+ %%%%%% \ActivateLatinLetters@
+ \def\ActivateLatinLetters@{%
+ %\showthe\catcode`\/
+ \def/##1{\catcode`##1=13\relax}%
+ \LatinLettersholder@
+ }
+
+ %%%%% \MakeSpecialsOther@
+ %% Dangerous/exotic lower ascii become "other"
+ \def\MakeSpecialsOther@{%
+ \catcode9=13 %% tab
+ %%\catcode13=12 %% CR, just char absorb file at once? No
+ \catcode32=12 %% space to preserve multiple spaces
+ \catcode`\#=12
+ \catcode`\$=12
+ \catcode`\%=12
+ \catcode`\&=12
+ \catcode`\'=12 %% will often undo this
+ \catcode`\/=12
+ \catcode`\@=12
+ \catcode`\\=12 %% will often undo this
+ \catcode`\^=12
+ \catcode`\_=12
+ \catcode`\`=12
+ \catcode`\{=12
+ \catcode`\|=12
+ \catcode`\}=12
+ \catcode`\~=12
+ }
+
+ %%%% \MakeAsciiOther@
+ \def\MakeAsciiOther@{%
+ \count255=0 %
+ \Loop@
+ \catcode\count255=12\relax
+ \advance\count255 by 1\relax
+ \ifnum \count255< 128\relax
+ \Repeat@
+ }
+
+ %%%% \ActivateFlagChars@
+ \def\ActivateFlagChars@{%
+ \catcode`\'=13
+ \catcode`\!=13
+ \catcode`\\=13
+ \catcode13=13
+ }
+
+ %%%% \UkrLigContextActivations@
+ %% space, - and other non-letters
+ \def\UkrLigContextActivations@{%
+ \catcode13=13 %% CR
+ %\showthe\lccode`\.%
+ \count255=32\relax
+ \Loop@
+ \ifnum\lccode\count255=0\relax %% nonletters activated
+ \catcode\count255=13\relax
+ \fi
+ \advance\count255 by 1\relax
+ \ifnum\count255>126\relax\else
+ \Repeat@
+ %\def/##1{\catcode`##1=12\relax}\LatinLettersholder@
+ }
+
+ %%%% \RuLigContextActivations@
+ \let\RuLigContextActivations@\relax
+
+ \def\CategorySetupAccIn@{%
+ \LowOctetsCat@{15}%%
+ \catcode9=12\catcode10=12\relax %\catcode13=12 %% moderates above
+ \HiOctetsCat@{15}% %% to prevent disasters.
+ \MakeSpecialsOther@
+ \ActivateLatinLetters@ %% also done in AccOut direction
+ \ActivateFlagChars@ %% catcode 13 becomes 13
+ }
+
+ \def\CategorySetupAccOut@{%
+ \HiOctetsCat@{13}%
+ \LowOctetsCat@{13}%% includes controls; may work as input
+ \MakeSpecialsOther@
+ \ActivateLatinLetters@ %% but but < > still cat 12
+ \ActivateFlagChars@
+ }
+
+ \def\CategorySetupLigOut@{%
+ \HiOctetsCat@{13}%
+ \LowOctetsCat@{13}%% includes controls; may work as input
+ \MakeSpecialsOther@
+ \LigContextActivations@
+ %% \RuLigContextActivations@ or \UkrLigContextActivations@
+ %% initially ^^M=\relax
+ }
+
+
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ %%%%%%%%%%%%%% SecondPassPrepAccOut %%%%%%%%%%%%%%
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ \def\IFnextprimable@{\ifnum\uccode`##1=1\relax}
+
+
+ %%%%% \SecondPassPrepAccOut@ preps :
+ %%% AccOut is 2-pass process; see Eng.tex fo 2nd alone
+ %%%% First come a lot of definitions
+
+ \def\Gobble@#1{}%
+ \edef\OtherBacksl@{\ex@\Gobble@\string\\}%
+ \def\ExpTwiceAfter@{\ex@\ex@\ex@}%
+ \def\ExpThriceAfter@{\ex@\ExpTwiceAfter@\ex@}%
+ \def\ExpFourTimesAfter@{\ex@\ExpThriceAfter@\ex@}%
+
+%%%%% \SecondPassPrepAccOut@
+ %%%% The p-versions are \relax outside SecondPass group
+ \def \SecondPassPrepAccOut@{%
+ \let\pEng@=\Eng@ %% Begin English Letterwise mark
+ \let\pExcl@=\Excl@ %% escaping exclamation marks
+ \let\pPr@=\Pr@ %% escaping prime
+ \let\pBs@=\Bs@ %% smart backslash
+ \let\pCR@=\AccOutEndLine@
+ }
+
+%%%% \Eng@ meaning Begin English; will be let equal to \?
+ %%% \? will be prelim flag for English
+ \def\Eng@{\eng@}
+%%%% \eng@#1 meaning begin English with argument
+ \def\eng@#1{!#1\c@eng@}
+
+%%%% \c@eng@ continue English, first lap
+ \def\c@eng@#1{%
+ \ifx#1\Eng@
+ %\message{Is Eng@:\noexpand#1}%
+ \ex@\cc@eng@
+ \else
+ %\message{Not Eng@:\noexpand#1}%
+ \ifcat\noexpand#1a%% means Russian naked letter
+ !#1%% 8 then continue naked
+ \else
+ \ExpTwiceAfter@#1% after \ex@ removed here#1
+ %% just continue naked
+ \fi
+ \fi
+ }
+
+%%%% \cc@eng@ continuing begin English, since
+ %%% letter here guaranteed, as at \eng@
+ \def\cc@eng@#1{%
+ #1\c@eng@ %% this time do not deposit a \string!
+ }
+
+%%%% \Bs@ Backslash macro, will be \let equal to active \
+ %%%
+ \def\Bs@{\bs@}
+ \def\bs@#1{%
+ \ifx#1\Eng@
+ %\message{Is Eng@:\noexpand#1}%
+ \OtherBacksl@\ex@\cc@eng@
+ \else
+ %\message{Not Eng@:\noexpand#1}%
+ \ifx\Bs@#1%
+ %\message{Is Bs@:\noexpand#1}%
+ \OtherBacksl@\OtherBacksl@
+ \else
+ \ifcat\noexpand#1a%
+ \OtherBacksl@!#1
+ \else
+ \OtherBacksl@\ExpThriceAfter@#1%
+ \fi
+ \fi
+ \fi}
+
+%%%% \Pr@ Prime macro, will be \let equal to active '
+ %%% Is the preconverted character ' not yet doubled
+ %%% Beware that primes for "accented" Russian letters
+ %%% are already ' (cat 12) at this intermediate stage
+ \def\Pr@{\pr@}%
+ %
+ \def\pr@#1{%
+ \ifcat\noexpand#1\noexpand\Pr@ %% test for flag \Pr@ and friends
+ \(pr@_flag)''\ex@#1%
+ \else
+ \ifnum\uccode`#1=1 \@e
+ %% not flag but primable \IFnextprimable@
+ \(pr@_primable@)''#1%
+ \else
+ \if\noexpand#1'%% is it ' from ya and friends
+ \(pr@_prime)''#1%
+ \else
+ \(pr@_p)'\ExpThriceAfter@#1% finally sure one prime will do
+ \fi
+ \fi
+ \fi
+ }%
+
+%%%% \Excl@ Exclamation macro, will be \let equal to active !
+ %%% Is the preconverted character ! not yet doubled.
+ %%% Watch for interaction with \?=\Eng@.
+
+ \def\Excl@{\excl@}%
+ \def\excl@#1{%
+ \ifx#1\Excl@
+ !!\ex@\excl@
+ \else
+ \ifx#1\Eng@%%
+ %\message{Is Eng@:\string#1}%
+ !!\ex@\ex@\ex@\Eng@%
+ \else
+ \ifcat\noexpand#1a%
+ !!#1%
+ \else
+ \if\noexpand#1!%
+ %\message{Is !:\string#1}%
+ !!!%
+ \else
+ %\message{Not !:\string#1}%
+ !\ExpFourTimesAfter@#1%
+ \fi
+ \fi
+ \fi
+ \fi
+ }%
+
+ %%%% \EmptyEndLine@@ \UkrLigOutEndLine@ \AccOutEndLine@
+ %%% \endlinechar will be 13 and active and equal to:
+ \def\EmptyEndLine@@{}%
+ %%% but ALSO
+ \def\UkrLigOutEndLine@{\EmptyEndLine@@}%
+ %%% AND
+ \let\AccOutEndLine@\EmptyEndLine@@
+ %%% AND
+ \edef\AccInEndLine@{%
+ \ne@\Wobble@]\ne@\Wobble@\rbrace@\ne@\Gobble@\relax}%
+ %%% \Wobble@#1 is an end-of-line test
+ %% for AccIn mode and '[] '{} syntaxes
+ %%
+ \def\Wobble@#1{\cs@ W_#1\ecs@}
+ \ex@\edef\cs@ W_]\ecs@{}%
+ \ex@\edef\cs@ W_\rbrace@\ecs@{}%
+ \ex@\edef\cs@ W_\ecs@{Wobble}%% value must be string (not \relax)
+ %% since it will enter a \cs@ ... \ecs@
+
+ %% \AccInEndLine@ normally ultimately
+ %% vanishes if simply \edef expanded.
+ %% It's a \write that adds a CR in output
+
+
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ %%%%%%%%%%%%%%%%%%%% AccIn ' ! \ %%%%%%%%%%%%%%%%%%%%%
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ \def\(#1){}
+
+ \def\@Acc{\@acc}
+
+ % \def\@acc#1{%
+ % \ifnum \uccode`#1>0 \@e
+ % %(@acc_uccode)%
+ % %\cs@'\string#1\ecs@
+ % \ex@\ex@\cs@ so_'\string#1\ecs@
+ % \else
+ % \ifx#1\@Acc
+ % \(@acc_@Acc)%
+ % \ex@'%
+ % \else
+ % \(@acc_puke)%
+ % '\ex@\ex@\ex@#1%
+ % \fi
+ % \fi}
+
+ \def\@acc#1{%
+ \ex@\ifx\cs@ so_'\string#1\ecs@\relax
+ %\(@acc_puke for \cs@ so_'\string#1\ecs@)%
+ %% above tracer fails when #1 is )
+ '\ex@#1%
+ \else
+ %\(@acc_so_)%
+ \ex@\ex@\cs@ so_'\string#1\ecs@
+ \fi
+ }
+
+ \def\@Excl{\@excl}
+
+ \def\@excl#1{%
+ \ifnum \lccode`#1>0 \@e
+ \(@excl_c)\string#1\ex@\@c@excl %%(@excl_c)
+ \else
+ \ifx#1\@Excl
+ \(@excl_!)\string!%% (@excl_!)
+ \else
+ \(@excl_@@excl)\ex@\ex@\ex@ \@@excl \ex@\ex@\ex@#1%
+ %% quiery continues with \@@excl
+ \fi
+ \fi
+ }
+
+ \def\@@excl#1{%% handle _ and reliquat
+ \if\noexpand#1\string_%
+ %% \string!\string_ held back
+ \(@@excl_h)\ex@\@@UlnCheck %%(@@excl_h)
+ \else
+ \(@@excl_p)\string!\ex@#1%% (@@excl_p)
+ \fi
+ }
+
+ \def\@c@excl#1{%
+ \ifnum \lccode`#1>0 \@e
+ \(@c@excl_a)\string#1\ex@\@c@excl %%(@c@excl_a)
+ \else
+ \ifx#1\@Excl
+ \(@c@excl_@Excl)\ex@\ex@\ex@ \@eexcl %%\@UlnCheck
+ %% \@eexcl an "anti exclam"
+ %% \string! held back %%(@c@excl_!)
+ \else
+ \if\noexpand#1\string_%
+ %% \string!\string_ held back
+ \(@c@excl_hat)\ExpThriceAfter@\@@@UlnCheck %%(@c@excl_hat)
+ \else
+ \(@c@excl_p)\ExpThriceAfter@#1%% (@c@excl_p)
+ \fi
+ \fi
+ \fi
+ }
+
+
+ %%% an "anti exclam or exit exclam"
+ \def\@eexcl#1{%
+ \ifnum \lccode`#1>0 \@e
+ \(@eexcl_x)\ex@#1%% (@eexcl_x)
+ \else
+ \if\noexpand#1\string_%
+ %% \string!\string_ held back
+ \(@eexcl_hat)\ex@\ex@\ex@\@@@UlnCheck %%(@eexcl_hat)
+ \else
+ \(@eexcl_p)\ex@\ex@\ex@#1%% (@eexcl_p)
+ \fi
+ \fi
+ }
+
+ %%% past ! occurring in Eng look for first _ for case of !__xy
+ \def\@UlnCheck#1{%
+ \if\noexpand#1\string_%
+ %% retain first \string_
+ \(@UlnCheck_h)\ex@\@@UlnCheck %%(@UlnCheck_h)
+ \else
+ \(@UlnCheck_p)\ex@#1%% (@UlnCheck_p)
+ \fi
+ }
+
+ %%% past !_ look for second _ for case of !__xy
+ \def\@@UlnCheck#1{%
+ \if\noexpand#1\string_%
+ %% retain second \string_
+ \(@@UlnCheck_d)\ex@\@DigitCheck %%(@@UlnCheck_d)
+ \else
+ \(@@UlnCheck_p)\string!\string_\ex@#1%% (@@UlnCheck_p)
+ \fi
+ }
+
+ %%% past end-of-english _ look for second _ for case of !__xy
+ \def\@@@UlnCheck#1{%
+ \if\noexpand#1\string_%
+ %% retain second \string_
+ \(@@@UlnCheck_d)\ex@\@DigitCheck %%(@@@UlnCheck_d)
+ \else
+ \(@@@UlnCheck_p)\string_\ex@#1%% (@@UlnCheck_p)
+ \fi
+ }
+
+ %%% \@DigitCheck
+ %%% past !__ look for hex digit
+ %%% Prudent approach avoids line overrun; speed OK?
+ \def\@DigitCheck#1{%
+ \ex@\ifx\cs@ x_\string#1\ecs@\@IsDigit
+ \ex@\@DigitAll\ex@#1%% (@DigitCheck_d)
+ %% replace #1 as only storage device available
+ \else
+ \string!\string_\string_\ex@#1 %%(@DigitCheck_p)
+ \fi
+ }
+
+ %%% \@DigitAll
+ %%% past !__<digit> look for second hex digit #2
+ %%% Prudent approach avoids line overrun; speed OK?
+ \def\@DigitAll#1#2{%
+ \ex@\ifx\cs@ x_\string#2\ecs@\@IsDigit
+ %% x for hex%% (@DigitAll_d)
+ %\cs@!\string#1\string#2\ecs@ %% one octet replaces 5!
+ \cs@ ho_\string#1\string#2\ecs@
+ \else
+ \string!\string_\string_\ex@#1\ex@#2%
+ %% puke up five %% (@DigitAll_p)
+ \fi
+ }
+
+ %%%%%% \HexDigitsHolder@ \@IsDigitDefs
+ %
+ \def\HexDigitsHolder@{/0/1/2/3/4/5/6/7/8/9/a/b/c/d/e/f}
+ %
+ \def\@IsDigit{\@@IsDigit}%
+ \def\@IsDigitDefs{%% x_ for hex
+ \def/##1{\ex@\def\cs@ x_##1\ecs@{\@@IsDigit}}%
+ %% \@@IsDigit is sign of digit
+ \HexDigitsHolder@}
+
+ \@IsDigitDefs
+
+
+ %%% \@Bs and \@bs#1
+ \def\@Bs{\@bs}
+ \def\@bs#1{\OtherBacksl@
+ \ifnum \lccode`#1>0 \@e
+ \(@Bs_a)\string#1\ex@\@c@excl %%(@Bs_a)
+ \else
+ \ifx#1\@Bs
+ \(@Bs_bs)\OtherBacksl@ %%(@Bs_bs)
+ \else
+ \ifx#1\@Excl
+ \(@Bs_bs!)\ExpThriceAfter@\@bs@excl %%(@Bs_bs!)
+ \else
+ \(@Bs_o)\ExpThriceAfter@#1%% (@Bs_o)
+ \fi
+ \fi
+ \fi
+ }
+
+
+ \def\@bs@excl#1{%
+ \ifnum \lccode`#1>0 \@e
+ \(@bs@excl_lc)\ex@ #1%% do buggerall%% (@bs@excl_lc)
+ \else
+ \ifx#1\@Excl
+ \(@bs@excl_Excl)\string!%% (@bs@excl_Excl)
+ \else
+ \if\noexpand #1\string_%
+ \(@bs@excl_h)\ExpThriceAfter@\@@UlnCheck %%(@bs@excl_h)
+ \else
+ \(@bs@excl_o)\string!\ExpThriceAfter@ #1%% (@bs@excl_o)
+ \fi
+ \fi
+ \fi
+ }
+
+
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ %%%%%%%%%%%%%% MainConversionLoop %%%%%%%%%%%%%
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ \def\MainConversionLoop@{%
+ \message{\Sharp@}
+ \count255=0
+ \Loop@ %%
+ \advance\count255 1\relax
+ \ifnum\count255>40\relax
+ \count255=0\relax
+ \message{\Sharp@}%
+ \fi
+ \ifeof\MainStreamIn@
+ \else
+ \read\MainStreamIn@ to \Line@
+ \TheTreatLine@
+ \Repeat@
+ }
+
+ %%%%% \TreatLine... Macros
+ %
+ %%%% AccIn
+ \def\TreatLineAccIn@{%
+ %\show\Line@
+ %\show\AccInEndLine@
+ %\def\temp@{\ex@\Line@\AccInEndLine@}
+ %\show\temp@
+ %\tracingmacros=1
+ %\show ^^A
+ %\ex@\show\cs@ W_^^A\ecs@
+ \Wr@{\ex@\Line@\AccInEndLine@}% provisional?
+ }
+
+ %%%% AccOut
+ \def\TreatLineAccOut@{% new 25 Aug
+ \edef\Line@{\Line@}%% maybe add \EmptyEndLine@
+ \begingroup
+ \SecondPassPrepAccOut@
+ \Wr@{\Line@\AccOutEndLine@}%
+ \endgroup
+ }
+
+ %%%% LigOut \TreatLineLigOut@
+ %% is \TreatLineUkrLigOut@ or \TreatLineRuLigOut@
+
+ \def\TreatLineUkrLigOut@{% new 1 Nov
+ \Wr@{\ex@\UkrWB@\Line@\UkrLigOutEndLine@}
+ }% provisional?
+
+ \def\TreatLineRuLigOut@{% new 7 Sept
+ \Wr@{\Line@}}%
+
+
+
+
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ %%%%%%%%%%%%%% I / O %%%%%%%%%%%%%
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ \newread\MainStreamIn@
+ \newwrite\MainStreamOut@
+
+ \def\MainFileIn@{IN.txt}%
+ \def\MainFileOut@{OUT.txt}%
+ \def\AuxFileOut@{OUT.txt}%% this time, so not really needed
+
+ \def\AuxEncodingFile@{\cs@ \Encodingtag@ EncodingFile@\ecs@}
+ \def\ExtraEncodingFile@{extraenc.tex}
+ \def\HeadEncodingFile@{IN.txt}
+
+
+ %%%%% \SetupLineReads@ uses \TheStreamIn@ and
+ %% \TheFileIn@ which must be specified
+ \def\SetupLineReads@{%
+ \openin\TheStreamIn@\TheFileIn@\relax
+ \ifeof\TheStreamIn@
+ \closein\TheStreamIn@
+ \def\Decision@{\iwr@{}%
+ \iwr@{ * Sorry, "\TheFileIn@" is absent\string/busy; quitting.}
+ \cs@ end\ecs@}
+ \else
+ \let\Decision@\relax
+ \fi
+ \Decision@
+ }
+
+ \def\SetupModifLineReads@{%% for Extra or Head
+ \let\TheFileIn@\AuxEncodingFile@ %% alternative here!
+ \let\TheStreamIn@\MainStreamIn@
+ \SetupLineReads@
+ }
+
+ \def\SetupMainLineReads@{%% for Extra or Head
+ \let\TheStreamIn@\MainStreamIn@
+ \let\TheFileIn@\MainFileIn@ %% alternative here!
+ \SetupLineReads@
+ }
+
+ %%%%% \SetupWriteOuts@
+
+ \def\SetupWriteOuts@{%
+ \immediate\openout\TheStreamOut@\TheFileOut@\relax
+ }
+
+ \def\SetupMainWriteOuts@{%
+ \let\TheStreamOut@\MainStreamOut@
+ \let\TheFileOut@\MainFileOut@
+ \SetupWriteOuts@
+ }
+
+
+
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ %%%%%%%%%%%%%% INTERVIEW %%%%%%%%%%%%%
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ %%%% This can serve as a table of contents for this section
+ %
+ \def\InterviewUser@{%
+ \GetPrevOptions@
+ \Splash@
+ \SetupMainLineReads@
+ \GetUserChanges@
+ \InscribeUserChanges@
+ \AbortLossyInput@
+ \SetupMainWriteOuts@
+ %\WriteProlog@
+ }
+
+
+ \def\ReservedPrevOptions@{7ARW}
+ \let\PrevOptions@\ReservedPrevOptions@
+
+ %%%% \GetPrevOptions@
+
+ \def\GetPrevOptions@{%
+ \openin\MainStreamIn@ email-ru.opn \relax
+ \ifeof\MainStreamIn@
+ \else
+ \read\MainStreamIn@ to \PrevOptions@
+ \fi
+ \closein\MainStreamIn@
+ %\show\PrevOptions@
+ \TestOptions@\PrevOptions@
+ \ifGoodOptions@
+ %\iwr@{Good PrevOptions.}
+ \PreImplant@\PrevOptions@ %% includes format test
+ %% then preimplantation done and atoms defined
+ \else
+ %\iwr@{Bad PrevOptions.}
+ \let\PrevOptions@\ReservedPrevOptions@ %% \TestOptions@ not needed
+ \PreImplant@\PrevOptions@ %% so that atoms defined
+ \fi
+ }
+
+ %%%% \PreImplant@ #1; 1st exp of #1 is some sifted options like 8SW
+ %%% Sets atomic tags \Direction@, \ACtype@,
+ %% \LangGroup@, \Encoding@, for these options
+ \def\PreImplant@#1{ %% for reuse
+ \ex@\PreImplant@@#1\endPreImplant@@} % 4 \relax for insurance
+ \def\PreImplant@@#1#2#3#4#5\endPreImplant@@{%
+ \def\Direction@{#1}
+ \def\ACtype@{#2}
+ \def\LangGroup@{#3}%\show\LangGroup@
+ \def\Encoding@{#4}%\show\Encoding@
+ }
+
+ %%%% \TestOptions@ for \PrevOptions from possibly damaged file
+ \def\TestOptions@@#1#2#3#4#5\endTestOptions@@{%
+ \IN@0#1@78@
+ \ifIN@
+ \IN@0#2@LA@
+ \ifIN@
+ \IN@0#3@RU@
+ \ifIN@
+ \IN@0#4@DEHMIWK@
+ \ifIN@
+ \def\ttemp{#5}%\show\ttemp
+ \ifx\ttemp\empty
+ \GoodOptions@true
+ %\message{GoodOptions@true}%
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi
+ }
+ %
+ \def\TestOptions@#1{%
+ %\edef\temp{#1}\show\temp
+ \GoodOptions@false
+ \ex@\TestOptions@@#1\endTestOptions@@}
+
+%%%% \SetModetag@ sets \Modetag@ to AccIn, AccOut, or LigOut
+ %% \LangGroup@ does not affect this
+ \def\SetModetag@{%
+ \if\Direction@ 8%
+ \def\Modetag@{AccIn}%
+ \else
+ \if\ACtype@ L%
+ \def\Modetag@{LigOut}%
+ \else
+ \def\Modetag@{AccOut}%
+ \fi
+ \fi}
+
+%%%% \PrepOptionTags@
+ %%% Uses \Direction@, \ACtype@, \LangGroup@, \Encoding@.
+ %%% Sets Long tags \Modetag@,
+ %% \ACtypetag@, \LangGrouptag@, \Encodingtag@,
+ %
+ \def\Ltag@{Lig}
+ \def\Atag@{Acc}
+ %
+ \def\Dtag@{Dos}
+ \def\Mtag@{Mac}
+ \def\Itag@{Iso}
+ \def\Wtag@{Win}
+ \def\Ktag@{Koi}
+ \def\Etag@{Extra}
+ \def\Htag@{Head}
+ %
+ \def\Rtag@{Ru}\def\Rlongtag@{Russian}
+ \def\Utag@{Ukr}\def\Ulongtag@{Ukrainian}
+ %
+ \def\PrepOptionTags@{%
+ \SetModetag@ %% sets \Modetag@
+ \edef\ACtypetag@{\cs@\ACtype@ tag@\ecs@}%
+ \edef\Encodingtag@{\cs@\Encoding@ tag@\ecs@}%
+ \edef\LangGrouptag@{%
+ \cs@\LangGroup@ tag@\ecs@}% short name Ru or Ukr or ...
+ \edef\TheLangGroup@{%
+ \cs@\LangGroup@ longtag@\ecs@}%% full name; for dialog
+ \edef\LangAlphabetA@{\cs@\LangGrouptag@ AlphabetA@\ecs@}
+ \edef\LangAlphabetZ@{\cs@\LangGrouptag@ AlphabetZ@\ecs@}
+ }
+
+ \def\iwr@{\immediate\write16}%
+ \def\wr@{\immediate\write\MainStreamOut@}%
+ \def\MainFileIn@{IN.txt}%
+ \def\MainFileOut@{OUT.txt}%
+ %{\cs@ OUT-\SiftedOptions@.txt\ecs@}%
+ \def\ExtraEncodingFile@{extraenc.tex}
+
+ \def\batchindirname@{IN_BAT}%
+ \def\batchoutdirname@{OUT_BAT}%
+ \def\batchfilename@{batch}%
+
+ \def\DosBlurb@{DOS New Alternative Cyrillic encoding cp866nav}%
+ \def\MacBlurb@{Apple Macintosh Cyrillic}%
+ \def\IsoBlurb@{ISO8859-5 of 1988 for Sun,DEC,HP,Linux... }%
+ \def\WinBlurb@{Windows Cyrillic encoding, MicroSoft cp1251}%
+ \def\KoiBlurb@{KOI8 Internet Cyrillic (RFC-1489 of 1993)}%
+ \def\HeadBlurb@{Header encoding, placed near top of input}%
+ \def\ExtraBlurb@{Extra encoding from your own "\ExtraEncodingFile@"}%
+
+ \def\RuAlphabetA@{ a b v g d e 'o 'z z i j k l m n o p r s t}%
+ \def\RuAlphabetZ@{ u f x 't c w 'w q y h 'e 'u 'a }%
+
+ \def\UkrAlphabetA@{ a b v g(or h) 'g d e 'e 'z z y i 'i j k}%
+ \def\UkrAlphabetZ@{ l m n o p r s t u f x 't c w 'w q 'u 'a }%
+
+ \def\Rule@{ //////////////////////////////////////////////////////////}%
+
+
+ %%%%%% \Splash@
+ \def\Splash@ {%
+ \MakeSlantPct@
+ \iwr@{}%
+ \iwr@{\Rule@}%
+ \iwr@{ ///////////////////// email-ru.tex ///////////////////////}%
+ \iwr@{ // Converts Cyrillic text files between universal 7-bit}%
+ \iwr@{ // "ASCI-Cyrillic" and 8-bit Cyrillic text encodings.}%
+ \iwr@{ // Name input file "\MainFileIn@", alongside of "email-ru.tex".}%
+ \iwr@{ //// OPTIONS: Strike any option keys; then one <return>:-}%
+ \iwr@{ / X = abort now.}%
+ \iwr@{ / 8 = 8-bit output ; 7 = 7-bit output. }%
+ %\iwr@{ /// There are two routes for input:}%
+ %\iwr@{ / F = File ("\MainFileIn@", normally %
+ % alongside of this "email-ru.tex").}%
+ %\iwr@{ / B = Batch (files in directory %
+ % "\batchindirname@", in same location).}%
+ \iwr@{ /// There are two supported 7-bit formats:}%
+ \iwr@{ / L = Lossy transcription (using Ligatures);}%
+ \iwr@{ / A = ASCII-Cyrillic, using ' as accent and also ! \noexpand\ }%
+ \iwr@{ /// There are two supported language groups:}%
+ \iwr@{ / R = Russian (including Bulgarian and Byelorussian);}%
+ \iwr@{ / U = Ukrainian.}%
+ \iwr@{ /// There are many supported 8-bit Cyrillic encodings:}%
+ \iwr@{ / D = \DosBlurb@;}%
+ \iwr@{ / M = \MacBlurb@;}%
+ \iwr@{ / I = \IsoBlurb@;}%
+ \iwr@{ / W = \WinBlurb@;}%
+ \iwr@{ / K = \KoiBlurb@;}%
+ \iwr@{ / H = \HeadBlurb@;}%
+ \iwr@{ / E = \ExtraBlurb@.}%
+ \iwr@{ //// HELP: toward end of this %
+ macro file "email-ru.tex".}%
+ \iwr@{\Rule@}%
+ \iwr@{}%
+ }
+
+
+ %%% Subtle sanitization to see only ACDIKLMSTWX78
+ %%% Fails with case change alone; so use active too
+ \def \SeeOnlyACDEHIKLMRSTUWX78@{%
+ \count255=0\relax
+ \Loop@
+ \catcode\count255=9\relax
+ \advance\count255 by 1\relax
+ \ifnum
+ \count255<256\relax
+ \Repeat@
+ \catcode`7=12\relax
+ \catcode`8=12\relax
+ %% Undo above for 11 letters
+ \def/##1{\catcode`##1=11\relax}%
+ /A/C/D/E/H/I/K/L/M/R/S/T/U/W/X/a/c/d/e/h/i/k/l/m/r/s/t/u/w/x
+ \catcode`7=12\relax\catcode`8=12\relax
+ %% next make active a expand to letter A, etc.
+ \def/##1{\uccode`\~=`##1\relax\uppercase{\def~{##1}}}%
+ /a/c/d/e/h/i/k/l/m/s/r/t/u/w/x %% these are cat 11
+ %% then make these 11 letters active
+ \def/##1{\catcode`##1=13\relax}%
+ /a/c/d/e/h/i/k/l/m/r/s/t/u/w/x
+ }
+
+ \def\GetUserChanges@{%
+ \iwr@{ *** Default options: \PrevOptions@. }%
+ \iwr@{ *** Just type any change(s) and hit <return>.}%
+ \iwr@{ *** (Lowercase is OK.)}%
+ \begingroup
+ \SeeOnlyACDEHIKLMRSTUWX78@
+ \global\read16 to \YourChanges
+ \xdef\YourChanges{\YourChanges}
+ \endgroup
+ %\show\YourChanges
+ \let\UserChanges@\YourChanges
+ %\show\UserChanges@
+ \let\Reliquat@\UserChanges@
+ %\show\Reliquat@
+ \def\SiftedOptions@{}%
+ }
+
+
+ \def\Codify@#1{%
+ \IN@0#1@\Reliquat@ @%
+ \ifIN@\else
+ \edef\temp{#1}\message{Bug in \string\Codify@.}
+ \show\temp\show\Reliquat@
+ \show\Direction@
+ \fi
+ \SPLIT@0#1@\Reliquat@ @%
+ \edef\Reliquat@{\the\Initialtoks@\the\Terminaltoks@}%
+ \edef\SiftedOptions@{\SiftedOptions@#1}%
+ }
+
+
+ \def\CaseX@{%
+ \IN@0X@\UserChanges@ @%
+ \ifIN@
+ \def\Decision@{
+ \iwr@{ * Exit requested (by X).}
+ \endgroup\end}%
+ \else
+ \def\Decision@{}%
+ \fi
+ \Decision@}
+
+ \def\AdjustDirection@{%
+ %\show\UserChanges@
+ \IN@07@\UserChanges@ @%
+ \ifIN@
+ \Codify@{7}%
+ \else
+ \IN@08@\UserChanges@ @%
+ \ifIN@
+ \Codify@{8}%
+ \else
+ \edef\Reliquat@{\Reliquat@\Direction@}
+ \Codify@{\Direction@}%
+ \fi\fi
+ }
+
+ \def\AdjustACtype@{%
+ \IN@0L@\UserChanges@ @%
+ \ifIN@
+ \Codify@{L}%
+ \else
+ \IN@0A@\UserChanges@ @%
+ \ifIN@
+ \Codify@{A}%
+ \else
+ \edef\Reliquat@{\Reliquat@\ACtype@}
+ \Codify@{\ACtype@}%
+ \fi\fi
+ }
+
+ \def\AdjustLangGroup@{%
+ \IN@0R@\UserChanges@ @%
+ \ifIN@
+ \Codify@{R}%
+ \else
+ \IN@0U@\UserChanges@ @%
+ \ifIN@
+ \Codify@{U}%
+ \else
+ \edef\Reliquat@{\Reliquat@\LangGroup@}
+ \Codify@{\LangGroup@}%
+ \fi\fi
+ }
+
+ \def\AdjustEncoding@{%
+ \IN@0D@\UserChanges@ @%
+ \ifIN@
+ \Codify@{D}%
+ \else
+ \IN@0M@\UserChanges@ @%
+ \ifIN@
+ \Codify@{M}%
+ \else
+ \IN@0I@\UserChanges@ @%
+ \ifIN@
+ \Codify@{I}%
+ \else
+ \IN@0W@\UserChanges@ @%
+ \ifIN@
+ \Codify@{W}%
+ \else
+ \IN@0K@\UserChanges@ @%
+ \ifIN@
+ \Codify@{K}%
+ \else
+ \IN@0H@\UserChanges@ @%
+ \ifIN@
+ \Codify@{H}%
+ \else
+ \IN@0E@\UserChanges@ @%
+ \ifIN@
+ \Codify@{E}%
+ \else
+ \edef\Reliquat@{\Reliquat@\Encoding@}
+ \Codify@{\Encoding@}%
+ \fi\fi\fi\fi\fi\fi\fi
+ }
+
+
+ %%%% \InscribeUserChanges@
+ %%% Uses \PrevOptions@ in atomic form plus \UserChanges@
+ %%% Yields \SiftedOptions@ and \Reliquat@
+ %%% Yields full implementation of \SiftedOptions@
+ \def\InscribeUserChanges@{%
+ \CaseX@
+ \AdjustDirection@
+ \AdjustACtype@
+ \AdjustLangGroup@
+ \AdjustEncoding@
+ \PreImplant@\SiftedOptions@ % updates atomic options
+ \PrepOptionTags@
+ %\iwr@{ Direction@ = \Direction@}%
+ %\iwr@{ ACtype@ = \ACtype@}%
+ %\iwr@{ Encoding@ = \Encoding@}%
+ \iwr@{ Options keys being used: \SiftedOptions@}%
+ \iwr@{}%
+ \iwr@{ Modetag@ = \Modetag@}%
+ \iwr@{ ACtypetag@ = \ACtypetag@}%
+ \iwr@{ LangGrouptag@ = \LangGrouptag@}%
+ \iwr@{ Encodingtag@ = \Encodingtag@}%
+ \iwr@{}%
+ }
+
+ \def\AbortLossyInput@{%
+ %\message{AbortLossyInput@}%
+ \def\Decision@{}%
+ \if\ACtype@ L%
+ \if\Direction@ 8%
+ \iwr@{ !!! Sorry, type L (=Lossy) %
+ 7-bit cannot be converted to 8-bit!}%
+ \def\Decision@{\read16 to \byebye \end}%
+ \fi
+ \fi
+ \Decision@}
+
+
+
+ \def\PrologRule@
+ { /////////////////////////////////////////////////////////////////}%
+
+ \def\WritePrologOut@{%
+ \MakeSlantPct@
+ \Wr@{\PrologRule@}
+ %\show\SiftedOptions@
+ \Wr@{ //// Converted by "email-ru.tex", %
+ \cs@ email-ru-version\ecs@, options \SiftedOptions@, to}
+ \IN@07@\SiftedOptions@ @%
+ \ifIN@
+ \IN@0L@\SiftedOptions@ @%
+ \ifIN@
+ \Wr@{ //// \TheLangGroup@\space
+ text in a readable but lossy 7-bit ASCII format,}
+ \IN@0R@\SiftedOptions@ @%
+ \ifIN@
+ \Wr@{ //// namely the U.S. Lib. of Congress transcription scheme.}
+ \else
+ \Wr@{ //// namely the official Ukrainian one of 1996.}
+ \fi
+ \else
+ \Wr@{ //// \TheLangGroup@\space
+ text in faithful 7-bit ASCII-Cyrillic format.}
+ \Wr@{ //// The 33 letters of the modern \TheLangGroup@
+ \space alphabet are:}
+ \Wr@{ //// \LangAlphabetA@}
+ \Wr@{ //// \LangAlphabetZ@}
+ \Wr@{ //// For perfect restoration %
+ to many common 8-bit Cyrillic text}
+ \Wr@{ //// encodings, %
+ obtain the TeX utility "email-ru.tex" from CTAN.}
+ \fi
+ \else
+ \Wr@{ //// \TheLangGroup@\space
+ text in the 8-bit extended ASCII encoding:-}
+ \Wr@{ //// \cs@ \Encodingtag@ Blurb@\ecs@. For readable}
+ \Wr@{ //// ASCII transcriptions, %
+ use "email-ru.tex" available on CTAN.}
+ \fi
+ \Wr@{\PrologRule@}
+ \Wr@{}
+ \iwr@{ Processing (in 40 line units):-}\message{ }%
+ }
+
+
+
+ %%%%%%%%%%%%%%%%%%% <--------- END OF INTERVIEW
+
+
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ %%%%%%%%%%%%%% MODIFICATIONS %%%%%%%%%%%%%
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+ \newif\ifExit@
+ \newif\ifModif@
+ \newif\ifAbortModif@
+
+ \newtoks\Modiftoks@
+
+ \newcount\Modifcount@
+ \newcount\EndModifcount@
+ %\newcount\Prologcount@
+
+ \def \MaybeAbortModif@{
+ \ifAbortModif@
+ \iwr@{}
+ \endgroup\endgroup
+ \iwr@{ !! Hit return to abort.}
+ \read-1 to \Junk@
+ \ex@\end
+ \fi
+ }
+
+ %%%%% \FindAndCopyModif@
+ %% Uses \AuxEncodingFile@, \AuxStreamIn@
+ %% provides \Modifcount@, \EndModifcount@
+ \def\FindAndCopyModif@{%
+ \SetupModifLineReads@
+ \count255=0
+ \Loop@ %%
+ \read\MainStreamIn@ to \Line@
+ % \iwr@{ Line@ = \Line@}%
+ \ifeof\MainStreamIn@
+ \AbortModif@true
+ \iwr@{}%
+ \iwr@{ !! At eof of \AuxEncodingFile@.}%
+ \iwr@{ !! Although modification was announced for input,}%
+ \iwr@{ !! the flag \ModifFlag@\space is missing.}%
+ \iwr@{ !! The input line number now is \the \count255.}%
+ \fi
+ \MaybeAbortModif@
+ \advance\count255 1\relax
+ \ifnum\count255>80\relax
+ \Exit@true
+ \global\AbortModif@true
+ \iwr@{}%
+ \iwr@{ !! Input limit.}%
+ \iwr@{ !! Although modification was announced for input,}%
+ \iwr@{ !! the flag \ModifFlag@\space is missing.}%
+ \iwr@{ !! The input line number now is \the \count255.}%
+ \iwr@{ Line@ = \Line@}%
+ \fi
+ \IN@0\ModifFlag@ @\Line@ @
+ \ifIN@
+ %\iwr@{}%
+ %\iwr@{ *** Bingo ***************}%
+ \Exit@true
+ \Modif@true
+ \global\Modifcount@=\count255
+ %\iwr@{}
+ %\iwr@{ ** Modification beginning at line \the\count255.}
+ %\iwr@{ ** Exit@ is true.}
+ \fi
+ \ifExit@
+ \else
+ \Repeat@
+ %
+ \MaybeAbortModif@
+ %
+ \Exit@false
+ \Chaintoks@{}%% clean slate
+ \ChainLine@ %% in reserve for keeps !!!!!!!!!!!
+ \Wr@{\Line@}%% temp for reading
+ \Loop@ %%
+ \read\TheStreamIn@ to \Line@
+ \ChainLine@ %% in reserve for keeps !!!!!!!!!!!
+ \Wr@{\Line@}%% temp for reading
+ \ifeof\MainStreamIn@
+ \Exit@true
+ \AbortModif@true
+ \iwr@{}%
+ \iwr@{ !! End of input file and the}%
+ \iwr@{ !! flag \EndModifFlag@\space is missing.}%
+ \iwr@{ !! The line number now is \the \count255 : }%
+ \fi
+ \MaybeAbortModif@
+ \advance\count255 1\relax
+ %\iwr@{}%
+ %\iwr@{ ** Count 255 advanced to \the\count255.}%
+ \ifnum\count255>220\relax
+ \Exit@true
+ \AbortModif@true
+ \iwr@{}%
+ \iwr@{ !! Runon modification. Aborting at line 220.}%
+ \iwr@{ !! Need a flag: }%
+ \iwr@{ !! "\EndModifFlag@"}%
+ \iwr@{ !! The line number now is \the \count255 : }%
+ \fi
+ \MaybeAbortModif@
+ \IN@0\EndModifFlag@ @\Line@ @%
+ \ifIN@
+ \Exit@true %\message{** Exit@true **}%
+ \global\EndModifcount@=\count255
+ %\iwr@{}%
+ %\iwr@{ ** Modification ending at line \the\count255.}%
+ %\iwr@{ ** Exit@ is true. }%
+ \fi
+ \ifExit@
+ \else
+ \Repeat@
+ %
+ \cs@ \Encodingtag@ StreamInAdjust@\ecs@
+ %% Explanation: If Extra is encoding tag, then closein
+ %% \ExtraEncodingFile@ and openin \MainFileIn@
+ %% But if it is Head then do nothing and continue input.
+ \immediate\closeout\MainStreamOut@
+ %\iwr@{}%
+ %\iwr@{ *** Both loops completed.}%
+ %\iwr@{ *** Modification began at line \the\Modifcount@.}%
+ %\iwr@{ *** Modification ended at line \the\EndModifcount@.}%
+ %\iwr@{ *** See modif in "\MainFileOut@". %
+ % Then hit <return> to continue.}%
+ %\read16 to \Junk@
+ }
+
+ \def\ExtraStreamInAdjust@{%
+ \immediate\closein\MainStreamIn@
+ \immediate\openin\MainStreamIn@\MainFileIn@\relax}
+
+ %% \HeadStreamInAdjust@ will be relax
+
+
+ \MakeSlantPct@
+
+ \uccode`!=`\%
+ \uccode`?=`\#
+ \uppercase{%
+ \edef\ModifFlag@{!?[<ASCII-CYRILLIC\string_MODIF>?]}%
+ \edef\EndModifFlag@{!?[<ASCII-CYRILLIC\string_ENDMODIF>?]}%
+ }
+ \uccode`!=0
+ \uccode`?=0
+
+ \def\CatsForCopying@{%
+ \LowOctetsCat@{12}%
+ \HiOctetsCat@{12}%
+ \MakeSpecialsOther@ }
+
+
+ \def\TransCodeTheRest@{%
+ \count255=0
+ \Loop@ %%
+ \advance\count255 by 1\relax
+ \ifnum\count255=40\relax
+ \count255=0\message{\Sharp@}%
+ \fi
+ \ifeof\MainStreamIn@
+ \else
+ \read\MainStreamIn@ to \Line@
+ \ex@\uppercase\ex@{\ex@\Wr@\ex@{\Line@}}%
+ %\iwr@{\Line@}%
+ \Repeat@
+ }
+
+
+ \def\DoConversion@{%
+ \iwr@{}%
+ \iwr@{ ** ExploitModifs@}%
+ %
+ \TransCodeTheRest@
+ \immediate\closein\MainStreamIn@
+ \immediate\closeout\MainStreamOut@
+ }
+
+
+ %%%%%%%%%%%%%%%%%%% <--------- END OF MODIFICATIONS
+
+
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ %%%%%%%%%%%%%% \ImplantCurrentOptions@ %%%%%%%%%%%%%
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ %%%%%% \ImplantCurrentOptions@
+ %% Is unique bridge between interview and converter parts
+ %%%%% Currently \Modetag@ (LigOut or AccOut )
+ %% and \Encodingtag@ determine \ACtypetag@
+ %% so last is confined to Interview.
+ %%%%% \Modetag@ \Encodingtag@ \LangGrouptag@ are all
+ %% that is currently used from Interview
+ \def \ImplantCurrentOptions@{%
+ %%%%% \CategorySetup@
+ \ex@\let\ex@\CategorySetup@
+ %%**** = formally indep of encoding and language
+ \cs@ CategorySetup\Modetag@ @\ecs@
+ %%%%% \TheTransSetup@
+ \ex@\let\ex@\TheTransSetup@ %%****
+ \cs@ TransSetup\Modetag@ @\ecs@
+ %%%%% \MainConversionLoop@ is formally invariant
+ %%%%% \TreatLineLigOut@ %%** means formally indep of encoding
+ \ex@\let\ex@\TreatLineLigOut@ %%
+ \cs@ TreatLine\LangGrouptag@ LigOut@\ecs@
+ %\show\TreatLineLigOut@
+ %%%%% \TheTreatLine@
+ \ex@\let\ex@\TheTreatLine@ %%****
+ \cs@ TreatLine\Modetag@ @\ecs@ %%
+ %\show\TheTreatLine@
+ %%%%% \TheEightbitEncodingVect@
+ \ex@\let\ex@\TheEightbitEncodingVect@ %% formally indep of language
+ \cs@ \Encodingtag@ EncodingVect@\ecs@
+ %\show\TheEightbitEncodingVect@
+ %\ex@\show\cs@ \Encodingtag@ EncodingVect@\ecs@
+ %%%%% \@TheModeShorts \@TheAccShorts or \@TheLigShorts
+ \ex@\let\ex@\@TheAccShorts %%**
+ \cs@ @AccShorts\LangGrouptag@\ecs@
+ \ex@\let\ex@\@TheLigShorts %%**
+ \cs@ @LigShorts\LangGrouptag@\ecs@
+ %%%%% \@HiOctetLigOutDefs
+ \ex@\let\ex@\@HiOctetLigOutDefs %%**
+ \cs@ @HiOctet\LangGrouptag@ LigOutDefs\ecs@
+ %%%%% \ActiveLigOutDefs@
+ \ex@\let\ex@\ActiveLigOutDefs@ %%**
+ \cs@ Active\LangGrouptag@ LigOutDefs@\ecs@
+ %%%%% \LigContextActivations@
+ \ex@\let\ex@\LigContextActivations@ %%**
+ \cs@ \LangGrouptag@ LigContextActivations@\ecs@
+ %%%%% \ThePrepMoreLiveAccIn@
+ \ex@\let\ex@\ThePrepMoreLiveAccIn@ %%**
+ \cs@ PrepMoreLive\LangGrouptag@ AccIn@\ecs@
+ %\show\PrepMoreLiveAccIn@
+ }
+
+
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ %%%%%%%%%%%%%% MAIN %%%%%%%%%%%%%
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ %
+ %% \Main@:- After \CategorySetup@ to \endgroup
+ %% must avoid space { } etc
+ \def\Main@{%
+ \begingroup
+ \InterviewUser@
+ \DoTheHeader@ %% hiatus "}{" , but here
+ %% \SiftedOptions@, \PrevOptions@ etc. etc. global
+ \ImplantCurrentOptions@
+ \TheTransSetup@
+ %\ex@\show\cs@'\string>\ecs@
+ \MaybeSetupLineReads@
+ \begingroup
+ \CategorySetup@
+ %\showthe\catcode`\-
+ %\showthe\catcode127
+ %\showthe\catcode32\relax
+ %\showthe\catcode`\\
+ \MainConversionLoop@
+ \endgroup
+ \Endgame@
+ \endgroup
+ \end
+ }
+
+ \def\MaybeSetupLineReads@{%
+ \def\temp@{E}%
+ \ifx\Encoding@\temp@
+ \SetupMainLineReads@
+ \fi}
+
+ \def\ProcessingReport@{}
+
+
+ \def\DoTheHeader@{%
+ \IN@0\Encoding@ @DMIWK@
+ \ifIN@
+ \ex@\DoOrdHeader@
+ \else
+ \ex@\DoAuxHeader@
+ \fi}
+
+
+ \def\DoOrdHeader@{%
+ \SetupMainWriteOuts@
+ \WritePrologOut@
+ }
+
+ \newtoks\temptoks@
+
+ \def\DoAuxHeader@{%
+ %\iwr@{ * \string\DoAuxHeader@}%
+ \SetupMainWriteOuts@
+ \CatsForCopying@
+ %\iwr@{}
+ \iwr@{ * \ne@\FindAndCopyModif@ :- %
+ Seeking modifs in "\AuxEncodingFile@".}%
+ \iwr@{}
+ \FindAndCopyModif@
+ \global\Chaintoks@\Chaintoks@
+ \global\let\SiftedOptions@\SiftedOptions@
+ \global\let\PrevOptions@\PrevOptions@
+ \global\let\Modetag@\Modetag@
+ \global\let\Encodingtag@\Encodingtag@
+ \global\let\LangGrouptag@\LangGrouptag@
+ \global\let\TheLangGroup@\TheLangGroup@
+ \global\let\LangAlphabetA@\LangAlphabetA@
+ \global\let\LangAlphabetZ@\LangAlphabetZ@
+ \endgroup %%%%%%%%%%%%% coming up for old categories
+ \let\AsciiCyrModif\relax %% to get by gate on encoding
+ %\iwr@{ * Now digesting the modifs in "\MainFileOut@".}%
+ %\iwr@{}%
+ \input\MainFileOut@ %% !!!!!!!!
+ \begingroup %%%%%%%%%%%%
+ \CatsForCopying@
+ %% Now wipe out \MainFileOut@
+ \SetupMainWriteOuts@
+ \WritePrologOut@
+ \Wr@{\the\Chaintoks@}\Wr@{}%
+ \global\Chaintoks@{}%% Cleanup
+ \temptoks@\ex@{\AuxEncodingVect@}%
+ %\showthe\temptoks@
+ %\iwr@{}%
+ %\iwr@{ ** Here is meaning of \string\AuxEncodingVect@:}%
+ %\iwr@{\the\temptoks@}%
+ %\iwr@{}%
+ %\iwr@{ ** Hit <return> to continue.}%
+ %\read16 to \Junk
+ \ex@\let\cs@\Encodingtag@ EncodingVect@\ecs@\AuxEncodingVect@
+ }%
+
+
+ %\let\ExtraEncodingVect@\NullEncodingVect@
+ %\let\HeadEncodingVect@\NullEncodingVect@
+
+
+ %%%%% \Closing@
+ \def\Closing@{%
+ \ProcessingReport@
+ \iwr@{}
+ \iwr@{ *** Finished! See \MainFileOut@\space
+ alongside of \MainFileIn@.}%
+ %\iwr@{ *** Hit <return> to exit.}%
+ %\read16 to \byebye
+ }
+
+ \def\WriteEpilog@{%
+ \MakeSlantPct@
+ %\Wr@{}%
+ \Wr@{\PrologRule@}%
+ \Wr@{ //// End of output by %
+ "email-ru.tex", with options \SiftedOptions@.}%
+ \Wr@{\PrologRule@}%
+ }
+
+ \def\WritePrevOptions@{%
+ \ifx\SiftedOptions@\PrevOptions@
+ \else
+ \immediate\openout\MainStreamOut@ email-ru.opn \relax
+ \immediate\write\MainStreamOut@{\SiftedOptions@}%
+ \immediate\closeout\MainStreamOut@
+ \fi
+ }%
+
+ \def\Endgame@{%
+ \WriteEpilog@
+ \immediate\closein\MainStreamIn@
+ \immediate\closeout\MainStreamOut@
+ \WritePrevOptions@
+ \Closing@
+ %%%%%%%% End of assimilation categories
+ %%
+ \catcode`\/=12 %% was 13
+ \catcode`\|=12 %% was 13
+ \catcode1=\CatOne@ %% syntactical trick for AccIN
+ \catcode`\@=12 %% was 11
+ }
+
+
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ %%%%%%%%%%%%%% EXECUTE MAIN %%%%%%%%%%%%%
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ \Main@
+
+
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ \endinput
+
+
+
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ %%% %%%%
+ %%% DOCUMENTATION FOR "email-ru.tex" %%%%
+ %%% %%%%
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+Nota Bene: This documentation is mostly ASCII text. But it
+requires a few lines of Cyrillic text. These are presented in
+the MS Windows 8-bit encoding cp1251 for octets 128--255. As
+cyrillic characters may not display correctly, all blocks of
+one or more such lines are preceded by a warning line tagged
+"%#Cy(" and followed by a line tagged "%#Cy)". GIF versions
+are visible on the HTML home page at
+
+ http://topo.math.u-psud.fr/~lcs/ASCII-Cyrillic/ascii-cy.htm
+
+
+ CONTENTS
+
+ SECTION 1 Introduction
+ SECTION 2 Russian ASCII-Cyrillic
+ APPENDIX ASCII-Cyrillic for Bulgarian and Byellorussian
+ APPENDIX ASCII-Cyrillic for Ukrainian
+ APPENDIX Specifying a Cyrillic encoding vector in the input
+ APPENDIX Specifying an external Cyrillic encoding vector
+ APPENDIX The ^^xy pitfall
+ APPENDIX Email transfer checklist
+
+
+
+ SECTION 1
+
+ *** Introduction ***
+
+ This utility serves Russian and Ukrainian languages in
+parallel. The documentation is initially for Russian and the
+few modifications needed to adapt to the Ukrainian alphabet are
+concentrated in an appendix.
+
+ Here is a fragment of Russian email in 8-bit Microsoft
+Windows Russian text encoding. It can be typed and read on
+any computer in any country where a Cyrillic alphabet is
+indigenous --- but rarely beyond.
+
+%#Cy(
+ На обратном пути Gardine объяснила мне, как
+ делать пересадку на метро. Мы с ней проехали
+ большую часть пути вместе. Она вышла на
+ остановке после того, как мы пересели на мою
+ линию. Пользоваться метро №13A,
+ действительно, очень просто -- гораздо проще,
+ чем в Москве. Когда я это поняла, то сразу
+ успокоилась. Сейчас всё в порядке. Я могу
+ пользоваться метро, и уже не боюсь ходить по
+ Парижу.
+%#Cy)
+
+ Even this degree of portability is hampered by the
+frequent need to re-encode for another computer operating
+system. If that problem is already bothering you here,
+you may want to read the HTML or PDF formatted documentation
+available at http://topo.math.u-psud.fr/~lcs/ASCII-Cyrillic/
+or on CTAN TeX archives.
+
+ The utility "email-ru.tex" serves primarily to quickly
+convert this 8-bit text to and from a new 7-bit ASCII
+transcription of Russian, called "ASCII-Cyrillic" which is is
+both typeable and readable on every computer worldwide:
+
+ Na obratnom puti !Gardine obq'asnila mne, kak
+ delath peresadku na metro. My s nej proexali
+ bolhwu'u casth puti vmeste. Ona vywla na
+ ostanovke posle togo, kak my pereseli na mo'u
+ lini'u. Polhzovaths'a metro 'N13!A,
+ dejstvitelhno, ocenh prosto -- gorazdo pro'we,
+ cem v Moskve. Kogda 'a 'eto pon'ala, to srazu
+ uspokoilash. Sejcas vs'o v por'adke. 'A mogu
+ polhzovaths'a metro, i u'ze ne bo'ush xodith po
+ Pari'zu.
+
+Well chosen English (Latin) letters stand for most Russian
+letters. To distinguish the remaining handful of Russian
+letters, a prefixed accent ' is used. Further, to introduce
+English words, the exclamation mark ! appears. The whole
+ASCII-Cyrillic system for Russian can hopefully be learned
+in an hour.
+
+ Russian prose (8-bit encoded) is less than 4 percent
+bulkier in 7-bit ASCII-Cyrillic form. Thus typing speed
+for ASCII-Cyrillic on any computer keyboard can approach
+that for a Cyrillic keyboard.
+
+ The bulk difference of 4 percent drops to less then 1
+percent when modern "gzip" compression is applied to both.
+Thus there is virtually no penalty for storing Cyrillic text
+files in ASCII-Cyrillic form.
+
+ The 7-bit ASCII-Cyrillic form can be converted by
+"email-ru.tex" back to any of the most used 8-bit encodings.
+
+ ASCII-Cyrillic is a cousin of existing transcriptions of
+Russian which differ in using the concept of ligature -- i.e.
+they use two or more English letters for certain Russian letters.
+The utility "email-ru.tex" also converts Russian to one such
+ligature-based transcription system established by the the USA
+Library of Congress:
+
+ Na obratnom puti Gardine ob\jasnila mne, kak
+ delat' peresadku na metro. My s nej proexali
+ bol'shuju chast' puti vmeste. Ona vyshla na
+ ostanovke posle togo, kak my pereseli na moju
+ liniju. Pol'zovat'sja metro No13A,
+ dejstvitel'no, ochen' prosto -- gorazdo proshche,
+ chem v Moskve. Kogda ja eto ponjala, to srazu
+ uspokoilas'. Sejchas vse v porjadke. Ja mogu
+ pol'zovat'sja metro, i uzhe ne bojus' xodit' po
+ Parizhu.
+
+Caveat: Accurate reconversion of existing ligature-based
+transcriptions back to 8-bit format requires
+a good deal of human intervention.
+
+ Although not more readable, the ASCII-Cyrillic
+representation has the advantage that, for machines as well
+as men, it is completely unambiguous as well as easily
+readable. The "email-ru.tex" utility does the translation
+*both* ways without human intervention, and the conversion
+(8-bit) ==> (7-bit) ==> (8-bit) gives back *exactly* the
+original 8-bit Russian text. (One minor oddity to remember:
+terminal spaces on all lines are deleted.)
+
+ Thus, by ASCII Cyrillic encoding a Russian text file,
+one can archive and transfer it and conveniently and safely.
+The utility "email-ru.tex" provides the means for encoding
+and decoding almost anywhere.
+
+ Outside of Russia, with no Russian keyboard available,
+one can now accurately type and read Russian using
+ASCII-Cyrillic.
+
+ The converter "email-ru.tex" is programmed as a macro
+package for the widely (and even freely) available program
+called TeX. It is widely installed, and even the most modest
+installation of TeX (in version >=3 of 1989) should suffice.
+
+ It is fair here to think of TeX as a machine accepting
+many attachments like "email-ru.tex", which permit one to do
+a great variety jobs in the world of documentation.
+Here is an internet address leading to many choices of
+TeX implementation:
+
+ http://www.TUG.org
+
+ The simplest configuration or "format" of TeX called
+"Plain" is best; but there is a good chance that
+a randomly chosen format will also work.
+
+ Beginner's operating instructions for using
+"email-ru.tex" once the TeX program is available are
+simple:-
+
+(i) put a copy of the file to convert, alongside of
+email-ru.tex and give it the name "IN.txt".
+
+(ii) process "email-ru.tex" (not "IN.txt") with Plain TeX. The
+usual command line is:
+
+ tex email-ru.tex<return>
+
+On computers with a graphical interface, one instead
+usually just pushes the icon of "email-ru.tex" onto the
+icon of the TeX program, indicating the format Plain if
+the occasion offers itself.
+
+(iii) follow the instructions offered by email-ru.tex. An
+explanatory prolog and trailer will be added to the converted
+output.
+
+
+
+PITFALL: A few important TeX implementations, particularly
+under the unix and Macintosh operating systems, cannot be
+configured to \write true octets > 127 as "email-ru.tex"
+expects in converting *from* ASCII-Cyrillic *to* 8-bit
+Cyrillic text. Instead, octets >= 128 are represented by 4
+ASCII character 'pseudo-octets' "^^xy" where "xy" is the
+lowercase two digit hexadecimal notation for the octet. If
+you encounter this in your announced 8-bit output from
+"email-ru.tex", please refer to the appendix called "The ^^xy
+pitfall" to learn how you can work around this difficulty.
+
+
+
+ SECTION 2
+
+ *** Russian ASCII-Cyrillic for email-ru.tex ***
+
+
+ This section is a practical introduction to
+the new ASCII-Cyrillic system.
+
+ The 33 letters of the modern Russian alphabet, in
+alphabetic order, are typed:
+
+ a b v g d e 'o 'z z i j k l m n o p r
+ s t u f x 't 'c w 'w q y h 'e 'u 'a
+
+The letter 'o is an <e-dieresis> pronounced "yo", and in
+principle it should be placed immediately after e. However,
+most Russian dictionaries list it as an accented Russian e
+and not as an autonomous letter like the other 32.
+
+ The MS Windows 8-bit version is:
+
+%#Cy(
+ а б в г д е ж з и й к л м н о п р
+ с т у ф х ц ч ш щ ъ ы ь э ю я ё
+%#Cy)
+
+Similarly for capital letters:
+
+ A B V G D E 'O 'Z Z I J K L M N O P R
+ S T U F X 'T 'C W 'W Q Y H 'E 'U 'A
+
+correspond to:
+
+%#Cy(
+ А Б В Г Д Е Ё Ж З И Й К Л М Н О П Р
+ С Т У Ф Х Ц Ч Ш Щ Ъ Ы Ь Э Ю Я
+%#Cy)
+
+ Where there are several ergonomically "optimal" choices for
+typing a Russian character, several may be admissible.
+Thus:
+
+ 'g='z 's=w c='t 'k=x
+
+Incidentally, the strongest justification for typing "c" for a
+letter consistently pronounced "ts" is the
+traditional Russian recitation of the Latin alphabet:
+ah beh tseh deh ...
+
+ For the Russian number character, which resembles in
+shape the pair "No", ASCII-Cyrillic uses the notation '[No]
+or alternatively 'N. A short list of important
+representations for non-letter characters are:
+
+ '[No] Cyrillic number sign = 'N
+ '[<<] Cyrillic left quotes (left guillemets) = '<
+ '[>>] Cyrillic right quotes (right guillemets) = '>
+ '[,,] Cyrillic left inner double quotes ='[LQ]
+ '["] Cyrillic right inner double quotes ='[RQ] (*not* '[''])
+ '['] Single right quote ='[rq] (usually = '{apos})
+ '[`] Single left quote ='[lq]
+ '[---] long dash ='[emdash]
+ '[--] medium dash ='[endash]
+ '[...] dots (suspension) ='[dots]
+ '[<=] less than or equal ='[leq]
+ '[>=] greater than or equal ='[geq]
+ '[/=] not equal ='[neq]
+ '[nbsp] unbreakable space
+ '[\-] soft hyphen ='[shy]
+ '[^o] degree(s) ='[degree]
+ '[**] bullet ='[bullet]
+ '[~~] approx ='[approx]
+
+ Conventions established by TeX or PostScript or Unicode are
+followed; however, additionally, some short forms with mnemonic
+value are available as the above examples illustrate. An adequate
+table of concordances of norms can be found by searching for the
+word "currency" in this file.
+
+ [In TeX typescripts, many of the above diacritics already
+have equally convenient ASCII representations as a TeX control
+word beginning with "\" . Thus few of the above concern TeX
+users.]
+
+ For the Cyrillic *letter* "gup" not in the modern Russian
+alphabet of 33 letters, ASCII-Cyrillic uses '{gup} (and
+'{GUP} for the uppercase form). Similarly for other Cyrillic
+characters. The braces proclaim a Cyrillic letter.
+
+ The ASCII-Cyrillic expression for an octet >127 *not*
+encoded to any normalized character, is !__xy where xy is the
+two-digit hexadecimal representation of the octet. For example,
+octet "8B, in the KOI8 encoding, is for non-text graphic
+purposes and thus is rendered in ASCII-Cyrillic format as
+!__8b. Conversion back to the 8-bit form will work. However,
+although the 5 octet string "!__8b" is ASCII text, this text
+is not independent of 8-bit encoding. Thus, it is best to
+eliminate such "unencoded" or "meaningless" octets.
+
+ Beware that, if, in ASCII-Cyrillic, you type simply
+"Coca-Cola", then you get:
+
+%#Cy(
+ Чоча-Чола
+%#Cy)
+
+ ASCII-Cyrillic is not well designed for typing English
+sentences, but occasional English words or letters are used
+in Russian, so ASCII-Cyrillic allows one to type !U for an
+isolated U and:
+
+ !Coca-!Cola for Coca-Cola
+
+TeX is a powerful stable and portable formatting
+system -- perhaps the most widely used for scientific and
+technical documents. For a continental European language with
+an accented Latin alphabet (French for example), a TeX
+typescript is often created as an 8-bit text file that (just
+as for Russian) depends on 8-bit encoding. However TeX itself
+has always offered an alternative more prolix ASCII form for
+such accented latin letters; and it has always served to provide
+exchangeable ASCII typescripts that are readable and editable.
+ASCII-Cyrillic seems to be the first ASCII scheme to offer
+something similar for all Russian TeX typescripts.
+
+To let TeX users more easily type in ASCII-Cyrillic, the
+latter preserves TeX control sequences like \begin. The
+familiar (La)TeX command
+
+ \begin{document}
+
+is thus expressed as:
+
+ \begin{!document}
+
+Here \ and ! have special roles, and are called escape characters
+because they allow the letter sequences "begin" and "document"
+to escape from routine conversion between English letters and
+Russian Cyrillic letters.
+
+ Since the three ASCII characters ' ! \ do have special
+powers to influence the interpretation of what follows, their
+syntax in ASCII-Cyrillic typing has some eccentricities.
+Fortunately, these occur only rarely. They will be discussed
+in a file "email-ru.spc" (not yet available) that will contain
+more formal specifications for ASCII-Cyrillic. In the
+interim, curious users can probe the intricacies using
+"email-ru.tex". (Please report inconsistencies and
+infelicities to the author!)
+
+ The ASCII non-letter characters are all common to Russian
+and English, namely:
+
+ <space>
+ ! " # $ % & ' ( ) * + , - . /
+ 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @
+ [ \ ] ^ _ `
+ { | } ~
+
+It is worth remembering these, since you can then pretty well
+identify ASCII text at sight. All of these, except on occasion
+' ! \ , can be freely used in ASCII-Cyrillic typing of Russian
+prose; they are not altered under conversion to an 8-bit
+encoding.
+
+ One advantage of ASCII-Cyrillic representation is that it
+appears the same on every computer in the world today. Indeed,
+the ASCII encoding has for decades been a universally (but not
+exclusively) used standard for computers. Its use by programmers
+worldwide guarantees its validity for many future decades.
+
+ The MS Windows 8-bit Cyrillic encoding can be expected only in
+Russia and under MS Windows operating systems. On the other hand,
+the first 128 of 256 codes in it adhere to the universal ASCII
+standard (which is also an ISO standard). The same inclusion of
+ASCII holds for most other Cyrillic encodings in use today; at the
+technical level, "email-ru.tex" relies heavily on this convenient
+fact. Hopefully an overwhelming majority of Russian computer users
+work with one of the five 8-bit encodings currently supported by
+"email-ru.tex"; their tags for "email-ru.tex" are D,M,I,W,K
+respectively (the order being historical). Deviations can be
+handled by introducing an an auxiliary encoding, as indicated in
+appendices, and using auxiliary keys H or E.
+
+ These tags are less discriminating than the conventional
+tags fully identifying encodings used by Russian computer
+screen fonts for text. There is in practice a one-to-many
+correspondence from keys in the user dialog to encodings:
+
+ D (Dos) <=> cp866... MS DOS encodings
+ M (Mac) <=> mac... Apple Macintosh Cyrillic encodings
+ I (Iso) <=> iso88595 of 1988 for unix (Sun,DEC,HP,Linux,etc.)
+ W (Win) <=> cp1251 for Microsoft Windows
+ K (Koi) <=> koi8... Internet encodings, since RFC-1489 of 1993
+ H (Head) <=> encoding specified at the Head of the file
+ to be processed (see Appendix for syntax).
+ E (Extra)<=> Extra user-defined encoding -- same syntax but
+ located in (or via) the file "extraenc.tex".
+
+The casual user of "email-ru.tex" should should just notice
+which sort of computer environment he is using, and guess from
+the above list which of the five tags D,M,I,W,K best applies.
+Almost always, one of these five works perfectly:- because it is
+the same as for the computer involved as regards all characters
+actually used. (Deviations for unused characters are of no
+practical significance!)
+
+ Technical comment: In the above list, ... stands for any
+continuation yielding some valid LaTeX input encoding tag for
+Cyrillic that you can find in the LaTeX file "cyinpenc.dtx".
+The latter builds files named "<encodingtag>.def" directly
+employed by LaTeX installations. Alternative references for
+these Cyrillic encodings are:
+
+ --- russian.el, 1994 by Valery Alexeev <ava@math.jhu.edu>
+"Display, translate and edit buffers containing Russian
+characters" an emacs editor macro package, LCD Archive Entry:
+~/packages/russian.el.Z
+ --- nic.funet.fi:/pub/culture/russian/comp/characters
+ --- cyrillic.encoding.faq by Andras Kornai <andras@calera.com>
+ --- lettermappings.gz by Dmitri Vulis <dlv@sunyvms1.bitnet>
+ --- internet RFC 1489
+ --- http://www.fingertipsoft.com/ref/cyrillic
+
+ Conversion between different 8-bit encodings is possible
+using "email-ru.tex". But one must do it in two steps, going via
+the ASCII_Cyrillic 7-bit format. Beware that in case the target
+encoding does not contain a certain character in the source file,
+that character is left in a distinctive ASCII-Cyrillic form.
+This, in practice, helps you see and repair the damage. Such
+damage is neither exceptional nor avoidable since the characters
+covered by the encodings vary somewhat with the encoding. But it
+is usually minor and repairable.
+
+Exercise: You know enough at this point to use ASCII-Cyrillic to
+type or read any Russian email or any piece of Russian prose,
+for example, that in the first section. Convert forth and back
+between 7-bit and 8-bit forms using "email-ru.tex".
+
+
+ This version of "email-ru.tex" is preliminary; if a problem is
+is encountered, please first check the most up-to-date version; then
+please communicate bugs and suggestions to the author.
+
+ Possibilities for future development:
+
+ -- support for more Cyrillic alphabets
+ -- support for Unicode Cyrillic
+ -- support for the Mime protocol
+ -- batch mode
+ -- segmented files (e.g. just certain parts marked for conversion)
+ -- integration with TeX for rapid typesetting of ASCII-Cyrillic
+text.
+
+ Thanks are due to the members of the Cyrillic TeX discussion
+list (CyrTeX-en@vsu.ru) for clarifying the problems a utility
+such as this one should address. The list archives are available
+at:
+
+ https://info.vsu.ru/Lists/CyrTeX-en/List.html
+
+Advice from Maksym Polyakov <mpoliak@pcomp.nauu.kiev.ua> was
+essential in establishing the Ukrainian mode.
+
+
+ Laurent Siebenmann
+
+
+ lcs@topo.math.u-psud.fr
+ lcs@math.polytechnique.fr
+ laurent@math.toronto.edu
+
+
+ASCII-Cyrillic home page in December 2000:
+
+ http://topo.math.u-psud.fr/~lcs/ASCII-Cyrillic/ascii-cy.htm
+
+Copyright Conditions: Gnu Public Licence
+
+
+
+ *** APPENDIX ASCII-Cyrillic for Bulgarian and Byelorussian ***
+
+ ASCII-Cyrillic for Bulgarian coincides with ASCII-Cyrillic
+for Russian.
+
+ ASCII-Cyrillic for Byelorussian is fully compatible with
+Russian, but uses two extra letters:
+
+%#Cy(
+ і ў
+%#Cy)
+ <==> '{ii} '{ushrt} <==> 'i 'v
+
+The short forms are currently available even in Russian mode, but
+this may change in future versions.
+
+
+
+ *** APPENDIX ASCII-Cyrillic for Ukrainian ***
+
+ This is similar to but distinct from the Russian mode and is
+*not* compatible with it.
+
+ The 33+1 letters of the modern Ukrainian alphabet, listed in
+alphabetic order (MS Windows 8-bit encoding here) are:
+
+%#Cy(
+ а б в г ґ д е є ж з и і ї й к л м
+ н о п р с т у ф х ц ч ш щ ю я ь ’
+%#Cy)
+
+and the preferred Ukrainian ASCII-Cyrillic (short) form is:
+
+ a b v g 'g d e 'e 'z z y i 'i j k l m n
+ o p r s t u f x 't 'c w 'w 'u 'a q '*
+
+The 34th character is a Cyrillic apostrophe, a modifier letter that
+has various roles, among them those of the hard sign of Russian. The
+representation valid for all Cyrillic languages is '{apos}.
+
+ The following four letters do not occur in
+Russian:
+
+%#Cy(
+ ґ є і ї
+%#Cy)
+ <==> '{gup} '{ie} '{ii} '{yi} (for all Cyrillic)
+ <==> 'g 'e i 'i (for Ukrainian)
+ <==> (no Russian short forms)
+
+The forms '{gup} etc. (in the second row) are the same for all
+cyrillic languages.
+
+ Reciprocally, the following four Russian letters
+do not occur in Ukrainian:
+
+%#Cy(
+ ъ ы э ё
+%#Cy)
+ <==> '{hrdsn} '{ery} '{erev} '{yo} (for all Cyrillic)
+ <==> (no Ukrainian short forms)
+ <==> q y 'e 'o (for Russian)
+
+
+ The following two letters are common to Ukrainian and Russian
+but the ASCII-Cyrillic short forms are different.
+
+%#Cy(
+ и ь
+%#Cy)
+ <==> '{i} '{sftsn} (for all Cyrillic)
+ <==> y q (for Ukrainian)
+ <==> i h (for Russian)
+
+The use, in Ukrainian ASCII-Cyrillic, of q as a short form for
+'{sftsn} is justified by the fact that the shape q rotated by 180
+degrees is similar to that of '{sftsn}. But there is another
+reason for this choice. It permits one to use h as an alternative
+Ukrainian short form for '{g} --- which is natural since in many
+cases '{g} is pronounced like the harsh German h in "Horst".
+
+ The full list of alternatives short forms is:
+
+ 's=w
+ c='t
+ 'k='x=x
+ h=g
+
+ Similarly for capital letters. In particular:
+
+%#Cy(
+ А Б В Г Ґ Д Е Є Ж З И І Ї Й К Л М Н
+ О П Р С Т У Ф Х Ц Ч Ш Щ Ю Я Ь ’
+%#Cy)
+
+have the Ukrainian ASCII-Cyrillic representation:
+
+ A B V G 'G D E 'E 'Z Z Y I 'I J K L M N
+ O P R S T U F X 'T 'C W 'W 'U 'A Q '*
+
+Long forms valid for all Cyrillic languages are:
+
+ '{A} '{B} '{V} '{G} '{GUP} '{D} '{E} '{IE} '{ZH} '{Z}
+ '{R} '{I} '{II} '{YI} '{J} '{K} '{L} '{M} '{N} '{O}
+ '{P} '{S} '{T} '{U} '{F} '{X} '{C} '{CH}
+ '{SH} '{SHCH} '{YU} '{YA} '{SFTSN} '{APOS}
+
+Note that the Ukrainian apostrophe '{APOS} is a *letter*
+and unlike '{SFTSN} it normally coincides with the lowercase
+version: normally '{APOS}='{apos}. In case of a distinction
+'* will be '{apos}.
+
+ There is an official lossy "Latin transliteration" for
+Ukrainian using the ligature concept, and it is supported by
+"email-ru.tex". See the Ukrainian national norm of 1996
+summarized at:
+
+ http://www.rada.kiev.ua/translit.htm
+
+Beware that the official transliterations of the six letters
+
+ '{g} '{ie} '{yi} '{ishrt} '{yu} '{ya}
+
+are *context dependent*. This is a good reason for relying
+on "email-ru.tex" to do the official transliteration.
+
+
+ The other aspects of ASCII-Cyrillic are the same for Ukrainian
+and Russian.
+
+
+
+
+*** APPENDIX Specifying a Cyrillic encoding vector in the input ***
+
+
+ The following is technical, but probably well within the reach
+of confirmed TeX users.
+
+ The encoding option key "H" (for Header) in the main dialog
+serves to request use of an encoding vector given in full near the top
+of the input file.
+
+ Here is the appropriate syntax; it should be imitated quite
+exactly. Beginning in the first 80 lines of the file to convert
+(normally IN.txt), there should occur the following sort of
+structure:
+
+
+ %#[<ASCII-CYRILLIC_MODIF>#]
+ \ifx\AsciiCyrModif\relax %%% TeX gateway
+ %%% Encoding to be used only if requested via the
+ %%% "H" encoding option key of the "email-ru.tex" dialog.
+ %%% LaTeX encoding Tag: cp866
+ \def\AuxEncodingVect@{%
+ /A./B./V./G./D./E./ZH./Z.%% "80--
+ /I./ISHRT./K./L./M./N./O./P.%% --"8F
+ /R./S./T./U./F./H./C./CH.%% "90--
+ /SH./SHCH./HRDSN./ERY./SFTSN./EREV./YU./YA.%% --"9F
+ /a./b./v./g./d./e./zh./z.%% "A0--
+ /i./ishrt./k./l./m./n./o./p.%% --"AF
+ \.\.\.\.\.\.\.\.%% "B0--
+ \.\.\.\.\.\.\.\.%% --"BF
+ \.\.\.\.\.\.\.\.%% "C0--
+ \.\.\.\.\.\.\.\.%% --"CF
+ \.\.\.\.\.\.\.\.%% "D0--
+ \.\.\.\.\.\.\.\.%% --"DF
+ /r./s./t./u./f./h./c./ch.%% "E0--
+ /sh./shch./hrdsn./ery./sftsn./erev./yu./ya.%% --"EF
+ /YO./yo./IE./ie./YI./yi./USHRT./ushrt.%% "F0--
+ |deg.|bullet.|cdot.|surd.|No.|coin.|blacksquare.|nbsp.%% --"FF
+ }
+ %%% This is the old "Standard" version of DOS encoding cp~866.
+ %%% Key D gave the New Alternative Variant" or "NAV" version
+ %%% The differences lie in the range "F2--"FE.
+ \fi
+ %#[<ASCII-CYRILLIC_ENDMODIF>#]
+
+This provides an ordered list of 128 definitions for the encoding
+positions 128="80 to 255="FF. There are, basically, three sorts of
+definition and 8 definitions per row. For example:
+
+ --- "/SHCH." encodes position "9C as the Cyrillic *letter* whose TeX
+name is \CYRSHCH. The truncated TeX name is always used.
+
+ --- "|nbsp." encodes position "FF as the unbreakable space. The "|"
+indicates that this is a *diacritic* character. The names for
+diacritical characters used here are the shorter alphabetical names
+that one finds in the list of diacritics you can locate by searching
+for the word "currency" in this file.
+
+ --- "\." encodes position "B0 as a *undefined*, and similarly for
+"B1--"DF.
+
+See also comments preceeding the internal encodings.
+
+ If there is no encoding definition set up in the above manner, then
+"email-ru.tex" will abort.
+
+ Material on lines before:
+
+ %#[<ASCII-CYRILLIC_MODIF>#]
+
+will be skipped. Then, lines up to and including:
+
+ %#[<ASCII-CYRILLIC_ENDMODIF>#]
+
+will be copied verbatim and appear immediately after the usual
+prologue for the output. Lines after that will be converted using the
+designated encoding.
+
+Beware: If the H option key is not used, then (in the present version)
+the *whole* input file will be converted with another specified
+encoding. Remove to safe storage unused encodings; they may confuse
+inexperienced users.
+
+
+
+ *** APPENDIX Specifying an external Cyrillic encoding vector ***
+
+ In the main dialog the encoding option key "E" (for External) is
+devoted to this. It requests an encoding via the *user-defined* file
+"extraenc.tex". The simplest possibility for "extraenc.tex" is exactly
+the sort of segment
+
+ %#[<ASCII-CYRILLIC_MODIF>#]
+ ...
+ %#[<ASCII-CYRILLIC_ENDMODIF>#]
+
+used with the "H" option key. The behavior commanded is the same
+as with the "H" option key, except that the whole input file is
+converted. In particular, the encoding vector will be inserted
+into the output, below the usual prolog.
+
+ A TeX programmer would be able to provide access via a
+dialog in "extraenc.tex" to an arbitrary number of encoding
+vectors.
+
+
+
+ *** APPENDIX The ^^xy Pitfall ***
+
+ The pitfall to be discussed affects chiefly conversion
+from 7-bit ASCII-Cyrillic text files to 8-bit Cyrillic text.
+
+ The author of TeX, Donald Knuth, provided, beginning with the
+first 8-bit version 3 of 1989, a "pseudo-8-bit" mechanism allowing
+octets > 127 being output via the TeX primitive command \write to
+be written each as a sequence of four ASCII octets ^^xy
+(called a "pseudo-octet") where xy is the the 2-digit lowercase
+hexadecimal notation for the octet. For example, octet 128 becomes
+^^80, and octet 255 becomes ^^ff.
+
+ The use of this mechanism seems to be standard TeX.
+Presumably, it was intended to allow TeX to function on
+operating systems that are unable to handle text files
+containing octets >= 128. However, there are now virtually no
+such operating systems, and the feature is a hinderance to many
+users, in particular to users of email-ru.tex wishing to extract
+true 8-bit text from ASCII-Cyrillic. Thus, *most* TeX
+implementations now offer true 8-bit text output, at least
+optionally -- thus enabling "email-ru.tex" to convert
+ASCII-Cyrillic to true 8-bit text.
+
+ If your TeX writes only "pseudo-octets", try the following:
+
+WORKAROUND (A) If (as is highly probable) you *know* that the
+*intended* 8-bit output would contain no pseudo-octet ^^xy then you
+can finish the conversion job by applying the tiny converter "Kto8"
+to get rid of the "pseudo-octets". The name "Kto8" is a contraction
+of the phrase "Knuthian-to-8-bit". "Kto8" currently scans once,
+converting any Knuthian pseudo-octet ^^xy encountered to the
+corresponding genuine octet. Further, it does something similar
+for Knuth's representations of the form ^^X for the octets
+0,1,..,31, and 127. It is self-documenting. Look for "Kto8" in the
+ASCII-Cyrillic distribution directory; there will be binaries for
+the Macintosh, Windows, and some unix operating systems.
+
+WORKAROUND (B) Examine the operating options for your TeX
+implementation (normally in documentation provided by the
+implementor) to see if, by hook or by crook, you can get true
+8-bit output. Many implementors, commercial or not, are extremely
+responsive to user enquiries.
+
+WORKAROUND (C) Ask yourself whether an 8-bit Cyrillic version is
+strictly necessary. If the 8-bit output was really intended for
+typographic composition by TeX, then you will probably find that
+the "pseudo-8-bit" output will be equally acceptable to TeX,
+albeit unreadable to human eyes.
+
+WORKAROUND (D) Use one of the many fully 8-bit-capable TeX
+installations.
+
+
+
+ Here is a list of TeX implementations for which the current
+version is known to offer true 8-bit \write output, at least
+optionally (see www.tug.org for other TeX implementations).
+PLEASE CONTRIBUTE ADDITIONS TO THIS LIST!
+
+
+** MS Windows Operating System, including DOS
+
+ -- BaKoMa TeX by B.K. Malyshev
+ -- emtex, for DOS, by E. Mattes
+ Comments: Create format file using option flag -o.
+ Octet 255 infortunately remains ^^ff.
+ -- fptex for Windows, by F. Popineau.
+ Comments: It is a Windows port of tetex.
+ -- miktex for Windows, by C. Schenk.
+ -- VTeX by MicroPress Inc.
+ Comments: 8-bit output is the default behavior for the
+console-mode compilers [free versions on Linux and OS/2, as well
+as Console mode on Win] but the 7-bit behaviour is the default
+in GUI version which is integrated into the Vtex/Win IDE. In
+either case, there is a switch to change the behaviour.
+ -- Y&Y TeX, by Y&Y Inc, http://www.Y&Y.com
+ Comment: By default, output is 8-bit. Command line option -K
+gives pseudo-8-bit output.
+
+
+** Macintosh OS
+
+ -- Textures, by Blue Sky Research (since TeX 3)
+ -- OzTeX from v4 of 2001
+ Comment: To get true 8-bit output, you must set
+write_8_bit = true in your configuration file and then
+rebuild your format file(s).
+
+
+** Unix OS and Linux OS
+
+ -- tetex for unix and linux, by T. Esser
+ It is based on web2C.
+ -- web2C maintained currently by Olaf Weber.
+ Comment: Specific compilations not included,
+ cf. tetex and fptex.
+ In case your default configuration is not OK,
+ try the tex command line option:
+ "--translate-file=cp8bit.tcx"
+ and learn about TCX files.
+ -- VTeX for Linux (see MS Widows listing).
+
+ ---------------
+
+ Veteran TeX users should note one more subtle point
+concerning pseudo-octets:- When in its usual *typesetting* mode
+and reading a pseudo octet ^^xy, TeX will behave exactly as if
+it has read the octet numbered xy (in lowercase hexadecimal
+notation). In contrast, when running "email-ru.tex", TeX
+regards an ^^xy in the input file as merely a sequence of 4
+ASCII octets. This is because ^ then has TeX category 12
+('other'). If you really truly want "email-ru.tex" to have the
+more exotic behavior, you can, in effect, obtain it by
+preliminary processing of the input with Kto8.
+
+
+ *** APPENDIX Email Transfer Checklist ***
+
+ ASCII-Cyrillic is a useful format for simplest email
+transfers of Cyrillic text files. The universally accepted ASCII
+text part of an email message can be used. This feature explains
+the name "email-ru.tex".
+
+ For informal letters, it may be as good to use a
+ligature-based ASCII representation (also generated by
+"email-ru.tex"). But, if the typescript is "work in progress" (a
+draft of work to be published later on), then a *faithful* system
+like ASCII-Cyrillic is infinitely better.
+
+ As with any electronic transfer, care is required to avoid
+mutilation and misinterpretation. Watch the following points.
+
+(1) Be sure the ASCII-Cyrillic version has no "meaningless"
+characters like !__ab. You may have to change your encoding or
+revise the 8-bit source to get rid of these without real damage to
+your typescript.
+
+(2) Arrange that the file has no long lines (say >70 characters).
+Many text editors, word processors, and web browsers allow
+adjustment of text file line breaks; check out their text file I/O
+features.
+
+(3) Make sure the ASCII-Cyrillic version is indeed faithful.
+First delete trailing spaces on all lines (as TeX ignores these).
+Then take your 8-bit version, convert doubly 8 ==> 7 ==> 8, and
+check that the resulting 8-bit version is restored 100% (using a
+file comparison utility).
+
+(4) Arrange that no "tilde" character "~" occurs at the beginning
+of any line, for example, by inserting a space before each line.
+
+(5) Be sure the recipient has TeX, and also "email-ru.tex".
+Fortunately, the latter is ASCII text that can be sent by email
+after precaution (4).
+
+(6) If you know which 8-bit encoding your correspondent will be
+using, then do that 7 ==> 8 bit conversion yourself, and verify
+that his/her encoding includes all the characters you are using.
+If not, in the 8-bit file, there will be some "unencoded" letters
+or diacritics appearing in the form '{??} or '[??], for a suitable
+tag ??.
+
+(7) If your correspondent uses a mysterious 8-bit encoding, you
+can learn what it is by examining his/her 8-bit typescripts. Then
+include the mysterious encoding vector at the top of the
+ASCII-Cyrillic version as indicated in another APPENDIX. Tell your
+correspondent to select the "H" encoding option key in converting
+the received email to 8-bit. The *whole* email can be processed;
+just the part after the encoding vector will be output, and in the
+mysterious 8-bit encoding.
+
+(8) The following test may detect email ASCII text transmission
+problems beyond those already mentioned. They were frequent in
+early days but are now quite rare.
+
+
+ %%%%%%%%%%%% ASCII Character transmission test
+ %
+ % Upper case letters: ABCDEFGHIJKLMNOPQRSTUVWXYZ
+ % Lower case letters: abcdefghijklmnopqrstuvwxyz
+ % Digits: 0123456789
+ % Square, curly, angle braces, parentheses: [] {} <> ()
+ % Backslash, slash, vertical bar: \ / |
+ % Punctuation: . ? ! , : ;
+ % Underscore, hyphen, equals sign: _ - =
+ % Quotes--right left double: ' ` "
+ %"at", "number" "dollar", "percent", "and": @ # $ % &
+ % "hat", "star", "plus", "tilde": ^ * + ~
+ %
+ %%%%%%%%%%%%%%%%%%%%%%%%
+ %
+ % A single error can be disastrous in TeX files.
+ %
+ %%%%%%%%%%%%%%%%%%%%%%%%