~ chicken-core (master) /tests/slatex.sty


  1% slatex.sty
  2% SLaTeX v. 2.2
  3% style file to be used in (La)TeX when using SLaTeX
  4% (c) Dorai Sitaram, Rice U., 1991, 1994
  5
  6% This file (or a soft link to it) should be in some
  7% directory in your TEXINPUTS path (i.e., the one
  8% (La)TeX scours for \input or \documentstyle option
  9% files).
 10
 11% Do not attempt to debug this file, since the results
 12% are not transparent just to (La)TeX.  The Scheme part
 13% of SLaTeX depends on information laid out here -- so
 14% (La)TeX-minded debugging of this file will almost
 15% inevitably sabotage SLaTeX.
 16
 17% It's possible you don't find the default style set
 18% out here appealing: e.g., you may want to change the
 19% positioning of displayed code; change the fonts for
 20% keywords, constants, and variables; add new keywords,
 21% constants, and variables; use your names instead of
 22% the provided \scheme, [\begin|\end]{schemedisplay},
 23% [\begin|\end]{schemebox}, (or \[end]schemedisplay,
 24% \[end]schemebox for TeX), which might be seem too
 25% long or unmnemonic, and many other things.  The clean
 26% way to do these things is outlined in the
 27% accompanying manual, slatex-d.tex.  This way is both
 28% easier than messing with this .sty file, and safer
 29% since you will not unwittingly break SLaTeX.
 30
 31
 32%%%
 33
 34% to prevent loading slatex.sty more than once
 35
 36\ifx\slatexignorecurrentfile\UNDEFINED
 37\else\endinput\fi
 38
 39% use \slatexignorecurrentfile to disable slatex for
 40% the current file.  (Unstrangely, the very definition
 41% disables slatex for the rest of _this_ file, slatex.sty.)
 42
 43\def\slatexignorecurrentfile{}
 44
 45% checking whether we're using LaTeX or TeX?
 46
 47\newif\ifusinglatex
 48\ifx\newenvironment\UNDEFINED\usinglatexfalse\else\usinglatextrue\fi
 49
 50% make @ a letter for TeX
 51\ifusinglatex\relax\else
 52\edef\atcatcodebeforeslatex{\the\catcode`@}
 53\catcode`@11
 54\fi
 55
 56% identification of TeX/LaTeX style for schemedisplay.
 57% Do \defslatexenvstyle{tex} to get TeX environment
 58% style in LaTeX
 59\def\defslatexenvstyle#1{\gdef\slatexenvstyle{#1}}
 60
 61\ifusinglatex\defslatexenvstyle{latex}\else\defslatexenvstyle{tex}\fi
 62
 63% TeX doesn't have sans-serif; use roman instead
 64\ifx\sf\UNDEFINED\def\sf{\rm}\fi
 65
 66% tabbing from plain TeX
 67%
 68\newif\ifus@ \newif\if@cr
 69\newbox\tabs \newbox\tabsyet \newbox\tabsdone
 70%
 71\def\cleartabs{\global\setbox\tabsyet\null \setbox\tabs\null}
 72\def\settabs{\setbox\tabs\null \futurelet\next\sett@b}
 73\let\+=\relax % in case this file is being read in twice
 74\def\sett@b{\ifx\next\+\let\next\relax
 75    \def\next{\afterassignment\s@tt@b\let\next}%
 76\else\let\next\s@tcols\fi\next}
 77\def\s@tt@b{\let\next\relax\us@false\m@ketabbox}
 78\def\tabalign{\us@true\m@ketabbox} % non-\outer version of \+
 79\outer\def\+{\tabalign}
 80\def\s@tcols#1\columns{\count@#1 \dimen@\hsize
 81  \loop\ifnum\count@>\z@ \@nother \repeat}
 82\def\@nother{\dimen@ii\dimen@ \divide\dimen@ii\count@
 83  \setbox\tabs\hbox{\hbox to\dimen@ii{}\unhbox\tabs}%
 84  \advance\dimen@-\dimen@ii \advance\count@\m@ne}
 85%
 86\def\m@ketabbox{\begingroup
 87  \global\setbox\tabsyet\copy\tabs
 88  \global\setbox\tabsdone\null
 89  \def\cr{\@crtrue\crcr\egroup\egroup
 90    \ifus@\unvbox\z@\lastbox\fi\endgroup
 91    \setbox\tabs\hbox{\unhbox\tabsyet\unhbox\tabsdone}}%
 92  \setbox\z@\vbox\bgroup\@crfalse
 93    \ialign\bgroup&\t@bbox##\t@bb@x\crcr}
 94%
 95\def\t@bbox{\setbox\z@\hbox\bgroup}
 96\def\t@bb@x{\if@cr\egroup % now \box\z@ holds the column
 97  \else\hss\egroup \global\setbox\tabsyet\hbox{\unhbox\tabsyet
 98      \global\setbox\@ne\lastbox}% now \box\@ne holds its size
 99    \ifvoid\@ne\global\setbox\@ne\hbox to\wd\z@{}%
100    \else\setbox\z@\hbox to\wd\@ne{\unhbox\z@}\fi
101    \global\setbox\tabsdone\hbox{\box\@ne\unhbox\tabsdone}\fi
102  \box\z@}
103% finished (re)defining TeX's tabbing macros
104
105% above from plain.tex; was disabled in lplain.tex.  Do
106% not modify above unless you really know what you're
107% up to.  Make all changes you want to following code.
108% The new env is preferable to LaTeX's tabbing env
109% since latter accepts only a small number of tabs
110
111% following retrieves something like LaTeX's tabbing
112% env without the above problem (it also creates a box
113% for easy manipulation!)
114
115\def\lat@xtabbing{\leavevmode\hbox\bgroup\vbox\bgroup
116 \def\={\cleartabs&} \def\>{&} \def\\{\cr\tabalign} \tabalign}
117\def\endlat@xtabbing{\cr\egroup\egroup}
118
119%new
120
121\def\lat@xtabbing{\begingroup
122\def\={\cleartabs&} \def\>{&}%
123\def\\{\cr\tabalign\lat@xtabbingleftmost}%
124\tabalign\lat@xtabbingleftmost}
125\def\endlat@xtabbing{\cr\endgroup}
126\let\lat@xtabbingleftmost\relax
127
128% stuff for formating Scheme code
129
130\newskip\par@nlen \newskip\brack@tlen \newskip\quot@len
131\newskip\h@lflambda
132
133\newbox\garb@ge
134\def\s@ttowidth#1#2{\setbox\garb@ge\hbox{#2}#1\wd\garb@ge\relax}
135
136\s@ttowidth\par@nlen{$($}       % size of paren
137\s@ttowidth\brack@tlen{$[$}     % size of bracket
138\s@ttowidth\quot@len{'}         % size of quote indentation
139\s@ttowidth\h@lflambda{ii}      % size of half of lambda indentation
140
141\def\PRN{\hskip\par@nlen}       % these are used by SLaTeX's codesetter
142\def\BKT{\hskip\brack@tlen}
143\def\QUO{\hskip\quot@len}
144\def\HL{\hskip\h@lflambda}
145
146\newskip\abovecodeskip \newskip\belowcodeskip
147\newskip\leftcodeskip \newskip\rightcodeskip
148
149% the following default assignments give a flushleft
150% display
151
152\abovecodeskip=\medskipamount \belowcodeskip=\medskipamount
153\leftcodeskip=0pt \rightcodeskip=0pt
154
155% adjust above,below,left,right codeskip's to personal
156% taste
157
158% for centered displays
159%
160% \leftcodeskip=0pt plus 1fil
161% \rightcodeskip=0pt plus 1fil
162%
163% if \rightcodeskip != 0pt, pagebreaks within Scheme
164% blocks in {schemedisplay} are disabled
165
166\def\checkfollpar{\futurelet\next\checkfollparII}
167\def\checkfollparII{\ifx\next\par\let\next\relax
168\else\par\noindent\let\next\ignorespaces\fi\next}
169
170% the following are the default font assignments for
171% words in code.  Change them to suit personal taste
172
173\def\keywordfont#1{{\bf #1}}
174\def\variablefont#1{{\it #1\/}}
175\def\constantfont#1{{\sf #1}}
176\def\datafont#1{\constantfont{#1}}
177
178\def\schemecodehook{}
179
180%program listings that allow page breaks but
181%can't be centered
182
183\def\ZZZZschemedisplay{\edef\thez@skip{\the\z@skip}%
184\edef\@tempa{\the\rightcodeskip}%
185\ifx\@tempa\thez@skip\let\next\ZZZZschemeprogram
186\else\let\next\ZZZZschemeprogramII\fi\next}
187
188\def\endZZZZschemedisplay{\edef\thez@skip{\the\z@skip}%
189\edef\@tempa{\the\rightcodeskip}%
190\ifx\@tempa\thez@skip\let\next\endZZZZschemeprogram
191\else\let\next\endZZZZschemeprogramII\fi\next}
192
193\def\ZZZZschemeprogram{\vskip\abovecodeskip
194\begingroup
195\schemecodehook
196\let\sy=\keywordfont \let\cn=\constantfont
197\let\va=\variablefont \let\dt=\datafont
198\def\lat@xtabbingleftmost{\hskip\leftcodeskip\relax}%
199\lat@xtabbing}
200
201\def\endZZZZschemeprogram{\endlat@xtabbing
202\endgroup
203\vskip\belowcodeskip
204\ifusinglatex\let\next\@endparenv
205\else\let\next\checkfollpar\fi\next}
206
207\def\ZZZZschemeprogramII{\vskip\abovecodeskip
208\begingroup
209\noindent
210%\schemecodehook %\ZZZZschemebox already has it
211\hskip\leftcodeskip
212\ZZZZschemebox}
213
214\def\endZZZZschemeprogramII{\endZZZZschemebox
215\hskip\rightcodeskip
216\endgroup
217\vskip\belowcodeskip
218\ifusinglatex\let\next\@endparenv
219\else\let\next\checkfollpar\fi\next}
220
221%
222
223\def\ZZZZschemebox{%
224\leavevmode\hbox\bgroup\vbox\bgroup
225\schemecodehook
226\let\sy=\keywordfont \let\cn=\constantfont
227\let\va=\variablefont \let\dt=\datafont
228\lat@xtabbing}
229\def\endZZZZschemebox{\endlat@xtabbing
230\egroup\egroup\ignorespaces}
231
232%in-text
233
234\def\ZZZZschemecodeintext{\begingroup
235  \let\sy\keywordfont \let\cn\constantfont
236  \let\va\variablefont \let\dt\datafont}
237
238\def\endZZZZschemecodeintext{\endgroup\ignorespaces}
239
240\def\ZZZZschemeresultintext{\begingroup
241  \let\sy\datafont \let\cn\constantfont
242  \let\va\datafont \let\dt\datafont}
243
244\def\endZZZZschemeresultintext{\endgroup\ignorespaces}
245
246% \comm@nt<some-char>...text...<same-char> comments out
247% TeX source analogous to
248% \verb<some-char>...text...<same-char>.  Sp. case:
249% \comm@nt{...text...} == \comm@nt}...text...}
250
251\def\@makeother#1{\catcode`#112\relax}
252
253\def\comm@nt{%
254  \begingroup
255  \let\do\@makeother \dospecials
256  \@comm}
257
258\begingroup\catcode`\<1\catcode`\>2
259\catcode`\{12\catcode`\}12
260\long\gdef\@comm#1<%
261  \if#1{\long\def\@tempa ##1}<\endgroup>\else
262	\long\def\@tempa ##1#1<\endgroup>\fi
263  \@tempa>
264\endgroup
265
266% input file if possible, else relax
267
268\def\inputifpossible#1{%
269  \immediate\openin0=#1\relax%
270  \ifeof0\relax\else\input#1\relax\fi%
271  \immediate\closein0}
272
273\def\ZZZZinput#1{\input#1\relax}
274
275% you may replace the above by
276%
277% \def\ZZZZinput#1{\inputifpossible{#1}}
278%
279% if you just want to call (La)TeX on your text
280% ignoring the portions that need to be SLaTeX'ed
281
282%use \subjobname rather than \jobname to generate
283%slatex's temp files --- this allows us to change
284%\subjobname for more control, if necessary.
285
286\let\subjobname\jobname
287
288% counter for generating temp file names
289
290\newcount\sch@mefilenamecount
291\sch@mefilenamecount=-1
292
293% To produce displayed Scheme code:
294% in LaTeX:
295% \begin{schemedisplay}
296%   ... indented program (with sev'l lines) ...
297% \end{schemedisplay}
298%
299% in TeX:
300% \schemedisplay
301%   ... indented program (with sev'l lines) ...
302% \endschemedisplay
303
304\begingroup\catcode`\|=0\catcode`\[=1\catcode`\]=2%
305\catcode`\{=12\catcode`\}=12\catcode`\\=12%
306|gdef|defschemedisplaytoken#1[%
307  |long|expandafter|gdef|csname ZZZZcomment#1|endcsname[%
308    |begingroup
309    |let|do|@makeother |dospecials
310    |csname ZZZZcomment|slatexenvstyle II#1|endcsname]%
311  |long|expandafter|gdef|csname ZZZZcommentlatexII#1|endcsname##1\end{#1}[%
312    |endgroup|end[#1]]%
313  |long|expandafter|gdef|csname ZZZZcommenttexII#1|endcsname##1\end#1[%
314    |endgroup|csname end#1|endcsname]%
315  |long|expandafter|gdef|csname #1|endcsname[%
316    |global|advance|sch@mefilenamecount by 1|relax%
317    |ZZZZinput[|filehider Z|number|sch@mefilenamecount|subjobname.tex]%
318    |csname ZZZZcomment#1|endcsname]%
319  |long|expandafter|gdef|csname end#1|endcsname[]]%
320|endgroup
321
322\defschemedisplaytoken{schemedisplay}
323
324\def\undefschemedisplaytoken#1{%
325  \expandafter\gdef\csname#1\endcsname{\UNDEFINED}}
326
327% \scheme|...program fragment...| produces Scheme code
328% in-text.  Sp. case: \scheme{...} == \scheme}...}
329
330\def\defschemetoken#1{%
331  \long\expandafter\def\csname#1\endcsname{%
332    \global\advance\sch@mefilenamecount by 1\relax%
333    \ZZZZinput{\filehider Z\number\sch@mefilenamecount\subjobname.tex}%
334    \comm@nt}}
335\defschemetoken{scheme}
336
337\def\undefschemetoken#1{%
338  \expandafter\gdef\csname#1\endcsname{\UNDEFINED}}
339
340% \schemeresult|...program fragment...| produces a
341% Scheme code result in-text: i.e. keyword or variable
342% fonts are replaced by the data font.  Sp. case:
343% \schemeresult{...} == \schemeresult}...}
344
345\def\defschemeresulttoken#1{%
346  \long\expandafter\def\csname#1\endcsname{%
347    \global\advance\sch@mefilenamecount by 1\relax%
348    \ZZZZinput{\filehider Z\number\sch@mefilenamecount\subjobname.tex}%
349    \comm@nt}}
350\defschemeresulttoken{schemeresult}
351
352\def\undefschemeresulttoken#1{%
353  \expandafter\gdef\csname#1\endcsname{\UNDEFINED}}
354
355% To produce a box of Scheme code:
356% in LaTeX:
357% \begin{schemebox}
358%   ... indented program (with sev'l lines) ...
359%  \end{schemebox}
360%
361% in TeX:
362% \schemebox
363%   ... indented program (with sev'l lines) ...
364% \endschemebox
365
366\begingroup\catcode`\|=0\catcode`\[=1\catcode`\]=2%
367\catcode`\{=12\catcode`\}=12\catcode`\\=12%
368|gdef|defschemeboxtoken#1[%
369  |long|expandafter|gdef|csname ZZZZcomment#1|endcsname[%
370    |begingroup
371    |let|do|@makeother |dospecials
372    |csname ZZZZcomment|slatexenvstyle II#1|endcsname]%
373  |long|expandafter|gdef|csname ZZZZcommentlatexII#1|endcsname##1\end{#1}[%
374    |endgroup|end[#1]]%
375  |long|expandafter|gdef|csname ZZZZcommenttexII#1|endcsname##1\end#1[%
376    |endgroup|csname end#1|endcsname]%
377  |long|expandafter|gdef|csname #1|endcsname[%
378    |global|advance|sch@mefilenamecount by 1|relax%
379    |ZZZZinput[|filehider Z|number|sch@mefilenamecount|subjobname.tex]%
380    |csname ZZZZcomment#1|endcsname]%
381  |long|expandafter|gdef|csname end#1|endcsname[]]%
382|endgroup
383
384\defschemeboxtoken{schemebox}
385
386\def\undefschemeboxtoken#1{%
387  \expandafter\gdef\csname#1\endcsname{\UNDEFINED}}
388
389% for wholesale dumping of all-Scheme files into TeX (converting
390% .scm files to .tex),
391% use
392%   \schemeinput{<filename>}
393% .scm, .ss, .s extensions optional
394
395\def\defschemeinputtoken#1{%
396  \long\expandafter\gdef\csname#1\endcsname##1{%
397    \global\advance\sch@mefilenamecount by 1\relax%
398    \ZZZZinput{\filehider Z\number\sch@mefilenamecount\subjobname.tex}}}
399\defschemeinputtoken{schemeinput}
400
401\def\undefschemeinputtoken#1{%
402  \expandafter\gdef\csname#1\endcsname{\UNDEFINED}}
403
404% delineating a region that features typeset code
405% not usually needed, except when using \scheme and schemedisplay
406% inside macro-args and macro-definition-bodies
407% in LaTeX:
408% \begin{schemeregion}
409%   ...
410% \end{schemeregion}
411%
412% in TeX:
413% \schemeregion
414% ...
415% \endschemeregion
416
417\begingroup\catcode`\|=0\catcode`\[=1\catcode`\]=2%
418\catcode`\{=12\catcode`\}=12\catcode`\\=12%
419|gdef|defschemeregiontoken#1[%
420  |long|expandafter|gdef|csname ZZZZcomment#1|endcsname[%
421    |begingroup
422    |let|do|@makeother |dospecials
423    |csname ZZZZcomment|slatexenvstyle II#1|endcsname]%
424  |long|expandafter|gdef|csname ZZZZcommentlatexII#1|endcsname##1\end{#1}[%
425    |endgroup|end[#1]]%
426  |long|expandafter|gdef|csname ZZZZcommenttexII#1|endcsname##1\end#1[%
427    |endgroup|csname end#1|endcsname]%
428  |long|expandafter|gdef|csname #1|endcsname[%
429    |global|advance|sch@mefilenamecount by 1|relax%
430    |ZZZZinput[|filehider Z|number|sch@mefilenamecount|subjobname.tex]%
431    |csname ZZZZcomment#1|endcsname]%
432  |long|expandafter|gdef|csname end#1|endcsname[]]%
433|endgroup
434
435\defschemeregiontoken{schemeregion}
436
437\def\undefschemeregiontoken#1{%
438  \expandafter\gdef\csname#1\endcsname{\UNDEFINED}}
439
440% introducing new code-tokens to the keyword, variable and constant
441% categories
442
443\def\comm@ntII{%
444  \begingroup
445  \let\do\@makeother \dospecials
446  \@commII}
447
448\begingroup\catcode`\[1\catcode`\]2
449\catcode`\{12\catcode`\}12
450\long\gdef\@commII{[%
451  \long\def\@tempa ##1}[\endgroup]\@tempa]%
452\endgroup
453
454\let\setkeyword\comm@ntII
455\let\setvariable\comm@ntII
456\let\setconstant\comm@ntII
457
458% \defschememathescape makes the succeeding grouped character an
459% escape into latex math from within Scheme code;
460% this character can't be }
461
462\let\defschememathescape\comm@ntII
463\let\undefschememathescape\comm@ntII
464
465% telling SLaTeX that a certain Scheme identifier is to
466% be replaced by the specified LaTeX expression.
467% Useful for generating ``mathematical''-looking
468% typeset code even though the corresponding Scheme
469% code is ascii as usual and doesn't violate
470% identifier-naming rules
471
472\def\setspecialsymbol{%
473  \begingroup
474  \let\do\@makeother \dospecials
475  \@commIII}
476
477\begingroup\catcode`\[1\catcode`\]2
478\catcode`\{12\catcode`\}12
479\long\gdef\@commIII{[%
480  \long\def\@tempa ##1}[\endgroup\@gobbleI]\@tempa]%
481\endgroup
482
483\def\@gobbleI#1{}
484
485% \unsetspecialsymbol strips Scheme identifier(s) of
486% any ``mathematical'' look lent by the above
487
488\let\unsetspecialsymbol\comm@ntII
489
490% enabling/disabling slatex
491
492\def\slatexdisable#1{\expandafter\gdef\csname#1\endcsname{}}
493
494% \schemecasesensitive takes either true or false as
495% argument
496
497\def\schemecasesensitive#1{}
498
499%for latex only: use \slatexseparateincludes before the
500%occurrence of any Scheme code in your file, if you
501%want the various \include'd files to have their own
502%pool of temporary slatex files.  This lets you juggle
503%your \include's in successive runs of LaTeX without
504%having to worry that the temp. files may interfere.
505%By default, only a single pool of temp files is used.
506%Warning: On DOS, if your \include'd files have fairly
507%similar names, avoid \slatexseparateincludes since the
508%short filenames on DOS will likely confuse the temp
509%file pools of different \include files.
510
511\def\slatexseparateincludes{%
512\gdef\include##1{{\def\subjobname{##1}%
513\sch@mefilenamecount=-1%
514\@include##1 }}}
515
516% convenient abbreviations for characters
517
518\begingroup
519\catcode`\|=0
520|catcode`|\=12
521|gdef|ttbackslash{{|tt|catcode`|\=12\}}
522|endgroup
523\mathchardef\lt="313C
524\mathchardef\gt="313E
525\begingroup
526  \catcode`\@12%
527  \global\let\atsign@%
528\endgroup
529\chardef\dq=`\"
530
531% leading character of slatex filenames: . for unix to
532% keep them out of the way
533
534\def\filehider{.}
535
536% since the above doesn't work of dos, slatex on dos
537% will use a different character, and make the
538% redefinition available through the following
539
540\inputifpossible{xZfilhid.tex}
541
542% @ is no longer a letter for TeX
543
544\ifusinglatex\relax\else
545\catcode`@\atcatcodebeforeslatex
546\fi
547
548\message{*** Check: Are you sure you called SLaTeX? ***}
Trap