Skip to content

Instantly share code, notes, and snippets.

@romainmartinez
Last active June 18, 2020 19:21
Show Gist options
  • Save romainmartinez/a3245dfa4eeaf21ce452dbb988d6432e to your computer and use it in GitHub Desktop.
Save romainmartinez/a3245dfa4eeaf21ce452dbb988d6432e to your computer and use it in GitHub Desktop.
talk css
.nord0 {
color: #2e3440;
}
.nord1 {
color: #3b4252;
}
.nord2 {
color: #434c5e;
}
.nord3 {
color: #4c566a;
}
.nord4 {
color: #d8dee9;
}
.nord5 {
color: #e5e9f0;
}
.nord6 {
color: #eceff4;
}
.nord7 {
color: #8fbcbb;
}
.nord8 {
color: #88c0d0;
}
.nord9 {
color: #81a1c1;
}
.nord10 {
color: #5e81ac;
}
.nord11 {
color: #bf616a;
}
.nord12 {
color: #d08770;
}
.nord13 {
color: #ebcb8b;
}
.nord14 {
color: #a3be8c;
}
.nord15 {
color: #b48ead;
}
.maroon{
color: #800000;
}
/*Elements*/
.card {
transition: 0.3s;
background-color: rgb(242, 244, 248);
fill-opacity: 0.6;
border-radius: 8px;
padding: 15px;
margin-top: 15px;
}
.remark-slide-content {
font-size: 170%;
line-height: normal;
}
.fade {
opacity: .6;
}
.cite {
opacity: .6;
font-size: 70%;
}
.header {
font-size: 70%;
}
body, h2, h3, h4 {
color: #434c5e;
}
hr, .title-slide h2::after, .mline h1::after {
background-color: #81a1c1;
color: #81a1c1;
height: 2px;
text-align: left;
width: 50%;
}
/* Slides static*/
.remark-slide-content {
border-top-color: #2e3440;
background-color: #ffffff;
}
.remark-slide-number {
display: none;
}
.inverse {
background-color: #2e3440;
color: #eceff4;
}
.pad {
padding-left: 30%;
}
.pull-left-tier {
float: left;
width: 27%;
}
.pull-right-tier {
float: right;
width: 67%;
}
.bg-grey{
background-color: #eaeaea;
}
.middle2 {
margin: 0;
position: absolute;
top: 40%;
}
<!DOCTYPE html>
<html lang="" xml:lang="">
<head>
<title>index.utf8.md</title>
<meta charset="utf-8" />
<link href="libs/remark-css/default.css" rel="stylesheet" />
<link href="libs/remark-css/metropolis.css" rel="stylesheet" />
<link href="libs/remark-css/metropolis-fonts.css" rel="stylesheet" />
<link rel="stylesheet" href="assets/mrtnz.css" type="text/css" />
<link rel="stylesheet" href="assets/simple-grid.css" type="text/css" />
</head>
<body>
<textarea id="source">
class: inverse, left, middle
# Pyomeca
&lt;hr&gt;
## Une librairie Python d'analyse biomécanique
&lt;br&gt;
Romain Martinez
Les présentations du confinement | 2020-04-29
---
class: inverse, middle, clear
# .nord9[1.] Les besoins
&lt;hr&gt;
## Pour une analyse biomécanique unifiée
---
# .header[Une analyse biomécanique unifiée]
Les sujets de recherches biomécanique sont __variés__.
Mais les données sont remarquablement __similaires__:
&lt;img src="fig/datasets.svg" width="90%" style="display: block; margin: auto;" /&gt;
.card[
Traitement, analyse et visualisation pourraient être __unifiés__.
]
???
Bien que les sujets de recherche biomécaniques soient variés, les données sont remarquablement similaires.
Elles comprennent souvent de nombreuses variables temporelles pour différents sujets, groupes et conditions.
Le traitement, l’analyse et la visualisation de ces données pourraient donc être unifiés dans un logiciel.
---
# .header[Des solutions payantes]
Limite l'impact et l'accès des logiciels.
&lt;br&gt;
| Produit | Coût / Année | |
|---------------------------|-----------------|---|
| Matlab | 1,250 $CAD | |
| Wavelet Toolbox | 700 $CAD | |
| Signal Processing Toolbox | 600 $CAD | |
| ... | ... | |
| __TOTAL__ | __23,500 $CAD__ | |
&lt;br&gt;
&lt;img src="fig/matlab.svg" width="60%" style="display: block; margin: auto;" /&gt;
???
Les solutions existantes ont cependant deux problèmes récurrents:
Le premier problème est quelles sont payantes ou basés sur des languages de programmation payants.
Cela limite non seulement l’impact et l'accès de ces logiciels.
Par exemple, Matlab qui est majoritairement utilisé dans le monde académique peut devenir très chère une fois que vous avez gradué.
Après un calcul rapide, l'installation de Matlab que vous utilisez en ce moment vous coutera 23,500$ CAD par année pour un usage non-académique avec les mêmes toolbox.
---
# .header[Des solutions qui n'exploitent pas les labels]
En biomécaniques les données sont __multidimensionnelles__.
Mais elles sont aussi structurées autour de __labels__.
.row[
.col-8[
1. Axes&lt;br&gt;`["X", "Y", "Z"]`
2. Markers&lt;br&gt;`["CLAV_SC", "CLAVm", "CLAV_ant"]`
3. Time frames&lt;br&gt;`[0. , 0.01, ..., 5.78, 5.79]`
]
.col-4[
&lt;img src="fig/markers.svg" width="100%" style="display: block; margin: auto;" /&gt;
]
]
```python
markers[0, 1, :] # select X axis, CLAVm &amp; all frames
```
???
Le deuxième problème c'est que les solutions existantes n'exploitent pas les labels.
Nous travaillons avec des données multidimensionnelles.
Ce que est intéressant avec ces données c'est quelles sont évidemment numériques, mais elles sont aussi structurées autour de labels.
Si on prend l'exemple d'une matrice de marqueurs, on a trois dimensions:
- La premiére dimensions représente les trois axes X, Y, Z
- La deuxième les différents marqueurs
- La troisième le temps
Comment on travaille avec ces données actuellement?
Si vous êtes sur Python, vous utiliser probablement Numpy.
---
# .header[Des solutions qui manquent de convivialité]
Gestion des métadata
.row[
.col-4[
&lt;img src="fig/markers.svg" width="100%" style="display: block; margin: auto;" /&gt;
]
.col-1[
.middle2[$$+$$]
]
.col-7[
- `participant = "dapo"`
- `date = "2019-02-17"`
- `group = "control"`
- `note = "CLAV marker fell"`
- ...
]
]
Gestion de données &gt; mémoire RAM
???
Les données qu'on a vu ont souvent des métadata associés
- participant
- date
- groupe
La taille de ces données va de petite matrice à d'énormes matrices qui ne rentrent pas dans la RAM de notre ordinateur.
---
class: inverse, middle, clear
# .nord9[2.] Pyomeca
&lt;hr&gt;
## Pour une analyse biomécanique unifiée
---
# .header[Pyomeca]
&gt; Pyomeca is a python library allowing you to carry out a complete biomechanical analysis; in a simple, logical and concise way.
- [github.com/pyomeca/pyomeca](https://github.com/pyomeca/pyomeca/)
- [romainmartinez.github.io/pyomeca](https://romainmartinez.github.io/pyomeca)
&lt;img src="fig/logo_plain_doc.svg" width="100%" style="display: block; margin: auto;" /&gt;
???
De ce besoin est né Pyomeca, un logiciel offrant une interface générique et néanmoins flexible pour traiter, analyser et visualiser des données biomécaniques.
---
# .header[Une solution gratuite et _open-source_]
Coût d'une installation complète `Python` + `Pyomeca` = __0$__
Votre code peut-être modifié et executé par __n'importe qui__
Vous programmez dans un language __populaire__ et en __demande__
&lt;img src="fig/python.svg" width="65%" style="display: block; margin: auto;" /&gt;
???
Comment Pyomeca répond à nos différents besoin.
D'abord c'est une solution complementement gratuite.
C'est-à-dire que votre code peut-être modifié, amélioré et executé par n'importe qui qui à accès à une ordinateur
C'est donc une librairie Python, vous programmez donc avec un language qui est populaire et en demande
---
# .header[Une solution qui exploite les labels]
```python
from pyomeca import Markers
markers = Markers.from_c3d("markers.c3d")
```
--
__Positional indexing__
```python
markers[0, 1, :]
```
--
__Label-based indexing__
Lookup by integer
```python
markers.isel(axis=0, channel=1)
```
Lookup by label
```python
markers.sel(axis="X", channel="CLAVm")
```
---
# .header[Une solution qui exploite les labels]
```python
markers
```
```python
&lt;'markers' (axis: 3, channel: 51, time: 580)&gt;
Coordinates:
* axis (axis) &lt;U4 'x' 'y' 'z'
* channel (channel) &lt;U14 'gauche_ext' ... 'LATH'
* time (time) float64 0.0 ... 5.79
Attributes:
rate: 100.0
units: mm
```
--
__Positional computation__
```python
markers.mean(axis=2)
```
--
__Label-based computation__
```python
markers.mean(dim="time")
```
---
# .header[Une solution qui exploite les labels]
.row[
.col-7[
Numpy
```python
markers - markers.T
```
```bash
&gt;&gt; ValueError: could not
be broadcast together with
shapes (3,51,580) (580,51,3)
```
]
.col-5[
Pyomeca
```python
markers - markers.T
```
]
]
--
--
__Label-based broadcasting__
&lt;img src="fig/broadcasting.svg" width="100%" style="display: block; margin: auto;" /&gt;
---
# .header[Une solution qui exploite les labels]
__Label-based plotting__
```python
markers.plot.line(x="time", col="channel", col_wrap=3)
```
&lt;img src="fig/plot.svg" width="90%" style="display: block; margin: auto;" /&gt;
---
# .header[Une solution qui gère les métadata]
```python
markers.attrs["description"] = "Skin marker positions"
markers.attrs["participant_id"] = 12
markers
```
--
```python
&lt;'markers' (axis: 3, channel: 51, time: 580)&gt;
Coordinates:
* axis (axis) &lt;U4 'x' 'y' 'z'
* channel (channel) &lt;U14 'gauche_ext' ... 'LATH'
* time (time) float64 0.0 ... 5.79
Attributes:
rate: 100.0
units: mm
description: Skin marker positions
participant_id: 12
```
--
```python
markers.description
markers.attrs["description"]
```
---
# .header[Une solution efficiente]
__Datasets__
```python
import xarray as xr
trials = xr.Dataset(
{
"trial 1": markers,
"trial 2": markers * np.random.rand(),
"trial 3": markers * np.random.rand(),
}
)
```
```python
Dimensions: (axis: 3, channel: 51, time: 580)
Coordinates:
* axis (axis) &lt;U4 'x' 'y' 'z'
* channel (channel) &lt;U14 'gauche_ext' ... 'LATH'
* time (time) float64 0.0 ... 5.79
Data variables:
trial 1 (axis, channel, time) float64 44.16 ... 1.0
trial 2 (axis, channel, time) float64 24.58 ... 0.5566
trial 3 (axis, channel, time) float64 14.92 ... 0.3378
```
???
datasets: container de xarray arrays qui partagent ou moins une même dimension. On peut par exemple sauver tous les essais d''une expérimentations.
Devient intéressant pour deux raisons.
La première c'est que l'on peut faire des opérations directement sur le dataset (signal processing, plotting, etc.) et sauver dans un fichier binaire standard très efficient.
---
# .header[Une solution efficiente]
```python
trials.to_netcdf("trials.nc")
```
__Parallel computation__
```python
trials = xr.open_dataset("trials.nc", chunk={"time": 100})
trials.rolling(time=10).mean().compute()
```
&lt;img src="fig/dask.svg" width="90%" style="display: block; margin: auto;" /&gt;
???
La deuxième c'est que Xarray à un très bon support pour du multiprocessing. Dask
Qui est une librarie très populaire pour gérér des données qui sont plus grosses que la mémoire de notre ordinateur.
Dask build a computation graph and distribute the different task into all of our computeurs cores
---
# .header[Une solution spécialisée]
.row[
.col-6[
&lt;img src="fig/object-creation/0_angles.svg" width="100%" style="display: block; margin: auto;" /&gt;
]
.col-6[
__Angles__
&lt;img src="fig/object-creation/objects/angles.svg" height="100%" style="display: block; margin: auto;" /&gt;
]
]
---
# .header[Une solution spécialisée]
.row[
.col-6[
&lt;img src="fig/object-creation/1_rt.svg" width="100%" style="display: block; margin: auto;" /&gt;
]
.col-6[
__Rototrans__
&lt;img src="fig/object-creation/objects/rototrans.svg" height="100%" style="display: block; margin: auto;" /&gt;
]
]
---
# .header[une solution spécialisée]
.row[
.col-6[
&lt;img src="fig/object-creation/2_analogs.svg" width="100%" style="display: block; margin: auto;" /&gt;
]
.col-6[
__Analogs__
&lt;img src="fig/object-creation/objects/analogs.svg" height="100%" style="display: block; margin: auto;" /&gt;
]
]
---
# .header[Une solution spécialisée]
.row[
.col-6[
&lt;img src="fig/object-creation/3_markers.svg" width="100%" style="display: block; margin: auto;" /&gt;
]
.col-6[
__Markers__
&lt;img src="fig/object-creation/objects/markers.svg" height="100%" style="display: block; margin: auto;" /&gt;
]
]
---
# .header[Une solution spécialisée]
.row[
.col-6[
&lt;img src="fig/data-processing/0_filters.svg" width="100%" style="display: block; margin: auto;" /&gt;
]
.col-6[
__Filters__
]
]
---
# .header[Une solution spécialisée]
.row[
.col-6[
&lt;img src="fig/data-processing/1_normalization.svg" width="100%" style="display: block; margin: auto;" /&gt;
]
.col-6[
__Normalization__
]
]
---
# .header[Une solution spécialisée]
.row[
.col-6[
&lt;img src="fig/data-processing/2_linear_algebra.svg" width="100%" style="display: block; margin: auto;" /&gt;
]
.col-6[
__Linear Algebra__
]
]
---
# .header[Une solution spécialisée]
.row[
.col-6[
&lt;img src="fig/data-processing/3_signal_processing.svg" width="100%" style="display: block; margin: auto;" /&gt;
]
.col-6[
__Signal Processing__
]
]
---
# .header[Une solution spécialisée]
.row[
.col-6[
&lt;img src="fig/data-processing/4_fileio.svg" width="100%" style="display: block; margin: auto;" /&gt;
]
.col-6[
__File IO__
]
]
---
# .header[Une solution spécialisée]
```python
from pyomeca import Analogs
emg_processed = (
* Analogs.from_c3d("data.c3d")
.meca.band_pass(freq=rate, order=2, cutoff=[10, 425])
.meca.center()
.meca.abs()
.meca.low_pass(freq=emg.rate, order=4, cutoff=5)
.meca.normalize()
)
```
&lt;img src="fig/data-processing/plots/0_raw.svg" width="100%" style="display: block; margin: auto;" /&gt;
---
# .header[Une solution spécialisée]
```python
from pyomeca import Analogs
emg_processed = (
Analogs.from_c3d("data.c3d")
* .meca.band_pass(freq=rate, order=2, cutoff=[10, 425])
.meca.center()
.meca.abs()
.meca.low_pass(freq=emg.rate, order=4, cutoff=5)
.meca.normalize()
)
```
&lt;img src="fig/data-processing/plots/1_band_pass.svg" width="100%" style="display: block; margin: auto;" /&gt;
---
# .header[Une solution spécialisée]
```python
from pyomeca import Analogs
emg_processed = (
Analogs.from_c3d("data.c3d")
.meca.band_pass(freq=rate, order=2, cutoff=[10, 425])
* .meca.center()
.meca.abs()
.meca.low_pass(freq=emg.rate, order=4, cutoff=5)
.meca.normalize()
)
```
&lt;img src="fig/data-processing/plots/2_center.svg" width="100%" style="display: block; margin: auto;" /&gt;
---
# .header[Une solution spécialisée]
```python
from pyomeca import Analogs
emg_processed = (
Analogs.from_c3d("data.c3d")
.meca.band_pass(freq=rate, order=2, cutoff=[10, 425])
.meca.center()
* .meca.abs()
.meca.low_pass(freq=emg.rate, order=4, cutoff=5)
.meca.normalize()
)
```
&lt;img src="fig/data-processing/plots/3_abs.svg" width="100%" style="display: block; margin: auto;" /&gt;
---
# .header[Une solution spécialisée]
```python
from pyomeca import Analogs
emg_processed = (
Analogs.from_c3d("data.c3d")
.meca.band_pass(freq=rate, order=2, cutoff=[10, 425])
.meca.center()
.meca.abs()
* .meca.low_pass(freq=emg.rate, order=4, cutoff=5)
.meca.normalize()
)
```
&lt;img src="fig/data-processing/plots/4_low_pass.svg" width="100%" style="display: block; margin: auto;" /&gt;
---
# .header[Une solution spécialisée]
```python
from pyomeca import Analogs
emg_processed = (
Analogs.from_c3d("data.c3d")
.meca.band_pass(freq=rate, order=2, cutoff=[10, 425])
.meca.center()
.meca.abs()
.meca.low_pass(freq=emg.rate, order=4, cutoff=5)
* .meca.normalize()
)
```
&lt;img src="fig/data-processing/plots/5_normalize.svg" width="100%" style="display: block; margin: auto;" /&gt;
---
# .header[Une solution sûre]
Facilement installable &lt;img src="https://anaconda.org/conda-forge/pyomeca/badges/downloads.svg"/&gt;
```bash
conda install pyomeca -c conda-forge
```
--
Documentée (API, exemples, serveur d'essai) &lt;img src="https://mybinder.org/badge_logo.svg"/&gt;
[romainmartinez.github.io/pyomeca](https://romainmartinez.github.io/pyomeca)
--
Testée (à chaque modification, tous les dimanches) &lt;img src="https://coveralls.io/repos/github/romainmartinez/pyomeca/badge.svg?branch=master"/&gt;
Type annotated &lt;img src="https://img.shields.io/badge/code%20style-black-000000.svg"/&gt;
&lt;img src="fig/logo_plain_doc.svg" width="100%" style="display: block; margin: auto;" /&gt;
???
Pyomeca suit les bonnes pratiques d’ingénierie logicielle afin de s’assurer que le logiciel est facile à distribuer, produit le même résultat sur n'importe quel ordinateur, et peut être rapidement mis à jour et amélioré
---
class: inverse, left, middle
# Pyomeca
&lt;hr&gt;
## Une librairie Python d'analyse biomécanique
&lt;br&gt;
Romain Martinez
Les présentations du confinement | 2020-04-29
</textarea>
<style data-target="print-only">
@media screen {
.remark-slide-container {
display: block;
}
.remark-slide-scaler {
box-shadow: none;
}
}
</style>
<script src="https://remarkjs.com/downloads/remark-latest.min.js"></script>
<script>
var slideshow = remark.create({
ratio: "4:3",
highlightStyle: "github",
highlightLines: true
})
if (window.HTMLWidgets)
slideshow.on("afterShowSlide", function(slide) {
window.dispatchEvent(new Event("resize"))
})
;(function(d) {
var s = d.createElement("style"),
r = d.querySelector(".remark-slide-scaler")
if (!r) return
s.type = "text/css"
s.innerHTML =
"@page {size: " + r.style.width + " " + r.style.height + "; }"
d.head.appendChild(s)
})(document)
;(function(d) {
var el = d.getElementsByClassName("remark-slides-area")
if (!el) return
var slide,
slides = slideshow.getSlides(),
els = el[0].children
for (var i = 1; i < slides.length; i++) {
slide = slides[i]
if (
slide.properties.continued === "true" ||
slide.properties.count === "false"
) {
els[i - 1].className += " has-continuation"
}
}
var s = d.createElement("style")
s.type = "text/css"
s.innerHTML = "@media print { .has-continuation { display: none; } }"
d.head.appendChild(s)
})(document)
// delete the temporary CSS (for displaying all slides initially) when the user
// starts to view slides
;(function() {
var deleted = false
slideshow.on("beforeShowSlide", function(slide) {
if (deleted) return
var sheets = document.styleSheets,
node
for (var i = 0; i < sheets.length; i++) {
node = sheets[i].ownerNode
if (node.dataset["target"] !== "print-only") continue
node.parentNode.removeChild(node)
}
deleted = true
})
})()
;(function() {
"use strict"
// Replace <script> tags in slides area to make them executable
var scripts = document.querySelectorAll(
".remark-slides-area .remark-slide-container script"
)
if (!scripts.length) return
for (var i = 0; i < scripts.length; i++) {
var s = document.createElement("script")
var code = document.createTextNode(scripts[i].textContent)
s.appendChild(code)
var scriptAttrs = scripts[i].attributes
for (var j = 0; j < scriptAttrs.length; j++) {
s.setAttribute(scriptAttrs[j].name, scriptAttrs[j].value)
}
scripts[i].parentElement.replaceChild(s, scripts[i])
}
})()
;(function() {
var links = document.getElementsByTagName("a")
for (var i = 0; i < links.length; i++) {
if (/^(https?:)?\/\//.test(links[i].getAttribute("href"))) {
links[i].target = "_blank"
}
}
})()
// adds .remark-code-has-line-highlighted class to <pre> parent elements
// of code chunks containing highlighted lines with class .remark-code-line-highlighted
;(function(d) {
const hlines = d.querySelectorAll(".remark-code-line-highlighted")
const preParents = []
const findPreParent = function(line, p = 0) {
if (p > 1) return null // traverse up no further than grandparent
const el = line.parentElement
return el.tagName === "PRE" ? el : findPreParent(el, ++p)
}
for (let line of hlines) {
let pre = findPreParent(line)
if (pre && !preParents.includes(pre)) preParents.push(pre)
}
preParents.forEach((p) =>
p.classList.add("remark-code-has-line-highlighted")
)
})(document)
</script>
<script>
slideshow._releaseMath = function(el) {
var i,
text,
code,
codes = el.getElementsByTagName("code")
for (i = 0; i < codes.length; ) {
code = codes[i]
if (
code.parentNode.tagName !== "PRE" &&
code.childElementCount === 0
) {
text = code.textContent
if (
/^\\\((.|\s)+\\\)$/.test(text) ||
/^\\\[(.|\s)+\\\]$/.test(text) ||
/^\$\$(.|\s)+\$\$$/.test(text) ||
/^\\begin\{([^}]+)\}(.|\s)+\\end\{[^}]+\}$/.test(text)
) {
code.outerHTML = code.innerHTML // remove <code></code>
continue
}
}
i++
}
}
slideshow._releaseMath(document)
</script>
<!-- dynamically load mathjax for compatibility with self-contained -->
<script>
;(function() {
var script = document.createElement("script")
script.type = "text/javascript"
script.src =
"https://mathjax.rstudio.com/latest/MathJax.js?config=TeX-MML-AM_CHTML"
if (location.protocol !== "file:" && /^https?:/.test(script.src))
script.src = script.src.replace(/^https?:/, "")
document.getElementsByTagName("head")[0].appendChild(script)
})()
</script>
</body>
</html>
@import url(https://fonts.googleapis.com/css?family=Fira+Sans:300,300i,400,400i,500,500i,700,700i);
@import url(https://cdn.rawgit.com/tonsky/FiraCode/1.204/distr/fira_code.css);
body {
font-family: 'Fira Sans','Droid Serif', 'Palatino Linotype', 'Book Antiqua', Palatino, 'Microsoft YaHei', 'Songti SC', serif;
}
.remark-code, .remark-inline-code {
font-family: 'Fira Code', 'Lucida Console', Monaco, monospace;
font-size: 80%;
}
.remark-slide-content {
background-color: #FAFAFA;
border-top: 80px solid #23373B;
font-size: 20px;
font-weight: 300;
line-height: 1.5;
padding: 1em 2em 1em 2em
}
.title-slide .inverse .remark-slide-content {
background-color: #FAFAFA;
}
.inverse {
background-color: #23373B;
text-shadow: none;
}
/* Removes colored bar from top of the slide resulting in a clear slide */
.clear{
border-top: 0px solid #FAFAFA;
}
h1 {
font-weight: normal;
margin-top: -95px;
margin-left: -00px;
color: #FAFAFA;
}
h2, h3, h4 {
padding-top: -15px;
padding-bottom: 00px;
color: #1A292C;
text-shadow: none;
font-weight: 400;
text-align: left;
margin-left: 00px;
margin-bottom: -10px;
}
.remark-slide-content h1 {
font-size: 45px;
}
.remark-slide-content h2 {
font-size: 35px;
}
.remark-slide-content h3 {
font-size: 30px;
}
.left-column h2, .left-column h3, .left-column h4 {
color: #777;
}
.left-column h2:last-of-type, .left-column h3:last-child {
color: #1A292C;
}
.title-slide {
background-color: #FAFAFA;
border-top: 80px solid #FAFAFA;
}
.title-slide h1 {
color: #1A292C;
font-size: 40px;
text-shadow: none;
font-weight: 400;
text-align: left;
margin-left: 15px;
padding-top: 80px;
}
.title-slide h2 {
margin-top: -25px;
padding-bottom: -20px;
color: #1A292C;
text-shadow: none;
font-weight: 300;
font-size: 35px;
text-align: left;
margin-left: 15px;
}
.title-slide h3 {
color: #1A292C;
text-shadow: none;
font-weight: 300;
font-size: 25px;
text-align: left;
margin-left: 15px;
margin-bottom: -30px;
}
hr, .title-slide h2::after, .mline h1::after {
content: '';
display: block;
border: none;
background-color: #EB811B;
color: #EB811B;
height: 1px;
}
hr, .mline h1::after {
margin: 1em 15px 0 15px;
}
.title-slide h2::after {
margin: 10px 15px 35px 0;
}
.mline h1::after {
margin: 10px 15px 0 15px;
}
.remark-slide-number {
font-size: 13pt;
color: #272822;
opacity: 1;
}
.inverse .remark-slide-number {
font-size: 13pt;
color: #FAFAFA;
opacity: 1;
}
/* turns off slide numbers for title page: https://github.com/gnab/remark/issues/298 */
.title-slide .remark-slide-number {
display: none;
}
.remark-inline-code {
/* background: #F5F5F5; /* lighter */
background: #e7e8e2; /* darker */
border-radius: 3px;
padding: 4px;
}
.code10 .remark-code {
font-size: 10%;
}
.code20 .remark-code {
font-size: 20%;
}
.code30 .remark-code {
font-size: 30%;
}
.code40 .remark-code {
font-size: 40%;
}
.code50 .remark-code {
font-size: 50%;
}
.code60 .remark-code {
font-size: 60%;
}
.code70 .remark-code {
font-size: 70%;
}
.code80 .remark-code {
font-size: 80%;
}
.code90 .remark-code {
font-size: 90%;
}
.code100 .remark-code {
font-size: 100%;
}
.font10 {
font-size: 10%;
}
.font20 {
font-size: 20%;
}
.font30 {
font-size: 30%;
}
.font40 {
font-size: 40%;
}
.font50 {
font-size: 50%;
}
.font60 {
font-size: 60%;
}
.font70 {
font-size: 70%;
}
.font80 {
font-size: 80%;
}
.font90 {
font-size: 90%;
}
.font100 {
font-size: 100%;
}
.font110 {
font-size: 110%;
}
.font120 {
font-size: 120%;
}
.font130 {
font-size: 130%;
}
.font140 {
font-size: 140%;
}
.font150 {
font-size: 150%;
}
.font160 {
font-size: 160%;
}
.font170 {
font-size: 170%;
}
.font180 {
font-size: 180%;
}
.font190 {
font-size: 190%;
}
.font200 {
font-size: 200%;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment