diff --git a/docs/poster/Poster-anon.pdf b/docs/poster/Poster-anon.pdf new file mode 100644 index 0000000..c2280f8 Binary files /dev/null and b/docs/poster/Poster-anon.pdf differ diff --git a/docs/poster/Poster.pdf b/docs/poster/Poster.pdf new file mode 100644 index 0000000..c4140fb Binary files /dev/null and b/docs/poster/Poster.pdf differ diff --git a/docs/poster/Teaser.pdf b/docs/poster/Teaser.pdf new file mode 100644 index 0000000..cc36101 Binary files /dev/null and b/docs/poster/Teaser.pdf differ diff --git a/docs/poster/abstract/bibliography.bib b/docs/poster/abstract/bibliography.bib new file mode 100644 index 0000000..dd91799 --- /dev/null +++ b/docs/poster/abstract/bibliography.bib @@ -0,0 +1,91 @@ +@InProceedings{ld-hpp-16, + author = {Wim T.L.P. Lavrijsen and Aditi Dutta}, + booktitle = {Proceedings of the 6th Workshop on Python for High-Performance and Scientific Computing ({PyHPC} 2016)}, + title = {High-Performance Python-C++ Bindings with {PyPy} and Cling}, + year = {2016}, + publisher = {{IEEE}}, + doi = {10.1109/pyhpc.2016.008}, +} + +@Article{kvl-eaa-23, + author = {Baidyanath Kundu and Vassil Vassilev and Wim Lavrijsen}, + journal = {CoRR}, + title = {Efficient and Accurate Automatic Python Bindings with cppyy {\&} Cling}, + year = {2023}, + bibsource = {dblp computer science bibliography, https://dblp.org}, + biburl = {https://dblp.org/rec/journals/corr/abs-2304-02712.bib}, + doi = {10.48550/arXiv.2304.02712}, + publisher = {arXiv}, +} + +@Article{per-wji-18, + author = {Jeffrey M. Perkel}, + journal = {Nature}, + title = {Why Jupyter is data scientists' computational notebook of choice}, + year = {2018}, + month = {oct}, + number = {7729}, + pages = {145--146}, + volume = {563}, + doi = {10.1038/d41586-018-07196-1}, + publisher = {Springer Science and Business Media {LLC}}, +} + +@Article{per-tcc-21, + author = {Jeffrey M. Perkel}, + journal = {Nature}, + title = {Ten computer codes that transformed science}, + year = {2021}, + month = {jan}, + number = {7842}, + pages = {344--348}, + volume = {589}, + doi = {10.1038/d41586-021-00075-2}, + publisher = {Springer Science and Business Media {LLC}}, +} + +@InProceedings{krp-jn-16, + author = {Thomas Kluyver and Benjamin Ragan-Kelley and Fernando P{\'e}rez and Brian Granger and Matthias Bussonnier and Jonathan Frederic and Kyle Kelley and Jessica Hamrick and Jason Grout and Sylvain Corlay and Paul Ivanov and Dami{\'a}n Avila and Safia Abdalla and Carol Willing and Jupyter development team}, + booktitle = {Proceedings of the 20th International Conference on Electronic Publishing}, + title = {Jupyter Notebooks -- a publishing format for reproducible computational workflows}, + year = {2016}, + editor = {Fernando Loizides and Birgit Scmidt}, + pages = {87--90}, + publisher = {IOS Press}, + booksubtitle = {Positioning and Power in Academic Publishing: Players, Agents and Agendas}, + url = {https://eprints.soton.ac.uk/403913/}, +} + +@InCollection{cgj-tog-13, + author = {Markus Chimani and Carsten Gutwenger and Michael J{\"{u}}nger and Gunnar W. Klau and Karsten Klein and Petra Mutzel}, + booktitle = {Handbook on Graph Drawing and Visualization}, + publisher = {Chapman and Hall/CRC}, + title = {The {O}pen {G}raph {D}rawing {F}ramework {(OGDF)}}, + year = {2013}, + editor = {Roberto Tamassia}, + pages = {543--569}, + bibsource = {dblp computer science bibliography, https://dblp.org}, + biburl = {https://dblp.org/rec/reference/crc/ChimaniGJKKM13.bib}, +} + +@Thesis{str-agw-22, + author = {Strobl, Andreas}, + school = {University of Passau}, + title = {A generic widget library for Rapid-Prototyping of Graph Algorithms in Jupyter Notebooks}, + type = {bathesis}, + url = {https://www.fim.uni-passau.de/fileadmin/dokumente/fakultaeten/fim/lehrstuhl/rutter/abschlussarbeiten/2022-Andreas_Strobl-BA.pdf}, + year = {2020}, +} + +@Article{gfh-cmm-22, + author = {Goren, Nir and Fogel, Efi and Halperin, Dan}, + journal = {CoRR}, + title = {{CGAL} Made More Accessible}, + year = {2022}, + copyright = {Creative Commons Attribution Non Commercial Share Alike 4.0 International}, + doi = {10.48550/arXiv.2202.13889}, + keywords = {Computational Geometry (cs.CG), Mathematical Software (cs.MS), FOS: Computer and information sciences}, + publisher = {arXiv}, +} + +@Comment{jabref-meta: databaseType:bibtex;} diff --git a/docs/poster/abstract/llncs.cls b/docs/poster/abstract/llncs.cls new file mode 100644 index 0000000..de80a15 --- /dev/null +++ b/docs/poster/abstract/llncs.cls @@ -0,0 +1,1218 @@ +% LLNCS DOCUMENT CLASS -- version 2.22 (05-Sep-2022) +% Springer Verlag LaTeX2e support for Lecture Notes in Computer Science +% +%% +%% \CharacterTable +%% {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 +%% 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 +%% Digits \0\1\2\3\4\5\6\7\8\9 +%% Exclamation \! Double quote \" Hash (number) \# +%% Dollar \$ Percent \% Ampersand \& +%% Acute accent \' Left paren \( Right paren \) +%% Asterisk \* Plus \+ Comma \, +%% Minus \- Point \. Solidus \/ +%% Colon \: Semicolon \; Less than \< +%% Equals \= Greater than \> Question mark \? +%% Commercial at \@ Left bracket \[ Backslash \\ +%% Right bracket \] Circumflex \^ Underscore \_ +%% Grave accent \` Left brace \{ Vertical bar \| +%% Right brace \} Tilde \~} +%% +\NeedsTeXFormat{LaTeX2e}[1995/12/01] +\ProvidesClass{llncs}[2022/09/05 v2.22 +^^J LaTeX document class for Lecture Notes in Computer Science] +% Options +\let\if@envcntreset\iffalse +\DeclareOption{envcountreset}{\let\if@envcntreset\iftrue} +\DeclareOption{citeauthoryear}{\let\citeauthoryear=Y} +\DeclareOption{oribibl}{\let\oribibl=Y} +\let\if@custvec\iftrue +\DeclareOption{orivec}{\let\if@custvec\iffalse} +\let\if@envcntsame\iffalse +\DeclareOption{envcountsame}{\let\if@envcntsame\iftrue} +\let\if@envcntsect\iffalse +\DeclareOption{envcountsect}{\let\if@envcntsect\iftrue} +\let\if@runhead\iffalse +\DeclareOption{runningheads}{\let\if@runhead\iftrue} + +\let\if@openright\iftrue +\let\if@openbib\iffalse +\DeclareOption{openbib}{\let\if@openbib\iftrue} + +% languages +\let\switcht@@therlang\relax +\def\ds@deutsch{\def\switcht@@therlang{\switcht@deutsch}} +\def\ds@francais{\def\switcht@@therlang{\switcht@francais}} + +\DeclareOption*{\PassOptionsToClass{\CurrentOption}{article}} + +\ProcessOptions + +\LoadClass[twoside]{article} +\RequirePackage{multicol} % needed for the list of participants, index +\RequirePackage{aliascnt} + +\setlength{\textwidth}{12.2cm} +\setlength{\textheight}{19.3cm} +\renewcommand\@pnumwidth{2em} +\renewcommand\@tocrmarg{3.5em} +% +\def\@dottedtocline#1#2#3#4#5{% + \ifnum #1>\c@tocdepth \else + \vskip \z@ \@plus.2\p@ + {\leftskip #2\relax \rightskip \@tocrmarg \advance\rightskip by 0pt plus 2cm + \parfillskip -\rightskip \pretolerance=10000 + \parindent #2\relax\@afterindenttrue + \interlinepenalty\@M + \leavevmode + \@tempdima #3\relax + \advance\leftskip \@tempdima \null\nobreak\hskip -\leftskip + {#4}\nobreak + \leaders\hbox{$\m@th + \mkern \@dotsep mu\hbox{.}\mkern \@dotsep + mu$}\hfill + \nobreak + \hb@xt@\@pnumwidth{\hfil\normalfont \normalcolor #5}% + \par}% + \fi} +% +\def\switcht@albion{% +\def\abstractname{Abstract.} +\def\ackname{Acknowledgement.} +\def\andname{and} +\def\lastandname{\unskip, and} +\def\appendixname{Appendix} +\def\chaptername{Chapter} +\def\claimname{Claim} +\def\conjecturename{Conjecture} +\def\contentsname{Table of Contents} +\def\corollaryname{Corollary} +\def\definitionname{Definition} +\def\examplename{Example} +\def\exercisename{Exercise} +\def\figurename{Fig.} +\def\keywordname{{\bf Keywords:}} +\def\indexname{Index} +\def\lemmaname{Lemma} +\def\contriblistname{List of Contributors} +\def\listfigurename{List of Figures} +\def\listtablename{List of Tables} +\def\mailname{{\it Correspondence to\/}:} +\def\noteaddname{Note added in proof} +\def\notename{Note} +\def\partname{Part} +\def\problemname{Problem} +\def\proofname{Proof} +\def\propertyname{Property} +\def\propositionname{Proposition} +\def\questionname{Question} +\def\remarkname{Remark} +\def\seename{see} +\def\solutionname{Solution} +\def\subclassname{{\it Subject Classifications\/}:} +\def\tablename{Table} +\def\theoremname{Theorem}} +\switcht@albion +% Names of theorem like environments are already defined +% but must be translated if another language is chosen +% +% French section +\def\switcht@francais{%\typeout{On parle francais.}% + \def\abstractname{R\'esum\'e.}% + \def\ackname{Remerciements.}% + \def\andname{et}% + \def\lastandname{ et}% + \def\appendixname{Appendice}% + \def\chaptername{Chapitre}% + \def\claimname{Pr\'etention}% + \def\conjecturename{Hypoth\`ese}% + \def\contentsname{Table des mati\`eres}% + \def\corollaryname{Corollaire}% + \def\definitionname{D\'efinition}% + \def\examplename{Exemple}% + \def\exercisename{Exercice}% + \def\figurename{Fig.}% + \def\keywordname{{\bf Mots-cl\'e:}}% + \def\indexname{Index}% + \def\lemmaname{Lemme}% + \def\contriblistname{Liste des contributeurs}% + \def\listfigurename{Liste des figures}% + \def\listtablename{Liste des tables}% + \def\mailname{{\it Correspondence to\/}:}% + \def\noteaddname{Note ajout\'ee \`a l'\'epreuve}% + \def\notename{Remarque}% + \def\partname{Partie}% + \def\problemname{Probl\`eme}% + \def\proofname{Preuve}% + \def\propertyname{Caract\'eristique}% +%\def\propositionname{Proposition}% + \def\questionname{Question}% + \def\remarkname{Remarque}% + \def\seename{voir}% + \def\solutionname{Solution}% + \def\subclassname{{\it Subject Classifications\/}:}% + \def\tablename{Tableau}% + \def\theoremname{Th\'eor\`eme}% +} +% +% German section +\def\switcht@deutsch{%\typeout{Man spricht deutsch.}% + \def\abstractname{Zusammenfassung.}% + \def\ackname{Danksagung.}% + \def\andname{und}% + \def\lastandname{ und}% + \def\appendixname{Anhang}% + \def\chaptername{Kapitel}% + \def\claimname{Behauptung}% + \def\conjecturename{Hypothese}% + \def\contentsname{Inhaltsverzeichnis}% + \def\corollaryname{Korollar}% +%\def\definitionname{Definition}% + \def\examplename{Beispiel}% + \def\exercisename{\"Ubung}% + \def\figurename{Abb.}% + \def\keywordname{{\bf Schl\"usselw\"orter:}}% + \def\indexname{Index}% +%\def\lemmaname{Lemma}% + \def\contriblistname{Mitarbeiter}% + \def\listfigurename{Abbildungsverzeichnis}% + \def\listtablename{Tabellenverzeichnis}% + \def\mailname{{\it Correspondence to\/}:}% + \def\noteaddname{Nachtrag}% + \def\notename{Anmerkung}% + \def\partname{Teil}% +%\def\problemname{Problem}% + \def\proofname{Beweis}% + \def\propertyname{Eigenschaft}% +%\def\propositionname{Proposition}% + \def\questionname{Frage}% + \def\remarkname{Anmerkung}% + \def\seename{siehe}% + \def\solutionname{L\"osung}% + \def\subclassname{{\it Subject Classifications\/}:}% + \def\tablename{Tabelle}% +%\def\theoremname{Theorem}% +} + +% Ragged bottom for the actual page +\def\thisbottomragged{\def\@textbottom{\vskip\z@ plus.0001fil +\global\let\@textbottom\relax}} + +\renewcommand\small{% + \@setfontsize\small\@ixpt{11}% + \abovedisplayskip 8.5\p@ \@plus3\p@ \@minus4\p@ + \abovedisplayshortskip \z@ \@plus2\p@ + \belowdisplayshortskip 4\p@ \@plus2\p@ \@minus2\p@ + \def\@listi{\leftmargin\leftmargini + \parsep 0\p@ \@plus1\p@ \@minus\p@ + \topsep 8\p@ \@plus2\p@ \@minus4\p@ + \itemsep0\p@}% + \belowdisplayskip \abovedisplayskip +} + +\frenchspacing +\widowpenalty=10000 +\clubpenalty=10000 + +\setlength\oddsidemargin {63\p@} +\setlength\evensidemargin {63\p@} +\setlength\marginparwidth {90\p@} + +\setlength\headsep {16\p@} + +\setlength\footnotesep{7.7\p@} +\setlength\textfloatsep{8mm\@plus 2\p@ \@minus 4\p@} +\setlength\intextsep {8mm\@plus 2\p@ \@minus 2\p@} + +\setcounter{secnumdepth}{2} + +\newcounter {chapter} +\renewcommand\thechapter {\@arabic\c@chapter} + +\newif\if@mainmatter \@mainmattertrue +\newcommand\frontmatter{\cleardoublepage + \@mainmatterfalse\pagenumbering{Roman}} +\newcommand\mainmatter{\cleardoublepage + \@mainmattertrue\pagenumbering{arabic}} +\newcommand\backmatter{\if@openright\cleardoublepage\else\clearpage\fi + \@mainmatterfalse} + +\renewcommand\part{\cleardoublepage + \thispagestyle{empty}% + \if@twocolumn + \onecolumn + \@tempswatrue + \else + \@tempswafalse + \fi + \null\vfil + \secdef\@part\@spart} + +\def\@part[#1]#2{% + \ifnum \c@secnumdepth >-2\relax + \refstepcounter{part}% + \addcontentsline{toc}{part}{\thepart\hspace{1em}#1}% + \else + \addcontentsline{toc}{part}{#1}% + \fi + \markboth{}{}% + {\centering + \interlinepenalty \@M + \normalfont + \ifnum \c@secnumdepth >-2\relax + \huge\bfseries \partname~\thepart + \par + \vskip 20\p@ + \fi + \Huge \bfseries #2\par}% + \@endpart} +\def\@spart#1{% + {\centering + \interlinepenalty \@M + \normalfont + \Huge \bfseries #1\par}% + \@endpart} +\def\@endpart{\vfil\newpage + \if@twoside + \null + \thispagestyle{empty}% + \newpage + \fi + \if@tempswa + \twocolumn + \fi} + +\newcommand\chapter{\clearpage + \thispagestyle{empty}% + \global\@topnum\z@ + \@afterindentfalse + \secdef\@chapter\@schapter} +\def\@chapter[#1]#2{\ifnum \c@secnumdepth >\m@ne + \if@mainmatter + \refstepcounter{chapter}% + \typeout{\@chapapp\space\thechapter.}% + \addcontentsline{toc}{chapter}% + {\protect\numberline{\thechapter}#1}% + \else + \addcontentsline{toc}{chapter}{#1}% + \fi + \else + \addcontentsline{toc}{chapter}{#1}% + \fi + \chaptermark{#1}% + \addtocontents{lof}{\protect\addvspace{10\p@}}% + \addtocontents{lot}{\protect\addvspace{10\p@}}% + \if@twocolumn + \@topnewpage[\@makechapterhead{#2}]% + \else + \@makechapterhead{#2}% + \@afterheading + \fi} +\def\@makechapterhead#1{% +% \vspace*{50\p@}% + {\centering + \ifnum \c@secnumdepth >\m@ne + \if@mainmatter + \large\bfseries \@chapapp{} \thechapter + \par\nobreak + \vskip 20\p@ + \fi + \fi + \interlinepenalty\@M + \Large \bfseries #1\par\nobreak + \vskip 40\p@ + }} +\def\@schapter#1{\if@twocolumn + \@topnewpage[\@makeschapterhead{#1}]% + \else + \@makeschapterhead{#1}% + \@afterheading + \fi} +\def\@makeschapterhead#1{% +% \vspace*{50\p@}% + {\centering + \normalfont + \interlinepenalty\@M + \Large \bfseries #1\par\nobreak + \vskip 40\p@ + }} + +\renewcommand\section{\@startsection{section}{1}{\z@}% + {-18\p@ \@plus -4\p@ \@minus -4\p@}% + {12\p@ \@plus 4\p@ \@minus 4\p@}% + {\normalfont\large\bfseries\boldmath + \rightskip=\z@ \@plus 8em\pretolerance=10000 }} +\renewcommand\subsection{\@startsection{subsection}{2}{\z@}% + {-18\p@ \@plus -4\p@ \@minus -4\p@}% + {8\p@ \@plus 4\p@ \@minus 4\p@}% + {\normalfont\normalsize\bfseries\boldmath + \rightskip=\z@ \@plus 8em\pretolerance=10000 }} +\renewcommand\subsubsection{\@startsection{subsubsection}{3}{\z@}% + {-18\p@ \@plus -4\p@ \@minus -4\p@}% + {-0.5em \@plus -0.22em \@minus -0.1em}% + {\normalfont\normalsize\bfseries\boldmath}} +\renewcommand\paragraph{\@startsection{paragraph}{4}{\z@}% + {-12\p@ \@plus -4\p@ \@minus -4\p@}% + {-0.5em \@plus -0.22em \@minus -0.1em}% + {\normalfont\normalsize\itshape}} +\renewcommand\subparagraph[1]{\typeout{LLNCS warning: You should not use + \string\subparagraph\space with this class}\vskip0.5cm +You should not use \verb|\subparagraph| with this class.\vskip0.5cm} + +\DeclareMathSymbol{\Gamma}{\mathalpha}{letters}{"00} +\DeclareMathSymbol{\Delta}{\mathalpha}{letters}{"01} +\DeclareMathSymbol{\Theta}{\mathalpha}{letters}{"02} +\DeclareMathSymbol{\Lambda}{\mathalpha}{letters}{"03} +\DeclareMathSymbol{\Xi}{\mathalpha}{letters}{"04} +\DeclareMathSymbol{\Pi}{\mathalpha}{letters}{"05} +\DeclareMathSymbol{\Sigma}{\mathalpha}{letters}{"06} +\DeclareMathSymbol{\Upsilon}{\mathalpha}{letters}{"07} +\DeclareMathSymbol{\Phi}{\mathalpha}{letters}{"08} +\DeclareMathSymbol{\Psi}{\mathalpha}{letters}{"09} +\DeclareMathSymbol{\Omega}{\mathalpha}{letters}{"0A} + +\let\footnotesize\small + +\if@custvec +\DeclareRobustCommand\vec[1]{\mathchoice{\mbox{\boldmath$\displaystyle#1$}} +{\mbox{\boldmath$\textstyle#1$}} +{\mbox{\boldmath$\scriptstyle#1$}} +{\mbox{\boldmath$\scriptscriptstyle#1$}}} +\fi + +\def\squareforqed{\hbox{\rlap{$\sqcap$}$\sqcup$}} +\def\qed{\ifmmode\squareforqed\else{\unskip\nobreak\hfil +\penalty50\hskip1em\null\nobreak\hfil\squareforqed +\parfillskip=0pt\finalhyphendemerits=0\endgraf}\fi} + +\def\getsto{\mathrel{\mathchoice {\vcenter{\offinterlineskip +\halign{\hfil +$\displaystyle##$\hfil\cr\gets\cr\to\cr}}} +{\vcenter{\offinterlineskip\halign{\hfil$\textstyle##$\hfil\cr\gets +\cr\to\cr}}} +{\vcenter{\offinterlineskip\halign{\hfil$\scriptstyle##$\hfil\cr\gets +\cr\to\cr}}} +{\vcenter{\offinterlineskip\halign{\hfil$\scriptscriptstyle##$\hfil\cr +\gets\cr\to\cr}}}}} +\def\lid{\mathrel{\mathchoice {\vcenter{\offinterlineskip\halign{\hfil +$\displaystyle##$\hfil\cr<\cr\noalign{\vskip1.2pt}=\cr}}} +{\vcenter{\offinterlineskip\halign{\hfil$\textstyle##$\hfil\cr<\cr +\noalign{\vskip1.2pt}=\cr}}} +{\vcenter{\offinterlineskip\halign{\hfil$\scriptstyle##$\hfil\cr<\cr +\noalign{\vskip1pt}=\cr}}} +{\vcenter{\offinterlineskip\halign{\hfil$\scriptscriptstyle##$\hfil\cr +<\cr +\noalign{\vskip0.9pt}=\cr}}}}} +\def\gid{\mathrel{\mathchoice {\vcenter{\offinterlineskip\halign{\hfil +$\displaystyle##$\hfil\cr>\cr\noalign{\vskip1.2pt}=\cr}}} +{\vcenter{\offinterlineskip\halign{\hfil$\textstyle##$\hfil\cr>\cr +\noalign{\vskip1.2pt}=\cr}}} +{\vcenter{\offinterlineskip\halign{\hfil$\scriptstyle##$\hfil\cr>\cr +\noalign{\vskip1pt}=\cr}}} +{\vcenter{\offinterlineskip\halign{\hfil$\scriptscriptstyle##$\hfil\cr +>\cr +\noalign{\vskip0.9pt}=\cr}}}}} +\def\grole{\mathrel{\mathchoice {\vcenter{\offinterlineskip +\halign{\hfil +$\displaystyle##$\hfil\cr>\cr\noalign{\vskip-1pt}<\cr}}} +{\vcenter{\offinterlineskip\halign{\hfil$\textstyle##$\hfil\cr +>\cr\noalign{\vskip-1pt}<\cr}}} +{\vcenter{\offinterlineskip\halign{\hfil$\scriptstyle##$\hfil\cr +>\cr\noalign{\vskip-0.8pt}<\cr}}} +{\vcenter{\offinterlineskip\halign{\hfil$\scriptscriptstyle##$\hfil\cr +>\cr\noalign{\vskip-0.3pt}<\cr}}}}} +\def\bbbr{{\rm I\!R}} %reelle Zahlen +\def\bbbm{{\rm I\!M}} +\def\bbbn{{\rm I\!N}} %natuerliche Zahlen +\def\bbbf{{\rm I\!F}} +\def\bbbh{{\rm I\!H}} +\def\bbbk{{\rm I\!K}} +\def\bbbp{{\rm I\!P}} +\def\bbbone{{\mathchoice {\rm 1\mskip-4mu l} {\rm 1\mskip-4mu l} +{\rm 1\mskip-4.5mu l} {\rm 1\mskip-5mu l}}} +\def\bbbc{{\mathchoice {\setbox0=\hbox{$\displaystyle\rm C$}\hbox{\hbox +to0pt{\kern0.4\wd0\vrule height0.9\ht0\hss}\box0}} +{\setbox0=\hbox{$\textstyle\rm C$}\hbox{\hbox +to0pt{\kern0.4\wd0\vrule height0.9\ht0\hss}\box0}} +{\setbox0=\hbox{$\scriptstyle\rm C$}\hbox{\hbox +to0pt{\kern0.4\wd0\vrule height0.9\ht0\hss}\box0}} +{\setbox0=\hbox{$\scriptscriptstyle\rm C$}\hbox{\hbox +to0pt{\kern0.4\wd0\vrule height0.9\ht0\hss}\box0}}}} +\def\bbbq{{\mathchoice {\setbox0=\hbox{$\displaystyle\rm +Q$}\hbox{\raise +0.15\ht0\hbox to0pt{\kern0.4\wd0\vrule height0.8\ht0\hss}\box0}} +{\setbox0=\hbox{$\textstyle\rm Q$}\hbox{\raise +0.15\ht0\hbox to0pt{\kern0.4\wd0\vrule height0.8\ht0\hss}\box0}} +{\setbox0=\hbox{$\scriptstyle\rm Q$}\hbox{\raise +0.15\ht0\hbox to0pt{\kern0.4\wd0\vrule height0.7\ht0\hss}\box0}} +{\setbox0=\hbox{$\scriptscriptstyle\rm Q$}\hbox{\raise +0.15\ht0\hbox to0pt{\kern0.4\wd0\vrule height0.7\ht0\hss}\box0}}}} +\def\bbbt{{\mathchoice {\setbox0=\hbox{$\displaystyle\rm +T$}\hbox{\hbox to0pt{\kern0.3\wd0\vrule height0.9\ht0\hss}\box0}} +{\setbox0=\hbox{$\textstyle\rm T$}\hbox{\hbox +to0pt{\kern0.3\wd0\vrule height0.9\ht0\hss}\box0}} +{\setbox0=\hbox{$\scriptstyle\rm T$}\hbox{\hbox +to0pt{\kern0.3\wd0\vrule height0.9\ht0\hss}\box0}} +{\setbox0=\hbox{$\scriptscriptstyle\rm T$}\hbox{\hbox +to0pt{\kern0.3\wd0\vrule height0.9\ht0\hss}\box0}}}} +\def\bbbs{{\mathchoice +{\setbox0=\hbox{$\displaystyle \rm S$}\hbox{\raise0.5\ht0\hbox +to0pt{\kern0.35\wd0\vrule height0.45\ht0\hss}\hbox +to0pt{\kern0.55\wd0\vrule height0.5\ht0\hss}\box0}} +{\setbox0=\hbox{$\textstyle \rm S$}\hbox{\raise0.5\ht0\hbox +to0pt{\kern0.35\wd0\vrule height0.45\ht0\hss}\hbox +to0pt{\kern0.55\wd0\vrule height0.5\ht0\hss}\box0}} +{\setbox0=\hbox{$\scriptstyle \rm S$}\hbox{\raise0.5\ht0\hbox +to0pt{\kern0.35\wd0\vrule height0.45\ht0\hss}\raise0.05\ht0\hbox +to0pt{\kern0.5\wd0\vrule height0.45\ht0\hss}\box0}} +{\setbox0=\hbox{$\scriptscriptstyle\rm S$}\hbox{\raise0.5\ht0\hbox +to0pt{\kern0.4\wd0\vrule height0.45\ht0\hss}\raise0.05\ht0\hbox +to0pt{\kern0.55\wd0\vrule height0.45\ht0\hss}\box0}}}} +\def\bbbz{{\mathchoice {\hbox{$\mathsf\textstyle Z\kern-0.4em Z$}} +{\hbox{$\mathsf\textstyle Z\kern-0.4em Z$}} +{\hbox{$\mathsf\scriptstyle Z\kern-0.3em Z$}} +{\hbox{$\mathsf\scriptscriptstyle Z\kern-0.2em Z$}}}} + +\let\ts\, + +\setlength\leftmargini {17\p@} +\setlength\leftmargin {\leftmargini} +\setlength\leftmarginii {\leftmargini} +\setlength\leftmarginiii {\leftmargini} +\setlength\leftmarginiv {\leftmargini} +\setlength \labelsep {.5em} +\setlength \labelwidth{\leftmargini} +\addtolength\labelwidth{-\labelsep} + +\def\@listI{\leftmargin\leftmargini + \parsep 0\p@ \@plus1\p@ \@minus\p@ + \topsep 8\p@ \@plus2\p@ \@minus4\p@ + \itemsep0\p@} +\let\@listi\@listI +\@listi +\def\@listii {\leftmargin\leftmarginii + \labelwidth\leftmarginii + \advance\labelwidth-\labelsep + \topsep 0\p@ \@plus2\p@ \@minus\p@} +\def\@listiii{\leftmargin\leftmarginiii + \labelwidth\leftmarginiii + \advance\labelwidth-\labelsep + \topsep 0\p@ \@plus\p@\@minus\p@ + \parsep \z@ + \partopsep \p@ \@plus\z@ \@minus\p@} + +\renewcommand\labelitemi{\normalfont\bfseries --} +\renewcommand\labelitemii{$\m@th\bullet$} + +\setlength\arraycolsep{1.4\p@} +\setlength\tabcolsep{1.4\p@} + +\def\tableofcontents{\chapter*{\contentsname\@mkboth{{\contentsname}}% + {{\contentsname}}} + \def\authcount##1{\setcounter{auco}{##1}\setcounter{@auth}{1}} + \def\lastand{\ifnum\value{auco}=2\relax + \unskip{} \andname\ + \else + \unskip \lastandname\ + \fi}% + \def\and{\stepcounter{@auth}\relax + \ifnum\value{@auth}=\value{auco}% + \lastand + \else + \unskip, + \fi}% + \@starttoc{toc}\if@restonecol\twocolumn\fi} + +\def\l@part#1#2{\addpenalty{\@secpenalty}% + \addvspace{2em plus\p@}% % space above part line + \begingroup + \parindent \z@ + \rightskip \z@ plus 5em + \hrule\vskip5pt + \large % same size as for a contribution heading + \bfseries\boldmath % set line in boldface + \leavevmode % TeX command to enter horizontal mode. + #1\par + \vskip5pt + \hrule + \vskip1pt + \nobreak % Never break after part entry + \endgroup} + +\def\@dotsep{2} + +\let\phantomsection=\relax + +\def\hyperhrefextend{\ifx\hyper@anchor\@undefined\else +{}\fi} + +\def\addnumcontentsmark#1#2#3{% +\addtocontents{#1}{\protect\contentsline{#2}{\protect\numberline + {\thechapter}#3}{\thepage}\hyperhrefextend}}% +\def\addcontentsmark#1#2#3{% +\addtocontents{#1}{\protect\contentsline{#2}{#3}{\thepage}\hyperhrefextend}}% +\def\addcontentsmarkwop#1#2#3{% +\addtocontents{#1}{\protect\contentsline{#2}{#3}{0}\hyperhrefextend}}% + +\def\@adcmk[#1]{\ifcase #1 \or +\def\@gtempa{\addnumcontentsmark}% + \or \def\@gtempa{\addcontentsmark}% + \or \def\@gtempa{\addcontentsmarkwop}% + \fi\@gtempa{toc}{chapter}% +} +\def\addtocmark{% +\phantomsection +\@ifnextchar[{\@adcmk}{\@adcmk[3]}% +} + +\def\l@chapter#1#2{\addpenalty{-\@highpenalty} + \vskip 1.0em plus 1pt \@tempdima 1.5em \begingroup + \parindent \z@ \rightskip \@tocrmarg + \advance\rightskip by 0pt plus 2cm + \parfillskip -\rightskip \pretolerance=10000 + \leavevmode \advance\leftskip\@tempdima \hskip -\leftskip + {\large\bfseries\boldmath#1}\ifx0#2\hfil\null + \else + \nobreak + \leaders\hbox{$\m@th \mkern \@dotsep mu.\mkern + \@dotsep mu$}\hfill + \nobreak\hbox to\@pnumwidth{\hss #2}% + \fi\par + \penalty\@highpenalty \endgroup} + +\def\l@title#1#2{\addpenalty{-\@highpenalty} + \addvspace{8pt plus 1pt} + \@tempdima \z@ + \begingroup + \parindent \z@ \rightskip \@tocrmarg + \advance\rightskip by 0pt plus 2cm + \parfillskip -\rightskip \pretolerance=10000 + \leavevmode \advance\leftskip\@tempdima \hskip -\leftskip + #1\nobreak + \leaders\hbox{$\m@th \mkern \@dotsep mu.\mkern + \@dotsep mu$}\hfill + \nobreak\hbox to\@pnumwidth{\hss #2}\par + \penalty\@highpenalty \endgroup} + +\def\l@author#1#2{\addpenalty{\@highpenalty} + \@tempdima=15\p@ %\z@ + \begingroup + \parindent \z@ \rightskip \@tocrmarg + \advance\rightskip by 0pt plus 2cm + \pretolerance=10000 + \leavevmode \advance\leftskip\@tempdima %\hskip -\leftskip + \textit{#1}\par + \penalty\@highpenalty \endgroup} + +\setcounter{tocdepth}{0} +\newdimen\tocchpnum +\newdimen\tocsecnum +\newdimen\tocsectotal +\newdimen\tocsubsecnum +\newdimen\tocsubsectotal +\newdimen\tocsubsubsecnum +\newdimen\tocsubsubsectotal +\newdimen\tocparanum +\newdimen\tocparatotal +\newdimen\tocsubparanum +\tocchpnum=\z@ % no chapter numbers +\tocsecnum=15\p@ % section 88. plus 2.222pt +\tocsubsecnum=23\p@ % subsection 88.8 plus 2.222pt +\tocsubsubsecnum=27\p@ % subsubsection 88.8.8 plus 1.444pt +\tocparanum=35\p@ % paragraph 88.8.8.8 plus 1.666pt +\tocsubparanum=43\p@ % subparagraph 88.8.8.8.8 plus 1.888pt +\def\calctocindent{% +\tocsectotal=\tocchpnum +\advance\tocsectotal by\tocsecnum +\tocsubsectotal=\tocsectotal +\advance\tocsubsectotal by\tocsubsecnum +\tocsubsubsectotal=\tocsubsectotal +\advance\tocsubsubsectotal by\tocsubsubsecnum +\tocparatotal=\tocsubsubsectotal +\advance\tocparatotal by\tocparanum} +\calctocindent + +\def\l@section{\@dottedtocline{1}{\tocchpnum}{\tocsecnum}} +\def\l@subsection{\@dottedtocline{2}{\tocsectotal}{\tocsubsecnum}} +\def\l@subsubsection{\@dottedtocline{3}{\tocsubsectotal}{\tocsubsubsecnum}} +\def\l@paragraph{\@dottedtocline{4}{\tocsubsubsectotal}{\tocparanum}} +\def\l@subparagraph{\@dottedtocline{5}{\tocparatotal}{\tocsubparanum}} + +\def\listoffigures{\@restonecolfalse\if@twocolumn\@restonecoltrue\onecolumn + \fi\section*{\listfigurename\@mkboth{{\listfigurename}}{{\listfigurename}}} + \@starttoc{lof}\if@restonecol\twocolumn\fi} +\def\l@figure{\@dottedtocline{1}{0em}{1.5em}} + +\def\listoftables{\@restonecolfalse\if@twocolumn\@restonecoltrue\onecolumn + \fi\section*{\listtablename\@mkboth{{\listtablename}}{{\listtablename}}} + \@starttoc{lot}\if@restonecol\twocolumn\fi} +\let\l@table\l@figure + +\renewcommand\listoffigures{% + \section*{\listfigurename + \@mkboth{\listfigurename}{\listfigurename}}% + \@starttoc{lof}% + } + +\renewcommand\listoftables{% + \section*{\listtablename + \@mkboth{\listtablename}{\listtablename}}% + \@starttoc{lot}% + } + +\ifx\oribibl\undefined +\ifx\citeauthoryear\undefined +\renewenvironment{thebibliography}[1] + {\section*{\refname} + \def\@biblabel##1{##1.} + \small + \list{\@biblabel{\@arabic\c@enumiv}}% + {\settowidth\labelwidth{\@biblabel{#1}}% + \leftmargin\labelwidth + \advance\leftmargin\labelsep + \if@openbib + \advance\leftmargin\bibindent + \itemindent -\bibindent + \listparindent \itemindent + \parsep \z@ + \fi + \usecounter{enumiv}% + \let\p@enumiv\@empty + \renewcommand\theenumiv{\@arabic\c@enumiv}}% + \if@openbib + \renewcommand\newblock{\par}% + \else + \renewcommand\newblock{\hskip .11em \@plus.33em \@minus.07em}% + \fi + \sloppy\clubpenalty4000\widowpenalty4000% + \sfcode`\.=\@m} + {\def\@noitemerr + {\@latex@warning{Empty `thebibliography' environment}}% + \endlist} +\def\@lbibitem[#1]#2{\item[{[#1]}\hfill]\if@filesw + {\let\protect\noexpand\immediate + \write\@auxout{\string\bibcite{#2}{#1}}}\fi\ignorespaces} +\newcount\@tempcntc +\def\@citex[#1]#2{\if@filesw\immediate\write\@auxout{\string\citation{#2}}\fi + \@tempcnta\z@\@tempcntb\m@ne\def\@citea{}\@cite{\@for\@citeb:=#2\do + {\@ifundefined + {b@\@citeb}{\@citeo\@tempcntb\m@ne\@citea\def\@citea{,}{\bfseries + ?}\@warning + {Citation `\@citeb' on page \thepage \space undefined}}% + {\setbox\z@\hbox{\global\@tempcntc0\csname b@\@citeb\endcsname\relax}% + \ifnum\@tempcntc=\z@ \@citeo\@tempcntb\m@ne + \@citea\def\@citea{,}\hbox{\csname b@\@citeb\endcsname}% + \else + \advance\@tempcntb\@ne + \ifnum\@tempcntb=\@tempcntc + \else\advance\@tempcntb\m@ne\@citeo + \@tempcnta\@tempcntc\@tempcntb\@tempcntc\fi\fi}}\@citeo}{#1}} +\def\@citeo{\ifnum\@tempcnta>\@tempcntb\else + \@citea\def\@citea{,\,\hskip\z@skip}% + \ifnum\@tempcnta=\@tempcntb\the\@tempcnta\else + {\advance\@tempcnta\@ne\ifnum\@tempcnta=\@tempcntb \else + \def\@citea{--}\fi + \advance\@tempcnta\m@ne\the\@tempcnta\@citea\the\@tempcntb}\fi\fi} +\else +\renewenvironment{thebibliography}[1] + {\section*{\refname} + \small + \list{}% + {\settowidth\labelwidth{}% + \leftmargin\parindent + \itemindent=-\parindent + \labelsep=\z@ + \if@openbib + \advance\leftmargin\bibindent + \itemindent -\bibindent + \listparindent \itemindent + \parsep \z@ + \fi + \usecounter{enumiv}% + \let\p@enumiv\@empty + \renewcommand\theenumiv{}}% + \if@openbib + \renewcommand\newblock{\par}% + \else + \renewcommand\newblock{\hskip .11em \@plus.33em \@minus.07em}% + \fi + \sloppy\clubpenalty4000\widowpenalty4000% + \sfcode`\.=\@m} + {\def\@noitemerr + {\@latex@warning{Empty `thebibliography' environment}}% + \endlist} + \def\@cite#1{#1}% + \def\@lbibitem[#1]#2{\item[]\if@filesw + {\def\protect##1{\string ##1\space}\immediate + \write\@auxout{\string\bibcite{#2}{#1}}}\fi\ignorespaces} + \fi +\else +\@cons\@openbib@code{\noexpand\small} +\fi + +\def\idxquad{\hskip 10\p@}% space that divides entry from number + +\def\@idxitem{\par\hangindent 10\p@} + +\def\subitem{\par\setbox0=\hbox{--\enspace}% second order + \noindent\hangindent\wd0\box0}% index entry + +\def\subsubitem{\par\setbox0=\hbox{--\,--\enspace}% third + \noindent\hangindent\wd0\box0}% order index entry + +\def\indexspace{\par \vskip 10\p@ plus5\p@ minus3\p@\relax} + +\renewenvironment{theindex} + {\@mkboth{\indexname}{\indexname}% + \thispagestyle{empty}\parindent\z@ + \parskip\z@ \@plus .3\p@\relax + \let\item\par + \def\,{\relax\ifmmode\mskip\thinmuskip + \else\hskip0.2em\ignorespaces\fi}% + \normalfont\small + \begin{multicols}{2}[\@makeschapterhead{\indexname}]% + } + {\end{multicols}} + +\renewcommand\footnoterule{% + \kern-3\p@ + \hrule\@width 2truecm + \kern2.6\p@} + \newdimen\fnindent + \fnindent1em +\long\def\@makefntext#1{% + \parindent \fnindent% + \leftskip \fnindent% + \noindent + \llap{\hb@xt@1em{\hss\@makefnmark\ }}\ignorespaces#1} + +\long\def\@makecaption#1#2{% + \small + \vskip\abovecaptionskip + \sbox\@tempboxa{{\bfseries #1.} #2}% + \ifdim \wd\@tempboxa >\hsize + {\bfseries #1.} #2\par + \else + \global \@minipagefalse + \hb@xt@\hsize{\hfil\box\@tempboxa\hfil}% + \fi + \vskip\belowcaptionskip} + +\def\fps@figure{htbp} +\def\fnum@figure{\figurename\thinspace\thefigure} +\def \@floatboxreset {% + \reset@font + \small + \@setnobreak + \@setminipage +} +\def\fps@table{htbp} +\def\fnum@table{\tablename~\thetable} +\renewenvironment{table} + {\setlength\abovecaptionskip{0\p@}% + \setlength\belowcaptionskip{10\p@}% + \@float{table}} + {\end@float} +\renewenvironment{table*} + {\setlength\abovecaptionskip{0\p@}% + \setlength\belowcaptionskip{10\p@}% + \@dblfloat{table}} + {\end@dblfloat} + +\long\def\@caption#1[#2]#3{\par\addcontentsline{\csname + ext@#1\endcsname}{#1}{\protect\numberline{\csname + the#1\endcsname}{\ignorespaces #2}}\begingroup + \@parboxrestore + \@makecaption{\csname fnum@#1\endcsname}{\ignorespaces #3}\par + \endgroup} + +% LaTeX does not provide a command to enter the authors institute +% addresses. The \institute command is defined here. + +\newcounter{@inst} +\newcounter{@auth} +\newcounter{auco} +\newdimen\instindent +\newbox\authrun +\newtoks\authorrunning +\newtoks\tocauthor +\newbox\titrun +\newtoks\titlerunning +\newtoks\toctitle + +\def\clearheadinfo{\gdef\@author{No Author Given}% + \gdef\@title{No Title Given}% + \gdef\@subtitle{}% + \gdef\@institute{No Institute Given}% + \gdef\@thanks{}% + \global\titlerunning={}\global\authorrunning={}% + \global\toctitle={}\global\tocauthor={}} + +\def\institute#1{\gdef\@institute{#1}} + +\def\institutename{\par + \begingroup + \parskip=\z@ + \parindent=\z@ + \setcounter{@inst}{1}% + \def\and{\par\stepcounter{@inst}% + \noindent$^{\the@inst}$\enspace\ignorespaces}% + \setbox0=\vbox{\def\thanks##1{}\@institute}% + \ifnum\c@@inst=1\relax + \gdef\fnnstart{0}% + \else + \xdef\fnnstart{\c@@inst}% + \setcounter{@inst}{1}% + \noindent$^{\the@inst}$\enspace + \fi + \ignorespaces + \@institute\par + \endgroup} + +\def\@fnsymbol#1{\ensuremath{\ifcase#1\or\star\or{\star\star}\or + {\star\star\star}\or \dagger\or \ddagger\or + \mathchar "278\or \mathchar "27B\or \|\or **\or \dagger\dagger + \or \ddagger\ddagger \else\@ctrerr\fi}} + +\def\inst#1{\unskip$^{#1}$} +\def\orcidID#1{\unskip$^{[#1]}$} % added MR 2018-03-10 +\def\fnmsep{\unskip$^,$} +\def\email#1{{\tt#1}} + +\AtBeginDocument{\@ifundefined{url}{\def\url#1{#1}}{}% +\@ifpackageloaded{babel}{% +\@ifundefined{extrasenglish}{}{\addto\extrasenglish{\switcht@albion}}% +\@ifundefined{extrasfrenchb}{}{\addto\extrasfrenchb{\switcht@francais}}% +\@ifundefined{extrasgerman}{}{\addto\extrasgerman{\switcht@deutsch}}% +\@ifundefined{extrasngerman}{}{\addto\extrasngerman{\switcht@deutsch}}% +}{\switcht@@therlang}% +\providecommand{\keywords}[1]{\def\and{{\textperiodcentered} }% +\par\addvspace\baselineskip +\noindent\keywordname\enspace\ignorespaces#1}% +\@ifpackageloaded{hyperref}{% +\def\doi#1{\href{https://doi.org/\detokenize{#1}}{\url{https://doi.org/#1}}}}{ +\def\doi#1{https://doi.org/\detokenize{#1}}} +} +\def\homedir{\~{ }} + +\def\subtitle#1{\gdef\@subtitle{#1}} +\clearheadinfo +% +%%% to avoid hyperref warnings +\providecommand*{\toclevel@author}{999} +%%% to make title-entry parent of section-entries +\providecommand*{\toclevel@title}{0} +% +\renewcommand\maketitle{\newpage +\phantomsection + \refstepcounter{chapter}% + \stepcounter{section}% + \setcounter{section}{0}% + \setcounter{subsection}{0}% + \setcounter{figure}{0} + \setcounter{table}{0} + \setcounter{equation}{0} + \setcounter{footnote}{0}% + \begingroup + \parindent=\z@ + \renewcommand\thefootnote{\@fnsymbol\c@footnote}% + \if@twocolumn + \ifnum \col@number=\@ne + \@maketitle + \else + \twocolumn[\@maketitle]% + \fi + \else + \newpage + \global\@topnum\z@ % Prevents figures from going at top of page. + \@maketitle + \fi + \thispagestyle{empty}\@thanks +% + \def\\{\unskip\ \ignorespaces}\def\inst##1{\unskip{}}% + \def\thanks##1{\unskip{}}\def\fnmsep{\unskip}% + \instindent=\hsize + \advance\instindent by-\headlineindent + \if!\the\toctitle!\addcontentsline{toc}{title}{\@title}\else + \addcontentsline{toc}{title}{\the\toctitle}\fi + \if@runhead + \if!\the\titlerunning!\else + \edef\@title{\the\titlerunning}% + \fi + \global\setbox\titrun=\hbox{\small\rm\unboldmath\ignorespaces\@title}% + \ifdim\wd\titrun>\instindent + \typeout{Title too long for running head. Please supply}% + \typeout{a shorter form with \string\titlerunning\space prior to + \string\maketitle}% + \global\setbox\titrun=\hbox{\small\rm + Title Suppressed Due to Excessive Length}% + \fi + \xdef\@title{\copy\titrun}% + \fi +% + \if!\the\tocauthor!\relax + {\def\and{\noexpand\protect\noexpand\and}% + \def\inst##1{}% added MR 2017-09-20 to remove inst numbers from the TOC + \def\orcidID##1{}% added MR 2017-09-20 to remove ORCID ids from the TOC + \protected@xdef\toc@uthor{\@author}}% + \else + \def\\{\noexpand\protect\noexpand\newline}% + \protected@xdef\scratch{\the\tocauthor}% + \protected@xdef\toc@uthor{\scratch}% + \fi + \addtocontents{toc}{\noexpand\protect\noexpand\authcount{\the\c@auco}}% + \addcontentsline{toc}{author}{\toc@uthor}% + \if@runhead + \if!\the\authorrunning! + \value{@inst}=\value{@auth}% + \setcounter{@auth}{1}% + \else + \edef\@author{\the\authorrunning}% + \fi + \global\setbox\authrun=\hbox{\def\inst##1{}% added MR 2017-09-20 to remove inst numbers from the runninghead + \def\orcidID##1{}% added MR 2017-09-20 to remove ORCID ids from the runninghead + \small\unboldmath\@author\unskip}% + \ifdim\wd\authrun>\instindent + \typeout{Names of authors too long for running head. Please supply}% + \typeout{a shorter form with \string\authorrunning\space prior to + \string\maketitle}% + \global\setbox\authrun=\hbox{\small\rm + Authors Suppressed Due to Excessive Length}% + \fi + \xdef\@author{\copy\authrun}% + \markboth{\@author}{\@title}% + \fi + \endgroup + \setcounter{footnote}{\fnnstart}% + \clearheadinfo} +% +\def\@maketitle{\newpage + \markboth{}{}% + \def\lastand{\ifnum\value{@inst}=2\relax + \unskip{} \andname\ + \else + \unskip \lastandname\ + \fi}% + \def\and{\stepcounter{@auth}\relax + \ifnum\value{@auth}=\value{@inst}% + \lastand + \else + \unskip, + \fi}% + \begin{center}% + \let\newline\\ + {\Large \bfseries\boldmath + \pretolerance=10000 + \@title \par}\vskip .8cm +\if!\@subtitle!\else {\large \bfseries\boldmath + \vskip -.65cm + \pretolerance=10000 + \@subtitle \par}\vskip .8cm\fi + \setbox0=\vbox{\setcounter{@auth}{1}\def\and{\stepcounter{@auth}}% + \def\thanks##1{}\@author}% + \global\value{@inst}=\value{@auth}% + \global\value{auco}=\value{@auth}% + \setcounter{@auth}{1}% +{\lineskip .5em +\noindent\ignorespaces +\@author\vskip.35cm} + {\small\institutename} + \end{center}% + } + +% definition of the "\spnewtheorem" command. +% +% Usage: +% +% \spnewtheorem{env_nam}{caption}[within]{cap_font}{body_font} +% or \spnewtheorem{env_nam}[numbered_like]{caption}{cap_font}{body_font} +% or \spnewtheorem*{env_nam}{caption}{cap_font}{body_font} +% +% New is "cap_font" and "body_font". It stands for +% fontdefinition of the caption and the text itself. +% +% "\spnewtheorem*" gives a theorem without number. +% +% A defined spnewthoerem environment is used as described +% by Lamport. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\def\@thmcountersep{} +\def\@thmcounterend{.} + +\def\spnewtheorem{\@ifstar{\@sthm}{\@Sthm}} + +% definition of \spnewtheorem with number + +\def\@spnthm#1#2{% + \@ifnextchar[{\@spxnthm{#1}{#2}}{\@spynthm{#1}{#2}}} +\def\@Sthm#1{\@ifnextchar[{\@spothm{#1}}{\@spnthm{#1}}} + +\def\@spxnthm#1#2[#3]#4#5{\expandafter\@ifdefinable\csname #1\endcsname + {\@definecounter{#1}\@addtoreset{#1}{#3}% + \expandafter\xdef\csname the#1\endcsname{\expandafter\noexpand + \csname the#3\endcsname \noexpand\@thmcountersep \@thmcounter{#1}}% + \expandafter\xdef\csname #1name\endcsname{#2}% + \global\@namedef{#1}{\@spthm{#1}{\csname #1name\endcsname}{#4}{#5}}% + \global\@namedef{end#1}{\@endtheorem}}} + +\def\@spynthm#1#2#3#4{\expandafter\@ifdefinable\csname #1\endcsname + {\@definecounter{#1}% + \expandafter\xdef\csname the#1\endcsname{\@thmcounter{#1}}% + \expandafter\xdef\csname #1name\endcsname{#2}% + \global\@namedef{#1}{\@spthm{#1}{\csname #1name\endcsname}{#3}{#4}}% + \global\@namedef{end#1}{\@endtheorem}}} + +\def\@spothm#1[#2]#3#4#5{% + \@ifundefined{c@#2}{\@latexerr{No theorem environment `#2' defined}\@eha}% + {\expandafter\@ifdefinable\csname #1\endcsname + {\newaliascnt{#1}{#2}% + \expandafter\xdef\csname #1name\endcsname{#3}% + \global\@namedef{#1}{\@spthm{#1}{\csname #1name\endcsname}{#4}{#5}}% + \global\@namedef{end#1}{\@endtheorem}}}} + +\def\@spthm#1#2#3#4{\topsep 7\p@ \@plus2\p@ \@minus4\p@ +\refstepcounter{#1}% +\@ifnextchar[{\@spythm{#1}{#2}{#3}{#4}}{\@spxthm{#1}{#2}{#3}{#4}}} + +\def\@spxthm#1#2#3#4{\@spbegintheorem{#2}{\csname the#1\endcsname}{#3}{#4}% + \ignorespaces} + +\def\@spythm#1#2#3#4[#5]{\@spopargbegintheorem{#2}{\csname + the#1\endcsname}{#5}{#3}{#4}\ignorespaces} + +\def\@spbegintheorem#1#2#3#4{\trivlist + \item[\hskip\labelsep{#3#1\ #2\@thmcounterend}]#4} + +\def\@spopargbegintheorem#1#2#3#4#5{\trivlist + \item[\hskip\labelsep{#4#1\ #2}]{#4(#3)\@thmcounterend\ }#5} + +% definition of \spnewtheorem* without number + +\def\@sthm#1#2{\@Ynthm{#1}{#2}} + +\def\@Ynthm#1#2#3#4{\expandafter\@ifdefinable\csname #1\endcsname + {\global\@namedef{#1}{\@Thm{\csname #1name\endcsname}{#3}{#4}}% + \expandafter\xdef\csname #1name\endcsname{#2}% + \global\@namedef{end#1}{\@endtheorem}}} + +\def\@Thm#1#2#3{\topsep 7\p@ \@plus2\p@ \@minus4\p@ +\@ifnextchar[{\@Ythm{#1}{#2}{#3}}{\@Xthm{#1}{#2}{#3}}} + +\def\@Xthm#1#2#3{\@Begintheorem{#1}{#2}{#3}\ignorespaces} + +\def\@Ythm#1#2#3[#4]{\@Opargbegintheorem{#1} + {#4}{#2}{#3}\ignorespaces} + +\def\@Begintheorem#1#2#3{#3\trivlist + \item[\hskip\labelsep{#2#1\@thmcounterend}]} + +\def\@Opargbegintheorem#1#2#3#4{#4\trivlist + \item[\hskip\labelsep{#3#1}]{#3(#2)\@thmcounterend\ }} + +\if@envcntsect + \def\@thmcountersep{.} + \spnewtheorem{theorem}{Theorem}[section]{\bfseries}{\itshape} +\else + \spnewtheorem{theorem}{Theorem}{\bfseries}{\itshape} + \if@envcntreset + \@addtoreset{theorem}{section} + \else + \@addtoreset{theorem}{chapter} + \fi +\fi + +%definition of divers theorem environments +\spnewtheorem*{claim}{Claim}{\itshape}{\rmfamily} +\spnewtheorem*{proof}{Proof}{\itshape}{\rmfamily} +\if@envcntsame % alle Umgebungen wie Theorem. + \def\spn@wtheorem#1#2#3#4{\@spothm{#1}[theorem]{#2}{#3}{#4}} +\else % alle Umgebungen mit eigenem Zaehler + \if@envcntsect % mit section numeriert + \def\spn@wtheorem#1#2#3#4{\@spxnthm{#1}{#2}[section]{#3}{#4}} + \else % nicht mit section numeriert + \if@envcntreset + \def\spn@wtheorem#1#2#3#4{\@spynthm{#1}{#2}{#3}{#4} + \@addtoreset{#1}{section}} + \else + \def\spn@wtheorem#1#2#3#4{\@spynthm{#1}{#2}{#3}{#4} + \@addtoreset{#1}{chapter}}% + \fi + \fi +\fi +\spn@wtheorem{case}{Case}{\itshape}{\rmfamily} +\spn@wtheorem{conjecture}{Conjecture}{\itshape}{\rmfamily} +\spn@wtheorem{corollary}{Corollary}{\bfseries}{\itshape} +\spn@wtheorem{definition}{Definition}{\bfseries}{\itshape} +\spn@wtheorem{example}{Example}{\itshape}{\rmfamily} +\spn@wtheorem{exercise}{Exercise}{\itshape}{\rmfamily} +\spn@wtheorem{lemma}{Lemma}{\bfseries}{\itshape} +\spn@wtheorem{note}{Note}{\itshape}{\rmfamily} +\spn@wtheorem{problem}{Problem}{\itshape}{\rmfamily} +\spn@wtheorem{property}{Property}{\itshape}{\rmfamily} +\spn@wtheorem{proposition}{Proposition}{\bfseries}{\itshape} +\spn@wtheorem{question}{Question}{\itshape}{\rmfamily} +\spn@wtheorem{solution}{Solution}{\itshape}{\rmfamily} +\spn@wtheorem{remark}{Remark}{\itshape}{\rmfamily} + +\def\@takefromreset#1#2{% + \def\@tempa{#1}% + \let\@tempd\@elt + \def\@elt##1{% + \def\@tempb{##1}% + \ifx\@tempa\@tempb\else + \@addtoreset{##1}{#2}% + \fi}% + \expandafter\expandafter\let\expandafter\@tempc\csname cl@#2\endcsname + \expandafter\def\csname cl@#2\endcsname{}% + \@tempc + \let\@elt\@tempd} + +\def\theopargself{\def\@spopargbegintheorem##1##2##3##4##5{\trivlist + \item[\hskip\labelsep{##4##1\ ##2}]{##4##3\@thmcounterend\ }##5} + \def\@Opargbegintheorem##1##2##3##4{##4\trivlist + \item[\hskip\labelsep{##3##1}]{##3##2\@thmcounterend\ }} + } + +\renewenvironment{abstract}{% + \list{}{\advance\topsep by0.35cm\relax\small + \leftmargin=1cm + \labelwidth=\z@ + \listparindent=\z@ + \itemindent\listparindent + \rightmargin\leftmargin}\item[\hskip\labelsep + \bfseries\abstractname]} + {\endlist} + +\newdimen\headlineindent % dimension for space between +\headlineindent=1.166cm % number and text of headings. + +\def\ps@headings{\let\@mkboth\@gobbletwo + \let\@oddfoot\@empty\let\@evenfoot\@empty + \def\@evenhead{\normalfont\small\rlap{\thepage}\hspace{\headlineindent}% + \leftmark\hfil} + \def\@oddhead{\normalfont\small\hfil\rightmark\hspace{\headlineindent}% + \llap{\thepage}} + \def\chaptermark##1{}% + \def\sectionmark##1{}% + \def\subsectionmark##1{}} + +\def\ps@titlepage{\let\@mkboth\@gobbletwo + \let\@oddfoot\@empty\let\@evenfoot\@empty + \def\@evenhead{\normalfont\small\rlap{\thepage}\hspace{\headlineindent}% + \hfil} + \def\@oddhead{\normalfont\small\hfil\hspace{\headlineindent}% + \llap{\thepage}} + \def\chaptermark##1{}% + \def\sectionmark##1{}% + \def\subsectionmark##1{}} + +\if@runhead\ps@headings\else +\ps@empty\fi + +\setlength\arraycolsep{1.4\p@} +\setlength\tabcolsep{1.4\p@} + +\endinput +%end of file llncs.cls diff --git a/docs/poster/abstract/main.pdf b/docs/poster/abstract/main.pdf new file mode 100644 index 0000000..fa9d653 Binary files /dev/null and b/docs/poster/abstract/main.pdf differ diff --git a/docs/poster/abstract/main.tex b/docs/poster/abstract/main.tex new file mode 100644 index 0000000..ac2770c --- /dev/null +++ b/docs/poster/abstract/main.tex @@ -0,0 +1,108 @@ +\documentclass{llncs} + +\usepackage[utf8]{inputenc} +\usepackage[T1]{fontenc} + +% \usepackage{amsmath} +% \usepackage{amssymb} +% \usepackage{amsthm} +% \usepackage{xspace} +% \usepackage{todonotes} +% \usepackage{authblk} +\usepackage{graphicx} +\usepackage{listings} +% \usepackage{wrapfig} +% \usepackage[inline,shortlabels]{enumitem} + +\usepackage{cite} % sort cite numbers, prevent breaks +\usepackage{fnpct} % nicely typeset footnotes *preceding* punctuation +\usepackage{microtype} % towards typographic perfection + +\usepackage{hyperref} +\usepackage{cleveref} + +\widowpenalty1000 +\clubpenalty1000 + +\title{odgf-python -- A Python Interface for the Open Graph Drawing~Framework% + \thanks{Funded by the Deutsche Forschungsgemeinschaft (German Research Foundation, DFG) under grant RU-1903/3-1.} +} +\author{Simon D. Fink\orcidID{0000-0002-2754-1195}, Andreas Strobl} +\institute{Faculty for Mathematics and Computer Science, University of Passau,\\Passau, Germany\\\email{\{finksim,strobland\}@fim.uni-passau.de}} +\date{} + +\begin{document} + +\maketitle + +\begin{abstract} +The Open Graph Drawing Framework (OGDF) is a C++ library that contains a vast amount of algorithms and data structures for automatic graph drawing. +While the library is powerful, it is also not easily accessible for new users and the nature of C++ makes implementing even simple algorithms cumbersome to non-experts. +The \texttt{odgf-python} project remedies these problems by making the full functionality of the OGDF available from Python, providing a visual way to iteratively develop graph algorithms. + +\keywords {OGDF \and Graph Algorithms \and Python \and Jupyter Notebooks} +\end{abstract} + + +The Open Graph Drawing Framework (OGDF) \cite{cgj-tog-13} is a C++ library that contains a vast amount of algorithms and data structures for +automatic graph drawing. +While the library is powerful, it is also not easily accessible for new users and the nature of C++ makes implementing even simple algorithms cumbersome to non-experts. +New C++ projects require non-trivial set-up and distinct code-compile-execute iterations make it hard to incrementally develop a new algorithm. +This is because they separate the code from its results and there is no easy way to debug and visually analyze the current state of the program. + +Many of these issues have been resolved within the Python ecosystem \cite{per-tcc-21}. +The \texttt{odgf-python}\footnote{\url{https://github.com/N-Coder/ogdf-python}} project remedies these problems also for the OGDF by making its full functionality available from Python. +A similar approach has recently been taken to make the Computational Geometry Algorithms Library (CGAL) more accessible \cite{gfh-cmm-22}. +A Python interface greatly reduces the overhead and complications when using a library for the first time and unlocks a large ecosystem +of other libraries and tools, for example the interactive computing Notebooks provided by Project Jupyter \cite{krp-jn-16}. +These Notebooks allow iteratively developing algorithms and visualize their results inline right next to their code \cite{per-tcc-21}. +They are widely used in different scientific contexts and constitute the de facto standard in data science \cite{per-wji-18}. + +A key component of the \texttt{odgf-python} library is its graph display widget for Jupyter Notebooks \cite{str-agw-22}. +It can be used as-is to quickly explore and modify the current graph in-memory. +At the same time, it can be used as a building block for more complex user interfaces, where its interactivity can be fully customized to suit different applications. +Combining this with the UI components of Jupyter's \texttt{ipywidgets} allows to easily build platform-independent user interfaces for interacting with graphs and algorithms. +Example use cases include the iterative development of new graph algorithms, +step-by-step debugging of implemented algorithms, +visual editing of in-memory graphs and variables, +interactive visualization of algorithms for teaching, and +flexible user interfaces for domain-specific applications. + +Internally, \texttt{ogdf-python} uses the \texttt{cppyy} library \cite{ld-hpp-16,kvl-eaa-23} to automatically generate python bindings for the C++ OGDF library. +One of the main advantages of \texttt{cppyy} is that there is no need for explicitly declared bindings or interfaces. +This makes \texttt{ogdf-python} future-proof by being automatically compatible with future versions of the OGDF without the need for adaptions or manual updates to declarations. +The \texttt{cppyy} library also allows for arbitrary C++ code to be loaded and called from Python. +This allows for variables, functions and even classes to be created and used in either language. + +\subsection*{Features} +\begin{itemize} +\item \textbf{No C++ skills needed}: The full OGDF API is available from Python. +\item \textbf{Rapid prototyping}: Python needs less boilerplate and allows more idiomatic constructions, + without the need to configure and compile anything. +\item \textbf{Iterative execution}: Jupyter Notebooks allow individual lines of code to be adapted and re-run, + retaining all previous variable values. +\item \textbf{Inline results}: Graphs are visually displayed right next to the code that generates them. +\item \textbf{Interactive graph exploration}: The inline display allows interactive zooming and panning to easily explore the graph. +\item \textbf{Extensible building block}: The library can be easily combined with other projects from the Python ecosystem, for example with \texttt{ipywidgets} to build portable user interfaces for graphs. +\end{itemize} + +\subsection*{Installation} +The \texttt{ogdf-python} library comes with a prebuilt version of the OGDF called \texttt{ogdf-wheel} that works on Linux, macOS and in the Windows Subsystem for Linux. +Both components can easily be installed using the Python package manager~pip: + +\begin{lstlisting}[language=bash] +pip3 install ogdf-python ogdf-wheel notebook +jupyter notebook # start an interactive notebook +\end{lstlisting} + +% \begin{figure}[h] +% \centering +% \includegraphics[width=.5\linewidth]{screenshot} +% \caption{A screenshot of a Jupyter Notebook with some example code using \texttt{ogdf-python} followed by an inline visualization of its resulting graph layout.} +% \label{fig} +% \end{figure} + +\bibliographystyle{splncs04} +\bibliography{bibliography} + +\end{document} diff --git a/docs/poster/abstract/screenshot.png b/docs/poster/abstract/screenshot.png new file mode 100644 index 0000000..87122a6 Binary files /dev/null and b/docs/poster/abstract/screenshot.png differ diff --git a/docs/poster/abstract/splncs04.bst b/docs/poster/abstract/splncs04.bst new file mode 100644 index 0000000..3be8de3 --- /dev/null +++ b/docs/poster/abstract/splncs04.bst @@ -0,0 +1,1548 @@ +%% BibTeX bibliography style `splncs03' +%% +%% BibTeX bibliography style for use with numbered references in +%% Springer Verlag's "Lecture Notes in Computer Science" series. +%% (See Springer's documentation for llncs.cls for +%% more details of the suggested reference format.) Note that this +%% file will not work for author-year style citations. +%% +%% Use \documentclass{llncs} and \bibliographystyle{splncs03}, and cite +%% a reference with (e.g.) \cite{smith77} to get a "[1]" in the text. +%% +%% This file comes to you courtesy of Maurizio "Titto" Patrignani of +%% Dipartimento di Informatica e Automazione Universita' Roma Tre +%% +%% ================================================================================================ +%% This was file `titto-lncs-02.bst' produced on Wed Apr 1, 2009 +%% Edited by hand by titto based on `titto-lncs-01.bst' (see below) +%% +%% CHANGES (with respect to titto-lncs-01.bst): +%% - Removed the call to \urlprefix (thus no "URL" string is added to the output) +%% ================================================================================================ +%% This was file `titto-lncs-01.bst' produced on Fri Aug 22, 2008 +%% Edited by hand by titto based on `titto.bst' (see below) +%% +%% CHANGES (with respect to titto.bst): +%% - Removed the "capitalize" command for editors string "(eds.)" and "(ed.)" +%% - Introduced the functions titto.bbl.pages and titto.bbl.page for journal pages (without "pp.") +%% - Added a new.sentence command to separate with a dot booktitle and series in the inproceedings +%% - Commented all new.block commands before urls and notes (to separate them with a comma) +%% - Introduced the functions titto.bbl.volume for handling journal volumes (without "vol." label) +%% - Used for editors the same name conventions used for authors (see function format.in.ed.booktitle) +%% - Removed a \newblock to avoid long spaces between title and "In: ..." +%% - Added function titto.space.prefix to add a space instead of "~" after the (removed) "vol." label +%% - Added doi +%% ================================================================================================ +%% This was file `titto.bst', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% merlin.mbs (with options: `vonx,nm-rvvc,yr-par,jttl-rm,volp-com,jwdpg,jwdvol,numser,ser-vol,jnm-x,btit-rm,bt-rm,edparxc,bkedcap,au-col,in-col,fin-bare,pp,ed,abr,mth-bare,xedn,jabr,and-com,and-com-ed,xand,url,url-blk,em-x,nfss,') +%% ---------------------------------------- +%% *** Tentative .bst file for Springer LNCS *** +%% +%% Copyright 1994-2007 Patrick W Daly + % =============================================================== + % IMPORTANT NOTICE: + % This bibliographic style (bst) file has been generated from one or + % more master bibliographic style (mbs) files, listed above. + % + % This generated file can be redistributed and/or modified under the terms + % of the LaTeX Project Public License Distributed from CTAN + % archives in directory macros/latex/base/lppl.txt; either + % version 1 of the License, or any later version. + % =============================================================== + % Name and version information of the main mbs file: + % \ProvidesFile{merlin.mbs}[2007/04/24 4.20 (PWD, AO, DPC)] + % For use with BibTeX version 0.99a or later + %------------------------------------------------------------------- + % This bibliography style file is intended for texts in ENGLISH + % This is a numerical citation style, and as such is standard LaTeX. + % It requires no extra package to interface to the main text. + % The form of the \bibitem entries is + % \bibitem{key}... + % Usage of \cite is as follows: + % \cite{key} ==>> [#] + % \cite[chap. 2]{key} ==>> [#, chap. 2] + % where # is a number determined by the ordering in the reference list. + % The order in the reference list is alphabetical by authors. + %--------------------------------------------------------------------- + +ENTRY + { address + author + booktitle + chapter + doi + edition + editor + eid + howpublished + institution + journal + key + month + note + number + organization + pages + publisher + school + series + title + type + url + volume + year + } + {} + { label } +INTEGERS { output.state before.all mid.sentence after.sentence after.block } +FUNCTION {init.state.consts} +{ #0 'before.all := + #1 'mid.sentence := + #2 'after.sentence := + #3 'after.block := +} +STRINGS { s t} +FUNCTION {output.nonnull} +{ 's := + output.state mid.sentence = + { ", " * write$ } + { output.state after.block = + { add.period$ write$ +% newline$ +% "\newblock " write$ % removed for titto-lncs-01 + " " write$ % to avoid long spaces between title and "In: ..." + } + { output.state before.all = + 'write$ + { add.period$ " " * write$ } + if$ + } + if$ + mid.sentence 'output.state := + } + if$ + s +} +FUNCTION {output} +{ duplicate$ empty$ + 'pop$ + 'output.nonnull + if$ +} +FUNCTION {output.check} +{ 't := + duplicate$ empty$ + { pop$ "empty " t * " in " * cite$ * warning$ } + 'output.nonnull + if$ +} +FUNCTION {fin.entry} +{ duplicate$ empty$ + 'pop$ + 'write$ + if$ + newline$ +} + +FUNCTION {new.block} +{ output.state before.all = + 'skip$ + { after.block 'output.state := } + if$ +} +FUNCTION {new.sentence} +{ output.state after.block = + 'skip$ + { output.state before.all = + 'skip$ + { after.sentence 'output.state := } + if$ + } + if$ +} +FUNCTION {add.blank} +{ " " * before.all 'output.state := +} + + +FUNCTION {add.colon} +{ duplicate$ empty$ + 'skip$ + { ":" * add.blank } + if$ +} + +FUNCTION {date.block} +{ + new.block +} + +FUNCTION {not} +{ { #0 } + { #1 } + if$ +} +FUNCTION {and} +{ 'skip$ + { pop$ #0 } + if$ +} +FUNCTION {or} +{ { pop$ #1 } + 'skip$ + if$ +} +STRINGS {z} +FUNCTION {remove.dots} +{ 'z := + "" + { z empty$ not } + { z #1 #1 substring$ + z #2 global.max$ substring$ 'z := + duplicate$ "." = 'pop$ + { * } + if$ + } + while$ +} +FUNCTION {new.block.checka} +{ empty$ + 'skip$ + 'new.block + if$ +} +FUNCTION {new.block.checkb} +{ empty$ + swap$ empty$ + and + 'skip$ + 'new.block + if$ +} +FUNCTION {new.sentence.checka} +{ empty$ + 'skip$ + 'new.sentence + if$ +} +FUNCTION {new.sentence.checkb} +{ empty$ + swap$ empty$ + and + 'skip$ + 'new.sentence + if$ +} +FUNCTION {field.or.null} +{ duplicate$ empty$ + { pop$ "" } + 'skip$ + if$ +} +FUNCTION {emphasize} +{ skip$ } + +FUNCTION {embolden} +{ duplicate$ empty$ +{ pop$ "" } +{ "\textbf{" swap$ * "}" * } +if$ +} +FUNCTION {tie.or.space.prefix} +{ duplicate$ text.length$ #5 < + { "~" } + { " " } + if$ + swap$ +} +FUNCTION {titto.space.prefix} % always introduce a space +{ duplicate$ text.length$ #3 < + { " " } + { " " } + if$ + swap$ +} + + +FUNCTION {capitalize} +{ "u" change.case$ "t" change.case$ } + +FUNCTION {space.word} +{ " " swap$ * " " * } + % Here are the language-specific definitions for explicit words. + % Each function has a name bbl.xxx where xxx is the English word. + % The language selected here is ENGLISH +FUNCTION {bbl.and} +{ "and"} + +FUNCTION {bbl.etal} +{ "et~al." } + +FUNCTION {bbl.editors} +{ "eds." } + +FUNCTION {bbl.editor} +{ "ed." } + +FUNCTION {bbl.edby} +{ "edited by" } + +FUNCTION {bbl.edition} +{ "edn." } + +FUNCTION {bbl.volume} +{ "vol." } + +FUNCTION {titto.bbl.volume} % for handling journals +{ "" } + +FUNCTION {bbl.of} +{ "of" } + +FUNCTION {bbl.number} +{ "no." } + +FUNCTION {bbl.nr} +{ "no." } + +FUNCTION {bbl.in} +{ "in" } + +FUNCTION {bbl.pages} +{ "pp." } + +FUNCTION {bbl.page} +{ "p." } + +FUNCTION {titto.bbl.pages} % for journals +{ "" } + +FUNCTION {titto.bbl.page} % for journals +{ "" } + +FUNCTION {bbl.chapter} +{ "chap." } + +FUNCTION {bbl.techrep} +{ "Tech. Rep." } + +FUNCTION {bbl.mthesis} +{ "Master's thesis" } + +FUNCTION {bbl.phdthesis} +{ "Ph.D. thesis" } + +MACRO {jan} {"Jan."} + +MACRO {feb} {"Feb."} + +MACRO {mar} {"Mar."} + +MACRO {apr} {"Apr."} + +MACRO {may} {"May"} + +MACRO {jun} {"Jun."} + +MACRO {jul} {"Jul."} + +MACRO {aug} {"Aug."} + +MACRO {sep} {"Sep."} + +MACRO {oct} {"Oct."} + +MACRO {nov} {"Nov."} + +MACRO {dec} {"Dec."} + +MACRO {acmcs} {"ACM Comput. Surv."} + +MACRO {acta} {"Acta Inf."} + +MACRO {cacm} {"Commun. ACM"} + +MACRO {ibmjrd} {"IBM J. Res. Dev."} + +MACRO {ibmsj} {"IBM Syst.~J."} + +MACRO {ieeese} {"IEEE Trans. Software Eng."} + +MACRO {ieeetc} {"IEEE Trans. Comput."} + +MACRO {ieeetcad} + {"IEEE Trans. Comput. Aid. Des."} + +MACRO {ipl} {"Inf. Process. Lett."} + +MACRO {jacm} {"J.~ACM"} + +MACRO {jcss} {"J.~Comput. Syst. Sci."} + +MACRO {scp} {"Sci. Comput. Program."} + +MACRO {sicomp} {"SIAM J. Comput."} + +MACRO {tocs} {"ACM Trans. Comput. Syst."} + +MACRO {tods} {"ACM Trans. Database Syst."} + +MACRO {tog} {"ACM Trans. Graphic."} + +MACRO {toms} {"ACM Trans. Math. Software"} + +MACRO {toois} {"ACM Trans. Office Inf. Syst."} + +MACRO {toplas} {"ACM Trans. Progr. Lang. Syst."} + +MACRO {tcs} {"Theor. Comput. Sci."} + +FUNCTION {bibinfo.check} +{ swap$ + duplicate$ missing$ + { + pop$ pop$ + "" + } + { duplicate$ empty$ + { + swap$ pop$ + } + { swap$ + pop$ + } + if$ + } + if$ +} +FUNCTION {bibinfo.warn} +{ swap$ + duplicate$ missing$ + { + swap$ "missing " swap$ * " in " * cite$ * warning$ pop$ + "" + } + { duplicate$ empty$ + { + swap$ "empty " swap$ * " in " * cite$ * warning$ + } + { swap$ + pop$ + } + if$ + } + if$ +} +FUNCTION {format.url} +{ url empty$ + { "" } +% { "\urlprefix\url{" url * "}" * } + { "\url{" url * "}" * } % changed in titto-lncs-02.bst + if$ +} + +FUNCTION {format.doi} % added in splncs04.bst +{ doi empty$ + { "" } + { after.block 'output.state := + "\doi{" doi * "}" * } + if$ +} + +INTEGERS { nameptr namesleft numnames } + + +STRINGS { bibinfo} + +FUNCTION {format.names} +{ 'bibinfo := + duplicate$ empty$ 'skip$ { + 's := + "" 't := + #1 'nameptr := + s num.names$ 'numnames := + numnames 'namesleft := + { namesleft #0 > } + { s nameptr + "{vv~}{ll}{, jj}{, f{.}.}" + format.name$ + bibinfo bibinfo.check + 't := + nameptr #1 > + { + namesleft #1 > + { ", " * t * } + { + s nameptr "{ll}" format.name$ duplicate$ "others" = + { 't := } + { pop$ } + if$ + "," * + t "others" = + { + " " * bbl.etal * + } + { " " * t * } + if$ + } + if$ + } + 't + if$ + nameptr #1 + 'nameptr := + namesleft #1 - 'namesleft := + } + while$ + } if$ +} +FUNCTION {format.names.ed} +{ + 'bibinfo := + duplicate$ empty$ 'skip$ { + 's := + "" 't := + #1 'nameptr := + s num.names$ 'numnames := + numnames 'namesleft := + { namesleft #0 > } + { s nameptr + "{f{.}.~}{vv~}{ll}{ jj}" + format.name$ + bibinfo bibinfo.check + 't := + nameptr #1 > + { + namesleft #1 > + { ", " * t * } + { + s nameptr "{ll}" format.name$ duplicate$ "others" = + { 't := } + { pop$ } + if$ + "," * + t "others" = + { + + " " * bbl.etal * + } + { " " * t * } + if$ + } + if$ + } + 't + if$ + nameptr #1 + 'nameptr := + namesleft #1 - 'namesleft := + } + while$ + } if$ +} +FUNCTION {format.authors} +{ author "author" format.names +} +FUNCTION {get.bbl.editor} +{ editor num.names$ #1 > 'bbl.editors 'bbl.editor if$ } + +FUNCTION {format.editors} +{ editor "editor" format.names duplicate$ empty$ 'skip$ + { + " " * + get.bbl.editor +% capitalize + "(" swap$ * ")" * + * + } + if$ +} +FUNCTION {format.note} +{ + note empty$ + { "" } + { note #1 #1 substring$ + duplicate$ "{" = + 'skip$ + { output.state mid.sentence = + { "l" } + { "u" } + if$ + change.case$ + } + if$ + note #2 global.max$ substring$ * "note" bibinfo.check + } + if$ +} + +FUNCTION {format.title} +{ title + duplicate$ empty$ 'skip$ + { "t" change.case$ } + if$ + "title" bibinfo.check +} +FUNCTION {output.bibitem} +{ newline$ + "\bibitem{" write$ + cite$ write$ + "}" write$ + newline$ + "" + before.all 'output.state := +} + +FUNCTION {n.dashify} +{ + 't := + "" + { t empty$ not } + { t #1 #1 substring$ "-" = + { t #1 #2 substring$ "--" = not + { "--" * + t #2 global.max$ substring$ 't := + } + { { t #1 #1 substring$ "-" = } + { "-" * + t #2 global.max$ substring$ 't := + } + while$ + } + if$ + } + { t #1 #1 substring$ * + t #2 global.max$ substring$ 't := + } + if$ + } + while$ +} + +FUNCTION {word.in} +{ bbl.in capitalize + ":" * + " " * } + +FUNCTION {format.date} +{ + month "month" bibinfo.check + duplicate$ empty$ + year "year" bibinfo.check duplicate$ empty$ + { swap$ 'skip$ + { "there's a month but no year in " cite$ * warning$ } + if$ + * + } + { swap$ 'skip$ + { + swap$ + " " * swap$ + } + if$ + * + remove.dots + } + if$ + duplicate$ empty$ + 'skip$ + { + before.all 'output.state := + " (" swap$ * ")" * + } + if$ +} +FUNCTION {format.btitle} +{ title "title" bibinfo.check + duplicate$ empty$ 'skip$ + { + } + if$ +} +FUNCTION {either.or.check} +{ empty$ + 'pop$ + { "can't use both " swap$ * " fields in " * cite$ * warning$ } + if$ +} +FUNCTION {format.bvolume} +{ volume empty$ + { "" } + { bbl.volume volume tie.or.space.prefix + "volume" bibinfo.check * * + series "series" bibinfo.check + duplicate$ empty$ 'pop$ + { emphasize ", " * swap$ * } + if$ + "volume and number" number either.or.check + } + if$ +} +FUNCTION {format.number.series} +{ volume empty$ + { number empty$ + { series field.or.null } + { output.state mid.sentence = + { bbl.number } + { bbl.number capitalize } + if$ + number tie.or.space.prefix "number" bibinfo.check * * + series empty$ + { "there's a number but no series in " cite$ * warning$ } + { bbl.in space.word * + series "series" bibinfo.check * + } + if$ + } + if$ + } + { "" } + if$ +} + +FUNCTION {format.edition} +{ edition duplicate$ empty$ 'skip$ + { + output.state mid.sentence = + { "l" } + { "t" } + if$ change.case$ + "edition" bibinfo.check + " " * bbl.edition * + } + if$ +} +INTEGERS { multiresult } +FUNCTION {multi.page.check} +{ 't := + #0 'multiresult := + { multiresult not + t empty$ not + and + } + { t #1 #1 substring$ + duplicate$ "-" = + swap$ duplicate$ "," = + swap$ "+" = + or or + { #1 'multiresult := } + { t #2 global.max$ substring$ 't := } + if$ + } + while$ + multiresult +} +FUNCTION {format.pages} +{ pages duplicate$ empty$ 'skip$ + { duplicate$ multi.page.check + { + bbl.pages swap$ + n.dashify + } + { + bbl.page swap$ + } + if$ + tie.or.space.prefix + "pages" bibinfo.check + * * + } + if$ +} +FUNCTION {format.journal.pages} +{ pages duplicate$ empty$ 'pop$ + { swap$ duplicate$ empty$ + { pop$ pop$ format.pages } + { + ", " * + swap$ + n.dashify + pages multi.page.check + 'titto.bbl.pages + 'titto.bbl.page + if$ + swap$ tie.or.space.prefix + "pages" bibinfo.check + * * + * + } + if$ + } + if$ +} +FUNCTION {format.journal.eid} +{ eid "eid" bibinfo.check + duplicate$ empty$ 'pop$ + { swap$ duplicate$ empty$ 'skip$ + { + ", " * + } + if$ + swap$ * + } + if$ +} +FUNCTION {format.vol.num.pages} % this function is used only for journal entries +{ volume field.or.null embolden + duplicate$ empty$ 'skip$ + { +% bbl.volume swap$ tie.or.space.prefix + titto.bbl.volume swap$ titto.space.prefix +% rationale for the change above: for journals you don't want "vol." label +% hence it does not make sense to attach the journal number to the label when +% it is short + "volume" bibinfo.check + * * + } + if$ + number "number" bibinfo.check duplicate$ empty$ 'skip$ + { + swap$ duplicate$ empty$ + { "there's a number but no volume in " cite$ * warning$ } + 'skip$ + if$ + swap$ + "(" swap$ * ")" * + } + if$ * + eid empty$ + { format.journal.pages } + { format.journal.eid } + if$ +} + +FUNCTION {format.chapter.pages} +{ chapter empty$ + 'format.pages + { type empty$ + { bbl.chapter } + { type "l" change.case$ + "type" bibinfo.check + } + if$ + chapter tie.or.space.prefix + "chapter" bibinfo.check + * * + pages empty$ + 'skip$ + { ", " * format.pages * } + if$ + } + if$ +} + +FUNCTION {format.booktitle} +{ + booktitle "booktitle" bibinfo.check +} +FUNCTION {format.in.ed.booktitle} +{ format.booktitle duplicate$ empty$ 'skip$ + { +% editor "editor" format.names.ed duplicate$ empty$ 'pop$ % changed by titto + editor "editor" format.names duplicate$ empty$ 'pop$ + { + " " * + get.bbl.editor +% capitalize + "(" swap$ * ") " * + * swap$ + * } + if$ + word.in swap$ * + } + if$ +} +FUNCTION {empty.misc.check} +{ author empty$ title empty$ howpublished empty$ + month empty$ year empty$ note empty$ + and and and and and + key empty$ not and + { "all relevant fields are empty in " cite$ * warning$ } + 'skip$ + if$ +} +FUNCTION {format.thesis.type} +{ type duplicate$ empty$ + 'pop$ + { swap$ pop$ + "t" change.case$ "type" bibinfo.check + } + if$ +} +FUNCTION {format.tr.number} +{ number "number" bibinfo.check + type duplicate$ empty$ + { pop$ bbl.techrep } + 'skip$ + if$ + "type" bibinfo.check + swap$ duplicate$ empty$ + { pop$ "t" change.case$ } + { tie.or.space.prefix * * } + if$ +} +FUNCTION {format.article.crossref} +{ + key duplicate$ empty$ + { pop$ + journal duplicate$ empty$ + { "need key or journal for " cite$ * " to crossref " * crossref * warning$ } + { "journal" bibinfo.check emphasize word.in swap$ * } + if$ + } + { word.in swap$ * " " *} + if$ + " \cite{" * crossref * "}" * +} +FUNCTION {format.crossref.editor} +{ editor #1 "{vv~}{ll}" format.name$ + "editor" bibinfo.check + editor num.names$ duplicate$ + #2 > + { pop$ + "editor" bibinfo.check + " " * bbl.etal + * + } + { #2 < + 'skip$ + { editor #2 "{ff }{vv }{ll}{ jj}" format.name$ "others" = + { + "editor" bibinfo.check + " " * bbl.etal + * + } + { + bbl.and space.word + * editor #2 "{vv~}{ll}" format.name$ + "editor" bibinfo.check + * + } + if$ + } + if$ + } + if$ +} +FUNCTION {format.book.crossref} +{ volume duplicate$ empty$ + { "empty volume in " cite$ * "'s crossref of " * crossref * warning$ + pop$ word.in + } + { bbl.volume + capitalize + swap$ tie.or.space.prefix "volume" bibinfo.check * * bbl.of space.word * + } + if$ + editor empty$ + editor field.or.null author field.or.null = + or + { key empty$ + { series empty$ + { "need editor, key, or series for " cite$ * " to crossref " * + crossref * warning$ + "" * + } + { series emphasize * } + if$ + } + { key * } + if$ + } + { format.crossref.editor * } + if$ + " \cite{" * crossref * "}" * +} +FUNCTION {format.incoll.inproc.crossref} +{ + editor empty$ + editor field.or.null author field.or.null = + or + { key empty$ + { format.booktitle duplicate$ empty$ + { "need editor, key, or booktitle for " cite$ * " to crossref " * + crossref * warning$ + } + { word.in swap$ * } + if$ + } + { word.in key * " " *} + if$ + } + { word.in format.crossref.editor * " " *} + if$ + " \cite{" * crossref * "}" * +} +FUNCTION {format.org.or.pub} +{ 't := + "" + address empty$ t empty$ and + 'skip$ + { + t empty$ + { address "address" bibinfo.check * + } + { t * + address empty$ + 'skip$ + { ", " * address "address" bibinfo.check * } + if$ + } + if$ + } + if$ +} +FUNCTION {format.publisher.address} +{ publisher "publisher" bibinfo.warn format.org.or.pub +} + +FUNCTION {format.organization.address} +{ organization "organization" bibinfo.check format.org.or.pub +} + +FUNCTION {article} +{ output.bibitem + format.authors "author" output.check + add.colon + new.block + format.title "title" output.check + new.block + crossref missing$ + { + journal + "journal" bibinfo.check + "journal" output.check + add.blank + format.vol.num.pages output + format.date "year" output.check + } + { format.article.crossref output.nonnull + format.pages output + } + if$ +% new.block + format.doi output + format.url output +% new.block + format.note output + fin.entry +} +FUNCTION {book} +{ output.bibitem + author empty$ + { format.editors "author and editor" output.check + add.colon + } + { format.authors output.nonnull + add.colon + crossref missing$ + { "author and editor" editor either.or.check } + 'skip$ + if$ + } + if$ + new.block + format.btitle "title" output.check + crossref missing$ + { format.bvolume output + new.block + new.sentence + format.number.series output + format.publisher.address output + } + { + new.block + format.book.crossref output.nonnull + } + if$ + format.edition output + format.date "year" output.check +% new.block + format.doi output + format.url output +% new.block + format.note output + fin.entry +} +FUNCTION {booklet} +{ output.bibitem + format.authors output + add.colon + new.block + format.title "title" output.check + new.block + howpublished "howpublished" bibinfo.check output + address "address" bibinfo.check output + format.date output +% new.block + format.doi output + format.url output +% new.block + format.note output + fin.entry +} + +FUNCTION {inbook} +{ output.bibitem + author empty$ + { format.editors "author and editor" output.check + add.colon + } + { format.authors output.nonnull + add.colon + crossref missing$ + { "author and editor" editor either.or.check } + 'skip$ + if$ + } + if$ + new.block + format.btitle "title" output.check + crossref missing$ + { + format.bvolume output + format.chapter.pages "chapter and pages" output.check + new.block + new.sentence + format.number.series output + format.publisher.address output + } + { + format.chapter.pages "chapter and pages" output.check + new.block + format.book.crossref output.nonnull + } + if$ + format.edition output + format.date "year" output.check +% new.block + format.doi output + format.url output +% new.block + format.note output + fin.entry +} + +FUNCTION {incollection} +{ output.bibitem + format.authors "author" output.check + add.colon + new.block + format.title "title" output.check + new.block + crossref missing$ + { format.in.ed.booktitle "booktitle" output.check + format.bvolume output + format.chapter.pages output + new.sentence + format.number.series output + format.publisher.address output + format.edition output + format.date "year" output.check + } + { format.incoll.inproc.crossref output.nonnull + format.chapter.pages output + } + if$ +% new.block + format.doi output + format.url output +% new.block + format.note output + fin.entry +} +FUNCTION {inproceedings} +{ output.bibitem + format.authors "author" output.check + add.colon + new.block + format.title "title" output.check + new.block + crossref missing$ + { format.in.ed.booktitle "booktitle" output.check + new.sentence % added by titto + format.bvolume output + format.pages output + new.sentence + format.number.series output + publisher empty$ + { format.organization.address output } + { organization "organization" bibinfo.check output + format.publisher.address output + } + if$ + format.date "year" output.check + } + { format.incoll.inproc.crossref output.nonnull + format.pages output + } + if$ +% new.block + format.doi output + format.url output +% new.block + format.note output + fin.entry +} +FUNCTION {conference} { inproceedings } +FUNCTION {manual} +{ output.bibitem + author empty$ + { organization "organization" bibinfo.check + duplicate$ empty$ 'pop$ + { output + address "address" bibinfo.check output + } + if$ + } + { format.authors output.nonnull } + if$ + add.colon + new.block + format.btitle "title" output.check + author empty$ + { organization empty$ + { + address new.block.checka + address "address" bibinfo.check output + } + 'skip$ + if$ + } + { + organization address new.block.checkb + organization "organization" bibinfo.check output + address "address" bibinfo.check output + } + if$ + format.edition output + format.date output +% new.block + format.doi output + format.url output +% new.block + format.note output + fin.entry +} + +FUNCTION {mastersthesis} +{ output.bibitem + format.authors "author" output.check + add.colon + new.block + format.btitle + "title" output.check + new.block + bbl.mthesis format.thesis.type output.nonnull + school "school" bibinfo.warn output + address "address" bibinfo.check output + format.date "year" output.check +% new.block + format.doi output + format.url output +% new.block + format.note output + fin.entry +} + +FUNCTION {misc} +{ output.bibitem + format.authors output + add.colon + title howpublished new.block.checkb + format.title output + howpublished new.block.checka + howpublished "howpublished" bibinfo.check output + format.date output +% new.block + format.doi output + format.url output +% new.block + format.note output + fin.entry + empty.misc.check +} +FUNCTION {phdthesis} +{ output.bibitem + format.authors "author" output.check + add.colon + new.block + format.btitle + "title" output.check + new.block + bbl.phdthesis format.thesis.type output.nonnull + school "school" bibinfo.warn output + address "address" bibinfo.check output + format.date "year" output.check +% new.block + format.doi output + format.url output +% new.block + format.note output + fin.entry +} + +FUNCTION {proceedings} +{ output.bibitem + editor empty$ + { organization "organization" bibinfo.check output + } + { format.editors output.nonnull } + if$ + add.colon + new.block + format.btitle "title" output.check + format.bvolume output + editor empty$ + { publisher empty$ + { format.number.series output } + { + new.sentence + format.number.series output + format.publisher.address output + } + if$ + } + { publisher empty$ + { + new.sentence + format.number.series output + format.organization.address output } + { + new.sentence + format.number.series output + organization "organization" bibinfo.check output + format.publisher.address output + } + if$ + } + if$ + format.date "year" output.check +% new.block + format.doi output + format.url output +% new.block + format.note output + fin.entry +} + +FUNCTION {techreport} +{ output.bibitem + format.authors "author" output.check + add.colon + new.block + format.title + "title" output.check + new.block + format.tr.number output.nonnull + institution "institution" bibinfo.warn output + address "address" bibinfo.check output + format.date "year" output.check +% new.block + format.doi output + format.url output +% new.block + format.note output + fin.entry +} + +FUNCTION {unpublished} +{ output.bibitem + format.authors "author" output.check + add.colon + new.block + format.title "title" output.check + format.date output +% new.block + format.url output +% new.block + format.note "note" output.check + fin.entry +} + +FUNCTION {default.type} { misc } +READ +FUNCTION {sortify} +{ purify$ + "l" change.case$ +} +INTEGERS { len } +FUNCTION {chop.word} +{ 's := + 'len := + s #1 len substring$ = + { s len #1 + global.max$ substring$ } + 's + if$ +} +FUNCTION {sort.format.names} +{ 's := + #1 'nameptr := + "" + s num.names$ 'numnames := + numnames 'namesleft := + { namesleft #0 > } + { s nameptr + "{ll{ }}{ ff{ }}{ jj{ }}" + format.name$ 't := + nameptr #1 > + { + " " * + namesleft #1 = t "others" = and + { "zzzzz" * } + { t sortify * } + if$ + } + { t sortify * } + if$ + nameptr #1 + 'nameptr := + namesleft #1 - 'namesleft := + } + while$ +} + +FUNCTION {sort.format.title} +{ 't := + "A " #2 + "An " #3 + "The " #4 t chop.word + chop.word + chop.word + sortify + #1 global.max$ substring$ +} +FUNCTION {author.sort} +{ author empty$ + { key empty$ + { "to sort, need author or key in " cite$ * warning$ + "" + } + { key sortify } + if$ + } + { author sort.format.names } + if$ +} +FUNCTION {author.editor.sort} +{ author empty$ + { editor empty$ + { key empty$ + { "to sort, need author, editor, or key in " cite$ * warning$ + "" + } + { key sortify } + if$ + } + { editor sort.format.names } + if$ + } + { author sort.format.names } + if$ +} +FUNCTION {author.organization.sort} +{ author empty$ + { organization empty$ + { key empty$ + { "to sort, need author, organization, or key in " cite$ * warning$ + "" + } + { key sortify } + if$ + } + { "The " #4 organization chop.word sortify } + if$ + } + { author sort.format.names } + if$ +} +FUNCTION {editor.organization.sort} +{ editor empty$ + { organization empty$ + { key empty$ + { "to sort, need editor, organization, or key in " cite$ * warning$ + "" + } + { key sortify } + if$ + } + { "The " #4 organization chop.word sortify } + if$ + } + { editor sort.format.names } + if$ +} +FUNCTION {presort} +{ type$ "book" = + type$ "inbook" = + or + 'author.editor.sort + { type$ "proceedings" = + 'editor.organization.sort + { type$ "manual" = + 'author.organization.sort + 'author.sort + if$ + } + if$ + } + if$ + " " + * + year field.or.null sortify + * + " " + * + title field.or.null + sort.format.title + * + #1 entry.max$ substring$ + 'sort.key$ := +} +ITERATE {presort} +SORT +STRINGS { longest.label } +INTEGERS { number.label longest.label.width } +FUNCTION {initialize.longest.label} +{ "" 'longest.label := + #1 'number.label := + #0 'longest.label.width := +} +FUNCTION {longest.label.pass} +{ number.label int.to.str$ 'label := + number.label #1 + 'number.label := + label width$ longest.label.width > + { label 'longest.label := + label width$ 'longest.label.width := + } + 'skip$ + if$ +} +EXECUTE {initialize.longest.label} +ITERATE {longest.label.pass} +FUNCTION {begin.bib} +{ preamble$ empty$ + 'skip$ + { preamble$ write$ newline$ } + if$ + "\begin{thebibliography}{" longest.label * "}" * + write$ newline$ + "\providecommand{\url}[1]{\texttt{#1}}" + write$ newline$ + "\providecommand{\urlprefix}{URL }" + write$ newline$ + "\providecommand{\doi}[1]{https://doi.org/#1}" + write$ newline$ +} +EXECUTE {begin.bib} +EXECUTE {init.state.consts} +ITERATE {call.type$} +FUNCTION {end.bib} +{ newline$ + "\end{thebibliography}" write$ newline$ +} +EXECUTE {end.bib} +%% End of customized bst file +%% +%% End of file `titto.bst'. diff --git a/docs/poster/content/algo.md b/docs/poster/content/algo.md new file mode 100644 index 0000000..4987685 --- /dev/null +++ b/docs/poster/content/algo.md @@ -0,0 +1,7 @@ +# Focus on the Algorithm, not the Language + +Developing algorithms in C++ can be cumbersome. New projects require non-trivial set-up, +and distinct code-compile-execute iterations make it hard to incrementally develop a new algorithm. +This is because they separate the code from its results and there is no easy way to debug and visually analyze the current state of the program. +All these issues have been resolved within the Python ecosystem, and `ogdf-python` now makes these solutions available for graph drawing use-cases. +Thanks to this, implementing known as well as new algorithms becomes much easier. \ No newline at end of file diff --git a/docs/poster/content/algo.py b/docs/poster/content/algo.py new file mode 100644 index 0000000..e56ca97 --- /dev/null +++ b/docs/poster/content/algo.py @@ -0,0 +1,24 @@ +discovery = ogdf.NodeArray[int](G, -1) +finish = ogdf.NodeArray[int](G, -1) +predecessor = ogdf.NodeArray[ogdf.node](G, nullptr) + +time = 0 + +def dfs_visit(u): + global time + + time += 1 + discovery[u] = time + + for adj in u.adjEntries: + v = adj.twinNode() + if adj.isSource() and discovery[v] < 0: + predecessor[v] = u + dfs_visit(v) + + time += 1 + finish[u] = time + +for n in G.nodes: + if discovery[n] < 0: + dfs_visit(n) \ No newline at end of file diff --git a/docs/poster/content/algo2.cpp b/docs/poster/content/algo2.cpp new file mode 100644 index 0000000..0a379ba --- /dev/null +++ b/docs/poster/content/algo2.cpp @@ -0,0 +1,35 @@ +struct DFS { + Graph G; + + NodeArray discovery; + NodeArray finish; + NodeArray predecessor; + + int time = 0; + + DFS(const Graph& g) : G(g), + discovery(G, -1), finish(G, -1), + predecessor(G, nullptr) { } + + void dfs_visit(node u) { + time += 1; + discovery[u] = time; + + for (adjEntry adj : u->adjEntries) { + node v = adj->twinNode(); + if (adj->isSource() && discovery[v] < 0) { + predecessor[v] = u; + dfs_visit(v); + } + } + + time += 1; + finish[u] = time; + } + + void dfs() { + for (node n : G.nodes) + if (discovery[n] < 0) + dfs_visit(n); + } +}; diff --git a/docs/poster/content/algo2.py b/docs/poster/content/algo2.py new file mode 100644 index 0000000..aaa1dd6 --- /dev/null +++ b/docs/poster/content/algo2.py @@ -0,0 +1,34 @@ +class DFS: + def __init__(self, G): + self.G = G + + self.discovery = \ + ogdf.NodeArray[int](G, -1) + self.finish = \ + ogdf.NodeArray[int](G, -1) + self.predecessor = \ + ogdf.NodeArray[ogdf.node](G, nullptr) + + self.time = 0 + + + + + def dfs_visit(self,u): + self.time += 1 + self.discovery[u] = self.time + + for adj in u.adjEntries: + v = adj.twinNode() + if adj.isSource() and \ + self.discovery[v] < 0: + self.predecessor[v] = u + self.dfs_visit(v) + + self.time += 1 + self.finish[u] = self.time + + def dfs(self): + for n in self.G.nodes: + if self.discovery[n] < 0: + self.dfs_visit(n) diff --git a/docs/poster/content/dfs.md b/docs/poster/content/dfs.md new file mode 100644 index 0000000..2fc4c4c --- /dev/null +++ b/docs/poster/content/dfs.md @@ -0,0 +1,7 @@ +# Build portable Graph User Interfaces + +Combining `ogdf-python`'s graph display widget with the UI elements provided by Jupyter's `ipywidgets` +allows you to easily build platform-independent user interfaces for interacting with graphs and algorithms. +In our example below, this is used to build an animated visualization of the individual steps performed by the +depth-first-search algorithm on a graph. +This can for example be used for teaching an algorithms course. diff --git a/docs/poster/content/dfs.py b/docs/poster/content/dfs.py new file mode 100644 index 0000000..acb27cd --- /dev/null +++ b/docs/poster/content/dfs.py @@ -0,0 +1,17 @@ +from demo_widgets import DFSWidget +import ipywidgets as widgets + +dfs = DFSWidget() + +play = widgets.Play(max=dfs.count_steps(), interval=1000) +slider = widgets.IntSlider() +widgets.jslink((play, 'value'), (slider, 'value')) +slider.observe(dfs.change_step) + +button = widgets.Button(description='New Graph') +button.on_click(dfs.random_graph) + +display(widgets.VBox([ + widgets.HBox([play, slider, button]), + dfs +]) \ No newline at end of file diff --git a/docs/poster/content/dfs.svg b/docs/poster/content/dfs.svg new file mode 100644 index 0000000..8837bf0 --- /dev/null +++ b/docs/poster/content/dfs.svg @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + (1, -1) + + + + + + + + (5, -1) + + + + (8, -1) + + + + + + + + (6, 7) + + + + + + + + (3, 4) + + + + + + + + (2, -1) + + \ No newline at end of file diff --git a/docs/poster/content/dfs2.svg b/docs/poster/content/dfs2.svg new file mode 100644 index 0000000..45f881b --- /dev/null +++ b/docs/poster/content/dfs2.svg @@ -0,0 +1,552 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + (1, -1) + + + + (5, 14) + + (8, 13) + + (9, 12) + + (6, 7) + + (10, 11) + + (3, 4) + + + + (2, -1) + diff --git a/docs/poster/content/editor.md b/docs/poster/content/editor.md new file mode 100644 index 0000000..e6b935f --- /dev/null +++ b/docs/poster/content/editor.md @@ -0,0 +1,5 @@ +# Editing Graphs Made Easy + +The graph display widget can be used as-is to quickly modify the current graph in-memory. +At the same time, it can be used as building block for more complex user interfaces, +where its interactivity can be fully customized to suit different applications. \ No newline at end of file diff --git a/docs/poster/content/editor.py b/docs/poster/content/editor.py new file mode 100644 index 0000000..912643a --- /dev/null +++ b/docs/poster/content/editor.py @@ -0,0 +1,15 @@ +from demo_widgets import EditorWidget + +w = EditorWidget(G, GA) + +def node_clicked(node, alt, ctrl): + if alt: + # delete node when alt+clicked + G.delNode(node) + elif ctrl and w.selected_node: + # add edge when ctrl+clicked + G.newEdge(w.selected_node, node) + +w.on_node_click = node_clicked + +display(w) \ No newline at end of file diff --git a/docs/poster/content/editor.svg b/docs/poster/content/editor.svg new file mode 100644 index 0000000..3536c20 --- /dev/null +++ b/docs/poster/content/editor.svg @@ -0,0 +1,1041 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + N0 + + + + N1 + + + + N2 + + + + N3 + + + + N7 + + + + N8 + + + + N9 + + + + N10 + + + + N11 + + + + N12 + + + + N13 + + + + N14 + + + + N15 + + + + N16 + + + + N17 + + + + N18 + + + + N19 + + + + N20 + + + + N21 + + + + N22 + + + diff --git a/docs/poster/content/install.md b/docs/poster/content/install.md new file mode 100644 index 0000000..19f6863 --- /dev/null +++ b/docs/poster/content/install.md @@ -0,0 +1,8 @@ +# Easy Installation - all Batteries included! + +`ogdf-python` comes with a prebuilt version of the OGDF that works on Linux, macOS and in the Windows Subsystem for Linux. +Just install the packages with `pip` and you are ready to go: +```bash +pip3 install ogdf-python ogdf-wheel notebook +jupyter notebook # start an interactive notebook +``` diff --git a/docs/poster/content/interact.md b/docs/poster/content/interact.md new file mode 100644 index 0000000..752bafb --- /dev/null +++ b/docs/poster/content/interact.md @@ -0,0 +1,4 @@ +# Seamless Interaction between C++ and Python + +Thanks to the underlying `cppyy` library, arbitrary C++ code can be loaded and called from Python. +This allows objects, functions and even classes to be created and used in either language. \ No newline at end of file diff --git a/docs/poster/content/interact1.cpp b/docs/poster/content/interact1.cpp new file mode 100644 index 0000000..75e37a7 --- /dev/null +++ b/docs/poster/content/interact1.cpp @@ -0,0 +1,8 @@ +%%cpp + +// Include C++ Code in your Python Notebook +std::cout << "Hello World from C++!" << std::endl; + +ogdf::Graph G; // created in C++ +int width = 3, height = 3; +ogdf::gridGraph(G, width, height, true, false); \ No newline at end of file diff --git a/docs/poster/content/interact2.py b/docs/poster/content/interact2.py new file mode 100644 index 0000000..28951cc --- /dev/null +++ b/docs/poster/content/interact2.py @@ -0,0 +1,15 @@ +from cppyy import gbl as cpp # namespace with all C++ variables + +G = cpp.G # used from Python +GA = ogdf.GraphAttributes(G, ogdf.GraphAttributes.all) + +for n in G.nodes: + GA.label[n] = str(n.index()) + GA.x[n] = (n.index() % cpp.width) * 50 + GA.y[n] = (n.index() // cpp.height) * 50 + +middle = G.numberOfNodes() // 2 +GA.width[G.nodes[middle]] = 40 +GA.height[G.nodes[middle]] = 40 + +GA \ No newline at end of file diff --git a/docs/poster/content/interact2.svg b/docs/poster/content/interact2.svg new file mode 100644 index 0000000..3dcbb17 --- /dev/null +++ b/docs/poster/content/interact2.svg @@ -0,0 +1,446 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + + 1 + + + + 2 + + + + 3 + + + + 4 + + + + 5 + + + + 6 + + + + 7 + + + + 8 + + diff --git a/docs/poster/content/interact3.h b/docs/poster/content/interact3.h new file mode 100644 index 0000000..c97a265 --- /dev/null +++ b/docs/poster/content/interact3.h @@ -0,0 +1,11 @@ +%%writefile avg_width.h +// these are the contents of file avg_width.h + +// function implemented in C++ for efficiency +int avg_width(const ogdf::GraphAttributes &GA) { + int sum = 0; + for (auto n : GA.constGraph().nodes) { + sum += GA.width(n); + } + return sum / GA.constGraph().numberOfNodes(); +} \ No newline at end of file diff --git a/docs/poster/content/interact4.py b/docs/poster/content/interact4.py new file mode 100644 index 0000000..375afab --- /dev/null +++ b/docs/poster/content/interact4.py @@ -0,0 +1,3 @@ +cppinclude("avg_width.h") # load method from C++ file +print("The node widths are", list(GA.width())) +print("The average width is", cpp.avg_width(GA)) # call your own C++ functions from python \ No newline at end of file diff --git a/docs/poster/content/intro.cpp b/docs/poster/content/intro.cpp new file mode 100644 index 0000000..08a8e45 --- /dev/null +++ b/docs/poster/content/intro.cpp @@ -0,0 +1,20 @@ +using namespace ogdf; + +#include +#include +#include + +int main() { + Graph G; + GraphAttributes GA(G); + randomPlanarTriconnectedGraph(G, 10, 20); + + for (node n : G.nodes) + GA.label[n] = "N" + string(n.index()); + + SugiyamaLayout SL; + SL.call(GA); + GraphIO::write(GA, "output.svg"); + + return 0; +} diff --git a/docs/poster/content/intro.md b/docs/poster/content/intro.md new file mode 100644 index 0000000..1893298 --- /dev/null +++ b/docs/poster/content/intro.md @@ -0,0 +1,27 @@ +# Full Access to the Functionality of the OGDF with Python's Ease of Use + +The Open Graph Drawing Framework (OGDF) is a C++ library containing a vast amount of algorithms and data structures for +automatic graph drawing. +However, while powerful the library is not easily accessible for new users and the nature of C++ makes implementing even +simple algorithms cumbersome to non-experts. +The `odgf-python` project remedies these problems by making the full OGDF available from Python. +This greatly reduces the overhead and complications when using the OGDF for the first time and unlocks a large ecosystem +of tools, for example the interactive computing Notebooks provided by Project Jupyter. +This is possible because the `ogdf-python` library aims to be an extensible building block, not a closed system. + +**Features** + +- *No C++ skills needed*: The full OGDF API is available from Python. +- *Rapid Prototyping*: Python needs less boilerplate and allows more idiomatic constructions, without the need to configure and compile anything. +- *Iterative execution*: Jupyter Notebooks allow individual lines of code to be adapted and re-run, retaining all previous variable values. +- *Inline results*: Graphs are displayed right next to the code that generates them. +- *Interactive graph exploration*: The inline display allows interactive zooming and panning to easily explore the graph. +- *Extensible building block*: The library can be easily combined with other projects from the Python ecosystem, for example with `ipywidgets` to build portable user interfaces for graphs. + +**Use-cases** + +- iterative development of new graph algorithms +- step-by-step debugging of implemented algorithms +- visual editing of in-memory graphs and variables +- interactive visualization of algorithms for teaching +- flexible user interfaces for domain-specific application \ No newline at end of file diff --git a/docs/poster/content/intro.py b/docs/poster/content/intro.py new file mode 100644 index 0000000..7c03fe6 --- /dev/null +++ b/docs/poster/content/intro.py @@ -0,0 +1,17 @@ +from ogdf_python import * + +cppinclude("ogdf/basic/graph_generators.h") +cppinclude("ogdf/layered/SugiyamaLayout.h") + + + +G = ogdf.Graph() +GA = ogdf.GraphAttributes(G) +ogdf.randomPlanarTriconnectedGraph(G, 10, 20) + +for n in G.nodes: + GA.label[n] = "N%s" % n.index() + +SL = ogdf.SugiyamaLayout() +SL.call(GA) +GA # display inline! \ No newline at end of file diff --git a/docs/poster/content/intro.svg b/docs/poster/content/intro.svg new file mode 100644 index 0000000..b15aad4 --- /dev/null +++ b/docs/poster/content/intro.svg @@ -0,0 +1,1038 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + N0 + + + + N1 + + + + N2 + + + + N3 + + + + N7 + + + + N8 + + + + N9 + + + + N10 + + + + N11 + + + + N12 + + + + N13 + + + + N14 + + + + N15 + + + + N16 + + + + N17 + + + + N18 + + + + N19 + + + + N20 + + + + N21 + + + + N22 + + diff --git a/docs/poster/content/intro2.py b/docs/poster/content/intro2.py new file mode 100644 index 0000000..0e2640c --- /dev/null +++ b/docs/poster/content/intro2.py @@ -0,0 +1,15 @@ +from ogdf_python import * + +cppinclude("ogdf/basic/graph_generators.h") +cppinclude("ogdf/layered/SugiyamaLayout.h") + +G = ogdf.Graph() +GA = ogdf.GraphAttributes(G) +ogdf.randomPlanarTriconnectedGraph(G, 10, 20) + +for n in G.nodes: + GA.label[n] = "N%s" % n.index() + +SL = ogdf.SugiyamaLayout() +SL.call(GA) +GA # display inline! \ No newline at end of file diff --git a/docs/poster/index.html b/docs/poster/index.html new file mode 100644 index 0000000..b2f2091 --- /dev/null +++ b/docs/poster/index.html @@ -0,0 +1,252 @@ + + + + + Poster + + + + + + + + + + + + + +

+ + ogdf-python + + Simon D. Fink & Andreas Strobl, University of Passau + + + + + + + +

+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Python 3 (ipykernel) + + + + + +
+ +
+
+ +
+

+            

+        
+
+ + + + +

+    
+ +
+ + +
+
+
+ + + +
+
+ +
+
+
+
+
+
+
+
+
+
+
+
+
14
+
+ +
+
+
+ + + +
+ +
+ Selected Vertex 12
+ + + + + + +
ID12
Label"N12"
Degree3
Position390, 320
Size20 x 20
+ + + +
+
+ +
+
+ + +

+        
Hello World from C++!
+

+        
+

+        

+        
The node widths are [20.0, 20.0, 20.0, 20.0, 40.0, 20.0, 20.0, 20.0, 20.0]
+The average width is 22
+ + +
+
+ +
+ ogdf-python – https://github.com/ogdf/ogdf-python – Simon D. Fink & Andreas Strobl, University of Passau, Germany + – finksim@fim.uni-passau.de +
+ + + + + + + + + \ No newline at end of file diff --git a/docs/poster/jupyter-wide.svg b/docs/poster/jupyter-wide.svg new file mode 100644 index 0000000..bbe73ee --- /dev/null +++ b/docs/poster/jupyter-wide.svg @@ -0,0 +1,113 @@ + + Jupyter + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/poster/jupyter.css b/docs/poster/jupyter.css new file mode 100644 index 0000000..858ad5a --- /dev/null +++ b/docs/poster/jupyter.css @@ -0,0 +1,440 @@ +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +/* +The following CSS variables define the main, public API for styling JupyterLab. +These variables should be used by all plugins wherever possible. In other +words, plugins should not define custom colors, sizes, etc unless absolutely +necessary. This enables users to change the visual theme of JupyterLab +by changing these variables. + +Many variables appear in an ordered sequence (0,1,2,3). These sequences +are designed to work well together, so for example, `--jp-border-color1` should +be used with `--jp-layout-color1`. The numbers have the following meanings: + +* 0: super-primary, reserved for special emphasis +* 1: primary, most important under normal situations +* 2: secondary, next most important under normal situations +* 3: tertiary, next most important under normal situations + +Throughout JupyterLab, we are mostly following principles from Google's +Material Design when selecting colors. We are not, however, following +all of MD as it is not optimized for dense, information rich UIs. +*/ + +:root { + /* Elevation + * + * We style box-shadows using Material Design's idea of elevation. These particular numbers are taken from here: + * + * https://github.com/material-components/material-components-web + * https://material-components-web.appspot.com/elevation.html + */ + + --jp-shadow-base-lightness: 0; + --jp-shadow-umbra-color: rgba( + var(--jp-shadow-base-lightness), + var(--jp-shadow-base-lightness), + var(--jp-shadow-base-lightness), + 0.2 + ); + --jp-shadow-penumbra-color: rgba( + var(--jp-shadow-base-lightness), + var(--jp-shadow-base-lightness), + var(--jp-shadow-base-lightness), + 0.14 + ); + --jp-shadow-ambient-color: rgba( + var(--jp-shadow-base-lightness), + var(--jp-shadow-base-lightness), + var(--jp-shadow-base-lightness), + 0.12 + ); + --jp-elevation-z0: none; + --jp-elevation-z1: 0 2px 1px -1px var(--jp-shadow-umbra-color), + 0 1px 1px 0 var(--jp-shadow-penumbra-color), + 0 1px 3px 0 var(--jp-shadow-ambient-color); + --jp-elevation-z2: 0 3px 1px -2px var(--jp-shadow-umbra-color), + 0 2px 2px 0 var(--jp-shadow-penumbra-color), + 0 1px 5px 0 var(--jp-shadow-ambient-color); + --jp-elevation-z4: 0 2px 4px -1px var(--jp-shadow-umbra-color), + 0 4px 5px 0 var(--jp-shadow-penumbra-color), + 0 1px 10px 0 var(--jp-shadow-ambient-color); + --jp-elevation-z6: 0 3px 5px -1px var(--jp-shadow-umbra-color), + 0 6px 10px 0 var(--jp-shadow-penumbra-color), + 0 1px 18px 0 var(--jp-shadow-ambient-color); + --jp-elevation-z8: 0 5px 5px -3px var(--jp-shadow-umbra-color), + 0 8px 10px 1px var(--jp-shadow-penumbra-color), + 0 3px 14px 2px var(--jp-shadow-ambient-color); + --jp-elevation-z12: 0 7px 8px -4px var(--jp-shadow-umbra-color), + 0 12px 17px 2px var(--jp-shadow-penumbra-color), + 0 5px 22px 4px var(--jp-shadow-ambient-color); + --jp-elevation-z16: 0 8px 10px -5px var(--jp-shadow-umbra-color), + 0 16px 24px 2px var(--jp-shadow-penumbra-color), + 0 6px 30px 5px var(--jp-shadow-ambient-color); + --jp-elevation-z20: 0 10px 13px -6px var(--jp-shadow-umbra-color), + 0 20px 31px 3px var(--jp-shadow-penumbra-color), + 0 8px 38px 7px var(--jp-shadow-ambient-color); + --jp-elevation-z24: 0 11px 15px -7px var(--jp-shadow-umbra-color), + 0 24px 38px 3px var(--jp-shadow-penumbra-color), + 0 9px 46px 8px var(--jp-shadow-ambient-color); + + /* Borders + * + * The following variables, specify the visual styling of borders in JupyterLab. + */ + + --jp-border-width: 1px; + --jp-border-color0: var(--md-grey-400); + --jp-border-color1: var(--md-grey-400); + --jp-border-color2: var(--md-grey-300); + --jp-border-color3: var(--md-grey-200); + --jp-inverse-border-color: var(--md-grey-600); + --jp-border-radius: 2px; + + /* UI Fonts + * + * The UI font CSS variables are used for the typography all of the JupyterLab + * user interface elements that are not directly user generated content. + * + * The font sizing here is done assuming that the body font size of --jp-ui-font-size1 + * is applied to a parent element. When children elements, such as headings, are sized + * in em all things will be computed relative to that body size. + */ + + --jp-ui-font-scale-factor: 1.2; + --jp-ui-font-size0: 0.83333em; + --jp-ui-font-size1: 13px; /* Base font size */ + --jp-ui-font-size2: 1.2em; + --jp-ui-font-size3: 1.44em; + --jp-ui-font-family: system-ui, -apple-system, blinkmacsystemfont, 'Segoe UI', + helvetica, arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', + 'Segoe UI Symbol'; + + /* + * Use these font colors against the corresponding main layout colors. + * In a light theme, these go from dark to light. + */ + + /* Defaults use Material Design specification */ + --jp-ui-font-color0: rgba(0, 0, 0, 1); + --jp-ui-font-color1: rgba(0, 0, 0, 0.87); + --jp-ui-font-color2: rgba(0, 0, 0, 0.54); + --jp-ui-font-color3: rgba(0, 0, 0, 0.38); + + /* + * Use these against the brand/accent/warn/error colors. + * These will typically go from light to darker, in both a dark and light theme. + */ + + --jp-ui-inverse-font-color0: rgba(255, 255, 255, 1); + --jp-ui-inverse-font-color1: rgba(255, 255, 255, 1); + --jp-ui-inverse-font-color2: rgba(255, 255, 255, 0.7); + --jp-ui-inverse-font-color3: rgba(255, 255, 255, 0.5); + + /* Content Fonts + * + * Content font variables are used for typography of user generated content. + * + * The font sizing here is done assuming that the body font size of --jp-content-font-size1 + * is applied to a parent element. When children elements, such as headings, are sized + * in em all things will be computed relative to that body size. + */ + + --jp-content-line-height: 1.6; + --jp-content-font-scale-factor: 1.2; + --jp-content-font-size0: 0.83333em; + --jp-content-font-size1: 14px; /* Base font size */ + --jp-content-font-size2: 1.2em; + --jp-content-font-size3: 1.44em; + --jp-content-font-size4: 1.728em; + --jp-content-font-size5: 2.0736em; + + /* This gives a magnification of about 125% in presentation mode over normal. */ + --jp-content-presentation-font-size1: 17px; + --jp-content-heading-line-height: 1; + --jp-content-heading-margin-top: 1.2em; + --jp-content-heading-margin-bottom: 0.8em; + --jp-content-heading-font-weight: 500; + + /* Defaults use Material Design specification */ + --jp-content-font-color0: rgba(0, 0, 0, 1); + --jp-content-font-color1: rgba(0, 0, 0, 0.87); + --jp-content-font-color2: rgba(0, 0, 0, 0.54); + --jp-content-font-color3: rgba(0, 0, 0, 0.38); + --jp-content-link-color: var(--md-blue-900); + --jp-content-font-family: system-ui, -apple-system, blinkmacsystemfont, + 'Segoe UI', helvetica, arial, sans-serif, 'Apple Color Emoji', + 'Segoe UI Emoji', 'Segoe UI Symbol'; + + /* + * Code Fonts + * + * Code font variables are used for typography of code and other monospaces content. + */ + + --jp-code-font-size: 13px; + --jp-code-line-height: 1.3077; /* 17px for 13px base */ + --jp-code-padding: 5px; /* 5px for 13px base, codemirror highlighting needs integer px value */ + --jp-code-font-family-default: menlo, consolas, 'DejaVu Sans Mono', monospace; + --jp-code-font-family: var(--jp-code-font-family-default); + + /* This gives a magnification of about 125% in presentation mode over normal. */ + --jp-code-presentation-font-size: 16px; + + /* may need to tweak cursor width if you change font size */ + --jp-code-cursor-width0: 1.4px; + --jp-code-cursor-width1: 2px; + --jp-code-cursor-width2: 4px; + + /* Layout + * + * The following are the main layout colors use in JupyterLab. In a light + * theme these would go from light to dark. + */ + + --jp-layout-color0: white; + --jp-layout-color1: white; + --jp-layout-color2: var(--md-grey-200); + --jp-layout-color3: var(--md-grey-400); + --jp-layout-color4: var(--md-grey-600); + + /* Inverse Layout + * + * The following are the inverse layout colors use in JupyterLab. In a light + * theme these would go from dark to light. + */ + + --jp-inverse-layout-color0: #111; + --jp-inverse-layout-color1: var(--md-grey-900); + --jp-inverse-layout-color2: var(--md-grey-800); + --jp-inverse-layout-color3: var(--md-grey-700); + --jp-inverse-layout-color4: var(--md-grey-600); + + /* Brand/accent */ + + --jp-brand-color0: var(--md-blue-900); + --jp-brand-color1: var(--md-blue-700); + --jp-brand-color2: var(--md-blue-300); + --jp-brand-color3: var(--md-blue-100); + --jp-brand-color4: var(--md-blue-50); + --jp-accent-color0: var(--md-green-900); + --jp-accent-color1: var(--md-green-700); + --jp-accent-color2: var(--md-green-300); + --jp-accent-color3: var(--md-green-100); + + /* State colors (warn, error, success, info) */ + + --jp-warn-color0: var(--md-orange-900); + --jp-warn-color1: var(--md-orange-700); + --jp-warn-color2: var(--md-orange-300); + --jp-warn-color3: var(--md-orange-100); + --jp-error-color0: var(--md-red-900); + --jp-error-color1: var(--md-red-700); + --jp-error-color2: var(--md-red-300); + --jp-error-color3: var(--md-red-100); + --jp-success-color0: var(--md-green-900); + --jp-success-color1: var(--md-green-700); + --jp-success-color2: var(--md-green-300); + --jp-success-color3: var(--md-green-100); + --jp-info-color0: var(--md-cyan-900); + --jp-info-color1: var(--md-cyan-700); + --jp-info-color2: var(--md-cyan-300); + --jp-info-color3: var(--md-cyan-100); + + /* Cell specific styles */ + + --jp-cell-padding: 5px; + --jp-cell-collapser-width: 8px; + --jp-cell-collapser-min-height: 20px; + --jp-cell-collapser-not-active-hover-opacity: 0.6; + --jp-cell-editor-background: var(--md-grey-100); + --jp-cell-editor-border-color: var(--md-grey-300); + --jp-cell-editor-box-shadow: inset 0 0 2px var(--md-blue-300); + --jp-cell-editor-active-background: var(--jp-layout-color0); + --jp-cell-editor-active-border-color: var(--jp-brand-color1); + --jp-cell-prompt-width: 64px; + --jp-cell-prompt-font-family: var(--jp-code-font-family-default); + --jp-cell-prompt-letter-spacing: 0; + --jp-cell-prompt-opacity: 1; + --jp-cell-prompt-not-active-opacity: 0.5; + --jp-cell-prompt-not-active-font-color: var(--md-grey-700); + + /* A custom blend of MD grey and blue 600 + * See https://meyerweb.com/eric/tools/color-blend/#546E7A:1E88E5:5:hex */ + --jp-cell-inprompt-font-color: #307fc1; + + /* A custom blend of MD grey and orange 600 + * https://meyerweb.com/eric/tools/color-blend/#546E7A:F4511E:5:hex */ + --jp-cell-outprompt-font-color: #bf5b3d; + + /* Notebook specific styles */ + + --jp-notebook-padding: 10px; + --jp-notebook-select-background: var(--jp-layout-color1); + --jp-notebook-multiselected-color: var(--md-blue-50); + + /* The scroll padding is calculated to fill enough space at the bottom of the + notebook to show one single-line cell (with appropriate padding) at the top + when the notebook is scrolled all the way to the bottom. We also subtract one + pixel so that no scrollbar appears if we have just one single-line cell in the + notebook. This padding is to enable a 'scroll past end' feature in a notebook. + */ + --jp-notebook-scroll-padding: calc( + 100% - var(--jp-code-font-size) * var(--jp-code-line-height) - + var(--jp-code-padding) - var(--jp-cell-padding) - 1px + ); + + /* Rendermime styles */ + + --jp-rendermime-error-background: #fdd; + --jp-rendermime-table-row-background: var(--md-grey-100); + --jp-rendermime-table-row-hover-background: var(--md-light-blue-50); + + /* Dialog specific styles */ + + --jp-dialog-background: rgba(0, 0, 0, 0.25); + + /* Console specific styles */ + + --jp-console-padding: 10px; + + /* Toolbar specific styles */ + + --jp-toolbar-border-color: var(--jp-border-color1); + --jp-toolbar-micro-height: 8px; + --jp-toolbar-background: var(--jp-layout-color1); + --jp-toolbar-box-shadow: 0 0 2px 0 rgba(0, 0, 0, 0.24); + --jp-toolbar-header-margin: 4px 4px 0 4px; + --jp-toolbar-active-background: var(--md-grey-300); + + /* Statusbar specific styles */ + + --jp-statusbar-height: 24px; + + /* Input field styles */ + + --jp-input-box-shadow: inset 0 0 2px var(--md-blue-300); + --jp-input-active-background: var(--jp-layout-color1); + --jp-input-hover-background: var(--jp-layout-color1); + --jp-input-background: var(--md-grey-100); + --jp-input-border-color: var(--jp-inverse-border-color); + --jp-input-active-border-color: var(--jp-brand-color1); + --jp-input-active-box-shadow-color: rgba(19, 124, 189, 0.3); + + /* General editor styles */ + + --jp-editor-selected-background: #d9d9d9; + --jp-editor-selected-focused-background: #d7d4f0; + --jp-editor-cursor-color: var(--jp-ui-font-color0); + + /* Code mirror specific styles */ + + --jp-mirror-editor-keyword-color: #008000; + --jp-mirror-editor-atom-color: #88f; + --jp-mirror-editor-number-color: #080; + --jp-mirror-editor-def-color: #00f; + --jp-mirror-editor-variable-color: var(--md-grey-900); + --jp-mirror-editor-variable-2-color: rgb(0, 54, 109); + --jp-mirror-editor-variable-3-color: #085; + --jp-mirror-editor-punctuation-color: #05a; + --jp-mirror-editor-property-color: #05a; + --jp-mirror-editor-operator-color: #a2f; + --jp-mirror-editor-comment-color: #408080; + --jp-mirror-editor-string-color: #ba2121; + --jp-mirror-editor-string-2-color: #708; + --jp-mirror-editor-meta-color: #a2f; + --jp-mirror-editor-qualifier-color: #555; + --jp-mirror-editor-builtin-color: #008000; + --jp-mirror-editor-bracket-color: #997; + --jp-mirror-editor-tag-color: #170; + --jp-mirror-editor-attribute-color: #00c; + --jp-mirror-editor-header-color: blue; + --jp-mirror-editor-quote-color: #090; + --jp-mirror-editor-link-color: #00c; + --jp-mirror-editor-error-color: #f00; + --jp-mirror-editor-hr-color: #999; + + /* + RTC user specific colors. + These colors are used for the cursor, username in the editor, + and the icon of the user. + */ + + --jp-collaborator-color1: #ffad8e; + --jp-collaborator-color2: #dac83d; + --jp-collaborator-color3: #72dd76; + --jp-collaborator-color4: #00e4d0; + --jp-collaborator-color5: #45d4ff; + --jp-collaborator-color6: #e2b1ff; + --jp-collaborator-color7: #ff9de6; + + /* Vega extension styles */ + + --jp-vega-background: white; + + /* Sidebar-related styles */ + + --jp-sidebar-min-width: 250px; + + /* Search-related styles */ + + --jp-search-toggle-off-opacity: 0.5; + --jp-search-toggle-hover-opacity: 0.8; + --jp-search-toggle-on-opacity: 1; + --jp-search-selected-match-background-color: rgb(245, 200, 0); + --jp-search-selected-match-color: black; + --jp-search-unselected-match-background-color: var( + --jp-inverse-layout-color0 + ); + --jp-search-unselected-match-color: var(--jp-ui-inverse-font-color0); + + /* Icon colors that work well with light or dark backgrounds */ + --jp-icon-contrast-color0: var(--md-purple-600); + --jp-icon-contrast-color1: var(--md-green-600); + --jp-icon-contrast-color2: var(--md-pink-600); + --jp-icon-contrast-color3: var(--md-blue-600); + + /* Button colors */ + --jp-accept-color-normal: var(--md-blue-700); + --jp-accept-color-hover: var(--md-blue-800); + --jp-accept-color-active: var(--md-blue-900); + --jp-warn-color-normal: var(--md-red-700); + --jp-warn-color-hover: var(--md-red-800); + --jp-warn-color-active: var(--md-red-900); + --jp-reject-color-normal: var(--md-grey-600); + --jp-reject-color-hover: var(--md-grey-700); + --jp-reject-color-active: var(--md-grey-800); + + /* File or activity icons and switch semantic variables */ + --jp-jupyter-icon-color: #f37626; + --jp-notebook-icon-color: #f37626; + --jp-json-icon-color: var(--md-orange-700); + --jp-console-icon-background-color: var(--md-blue-700); + --jp-console-icon-color: white; + --jp-terminal-icon-background-color: var(--md-grey-800); + --jp-terminal-icon-color: var(--md-grey-200); + --jp-text-editor-icon-color: var(--md-grey-700); + --jp-inspector-icon-color: var(--md-grey-700); + --jp-switch-color: var(--md-grey-400); + --jp-switch-true-position-color: var(--md-orange-900); +} + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +/* Set the default typography for monospace elements */ +tt, +code, +kbd, +samp, +pre { + font-family: var(--jp-code-font-family); + font-size: var(--jp-code-font-size); + line-height: var(--jp-code-line-height); +} + diff --git a/docs/poster/jupyter.svg b/docs/poster/jupyter.svg new file mode 100644 index 0000000..ab25508 --- /dev/null +++ b/docs/poster/jupyter.svg @@ -0,0 +1,90 @@ + +Group.svg +Created using Figma 0.90 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/poster/material-color.css b/docs/poster/material-color.css new file mode 100644 index 0000000..f3e797d --- /dev/null +++ b/docs/poster/material-color.css @@ -0,0 +1,265 @@ +/* + * Copyright (c) Jupyter Development Team. + * Distributed under the terms of the Modified BSD License. + */ + +/** + * google-material-color v1.2.6 + * https://github.com/danlevan/google-material-color + */ +:root { + --md-red-50: #ffebee; + --md-red-100: #ffcdd2; + --md-red-200: #ef9a9a; + --md-red-300: #e57373; + --md-red-400: #ef5350; + --md-red-500: #f44336; + --md-red-600: #e53935; + --md-red-700: #d32f2f; + --md-red-800: #c62828; + --md-red-900: #b71c1c; + --md-red-A100: #ff8a80; + --md-red-A200: #ff5252; + --md-red-A400: #ff1744; + --md-red-A700: #d50000; + --md-pink-50: #fce4ec; + --md-pink-100: #f8bbd0; + --md-pink-200: #f48fb1; + --md-pink-300: #f06292; + --md-pink-400: #ec407a; + --md-pink-500: #e91e63; + --md-pink-600: #d81b60; + --md-pink-700: #c2185b; + --md-pink-800: #ad1457; + --md-pink-900: #880e4f; + --md-pink-A100: #ff80ab; + --md-pink-A200: #ff4081; + --md-pink-A400: #f50057; + --md-pink-A700: #c51162; + --md-purple-50: #f3e5f5; + --md-purple-100: #e1bee7; + --md-purple-200: #ce93d8; + --md-purple-300: #ba68c8; + --md-purple-400: #ab47bc; + --md-purple-500: #9c27b0; + --md-purple-600: #8e24aa; + --md-purple-700: #7b1fa2; + --md-purple-800: #6a1b9a; + --md-purple-900: #4a148c; + --md-purple-A100: #ea80fc; + --md-purple-A200: #e040fb; + --md-purple-A400: #d500f9; + --md-purple-A700: #a0f; + --md-deep-purple-50: #ede7f6; + --md-deep-purple-100: #d1c4e9; + --md-deep-purple-200: #b39ddb; + --md-deep-purple-300: #9575cd; + --md-deep-purple-400: #7e57c2; + --md-deep-purple-500: #673ab7; + --md-deep-purple-600: #5e35b1; + --md-deep-purple-700: #512da8; + --md-deep-purple-800: #4527a0; + --md-deep-purple-900: #311b92; + --md-deep-purple-A100: #b388ff; + --md-deep-purple-A200: #7c4dff; + --md-deep-purple-A400: #651fff; + --md-deep-purple-A700: #6200ea; + --md-indigo-50: #e8eaf6; + --md-indigo-100: #c5cae9; + --md-indigo-200: #9fa8da; + --md-indigo-300: #7986cb; + --md-indigo-400: #5c6bc0; + --md-indigo-500: #3f51b5; + --md-indigo-600: #3949ab; + --md-indigo-700: #303f9f; + --md-indigo-800: #283593; + --md-indigo-900: #1a237e; + --md-indigo-A100: #8c9eff; + --md-indigo-A200: #536dfe; + --md-indigo-A400: #3d5afe; + --md-indigo-A700: #304ffe; + --md-blue-50: #e3f2fd; + --md-blue-100: #bbdefb; + --md-blue-200: #90caf9; + --md-blue-300: #64b5f6; + --md-blue-400: #42a5f5; + --md-blue-500: #2196f3; + --md-blue-600: #1e88e5; + --md-blue-700: #1976d2; + --md-blue-800: #1565c0; + --md-blue-900: #0d47a1; + --md-blue-A100: #82b1ff; + --md-blue-A200: #448aff; + --md-blue-A400: #2979ff; + --md-blue-A700: #2962ff; + --md-light-blue-50: #e1f5fe; + --md-light-blue-100: #b3e5fc; + --md-light-blue-200: #81d4fa; + --md-light-blue-300: #4fc3f7; + --md-light-blue-400: #29b6f6; + --md-light-blue-500: #03a9f4; + --md-light-blue-600: #039be5; + --md-light-blue-700: #0288d1; + --md-light-blue-800: #0277bd; + --md-light-blue-900: #01579b; + --md-light-blue-A100: #80d8ff; + --md-light-blue-A200: #40c4ff; + --md-light-blue-A400: #00b0ff; + --md-light-blue-A700: #0091ea; + --md-cyan-50: #e0f7fa; + --md-cyan-100: #b2ebf2; + --md-cyan-200: #80deea; + --md-cyan-300: #4dd0e1; + --md-cyan-400: #26c6da; + --md-cyan-500: #00bcd4; + --md-cyan-600: #00acc1; + --md-cyan-700: #0097a7; + --md-cyan-800: #00838f; + --md-cyan-900: #006064; + --md-cyan-A100: #84ffff; + --md-cyan-A200: #18ffff; + --md-cyan-A400: #00e5ff; + --md-cyan-A700: #00b8d4; + --md-teal-50: #e0f2f1; + --md-teal-100: #b2dfdb; + --md-teal-200: #80cbc4; + --md-teal-300: #4db6ac; + --md-teal-400: #26a69a; + --md-teal-500: #009688; + --md-teal-600: #00897b; + --md-teal-700: #00796b; + --md-teal-800: #00695c; + --md-teal-900: #004d40; + --md-teal-A100: #a7ffeb; + --md-teal-A200: #64ffda; + --md-teal-A400: #1de9b6; + --md-teal-A700: #00bfa5; + --md-green-50: #e8f5e9; + --md-green-100: #c8e6c9; + --md-green-200: #a5d6a7; + --md-green-300: #81c784; + --md-green-400: #66bb6a; + --md-green-500: #4caf50; + --md-green-600: #43a047; + --md-green-700: #388e3c; + --md-green-800: #2e7d32; + --md-green-900: #1b5e20; + --md-green-A100: #b9f6ca; + --md-green-A200: #69f0ae; + --md-green-A400: #00e676; + --md-green-A700: #00c853; + --md-light-green-50: #f1f8e9; + --md-light-green-100: #dcedc8; + --md-light-green-200: #c5e1a5; + --md-light-green-300: #aed581; + --md-light-green-400: #9ccc65; + --md-light-green-500: #8bc34a; + --md-light-green-600: #7cb342; + --md-light-green-700: #689f38; + --md-light-green-800: #558b2f; + --md-light-green-900: #33691e; + --md-light-green-A100: #ccff90; + --md-light-green-A200: #b2ff59; + --md-light-green-A400: #76ff03; + --md-light-green-A700: #64dd17; + --md-lime-50: #f9fbe7; + --md-lime-100: #f0f4c3; + --md-lime-200: #e6ee9c; + --md-lime-300: #dce775; + --md-lime-400: #d4e157; + --md-lime-500: #cddc39; + --md-lime-600: #c0ca33; + --md-lime-700: #afb42b; + --md-lime-800: #9e9d24; + --md-lime-900: #827717; + --md-lime-A100: #f4ff81; + --md-lime-A200: #eeff41; + --md-lime-A400: #c6ff00; + --md-lime-A700: #aeea00; + --md-yellow-50: #fffde7; + --md-yellow-100: #fff9c4; + --md-yellow-200: #fff59d; + --md-yellow-300: #fff176; + --md-yellow-400: #ffee58; + --md-yellow-500: #ffeb3b; + --md-yellow-600: #fdd835; + --md-yellow-700: #fbc02d; + --md-yellow-800: #f9a825; + --md-yellow-900: #f57f17; + --md-yellow-A100: #ffff8d; + --md-yellow-A200: #ff0; + --md-yellow-A400: #ffea00; + --md-yellow-A700: #ffd600; + --md-amber-50: #fff8e1; + --md-amber-100: #ffecb3; + --md-amber-200: #ffe082; + --md-amber-300: #ffd54f; + --md-amber-400: #ffca28; + --md-amber-500: #ffc107; + --md-amber-600: #ffb300; + --md-amber-700: #ffa000; + --md-amber-800: #ff8f00; + --md-amber-900: #ff6f00; + --md-amber-A100: #ffe57f; + --md-amber-A200: #ffd740; + --md-amber-A400: #ffc400; + --md-amber-A700: #ffab00; + --md-orange-50: #fff3e0; + --md-orange-100: #ffe0b2; + --md-orange-200: #ffcc80; + --md-orange-300: #ffb74d; + --md-orange-400: #ffa726; + --md-orange-500: #ff9800; + --md-orange-600: #fb8c00; + --md-orange-700: #f57c00; + --md-orange-800: #ef6c00; + --md-orange-900: #e65100; + --md-orange-A100: #ffd180; + --md-orange-A200: #ffab40; + --md-orange-A400: #ff9100; + --md-orange-A700: #ff6d00; + --md-deep-orange-50: #fbe9e7; + --md-deep-orange-100: #ffccbc; + --md-deep-orange-200: #ffab91; + --md-deep-orange-300: #ff8a65; + --md-deep-orange-400: #ff7043; + --md-deep-orange-500: #ff5722; + --md-deep-orange-600: #f4511e; + --md-deep-orange-700: #e64a19; + --md-deep-orange-800: #d84315; + --md-deep-orange-900: #bf360c; + --md-deep-orange-A100: #ff9e80; + --md-deep-orange-A200: #ff6e40; + --md-deep-orange-A400: #ff3d00; + --md-deep-orange-A700: #dd2c00; + --md-brown-50: #efebe9; + --md-brown-100: #d7ccc8; + --md-brown-200: #bcaaa4; + --md-brown-300: #a1887f; + --md-brown-400: #8d6e63; + --md-brown-500: #795548; + --md-brown-600: #6d4c41; + --md-brown-700: #5d4037; + --md-brown-800: #4e342e; + --md-brown-900: #3e2723; + --md-grey-50: #fafafa; + --md-grey-100: #f5f5f5; + --md-grey-200: #eee; + --md-grey-300: #e0e0e0; + --md-grey-400: #bdbdbd; + --md-grey-500: #9e9e9e; + --md-grey-600: #757575; + --md-grey-700: #616161; + --md-grey-800: #424242; + --md-grey-900: #212121; + --md-blue-grey-50: #eceff1; + --md-blue-grey-100: #cfd8dc; + --md-blue-grey-200: #b0bec5; + --md-blue-grey-300: #90a4ae; + --md-blue-grey-400: #78909c; + --md-blue-grey-500: #607d8b; + --md-blue-grey-600: #546e7a; + --md-blue-grey-700: #455a64; + --md-blue-grey-800: #37474f; + --md-blue-grey-900: #263238; +} diff --git a/docs/poster/ogdf.png b/docs/poster/ogdf.png new file mode 100644 index 0000000..82cf5ed Binary files /dev/null and b/docs/poster/ogdf.png differ diff --git a/docs/poster/python-wide.svg b/docs/poster/python-wide.svg new file mode 100644 index 0000000..116eaac --- /dev/null +++ b/docs/poster/python-wide.svg @@ -0,0 +1,269 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/poster/python.svg b/docs/poster/python.svg new file mode 100644 index 0000000..467b07b --- /dev/null +++ b/docs/poster/python.svg @@ -0,0 +1,265 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/poster/style.css b/docs/poster/style.css new file mode 100644 index 0000000..c27c382 --- /dev/null +++ b/docs/poster/style.css @@ -0,0 +1,199 @@ +@page { + size: 594mm 841mm; /*A1*/ + margin: 0; +} + +body { + color: var(--jp-ui-font-color1); + background: var(--jp-layout-color2); + font-family: system-ui, helvetica; + margin: unset; + padding: unset; + height: 100%; + width: 100%; +} + +p, ul { + font-size: larger; +} + +h1.toolbar { + padding-top: 30px; + margin-bottom: 0px; + font-size: xxx-large; +} + +.toolbar, footer { + color: var(--jp-ui-font-color0); + border-bottom: var(--jp-border-width) solid var(--jp-toolbar-border-color); + background: var(--jp-toolbar-background); + padding: 5px 50px; + margin-top: 0px; + font-size: larger; +} + +.toolbar img { + vertical-align: text-bottom; + height: 1em +} + +.toolbar svg { + vertical-align: text-bottom; + height: 1em; + width: 1em; + background: #edf0f5; + margin-right: 5px; +} + +.toolbar svg:last-of-type { + margin-right: 0px; +} + +.toolbar-last, footer { + box-shadow: var(--jp-elevation-z4); +} + +#menu { + position: relative; + z-index: 1; +} + +#menu span { + vertical-align: text-bottom; + margin-right: 10px; +} + +#menu span:last-of-type { + font-size: 80%; + border: solid 1px var(--jp-border-color2); + border-radius: var(--jp-border-radius); + margin-right: 0px; + padding: 2px; +} + +footer { + margin-top: 20px; + position: fixed; + bottom: 0px; + width: 100%; + height: 50px; + text-align: center; +} + +main { + max-width: calc(100% - 120px); + margin: 20px auto 10px auto; + counter-reset: cell-counter 0; + break-inside: avoid; +} + +.column { + display: inline-block; + width: calc(50% - 25px); + vertical-align: top; + padding: 1px 0; + background: var(--jp-layout-color1); + box-shadow: var(--jp-elevation-z4); +} + +.column:first-of-type { + margin-right: 40px; +} + +.cell, .output, .split-cell>* { + position: relative !important; + padding: 10px !important; + border: 1px solid var(--jp-cell-editor-border-color); +} + +.cell { + margin: 10px 10px 10px 50px !important; + counter-increment: cell-counter 1; + overflow: unset !important; +} + +.split-cell { + margin: 10px 10px 10px 50px !important; + counter-increment: cell-counter 1; + position: relative !important; + display: grid; + grid-template-columns: calc(50% - 3px) calc(50% - 3px); + column-gap: 6px; + justify-content: center; + align-items: stretch; +} + +.split-cell:before { + top: 1em; +} + +.split-cell>* { + margin: 0 !important; +} + +.output { + margin: -5px 10px 10px 50px; + background: #edf0f5; +} + +pre, code, pre span, code span { + background-color: var(--jp-cell-editor-background) !important; + text-shadow: none !important; +} + +.cell h1:first-of-type, .markdown-body h1:first-of-type { + margin-top: 0; +} + +.markdown-body :last-child { + margin-bottom: 0px; +} + +.cell:before, .split-cell:before, .output:before { + font-family: var(--jp-cell-prompt-font-family); + color: var(--jp-cell-prompt-not-active-font-color); + content: "[" counter(cell-counter) "]:"; + position: absolute; + left: -55px; + text-align: right; + overflow: visible; + width: 50px; + font-size: 13px; +} + +.output-img { + background: #edf0f5; + text-align: center; + padding: 20px !important; +} + +.output img { + max-width: 10cm; +} + +.inlay { + position: absolute; + right: 0; + bottom: 0; + padding: 20px; + background-color: white; + border-top-left-radius: 10px; +} + +.inlay.inlay-top{ + top: 0; + bottom: unset; + border-bottom-left-radius: 10px; + border-top-left-radius: unset; + padding: 10px; +} + +.inlay table { + margin: 10px; +} + +.inlay table tr td:first-of-type { + text-align: left; + font-weight: bold; + padding-right: 30px; +} \ No newline at end of file diff --git a/docs/poster/teaser.html b/docs/poster/teaser.html new file mode 100644 index 0000000..d5f5220 --- /dev/null +++ b/docs/poster/teaser.html @@ -0,0 +1,250 @@ + + + + + Teaser + + + + + + + + + + + + + + + +

+ + ogdf-python + + Simon D. Fink & Andreas Strobl + + + + + + + +

+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Python 3 (ipykernel) + + + + + +
+ +
+
+

+        
+
+ +
+
+            
+                display(DFSWidget(step=14))
+            
+        
+
+
+
+ + + +
+
+ +
+
+
+
+
+
+
+
+
+
+
+
+
14
+
+ +
+
+
+ +
+            
+                display(GraphEditorWidget(G))
+            
+        
+
+
+ +
+
+ Selected Vertex 12
+ + + + + + + + + + + + + + + + + + + + + +
ID12
Label"N12"
Degree3
Position390, 320
Size20 x 20
+ + + +
+
+
+
+ +
+ ogdf-python – https://github.com/ogdf/ogdf-python – University of Passau, Germany + – finksim@fim.uni-passau.de +
+ + + + + + + + + \ No newline at end of file diff --git a/docs/poster/upassau-wide.svg b/docs/poster/upassau-wide.svg new file mode 100644 index 0000000..2cbabef --- /dev/null +++ b/docs/poster/upassau-wide.svg @@ -0,0 +1,112 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/poster/upassau.svg b/docs/poster/upassau.svg new file mode 100644 index 0000000..635a662 --- /dev/null +++ b/docs/poster/upassau.svg @@ -0,0 +1,59 @@ + + + + + + + + + + + + + diff --git a/docs/poster/widgets.css b/docs/poster/widgets.css new file mode 100644 index 0000000..990ea34 --- /dev/null +++ b/docs/poster/widgets.css @@ -0,0 +1,1886 @@ +/* Copyright (c) Jupyter Development Team. + * Distributed under the terms of the Modified BSD License. + */ + +/* + * We assume that the CSS variables in + * https://github.com/jupyterlab/jupyterlab/blob/master/src/default-theme/variables.css + * have been defined. + */ + +:root { + --jp-widgets-color: var(--jp-content-font-color1); + --jp-widgets-label-color: var(--jp-widgets-color); + --jp-widgets-readout-color: var(--jp-widgets-color); + --jp-widgets-font-size: var(--jp-ui-font-size1); + --jp-widgets-margin: 2px; + --jp-widgets-inline-height: 28px; + --jp-widgets-inline-width: 300px; + --jp-widgets-inline-width-short: calc( + var(--jp-widgets-inline-width) / 2 - var(--jp-widgets-margin) + ); + --jp-widgets-inline-width-tiny: calc( + var(--jp-widgets-inline-width-short) / 2 - var(--jp-widgets-margin) + ); + --jp-widgets-inline-margin: 4px; /* margin between inline elements */ + --jp-widgets-inline-label-width: 80px; + --jp-widgets-border-width: var(--jp-border-width); + --jp-widgets-vertical-height: 200px; + --jp-widgets-horizontal-tab-height: 24px; + --jp-widgets-horizontal-tab-width: 144px; + --jp-widgets-horizontal-tab-top-border: 2px; + --jp-widgets-progress-thickness: 20px; + --jp-widgets-container-padding: 15px; + --jp-widgets-input-padding: 4px; + --jp-widgets-radio-item-height-adjustment: 8px; + --jp-widgets-radio-item-height: calc( + var(--jp-widgets-inline-height) - + var(--jp-widgets-radio-item-height-adjustment) + ); + --jp-widgets-slider-track-thickness: 4px; + --jp-widgets-slider-border-width: var(--jp-widgets-border-width); + --jp-widgets-slider-handle-size: 16px; + --jp-widgets-slider-handle-border-color: var(--jp-border-color1); + --jp-widgets-slider-handle-background-color: var(--jp-layout-color1); + --jp-widgets-slider-active-handle-color: var(--jp-brand-color1); + --jp-widgets-menu-item-height: 24px; + --jp-widgets-dropdown-arrow: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDE5LjIuMSwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPgo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IgoJIHZpZXdCb3g9IjAgMCAxOCAxOCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgMTggMTg7IiB4bWw6c3BhY2U9InByZXNlcnZlIj4KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KCS5zdDB7ZmlsbDpub25lO30KPC9zdHlsZT4KPHBhdGggZD0iTTUuMiw1LjlMOSw5LjdsMy44LTMuOGwxLjIsMS4ybC00LjksNWwtNC45LTVMNS4yLDUuOXoiLz4KPHBhdGggY2xhc3M9InN0MCIgZD0iTTAtMC42aDE4djE4SDBWLTAuNnoiLz4KPC9zdmc+Cg); + --jp-widgets-input-color: var(--jp-ui-font-color1); + --jp-widgets-input-background-color: var(--jp-layout-color1); + --jp-widgets-input-border-color: var(--jp-border-color1); + --jp-widgets-input-focus-border-color: var(--jp-brand-color2); + --jp-widgets-input-border-width: var(--jp-widgets-border-width); + --jp-widgets-disabled-opacity: 0.6; + + /* From Material Design Lite */ + --md-shadow-key-umbra-opacity: 0.2; + --md-shadow-key-penumbra-opacity: 0.14; + --md-shadow-ambient-shadow-opacity: 0.12; +} + +.jupyter-widgets { + margin: var(--jp-widgets-margin); + box-sizing: border-box; + color: var(--jp-widgets-color); + overflow: visible; +} + +.jp-Output-result > .jupyter-widgets { + margin-left: 0; + margin-right: 0; +} + +/* vbox and hbox */ + +/* */ +.widget-inline-hbox, /* */ + .jupyter-widget-inline-hbox { + /* Horizontal widgets */ + box-sizing: border-box; + display: flex; + flex-direction: row; + align-items: baseline; +} + +/* */ +.widget-inline-vbox, /* */ + .jupyter-widget-inline-vbox { + /* Vertical Widgets */ + box-sizing: border-box; + display: flex; + flex-direction: column; + align-items: center; +} + +/* */ +.widget-box, /* */ +.jupyter-widget-box { + box-sizing: border-box; + display: flex; + margin: 0; + overflow: auto; +} + +/* */ +.widget-gridbox, /* */ +.jupyter-widget-gridbox { + box-sizing: border-box; + display: grid; + margin: 0; + overflow: auto; +} + +/* */ +.widget-hbox, /* */ +.jupyter-widget-hbox { + flex-direction: row; +} + +/* */ +.widget-vbox, /* */ +.jupyter-widget-vbox { + flex-direction: column; +} + +/* General Tags Styling */ + +.jupyter-widget-tagsinput { + display: flex; + flex-direction: row; + flex-wrap: wrap; + align-items: center; + overflow: auto; + + cursor: text; +} + +.jupyter-widget-tag { + padding-left: 10px; + padding-right: 10px; + padding-top: 0px; + padding-bottom: 0px; + display: inline-block; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + text-align: center; + font-size: var(--jp-widgets-font-size); + + height: calc(var(--jp-widgets-inline-height) - 2px); + border: 0px solid; + line-height: calc(var(--jp-widgets-inline-height) - 2px); + box-shadow: none; + + color: var(--jp-ui-font-color1); + background-color: var(--jp-layout-color2); + border-color: var(--jp-border-color2); + border: none; + user-select: none; + + cursor: grab; + transition: margin-left 200ms; + margin: 1px 1px 1px 1px; +} + +.jupyter-widget-tag.mod-active { + /* MD Lite 4dp shadow */ + box-shadow: 0 4px 5px 0 rgba(0, 0, 0, var(--md-shadow-key-penumbra-opacity)), + 0 1px 10px 0 rgba(0, 0, 0, var(--md-shadow-ambient-shadow-opacity)), + 0 2px 4px -1px rgba(0, 0, 0, var(--md-shadow-key-umbra-opacity)); + color: var(--jp-ui-font-color1); + background-color: var(--jp-layout-color3); +} + +.jupyter-widget-colortag { + color: var(--jp-inverse-ui-font-color1); +} + +.jupyter-widget-colortag.mod-active { + color: var(--jp-inverse-ui-font-color0); +} + +.jupyter-widget-taginput { + color: var(--jp-ui-font-color0); + background-color: var(--jp-layout-color0); + + cursor: text; + text-align: left; +} + +.jupyter-widget-taginput:focus { + outline: none; +} + +.jupyter-widget-tag-close { + margin-left: var(--jp-widgets-inline-margin); + padding: 2px 0px 2px 2px; +} + +.jupyter-widget-tag-close:hover { + cursor: pointer; +} + +/* Tag "Primary" Styling */ + +.jupyter-widget-tag.mod-primary { + color: var(--jp-inverse-ui-font-color1); + background-color: var(--jp-brand-color1); +} + +.jupyter-widget-tag.mod-primary.mod-active { + color: var(--jp-inverse-ui-font-color0); + background-color: var(--jp-brand-color0); +} + +/* Tag "Success" Styling */ + +.jupyter-widget-tag.mod-success { + color: var(--jp-inverse-ui-font-color1); + background-color: var(--jp-success-color1); +} + +.jupyter-widget-tag.mod-success.mod-active { + color: var(--jp-inverse-ui-font-color0); + background-color: var(--jp-success-color0); +} + +/* Tag "Info" Styling */ + +.jupyter-widget-tag.mod-info { + color: var(--jp-inverse-ui-font-color1); + background-color: var(--jp-info-color1); +} + +.jupyter-widget-tag.mod-info.mod-active { + color: var(--jp-inverse-ui-font-color0); + background-color: var(--jp-info-color0); +} + +/* Tag "Warning" Styling */ + +.jupyter-widget-tag.mod-warning { + color: var(--jp-inverse-ui-font-color1); + background-color: var(--jp-warn-color1); +} + +.jupyter-widget-tag.mod-warning.mod-active { + color: var(--jp-inverse-ui-font-color0); + background-color: var(--jp-warn-color0); +} + +/* Tag "Danger" Styling */ + +.jupyter-widget-tag.mod-danger { + color: var(--jp-inverse-ui-font-color1); + background-color: var(--jp-error-color1); +} + +.jupyter-widget-tag.mod-danger.mod-active { + color: var(--jp-inverse-ui-font-color0); + background-color: var(--jp-error-color0); +} + +/* General Button Styling */ + +.jupyter-button { + padding-left: 10px; + padding-right: 10px; + padding-top: 0px; + padding-bottom: 0px; + display: inline-block; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + text-align: center; + font-size: var(--jp-widgets-font-size); + cursor: pointer; + + height: var(--jp-widgets-inline-height); + border: 0px solid; + line-height: var(--jp-widgets-inline-height); + box-shadow: none; + + color: var(--jp-ui-font-color1); + background-color: var(--jp-layout-color2); + border-color: var(--jp-border-color2); + border: none; + user-select: none; +} + +.jupyter-button i.fa { + margin-right: var(--jp-widgets-inline-margin); + pointer-events: none; +} + +.jupyter-button:empty:before { + content: '\200b'; /* zero-width space */ +} + +.jupyter-widgets.jupyter-button:disabled { + opacity: var(--jp-widgets-disabled-opacity); +} + +.jupyter-button i.fa.center { + margin-right: 0; +} + +.jupyter-button:hover:enabled, +.jupyter-button:focus:enabled { + /* MD Lite 2dp shadow */ + box-shadow: 0 2px 2px 0 rgba(0, 0, 0, var(--md-shadow-key-penumbra-opacity)), + 0 3px 1px -2px rgba(0, 0, 0, var(--md-shadow-key-umbra-opacity)), + 0 1px 5px 0 rgba(0, 0, 0, var(--md-shadow-ambient-shadow-opacity)); +} + +.jupyter-button:active, +.jupyter-button.mod-active { + /* MD Lite 4dp shadow */ + box-shadow: 0 4px 5px 0 rgba(0, 0, 0, var(--md-shadow-key-penumbra-opacity)), + 0 1px 10px 0 rgba(0, 0, 0, var(--md-shadow-ambient-shadow-opacity)), + 0 2px 4px -1px rgba(0, 0, 0, var(--md-shadow-key-umbra-opacity)); + color: var(--jp-ui-font-color1); + background-color: var(--jp-layout-color3); +} + +.jupyter-button:focus:enabled { + outline: 1px solid var(--jp-widgets-input-focus-border-color); +} + +/* Button "Primary" Styling */ + +.jupyter-button.mod-primary { + color: var(--jp-ui-inverse-font-color1); + background-color: var(--jp-brand-color1); +} + +.jupyter-button.mod-primary.mod-active { + color: var(--jp-ui-inverse-font-color0); + background-color: var(--jp-brand-color0); +} + +.jupyter-button.mod-primary:active { + color: var(--jp-ui-inverse-font-color0); + background-color: var(--jp-brand-color0); +} + +/* Button "Success" Styling */ + +.jupyter-button.mod-success { + color: var(--jp-ui-inverse-font-color1); + background-color: var(--jp-success-color1); +} + +.jupyter-button.mod-success.mod-active { + color: var(--jp-ui-inverse-font-color0); + background-color: var(--jp-success-color0); +} + +.jupyter-button.mod-success:active { + color: var(--jp-ui-inverse-font-color0); + background-color: var(--jp-success-color0); +} + +/* Button "Info" Styling */ + +.jupyter-button.mod-info { + color: var(--jp-ui-inverse-font-color1); + background-color: var(--jp-info-color1); +} + +.jupyter-button.mod-info.mod-active { + color: var(--jp-ui-inverse-font-color0); + background-color: var(--jp-info-color0); +} + +.jupyter-button.mod-info:active { + color: var(--jp-ui-inverse-font-color0); + background-color: var(--jp-info-color0); +} + +/* Button "Warning" Styling */ + +.jupyter-button.mod-warning { + color: var(--jp-ui-inverse-font-color1); + background-color: var(--jp-warn-color1); +} + +.jupyter-button.mod-warning.mod-active { + color: var(--jp-ui-inverse-font-color0); + background-color: var(--jp-warn-color0); +} + +.jupyter-button.mod-warning:active { + color: var(--jp-ui-inverse-font-color0); + background-color: var(--jp-warn-color0); +} + +/* Button "Danger" Styling */ + +.jupyter-button.mod-danger { + color: var(--jp-ui-inverse-font-color1); + background-color: var(--jp-error-color1); +} + +.jupyter-button.mod-danger.mod-active { + color: var(--jp-ui-inverse-font-color0); + background-color: var(--jp-error-color0); +} + +.jupyter-button.mod-danger:active { + color: var(--jp-ui-inverse-font-color0); + background-color: var(--jp-error-color0); +} + +/* Widget Button, Widget Toggle Button, Widget Upload */ + +/* */ +.widget-button, /* */ +/* */ .widget-toggle-button, /* */ +/* */ .widget-upload, /* */ +.jupyter-widget-button, +.jupyter-widget-toggle-button, +.jupyter-widget-upload { + width: var(--jp-widgets-inline-width-short); +} + +/* Widget Label Styling */ + +/* Override Bootstrap label css */ +.jupyter-widgets label { + margin-bottom: initial; +} + +/* */ +.widget-label-basic, /* */ +.jupyter-widget-label-basic { + /* Basic Label */ + color: var(--jp-widgets-label-color); + font-size: var(--jp-widgets-font-size); + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + line-height: var(--jp-widgets-inline-height); +} + +/* */ +.widget-label, /* */ +.jupyter-widget-label { + /* Label */ + color: var(--jp-widgets-label-color); + font-size: var(--jp-widgets-font-size); + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + line-height: var(--jp-widgets-inline-height); +} + +/* */ +.widget-inline-hbox .widget-label, /* */ +.jupyter-widget-inline-hbox .jupyter-widget-label { + /* Horizontal Widget Label */ + color: var(--jp-widgets-label-color); + text-align: right; + margin-right: calc(var(--jp-widgets-inline-margin) * 2); + width: var(--jp-widgets-inline-label-width); + flex-shrink: 0; +} + +/* */ +.widget-inline-vbox .widget-label, /* */ +.jupyter-widget-inline-vbox .jupyter-widget-label { + /* Vertical Widget Label */ + color: var(--jp-widgets-label-color); + text-align: center; + line-height: var(--jp-widgets-inline-height); +} + +/* Widget Readout Styling */ + +/* */ +.widget-readout, /* */ +.jupyter-widget-readout { + color: var(--jp-widgets-readout-color); + font-size: var(--jp-widgets-font-size); + height: var(--jp-widgets-inline-height); + line-height: var(--jp-widgets-inline-height); + overflow: hidden; + white-space: nowrap; + text-align: center; +} + +/* */ +.widget-readout.overflow, /* */ +.jupyter-widget-readout.overflow { + /* Overflowing Readout */ + + /* From Material Design Lite + shadow-key-umbra-opacity: 0.2; + shadow-key-penumbra-opacity: 0.14; + shadow-ambient-shadow-opacity: 0.12; + */ + -webkit-box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.2), + 0 3px 1px -2px rgba(0, 0, 0, 0.14), 0 1px 5px 0 rgba(0, 0, 0, 0.12); + + -moz-box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.2), + 0 3px 1px -2px rgba(0, 0, 0, 0.14), 0 1px 5px 0 rgba(0, 0, 0, 0.12); + + box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.2), 0 3px 1px -2px rgba(0, 0, 0, 0.14), + 0 1px 5px 0 rgba(0, 0, 0, 0.12); +} + +/* */ +.widget-inline-hbox .widget-readout, /* */ +.jupyter-widget-inline-hbox .jupyter-widget-readout { + /* Horizontal Readout */ + text-align: center; + max-width: var(--jp-widgets-inline-width-short); + min-width: var(--jp-widgets-inline-width-tiny); + margin-left: var(--jp-widgets-inline-margin); +} + +/* */ +.widget-inline-vbox .widget-readout, /* */ +.jupyter-widget-inline-vbox .jupyter-widget-readout { + /* Vertical Readout */ + margin-top: var(--jp-widgets-inline-margin); + /* as wide as the widget */ + width: inherit; +} + +/* Widget Checkbox Styling */ + +/* */ +.widget-checkbox, /* */ +.jupyter-widget-checkbox { + width: var(--jp-widgets-inline-width); + height: var(--jp-widgets-inline-height); + line-height: var(--jp-widgets-inline-height); +} + +/* */ +.widget-checkbox input[type='checkbox'], /* */ +.jupyter-widget-checkbox input[type='checkbox'] { + margin: 0px calc(var(--jp-widgets-inline-margin) * 2) 0px 0px; + line-height: var(--jp-widgets-inline-height); + font-size: large; + flex-grow: 1; + flex-shrink: 0; + align-self: center; +} + +/* Widget Valid Styling */ + +/* */ +.widget-valid, /* */ +.jupyter-widget-valid { + height: var(--jp-widgets-inline-height); + line-height: var(--jp-widgets-inline-height); + width: var(--jp-widgets-inline-width-short); + font-size: var(--jp-widgets-font-size); +} + +/* */ +.widget-valid i, /* */ +.jupyter-widget-valid i { + line-height: var(--jp-widgets-inline-height); + margin-right: var(--jp-widgets-inline-margin); + margin-left: var(--jp-widgets-inline-margin); +} + +/* */ +.widget-valid.mod-valid i, /* */ +.jupyter-widget-valid.mod-valid i { + color: green; +} + +/* */ +.widget-valid.mod-invalid i, /* */ +.jupyter-widget-valid.mod-invalid i { + color: red; +} + +/* */ +.widget-valid.mod-valid .widget-valid-readout, /* */ +.jupyter-widget-valid.mod-valid .jupyter-widget-valid-readout { + display: none; +} + +/* Widget Text and TextArea Styling */ + +/* */ +.widget-textarea, /* */ +/* */ .widget-text, /* */ +.jupyter-widget-textarea, +.jupyter-widget-text { + width: var(--jp-widgets-inline-width); +} + +/* */ +.widget-text input[type='text'], /* */ +/* */ .widget-text input[type='number'], /* */ +/* */ .widget-text input[type='password'], /* */ +.jupyter-widget-text input[type='text'], +.jupyter-widget-text input[type='number'], +.jupyter-widget-text input[type='password'] { + height: var(--jp-widgets-inline-height); +} + +/* */ +.widget-text input[type='text']:disabled, /* */ +/* */ .widget-text input[type='number']:disabled, /* */ +/* */ .widget-text input[type='password']:disabled, /* */ +/* */ .widget-textarea textarea:disabled, /* */ +.jupyter-widget-text input[type='text']:disabled, +.jupyter-widget-text input[type='number']:disabled, +.jupyter-widget-text input[type='password']:disabled, +.jupyter-widget-textarea textarea:disabled { + opacity: var(--jp-widgets-disabled-opacity); +} + +/* */ +.widget-text input[type='text'], /* */ +/* */ .widget-text input[type='number'], /* */ +/* */ .widget-text input[type='password'], /* */ +/* */ .widget-textarea textarea, /* */ +.jupyter-widget-text input[type='text'], +.jupyter-widget-text input[type='number'], +.jupyter-widget-text input[type='password'], +.jupyter-widget-textarea textarea { + box-sizing: border-box; + border: var(--jp-widgets-input-border-width) solid + var(--jp-widgets-input-border-color); + background-color: var(--jp-widgets-input-background-color); + color: var(--jp-widgets-input-color); + font-size: var(--jp-widgets-font-size); + flex-grow: 1; + min-width: 0; /* This makes it possible for the flexbox to shrink this input */ + flex-shrink: 1; + outline: none !important; +} + +/* */ +.widget-text input[type='text'], /* */ +/* */ .widget-text input[type='password'], /* */ +/* */ .widget-textarea textarea, /* */ +.jupyter-widget-text input[type='text'], +.jupyter-widget-text input[type='password'], +.jupyter-widget-textarea textarea { + padding: var(--jp-widgets-input-padding) + calc(var(--jp-widgets-input-padding) * 2); +} + +/* */ +.widget-text input[type='number'], /* */ +.jupyter-widget-text input[type='number'] { + padding: var(--jp-widgets-input-padding) 0 var(--jp-widgets-input-padding) + calc(var(--jp-widgets-input-padding) * 2); +} + +/* */ +.widget-textarea textarea, /* */ +.jupyter-widget-textarea textarea { + height: inherit; + width: inherit; +} + +/* */ +.widget-text input:focus, /* */ +/* */ .widget-textarea textarea:focus, /* */ +.jupyter-widget-text input:focus, +.jupyter-widget-textarea textarea:focus { + border-color: var(--jp-widgets-input-focus-border-color); +} + +/* Horizontal Slider */ +/* */ +.widget-hslider, /* */ +.jupyter-widget-hslider { + width: var(--jp-widgets-inline-width); + height: var(--jp-widgets-inline-height); + line-height: var(--jp-widgets-inline-height); + + /* Override the align-items baseline. This way, the description and readout + still seem to align their baseline properly, and we don't have to have + align-self: stretch in the .slider-container. */ + align-items: center; +} + +/* */ +.widgets-slider .slider-container, /* */ +.jupyter-widgets-slider .slider-container { + overflow: visible; +} + +/* */ +.widget-hslider .slider-container, /* */ +.jupyter-widget-hslider .slider-container { + margin-left: calc( + var(--jp-widgets-slider-handle-size) / 2 - 2 * + var(--jp-widgets-slider-border-width) + ); + margin-right: calc( + var(--jp-widgets-slider-handle-size) / 2 - 2 * + var(--jp-widgets-slider-border-width) + ); + flex: 1 1 var(--jp-widgets-inline-width-short); +} + +/* Vertical Slider */ + +/* */ +.widget-vbox .widget-label, /* */ +.jupyter-widget-vbox .jupyter-widget-label { + height: var(--jp-widgets-inline-height); + line-height: var(--jp-widgets-inline-height); +} + +/* */ +.widget-vslider, /* */ +.jupyter-widget-vslider { + /* Vertical Slider */ + height: var(--jp-widgets-vertical-height); + width: var(--jp-widgets-inline-width-tiny); +} + +/* */ +.widget-vslider .slider-container, /* */ +.jupyter-widget-vslider .slider-container { + flex: 1 1 var(--jp-widgets-inline-width-short); + margin-left: auto; + margin-right: auto; + margin-bottom: calc( + var(--jp-widgets-slider-handle-size) / 2 - 2 * + var(--jp-widgets-slider-border-width) + ); + margin-top: calc( + var(--jp-widgets-slider-handle-size) / 2 - 2 * + var(--jp-widgets-slider-border-width) + ); + display: flex; + flex-direction: column; +} + +/* Widget Progress Styling */ + +.progress-bar { + -webkit-transition: none; + -moz-transition: none; + -ms-transition: none; + -o-transition: none; + transition: none; +} + +.progress-bar { + height: var(--jp-widgets-inline-height); +} + +.progress-bar { + background-color: var(--jp-brand-color1); +} + +.progress-bar-success { + background-color: var(--jp-success-color1); +} + +.progress-bar-info { + background-color: var(--jp-info-color1); +} + +.progress-bar-warning { + background-color: var(--jp-warn-color1); +} + +.progress-bar-danger { + background-color: var(--jp-error-color1); +} + +.progress { + background-color: var(--jp-layout-color2); + border: none; + box-shadow: none; +} + +/* Horisontal Progress */ + +/* */ +.widget-hprogress, /* */ +.jupyter-widget-hprogress { + /* Progress Bar */ + height: var(--jp-widgets-inline-height); + line-height: var(--jp-widgets-inline-height); + width: var(--jp-widgets-inline-width); + align-items: center; +} + +/* */ +.widget-hprogress .progress, /* */ +.jupyter-widget-hprogress .progress { + flex-grow: 1; + margin-top: var(--jp-widgets-input-padding); + margin-bottom: var(--jp-widgets-input-padding); + align-self: stretch; + /* Override bootstrap style */ + height: initial; +} + +/* Vertical Progress */ + +/* */ +.widget-vprogress, /* */ +.jupyter-widget-vprogress { + height: var(--jp-widgets-vertical-height); + width: var(--jp-widgets-inline-width-tiny); +} + +/* */ +.widget-vprogress .progress, /* */ +.jupyter-widget-vprogress .progress { + flex-grow: 1; + width: var(--jp-widgets-progress-thickness); + margin-left: auto; + margin-right: auto; + margin-bottom: 0; +} + +/* Select Widget Styling */ + +/* */ +.widget-dropdown, /* */ +.jupyter-widget-dropdown { + height: var(--jp-widgets-inline-height); + width: var(--jp-widgets-inline-width); + line-height: var(--jp-widgets-inline-height); +} + +/* */ +.widget-dropdown > select, /* */ +.jupyter-widget-dropdown > select { + padding-right: 20px; + border: var(--jp-widgets-input-border-width) solid + var(--jp-widgets-input-border-color); + border-radius: 0; + height: inherit; + flex: 1 1 var(--jp-widgets-inline-width-short); + min-width: 0; /* This makes it possible for the flexbox to shrink this input */ + box-sizing: border-box; + outline: none !important; + box-shadow: none; + background-color: var(--jp-widgets-input-background-color); + color: var(--jp-widgets-input-color); + font-size: var(--jp-widgets-font-size); + vertical-align: top; + padding-left: calc(var(--jp-widgets-input-padding) * 2); + appearance: none; + -webkit-appearance: none; + -moz-appearance: none; + background-repeat: no-repeat; + background-size: 20px; + background-position: right center; + background-image: var(--jp-widgets-dropdown-arrow); +} +/* */ +.widget-dropdown > select:focus, /* */ +.jupyter-widget-dropdown > select:focus { + border-color: var(--jp-widgets-input-focus-border-color); +} + +/* */ +.widget-dropdown > select:disabled, /* */ +.jupyter-widget-dropdown > select:disabled { + opacity: var(--jp-widgets-disabled-opacity); +} + +/* To disable the dotted border in Firefox around select controls. + See http://stackoverflow.com/a/18853002 */ +/* */ +.widget-dropdown > select:-moz-focusring, /* */ +.jupyter-widget-dropdown > select:-moz-focusring { + color: transparent; + text-shadow: 0 0 0 #000; +} + +/* Select and SelectMultiple */ + +/* */ +.widget-select, /* */ +.jupyter-widget-select { + width: var(--jp-widgets-inline-width); + line-height: var(--jp-widgets-inline-height); + + /* Because Firefox defines the baseline of a select as the bottom of the + control, we align the entire control to the top and add padding to the + select to get an approximate first line baseline alignment. */ + align-items: flex-start; +} + +/* */ +.widget-select > select, /* */ +.jupyter-widget-select > select { + border: var(--jp-widgets-input-border-width) solid + var(--jp-widgets-input-border-color); + background-color: var(--jp-widgets-input-background-color); + color: var(--jp-widgets-input-color); + font-size: var(--jp-widgets-font-size); + flex: 1 1 var(--jp-widgets-inline-width-short); + outline: none !important; + overflow: auto; + height: inherit; + + /* Because Firefox defines the baseline of a select as the bottom of the + control, we align the entire control to the top and add padding to the + select to get an approximate first line baseline alignment. */ + padding-top: 5px; +} + +/* */ +.widget-select > select:focus, /* */ +.jupyter-widget-select > select:focus { + border-color: var(--jp-widgets-input-focus-border-color); +} + +.wiget-select > select > option, +.jupyter-wiget-select > select > option { + padding-left: var(--jp-widgets-input-padding); + line-height: var(--jp-widgets-inline-height); + /* line-height doesn't work on some browsers for select options */ + padding-top: calc( + var(--jp-widgets-inline-height) - var(--jp-widgets-font-size) / 2 + ); + padding-bottom: calc( + var(--jp-widgets-inline-height) - var(--jp-widgets-font-size) / 2 + ); +} + +/* Toggle Buttons Styling */ + +/* */ +.widget-toggle-buttons, /* */ +.jupyter-widget-toggle-buttons { + line-height: var(--jp-widgets-inline-height); +} + +/* */ +.widget-toggle-buttons .widget-toggle-button, /* */ +.jupyter-widget-toggle-buttons .jupyter-widget-toggle-button { + margin-left: var(--jp-widgets-margin); + margin-right: var(--jp-widgets-margin); +} + +/* */ +.widget-toggle-buttons .jupyter-button:disabled, /* */ +.jupyter-widget-toggle-buttons .jupyter-button:disabled { + opacity: var(--jp-widgets-disabled-opacity); +} + +/* Radio Buttons Styling */ + +/* */ +.widget-radio, /* */ +.jupyter-widget-radio { + width: var(--jp-widgets-inline-width); + line-height: var(--jp-widgets-inline-height); +} + +/* */ +.widget-radio-box, /* */ +.jupyter-widget-radio-box { + display: flex; + flex-direction: column; + align-items: stretch; + box-sizing: border-box; + flex-grow: 1; + margin-bottom: var(--jp-widgets-radio-item-height-adjustment); +} + +/* */ +.widget-radio-box label, /* */ +.jupyter-widget-radio-box label { + height: var(--jp-widgets-radio-item-height); + line-height: var(--jp-widgets-radio-item-height); + font-size: var(--jp-widgets-font-size); +} + +/* */ +.widget-radio-box input, /* */ +.jupyter-widget-radio-box input { + height: var(--jp-widgets-radio-item-height); + line-height: var(--jp-widgets-radio-item-height); + margin: 0 calc(var(--jp-widgets-input-padding) * 2) 0 1px; + float: left; +} + +/* Color Picker Styling */ + +/* */ +.widget-colorpicker, /* */ +.jupyter-widget-colorpicker { + width: var(--jp-widgets-inline-width); + height: var(--jp-widgets-inline-height); + line-height: var(--jp-widgets-inline-height); +} + +/* */ +.widget-colorpicker > .widget-colorpicker-input, /* */ +.jupyter-widget-colorpicker > .jupyter-widget-colorpicker-input { + flex-grow: 1; + flex-shrink: 1; + min-width: var(--jp-widgets-inline-width-tiny); +} + +/* */ +.widget-colorpicker input[type='color'], /* */ +.jupyter-widget-colorpicker input[type='color'] { + width: var(--jp-widgets-inline-height); + height: var(--jp-widgets-inline-height); + padding: 0 2px; /* make the color square actually square on Chrome on OS X */ + background: var(--jp-widgets-input-background-color); + color: var(--jp-widgets-input-color); + border: var(--jp-widgets-input-border-width) solid + var(--jp-widgets-input-border-color); + border-left: none; + flex-grow: 0; + flex-shrink: 0; + box-sizing: border-box; + align-self: stretch; + outline: none !important; +} + +/* */ +.widget-colorpicker.concise input[type='color'], /* */ +.jupyter-widget-colorpicker.concise input[type='color'] { + border-left: var(--jp-widgets-input-border-width) solid + var(--jp-widgets-input-border-color); +} + +/* */ +.widget-colorpicker input[type='color']:focus, /* */ +/* */ .widget-colorpicker input[type='text']:focus, /* */ +.jupyter-widget-colorpicker input[type='color']:focus, +.jupyter-widget-colorpicker input[type='text']:focus { + border-color: var(--jp-widgets-input-focus-border-color); +} + +/* */ +.widget-colorpicker input[type='text'], /* */ +.jupyter-widget-colorpicker input[type='text'] { + flex-grow: 1; + outline: none !important; + height: var(--jp-widgets-inline-height); + line-height: var(--jp-widgets-inline-height); + background: var(--jp-widgets-input-background-color); + color: var(--jp-widgets-input-color); + border: var(--jp-widgets-input-border-width) solid + var(--jp-widgets-input-border-color); + font-size: var(--jp-widgets-font-size); + padding: var(--jp-widgets-input-padding) + calc(var(--jp-widgets-input-padding) * 2); + min-width: 0; /* This makes it possible for the flexbox to shrink this input */ + flex-shrink: 1; + box-sizing: border-box; +} + +/* */ +.widget-colorpicker input[type='text']:disabled, /* */ +.jupyter-widget-colorpicker input[type='text']:disabled { + opacity: var(--jp-widgets-disabled-opacity); +} + +/* Date Picker Styling */ + +/* */ +.widget-datepicker, /* */ +.jupyter-widget-datepicker { + width: var(--jp-widgets-inline-width); + height: var(--jp-widgets-inline-height); + line-height: var(--jp-widgets-inline-height); +} + +/* */ +.widget-datepicker input[type='date'], /* */ +.jupyter-widget-datepicker input[type='date'] { + flex-grow: 1; + flex-shrink: 1; + min-width: 0; /* This makes it possible for the flexbox to shrink this input */ + outline: none !important; + height: var(--jp-widgets-inline-height); + border: var(--jp-widgets-input-border-width) solid + var(--jp-widgets-input-border-color); + background-color: var(--jp-widgets-input-background-color); + color: var(--jp-widgets-input-color); + font-size: var(--jp-widgets-font-size); + padding: var(--jp-widgets-input-padding) + calc(var(--jp-widgets-input-padding) * 2); + box-sizing: border-box; +} + +/* */ +.widget-datepicker input[type='date']:focus, /* */ +.jupyter-widget-datepicker input[type='date']:focus { + border-color: var(--jp-widgets-input-focus-border-color); +} + +/* */ +.widget-datepicker input[type='date']:invalid, /* */ +.jupyter-widget-datepicker input[type='date']:invalid { + border-color: var(--jp-warn-color1); +} + +/* */ +.widget-datepicker input[type='date']:disabled, /* */ +.jupyter-widget-datepicker input[type='date']:disabled { + opacity: var(--jp-widgets-disabled-opacity); +} + +/* Play Widget */ + +/* */ +.widget-play, /* */ +.jupyter-widget-play { + width: var(--jp-widgets-inline-width-short); + display: flex; + align-items: stretch; +} + +/* */ +.widget-play .jupyter-button, /* */ +.jupyter-widget-play .jupyter-button { + flex-grow: 1; + height: auto; +} + +/* */ +.widget-play .jupyter-button:disabled, /* */ +.jupyter-widget-play .jupyter-button:disabled { + opacity: var(--jp-widgets-disabled-opacity); +} + +/* Tab Widget */ + +/* */ +.jupyter-widgets.widget-tab, /* */ +.jupyter-widgets.jupyter-widget-tab { + display: flex; + flex-direction: column; +} + +/* */ +.jupyter-widgets.widget-tab > .p-TabBar, /* */ +/* */.jupyter-widgets.jupyter-widget-tab > .p-TabBar, /* */ +.jupyter-widgets.jupyter-widget-tab > .lm-TabBar { + /* Necessary so that a tab can be shifted down to overlay the border of the box below. */ + overflow-x: visible; + overflow-y: visible; +} + +/* */ +.jupyter-widgets.widget-tab > .p-TabBar > .p-TabBar-content, /* */ +/* */.jupyter-widgets.jupyter-widget-tab > .p-TabBar > .p-TabBar-content, /* */ +.jupyter-widgets.jupyter-widget-tab > .lm-TabBar > .lm-TabBar-content { + /* Make sure that the tab grows from bottom up */ + align-items: flex-end; + min-width: 0; + min-height: 0; +} + +/* */ +.jupyter-widgets.widget-tab > .widget-tab-contents, /* */ +.jupyter-widgets.jupyter-widget-tab > .widget-tab-contents { + width: 100%; + box-sizing: border-box; + margin: 0; + background: var(--jp-layout-color1); + color: var(--jp-ui-font-color1); + border: var(--jp-border-width) solid var(--jp-border-color1); + padding: var(--jp-widgets-container-padding); + flex-grow: 1; + overflow: auto; +} + +/* */ +.jupyter-widgets.widget-tab > .p-TabBar, /* */ +/* */.jupyter-widgets.jupyter-widget-tab > .p-TabBar, /* */ +.jupyter-widgets.jupyter-widget-tab > .lm-TabBar { + font: var(--jp-widgets-font-size) Helvetica, Arial, sans-serif; + min-height: calc( + var(--jp-widgets-horizontal-tab-height) + var(--jp-border-width) + ); +} + +/* */ +.jupyter-widgets.widget-tab > .p-TabBar .p-TabBar-tab, /* */ +/* */.jupyter-widgets.jupyter-widget-tab > .p-TabBar .p-TabBar-tab, /* */ +.jupyter-widgets.jupyter-widget-tab > .lm-TabBar .lm-TabBar-tab { + flex: 0 1 var(--jp-widgets-horizontal-tab-width); + min-width: 35px; + min-height: calc( + var(--jp-widgets-horizontal-tab-height) + var(--jp-border-width) + ); + line-height: var(--jp-widgets-horizontal-tab-height); + margin-left: calc(-1 * var(--jp-border-width)); + padding: 0px 10px; + background: var(--jp-layout-color2); + color: var(--jp-ui-font-color2); + border: var(--jp-border-width) solid var(--jp-border-color1); + border-bottom: none; + position: relative; +} + +/* */ +.jupyter-widgets.widget-tab > .p-TabBar .p-TabBar-tab.p-mod-current, /* */ +/* */.jupyter-widgets.jupyter-widget-tab > .p-TabBar .p-TabBar-tab.p-mod-current, /* */ +.jupyter-widgets.jupyter-widget-tab > .lm-TabBar .lm-TabBar-tab.lm-mod-current { + color: var(--jp-ui-font-color0); + /* We want the background to match the tab content background */ + background: var(--jp-layout-color1); + min-height: calc( + var(--jp-widgets-horizontal-tab-height) + 2 * var(--jp-border-width) + ); + transform: translateY(var(--jp-border-width)); + overflow: visible; +} + +/* */ +.jupyter-widgets.widget-tab > .p-TabBar .p-TabBar-tab.p-mod-current:before, /* */ +/* */.jupyter-widgets.jupyter-widget-tab > .p-TabBar .p-TabBar-tab.p-mod-current:before, /* */ +.jupyter-widgets.jupyter-widget-tab > .lm-TabBar .lm-TabBar-tab.lm-mod-current:before { + position: absolute; + top: calc(-1 * var(--jp-border-width)); + left: calc(-1 * var(--jp-border-width)); + content: ''; + height: var(--jp-widgets-horizontal-tab-top-border); + width: calc(100% + 2 * var(--jp-border-width)); + background: var(--jp-brand-color1); +} + +/* */ +.jupyter-widgets.widget-tab > .p-TabBar .p-TabBar-tab:first-child, /* */ +/* */.jupyter-widgets.jupyter-widget-tab > .p-TabBar .p-TabBar-tab:first-child, /* */ +.jupyter-widgets.jupyter-widget-tab > .lm-TabBar .lm-TabBar-tab:first-child { + margin-left: 0; +} + +/* */ +.jupyter-widgets.widget-tab + > .p-TabBar + .p-TabBar-tab:hover:not(.p-mod-current), +/* */ +/* */ +.jupyter-widgets.jupyter-widget-tab + > .p-TabBar + .p-TabBar-tab:hover:not(.p-mod-current), +/* */ +.jupyter-widgets.jupyter-widget-tab + > .lm-TabBar + .lm-TabBar-tab:hover:not(.lm-mod-current) { + background: var(--jp-layout-color1); + color: var(--jp-ui-font-color1); +} + +/* */ +.jupyter-widgets.widget-tab + > .p-TabBar + .p-mod-closable + > .p-TabBar-tabCloseIcon, +/* */ +/* */ +.jupyter-widgets.jupyter-widget-tab +> .p-TabBar +.p-mod-closable +> .p-TabBar-tabCloseIcon, +/* */ +.jupyter-widgets.jupyter-widget-tab + > .lm-TabBar + .lm-mod-closable + > .lm-TabBar-tabCloseIcon { + margin-left: 4px; +} + +/* This font-awesome strategy may not work across FA4 and FA5, but we don't +actually support closable tabs, so it really doesn't matter */ +/* */ +.jupyter-widgets.widget-tab + > .p-TabBar + .p-mod-closable + > .p-TabBar-tabCloseIcon:before, +/* */ +/* */ +.jupyter-widgets.jupyter-widget-widget-tab +> .p-TabBar +.p-mod-closable +> .p-TabBar-tabCloseIcon:before, +/* */ +.jupyter-widgets.jupyter-widget-tab + > .lm-TabBar + .lm-mod-closable + > .lm-TabBar-tabCloseIcon:before { + font-family: FontAwesome; + content: '\f00d'; /* close */ +} + +/* */ +.jupyter-widgets.widget-tab > .p-TabBar .p-TabBar-tabIcon, /* */ +/* */ .jupyter-widgets.widget-tab > .p-TabBar .p-TabBar-tabLabel, /* */ +/* */ .jupyter-widgets.widget-tab > .p-TabBar .p-TabBar-tabCloseIcon, /* */ +/* */ .jupyter-widgets.jupyter-widget-tab > .p-TabBar .p-TabBar-tabIcon, /* */ +/* */ .jupyter-widgets.jupyter-widget-tab > .p-TabBar .p-TabBar-tabLabel, /* */ +/* */ .jupyter-widgets.jupyter-widget-tab > .p-TabBar .p-TabBar-tabCloseIcon, /* */ +.jupyter-widgets.jupyter-widget-tab > .lm-TabBar .lm-TabBar-tabIcon, +.jupyter-widgets.jupyter-widget-tab > .lm-TabBar .lm-TabBar-tabLabel, +.jupyter-widgets.jupyter-widget-tab > .lm-TabBar .lm-TabBar-tabCloseIcon { + line-height: var(--jp-widgets-horizontal-tab-height); +} + +/* Accordion Widget */ + +.jupyter-widget-Collapse { + display: flex; + flex-direction: column; + align-items: stretch; +} + +.jupyter-widget-Collapse-header { + padding: var(--jp-widgets-input-padding); + cursor: pointer; + color: var(--jp-ui-font-color2); + background-color: var(--jp-layout-color2); + border: var(--jp-widgets-border-width) solid var(--jp-border-color1); + padding: calc(var(--jp-widgets-container-padding) * 2 / 3) + var(--jp-widgets-container-padding); + font-weight: bold; +} + +.jupyter-widget-Collapse-header:hover { + background-color: var(--jp-layout-color1); + color: var(--jp-ui-font-color1); +} + +.jupyter-widget-Collapse-open > .jupyter-widget-Collapse-header { + background-color: var(--jp-layout-color1); + color: var(--jp-ui-font-color0); + cursor: default; + border-bottom: none; +} + +.jupyter-widget-Collapse-contents { + padding: var(--jp-widgets-container-padding); + background-color: var(--jp-layout-color1); + color: var(--jp-ui-font-color1); + border-left: var(--jp-widgets-border-width) solid var(--jp-border-color1); + border-right: var(--jp-widgets-border-width) solid var(--jp-border-color1); + border-bottom: var(--jp-widgets-border-width) solid var(--jp-border-color1); + overflow: auto; +} + +.jupyter-widget-Accordion { + display: flex; + flex-direction: column; + align-items: stretch; +} + +.jupyter-widget-Accordion .jupyter-widget-Collapse { + margin-bottom: 0; +} + +.jupyter-widget-Accordion .jupyter-widget-Collapse + .jupyter-widget-Collapse { + margin-top: 4px; +} + +/* HTML widget */ + +/* */ +.widget-html, /* */ +/* */ .widget-htmlmath, /* */ +.jupyter-widget-html, +.jupyter-widget-htmlmath { + font-size: var(--jp-widgets-font-size); +} + +/* */ +.widget-html > .widget-html-content, /* */ +/* */.widget-htmlmath > .widget-html-content, /* */ +.jupyter-widget-html > .jupyter-widget-html-content, +.jupyter-widget-htmlmath > .jupyter-widget-html-content { + /* Fill out the area in the HTML widget */ + align-self: stretch; + flex-grow: 1; + flex-shrink: 1; + /* Makes sure the baseline is still aligned with other elements */ + line-height: var(--jp-widgets-inline-height); + /* Make it possible to have absolutely-positioned elements in the html */ + position: relative; +} + +/* Image widget */ + +/* */ +.widget-image, /* */ +.jupyter-widget-image { + max-width: 100%; + height: auto; +} + +/* + +The nouislider.css file is autogenerated from nouislider.less, which imports and wraps the nouislider/src/nouislider.less styles. + +MIT License + +Copyright (c) 2019 Léon Gersen + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ +/* The .widget-slider class is deprecated */ +.widget-slider, +.jupyter-widget-slider { + /* Functional styling; + * These styles are required for noUiSlider to function. + * You don't need to change these rules to apply your design. + */ + /* Wrapper for all connect elements. + */ + /* Offset direction + */ + /* Give origins 0 height/width so they don't interfere with clicking the + * connect elements. + */ + /* Slider size and handle placement; + */ + /* Styling; + * Giving the connect element a border radius causes issues with using transform: scale + */ + /* Handles and cursors; + */ + /* Handle stripes; + */ + /* Disabled state; + */ + /* Base; + * + */ + /* Values; + * + */ + /* Markings; + * + */ + /* Horizontal layout; + * + */ + /* Vertical layout; + * + */ + /* Copyright (c) Jupyter Development Team. + * Distributed under the terms of the Modified BSD License. + */ + /* Custom CSS for nouislider */ +} +.widget-slider .noUi-target, +.jupyter-widget-slider .noUi-target, +.widget-slider .noUi-target *, +.jupyter-widget-slider .noUi-target * { + -webkit-touch-callout: none; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); + -webkit-user-select: none; + -ms-touch-action: none; + touch-action: none; + -ms-user-select: none; + -moz-user-select: none; + user-select: none; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +.widget-slider .noUi-target, +.jupyter-widget-slider .noUi-target { + position: relative; +} +.widget-slider .noUi-base, +.jupyter-widget-slider .noUi-base, +.widget-slider .noUi-connects, +.jupyter-widget-slider .noUi-connects { + width: 100%; + height: 100%; + position: relative; + z-index: 1; +} +.widget-slider .noUi-connects, +.jupyter-widget-slider .noUi-connects { + overflow: hidden; + z-index: 0; +} +.widget-slider .noUi-connect, +.jupyter-widget-slider .noUi-connect, +.widget-slider .noUi-origin, +.jupyter-widget-slider .noUi-origin { + will-change: transform; + position: absolute; + z-index: 1; + top: 0; + right: 0; + -ms-transform-origin: 0 0; + -webkit-transform-origin: 0 0; + -webkit-transform-style: preserve-3d; + transform-origin: 0 0; + transform-style: flat; +} +.widget-slider .noUi-connect, +.jupyter-widget-slider .noUi-connect { + height: 100%; + width: 100%; +} +.widget-slider .noUi-origin, +.jupyter-widget-slider .noUi-origin { + height: 10%; + width: 10%; +} +.widget-slider .noUi-txt-dir-rtl.noUi-horizontal .noUi-origin, +.jupyter-widget-slider .noUi-txt-dir-rtl.noUi-horizontal .noUi-origin { + left: 0; + right: auto; +} +.widget-slider .noUi-vertical .noUi-origin, +.jupyter-widget-slider .noUi-vertical .noUi-origin { + width: 0; +} +.widget-slider .noUi-horizontal .noUi-origin, +.jupyter-widget-slider .noUi-horizontal .noUi-origin { + height: 0; +} +.widget-slider .noUi-handle, +.jupyter-widget-slider .noUi-handle { + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + position: absolute; +} +.widget-slider .noUi-touch-area, +.jupyter-widget-slider .noUi-touch-area { + height: 100%; + width: 100%; +} +.widget-slider .noUi-state-tap .noUi-connect, +.jupyter-widget-slider .noUi-state-tap .noUi-connect, +.widget-slider .noUi-state-tap .noUi-origin, +.jupyter-widget-slider .noUi-state-tap .noUi-origin { + -webkit-transition: transform 0.3s; + transition: transform 0.3s; +} +.widget-slider .noUi-state-drag *, +.jupyter-widget-slider .noUi-state-drag * { + cursor: inherit !important; +} +.widget-slider .noUi-horizontal, +.jupyter-widget-slider .noUi-horizontal { + height: 18px; +} +.widget-slider .noUi-horizontal .noUi-handle, +.jupyter-widget-slider .noUi-horizontal .noUi-handle { + width: 34px; + height: 28px; + right: -17px; + top: -6px; +} +.widget-slider .noUi-vertical, +.jupyter-widget-slider .noUi-vertical { + width: 18px; +} +.widget-slider .noUi-vertical .noUi-handle, +.jupyter-widget-slider .noUi-vertical .noUi-handle { + width: 28px; + height: 34px; + right: -6px; + top: -17px; +} +.widget-slider .noUi-txt-dir-rtl.noUi-horizontal .noUi-handle, +.jupyter-widget-slider .noUi-txt-dir-rtl.noUi-horizontal .noUi-handle { + left: -17px; + right: auto; +} +.widget-slider .noUi-target, +.jupyter-widget-slider .noUi-target { + background: #FAFAFA; + border-radius: 4px; + border: 1px solid #D3D3D3; + box-shadow: inset 0 1px 1px #F0F0F0, 0 3px 6px -5px #BBB; +} +.widget-slider .noUi-connects, +.jupyter-widget-slider .noUi-connects { + border-radius: 3px; +} +.widget-slider .noUi-connect, +.jupyter-widget-slider .noUi-connect { + background: #3FB8AF; +} +.widget-slider .noUi-draggable, +.jupyter-widget-slider .noUi-draggable { + cursor: ew-resize; +} +.widget-slider .noUi-vertical .noUi-draggable, +.jupyter-widget-slider .noUi-vertical .noUi-draggable { + cursor: ns-resize; +} +.widget-slider .noUi-handle, +.jupyter-widget-slider .noUi-handle { + border: 1px solid #D9D9D9; + border-radius: 3px; + background: #FFF; + cursor: default; + box-shadow: inset 0 0 1px #FFF, inset 0 1px 7px #EBEBEB, 0 3px 6px -3px #BBB; +} +.widget-slider .noUi-active, +.jupyter-widget-slider .noUi-active { + box-shadow: inset 0 0 1px #FFF, inset 0 1px 7px #DDD, 0 3px 6px -3px #BBB; +} +.widget-slider .noUi-handle:before, +.jupyter-widget-slider .noUi-handle:before, +.widget-slider .noUi-handle:after, +.jupyter-widget-slider .noUi-handle:after { + content: ""; + display: block; + position: absolute; + height: 14px; + width: 1px; + background: #E8E7E6; + left: 14px; + top: 6px; +} +.widget-slider .noUi-handle:after, +.jupyter-widget-slider .noUi-handle:after { + left: 17px; +} +.widget-slider .noUi-vertical .noUi-handle:before, +.jupyter-widget-slider .noUi-vertical .noUi-handle:before, +.widget-slider .noUi-vertical .noUi-handle:after, +.jupyter-widget-slider .noUi-vertical .noUi-handle:after { + width: 14px; + height: 1px; + left: 6px; + top: 14px; +} +.widget-slider .noUi-vertical .noUi-handle:after, +.jupyter-widget-slider .noUi-vertical .noUi-handle:after { + top: 17px; +} +.widget-slider [disabled] .noUi-connect, +.jupyter-widget-slider [disabled] .noUi-connect { + background: #B8B8B8; +} +.widget-slider [disabled].noUi-target, +.jupyter-widget-slider [disabled].noUi-target, +.widget-slider [disabled].noUi-handle, +.jupyter-widget-slider [disabled].noUi-handle, +.widget-slider [disabled] .noUi-handle, +.jupyter-widget-slider [disabled] .noUi-handle { + cursor: not-allowed; +} +.widget-slider .noUi-pips, +.jupyter-widget-slider .noUi-pips, +.widget-slider .noUi-pips *, +.jupyter-widget-slider .noUi-pips * { + -moz-box-sizing: border-box; + box-sizing: border-box; +} +.widget-slider .noUi-pips, +.jupyter-widget-slider .noUi-pips { + position: absolute; + color: #999; +} +.widget-slider .noUi-value, +.jupyter-widget-slider .noUi-value { + position: absolute; + white-space: nowrap; + text-align: center; +} +.widget-slider .noUi-value-sub, +.jupyter-widget-slider .noUi-value-sub { + color: #ccc; + font-size: 10px; +} +.widget-slider .noUi-marker, +.jupyter-widget-slider .noUi-marker { + position: absolute; + background: #CCC; +} +.widget-slider .noUi-marker-sub, +.jupyter-widget-slider .noUi-marker-sub { + background: #AAA; +} +.widget-slider .noUi-marker-large, +.jupyter-widget-slider .noUi-marker-large { + background: #AAA; +} +.widget-slider .noUi-pips-horizontal, +.jupyter-widget-slider .noUi-pips-horizontal { + padding: 10px 0; + height: 80px; + top: 100%; + left: 0; + width: 100%; +} +.widget-slider .noUi-value-horizontal, +.jupyter-widget-slider .noUi-value-horizontal { + -webkit-transform: translate(-50%, 50%); + transform: translate(-50%, 50%); +} +.noUi-rtl .widget-slider .noUi-value-horizontal, +.noUi-rtl .jupyter-widget-slider .noUi-value-horizontal { + -webkit-transform: translate(50%, 50%); + transform: translate(50%, 50%); +} +.widget-slider .noUi-marker-horizontal.noUi-marker, +.jupyter-widget-slider .noUi-marker-horizontal.noUi-marker { + margin-left: -1px; + width: 2px; + height: 5px; +} +.widget-slider .noUi-marker-horizontal.noUi-marker-sub, +.jupyter-widget-slider .noUi-marker-horizontal.noUi-marker-sub { + height: 10px; +} +.widget-slider .noUi-marker-horizontal.noUi-marker-large, +.jupyter-widget-slider .noUi-marker-horizontal.noUi-marker-large { + height: 15px; +} +.widget-slider .noUi-pips-vertical, +.jupyter-widget-slider .noUi-pips-vertical { + padding: 0 10px; + height: 100%; + top: 0; + left: 100%; +} +.widget-slider .noUi-value-vertical, +.jupyter-widget-slider .noUi-value-vertical { + -webkit-transform: translate(0, -50%); + transform: translate(0, -50%); + padding-left: 25px; +} +.noUi-rtl .widget-slider .noUi-value-vertical, +.noUi-rtl .jupyter-widget-slider .noUi-value-vertical { + -webkit-transform: translate(0, 50%); + transform: translate(0, 50%); +} +.widget-slider .noUi-marker-vertical.noUi-marker, +.jupyter-widget-slider .noUi-marker-vertical.noUi-marker { + width: 5px; + height: 2px; + margin-top: -1px; +} +.widget-slider .noUi-marker-vertical.noUi-marker-sub, +.jupyter-widget-slider .noUi-marker-vertical.noUi-marker-sub { + width: 10px; +} +.widget-slider .noUi-marker-vertical.noUi-marker-large, +.jupyter-widget-slider .noUi-marker-vertical.noUi-marker-large { + width: 15px; +} +.widget-slider .noUi-tooltip, +.jupyter-widget-slider .noUi-tooltip { + display: block; + position: absolute; + border: 1px solid #D9D9D9; + border-radius: 3px; + background: #fff; + color: #000; + padding: 5px; + text-align: center; + white-space: nowrap; +} +.widget-slider .noUi-horizontal .noUi-tooltip, +.jupyter-widget-slider .noUi-horizontal .noUi-tooltip { + -webkit-transform: translate(-50%, 0); + transform: translate(-50%, 0); + left: 50%; + bottom: 120%; +} +.widget-slider .noUi-vertical .noUi-tooltip, +.jupyter-widget-slider .noUi-vertical .noUi-tooltip { + -webkit-transform: translate(0, -50%); + transform: translate(0, -50%); + top: 50%; + right: 120%; +} +.widget-slider .noUi-horizontal .noUi-origin > .noUi-tooltip, +.jupyter-widget-slider .noUi-horizontal .noUi-origin > .noUi-tooltip { + -webkit-transform: translate(50%, 0); + transform: translate(50%, 0); + left: auto; + bottom: 10px; +} +.widget-slider .noUi-vertical .noUi-origin > .noUi-tooltip, +.jupyter-widget-slider .noUi-vertical .noUi-origin > .noUi-tooltip { + -webkit-transform: translate(0, -18px); + transform: translate(0, -18px); + top: auto; + right: 28px; +} +.widget-slider .noUi-connect, +.jupyter-widget-slider .noUi-connect { + background: #2196f3; +} +.widget-slider .noUi-horizontal, +.jupyter-widget-slider .noUi-horizontal { + height: var(--jp-widgets-slider-track-thickness); +} +.widget-slider .noUi-vertical, +.jupyter-widget-slider .noUi-vertical { + width: var(--jp-widgets-slider-track-thickness); + height: 100%; +} +.widget-slider .noUi-horizontal .noUi-handle, +.jupyter-widget-slider .noUi-horizontal .noUi-handle { + width: var(--jp-widgets-slider-handle-size); + height: var(--jp-widgets-slider-handle-size); + border-radius: 50%; + top: calc((var(--jp-widgets-slider-track-thickness) - var(--jp-widgets-slider-handle-size)) / 2); + right: calc(var(--jp-widgets-slider-handle-size) / -2); +} +.widget-slider .noUi-vertical .noUi-handle, +.jupyter-widget-slider .noUi-vertical .noUi-handle { + height: var(--jp-widgets-slider-handle-size); + width: var(--jp-widgets-slider-handle-size); + border-radius: 50%; + right: calc((var(--jp-widgets-slider-handle-size) - var(--jp-widgets-slider-track-thickness)) / -2); + top: calc(var(--jp-widgets-slider-handle-size) / -2); +} +.widget-slider .noUi-handle:after, +.jupyter-widget-slider .noUi-handle:after { + content: none; +} +.widget-slider .noUi-handle:before, +.jupyter-widget-slider .noUi-handle:before { + content: none; +} +.widget-slider .noUi-target, +.jupyter-widget-slider .noUi-target { + background: #fafafa; + border-radius: 4px; + border: 1px; + /* box-shadow: inset 0 1px 1px #F0F0F0, 0 3px 6px -5px #BBB; */ +} +.widget-slider .ui-slider, +.jupyter-widget-slider .ui-slider { + border: var(--jp-widgets-slider-border-width) solid var(--jp-layout-color3); + background: var(--jp-layout-color3); + box-sizing: border-box; + position: relative; + border-radius: 0px; +} +.widget-slider .noUi-handle, +.jupyter-widget-slider .noUi-handle { + width: var(--jp-widgets-slider-handle-size); + border: 1px solid #d9d9d9; + border-radius: 3px; + background: #fff; + cursor: default; + box-shadow: none; + outline: none; +} +.widget-slider .noUi-target:not([disabled]) .noUi-handle:hover, +.jupyter-widget-slider .noUi-target:not([disabled]) .noUi-handle:hover, +.widget-slider .noUi-target:not([disabled]) .noUi-handle:focus, +.jupyter-widget-slider .noUi-target:not([disabled]) .noUi-handle:focus { + background-color: var(--jp-widgets-slider-active-handle-color); + border: var(--jp-widgets-slider-border-width) solid var(--jp-widgets-slider-active-handle-color); +} +.widget-slider [disabled].noUi-target, +.jupyter-widget-slider [disabled].noUi-target { + opacity: 0.35; +} +.widget-slider .noUi-connects, +.jupyter-widget-slider .noUi-connects { + overflow: visible; + z-index: 0; + background: var(--jp-layout-color3); +} +.widget-slider .noUi-vertical .noUi-connect, +.jupyter-widget-slider .noUi-vertical .noUi-connect { + width: calc(100% + 2px); + right: -1px; +} +.widget-slider .noUi-horizontal .noUi-connect, +.jupyter-widget-slider .noUi-horizontal .noUi-connect { + height: calc(100% + 2px); + top: -1px; +}