commit 13480dc69dcd9bb35e9e55be956e3b2f76baf966 Author: Yann Salmon Date: Wed Feb 21 19:12:43 2018 +0100 commit initial diff --git a/latex/commun.bib b/latex/commun.bib new file mode 100644 index 0000000..e69de29 diff --git a/latex/conversion.py b/latex/conversion.py new file mode 100644 index 0000000..bd67711 --- /dev/null +++ b/latex/conversion.py @@ -0,0 +1,33 @@ +def code(s) : + try : + debut = s.index(r"\begin{tabbing}") + fin = s.index(r"\end{tabbing}") + pos_let = s.index("let", debut) + if s[pos_let+3:].startswith(" rec") : + pos_let = pos_let + 4 + pos_nom = s.index(" ", pos_let) + 1 + fin_nom = s.index(" ", pos_nom) + nom = s[pos_nom:fin_nom] + repl = r"\lstinputcaml[linerange="+nom+"-"+nom+"_fin]{ccp2004.ml}\n" + news = s[:debut] + repl + s[fin + len(r"\end{tabbing}"):] + return code(news) + except ValueError : + return s + +def caml(s, start=0) : + try : + pos_let = s.index("\nlet", start) + fin = s.index(r";;", pos_let) + print(s[pos_let:fin+3]) + if s[pos_let+4:].startswith(" rec") : + delta = 5 + else : + delta = 0 + pos_nom = s.index(" ", pos_let + delta) + 1 + fin_nom = s.index(" ", pos_nom) + nom = s[pos_nom:fin_nom] + print(nom) + news = s[:pos_let] + "(*** " + nom + " ***)" + s[pos_let:fin+3] + "(*** " + nom + "_fin ***)\n" + s[fin+3:] + return caml(news, fin + 3 + len("(*** " + nom + " ***)")+ len("(*** " + nom + "_fin ***)\n")) + except ValueError : + return s \ No newline at end of file diff --git a/latex/inputDS.tex b/latex/inputDS.tex new file mode 100644 index 0000000..a7a9be2 --- /dev/null +++ b/latex/inputDS.tex @@ -0,0 +1,3 @@ +\subimport{./}{inputTD} + +\endinput \ No newline at end of file diff --git a/latex/inputTD.tex b/latex/inputTD.tex new file mode 100644 index 0000000..181efd0 --- /dev/null +++ b/latex/inputTD.tex @@ -0,0 +1,81 @@ +\makeatletter +\@ifundefined{stylecentrale} +{\def\resetlevel{section}} +{% +\renewcommand\thesection{\Roman{section}}% +\renewcommand\thesubsection{\thesection.\Alph{subsection}}% +\def\resetlevel{subsection} +} + + +\theoremstyle{plain} +\theoremheaderfont{\bfseries} +\theorembodyfont{\upshape} +\theoremseparator{. } +\theoremsymbol{} +\newtheorem*{important}{Important} +\newtheorem*{rappel}{Rappel} + +\usepackage{xfrac} +\usepackage{xparse} +\usepackage{comment} + +\newif\ifcorrige +\def\corr{\filigrane{\Huge CORRIG\'E --- CORRIG\'E}\global\corrigetrue} +\newif\ifcorrigeseul +\def\corrseul{\filigrane{\Huge CORRIG\'E --- CORRIG\'E}\global\corrigeseultrue} + +\usepackage{xstring} +\IfEndWith{\jobname}{\detokenize{-ENONCE}}{\let\corr\relax\let\corrseul\relax}{} +\IfEndWith{\jobname}{\detokenize{-PROF}}{\corr\let\corr\relax\let\corrseul\relax}{} +\IfEndWith{\jobname}{\detokenize{-CORRIGE}}{\corrseul\let\corr\relax\let\corrseul\relax}{} + +\def\pasenonce{ + \excludecomment{question} + \excludecomment{enonce} + \excludecomment{qcmrep} + \excludecomment{qcm} + } + +\def\avecenonce{\newenvironment{enonce}{}{} + \newtheorem{question}{Question}[\resetlevel] + \def\skipcorrige{} + \newtheorem{qcm}{QCM} + % + \NewDocumentEnvironment{qcmrep}{o} + {\IfValueT{##1}{\begingroup\setlength\columnseprule{0pt}\begin{multicols}{##1}}\begin{enumerate}\renewcommand\theenumi{\Alph{enumi}}}{\end{enumerate}\IfValueT{##1}{\end{multicols}\endgroup}}} + + + + + +\AtBeginDocument{% +\ifcorrige + \immediate\typeout{Mode professeur} + \makeatletter\IfStrEq{\@subtitle}{}{}{\subtitle{Corrigé}}\makeatother + \newenvironment{corrige}{\begin{mdframed}[backgroundcolor=gray!20, skipbelow=1ex]}{\end{mdframed}} + \newenvironment{comcorrige}{\begin{mdframed}[backgroundcolor=gray!20, skipbelow=1ex]}{\end{mdframed}} + \newenvironment{qcmcorr}{\begin{mdframed}[backgroundcolor=gray!20, skipbelow=1ex]}{\end{mdframed}} + \avecenonce +\else\ifcorrigeseul + \immediate\typeout{Mode corrige} + \makeatletter\IfStrEq{\@subtitle}{}{}{\subtitle{Corrigé}}\makeatother + \pasenonce + \newtheorem{corrige}{Question}[\resetlevel] + \newtheorem{qcmcorr}{QCM} + \newenvironment{comcorrige}{}{} + \def\skipcorrige{\stepcounter{corrige}} +\else + \immediate\typeout{Mode enonce} + \excludecomment{corrige} + \excludecomment{comcorrige} + \excludecomment{qcmcorr} + \avecenonce +\fi\fi +} + +\DeclareInstance{xfrac}{cinqdemi}{text}{scale-factor=1, h-scale=1.25, slash-left-kern=-2.5pt, slash-right-kern=-2.25pt} + +\def\cinqdemi{\sfrac[cinqdemi]{5}{2}} + +\endinput \ No newline at end of file diff --git a/latex/logique.py b/latex/logique.py new file mode 100644 index 0000000..26c8037 --- /dev/null +++ b/latex/logique.py @@ -0,0 +1,47 @@ +import itertools + +def dA(s) : + return s[0] and s[1] and not s[2] + +def dB(s) : + return not s[2] + +def dC(s) : + return (s[1] or not s[0]) and not (s[1] and not s[0]) + +def dmA(s) : + return s[0] == dA(s) + +def dmB(s) : + return s[1] == dB(s) + +def dmC(s) : + return s[2] == dC(s) + +def OK(s) : + return dmA(s) and dmB(s) and dmC(s) + +def table(nvar, lf) : + produit = list(itertools.product([False, True], repeat=nvar)) + table = [] + for s in produit : + ligne = {"s" : s} + for f in lf : + ligne[f.__name__] = f(s) + table.append(ligne) + return table + +def table_to_latex(table, vars, lf) : + fb = lambda b : r"\V" if b else r"\F" + #keys = [x for x in sorted(list(table[0].keys())) if x!="s"] + keys = [f.__name__ for f in lf] + print(r"\begin{array}{"+ "|".join(["c"] * len(vars)) + "||" + "|".join(["c"] * len(keys)) + "}") + print("&".join(vars + [x for x in keys])+r"\\") + print(r"\hline") + for l in table : + print("&".join([fb(x) for x in l["s"]]+[fb(l[k]) for k in keys]),r"\\", sep="") + print(r"\end{array}") + +def table_latex(vars, lf) : + t = table(len(vars), lf) + table_to_latex(t, vars, lf) \ No newline at end of file diff --git a/latex/maketd.py b/latex/maketd.py new file mode 100755 index 0000000..5203e4b --- /dev/null +++ b/latex/maketd.py @@ -0,0 +1,21 @@ +#!/usr/bin/env python3 + +import subprocess +import sys +import os + +def compiler(nf, suff) : + basedir = os.path.dirname(nf) + builddir = os.path.join(basedir, "_build") + basejobname = os.path.splitext(os.path.basename(nf))[0] + subprocess.call(["latexmk", "-pdflua", "-shell-escape", "-bibtex-cond", "-cd", "-interaction=batchmode", "-dvi-", "-jobname="+basejobname+suff, "-outdir=" + builddir, "-latexoption=\"--output-directory="+builddir+"\"", nf]) + os.rename(os.path.join(builddir, basejobname+suff+".pdf"), os.path.join(basedir, basejobname+suff+".pdf")) + + + +def clean(nf, suff) : + subprocess.call(["latexmk", "-cd", "-c", "-jobname="+os.path.splitext(os.path.basename(nf))[0]+suff, nf]) + +for suff in ["-ENONCE", "-PROF", "-CORRIGE"] : + compiler(sys.argv[1], suff) + diff --git a/latex/paquets.tex b/latex/paquets.tex new file mode 100644 index 0000000..b125686 --- /dev/null +++ b/latex/paquets.tex @@ -0,0 +1,102 @@ +\makeatletter +\usepackage{ifluatex} +\ifluatex + \usepackage{shellesc} +\fi + +\usepackage{silence} +\WarningsOff[hyperref] +\usepackage{xcolor}% +\usepackage{colortbl} +\usepackage{graphicx}% +\usepackage{fontspec} +\usepackage{babel} +\usepackage{pdfpages} +\usepackage{textcomp} +\usepackage{latexsym} +\usepackage{amsmath} +\usepackage{amssymb} +\usepackage{mathtools} + +\defaultfontfeatures{Ligatures=TeX} +\setmainfont[Renderer=ICU, SlantedFont=Gentium Basic, SlantedFeatures={FakeSlant},SmallCapsFont=Gentium Plus, SmallCapsFeatures={Letters=SmallCaps}]{Gentium Basic} +\setmonofont[FakeStretch=.7,BoldFont=Source Code Pro Semibold]{Source Code Pro} +\usepackage[math-style=ISO, bold-style=ISO]{unicode-math} +\setmathfont{texgyrepagella-math.otf}[Scale = MatchLowercase] +\setmathfont{Asana-Math.otf}[range={\varnothing}, Scale = MatchLowercase] +\setmathfont{texgyrepagella-math.otf}[range={\int}, Scale = MatchLowercase] %% https://tex.stackexchange.com/a/386937/103608 +\ifluatex +\relax +\else +\Udelcodenum`.=1073741824 %% WTF https://tex.stackexchange.com/a/386937/103608 +\fi +\AtBeginDocument{\let\setminus\smallsetminus} +\setmathfont[range=scr]{xits-math.otf} +\setmathfontface\mathcal{MnSymbol} +\setmathfontface\mathit{texgyrepagella-italic.otf}[Scale = MatchLowercase] +\setmathfontface\mathsf{texgyredejavu-math.otf}[Scale = MatchLowercase] +\def\tmit#1{\text{\fontspec{texgyrepagella-italic.otf}[Scale = MatchLowercase] #1}} +\let\mtit\tmit +\let\textdef\textit +\@ifundefined{ys@beamer}{ +\addtokomafont{disposition}{\rmfamily} +\setkomafont{descriptionlabel}{\bfseries} +}{} + + +\usepackage[babel]{csquotes} +\usepackage{microtype} +\usepackage[hang, centerlast]{subfigure} + + +\usepackage{epsfig} + + +\subimport{./}{unicode} + +\subimport{./}{ystikz} +\subimport{./}{ystheorem} + +\usepackage[backend=biber, style=alphabetic]{biblatex} +\addbibresource{commun.bib} + +\subimport{./}{yslistings} + + + +\usepackage{mdframed} +\definecolor{shadecolor}{gray}{.9} + +\usepackage{tikz} +\usepackage[printwatermark]{xwatermark} +\newsavebox\mybox + +\def\filigrane#1{% +% \savebox\mybox{\tikz[color=black,opacity=0.15]\node{#1};} +% \newwatermark*[allpages,angle=45,scale=3,xpos=0,ypos=0]{\usebox\mybox} +} + + + + + + +\usepackage{multicol} +\newenvironment{enumq}{\begin{enumerate}\renewcommand*{\theenumi}{\alph{enumi}}\@ifundefined{thequestion}{\renewcommand*\p@enumi{\thecorrige.}}{\renewcommand*\p@enumi{\thequestion.}}}{\end{enumerate}} +\newenvironment{multiq}[1]{\begin{multicols}{#1}\begin{enumq}}{\end{enumq}\end{multicols}} + +\usepackage[nolinks]{qrcode} +\def\marginqrcode#1{\marginparsep=2pt\marginparwidth=.9cm\marginpar{\qrcode[height=.9cm,level=L]{#1}}} + +\@ifundefined{ys@beamer}{ +\usepackage{hyperref} +\hypersetup{hidelinks, hyperfootnotes=false, hyperindex=false, implicit=false, bookmarks=false, pdfpagelabels=false, breaklinks=true, pdfencoding=unicode} +}{} + +\usepackage[os=win]{menukeys} +\renewmenumacro{\keys}{shadowedangularkeys} + +\subimport{./}{yssymbols} + +\makeatother +\endinput \ No newline at end of file diff --git a/latex/unicode.tex b/latex/unicode.tex new file mode 100644 index 0000000..3cee486 --- /dev/null +++ b/latex/unicode.tex @@ -0,0 +1,22 @@ +\usepackage{eurosym} +\usepackage{newunicodechar} +\newunicodechar{€}{\geneuro{}} +\newunicodechar{’}{'} +\newunicodechar{α}{\alpha} +\newunicodechar{Δ}{\Delta} +\newunicodechar{≤}{\ensuremath{\leqslant}} +\newunicodechar{⩾}{\ensuremath{\geqslant}} +\newunicodechar{«}{\guillemotleft{}} +\newunicodechar{»}{\guillemotright{}} +\newunicodechar{œ}{\oe } +\newunicodechar{−}{-} +\newunicodechar{–}{-} +\newunicodechar{↔}{\ensuremath{\leftrightarrow}} +\newunicodechar{©}{\textcopyright} +\newunicodechar{…}{\dots} +\newunicodechar{×}{\ensuremath{\times}} +\newunicodechar{·}{\ensuremath{\cdot}} +\newunicodechar{φ}{\ensuremath{\phi}} +\newunicodechar{∈}{\ensuremath{\in}} +\newunicodechar{≠}{\ensuremath{\neq}} +\endinput \ No newline at end of file diff --git a/latex/ysbeamer.tex b/latex/ysbeamer.tex new file mode 100644 index 0000000..f30bb37 --- /dev/null +++ b/latex/ysbeamer.tex @@ -0,0 +1,110 @@ +\makeatletter +\let\ys@beamer\ +\makeatother + +\subimport{./}{paquets} + +\def\seizeneuf{\usepackage[orientation=landscape,size=custom,width=16,height=9,scale=0.42]{beamerposter}} +\def\seizedix{\usepackage[orientation=landscape,size=custom,width=16,height=10,scale=0.423]{beamerposter}} + +%\seizedix + +\makeatletter + \@ifundefined{inserttotalframenumbernew}{ + \gdef\inserttotalframenumbernew{1} + }{} + \global\let\inserttotalframenumber\inserttotalframenumbernew +\makeatother + + + + +\providecommand\thispdfpagelabel[1]{} +\usetheme{Warsaw} +%\useinnertheme[shadow]{rounded} +\usecolortheme{beaver} +\setbeamertemplate{navigation symbols}{} +\setbeamertemplate{footline}{(\insertframenumber/\inserttotalframenumbernew)\hfill(\insertframenumber/\inserttotalframenumbernew)} +\usefonttheme{serif} +\usefonttheme{professionalfonts} + +\setcounter{framenumber}{-1} + + +\newdimen\monwd +\newdimen\monht +\newdimen\mondp +\def\maxdeuxt<#1>#2<#3>#4{% +\setbox0=\hbox{#2}% +\monwd=\wd0% +\monht=\ht0% +\mondp=\dp0% +\setbox0=\hbox{#4}% +\ifdim\wd0>\monwd\monwd=\wd0\fi +\ifdim\ht0>\monht\monht=\ht0\fi +\ifdim\dp0>\mondp\mondp=\dp0\fi +\setbox0=\hbox to\monwd{\hss\only<#1>{#2}\only<#3>{#4}\hss}% +\ht0=\monht\dp0=\mondp +\box0{} +} + +\def\maxtroist<#1>#2<#3>#4<#5>#6{% +\maxdeuxt<#1>{#2}<#3, #5>{\maxdeuxt<#3>{#4}<#5>{#6}} +} + +\def\maxdeuxm<#1>#2<#3>#4{% +\setbox0=\hbox{\(#2\)}% +\monwd=\wd0% +\monht=\ht0% +\mondp=\dp0% +\setbox0=\hbox{\(#4\)}% +\ifdim\wd0>\monwd\monwd=\wd0\fi +\ifdim\ht0>\monht\monht=\ht0\fi +\ifdim\dp0>\mondp\mondp=\dp0\fi +\setbox0=\hbox to\monwd{\hss\only<#1>{\(#2\)}\only<#3>{\(#4\)}\hss}% +\ht0=\monht\dp0=\mondp +\box0{} +} + +\def\maxtroism<#1>#2<#3>#4<#5>#6{% +\maxdeuxm<#1>{#2}<#3, #5>{\maxdeuxm<#3>{#4}<#5>{#6}} +} + +\def\maxdeux{\ifmmode\let\next\maxdeuxm\else\let\next\maxdeuxt\fi\next} + +\def\maxtrois{\ifmmode\let\next\maxtroism\else\let\next\maxtroist\fi\next} + +\long\def\maxdeuxv<#1>#2<#3>#4{% +\setbox0=\vbox{#2}% +\monwd=\wd0% +\monht=\ht0% +\mondp=\dp0% +\setbox0=\vbox{#4}% +\ifdim\wd0>\monwd\monwd=\wd0\fi +\ifdim\ht0>\monht\monht=\ht0\fi +\ifdim\dp0>\mondp\mondp=\dp0\fi +\setbox0=\vbox to\monht{\only<#1>{#2}\only<#3>{#4}}% +\wd0=\monwd \dp0=\mondp +\box0{} +} + +%\def\maxdeux<#1>#2<#3>#4{\alt<#1>{#2}{#4}<#3>} +%\def\maxtrois<#1>#2<#3>#4<#5>#6{\maxdeux<#1>{#2}<#3, #5>{\maxdeux<#3>{#4}<#5>{#6}}} + +\def\annuleskip{\abovedisplayskip=0pt + \abovedisplayshortskip=0pt + \belowdisplayskip=0pt + \belowdisplayshortskip=0pt} + +\setbeamercolor{alerted text}{fg=red} +%\setbeamercovered{highly dynamic} + + +\def\hbtow#1#2{\setbox0=\hbox{#2}\hbox to\wd0{\hss #1\hss}} + + \abovedisplayskip=5pt minus 3pt + \abovedisplayshortskip=0pt + \belowdisplayskip=5pt minus 3pt + \belowdisplayshortskip=2pt minus 1pt + +\endinput \ No newline at end of file diff --git a/latex/yslistings.tex b/latex/yslistings.tex new file mode 100644 index 0000000..133351f --- /dev/null +++ b/latex/yslistings.tex @@ -0,0 +1,59 @@ + +\usepackage{listings} +\usepackage{lstautogobble} +\usepackage{fontawesome} + +\newbox\codebreakbox +\setbox\codebreakbox=\hbox{\textcolor[gray]{.75}{\scriptsize\upshape\faChevronCircleRight}} + +\lstset{upquote=true,basicstyle=\ttfamily\NoAutoSpacing, keepspaces=true, columns=fullflexible, showstringspaces=false, commentstyle=\slshape, mathescape=true, stepnumber = 1, numberstyle=\scriptsize, numbersep=10pt, firstnumber=auto, breaklines=true, breakatwhitespace=true, prebreak={\copy\codebreakbox}, postbreak={\copy\codebreakbox}, autogobble, includerangemarker=false} +\lstset{literate= + {á}{{\'a}}1 {é}{{\'e}}1 {í}{{\'i}}1 {ó}{{\'o}}1 {ú}{{\'u}}1 + {Á}{{\'A}}1 {É}{{\'E}}1 {Í}{{\'I}}1 {Ó}{{\'O}}1 {Ú}{{\'U}}1 + {à}{{\`a}}1 {è}{{\`e}}1 {ì}{{\`i}}1 {ò}{{\`o}}1 {ù}{{\`u}}1 + {À}{{\`A}}1 {È}{{\'E}}1 {Ì}{{\`I}}1 {Ò}{{\`O}}1 {Ù}{{\`U}}1 + {ä}{{\"a}}1 {ë}{{\"e}}1 {ï}{{\"i}}1 {ö}{{\"o}}1 {ü}{{\"u}}1 + {Ä}{{\"A}}1 {Ë}{{\"E}}1 {Ï}{{\"I}}1 {Ö}{{\"O}}1 {Ü}{{\"U}}1 + {â}{{\^a}}1 {ê}{{\^e}}1 {î}{{\^i}}1 {ô}{{\^o}}1 {û}{{\^u}}1 + {Â}{{\^A}}1 {Ê}{{\^E}}1 {Î}{{\^I}}1 {Ô}{{\^O}}1 {Û}{{\^U}}1 + {œ}{{\oe}}1 {Œ}{{\OE}}1 {æ}{{\ae}}1 {Æ}{{\AE}}1 {ß}{{\ss}}1 + {ű}{{\H{u}}}1 {Ű}{{\H{U}}}1 {ő}{{\H{o}}}1 {Ő}{{\H{O}}}1 + {ç}{{\c c}}1 {Ç}{{\c C}}1 {ø}{{\o}}1 {å}{{\r a}}1 {Å}{{\r A}}1 + {€}{{\euro}}1 {£}{{\pounds}}1 {«}{{\guillemotleft}}1 + {»}{{\guillemotright}}1 {ñ}{{\~n}}1 {Ñ}{{\~N}}1 {¿}{{?`}}1 +} +\lstdefinestyle{numbers}{numbers = left} +\lstdefinestyle{nonumbers}{numbers = none} +\let\nm\| + +\lstdefinelanguage{mybash}[]{bash} +{ morekeywords={ls, stat}} + +\lstdefinelanguage{mysql}[]{sql} +{ morekeywords={INTER}} + +\lstdefinelanguage{mypython}[]{python} +{ morekeywords={yield, as}} + +\def\|{\lstinline[language=mypython, name=inlinepython]|} %| +\def\°{\lstinline[language={[Objective]caml}, name=inlinecaml]°} %° +\def\§{\lstinline[language=mysql, name=inlinesql]§} %§ +\def\>{\lstinline[language=mybash, name=inlineshell]>} %> +\lstnewenvironment{lstpython}[1][]{\leavevmode\lstset{language=mypython, frame=single, frameround=tttt, #1}}{} +\lstnewenvironment{lstcaml}[1][]{\leavevmode\lstset{language=[Objective]caml, frame=single, frameround=tttt, #1}}{} +\lstnewenvironment{lstsql}[1][]{\leavevmode\lstset{language=mysql, frame=single, frameround=tttt, #1}}{} +\lstnewenvironment{lstshell}[1][]{\leavevmode\lstset{language=mybash, frame=single, frameround=tttt, #1}}{} +\newcommand\lstinputcaml[1][]{\leavevmode\lstinputlisting[language={[Objective]caml}, frame=single, frameround=tttt, rangeprefix=(***\ , rangesuffix=\ ***), #1]} +\newcommand\lstinputpython[1][]{\leavevmode\lstinputlisting[language={mypython}, frame=single, frameround=tttt, rangeprefix=\#\#\#\ , rangesuffix=\ \#\#\#, #1]} +\newcommand\lstinputsql[1][]{\leavevmode\lstinputlisting[language={mysql}, frame=single, frameround=tttt, rangeprefix=---\ , rangesuffix=\ ---, #1]} + + +\lstdefinelanguage{algorithme}{% + morekeywords={Si, alors, TantQue, faire, PourChaque, FinSi, FinPour, FinTantQue, Fonction, Renvoyer, Sinon}, + sensitive=true, + morestring=[b]", + morecomment=[s]{/*}{*/} +} +\lstnewenvironment{lstalgo}[1][]{\leavevmode\lstset{columns=fullflexible, basicstyle=\rmfamily\NoAutoSpacing, language=algorithme, frame=single, frameround=tttt, #1}}{} + +\endinput \ No newline at end of file diff --git a/latex/yssymbols.tex b/latex/yssymbols.tex new file mode 100644 index 0000000..a246ead --- /dev/null +++ b/latex/yssymbols.tex @@ -0,0 +1,62 @@ + +\let\lbr\lBrack %%% Crochet double ouvrant +\let\rbr\rBrack %%% Crochet double fermant +%% Ensembles, intervalles +\def\genint#1#2#3#4#5{\mathord{\left#1#4\mathbin{#3}#5\right#2}} +\def\iff{\genint[],} +\def\ifo{\genint[[,} +\def\ioo{\genint][,} +\def\iof{\genint]],} +\def\Iff{\genint\lbr\rbr,} +\def\Ifo{\genint\lbr\lbr,} +\def\Ioo{\genint\rbr\lbr,} +\def\Iof{\genint\rbr\rbr,} +\def\R{\mathbb{R}} +\def\N{\mathbb{N}} +\def\Z{\mathbb{Z}} +\def\C{\mathbb{C}} +\def\diff{\mathrm d} +\def\enstq#1#2{\left\{ #1 \ \middle|\ #2\right\}} +\def\prive{\setminus} +\let\vec\overrightarrow + +\AtBeginDocument{ +\let\leq\leqslant +\let\geq\geqslant +\let\subset\subseteq +\let\supset\supseteq +\let\inter\cap +\let\union\cup +\let\epsilon\varepsilon +\let\kappa\varkappa +\let\phi\varphi +} + +\def\ceil#1{\left\lceil#1\right\rceil} +\def\floor#1{\left\lfloor#1\right\rfloor} +\def\i{\mathrm{i}} + + +\def\dom{\mathcal D} +\def\sem#1#2{{\mathcal {V}}_{#2}(#1)} + +\def\metab#1{\ensuremath{\langle #1\rangle}} +\def\metasyn#1{\metab{\tmit{#1}}} + +\newenvironment{specification}{\vskip-\lastskip\ \par\begin{mdframed}[skipbelow=1ex]\begin{description}}{\end{description}\end{mdframed}} + +\newenvironment{schema}[2]{\vskip-\lastskip\ \par\begin{mdframed}[skipbelow=1ex]\hfill Table \textbf{\sffamily #1}\hfill Clé primaire \textbf{\sffamily #2}\hfill \null\begin{description}}{\end{description}\end{mdframed}} + +\def\nsql#1{\textbf{\sffamily #1}} + +\def\V{\mathup{V}} +\def\F{\mathup{F}} + +\let\textterm\texttt +\def\auto{\mathcal A} +\def\lang#1{\mathscr L\left(#1\right)} +\let\peuttrans\rightsquigarrow + +\def\enspart#1{\mathscr P\left(#1\right)} + +\endinput \ No newline at end of file diff --git a/latex/ystheorem.tex b/latex/ystheorem.tex new file mode 100644 index 0000000..78b3acf --- /dev/null +++ b/latex/ystheorem.tex @@ -0,0 +1,68 @@ + + +\@ifundefined{ys@beamer}{ +\usepackage[thmmarks, hyperref, amsmath]{ntheorem} +\newtheoremstyle{breakindent}% + {\item[\rlap{\vbox{\hbox{\hskip\labelsep \theorem@headerfont + ##1\ ##2\theorem@separator}\hbox{\strut}}}]\hspace*{\parindent}}% + {\item[\rlap{\vbox{\hbox{\hskip\labelsep \theorem@headerfont + ##1\ ##2\ (##3)\theorem@separator}\hbox{\strut}}}]\hspace*{\parindent}} +\newtheoremstyle{nonumberbreakindent}% + {\item[\rlap{\vbox{\hbox{\hskip\labelsep \theorem@headerfont + ##1\theorem@separator}\hbox{\strut}}}]\hspace*{\parindent}}% + {\item[\rlap{\vbox{\hbox{\hskip\labelsep \theorem@headerfont + ##1\ (##3)\theorem@separator}\hbox{\strut}}}]\hspace*{\parindent}} + +\newtheoremstyle{demo}% + {\item[\rlap{\vbox{\hbox{\hskip\labelsep \theorem@headerfont + ##1\ ##2\theorem@separator}\hbox{\strut}}}]\hspace*{\parindent}}% + {\item[\rlap{\vbox{\hbox{\hskip\labelsep \theorem@headerfont + ##1\ ##2\ ##3\theorem@separator}\hbox{\strut}}}]\hspace*{\parindent}} +\newtheoremstyle{nonumberdemo}% + {\item[\rlap{\vbox{\hbox{\hskip\labelsep \theorem@headerfont + ##1\theorem@separator}\hbox{\strut}}}]\hspace*{\parindent}}% + {\item[\rlap{\vbox{\hbox{\hskip\labelsep \theorem@headerfont + ##1\ ##3\theorem@separator}\hbox{\strut}}}]\hspace*{\parindent}} + + +\def\rappelnumthm{{\tiny \raisebox{.25ex}{\thetheorem }}} + +\theoremstyle{breakindent} +\theorembodyfont{\upshape} +\theoremseparator{. } +\theoremsymbol{\hbox{\hspace{2em}\rappelnumthm$\blacksquare$}} +\newtheorem{theorem}[equation]{Th\'eor\`eme} +\newtheorem{lemma}[equation]{Lemme} +\newtheorem{corollary}[equation]{Corolaire} + +\theoremsymbol{\hbox{\hspace{2em}\rappelnumthm$\blacktriangleleft$}} +\newtheorem{definition}[equation]{D\'efinition} +\newtheorem{invariant}[equation]{Invariant} + + + +\theoremheaderfont{\slshape} +\makeatletter +\theoremstyle{demo} +\def\refdem#1{\gdef\numerothm{\ref{#1}}\numerothm} +\def\rappelnumdem{\@ifundefined{numerothm}{}{{\tiny \raisebox{.25ex}{D\'em. de \numerothm\ }}\global\let\numerothm\relax}} +\theoremsymbol{\hbox{\hspace{2em}\rappelnumdem$\square$}} +\newtheorem*{proof}{D\'emonstration} + + + + +\theoremsymbol{\hbox{\hspace{2em}\rappelnumthm$\vartriangleleft$}} + +\theoremstyle{breakindent} +\newtheorem{example}[equation]{Exemple} +\newtheorem{exo}[equation]{Exercice} + + +\newtheorem{remark}[equation]{Remarque} + +\theoremsymbol{} +\theoremstyle{plain} +}{} + +\endinput \ No newline at end of file diff --git a/latex/ystikz.tex b/latex/ystikz.tex new file mode 100644 index 0000000..fb37bc9 --- /dev/null +++ b/latex/ystikz.tex @@ -0,0 +1,86 @@ +\ifluatex + \def\pgfsysdriver{pgfsys-luatex.def} +\else + \def\pgfsysdriver{pgfsys-xetex.def} +\fi +\usepackage{tikz} + +\usetikzlibrary{matrix} +\usetikzlibrary{positioning} +\usetikzlibrary{fit} +\usetikzlibrary{arrows} +\usetikzlibrary{shapes} +\usetikzlibrary{decorations} +\usetikzlibrary{graphs} +\usetikzlibrary{trees} +\usetikzlibrary{babel} +\usetikzlibrary{shapes.geometric} +\usetikzlibrary{automata} +\ifluatex + \usetikzlibrary{graphdrawing} + \usegdlibrary{layered, force} +\fi + +\usepackage[external]{forest} +%\tikzexternalize +\forestset{% + default preamble={ + for tree={ + circle, + draw, + inner sep=0pt, + minimum size=.5cm, + font=\scriptsize, + edge=->, + anchor=north + } + }, + ssarbre/.style={isosceles triangle, draw, shape border rotate=90, minimum size=.7cm, child anchor=apex, anchor=apex} +} + +\tikzstyle{basevertex} = [circle, + inner sep=0pt, + minimum size=.5cm, + font=\scriptsize] + +\tikzstyle{vertex} = [basevertex, draw] + +\tikzstyle{dotvertex} = [vertex] + +\tikzset{graphs/every graph/.style={nodes={vertex}, + edges={font=\scriptsize}}} + +\tikzstyle{dotedgelbl} = [font=\scriptsize] + +\tikzstyle{invisiblevertex} = [inner sep = 0pt, outer sep = 0pt, minimum size = 0pt] + +\pgfdeclarelayer{background} +\pgfsetlayers{background,main} + +\usepackage[inputdir=./_build/]{dot2texi} + +%%% https://tex.stackexchange.com/a/26386/103608 +\usetikzlibrary{intersections} +\tikzset{ + use path for main/.code={% + \tikz@addmode{% + \expandafter\pgfsyssoftpath@setcurrentpath\csname tikz@intersect@path@name@#1\endcsname + }% + }, + use path for actions/.code={% + \expandafter\def\expandafter\tikz@preactions\expandafter{\tikz@preactions\expandafter\let\expandafter\tikz@actions@path\csname tikz@intersect@path@name@#1\endcsname}% + }, + use path/.style={% + use path for main=#1, + use path for actions=#1, + } +} +%%%/ + +%%% https://tex.stackexchange.com/questions/6135/how-to-make-beamer-overlays-with-tikz-node#6155 +%%% voir aussi https://tex.stackexchange.com/questions/99119/beamer-problematic-use-of-visible-and-only-in-combination-with-tikz-to-draw-a#99122 +\tikzset{onslide/.code args={<#1>#2}{% + \only<#1>{\pgfkeysalso{#2}} +}} + +\endinput \ No newline at end of file diff --git a/ocaml/affichage_auto.ml b/ocaml/affichage_auto.ml new file mode 100644 index 0000000..1de3b56 --- /dev/null +++ b/ocaml/affichage_auto.ml @@ -0,0 +1,114 @@ +#require "unix";; + +module Affichage = + struct + let s_o_c a = if a = '"' then + "\\\\guill" + else if a = '\\' then + "\\\\ligne" + else if a = ' ' then + "\\\\espace" + else + String.make 1 a;; + + let s_o_l a = + let lettre = s_o_c a + in "\"" ^ lettre ^ "\"";; + + let s_o_m (a, n) = + let lettre = s_o_c a in + "\"$\\text{" ^ lettre ^ "}_{" ^ (string_of_int n) ^ "}$\"";; + + let dot_auto print string_of_lettre auto = + let lien = "->" in + print ("digraph G {\n"); + for x = 0 to auto.nQ - 1 do + print ((string_of_int x) ^ "[style=\"state"); + if List.mem x auto.i then + print ",initial"; + if List.mem x auto.f then + print ",accepting"; + print ("\", label=\"" ^ (string_of_int x) ^ "\"];\n") + done; + List.iter ( + fun (q, a, q') -> + print ((string_of_int q) ^ lien ^ (string_of_int q')); + print (" [label=" ^ (string_of_lettre a) ^ "]"); + print ";\n" + ) + auto.t; + print "}\n";; + + let auto_to_file fn string_of_lettre auto = + let os = open_out fn in + let print = output_string os in + print "\\documentclass[tikz]{standalone}\n"; + print "\\usetikzlibrary{automata, positioning, shapes, snakes, arrows}\n"; + print "\\usepackage{dot2texi, amsmath}\n"; + print "\\def\\guill{\"}\n\\def\\ligne{\\textbackslash\\textbackslash}\n\\def\\espace{\\textvisiblespace}\n"; + print "\\begin{document}\n"; + print "\\begin{tikzpicture}[scale=.75,shorten >=1pt,node distance=1cm,auto, initial text={}]\n"; + print "\\begin{dot2tex}[tikz, codeonly, styleonly, options={-t raw}]\n"; + dot_auto (output_string os) string_of_lettre auto; + print "\\end{dot2tex}\n"; + (*flush os; + let fd_pipe_exit, fd_pipe_input = Unix.pipe () in + let outch_input = Unix.out_channel_of_descr fd_pipe_input in + let pid = Unix.create_process "dot2tex" [|"-f"; "tikz"; "-t"; "raw"; "--codeonly"; "--styleonly"|] (Unix.descr_of_out_channel os) fd_pipe_input Unix.stderr + in + dot_auto (output_string outch_input) string_of_lettre auto; + flush outch_input; + ignore (Unix.waitpid [Unix.WNOHANG] pid); + flush os;*) + print "\\end{tikzpicture}\n"; + print "\\end{document}"; + close_out os;; + + + let run wait cmd = + if wait then + ignore (Unix.system cmd) + else + ignore (Unix.open_process cmd);; + + let rundot fn = + let bn = try Filename.chop_extension fn with Invalid_argument _ -> fn in + let pdfn = bn^".pdf" in + run true ("latexmk -xelatex -cd -shell-escape " ^ (Filename.quote fn)); + pdfn;; + + let openPDF wait fn = + run wait ("xdg-open " ^ (Filename.quote fn));; + + let vizgraph wait fn = + let pdfn = rundot fn in + openPDF wait pdfn;; + + let rec string_of_regexp sol = function + | Vide -> "∅" + | Epsilon -> "ε" + | Lettre(x) -> sol x + | Union([]) -> "∅" + | Union([x]) -> string_of_regexp sol x + | Union(le) -> "(" ^ (String.concat "|" (List.map (fun x -> string_of_regexp sol x) le)) ^ ")" + | Concat(le) -> String.concat "" (List.map (fun x -> string_of_regexp sol x) le) + | Etoile(x) -> (string_of_regexp sol x)^"*";; + + +end + +let string_of_char = String.make 1;; +let string_of_charint (a, n) = (String.make 1 a) ^ (string_of_int n);; + +let string_of_regexp = Affichage.string_of_regexp string_of_char;; +let string_of_regexp_marques = Affichage.string_of_regexp string_of_charint;; + +let afficher_auto a = let fn = (Filename.temp_file "auto" ".tex") in + Affichage.auto_to_file fn Affichage.s_o_l a; + Affichage.vizgraph false fn;; + +let afficher_auto_marques a = let fn = (Filename.temp_file "auto" ".tex") in + Affichage.auto_to_file fn Affichage.s_o_m a; + Affichage.vizgraph false fn;; + +let string_of_list f l = "[" ^ (String.concat "; " (List.map f l)) ^"]";; diff --git a/ocaml/affichage_graphe.ml b/ocaml/affichage_graphe.ml new file mode 100644 index 0000000..1969032 --- /dev/null +++ b/ocaml/affichage_graphe.ml @@ -0,0 +1,63 @@ +#load "unix.cma";; + +(* graphe_to_dot génère la représentation dot d'un graphe orienté ou non avec +les infos issues de l'algo de Dijkstra. fn est le nom du fichier dans lequel on écrit +(recommandé : "/tmp/quelquechose.dot") + + vizgraph fn lance la compilation d'un fichier dot en un PDF puis affiche ce PDF *) + + +let graphe_to_dot fn oriente graphe marques estimations parents = + let os = open_out fn in + let print = output_string os in + if oriente then print "di"; + print "graph {\n"; + print "rankdir=\"LR\";\n"; + for x = 0 to Array.length graphe - 1 do + print (string_of_int x); + print "[label=\""; + if marques.(x) then print "*"; + print (string_of_int x); + print " ("; + if estimations.(x) = -1 then + print "∞" + else + print (string_of_int estimations.(x)); + print ")\"];\n"; + List.iter + (fun (y, w) -> if x < y || oriente then + begin + print (string_of_int x); + if oriente then print " -> " else print "--"; + print (string_of_int y); + print "[label=\""; + print (string_of_int w); + print "\" "; + if parents.(y) = x || (not oriente && parents.(x) = y) then + print ",color=\"#FF0000\", penwidth=\"3\""; + print "];\n" + end + ) + graphe.(x) + done; + print "}"; + close_out os;; + +let run wait cmd = + if wait then + ignore (Unix.system cmd) + else + ignore (Unix.open_process cmd);; + +let rundot fn = + let bn = try Filename.chop_extension fn with Invalid_argument _ -> fn in + let pdfn = bn^".pdf" in + run true ("dot -Tpdf " ^ (Filename.quote fn) ^ " -o " ^ (Filename.quote pdfn)); + pdfn;; + +let openPDF wait fn = + run wait ("evince " ^ (Filename.quote fn));; + +let vizgraph wait fn = + let pdfn = rundot fn in + openPDF wait pdfn;; diff --git a/python/afficher_graphe.py b/python/afficher_graphe.py new file mode 100644 index 0000000..71733cf --- /dev/null +++ b/python/afficher_graphe.py @@ -0,0 +1,65 @@ +## Export dot + +# La fonction importante est afficher_graphe (les autres sont auxiliaires) +# afficher_graphe(graphe, oriente, wait, distances=None, parents=None, bfn=None) +# graphe est une matrice qui représente un graphe pondéré comme ci-dessous : +# c'est une liste de listes Python ; l'absence d'arc est dénotée par un None +# orienté : True si le graphe est orienté, False sinon (la matrice graphe doit alors ^etre symétrique) +# wait : True s'il faut suspendre le programme jusqu'à ce que la fen^etre de visu soit fermée +# (pratique si on insère la visu dans la boucle de Dijkstra : on fige étape par étape) +# marques, distance, parents : comme dans Dijsktra ; si absent ou None : ne sera pas pris en compte +# bfn : le nom de fichier à utiliser ; si absent, un fichier temporaire sera utilisé. + +def export(graphe, oriente, fn, marques=None, distances=None, parents=None) : + f = open(fn, "w") + if oriente : + print("digraph {", file = f) + lien = " -> " + else : + print("graph {", file = f) + lien = " -- " + print("""rankdir="LR";""", file=f) + for noeud in range(taille(graphe)) : # énumération des noeuds + label = str(noeud) + if marques != None and marques[noeud] : + label += "*" + if distances != None : + label += " (" + if distances[noeud] == PlusInfty : + label += "∞)" + else : + label += str(distances[noeud]) + ")" + print(str(noeud) + '[label="' + label + '"];', file = f) + for origine in range(0, taille(graphe)) : # énumérationd des arcs + for arrivee in range(0, taille(graphe)) : + if (oriente or origine < arrivee) and arc(graphe, origine, arrivee) : + if parents != None and parents[arrivee] == origine or not oriente and parents[origine] == arrivee : + style = ", penwidth=2, color=red" + else : + style = "" + print(str(origine) + lien + str(arrivee) + '[label="' + str(poids(graphe, origine, arrivee)) + '"' + style + "];", file=f) + print("}", file=f) + f.close() + +import subprocess + +def dot(fn_in, fn_out) : + """Lance le programme dot sur le fichier fn_in, en lui demandant de produire le fichier fn_out. + Ne fonctionne que si le programme dot est installé sur la machine !!""" + subprocess.call(["dot", "-Tpdf", '-o'+fn_out+'', fn_in]) + +def evince(fn, wait=False) : + """Lance le visualiseur PDF evince sur le fichier fn, et n'attend pas que celui-ci termine son exécution. + Ne fonctionne que si evince est installé.""" + evince = subprocess.Popen(["evince", fn]) + if wait : + evince.wait() + +import tempfile + +def afficher_graphe(graphe, oriente, wait, marques=None, distances=None, parents=None, bfn=None) : + if bfn == None : + bfn = tempfile.mktemp() + export(graphe, oriente, bfn+".dot", marques, distances, parents) + dot(bfn+".dot", bfn+".pdf") + evince(bfn+".pdf", wait) \ No newline at end of file