% logofram.sty    Copyright Supélec - Service Informatique, 1997
%
% Note : la checksum suivante n'est valable qu'en code ISO latin 1.
%        Si ce fichier a été transcodé, elle est incorrecte, ce 
%        qui n'implique pas que ce fichier soit endommagé.
%
%           %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%           % checksum = "19923 454 1959 18159" %
%           %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% Style de transparents pour Seminar, cadre avec logo
%   Frédéric Boulanger <Frederic.Boulanger@supelec.fr>
%   Novembre 1997
%
% Ce style de transparents à utiliser avec seminar offre les fonctionalités
% suivantes :
%  - marges permettant d'occuper au mieux la surface des transparents
%  - option stylus pour tenir compte de la zone d'impression réduite à 
%    droite de l'Epson Stylus Pro
%  - cadres d'épaisseur 1pt par défaut (\slideframewidth)
%  - séparation cadre/contenu nulle (\slideframesep)
%  - activation de la correction des dimensions pour epsf.sty
%  - correction du bug concernant \@savsf et \begin{note}...\end{note}
%  - traduction Slide -> Transparent si le style french est activé
%
%  - commande \slidetitle pour générer des titres encadrés
%    - \slidetitle{texte} affiche <titre> en sans serif gras \large 
%      dans une parbox de largeur 70% du transparent. Un espace d'1cm 
%      est laissé avant le titre, et un \smallskip est inséré après.
%
%  - environnement slidelist pour créer des listes compactes avec 
%    marge réglable.
%      - \begin{slidelist}[marge] ... \end{slidelist} crée une liste 
%        de marge <marge>. Si l'argument marge est omis, la marge est 
%        choisie pour que les articles de la liste soient alignés sous
%        le bord gauche des titres généré avec \slidetitle.
%      - \defaultlistlabel{lab} affecte <lab> au label par défaut des 
%        slidelist. Par défaut, ce label est \textbf{\hfill --}.
%
%  - style de page vide par défaut pour les transparents (meilleur 
%    choix pour logoframe).
%
%  - cadre logoframe à sélectionner avec \slideframe{logoframe}. Ce 
%    cadre permet de positionner un logo en haut à gauche des 
%    transparents, le nom et l'adresse e-mail de l'auteur à droite au 
%    dessus du cadre, et un pied de page sous le cadre. Ainsi, les 
%    transparents apparaissent identiques avec l'option article et 
%    avec l'option slidesonly puisque le pied de page n'est plus 
%    défini dans un style de page.
%      - \slideslogo{logo} définit le logo à afficher
%      - \logoxoffset et \logoyoffset sont les facteurs de retrait du 
%        logo par rapport au cadre, exprimés en fractions de 
%        \slidesleftmargin et \slidestopmargin respectivement.
%        Ces valeurs sont habituellement positives pour provoquer le 
%        rapprochement du logo des bords du transparents. Dans ce cas, 
%        le cadre est interrompu de façon à ne pas surcharger le logo.
%        Ces deux commandes peuvent être redéfinies avec \renewcommand. 
%        Leur valeur par défaut est 0.5.
%      - \logoxspace et \logoyspace sont les dimensions laissées 
%        blanches respectivement à droite et sous le logo. Elles 
%        peuvent être modifiées par \setlength. Leur valeur par 
%        défaut est 3mm.
%      - \logoauthor{nom} indique que le nom de l'auteur apparaîssant 
%        à droite au dessus du cadre doit être <nom>
%      - \logoemail{email} indique que le nom de l'auteur sera suivi 
%        de l'adresse <email> (un \quad sépare les deux). Si vous 
%        utilisez french, n'oubliez par que < se dit \inferieura et 
%        que > se dit \superieura.
%      - \logoauthorstyle définit le style du pied de page. Il peut 
%        être redéfini par \renewcommand, et sa valeur par défaut
%        est \ttfamily\tiny
%      - \logofoot{pied} indique que <pied> doit être affiché en 
%        dessous du cadre. <pied> peut comporter le numéro du 
%        transparent (\theslide) puisque le style de page est empty.
%      - \logofootstyle définit le style du pied de page. Il peut 
%        être redéfini par \renewcommand, et sa valeur par défaut 
%        est \scriptsize
%
%  - une macro \pfbox{texte}{x}{y} est définie pour les besoins de 
%    logoframe. Cette macro trace un cadre autour de <texte> en 
%    laissant une ouverture de largeur <x> et de hauteur <y> en haut à 
%    gauche du cadre (pour laisser sortir le logo).
%    \pfbox{texte}{0pt}{0pt} à le même effet que \fbox{texte}
%
%% Exemple d'utilisation :
% %&latex
% \documentclass[a4,notes]{seminar}
% \usepackage{epsf}   % fonctionne mieux que graphics avec seminar
% \usepackage{french} % indispensable...
% \usepackage{logofram} % mon style de cadre perso
% \noxcomment         % je préfère désactiver ce truc et placer
%                     % mes notes entre \begin{note} et \end{note}
% \slideframe{logoframe} % je choisis mon cadre avec logo
% \slideslogo{\fbox{\textsf{Fait avec Seminar!}}} % mon logo!
% \setlength{\logoxspace}{0pt}
% \setlength{\logoyspace}{0pt}
% \logoauthor{Frédéric Boulanger} % mon nom
% \logoemail{\inferieura Frederic.Boulanger@supelec.fr\superieura}
% \logofoot{%
%   \makebox[0pt][l]{\today}
%   \hfill
%   Un exposé passionnant
%   \hfill
%   \makebox[0pt][r]{\theslide}%
% }
% \centerslidesfalse % Ne pas centrer verticalement les transparents
% \begin{document}
% %% Transparent 1
% \begin{slide}
%   \begin{center}
%     \slidetitle{Un exposé passionnant}
%     \textsf{\small Frédéric Boulanger\\ Supélec --- Service Informatique}
%     \par\medskip
%     \begin{slidelist}
%       \item Introduction
%       \item Thèse
%       \item Antithèse
%       \item Synthèse
%       \item Foothèse
%       \item Conclusion
%     \end{slidelist}
%   \end{center}
% \end{slide}
% %% Note du transparent 1
% \begin{note}
% Nous présenterons notre réflexion en commençant par décrire le cadre 
% de notre démarche, puis la thèse que nous défendons ainsi que les 
% arguments qui y sont opposables.
% 
% Nous ferons ensuite la synthèse de ces arguments pour en déduire que 
% cet exposé n'est pas bien passionant. En conclusion, nous évoquerons 
% les perspectives d'exposés encore plus stimulants pour votre 
% digestion, surtout après une bonne choucroute.
% \end{note}
% \end{document}
%
%%
\def\fileversion{v1.1}
\def\filedate{1997/11/12}

\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{logofram}[\filedate\space\fileversion]
\@ifclassloaded{seminar}{%
  \typeout{%
    Package: `logofram' \fileversion\space\filedate,
    Frederic.Boulanger@supelec.fr
  }
}{%
  \PackageError{logofram}{%
    seminar documentclass required
  }{%
    The logofram package can be used only in seminar documents.^^J%
    You should have \string\documentclass{seminar} at the beginning of 
    your document.
  }
}
\DeclareOption{stylus}{% Agrandit la marge droite pour l'Epson Stylus
	\renewcommand{\sliderightmargin}{0.7in}%
}
%% Modification des marges pour mieux occuper le transparent
\renewcommand{\slidetopmargin}{0.4in} % ajusté pour que ça fasse << beau >>
\renewcommand{\slidebottommargin}{0.6in}
\renewcommand{\slideleftmargin}{0.5in}
\renewcommand{\sliderightmargin}{0.5in}
%% Traitement des options (éventuelle modification des marges)
\ProcessOptions
% Je calcule la taille du transparent à partir de la taille
% du papier et des marges que je viens de définir
\setlength{\slidewidth}{\paperheight}
\addtolength{\slidewidth}{-\slideleftmargin}
\addtolength{\slidewidth}{-\sliderightmargin}
\setlength{\slideheight}{\paperwidth}
\addtolength{\slideheight}{-\slidetopmargin}
\addtolength{\slideheight}{-\slidebottommargin}

%% Paramètres des cadres
\setlength{\slideframesep}{0pt}   % pour éviter les débordements
\setlength{\slideframewidth}{1pt} % plus joli que les 4pt de défaut

%% Ajustement des dimensions pour que epsf.sty 
%  tienne compte de la magnification
\epsfslidesize

%% Si \@savsf est nul, on le met à un pour éviter un problème
%  avec l'environnement note
\ifnum\@savsf=0
  \@savsf=1
\fi

%% On redéfinit \slidelabel pour que, lorsque french est utilisé et 
%  que les traductions de french sont actives, on ait Transparent
%  au lieu de Slide avec l'option article
\let\slidelabel@ori\slidelabel % on mémorise la définition d'origine
\def\fr@nchslidel@bel{%   label quand french est utilisé
  \ifFTR%                 si les traductions sont actives...
    \textbf{Transparent \theslide}%
  \else%                  sinon, on garde l'ancienne définition
    \slidelabel@ori%
  \fi%
}
\def\slidelabel{% utilise \fr@nchslidel@bel ou \slidelabel@ori
  \expandafter\ifx\csname ifFTR\endcsname\relax%
    \slidelabel@ori%
  \else%
    \fr@nchslidel@bel%
  \fi%
}

%% Titres et listes
% \slidetitle affiche un titre centré en gras dans un cadre occupant
% 70% de la largeur du transparent. On peut appeler plusieurs fois
% cette commande dans un même transparent, cela génère un nouveau 
% cadre à chaque fois
\newcommand{\slidetitle}[1]{%
  \vspace*{1\semcm}\fbox{%
    \parbox[c]{0.7\textwidth}{%
      \begin{center}
        \textsf{\textbf{\large #1}}
      \end{center}%
    }%
  }\par\smallskip%
}

%% Liste à marge réglable et plus tassée que les listes de LaTeX
% L'argument optionel est la marge de la liste. Par défaut, cette marge
% aligne les articles sur le bord gauche des cadres de titre générés
% par \slidetitle.
% Le label par défaut peut être changé grâce à \defaultlistlabel
\newenvironment{slidelist}[1][\def@ultlistl@belwidth]{%
  \begin{list}{\def@ultlistl@bel}{%
    \setlength{\topsep}{0pt}
    \setlength{\itemsep}{0pt}
    \setlength{\parsep}{0pt}
    \setlength{\leftmargin}{#1}
    \setlength{\rightmargin}{1\semcm}
    \setlength{\listparindent}{0pt}
    \setlength{\itemindent}{0pt}
    \setlength{\labelsep}{0.5em}
    \setlength{\labelwidth}{\leftmargin}
    \addtolength{\labelwidth}{-\labelsep}
    \renewcommand{\makelabel}[1]{\hfil ##1}
  }
}{%
  \end{list}
}

\newcommand{\defaultlistlabel}[1]{%
  \renewcommand{\def@ultlistl@bel}{#1}%
  \settowidth{\def@ultlistl@belwidth}{#1}%
  \addtoslidelength\def@ultlistl@belwidth{0.15\slidewidth}%
}

% Label par défaut pour \slidelist
\newcommand{\def@ultlistl@bel}{\textbf{\hfill --}}
\newlength{\def@ultlistl@belwidth}
\settowidth{\def@ultlistl@belwidth}{\def@ultlistl@bel}
\addtoslidelength{\def@ultlistl@belwidth}{0.15\slidewidth}

%% On choisit le style empty par défaut car plain ne va pas avec logoframe
\slidepagestyle{empty}

%% Nouveau style de cadres avec logo, nom de l'auteur et pied de page
%  à choisir avec \slideframe{logoframe}
% Les paramètres du style de cadre sont :
%  \slideslogo{logo} définit le logo à placer en haut à gauche du cadre
%  \logoxoffset{px}  retrait horizontal du logo = px*\slidesleftmargin
%                    une valeur > 0 rapproche le logo du bord de la page
%  \logoxoffset{py}  retrait vertical du logo = py*\slidestopmargin
%                    une valeur > 0 rapproche le logo du haut de la page
%  \logoxspace       dimension blanche après le bord droit du logo
%  \logoyspace       dimension blanche sous le bord inférieur du logo
%  \logoauthor{nom}  définit le nom de l'auteur à placer au dessus du cadre
%  \logoemail{email} définit l'adresse e-mail à placer au dessus du cadre
%  \logoauthorstyle  à redéfinir pour choisir le style du nom/e-mail
%  \logofoot{pied}   définit le pied de page à placer sous le cadre
%  \logofootstyle    à redéfinir pour choisir le style du pied

\newcommand{\slideslogo}[1]{  % pour choisir le logo
  \sbox{\l@g@f@rslid@sb@x}{#1}%
}
\newcommand{\logoxoffset}{0.5} % facteur de retrait horizontal du logo
\newcommand{\logoyoffset}{0.5} % facteur de retrait vertical du logo
\newlength{\logoxspace}        % espace horizontal après le logo
\newlength{\logoyspace}        % espace vertical en dessous du logo

\newcommand{\logoauthor}[1]{%  pour définir le nom de l'auteur
  \renewcommand{\@uth@rf@rslid@s}{#1}%
}
\newcommand{\logoemail}[1]{%   pour définir l'adresse e-mail de l'auteur
  \renewcommand{\em@ilf@rslid@s}{#1}%
}
\newcommand{\logoauthorstyle}{% à redéfinir pour le style auteur/e-mail
  \ttfamily\tiny%
}
\newcommand{\logofoot}[1]{%   pour choisir le pied de page
  \renewcommand{\f@@tf@rslid@s}{#1}%
}
\newcommand{\logofootstyle}{% à redéfinir pour le style du pied de page
  \scriptsize%
}
%% Tout ce qu'il faut pour ce cadre...
\newsavebox{\l@g@f@rslid@sb@x}  % le logo à afficher en haut à gauche
\newcommand{\@uth@rf@rslid@s}{} % le nom de l'auteur
\newcommand{\em@ilf@rslid@s}{} % l'adresse email de l'auteur
\newcommand{\f@@tf@rslid@s}{}   % pied de transparent
\newlength{\l@g@slid@fr@m@h@ight} % la hauteur du transparent
\newlength{\l@g@slid@fr@m@d@pth}  % sa profondeur
\newlength{\l@g@slid@fr@m@tot@l}  % sa hauteur totale
\newlength{\l@g@slid@fr@m@width}  % et sa largeur
\newsavebox{\l@g@slid@b@x}        % une boîte pour sauver le transparent

\newlength{\l@g@x@ffset}      % retrait horizontal du logo
\newlength{\l@g@y@ffset}      % retrait vertical du logo
\setslidelength{\logoxspace}{3mm} % défaut pour l'espace à droite du logo
\setslidelength{\logoyspace}{3mm} % défaut pour l'espace sous le logo
\newlength{\l@g@x@pen}        % vide horizontal du cadre
\newlength{\l@g@y@pen}        % vide vertical du cadre

\newslideframe{logoframe}{\l@g@fr@m@{#1}} % on déclare notre frame
\newcommand{\l@g@fr@m@}[1]{% la commande qui fait effectivement le boulot
  \sbox{\l@g@slid@b@x}{#1}%  on sauve le transparent dans la boîte
  \settowidth{\l@g@slid@fr@m@width}{\usebox{\l@g@slid@b@x}}% sa largeur
  \settoheight{\l@g@slid@fr@m@h@ight}{\usebox{\l@g@slid@b@x}}% sa hauteur
  \settodepth{\l@g@slid@fr@m@d@pth}{\usebox{\l@g@slid@b@x}}% sa profondeur
  \setlength{\l@g@slid@fr@m@tot@l}{\l@g@slid@fr@m@h@ight}%
  \addtolength{\l@g@slid@fr@m@tot@l}{\l@g@slid@fr@m@d@pth}% hauteur totale
  % On determine les retraits du logo et l'espace du cadre à laisser ouvert
  \ifvoid\l@g@f@rslid@sb@x%  Pas de logo => les dimensions sont nulles
    \setlength{\l@g@x@ffset}{0pt}%
    \setlength{\l@g@y@ffset}{0pt}%
    \setlength{\l@g@x@pen}{0pt}%
    \setlength{\l@g@y@pen}{0pt}%
  \else%
    \setslidelength{\l@g@x@ffset}{\slideleftmargin}%
    \setlength{\l@g@x@ffset}{-\logoxoffset\l@g@x@ffset}%
    \setslidelength{\l@g@y@ffset}{\slidetopmargin}%
    \setlength{\l@g@y@ffset}{-\logoyoffset\l@g@y@ffset}%
    \ifdim\l@g@y@ffset <0pt%
      \setlength{\l@g@x@pen}{\wd\l@g@f@rslid@sb@x}% ouverture x du cadre
      \addtolength{\l@g@x@pen}{\l@g@x@ffset}%
      \addtolength{\l@g@x@pen}{\logoxspace}%
    \else%
      \setlength{\l@g@x@pen}{0pt}%
    \fi%
    \ifdim\l@g@x@ffset <0pt%
      \setlength{\l@g@y@pen}{\ht\l@g@f@rslid@sb@x}% ouverture y du cadre
      \setlength{\@tempdima}{\dp\l@g@f@rslid@sb@x}%
      \addtolength{\l@g@y@pen}{\@tempdima}%
      \addtolength{\l@g@y@pen}{\l@g@y@ffset}%
      \addtolength{\l@g@y@pen}{\logoyspace}%
    \else%
      \setlength{\l@g@y@pen}{0pt}%
    \fi%
  \fi%
% on met tout ça dans une parbox de même largeur
  \parbox[b]{\l@g@slid@fr@m@width}{
    \makebox[\l@g@slid@fr@m@width]{% on encadre, dans une boîte
      \pfbox{\usebox{\l@g@slid@b@x}}{\l@g@x@pen}{\l@g@y@pen}% de même 
%                                    largeur pour éviter les overfull \hbox
    }%
    \hspace*{-\l@g@slid@fr@m@width}% on revient en arrière de la largeur
    \makebox[\l@g@slid@fr@m@width]{% et on met dans la même largeur:
      \ifvoid\l@g@f@rslid@sb@x%
      \else%                       s'il y a un logo
        \hspace*{\l@g@x@ffset}%
        \setlength{\@tempdima}{\ht\l@g@f@rslid@sb@x}%
        \addtolength{\@tempdima}{\l@g@y@ffset}%
        \addtolength{\@tempdima}{-\l@g@slid@fr@m@tot@l}%
        \raisebox{-\@tempdima}[0pt][0pt]{%
          \usebox{\l@g@f@rslid@sb@x}% le logo, remonté et écrasé
%                                     pour ne pas prendre d'espace
%                                     vertical
        }%                
      \fi%
      \hfill%             et à l'autre bout de la ligne :
      {\logoauthorstyle%  l'auteur et son adresse
        \setlength{\@tempdima}{\l@g@slid@fr@m@tot@l}%
        \addtolength{\@tempdima}{\slideframesep}%
        \addtolength{\@tempdima}{\slideframewidth}%
        \addtolength{\@tempdima}{1ex}%
        \raisebox{\@tempdima}[0pt][0pt]{%
          \@uth@rf@rslid@s\quad%
          \em@ilf@rslid@s%
        }%
      }%
    }%
    \hspace*{-\l@g@slid@fr@m@width}% on revient en arrière pour le pied de 
    {\logofootstyle\raisebox{-\baselineskip}[0pt][0pt]{% transparent en
      \makebox[\l@g@slid@fr@m@width]{%  logofootstyle, et écrasé pour ne 
        \f@@tf@rslid@s%                 pas ajouter d'espace vertical
      }%
    }}%
  }%
}

% \pfbox{texte}{largeur}{hauteur} encadre partiellement <texte> en laissant
% un trou de largeur <largeur> et de hauteur <hauteur> en haut à gauche du
% cadre. Les dimensions \fboxrule et \fboxsep n'ont pas à être incluses 
% dans <largeur> et <hauteur>, \pfbox le fait pour vous.
% Cette définition est une version modifiée de la macro \fbox de LaTeX.
\long\def\pfbox#1#2#3{%
  \leavevmode%
  \setbox\@tempboxa\hbox{%
    \color@begingroup
      \kern\fboxsep{#1}\kern\fboxsep
    \color@endgroup%
  }%
  \@tempdima\fboxrule
  \advance\@tempdima\fboxsep
  \advance\@tempdima\dp\@tempboxa
  \@tempdimb\wd\@tempboxa
  \advance\@tempdimb\fboxrule
  \advance\@tempdimb-\fboxsep
  \advance\@tempdimb -#2%
  \@tempdimc\ht\@tempboxa
  \advance\@tempdimc\dp\@tempboxa
  \advance\@tempdimc\fboxsep
  \advance\@tempdimc -#3%
  \hbox{%
    \lower\@tempdima\hbox{%
      \vbox{%
        \offinterlineskip
        \ifdim#2=0pt%
          \hrule\@height\fboxrule%
        \else%
          \hbox{%
            \hskip\fboxrule%
            \hskip\fboxsep%
            \hskip#2%
            \vrule\@height\fboxrule\@width\@tempdimb%
          }%
        \fi%
        \hbox{%
          \ifdim#3=0pt%
            \vrule\@width\fboxrule%
          \else%
            \vbox{%
              \vskip\fboxsep
              \vskip #3%
              \hrule\@height\@tempdimc\@width\fboxrule%
            }%
          \fi%
          \vbox{%
            \vskip\fboxsep
            \box\@tempboxa
            \vskip\fboxsep%
          }%
          \vrule\@width\fboxrule%
        }%
        \hrule\@height\fboxrule%
      }%
    }%
  }%
}
