Advertisement
Guest User

Untitled

a guest
Jul 30th, 2015
392
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Latex 15.39 KB | None | 0 0
  1. %  Mathpartir --- Math Paragraph for Typesetting Inference Rules
  2. %
  3. %  Copyright (C) 2001, 2002, 2003, 2004, 2005 Didier Rémy
  4. %
  5. %  Author         : Didier Remy
  6. %  Version        : 1.2.0
  7. %  Bug Reports    : to author
  8. %  Web Site       : http://pauillac.inria.fr/~remy/latex/
  9. %
  10. %  Mathpartir is free software; you can redistribute it and/or modify
  11. %  it under the terms of the GNU General Public License as published by
  12. %  the Free Software Foundation; either version 2, or (at your option)
  13. %  any later version.
  14. %  
  15. %  Mathpartir is distributed in the hope that it will be useful,
  16. %  but WITHOUT ANY WARRANTY; without even the implied warranty of
  17. %  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18. %  GNU General Public License for more details
  19. %  (http://pauillac.inria.fr/~remy/license/GPL).
  20. %
  21. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  22. %  File mathpartir.sty (LaTeX macros)
  23. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  24.  
  25. \NeedsTeXFormat{LaTeX2e}
  26. \ProvidesPackage{mathpartir}
  27.     [2005/12/20 version 1.2.0 Math Paragraph for Typesetting Inference Rules]
  28.  
  29. %%
  30.  
  31. %% Identification
  32. %% Preliminary declarations
  33.  
  34. \RequirePackage {keyval}
  35.  
  36. %% Options
  37. %% More declarations
  38.  
  39. %% PART I: Typesetting maths in paragraphe mode
  40.  
  41. %% \newdimen \mpr@tmpdim
  42. %% Dimens are a precious ressource. Uses seems to be local.
  43. \let \mpr@tmpdim \@tempdima
  44.  
  45. % To ensure hevea \hva compatibility, \hva should expands to nothing
  46. % in mathpar or in inferrule
  47. \let \mpr@hva \empty
  48.  
  49. %% normal paragraph parametters, should rather be taken dynamically
  50. \def \mpr@savepar {%
  51.   \edef \MathparNormalpar
  52.      {\noexpand \lineskiplimit \the\lineskiplimit
  53.      \noexpand \lineskip \the\lineskip}%
  54.   }
  55.  
  56. \def \mpr@rulelineskip {\lineskiplimit=0.3em\lineskip=0.2em plus 0.1em}
  57. \def \mpr@lesslineskip {\lineskiplimit=0.6em\lineskip=0.5em plus 0.2em}
  58. \def \mpr@lineskip  {\lineskiplimit=1.2em\lineskip=1.2em plus 0.2em}
  59. \let \MathparLineskip \mpr@lineskip
  60. \def \mpr@paroptions {\MathparLineskip}
  61. \let \mpr@prebindings \relax
  62.  
  63. \newskip \mpr@andskip \mpr@andskip 2em plus 0.5fil minus 0.5em
  64.  
  65. \def \mpr@goodbreakand
  66.   {\hskip -\mpr@andskip  \penalty -1000\hskip \mpr@andskip}
  67. \def \mpr@and {\hskip \mpr@andskip}
  68. \def \mpr@andcr {\penalty 50\mpr@and}
  69. \def \mpr@cr {\penalty -10000\mpr@and}
  70. \def \mpr@eqno #1{\mpr@andcr #1\hskip 0em plus -1fil \penalty 10}
  71.  
  72. \def \mpr@bindings {%
  73.   \let \and \mpr@andcr
  74.   \let \par \mpr@andcr
  75.   \let \\\mpr@cr
  76.   \let \eqno \mpr@eqno
  77.   \let \hva \mpr@hva
  78.   }
  79. \let \MathparBindings \mpr@bindings
  80.  
  81. % \@ifundefined {ignorespacesafterend}
  82. %    {\def \ignorespacesafterend {\aftergroup \ignorespaces}
  83.  
  84. \newenvironment{mathpar}[1][]
  85.  {$$\mpr@savepar \parskip 0em \hsize \linewidth \centering
  86.     \vbox \bgroup \mpr@prebindings \mpr@paroptions #1\ifmmode $\else
  87.     \noindent $\displaystyle\fi
  88.     \MathparBindings}
  89.  {\unskip \ifmmode $\fi\egroup $$\ignorespacesafterend}
  90. \newenvironment{mathparpagebreakable}[1][]
  91.   {\begingroup
  92.    \par
  93.    \mpr@savepar \parskip 0em \hsize \linewidth \centering
  94.       \mpr@prebindings \mpr@paroptions #1%
  95.       \vskip \abovedisplayskip \vskip -\lineskip%
  96.      \ifmmode  \else  $\displaystyle\fi
  97.     \MathparBindings
  98.  }
  99.  {\unskip
  100.   \ifmmode $\fi \par\endgroup
  101.   \vskip \belowdisplayskip
  102.   \noindent
  103.  \ignorespacesafterend}
  104.  
  105. % \def \math@mathpar #1{\setbox0 \hbox {$\displaystyle #1$}\ifnum
  106. %     \wd0 < \hsize  $$\box0$$\else \bmathpar #1\emathpar \fi}
  107.  
  108. %%% HOV BOXES
  109.  
  110. \def \mathvbox@ #1{\hbox \bgroup \mpr@normallineskip
  111.  \vbox \bgroup \tabskip 0em \let \\ \cr
  112.  \halign \bgroup \hfil $##$\hfil\cr #1\crcr \egroup \egroup
  113.  \egroup}
  114.  
  115. \def \mathhvbox@ #1{\setbox0 \hbox {\let \\\qquad $#1$}\ifnum \wd0 < \hsize
  116.      \box0\else \mathvbox {#1}\fi}
  117.  
  118.  
  119. %% Part II -- operations on lists
  120.  
  121. \newtoks \mpr@lista
  122. \newtoks \mpr@listb
  123.  
  124. \long \def\mpr@cons #1\mpr@to#2{\mpr@lista {\\{#1}}\mpr@listb \expandafter
  125. {#2}\edef #2{\the \mpr@lista \the \mpr@listb}}
  126.  
  127. \long \def\mpr@snoc #1\mpr@to#2{\mpr@lista {\\{#1}}\mpr@listb \expandafter
  128. {#2}\edef #2{\the \mpr@listb\the\mpr@lista}}
  129.  
  130. \long \def \mpr@concat#1=#2\mpr@to#3{\mpr@lista \expandafter {#2}\mpr@listb
  131. \expandafter {#3}\edef #1{\the \mpr@listb\the\mpr@lista}}
  132.  
  133. \def \mpr@head #1\mpr@to #2{\expandafter \mpr@head@ #1\mpr@head@ #1#2}
  134. \long \def \mpr@head@ #1#2\mpr@head@ #3#4{\def #4{#1}\def#3{#2}}
  135.  
  136. \def \mpr@flatten #1\mpr@to #2{\expandafter \mpr@flatten@ #1\mpr@flatten@ #1#2}
  137. \long \def \mpr@flatten@ \\#1\\#2\mpr@flatten@ #3#4{\def #4{#1}\def #3{\\#2}}
  138.  
  139. \def \mpr@makelist #1\mpr@to #2{\def \mpr@all {#1}%
  140.    \mpr@lista {\\}\mpr@listb \expandafter {\mpr@all}\edef \mpr@all {\the
  141.   \mpr@lista \the \mpr@listb \the \mpr@lista}\let #2\empty
  142.   \def \mpr@stripof ##1##2\mpr@stripend{\def \mpr@stripped{##2}}\loop
  143.     \mpr@flatten \mpr@all \mpr@to \mpr@one
  144.     \expandafter \mpr@snoc \mpr@one \mpr@to #2\expandafter \mpr@stripof
  145.     \mpr@all \mpr@stripend  
  146.     \ifx \mpr@stripped \empty \let \mpr@isempty 0\else \let \mpr@isempty 1\fi
  147.     \ifx 1\mpr@isempty
  148.   \repeat
  149. }
  150.  
  151. \def \mpr@rev #1\mpr@to #2{\let \mpr@tmp \empty
  152.   \def \\##1{\mpr@cons ##1\mpr@to \mpr@tmp}#1\let #2\mpr@tmp}
  153.  
  154. %% Part III -- Type inference rules
  155.  
  156. \newif \if@premisse
  157. \newbox \mpr@hlist
  158. \newbox \mpr@vlist
  159. \newif \ifmpr@center \mpr@centertrue
  160. \def \mpr@htovlist {%
  161.    \setbox \mpr@hlist
  162.       \hbox {\strut
  163.             \ifmpr@center \hskip -0.5\wd\mpr@hlist\fi
  164.             \unhbox \mpr@hlist}%
  165.    \setbox \mpr@vlist
  166.       \vbox {\if@premisse  \box \mpr@hlist \unvbox \mpr@vlist
  167.             \else \unvbox \mpr@vlist \box \mpr@hlist
  168.             \fi}%
  169. }
  170. % OLD version
  171. % \def \mpr@htovlist {%
  172. %    \setbox \mpr@hlist
  173. %       \hbox {\strut \hskip -0.5\wd\mpr@hlist \unhbox \mpr@hlist}%
  174. %    \setbox \mpr@vlist
  175. %       \vbox {\if@premisse  \box \mpr@hlist \unvbox \mpr@vlist
  176. %              \else \unvbox \mpr@vlist \box \mpr@hlist
  177. %              \fi}%
  178. % }
  179.  
  180. \def \mpr@item #1{$\displaystyle #1$}
  181. \def \mpr@sep{2em}
  182. \def \mpr@blank { }
  183. \def \mpr@hovbox #1#2{\hbox
  184.  \bgroup
  185.  \ifx #1T\@premissetrue
  186.  \else \ifx #1B\@premissefalse
  187.  \else
  188.     \PackageError{mathpartir}
  189.       {Premisse orientation should either be T or B}
  190.       {Fatal error in Package}%
  191.   \fi \fi
  192.   \def \@test {#2}\ifx \@test \mpr@blank\else
  193.  \setbox \mpr@hlist \hbox {}%
  194.   \setbox \mpr@vlist \vbox {}%
  195.   \if@premisse \let \snoc \mpr@cons \else \let \snoc \mpr@snoc \fi
  196.   \let \@hvlist \empty \let \@rev \empty
  197.   \mpr@tmpdim 0em
  198.   \expandafter \mpr@makelist #2\mpr@to \mpr@flat
  199.   \if@premisse \mpr@rev \mpr@flat \mpr@to \@rev \else \let \@rev \mpr@flat \fi
  200.   \def \\##1{%
  201.      \def \@test {##1}\ifx \@test \empty
  202.         \mpr@htovlist
  203.         \mpr@tmpdim 0em %%% last bug fix not extensively checked
  204.      \else
  205.       \setbox0 \hbox{\mpr@item {##1}}\relax
  206.       \advance \mpr@tmpdim by \wd0
  207.       %\mpr@tmpdim 1.02\mpr@tmpdim
  208.       \ifnum \mpr@tmpdim < \hsize
  209.          \ifnum \wd\mpr@hlist > 0
  210.            \if@premisse
  211.              \setbox \mpr@hlist
  212.                 \hbox {\unhbox0 \hskip \mpr@sep \unhbox \mpr@hlist}%
  213.            \else
  214.              \setbox \mpr@hlist
  215.                 \hbox {\unhbox \mpr@hlist  \hskip \mpr@sep \unhbox0}%
  216.            \fi
  217.          \else
  218.          \setbox \mpr@hlist \hbox {\unhbox0}%
  219.          \fi
  220.       \else
  221.          \ifnum \wd \mpr@hlist > 0
  222.             \mpr@htovlist
  223.             \mpr@tmpdim \wd0
  224.          \fi
  225.          \setbox \mpr@hlist \hbox {\unhbox0}%
  226.       \fi
  227.       \advance \mpr@tmpdim by \mpr@sep
  228.    \fi
  229.    }%
  230.    \@rev
  231.    \mpr@htovlist
  232.    \ifmpr@center \hskip \wd\mpr@vlist\fi \box \mpr@vlist
  233.    \fi
  234.    \egroup
  235. }
  236.  
  237. %%% INFERENCE RULES
  238.  
  239. \@ifundefined{@@over}{%
  240.     \let\@@over\over % fallback if amsmath is not loaded
  241.     \let\@@overwithdelims\overwithdelims
  242.     \let\@@atop\atop \let\@@atopwithdelims\atopwithdelims
  243.     \let\@@above\above \let\@@abovewithdelims\abovewithdelims
  244.   }{}
  245.  
  246. %% The default
  247.  
  248. \def \mpr@@fraction #1#2{\hbox {\advance \hsize by -0.5em
  249.    $\displaystyle {#1\mpr@over #2}$}}
  250. \def \mpr@@nofraction #1#2{\hbox {\advance \hsize by -0.5em
  251.    $\displaystyle {#1\@@atop #2}$}}
  252.  
  253. \let \mpr@fraction \mpr@@fraction
  254.  
  255. %% A generic solution to arrow
  256.  
  257. \def \mpr@make@fraction #1#2#3#4#5{\hbox {%
  258.      \def \mpr@tail{#1}%
  259.      \def \mpr@body{#2}%
  260.      \def \mpr@head{#3}%
  261.      \setbox1=\hbox{$#4$}\setbox2=\hbox{$#5$}%
  262.      \setbox3=\hbox{$\mkern -3mu\mpr@body\mkern -3mu$}%
  263.      \setbox3=\hbox{$\mkern -3mu \mpr@body\mkern -3mu$}%
  264.      \dimen0=\dp1\advance\dimen0 by \ht3\relax\dp1\dimen0\relax
  265.      \dimen0=\ht2\advance\dimen0 by \dp3\relax\ht2\dimen0\relax
  266.      \setbox0=\hbox {$\box1 \@@atop \box2$}%
  267.      \dimen0=\wd0\box0
  268.      \box0 \hskip -\dimen0\relax
  269.      \hbox to \dimen0 {$%
  270.        \mathrel{\mpr@tail}\joinrel
  271.       \xleaders\hbox{\copy3}\hfil\joinrel\mathrel{\mpr@head}%
  272.      $}}}
  273.  
  274. %% Old stuff should be removed in next version
  275. \def \mpr@@nothing #1#2
  276.     {$\lower 0.01pt \mpr@@nofraction {#1}{#2}$}
  277. \def \mpr@@reduce #1#2{\hbox
  278.    {$\lower 0.01pt \mpr@@fraction {#1}{#2}\mkern -15mu\rightarrow$}}
  279. \def \mpr@@rewrite #1#2#3{\hbox
  280.    {$\lower 0.01pt \mpr@@fraction {#2}{#3}\mkern -8mu#1$}}
  281. \def \mpr@infercenter #1{\vcenter {\mpr@hovbox{T}{#1}}}
  282.  
  283. \def \mpr@empty {}
  284. \def \mpr@inferrule
  285.  {\bgroup
  286.     \ifnum \linewidth<\hsize \hsize \linewidth\fi
  287.     \mpr@rulelineskip
  288.     \let \and \qquad
  289.     \let \hva \mpr@hva
  290.     \let \@rulename \mpr@empty
  291.     \let \@rule@options \mpr@empty
  292.     \let \mpr@over \@@over
  293.     \mpr@inferrule@}
  294. \newcommand {\mpr@inferrule@}[3][]
  295.  {\everymath={\displaystyle}%      
  296.    \def \@test {#2}\ifx \empty \@test
  297.      \setbox0 \hbox {$\vcenter {\mpr@hovbox{B}{#3}}$}%
  298.    \else
  299.    \def \@test {#3}\ifx \empty \@test
  300.      \setbox0 \hbox {$\vcenter {\mpr@hovbox{T}{#2}}$}%
  301.    \else
  302.    \setbox0 \mpr@fraction {\mpr@hovbox{T}{#2}}{\mpr@hovbox{B}{#3}}%
  303.    \fi \fi
  304.    \def \@test {#1}\ifx \@test\empty \box0
  305.    \else \vbox
  306. %%% Suggestion de Francois pour les etiquettes longues
  307. %%%   {\hbox to \wd0 {\RefTirName {#1}\hfil}\box0}\fi
  308.       {\hbox {\RefTirName {#1}}\box0}\fi
  309.   \egroup}
  310.  
  311. \def \mpr@vdotfil #1{\vbox to #1{\leaders \hbox{$\cdot$} \vfil}}
  312.  
  313. % They are two forms
  314. % \inferrule [label]{[premisses}{conclusions}
  315. % or
  316. % \inferrule* [options]{[premisses}{conclusions}
  317. %
  318. % Premisses and conclusions are lists of elements separated by \\
  319. % Each \\ produces a break, attempting horizontal breaks if possible,
  320. % and  vertical breaks if needed.
  321. %
  322. % An empty element obtained by \\\\ produces a vertical break in all cases.
  323. %
  324. % The former rule is aligned on the fraction bar.
  325. % The optional label appears on top of the rule
  326. % The second form to be used in a derivation tree is aligned on the last
  327. % line of its conclusion
  328. %
  329. % The second form can be parameterized, using the key=val interface. The
  330. % folloiwng keys are recognized:
  331. %      
  332. %  width                set the width of the rule to val
  333. %  narrower             set the width of the rule to val\hsize
  334. %  before               execute val at the beginning/left
  335. %  lab                  put a label [Val] on top of the rule
  336. %  lskip                add negative skip on the right
  337. %  left                 put a left label [Val]
  338. %  Left                 put a left label [Val],  ignoring its width
  339. %  right                put a right label [Val]
  340. %  Right                put a right label [Val], ignoring its width
  341. %  leftskip             skip negative space on the left-hand side
  342. %  rightskip            skip negative space on the right-hand side
  343. %  vdots                lift the rule by val and fill vertical space with dots
  344. %  after                execute val at the end/right
  345. %  
  346. %  Note that most options must come in this order to avoid strange
  347. %  typesetting (in particular  leftskip must preceed left and Left and
  348. %  rightskip must follow Right or right; vdots must come last
  349. %  or be only followed by rightskip.
  350. %  
  351.  
  352. %% Keys that make sence in all kinds of rules
  353. \def \mprset #1{\setkeys{mprset}{#1}}
  354. \define@key {mprset}{andskip}[]{\mpr@andskip=#1}
  355. \define@key {mprset}{lineskip}[]{\lineskip=#1}
  356. \define@key {mprset}{lessskip}[]{\lineskip=0.5\lineskip}
  357. \define@key {mprset}{flushleft}[]{\mpr@centerfalse}
  358. \define@key {mprset}{center}[]{\mpr@centertrue}
  359. \define@key {mprset}{rewrite}[]{\let \mpr@fraction \mpr@@rewrite}
  360. \define@key {mprset}{atop}[]{\let \mpr@fraction \mpr@@nofraction}
  361. \define@key {mprset}{myfraction}[]{\let \mpr@fraction #1}
  362. \define@key {mprset}{fraction}[]{\def \mpr@fraction {\mpr@make@fraction #1}}
  363. \define@key {mprset}{sep}{\def\mpr@sep{#1}}
  364. \newbox \mpr@right
  365. \define@key {mpr}{flushleft}[]{\mpr@centerfalse}
  366. \define@key {mpr}{center}[]{\mpr@centertrue}
  367. \define@key {mpr}{rewrite}[]{\let \mpr@fraction \mpr@@rewrite}
  368. \define@key {mpr}{myfraction}[]{\let \mpr@fraction #1}
  369. \define@key {mpr}{fraction}[]{\def \mpr@fraction {\mpr@make@fraction #1}}
  370. \define@key {mpr}{left}{\setbox0 \hbox {$\TirName {#1}\;$}\relax
  371.     \advance \hsize by -\wd0\box0}
  372. \define@key {mpr}{width}{\hsize #1}
  373. \define@key {mpr}{sep}{\def\mpr@sep{#1}}
  374. \define@key {mpr}{before}{#1}
  375. \define@key {mpr}{lab}{\let \RefTirName \TirName \def \mpr@rulename {#1}}
  376. \define@key {mpr}{Lab}{\let \RefTirName \TirName \def \mpr@rulename {#1}}
  377. \define@key {mpr}{narrower}{\hsize #1\hsize}
  378. \define@key {mpr}{leftskip}{\hskip -#1}
  379. \define@key {mpr}{reduce}[]{\let \mpr@fraction \mpr@@reduce}
  380. \define@key {mpr}{rightskip}
  381.  {\setbox \mpr@right \hbox {\unhbox \mpr@right \hskip -#1}}
  382. \define@key {mpr}{LEFT}{\setbox0 \hbox {$#1$}\relax
  383.     \advance \hsize by -\wd0\box0}
  384. \define@key {mpr}{left}{\setbox0 \hbox {$\TirName {#1}\;$}\relax
  385.     \advance \hsize by -\wd0\box0}
  386. \define@key {mpr}{Left}{\llap{$\TirName {#1}\;$}}
  387. \define@key {mpr}{right}
  388.  {\setbox0 \hbox {$\;\TirName {#1}$}\relax \advance \hsize by -\wd0
  389.   \setbox \mpr@right \hbox {\unhbox \mpr@right \unhbox0}}
  390. \define@key {mpr}{RIGHT}
  391.  {\setbox0 \hbox {$#1$}\relax \advance \hsize by -\wd0
  392.   \setbox \mpr@right \hbox {\unhbox \mpr@right \unhbox0}}
  393. \define@key {mpr}{Right}
  394.  {\setbox \mpr@right \hbox {\unhbox \mpr@right \rlap {$\;\TirName {#1}$}}}
  395. \define@key {mpr}{vdots}{\def \mpr@vdots {\@@atop \mpr@vdotfil{#1}}}
  396. \define@key {mpr}{after}{\edef \mpr@after {\mpr@after #1}}
  397. \newcommand \mpr@inferstar@ [3][]{\setbox0
  398.  \hbox {\let \mpr@rulename \mpr@empty \let \mpr@vdots \relax
  399.         \setbox \mpr@right \hbox{}%
  400.          $\setkeys{mpr}{#1}%
  401.           \ifx \mpr@rulename \mpr@empty \mpr@inferrule {#2}{#3}\else
  402.          \mpr@inferrule [{\mpr@rulename}]{#2}{#3}\fi
  403.          \box \mpr@right \mpr@vdots$}
  404.  \setbox1 \hbox {\strut}
  405.  \@tempdima \dp0 \advance \@tempdima by -\dp1
  406.  \raise \@tempdima \box0}
  407.  
  408. \def \mpr@infer {\@ifnextchar *{\mpr@inferstar}{\mpr@inferrule}}
  409. \newcommand \mpr@err@skipargs[3][]{}
  410. \def \mpr@inferstar*{\ifmmode
  411.    \let \@do \mpr@inferstar@
  412.  \else
  413.    \let \@do \mpr@err@skipargs
  414.    \PackageError {mathpartir}
  415.      {\string\inferrule* can only be used in math mode}{}%
  416.   \fi \@do}
  417.  
  418.  
  419. %%% Exports
  420.  
  421. % Envirnonment mathpar
  422.  
  423. \let \inferrule \mpr@infer
  424.  
  425. % make a short name \infer is not already defined
  426. \@ifundefined {infer}{\let \infer \mpr@infer}{}
  427.  
  428. \def \TirNameStyle #1{\small \textsc{#1}}
  429. \def \tir@name #1{\hbox {\small \TirNameStyle{#1}}}
  430. \let \TirName \tir@name
  431. \let \DefTirName \TirName
  432. \let \RefTirName \TirName
  433.  
  434. %%% Other Exports
  435.  
  436. % \let \listcons \mpr@cons
  437. % \let \listsnoc \mpr@snoc
  438. % \let \listhead \mpr@head
  439. % \let \listmake \mpr@makelist
  440.  
  441.  
  442.  
  443.  
  444. \endinput
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement