~ chicken-core (master) /tests/slatex.sty
Trap1% 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? ***}