syntax.sty 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817
  1. %%
  2. %% This is file `syntax.sty',
  3. %% generated with the docstrip utility.
  4. %%
  5. %% The original source files were:
  6. %%
  7. %% syntax.dtx (with options: `package')
  8. %% doafter.dtx (with options: `macro')
  9. %%
  10. %% IMPORTANT NOTICE
  11. %%
  12. %% syntax package -- typesetting syntax descriptions
  13. %% Copyright (c) 1996 Mark Wooding
  14. %%
  15. %% This program is free software; you can redistribute it and/or modify
  16. %% it under the terms of the GNU General Public License as published by
  17. %% the Free Software Foundation; either version 2 of the License, or
  18. %% (at your option) any later version.
  19. %%
  20. %% This program is distributed in the hope that it will be useful,
  21. %% but WITHOUT ANY WARRANTY; without even the implied warranty of
  22. %% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  23. %% GNU General Public License for more details.
  24. %%
  25. %% You should have received a copy of the GNU General Public License
  26. %% along with this program; if not, write to the Free Software
  27. %% Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  28. %%
  29. \NeedsTeXFormat{LaTeX2e}
  30. \ProvidesPackage{syntax}
  31. [1996/05/17 1.9 Syntax typesetting (MDW)]
  32. %% \CharacterTable
  33. %% {Upper-case \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
  34. %% Lower-case \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
  35. %% Digits \0\1\2\3\4\5\6\7\8\9
  36. %% Exclamation \! Double quote \" Hash (number) \#
  37. %% Dollar \$ Percent \% Ampersand \&
  38. %% Acute accent \' Left paren \( Right paren \)
  39. %% Asterisk \* Plus \+ Comma \,
  40. %% Minus \- Point \. Solidus \/
  41. %% Colon \: Semicolon \; Less than \<
  42. %% Equals \= Greater than \> Question mark \?
  43. %% Commercial at \@ Left bracket \[ Backslash \\
  44. %% Right bracket \] Circumflex \^ Underscore \_
  45. %% Grave accent \` Left brace \{ Vertical bar \|
  46. %% Right brace \} Tilde \~}
  47. %%
  48. \DeclareOption{rounded}{\sd@roundtrue}
  49. \DeclareOption{square}{\sd@roundfalse}
  50. \DeclareOption{nounderscore}{\@uscorefalse}
  51. \newif\ifsd@round
  52. \newif\if@uscore\@uscoretrue
  53. \ExecuteOptions{square}
  54. \ProcessOptions
  55. \def\addspecial#1{%
  56. \remspecial{#1}%
  57. \expandafter\def\expandafter\dospecials\expandafter{\dospecials\do#1}%
  58. \expandafter\def\expandafter\@santize\expandafter{%
  59. \@sanitize\@makeother#1}%
  60. }
  61. \def\remspecial#1{%
  62. \def\do##1{\ifnum`#1=`##1 \else\noexpand\do\noexpand##1\fi}%
  63. \edef\dospecials{\dospecials}%
  64. \def\@makeother##1{\ifnum`#1=`##1 \else%
  65. \noexpand\@makeother\noexpand##1\fi}%
  66. \edef\@sanitize{\@sanitize}%
  67. \def\@makeother##1{\catcode`##112}%
  68. }
  69. \def\underscore{%
  70. \leavevmode%
  71. \kern.06em%
  72. \vbox{%
  73. \hrule\@width.6em\@depth.4ex\@height-.34ex%
  74. }%
  75. \ifdim\fontdimen\@ne\font=\z@%
  76. \kern.06em%
  77. \fi%
  78. }
  79. \let\usc@builtindischyphen\-
  80. \def\@uscore.{%
  81. \ifmmode%
  82. \expandafter\@firstoftwo%
  83. \else%
  84. \expandafter\@secondoftwo%
  85. \fi%
  86. \sb%
  87. {\textunderscore\@ifnextchar_{}{\usc@builtindischyphen}}%
  88. }
  89. \if@uscore
  90. \AtBeginDocument{%
  91. \catcode`\_\active%
  92. \begingroup%
  93. \lccode`\~`\_%
  94. \lowercase{\endgroup\def~{\protect\@uscore.}}%
  95. }
  96. \fi
  97. \expandafter\let\csname?\string\textunderscore\endcsname\underscore
  98. \def\shortverb#1{%
  99. \@ifundefined{cc@\string#1}{%
  100. \addspecial#1%
  101. \begingroup%
  102. \lccode`\~`#1%
  103. \lowercase{%
  104. \endgroup%
  105. \expandafter\let\csname mn@\string#1\endcsname~%
  106. \expandafter\edef\csname cc@\string#1\endcsname{%
  107. \catcode`\noexpand#1\the\catcode`#1%
  108. \let\noexpand~\expandafter\noexpand%
  109. \csname mn@\string#1\endcsname%
  110. \noexpand\remspecial\noexpand#1%
  111. \let\csname cc@\string#1\endcsname\relax%
  112. }%
  113. \def~{\verb~\syn@ttspace}%
  114. }%
  115. \catcode`#1\active%
  116. }{%
  117. \PackageWarning{syntax}{Character `\expandafter\@gobble\string#1'
  118. is already a verbatim\MessageBreak
  119. delimiter}%
  120. }%
  121. }
  122. \def\unverb#1{%
  123. \@ifundefined{cc@\string#1}{%
  124. \PackageWarning{syntax}{Character `\expandafter\@gobble\string#1'
  125. is not a verbatim\MessageBreak
  126. delimiter}%
  127. }{%
  128. \csname cc@\string#1\endcsname%
  129. }%
  130. }
  131. \newcommand{\syntleft}{$\langle$\normalfont\itshape}
  132. \newcommand{\syntright}{$\rangle$}
  133. \newcommand{\ulitleft}{\normalfont\ttfamily\syn@ttspace\frenchspacing}
  134. \newcommand{\ulitright}{}
  135. \newcommand{\litleft}{`\bgroup\ulitleft}
  136. \newcommand{\litright}{\ulitright\egroup'}
  137. \def\synt#1{\mbox{\syntleft{#1\/}\syntright}}
  138. \def\lit{\@ifstar{\lit@i\ulitleft\ulitright}{\lit@i\litleft\litright}}
  139. \def\lit@i#1#2#3{\mbox{#1{#3\/}#2}}
  140. \def\syn@ttspace@{\spaceskip.35em\@plus.2em\@minus.15em\relax}
  141. \def\ttthinspace{\let\syn@ttspace\syn@ttspace@}
  142. \def\ttthickspace{\let\syn@ttspace\@empty}
  143. \ttthinspace
  144. \def\readupto#1#2#3{%
  145. \bgroup%
  146. \verb@eol@error%
  147. \let\do\@makeother\dospecials%
  148. #2%
  149. \catcode`#1\active%
  150. \lccode`\~`#1%
  151. \gdef\verb@balance@group{\verb@egroup%
  152. \@latex@error{\noexpand\verb illegal in command argument}\@ehc}%
  153. \def\@vhook{\verb@egroup#3}%
  154. \aftergroup\verb@balance@group%
  155. \lowercase{\let~\@vhook}%
  156. }
  157. \def\syn@assist#1#2#3#4#5{%
  158. \mbox\bgroup%
  159. \chardef\\`\\%
  160. \chardef\>`\>%
  161. \chardef\'`\'%
  162. \chardef\"`\"%
  163. \chardef\ `\ %
  164. \def\ch##1{\char`##1}%
  165. \def\act##1{%
  166. \catcode`##1\active%
  167. \begingroup%
  168. \lccode`\~`##1%
  169. \lowercase{\endgroup\def~}%
  170. }%
  171. #1%
  172. \begingroup%
  173. \readupto#3{%
  174. \catcode`\\0%
  175. \catcode`\ 10%
  176. #2%
  177. }{%
  178. \/\endgroup#4\egroup#5%
  179. }%
  180. }
  181. \begingroup
  182. \catcode`\<\active
  183. \catcode`\|\active
  184. \catcode`\"\active
  185. \catcode`\`\active
  186. \gdef\syn@shorts#1#2{%
  187. \def<{%
  188. #1%
  189. \syn@assist%
  190. \syntleft%
  191. {\act_{\@foundunderscore}}%
  192. >%
  193. \syntright%
  194. {#2}%
  195. }%
  196. \def`{%
  197. #1%
  198. \syn@assist%
  199. \litleft%
  200. \relax%
  201. '%
  202. \litright%
  203. {#2}%
  204. }%
  205. \def"{%
  206. #1%
  207. \syn@assist%
  208. \ulitleft%
  209. \relax%
  210. "%
  211. \ulitright%
  212. {#2}%
  213. }%
  214. \def|{\textbar}%
  215. }
  216. \endgroup
  217. \def\syntaxShortcuts#1#2{%
  218. \syn@shorts{#1}{#2}%
  219. \addspecial\`%
  220. \addspecial\<%
  221. \addspecial\|%
  222. \addspecial\"%
  223. \catcode`\|\active%
  224. \catcode`\<\active%
  225. \catcode`\"\active%
  226. \catcode`\`\active%
  227. }
  228. \def\synshorts{\syntaxShortcuts\relax\relax}
  229. \def\synshortsoff{%
  230. \catcode`\|12%
  231. \catcode`\<12%
  232. \catcode`\"12%
  233. \catcode`\`12%
  234. }
  235. \def\syntax#{\bgroup\syntaxShortcuts\relax\relax\let\@let@token}
  236. \newskip\grammarparsep
  237. \grammarparsep8\p@\@plus\p@\@minus\p@
  238. \newdimen\grammarindent
  239. \grammarindent2em
  240. \newcommand{\grammarlabel}[2]{%
  241. \synt{#1} \hfill#2%
  242. }
  243. \def\gr@implitem<#1> #2 {%
  244. \sbox\z@{\hskip\labelsep\grammarlabel{#1}{#2}}%
  245. \strut\@@par%
  246. \vskip-\parskip%
  247. \vskip-\baselineskip%
  248. \hrule\@height\z@\@depth\z@\relax%
  249. \item[\unhbox\z@]%
  250. \catcode`\<\active%
  251. }
  252. \let\gr@leftsq\[
  253. \let\gr@rightsq\]
  254. \def\[{\gr@leftsq}
  255. \def\]{\gr@rightsq}
  256. \newenvironment{grammar}{%
  257. \list{}{%
  258. \labelwidth\grammarindent%
  259. \leftmargin\grammarindent%
  260. \advance\grammarindent\labelsep
  261. \itemindent\z@%
  262. \listparindent\z@%
  263. \parsep\grammarparsep%
  264. }%
  265. \let\\\@normalcr
  266. \syntaxShortcuts\relax\relax%
  267. \def\alt{\\\llap{\textbar\quad}}%
  268. \def\gr@setpar{%
  269. \def\par{%
  270. \parshape\@ne\@totalleftmargin\linewidth%
  271. \@@par%
  272. \catcode`\<12%
  273. \everypar{%
  274. \everypar{}%
  275. \catcode`\<\active%
  276. \gr@implitem%
  277. }%
  278. }%
  279. }%
  280. \gr@setpar%
  281. \par%
  282. \def\gr@endsyntdiag]{\end{syntdiag}\gr@setpar\par}%
  283. \def\[{\@ifnextchar[{\begin{syntdiag}\@gobble}\gr@leftsq}%
  284. \def\]{\@ifnextchar]\gr@endsyntdiag\gr@rightsq}%
  285. }{%
  286. \@newlistfalse%
  287. \everypar{}%
  288. \endlist%
  289. }
  290. \newskip\sdstartspace
  291. \newskip\sdendspace
  292. \newskip\sdmidskip
  293. \newskip\sdtokskip
  294. \newskip\sdfinalskip
  295. \newdimen\sdrulewidth
  296. \newdimen\sdcirclediam
  297. \newdimen\sdindent
  298. \dimendef\sd@lower\z@
  299. \dimendef\sd@upper\tw@
  300. \dimendef\sd@mid4
  301. \dimendef\sd@topcirc6
  302. \dimendef\sd@botcirc8
  303. \def\sd@setsize{%
  304. \sd@mid\ht\strutbox%
  305. \advance\sd@mid-\dp\strutbox%
  306. \[email protected]\sd@mid%
  307. \sd@upper\sdrulewidth%
  308. \advance\sd@upper\sd@mid%
  309. \sd@lower\sdrulewidth%
  310. \advance\sd@lower-\sd@mid%
  311. \[email protected]\sdcirclediam%
  312. \advance\sd@topcirc\sd@mid%
  313. \[email protected]\sdcirclediam%
  314. \advance\sd@botcirc-\sd@mid%
  315. }
  316. \newcommand{\sdsize}{%
  317. \small%
  318. }
  319. \newcommand{\sdlengths}{%
  320. \setlength{\sdstartspace}{1em minus 10pt}%
  321. \setlength{\sdendspace}{1em minus 10pt}%
  322. \setlength{\sdmidskip}{0.5em plus 0.0001fil}%
  323. \setlength{\sdtokskip}{0.25em plus 0.0001fil}%
  324. \setlength{\sdfinalskip}{0.5em plus 10000fil}%
  325. \setlength{\sdrulewidth}{0.2pt}%
  326. \setlength{\sdcirclediam}{8pt}%
  327. \setlength{\sdindent}{0pt}%
  328. }
  329. \newif\ifsd@base
  330. \newif\ifsd@top
  331. \newif\ifsd@toplayer
  332. \newif\ifsd@backwards
  333. \def\sd@err{\PackageError{syntax}}
  334. \def\sd@arrow{%
  335. \ht\tw@\z@%
  336. \dp\tw@\z@%
  337. \raise\sd@mid\box\tw@%
  338. \egroup%
  339. }
  340. \def\sd@rightarr{%
  341. \bgroup%
  342. \setbox\tw@\hbox{\kern-6\p@\@linefnt\char'55}%
  343. \sd@arrow%
  344. }
  345. \def\sd@leftarr{%
  346. \bgroup%
  347. \raise\sd@mid\hbox{\@linefnt\char'33\kern-6\p@}%
  348. \sd@arrow%
  349. }
  350. \def\sd@uparr{%
  351. \bgroup%
  352. \setbox\tw@\hb@xt@\z@{\kern-\sdrulewidth\@linefnt\char'66\hss}%
  353. \setbox\tw@\hbox{\lower10\p@\box\tw@}%
  354. \sd@arrow%
  355. }
  356. \def\sd@downarr{%
  357. \bgroup%
  358. \setbox\tw@\hb@xt@\z@{\kern-\sdrulewidth\@linefnt\char'77\hss}%
  359. \sd@arrow%
  360. }
  361. \def\sd@circ#1{%
  362. \@getcirc\sdcirclediam%
  363. \advance\@tempcnta#1%
  364. \setbox\tw@\hbox{\lower\sdrulewidth%
  365. \hbox{\@circlefnt\char\@tempcnta}}%
  366. \wd\tw@\z@%
  367. \leavevmode%
  368. }
  369. \def\sd@tlcirc{{%
  370. \sd@circ3%
  371. \ht\tw@\sdrulewidth%
  372. \dp\[email protected]\sdcirclediam%
  373. \kern-\tw@\sdrulewidth%
  374. \raise\sd@mid\box\tw@%
  375. \kern.5\sdcirclediam%
  376. }}
  377. \def\sd@trcirc{{%
  378. \sd@circ0%
  379. \ht\tw@\sdrulewidth%
  380. \dp\[email protected]\sdcirclediam%
  381. \kern.5\sdcirclediam%
  382. \raise\sd@mid\box\tw@%
  383. }}
  384. \def\sd@blcirc{{%
  385. \sd@circ2%
  386. \ht\[email protected]\sdcirclediam%
  387. \dp\tw@\sdrulewidth%
  388. \kern-\tw@\sdrulewidth%
  389. \raise\sd@mid\box\tw@%
  390. \kern.5\sdcirclediam%
  391. }}
  392. \def\sd@brcirc{{%
  393. \sd@circ1%
  394. \ht\[email protected]\sdcirclediam%
  395. \dp\tw@\sdrulewidth%
  396. \kern.5\sdcirclediam%
  397. \raise\sd@mid\box\tw@%
  398. }}
  399. \def\sd@llc#1{%
  400. \hb@[email protected]\sdcirclediam{%
  401. \sd@rule\hskip.5\sdcirclediam%
  402. \hss%
  403. #1%
  404. }%
  405. }
  406. \def\sd@rlc#1{%
  407. \hb@[email protected]\sdcirclediam{%
  408. #1%
  409. \hss%
  410. \sd@rule\hskip.5\sdcirclediam%
  411. }%
  412. }
  413. \def\sd@rule{\leaders\hrule\@height\sd@upper\@depth\sd@lower}
  414. \def\sd@gap#1{%
  415. \ifsd@base%
  416. \skip@#1%
  417. \divide\skip\z@\tw@%
  418. \nobreak\sd@rule\hskip\skip@%
  419. \discretionary{%
  420. \sd@qarrow{->}%
  421. }{%
  422. \hbox{%
  423. \sd@qarrow{>-}%
  424. \sd@rule\hskip\sdstartspace%
  425. \sd@rule\hskip3.5\p@%
  426. }%
  427. }{%
  428. }%
  429. \nobreak\sd@rule\hskip\skip@%
  430. \else%
  431. \sd@rule\hskip#1%
  432. \fi%
  433. }
  434. \def\syntdiag{%
  435. \syntaxShortcuts\sd@tok@i\sd@tok@ii%
  436. \@ifnextchar[\syntdiag@i{\syntdiag@i[]}%
  437. }
  438. \def\syntdiag@i[#1]{%
  439. \sdsize\sdlengths%
  440. #1%
  441. \sd@setsize%
  442. \list{}{%
  443. \leftmargin\sdindent%
  444. \rightmargin\leftmargin%
  445. \labelsep\z@%
  446. \labelwidth\z@%
  447. }%
  448. \item[]%
  449. \parfillskip\z@%
  450. \noindent%
  451. \sd@qarrow{>>-}%
  452. \nobreak\sd@rule\hskip\sdstartspace%
  453. \sd@basetrue%
  454. \sloppy%
  455. \interlinepenalty100%
  456. \hyphenpenalty0%
  457. \catcode`\ 9%
  458. \catcode`\^^M9%
  459. \def\gr@leftsq{\begin{stack}\\}%
  460. \def\gr@rightsq{\end{stack}}%
  461. \def\({\begin{stack}}%
  462. \def\){\end{stack}}%
  463. \def\<{\begin{rep}}%
  464. \def\>{\end{rep}}%
  465. \let\\\sd@newline%
  466. \ignorespaces%
  467. }
  468. \def\endsyntdiag{%
  469. \unskip%
  470. \nobreak\sd@rule\hskip\sdmidskip%
  471. \sd@rule\hskip\sdfinalskip%
  472. \sd@qarrow{-><}%
  473. \endlist%
  474. }
  475. \@namedef{syntdiag*}{%
  476. \syntaxShortcuts\sd@tok@i\sd@tok@ii%
  477. \@ifnextchar[\syntdiag@s@i{\syntdiag@s@i[]}%
  478. }
  479. \def\syntdiag@s@i[#1]{%
  480. \@ifnextchar[{\syntdiag@s@ii{#1}}{\syntdiag@s@iii{#1}{\hbox}}%
  481. }
  482. \def\syntdiag@s@ii#1[#2]{\syntdiag@s@iii{#1}{\hb@xt@#2}}
  483. \def\syntdiag@s@iii#1#2{%
  484. \leavevmode%
  485. #2\bgroup%
  486. \let\@@left\left%
  487. \let\@@right\right%
  488. \def\left##1{\def\sd@startarr{##1}}%
  489. \def\right##1{\def\sd@endarr{##1}}%
  490. \left{>-}\right{->}%
  491. \sdsize\sdlengths%
  492. #1%
  493. \sd@setsize%
  494. \let\left\@@left%
  495. \let\right\@@right%
  496. \sd@qarrow\sd@startarr%
  497. \sd@rule\hskip\sdmidskip%
  498. \sd@basefalse%
  499. \catcode`\ 9%
  500. \catcode`\^^M9%
  501. \ignorespaces%
  502. }
  503. \@namedef{endsyntdiag*}{%
  504. \unskip%
  505. \sd@rule\hskip\sdmidskip%
  506. \sd@rule\hskip\sdfinalskip%
  507. \sd@qarrow\sd@endarr%
  508. \egroup%
  509. }
  510. \def\sd@qarrow#1{%
  511. \begingroup%
  512. \lccode`\~=`\<\lowercase{\def~{<}}%
  513. \hbox{\csname sd@arr@#1\endcsname}%
  514. \endgroup%
  515. }
  516. \@namedef{sd@arr@>>-}{\sd@rightarr\kern-.5\p@\sd@rightarr\kern-\p@}
  517. \@namedef{sd@arr@>-}{\sd@rightarr\kern-\p@}
  518. \@namedef{sd@arr@->}{\sd@rightarr}
  519. \@namedef{sd@arr@-><}{\sd@rightarr\kern-\p@\sd@leftarr}
  520. \@namedef{sd@arr@...}{$\cdots$}
  521. \@namedef{sd@arr@-}{}
  522. \def\sd@newline{\@ifstar{\vadjust{\penalty\@M}\sd@nl@i}\sd@nl@i}
  523. \def\sd@nl@i{\@ifnextchar[\sd@nl@ii\sd@nl@iii}
  524. \def\sd@nl@ii[#1]{\vspace{#1}\sd@nl@iii}
  525. \def\sd@nl@iii{%
  526. \nobreak\sd@rule\hskip\sdmidskip%
  527. \sd@rule\hskip\sdfinalskip%
  528. \kern-3\p@%
  529. \sd@rightarr%
  530. \newline%
  531. \sd@rightarr%
  532. \nobreak\sd@rule\hskip\sdstartspace%
  533. \sd@rule\hskip3.5\p@%
  534. }
  535. \def\sdbox#1{%
  536. \@tempskipa#1\relax%
  537. \sd@gap\@tempskipa%
  538. \setbox\z@\hbox\bgroup%
  539. \begingroup%
  540. \catcode`\ 10%
  541. \catcode`\^^M5%
  542. \synshortsoff%
  543. }
  544. \def\endsdbox{%
  545. \endgroup%
  546. \egroup%
  547. \@tempdima\ht\z@%
  548. \advance\@tempdima-\dp\z@%
  549. \advance\@tempdima-\tw@\sd@mid%
  550. \lower.5\@tempdima\box\z@%
  551. \sd@gap\@tempskipa%
  552. }
  553. \def\sd@tok@i{%
  554. \sdbox\sdtokskip%
  555. \strut%
  556. \space%
  557. }
  558. \def\sd@tok@ii{%
  559. \space%
  560. \endsdbox%
  561. }
  562. \def\tok#{%
  563. \sdbox\sdtokskip%
  564. \strut%
  565. \enspace%
  566. \syntaxShortcuts\relax\relax%
  567. \doafter\sd@tok%
  568. }
  569. \def\sd@tok{%
  570. \enspace%
  571. \endsdbox%
  572. }
  573. \newcommand\stack[1][t]{%
  574. \sd@gap\sdmidskip%
  575. \begingroup\sd@basefalse%
  576. \sd@toplayertrue%
  577. \let\\\sd@stackcr%
  578. \if#1t%
  579. \let\@tempa\vtop%
  580. \sd@toptrue%
  581. \ifsd@round\llap{\sd@trcirc\kern\tw@\sdrulewidth}\fi%
  582. \else\if#1b%
  583. \let\@tempa\vbox%
  584. \sd@topfalse%
  585. \ifsd@round\llap{\sd@brcirc\kern\tw@\sdrulewidth}\fi%
  586. \else%
  587. \sd@err{Bad position argument passed to stack}%
  588. {The positioning argument must be one of `t' or `b'. I%
  589. have^^Jassumed you meant to type `t'.}%
  590. \let\@tempa\vtop%
  591. \fi\fi%
  592. \@tempa\bgroup%
  593. \offinterlineskip%
  594. \ialign\bgroup%
  595. ##\cr%
  596. \setbox\z@\hbox\bgroup%
  597. \strut%
  598. }
  599. \def\endstack{%
  600. \egroup%
  601. \ifsd@toplayer%
  602. \sd@dostack\sd@upper\sd@lower\relax\relax%
  603. \else%
  604. \ifsd@round%
  605. \ifsd@top%
  606. \sd@dostack{\ht\z@}\sd@botcirc\sd@blcirc\sd@brcirc%
  607. \else%
  608. \sd@dostack{\ht\z@}\sd@botcirc\relax\relax%
  609. \fi%
  610. \else%
  611. \sd@dostack{\ht\z@}\sd@lower\relax\relax%
  612. \fi%
  613. \fi%
  614. \egroup%
  615. \egroup%
  616. \ifsd@round%
  617. \ifsd@top
  618. \rlap{\kern\tw@\sdrulewidth\sd@tlcirc}%
  619. \else%
  620. \rlap{\kern\tw@\sdrulewidth\sd@blcirc}%
  621. \fi%
  622. \fi%
  623. \endgroup\sd@gap\sdmidskip%
  624. }
  625. \def\sd@stackcr{%
  626. \egroup%
  627. \ifsd@toplayer%
  628. \ifsd@round%
  629. \ifsd@top%
  630. \sd@dostack\sd@topcirc{\dp\z@}\relax\relax%
  631. \else%
  632. \sd@dostack\sd@topcirc{\dp\z@}\sd@tlcirc\sd@trcirc%
  633. \fi%
  634. \else%
  635. \sd@dostack\sd@upper{\dp\z@}\relax\relax%
  636. \fi%
  637. \else%
  638. \ifsd@round%
  639. \ifsd@top%
  640. \sd@dostack{\ht\z@}{\dp\z@}\sd@blcirc\sd@brcirc%
  641. \else%
  642. \sd@dostack{\ht\z@}{\dp\z@}\sd@tlcirc\sd@trcirc%
  643. \fi%
  644. \else%
  645. \sd@dostack{\ht\z@}{\dp\z@}\relax\relax%
  646. \fi%
  647. \fi%
  648. \sd@toplayerfalse%
  649. \setbox\z@\hbox\bgroup%
  650. \strut%
  651. }
  652. \def\sd@dostack#1#2#3#4{%
  653. \@tempdima#1%
  654. \@tempdimb#2%
  655. \kern-\tw@\sdrulewidth%
  656. \vrule\@height\@tempdima\@depth\@tempdimb\@width\tw@\sdrulewidth%
  657. #3%
  658. \sd@rule\hfill%
  659. \sd@gap\sdtokskip%
  660. \unhbox\z@%
  661. \sd@gap\sdtokskip%
  662. \sd@rule\hfill%
  663. #4%
  664. \vrule\@height\@tempdima\@depth\@tempdimb\@width\tw@\sdrulewidth%
  665. \kern-\tw@\sdrulewidth%
  666. \cr%
  667. }
  668. \newcommand\rep[1][t]{%
  669. \sd@gap\sdmidskip%
  670. \begingroup\sd@basefalse%
  671. \ifsd@backwards\sd@backwardsfalse\else\sd@backwardstrue\fi%
  672. \let\\\sd@loop%
  673. \if#1t%
  674. \let\@tempa\vbox%
  675. \sd@toptrue%
  676. \else\if#1b%
  677. \let\@tempa\vtop%
  678. \sd@topfalse%
  679. \else%
  680. \sd@err{Bad position argument passed to loop}%
  681. {The positioning argument must be `t' or `b'. I have^^J%
  682. assumed you meant to type `t'.}%
  683. \let\@tempa\vbox%
  684. \sd@toptrue%
  685. \fi\fi%
  686. \@tempa\bgroup%
  687. \setbox\tw@\copy\strutbox%
  688. \setbox\z@\hbox\bgroup\strut%
  689. }
  690. \def\endrep{%
  691. \egroup%
  692. \ifsd@top%
  693. \ifsd@round%
  694. \sd@doloop\tw@\z@\relax\relax%
  695. \sd@tlcirc\sd@trcirc{\sd@rlc\sd@blcirc}{\sd@llc\sd@brcirc}%
  696. \else%
  697. \sd@doloop\tw@\z@\relax\sd@downarr\relax\relax\relax\relax%
  698. \fi%
  699. \else%
  700. \ifsd@round%
  701. \sd@doloop\z@\tw@\relax\relax%
  702. {\sd@rlc\sd@tlcirc}{\sd@llc\sd@trcirc}\sd@blcirc\sd@brcirc%
  703. \else%
  704. \sd@doloop\z@\tw@\sd@uparr\relax\relax\relax\relax\relax%
  705. \fi%
  706. \fi%
  707. \egroup%
  708. \endgroup\sd@gap\sdmidskip%
  709. }
  710. \def\sd@loop{%
  711. \egroup%
  712. \def\\{\sd@err{Too many \string\\\space commands in loop}\@ehc}%
  713. \setbox\tw@\hbox\bgroup\strut%
  714. }
  715. \def\sd@doloop#1#2#3#4#5#6#7#8{%
  716. \@tempdima\dp#1\relax%
  717. \@tempdimb\ht#2\relax%
  718. \offinterlineskip%
  719. \ialign{%
  720. ##\cr%
  721. \ifsd@round%
  722. \sd@doloop@i#1#3\sd@topcirc\@tempdima{#5}{#6}%
  723. \sd@doloop@i#2#4\@tempdimb\sd@botcirc{#7}{#8}%
  724. \else%
  725. \sd@doloop@i#1#3\sd@upper\@tempdima{#5}{#6}%
  726. \sd@doloop@i#2#4\@tempdimb\sd@lower{#7}{#8}%
  727. \fi%
  728. }%
  729. }
  730. \def\sd@doloop@i#1#2#3#4#5#6{%
  731. \ifsd@backwards#2\fi%
  732. \kern-\tw@\sdrulewidth%
  733. \vrule\@height#3\@depth#4\@width\tw@\sdrulewidth%
  734. #5%
  735. \sd@rule\hfill%
  736. \sd@gap\sdtokskip%
  737. \unhbox#1%
  738. \sd@gap\sdtokskip%
  739. \sd@rule\hfill%
  740. #6%
  741. \vrule\@height#3\@depth#4\@width\tw@\sdrulewidth%
  742. \ifsd@backwards\else#2\fi%
  743. \kern-\tw@\sdrulewidth%
  744. \cr%
  745. }
  746. %%
  747. %% doafter package -- insert a token really after a group
  748. %% Copyright (c) 1996 Peter Schmitt and Mark Wooding
  749. %%
  750. \let\@@aftergroup\aftergroup
  751. \def\doafter#1{%
  752. \def\@tempa{\@@aftergroup#1}%
  753. \afterassignment\doafter@i\let\@let@token%
  754. }
  755. \def\doafter@i{%
  756. \@let@token%
  757. \let\aftergroup\@my@aftergroup%
  758. \@@aftergroup\@prepare@after\@tempa%
  759. }
  760. \def\ag@cnt@local{0 }
  761. \let\ag@cnt@global\ag@cnt@local
  762. \def\@my@aftergroup{%
  763. \begingroup%
  764. \count@\ag@cnt@local%
  765. \advance\count@\@ne%
  766. \xdef\ag@cnt@global{\the\count@\space}%
  767. \endgroup%
  768. \let\ag@cnt@local\ag@cnt@global%
  769. \@@aftergroup\@after@token\@@aftergroup%
  770. }
  771. \def\@after@token{%
  772. \@start@after@group%
  773. \@after@token%
  774. }
  775. \def\@start@after@group{%
  776. \begingroup%
  777. \count@\ag@cnt@global%
  778. \clubpenalty\ag@cnt@local%
  779. \let\@after@token\@after@token@i%
  780. }
  781. \def\@after@token@i{%
  782. \advance\count@\m@ne%
  783. \ifnum\count@=\clubpenalty%
  784. \global\let\ag@cnt@global\ag@cnt@local%
  785. \expandafter\@after@aftertoken\expandafter\@after@all%
  786. \else%
  787. \expandafter\@@aftergroup%
  788. \fi%
  789. }
  790. \let\@after@all\endgroup
  791. \def\@prepare@after{%
  792. \ifx\ag@cnt@local\ag@cnt@global\else%
  793. \expandafter\@prepare@after@i%
  794. \fi%
  795. }
  796. \def\@prepare@after@i#1{%
  797. \@start@after@group%
  798. \def\@after@all{\@@aftergroup#1\endgroup}%
  799. }
  800. \def\@after@aftertoken#1{%
  801. \let\bgroup\relax\let\egroup\relax%
  802. \toks@{#1}%
  803. \futurelet\@let@token\@after@aftertoken@i%
  804. }
  805. \def\@after@aftertoken@i{%
  806. \ifcat\noexpand\@let@token{%
  807. \@@aftergroup{%
  808. \else\ifcat\noexpand\@let@token}%
  809. \@@aftergroup}%
  810. \else%
  811. \def\@tempa##1{\@@aftergroup##1\the\toks@}%
  812. \expandafter\expandafter\expandafter\@tempa%
  813. \fi\fi%
  814. }
  815. \endinput
  816. %%
  817. %% End of file `syntax.sty'.