CRDTs talk slides from Utah Distributed Systems 2/16/2016
commit
ba74fb43d1
|
@ -0,0 +1,427 @@
|
||||||
|
---
|
||||||
|
title: CRDTs
|
||||||
|
subtitle: Guaranteed Eventual Consistency
|
||||||
|
author: Levi Pearson
|
||||||
|
...
|
||||||
|
|
||||||
|
# Introduction
|
||||||
|
|
||||||
|
## Goals - To Understand
|
||||||
|
|
||||||
|
+ What makes a CRDT
|
||||||
|
|
||||||
|
+ Theoretical Impact
|
||||||
|
|
||||||
|
+ Practical Relevance
|
||||||
|
|
||||||
|
+ Some Existing CRDTs
|
||||||
|
|
||||||
|
## Source Paper
|
||||||
|
|
||||||
|
+ *A Comprehensive Study of Convergent and Commutative Replicated Data Types*
|
||||||
|
2011 INRIA Research Report by Shapiro, Preguiça, Baquero, Zawirski
|
||||||
|
|
||||||
|
+ Many related publications on CRDTs from same authors
|
||||||
|
|
||||||
|
+ Zawirski's Ph.D. Thesis is related to size-optimizing CRDTs
|
||||||
|
|
||||||
|
## Outline
|
||||||
|
|
||||||
|
+ Basic CRDT Concept
|
||||||
|
|
||||||
|
+ Detailed Model of CRDTs
|
||||||
|
|
||||||
|
+ Portfolio of CRDT Specifications
|
||||||
|
|
||||||
|
+ Garbage Collection Issues
|
||||||
|
|
||||||
|
+ A Shopping Cart Example
|
||||||
|
|
||||||
|
# CRDTs in a Nutshell
|
||||||
|
|
||||||
|
## Motivations
|
||||||
|
|
||||||
|
+ **Eventual Consistency** for scalability
|
||||||
|
|
||||||
|
+ Improve theoretical grounding
|
||||||
|
|
||||||
|
+ Weaken coordination requirements
|
||||||
|
|
||||||
|
## Eventual Consistency
|
||||||
|
|
||||||
|
+ Updates are executed at replicas
|
||||||
|
|
||||||
|
+ Later, sent to all other replicas
|
||||||
|
|
||||||
|
+ Eventually, all replicas see all updates
|
||||||
|
|
||||||
|
+ They apply asynchronously and possibly in different orders
|
||||||
|
|
||||||
|
+ Concurrent updates may conflict and require *arbitration*
|
||||||
|
|
||||||
|
## Strong Eventual Consistency
|
||||||
|
|
||||||
|
+ Formal model of Eventual Consistency
|
||||||
|
|
||||||
|
+ No conflict-resolution or roll-back required; *Conflict-Freedom*
|
||||||
|
|
||||||
|
+ Extremely scalable and fault-tolerant
|
||||||
|
|
||||||
|
+ Based on mathematical properties
|
||||||
|
|
||||||
|
## Two Related Formulations
|
||||||
|
|
||||||
|
+ *Convergent* Replicated Data Types (CvRDT)
|
||||||
|
|
||||||
|
- State-based
|
||||||
|
- Weak network requirements
|
||||||
|
- Based on *monotonic join semilattices*
|
||||||
|
|
||||||
|
+ *Commutative* Replicated Data Types (CmRDT)
|
||||||
|
|
||||||
|
- Operation-based
|
||||||
|
- Requires reliable broadcast with *delivery order*
|
||||||
|
- Based on *commutativity of concurrent operations*
|
||||||
|
|
||||||
|
+ Both can always simulate one another
|
||||||
|
|
||||||
|
# System Model of CRDTs
|
||||||
|
|
||||||
|
## Distributed Systems
|
||||||
|
|
||||||
|
+ Processes interconnected by asynchronous network
|
||||||
|
+ Network can partition and recover
|
||||||
|
+ Nodes can operate disconnected for some time
|
||||||
|
+ Processes may crash and recover, memory survives crashes
|
||||||
|
+ Assumption of non-Byzantine behavior
|
||||||
|
|
||||||
|
## Atoms and Objects
|
||||||
|
|
||||||
|
+ Processes store **atoms** and **objects**
|
||||||
|
+ Atoms are base immutable data; directly comparable values
|
||||||
|
+ Objects are mutable, replicated data; collections of objects and atoms
|
||||||
|
+ Objects with the same identity but different location are **replicas**
|
||||||
|
+ Objects are independent; no transactions
|
||||||
|
|
||||||
|
## Operations
|
||||||
|
|
||||||
|
+ There are **clients** that query and modify objects via **operations**
|
||||||
|
|
||||||
|
+ A client acts on one replica, the **source** replica
|
||||||
|
|
||||||
|
+ The operation executes locally at the source and then remotely
|
||||||
|
- *Phase 1*: Operation called at source; possibly some processing occurs
|
||||||
|
- *Phase 2*: Update transmitted asynchronously to **downstream** replicas
|
||||||
|
|
||||||
|
## State-Based Replication
|
||||||
|
|
||||||
|
+ Update happens entirely at source replica via **update**
|
||||||
|
+ Modified payload transmitted downstream
|
||||||
|
+ Receivers use **merge** operation to update their payload
|
||||||
|
+ Replicas can be compared via **compare** operation
|
||||||
|
+ Operations guarded by **source pre-conditions**
|
||||||
|
|
||||||
|
## State-Based Causal History Model
|
||||||
|
|
||||||
|
+ Initially, set $C(x_i)$ of each replica $x_i$ is $\emptyset$
|
||||||
|
+ After update $f$, $C(f(x_i))$ is $C(x_i) \cup \{f\}$
|
||||||
|
+ After merge of $C(x_i)$ and $C(x_j)$, the state is $C(x_i) \cup C(x_j)$
|
||||||
|
+ The "happens-before" relation $f \to g \Leftrightarrow C(f) \subset C(g)$
|
||||||
|
|
||||||
|
## State-Based Network Assumptions
|
||||||
|
|
||||||
|
+ States transmit between replicas at unspecified times
|
||||||
|
|
||||||
|
+ Transmissions occur infinitely often
|
||||||
|
|
||||||
|
+ Communication forms a connected graph
|
||||||
|
|
||||||
|
## Operation-Based Replication
|
||||||
|
|
||||||
|
+ Phase 1 of **update** is local to source replica
|
||||||
|
- Precondition guard must be true
|
||||||
|
- Executes immediately and atomically
|
||||||
|
- No side-effects
|
||||||
|
- May return results
|
||||||
|
+ Phase 2 of **update** executes asynchronously on downstream replicas
|
||||||
|
- Downstream precondition must be true
|
||||||
|
- Can't return results
|
||||||
|
- Updates downstream state
|
||||||
|
- Arguments prepared by Phase 1
|
||||||
|
- Executes atomically
|
||||||
|
|
||||||
|
## Operation-Based Causal History Model
|
||||||
|
|
||||||
|
+ Initially, set $C(x_i)$ of each replica $x_i$ is $\emptyset$
|
||||||
|
+ After downstream phase, $f$, $C(f(x_i))$ is $C(x_i) \cup \{f\}$
|
||||||
|
+ The "happens-before" relation $f \to g \Leftrightarrow C(f) \subset C(g)$
|
||||||
|
+ **causal delivery** means that if $f \to g$, then $f$ is delivered before $g$
|
||||||
|
|
||||||
|
## Operation-Based Network Assumptions
|
||||||
|
|
||||||
|
+ Presence of a reliable broadcast mechanism
|
||||||
|
+ Delivery of every update in a **delivery order**
|
||||||
|
+ The delivery order maintains downstream preconditions
|
||||||
|
+ A delivery order of causal delivery is always sufficient
|
||||||
|
|
||||||
|
## Definition of Convergence
|
||||||
|
|
||||||
|
+ Two replicas $x_i$ and $x_j$ of $x$ *converge eventually* if:
|
||||||
|
|
||||||
|
- Safety: $\forall{i,j}: C(x_i) = C(x_j)$ implies payloads of $i$ and $j$ are equivalent
|
||||||
|
|
||||||
|
- Liveness: $\forall{i,j}: f \in C(x_i)$ implies *eventually* $f \in C(x_j)$
|
||||||
|
|
||||||
|
+ States are equivalent when all **query** operations return the same values
|
||||||
|
|
||||||
|
## Convergent Replicated Data Type (CvRDT)
|
||||||
|
|
||||||
|
+ Based on concept of **join semilattice**
|
||||||
|
|
||||||
|
- A *set* of values equipped with
|
||||||
|
- a *partial order* relation ($\leq$ or $\sqsubseteq$) on them
|
||||||
|
- and a *least upper bound* (LUB or $\sqcup$) operation, aka *join*
|
||||||
|
|
||||||
|
+ LUB: if $m = x \sqcup y$ then $m$ is a LUB under $\leq$ **iff**
|
||||||
|
|
||||||
|
- $x \leq m \land y \leq m$
|
||||||
|
- There is no $m' \leq m$ where $x \leq m' \land y \leq m'$
|
||||||
|
- The "smallest" $m$ in the set that is "at least as big" as both $x$ and $y$
|
||||||
|
- LUB is *commutative*, *idempotent*, and *associative*
|
||||||
|
|
||||||
|
+ An *ordered set* is a *join semilattice* if for all pairs, a LUB exists
|
||||||
|
|
||||||
|
+ For CvRDTs, **merge** is the LUB operation on the payloads
|
||||||
|
|
||||||
|
+ All operations are *non-decreasing* with respect to the ordering
|
||||||
|
|
||||||
|
## Example CvRDT
|
||||||
|
|
||||||
|
+ An integer counter; our set is $\mathbb{Z}$
|
||||||
|
+ Our ordering is numeric $\leq$
|
||||||
|
+ For merge, we use $max()$
|
||||||
|
+ Our payload, `x`, is initialized to `0`
|
||||||
|
+ Operation **value** returning an integer $j$ is `let j = x`
|
||||||
|
+ Operation **compare(a,b)** is `a.x ` $\leq$ ` b.x`
|
||||||
|
+ Operation **inc** is `x := x + 1`
|
||||||
|
+ Operation **merge(a,b)** is `max(a,b)`
|
||||||
|
|
||||||
|
## Commutative Replicated Data Type (CmRDT)
|
||||||
|
|
||||||
|
+ Based on a reliable broadcast strong enough to guarantee **delivery order**
|
||||||
|
+ **Delivery order**, $<$, is specified per CmRDT
|
||||||
|
+ Some operations are not ordered; they are *concurrent*, $\|$
|
||||||
|
+ $f \| g \Leftrightarrow f \nless g \land g \nless f$
|
||||||
|
+ All replicas converge to the same state when:
|
||||||
|
- all concurrent operations commute, so
|
||||||
|
- all execution orders consistent with delivery order are equivalent
|
||||||
|
+ Reliable causal delivery
|
||||||
|
- doesn't require agreement
|
||||||
|
- is immune to partitioning (connected subsets still make deliveries)
|
||||||
|
- eventually delivers all updates to all nodes
|
||||||
|
+ Delivery order is never stricter than causal delivery
|
||||||
|
|
||||||
|
## Relationship of CvRDT and CmRDT
|
||||||
|
|
||||||
|
+ State-based CvRDT are:
|
||||||
|
- easy to reason about (relatively)
|
||||||
|
- requires only weak network properties, no membership tracking
|
||||||
|
- may be inefficient for large objects
|
||||||
|
- used in NFS, AFS, Coda, Dynamo, Riak
|
||||||
|
+ Operation-based CmRDT are:
|
||||||
|
- harder to reason about; requires reasoning about history
|
||||||
|
- have greater expressive power
|
||||||
|
- require an underlying reliable broadcast protocol, need membership tracking
|
||||||
|
- used in Bayou, Rover, IceCube, Telex
|
||||||
|
+ They can always emulate one another (although not necessarily efficiently)
|
||||||
|
|
||||||
|
# Portfolio of CRDTs
|
||||||
|
|
||||||
|
## Categories
|
||||||
|
|
||||||
|
+ Counters
|
||||||
|
|
||||||
|
+ Registers
|
||||||
|
|
||||||
|
+ Sets
|
||||||
|
|
||||||
|
+ Graphs
|
||||||
|
|
||||||
|
+ Co-op Text Editing
|
||||||
|
|
||||||
|
## State-Based Outline
|
||||||
|
|
||||||
|
| **payload** *Payload type; instantiated at all replicas*
|
||||||
|
| **initial** *Inital value*
|
||||||
|
| **query** *Query*( *arguments* ) : *returns*
|
||||||
|
| **pre** *Precondition*
|
||||||
|
| **let** *Evaluate synchronously, no side effects*
|
||||||
|
| **update** *Source-local operation*( *arguments* ) : *returns*
|
||||||
|
| **pre** *Precondition*
|
||||||
|
| **let** *Evaluate at source, synchronously*
|
||||||
|
| *Side effects at source to execute synchronously*
|
||||||
|
| **compare** (value1, value2) : boolean *b*
|
||||||
|
| *Is value1* $\leq$ *value2 in semilattice?*
|
||||||
|
| **merge** (value1, value2) : payload mergedValue
|
||||||
|
| *LUB merge of value1 and value2, at any replica*
|
||||||
|
|
||||||
|
## Op-Based Outline
|
||||||
|
|
||||||
|
| **payload** *Payload type; intstantiated at all replicas*
|
||||||
|
| **initial** *Initial value*
|
||||||
|
| **query** *Source-local operation*( *arguments* ) : *returns*
|
||||||
|
| **pre** *Precondition*
|
||||||
|
| **let** *Execute at source, synchronously, no side-effects*
|
||||||
|
| **update** *Global update*( *arguments* ) : *returns*
|
||||||
|
| **atSource**( *arguments* ) : *returns*
|
||||||
|
| **pre** *Precondition at source*
|
||||||
|
| **let** *1st phase: synchronous, at source, no side-effects*
|
||||||
|
| **downstream** ( *arguments passed downstream* )
|
||||||
|
| **pre** *Precondition against downstream state*
|
||||||
|
| *2nd phase, asynchronous, side-effects to downstream state*
|
||||||
|
|
||||||
|
## Op-based Counter
|
||||||
|
|
||||||
|
| **payload** integer $i$
|
||||||
|
| **initial** $0$
|
||||||
|
| **query** *value*() : integer $j$
|
||||||
|
| **let** $j = i$
|
||||||
|
| **update** *increment*()
|
||||||
|
| **downstream**()
|
||||||
|
| $i := i + 1$
|
||||||
|
| **update** *decrement*()
|
||||||
|
| **downstream**()
|
||||||
|
| $i := i - 1$
|
||||||
|
|
||||||
|
## G-Counter
|
||||||
|
|
||||||
|
| **payload** integer[$n$] $P$
|
||||||
|
| **initial** $[0,0,\dots,0]$
|
||||||
|
| **update** *increment*()
|
||||||
|
| **let** $g = myID()$
|
||||||
|
| $P[g] := P[g] + 1$
|
||||||
|
| **query** *value*() : integer $v$
|
||||||
|
| **let** $v = \sum_i{P[i]}$
|
||||||
|
| **compare**($X, Y$) : boolean $b$
|
||||||
|
| **let** $b = (\forall i \in [0, n-1] : X.P[i] \leq Y.P[i])$
|
||||||
|
| **merge**($X, Y$) : payload $Z$
|
||||||
|
| **let** $\forall i \in [0, n - 1] : Z.P[i] = max(X.P[i], Y.P[i])$
|
||||||
|
|
||||||
|
## PN-Counter
|
||||||
|
|
||||||
|
| **payload** integer[$n$] $P$, integer[$n$] $N$
|
||||||
|
| **initial** $[0,0,\dots,0], [0,0,\dots,0]$
|
||||||
|
| **update** *increment*()
|
||||||
|
| **let** $g = myID()$; $P[g] := P[g] + 1$
|
||||||
|
| **update** *decrement*()
|
||||||
|
| **let** $g = myID()$; $N[g] := N[g] + 1$
|
||||||
|
| **query** *value*() : integer $v$
|
||||||
|
| **let** $v = \sum_i{P[i]} - \sum_i{N[i]}$
|
||||||
|
| **compare**($X, Y$) : boolean $b$
|
||||||
|
| **let** $b = (\forall i \in [0, n-1] : X.P[i] \leq Y.P[i] \land \forall i \in [0,n - 1] : X.N[i] \leq Y.N[i])$
|
||||||
|
| **merge**($X, Y$) : payload $Z$
|
||||||
|
| **let** $\forall i \in [0, n - 1] : Z.P[i] = max(X.P[i], Y.P[i])$
|
||||||
|
| **let** $\forall i \in [0, n - 1] : Z.N[i] = max(X.N[i], Y.N[i])$
|
||||||
|
|
||||||
|
## LWW-Register
|
||||||
|
|
||||||
|
| **payload** $X$ $x$, timestamp $t$
|
||||||
|
| **initial** $\bot, 0$
|
||||||
|
| **update** *assign*( $X$ $w$ )
|
||||||
|
| $x, t := w, now()$
|
||||||
|
| **query** *value*() : $X$ $w$
|
||||||
|
| **let** $w = x$
|
||||||
|
| **compare**($R, R'$) : boolean $b$
|
||||||
|
| **let** $b = (R.t \leq R'.t)$
|
||||||
|
| **merge**($R, R'$) : payload $R''$
|
||||||
|
| **if** $R.t \leq R'.t$ **then** $R''.x, R''.t = R'.x, R'.t$
|
||||||
|
| **else** $R''.x, R''.t = R.x, R.t$
|
||||||
|
|
||||||
|
## LWW-Register (Op-based)
|
||||||
|
|
||||||
|
| **payload** $X$ $x$, timestamp $t$
|
||||||
|
| **initial** $\bot, 0$
|
||||||
|
| **query** *value*() : $X$ $w$
|
||||||
|
| **let** $w = x$
|
||||||
|
| **update** *assign*( $X$ $x'$ )
|
||||||
|
| **atSource**() $t'$
|
||||||
|
| **let** $t' = now()$
|
||||||
|
| **downstream**($x', t'$)
|
||||||
|
| **if** $t < t'$ **then** $x, t := x', t'$
|
||||||
|
|
||||||
|
## MV-Register
|
||||||
|
|
||||||
|
| **payload** set $S$ of $(x, V)$ pairs; $x \in X$; $V$ its version vector
|
||||||
|
| **initial** $\{(\bot, [0,\dots,0])\}$
|
||||||
|
| **query** *incVV*() : integer[$n$] $V'$
|
||||||
|
| **let** $g = myID()$
|
||||||
|
| **let** $\mathcal{V} = \{V \mid \exists x : (x,V) \in S\}$
|
||||||
|
| **let** $V' = [ max_{V \in \mathcal{V}}(V[j]) ]_{j \neq g}$
|
||||||
|
| **let** $V'[g] = max_{V \in \mathcal{V}}(V[g]) + 1$
|
||||||
|
| **update** *assign*( set $R$ )
|
||||||
|
| **let** $V = incVV()$
|
||||||
|
| $S := R \times \{V\}$
|
||||||
|
|
||||||
|
## MV-Register (cont.)
|
||||||
|
|
||||||
|
| **query** *value*() : set $S'$
|
||||||
|
| **let** $S' = S$
|
||||||
|
| **compare**($A, B$) : boolean $b$
|
||||||
|
| **let** $b = (\forall(x,V) \in A, (x', V') \in B : V \leq V')$
|
||||||
|
| **merge**($A, B$) : payload $C$
|
||||||
|
| **let** $A' = \{(x,V) \in A \mid \forall(y,W) \in B : V \| W \lor V \leq W\}$
|
||||||
|
| **let** $B' = \{(y,W) \in B \mid \forall(x,V) \in A : W \| V \lor W \leq V\}$
|
||||||
|
| **let** $C = A' \cup B'$
|
||||||
|
|
||||||
|
## G-Set
|
||||||
|
|
||||||
|
| **payload** set $A$
|
||||||
|
| **initial** $\emptyset$
|
||||||
|
| **update** *add*(element $e$)
|
||||||
|
| $A := A \cup \{e\}$
|
||||||
|
| **query** *lookup*(element $e$) : boolean $b$
|
||||||
|
| **let** $b = (e \in A)$
|
||||||
|
| **compare**($S, T$) : boolean $b$
|
||||||
|
| **let** $b = (S.A \subseteq T.A)$
|
||||||
|
| **merge**($S, T$) : payload $U$
|
||||||
|
| **let** $U.A = S.A \cup T.A$
|
||||||
|
|
||||||
|
## 2P-Set
|
||||||
|
|
||||||
|
| **payload** set $A$, set $R$
|
||||||
|
| **initial** $\emptyset, \emptyset$
|
||||||
|
| **query** *lookup*(element $e$) : boolean $b$
|
||||||
|
| **let** $b = (e \in A \land e \notin R)$
|
||||||
|
| **update** *add*(element $e$)
|
||||||
|
| $A := A \cup \{e\}$
|
||||||
|
| **update** *remove*(element $e$)
|
||||||
|
| **pre** $lookup(e)$
|
||||||
|
| $R := R \cup \{e\}$
|
||||||
|
| **compare**($S, T$) : boolean $b$
|
||||||
|
| **let** $b = (S.A \subseteq T.A \lor S.R \subseteq T.R)$
|
||||||
|
| **merge**($S, T$) : payload $U$
|
||||||
|
| **let** $U.A = S.A \cup T.A$
|
||||||
|
| **let** $U.R = S.R \cup T.R$
|
||||||
|
|
||||||
|
## U-Set
|
||||||
|
|
||||||
|
| **payload** set $S$
|
||||||
|
| **initial** $\emptyset$
|
||||||
|
| **query** *lookup*(element $e$) : boolean $b$
|
||||||
|
| **let** $b = (e \in S)$
|
||||||
|
| **update** *add*(element $e$)
|
||||||
|
| **atSource**($e$)
|
||||||
|
| **pre** $e$ is unique
|
||||||
|
| **downstream**($e$)
|
||||||
|
| $S := S \cup \{e\}$
|
||||||
|
|
||||||
|
## U-Set (cont.)
|
||||||
|
|
||||||
|
| **update** *remove*(element $e$)
|
||||||
|
| **atSource**($e$)
|
||||||
|
| **pre** $lookup(e)$
|
||||||
|
| **downstream**($e$)
|
||||||
|
| **pre** $add(e)$ has been delivered
|
||||||
|
| $S := S \setminus \{e\}$
|
||||||
|
|
||||||
|
# Thanks!
|
|
@ -0,0 +1,28 @@
|
||||||
|
|
||||||
|
NAME := CRDTs
|
||||||
|
|
||||||
|
THEME := metropolis
|
||||||
|
THEME_FILES := beamercolortheme${THEME}.sty \
|
||||||
|
beamerfonttheme${THEME}.sty \
|
||||||
|
beamerinnertheme${THEME}.sty \
|
||||||
|
beameroutertheme${THEME}.sty \
|
||||||
|
beamertheme${THEME}.sty \
|
||||||
|
pgfplotsthemetol.sty
|
||||||
|
|
||||||
|
.PHONY: all clean tex-clean
|
||||||
|
|
||||||
|
all: ${NAME}.pdf
|
||||||
|
|
||||||
|
body.tex: ${NAME}.md
|
||||||
|
pandoc --latex-engine=xelatex -t beamer -V theme:${THEME} -o body.tex ${NAME}.md
|
||||||
|
|
||||||
|
${NAME}.pdf: head.tex body.tex
|
||||||
|
xelatex head.tex
|
||||||
|
xelatex head.tex
|
||||||
|
mv head.pdf ${NAME}.pdf
|
||||||
|
|
||||||
|
tex-clean:
|
||||||
|
@rm -f *.aux *.log *.nav *.out *.snm *.toc body.tex
|
||||||
|
|
||||||
|
clean: tex-clean
|
||||||
|
@rm -f *.pdf
|
|
@ -0,0 +1,126 @@
|
||||||
|
%%
|
||||||
|
%% This is file `beamercolorthememetropolis.sty',
|
||||||
|
%% generated with the docstrip utility.
|
||||||
|
%%
|
||||||
|
%% The original source files were:
|
||||||
|
%%
|
||||||
|
%% beamercolorthememetropolis.dtx (with options: `package')
|
||||||
|
%% ---------------------------------------------------------------------------
|
||||||
|
%% Copyright 2015 Matthias Vogelgesang and the LaTeX community. A full list of
|
||||||
|
%% contributors can be found at
|
||||||
|
%%
|
||||||
|
%% https://github.com/matze/mtheme/graphs/contributors
|
||||||
|
%%
|
||||||
|
%% and the original template was based on the HSRM theme by Benjamin Weiss.
|
||||||
|
%%
|
||||||
|
%% This work is licensed under a Creative Commons Attribution-ShareAlike 4.0
|
||||||
|
%% International License (https://creativecommons.org/licenses/by-sa/4.0/).
|
||||||
|
%% ---------------------------------------------------------------------------
|
||||||
|
\NeedsTeXFormat{LaTeX2e}
|
||||||
|
\ProvidesPackage{beamercolorthememetropolis}[2015/12/04 Metropolis color theme]
|
||||||
|
\RequirePackage{pgfopts}
|
||||||
|
\pgfkeys{
|
||||||
|
/metropolis/color/block/.cd,
|
||||||
|
.is choice,
|
||||||
|
transparent/.code=\@metropolis@block@transparent,
|
||||||
|
fill/.code=\@metropolis@block@fill,
|
||||||
|
}
|
||||||
|
\pgfkeys{
|
||||||
|
/metropolis/color/background/.cd,
|
||||||
|
.is choice,
|
||||||
|
dark/.code=\@metropolis@colors@dark,
|
||||||
|
light/.code=\@metropolis@colors@light,
|
||||||
|
}
|
||||||
|
\newcommand{\@metropolis@color@setdefaults}{
|
||||||
|
\pgfkeys{/metropolis/color/.cd,
|
||||||
|
background=light,
|
||||||
|
block=transparent,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
\definecolor{mDarkBrown}{HTML}{604c38}
|
||||||
|
\definecolor{mDarkTeal}{HTML}{23373b}
|
||||||
|
\definecolor{mLightBrown}{HTML}{EB811B}
|
||||||
|
\definecolor{mLightGreen}{HTML}{14B03D}
|
||||||
|
\newcommand{\@metropolis@colors@dark}{
|
||||||
|
\setbeamercolor{normal text}{%
|
||||||
|
fg=black!2,
|
||||||
|
bg=mDarkTeal
|
||||||
|
}
|
||||||
|
}
|
||||||
|
\newcommand{\@metropolis@colors@light}{
|
||||||
|
\setbeamercolor{normal text}{%
|
||||||
|
fg=mDarkTeal,
|
||||||
|
bg=black!2
|
||||||
|
}
|
||||||
|
}
|
||||||
|
\setbeamercolor{alerted text}{%
|
||||||
|
fg=mLightBrown
|
||||||
|
}
|
||||||
|
\setbeamercolor{example text}{%
|
||||||
|
fg=mLightGreen
|
||||||
|
}
|
||||||
|
\setbeamercolor{titlelike}{use=normal text, parent=normal text}
|
||||||
|
\setbeamercolor{author}{use=normal text, parent=normal text}
|
||||||
|
\setbeamercolor{date}{use=normal text, parent=normal text}
|
||||||
|
\setbeamercolor{institute}{use=normal text, parent=normal text}
|
||||||
|
\setbeamercolor{structure}{use=normal text, fg=normal text.fg}
|
||||||
|
\setbeamercolor{palette primary}{%
|
||||||
|
use=normal text,
|
||||||
|
fg=normal text.bg,
|
||||||
|
bg=normal text.fg
|
||||||
|
}
|
||||||
|
\setbeamercolor{frametitle}{%
|
||||||
|
use=palette primary,
|
||||||
|
parent=palette primary
|
||||||
|
}
|
||||||
|
\setbeamercolor{progress bar}{%
|
||||||
|
use=alerted text,
|
||||||
|
fg=alerted text.fg,
|
||||||
|
bg=alerted text.fg!50!black!30
|
||||||
|
}
|
||||||
|
\setbeamercolor{title separator}{
|
||||||
|
use=progress bar,
|
||||||
|
parent=progress bar
|
||||||
|
}
|
||||||
|
\setbeamercolor{progress bar in head/foot}{%
|
||||||
|
use=progress bar,
|
||||||
|
parent=progress bar
|
||||||
|
}
|
||||||
|
\setbeamercolor{progress bar in section page}{
|
||||||
|
use=progress bar,
|
||||||
|
parent=progress bar
|
||||||
|
}
|
||||||
|
\newcommand{\@metropolis@block@transparent}{
|
||||||
|
\setbeamercolor{block title}{use=normal text, parent=normal text}
|
||||||
|
}
|
||||||
|
\newcommand{\@metropolis@block@fill}{
|
||||||
|
\setbeamercolor{block title}{%
|
||||||
|
use=normal text,
|
||||||
|
fg=normal text.fg,
|
||||||
|
bg=normal text.bg!80!fg
|
||||||
|
}
|
||||||
|
}
|
||||||
|
\setbeamercolor{block title alerted}{%
|
||||||
|
use={block title, alerted text},
|
||||||
|
bg=block title.bg,
|
||||||
|
fg=alerted text.fg
|
||||||
|
}
|
||||||
|
\setbeamercolor{block title example}{%
|
||||||
|
use={block title, example text},
|
||||||
|
bg=block title.bg,
|
||||||
|
fg=example text.fg
|
||||||
|
}
|
||||||
|
\setbeamercolor{block body alerted}{use=block body, parent=block body}
|
||||||
|
\setbeamercolor{block body example}{use=block body, parent=block body}
|
||||||
|
\setbeamercolor{block body}{
|
||||||
|
use={block title, normal text},
|
||||||
|
bg=block title.bg!50!normal text.bg
|
||||||
|
}
|
||||||
|
\setbeamercolor{footnote}{fg=normal text.fg!90}
|
||||||
|
\setbeamercolor{footnote mark}{fg=.}
|
||||||
|
\@metropolis@color@setdefaults
|
||||||
|
\ProcessPgfPackageOptions{/metropolis/color}
|
||||||
|
\mode<all>
|
||||||
|
\endinput
|
||||||
|
%%
|
||||||
|
%% End of file `beamercolorthememetropolis.sty'.
|
|
@ -0,0 +1,112 @@
|
||||||
|
%%
|
||||||
|
%% This is file `beamerfontthememetropolis.sty',
|
||||||
|
%% generated with the docstrip utility.
|
||||||
|
%%
|
||||||
|
%% The original source files were:
|
||||||
|
%%
|
||||||
|
%% beamerfontthememetropolis.dtx (with options: `package')
|
||||||
|
%% ---------------------------------------------------------------------------
|
||||||
|
%% Copyright 2015 Matthias Vogelgesang and the LaTeX community. A full list of
|
||||||
|
%% contributors can be found at
|
||||||
|
%%
|
||||||
|
%% https://github.com/matze/mtheme/graphs/contributors
|
||||||
|
%%
|
||||||
|
%% and the original template was based on the HSRM theme by Benjamin Weiss.
|
||||||
|
%%
|
||||||
|
%% This work is licensed under a Creative Commons Attribution-ShareAlike 4.0
|
||||||
|
%% International License (https://creativecommons.org/licenses/by-sa/4.0/).
|
||||||
|
%% ---------------------------------------------------------------------------
|
||||||
|
\NeedsTeXFormat{LaTeX2e}
|
||||||
|
\ProvidesPackage{beamerfontthememetropolis}[2015/12/04 Metropolis font theme]
|
||||||
|
\RequirePackage{etoolbox}
|
||||||
|
\RequirePackage{ifxetex}
|
||||||
|
\RequirePackage{ifluatex}
|
||||||
|
\ifboolexpr{bool {xetex} or bool {luatex}}{
|
||||||
|
\RequirePackage[no-math]{fontspec}
|
||||||
|
\newcounter{fontsnotfound}
|
||||||
|
\newcommand{\checkfont}[1]{%
|
||||||
|
\suppressfontnotfounderror=1%
|
||||||
|
\font\x = "#1" at 10pt
|
||||||
|
\selectfont
|
||||||
|
\ifx\x\nullfont%
|
||||||
|
\stepcounter{fontsnotfound}%
|
||||||
|
\fi%
|
||||||
|
\suppressfontnotfounderror=0%
|
||||||
|
}
|
||||||
|
|
||||||
|
\newcommand{\iffontsexist}[3]{%
|
||||||
|
\setcounter{fontsnotfound}{0}%
|
||||||
|
\expandafter\forcsvlist\expandafter%
|
||||||
|
\checkfont\expandafter{#1}%
|
||||||
|
\ifnum\value{fontsnotfound}=0%
|
||||||
|
#2%
|
||||||
|
\else%
|
||||||
|
#3%
|
||||||
|
\fi%
|
||||||
|
}
|
||||||
|
\iffontsexist{Fira Sans Light,%
|
||||||
|
Fira Sans Light Italic,%
|
||||||
|
Fira Sans,%
|
||||||
|
Fira Sans Italic}{%
|
||||||
|
\setsansfont[BoldFont={Fira Sans}]{Fira Sans Light}%
|
||||||
|
}{%
|
||||||
|
\iffontsexist{Fira Sans Light OT,%
|
||||||
|
Fira Sans Light Italic OT,%
|
||||||
|
Fira Sans OT,%
|
||||||
|
Fira Sans Italic OT}{%
|
||||||
|
\setsansfont[BoldFont={Fira Sans OT}]{Fira Sans Light OT}%
|
||||||
|
}{%
|
||||||
|
\PackageWarning{beamerthememetropolis}{%
|
||||||
|
Could not find Fira Sans fonts%
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
\iffontsexist{Fira Mono, Fira Mono Bold}{%
|
||||||
|
\setmonofont{Fira Mono}%
|
||||||
|
}{%
|
||||||
|
\iffontsexist{Fira Mono OT, Fira Mono Bold OT}{%
|
||||||
|
\setmonofont{Fira Mono OT}%
|
||||||
|
}{%
|
||||||
|
\PackageWarning{beamerthememetropolis}{%
|
||||||
|
Could not find Fira Mono fonts%
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
\AtBeginEnvironment{tabular}{%
|
||||||
|
\addfontfeature{Numbers={Monospaced}}%
|
||||||
|
}
|
||||||
|
}{%
|
||||||
|
\PackageWarning{beamerthememetropolis}{%
|
||||||
|
You need to compile with XeLaTeX or LuaLaTeX to use the Fira fonts%
|
||||||
|
}
|
||||||
|
}
|
||||||
|
\setbeamerfont{title}{size=\Large,%
|
||||||
|
series=\bfseries}
|
||||||
|
\setbeamerfont{author}{size=\small}
|
||||||
|
\setbeamerfont{date}{size=\small}
|
||||||
|
\setbeamerfont{section title}{size=\Large,%
|
||||||
|
series=\bfseries}
|
||||||
|
\setbeamerfont{plain title}{size=\Large,%
|
||||||
|
series=\bfseries}
|
||||||
|
\setbeamerfont{block title}{size=\normalsize,%
|
||||||
|
series=\bfseries}
|
||||||
|
\setbeamerfont{block title alerted}{size=\normalsize,%
|
||||||
|
series=\bfseries}
|
||||||
|
\setbeamerfont*{subtitle}{size=\large}
|
||||||
|
\setbeamerfont{frametitle}{size=\large,%
|
||||||
|
series=\bfseries}
|
||||||
|
\setbeamerfont{caption}{size=\small}
|
||||||
|
\setbeamerfont{caption name}{series=\bfseries}
|
||||||
|
\setbeamerfont{description item}{series=\bfseries}
|
||||||
|
\setbeamerfont{page number in head/foot}{size=\scriptsize}
|
||||||
|
\setbeamerfont{bibliography entry author}{size=\normalsize,%
|
||||||
|
series=\normalfont}
|
||||||
|
\setbeamerfont{bibliography entry title}{size=\normalsize,%
|
||||||
|
series=\bfseries}
|
||||||
|
\setbeamerfont{bibliography entry location}{size=\normalsize,%
|
||||||
|
series=\normalfont}
|
||||||
|
\setbeamerfont{bibliography entry note}{size=\small,%
|
||||||
|
series=\normalfont}
|
||||||
|
\endinput
|
||||||
|
%%
|
||||||
|
%% End of file `beamerfontthememetropolis.sty'.
|
|
@ -0,0 +1,345 @@
|
||||||
|
%%
|
||||||
|
%% This is file `beamerinnerthememetropolis.sty',
|
||||||
|
%% generated with the docstrip utility.
|
||||||
|
%%
|
||||||
|
%% The original source files were:
|
||||||
|
%%
|
||||||
|
%% beamerinnerthememetropolis.dtx (with options: `package')
|
||||||
|
%% ---------------------------------------------------------------------------
|
||||||
|
%% Copyright 2015 Matthias Vogelgesang and the LaTeX community. A full list of
|
||||||
|
%% contributors can be found at
|
||||||
|
%%
|
||||||
|
%% https://github.com/matze/mtheme/graphs/contributors
|
||||||
|
%%
|
||||||
|
%% and the original template was based on the HSRM theme by Benjamin Weiss.
|
||||||
|
%%
|
||||||
|
%% This work is licensed under a Creative Commons Attribution-ShareAlike 4.0
|
||||||
|
%% International License (https://creativecommons.org/licenses/by-sa/4.0/).
|
||||||
|
%% ---------------------------------------------------------------------------
|
||||||
|
\NeedsTeXFormat{LaTeX2e}
|
||||||
|
\ProvidesPackage{beamerinnerthememetropolis}[2015/12/04 Metropolis inner theme]
|
||||||
|
\RequirePackage{etoolbox}
|
||||||
|
\RequirePackage{calc}
|
||||||
|
\RequirePackage{pgfopts}
|
||||||
|
\RequirePackage{tikz}
|
||||||
|
\pgfkeys{
|
||||||
|
/metropolis/inner/block/.cd,
|
||||||
|
.is choice,
|
||||||
|
transparent/.code=\setlength{\@metropolis@blockskip}{0ex},
|
||||||
|
fill/.code=\setlength{\@metropolis@blockskip}{1ex},
|
||||||
|
}
|
||||||
|
\pgfkeys{
|
||||||
|
/metropolis/inner/titleformat title/.cd,
|
||||||
|
.is choice,
|
||||||
|
regular/.code={%
|
||||||
|
\let\@metropolis@titleformat\@empty%
|
||||||
|
\setbeamerfont{title}{shape=\normalfont}%
|
||||||
|
},
|
||||||
|
smallcaps/.code={%
|
||||||
|
\let\@metropolis@titleformat\@empty%
|
||||||
|
\setbeamerfont{title}{shape=\scshape}%
|
||||||
|
},
|
||||||
|
allsmallcaps/.code={%
|
||||||
|
\let\@metropolis@titleformat\MakeLowercase%
|
||||||
|
\setbeamerfont{title}{shape=\scshape}%
|
||||||
|
\PackageWarning{beamerthememetropolis}{%
|
||||||
|
Be aware that titleformat title=allsmallcaps can lead to problems%
|
||||||
|
}
|
||||||
|
},
|
||||||
|
allcaps/.code={%
|
||||||
|
\let\@metropolis@titleformat\MakeUppercase%
|
||||||
|
\setbeamerfont{title}{shape=\normalfont}
|
||||||
|
\PackageWarning{beamerthememetropolis}{%
|
||||||
|
Be aware that titleformat title=allcaps can lead to problems%
|
||||||
|
}
|
||||||
|
},
|
||||||
|
}
|
||||||
|
\pgfkeys{
|
||||||
|
/metropolis/inner/titleformat subtitle/.cd,
|
||||||
|
.is choice,
|
||||||
|
regular/.code={%
|
||||||
|
\let\@metropolis@subtitleformat\@empty%
|
||||||
|
\setbeamerfont{subtitle}{shape=\normalfont}%
|
||||||
|
},
|
||||||
|
smallcaps/.code={%
|
||||||
|
\let\@metropolis@subtitleformat\@empty%
|
||||||
|
\setbeamerfont{subtitle}{shape=\scshape}%
|
||||||
|
},
|
||||||
|
allsmallcaps/.code={%
|
||||||
|
\let\@metropolis@subtitleformat\MakeLowercase%
|
||||||
|
\setbeamerfont{subtitle}{shape=\scshape}%
|
||||||
|
\PackageWarning{beamerthememetropolis}{%
|
||||||
|
Be aware that titleformat subtitle=allsmallcaps can lead to problems%
|
||||||
|
}
|
||||||
|
},
|
||||||
|
allcaps/.code={%
|
||||||
|
\let\@metropolis@subtitleformat\MakeUppercase%
|
||||||
|
\setbeamerfont{subtitle}{shape=\normalfont}%
|
||||||
|
\PackageWarning{beamerthememetropolis}{%
|
||||||
|
Be aware that titleformat subtitle=allcaps can lead to problems%
|
||||||
|
}
|
||||||
|
},
|
||||||
|
}
|
||||||
|
\pgfkeys{
|
||||||
|
/metropolis/inner/titleformat section/.cd,
|
||||||
|
.is choice,
|
||||||
|
regular/.code={%
|
||||||
|
\let\@metropolis@sectiontitleformat\@empty%
|
||||||
|
\setbeamerfont{section title}{shape=\normalfont}%
|
||||||
|
},
|
||||||
|
smallcaps/.code={%
|
||||||
|
\let\@metropolis@sectiontitleformat\@empty%
|
||||||
|
\setbeamerfont{section title}{shape=\scshape}%
|
||||||
|
},
|
||||||
|
allsmallcaps/.code={%
|
||||||
|
\let\@metropolis@sectiontitleformat\MakeLowercase%
|
||||||
|
\setbeamerfont{section title}{shape=\scshape}%
|
||||||
|
\PackageWarning{beamerthememetropolis}{%
|
||||||
|
Be aware that titleformat section=allsmallcaps can lead to problems%
|
||||||
|
}
|
||||||
|
},
|
||||||
|
allcaps/.code={%
|
||||||
|
\let\@metropolis@sectiontitleformat\MakeUppercase%
|
||||||
|
\setbeamerfont{section title}{shape=\normalfont}%
|
||||||
|
\PackageWarning{beamerthememetropolis}{%
|
||||||
|
Be aware that titleformat section=allcaps can lead to problems%
|
||||||
|
}
|
||||||
|
},
|
||||||
|
}
|
||||||
|
\pgfkeys{
|
||||||
|
/metropolis/inner/sectionpage/.cd,
|
||||||
|
.is choice,
|
||||||
|
none/.code=\@metropolis@sectionpage@none,
|
||||||
|
simple/.code=\@metropolis@sectionpage@simple,
|
||||||
|
progressbar/.code=\@metropolis@sectionpage@progressbar,
|
||||||
|
}
|
||||||
|
\newcommand{\@metropolis@inner@setdefaults}{
|
||||||
|
\pgfkeys{/metropolis/inner/.cd,
|
||||||
|
sectionpage=progressbar,
|
||||||
|
block=transparent,
|
||||||
|
titleformat title=regular,
|
||||||
|
titleformat subtitle=regular,
|
||||||
|
titleformat section=regular,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
\def\@metropolis@titleformat#1{#1}
|
||||||
|
\def\@metropolis@subtitleformat#1{#1}
|
||||||
|
\def\@metropolis@sectiontitleformat#1{#1}
|
||||||
|
\patchcmd{\sectionentry}
|
||||||
|
{\def\insertsectionhead{#2}}
|
||||||
|
{\def\insertsectionhead{\@metropolis@sectiontitleformat{#2}}}
|
||||||
|
{}
|
||||||
|
{\PackageError{beamerinnerthememetropolis}{Patching section title failed}}
|
||||||
|
\patchcmd{\beamer@section}
|
||||||
|
{\def\insertsectionhead{\hyperlink{Navigation\the\c@page}{#1}}}
|
||||||
|
{\def\insertsectionhead{\hyperlink{Navigation\the\c@page}{%
|
||||||
|
\@metropolis@sectiontitleformat{#1}}}}
|
||||||
|
{}
|
||||||
|
{\PackageError{beamerinnerthememetropolis}{Patching section title failed}}
|
||||||
|
\setbeamertemplate{title page}{
|
||||||
|
\begin{minipage}[b][\paperheight]{\textwidth}
|
||||||
|
\ifx\inserttitlegraphic\@empty\else\usebeamertemplate*{title graphic}\fi
|
||||||
|
\vfill%
|
||||||
|
\ifx\inserttitle\@empty\else\usebeamertemplate*{title}\fi
|
||||||
|
\ifx\insertsubtitle\@empty\else\usebeamertemplate*{subtitle}\fi
|
||||||
|
\usebeamertemplate*{title separator}
|
||||||
|
\ifx\beamer@shortauthor\@empty\else\usebeamertemplate*{author}\fi
|
||||||
|
\ifx\insertdate\@empty\else\usebeamertemplate*{date}\fi
|
||||||
|
\ifx\insertinstitute\@empty\else\usebeamertemplate*{institute}\fi
|
||||||
|
\vfill
|
||||||
|
\vspace*{1mm}
|
||||||
|
\end{minipage}
|
||||||
|
}
|
||||||
|
\def\maketitle{%
|
||||||
|
\ifbeamer@inframe
|
||||||
|
\titlepage
|
||||||
|
\else
|
||||||
|
\frame[plain]{\titlepage}
|
||||||
|
\fi
|
||||||
|
}
|
||||||
|
\def\titlepage{%
|
||||||
|
\usebeamertemplate{title page}
|
||||||
|
}
|
||||||
|
\setbeamertemplate{title graphic}{
|
||||||
|
\vbox to 0pt {
|
||||||
|
\vspace*{2em}
|
||||||
|
\inserttitlegraphic%
|
||||||
|
}%
|
||||||
|
\nointerlineskip%
|
||||||
|
}
|
||||||
|
\setbeamertemplate{title}{
|
||||||
|
\raggedright%
|
||||||
|
\linespread{1.0}%
|
||||||
|
\@metropolis@titleformat{\inserttitle}%
|
||||||
|
\par%
|
||||||
|
\vspace*{0.5em}
|
||||||
|
}
|
||||||
|
\setbeamertemplate{subtitle}{
|
||||||
|
\@metropolis@subtitleformat{\insertsubtitle}%
|
||||||
|
\par%
|
||||||
|
\vspace*{0.5em}
|
||||||
|
}
|
||||||
|
\setbeamertemplate{title separator}{
|
||||||
|
\begin{tikzpicture}
|
||||||
|
\draw[fg, fill=fg] (0,0) rectangle (\textwidth, 0.4pt);
|
||||||
|
\end{tikzpicture}%
|
||||||
|
\par%
|
||||||
|
}
|
||||||
|
\setbeamertemplate{author}{
|
||||||
|
\vspace*{2em}
|
||||||
|
\insertauthor%
|
||||||
|
\par%
|
||||||
|
\vspace*{0.25em}
|
||||||
|
}
|
||||||
|
\setbeamertemplate{date}{
|
||||||
|
\insertdate%
|
||||||
|
\par%
|
||||||
|
}
|
||||||
|
\setbeamertemplate{institute}{
|
||||||
|
\vspace*{3mm}
|
||||||
|
\insertinstitute%
|
||||||
|
\par%
|
||||||
|
}
|
||||||
|
\newcommand{\@metropolis@sectionpage@none}{
|
||||||
|
\AtBeginSection{
|
||||||
|
% intenionally empty
|
||||||
|
}
|
||||||
|
}
|
||||||
|
\defbeamertemplate{section page}{simple}{
|
||||||
|
\centering
|
||||||
|
\usebeamercolor[fg]{section title}
|
||||||
|
\usebeamerfont{section title}
|
||||||
|
\insertsectionhead\\
|
||||||
|
}
|
||||||
|
\newcommand{\@metropolis@sectionpage@simple}{
|
||||||
|
\setbeamertemplate{section page}[simple]
|
||||||
|
\AtBeginSection{
|
||||||
|
\ifbeamer@inframe
|
||||||
|
\sectionpage
|
||||||
|
\else
|
||||||
|
\frame[plain,c]{\sectionpage}
|
||||||
|
\fi
|
||||||
|
}
|
||||||
|
}
|
||||||
|
\defbeamertemplate{section page}{progressbar}{
|
||||||
|
\centering
|
||||||
|
\begin{minipage}{22em}
|
||||||
|
\usebeamercolor[fg]{section title}
|
||||||
|
\usebeamerfont{section title}
|
||||||
|
\insertsectionhead\\[-1ex]
|
||||||
|
\usebeamertemplate*{progress bar in section page}
|
||||||
|
\end{minipage}
|
||||||
|
\par
|
||||||
|
}
|
||||||
|
\newcommand{\@metropolis@sectionpage@progressbar}{
|
||||||
|
\setbeamertemplate{section page}[progressbar]
|
||||||
|
\AtBeginSection{
|
||||||
|
\ifbeamer@inframe
|
||||||
|
\sectionpage
|
||||||
|
\else
|
||||||
|
\frame[plain,c]{\sectionpage}
|
||||||
|
\fi
|
||||||
|
}
|
||||||
|
}
|
||||||
|
\newlength{\metropolis@progressonsectionpage}
|
||||||
|
\setbeamertemplate{progress bar in section page}{
|
||||||
|
\setlength{\metropolis@progressonsectionpage}{%
|
||||||
|
\textwidth * \ratio{\insertframenumber pt}{\inserttotalframenumber pt}%
|
||||||
|
}%
|
||||||
|
\begin{tikzpicture}
|
||||||
|
\draw[bg, fill=bg] (0,0) rectangle (\textwidth, 0.4pt);
|
||||||
|
\draw[fg, fill=fg] (0,0) rectangle (\metropolis@progressonsectionpage, 0.4pt);
|
||||||
|
\end{tikzpicture}%
|
||||||
|
}
|
||||||
|
\def\inserttotalframenumber{100}
|
||||||
|
\newlength{\@metropolis@blockskip}
|
||||||
|
\setbeamertemplate{block begin}{%
|
||||||
|
\setlength{\parskip}{\@metropolis@parskip}
|
||||||
|
\vspace*{1ex}
|
||||||
|
\begin{beamercolorbox}[%
|
||||||
|
ht=2.4ex,
|
||||||
|
dp=1ex,
|
||||||
|
leftskip=\@metropolis@blockskip,
|
||||||
|
rightskip=\@metropolis@blockskip]{block title}
|
||||||
|
\usebeamerfont*{block title}\insertblocktitle%
|
||||||
|
\end{beamercolorbox}%
|
||||||
|
\vspace*{-1pt}
|
||||||
|
\usebeamerfont{block body}%
|
||||||
|
\begin{beamercolorbox}[%
|
||||||
|
dp=1ex,
|
||||||
|
leftskip=\@metropolis@blockskip,
|
||||||
|
rightskip=\@metropolis@blockskip,
|
||||||
|
vmode]{block body}%
|
||||||
|
}
|
||||||
|
\setbeamertemplate{block end}{%
|
||||||
|
\end{beamercolorbox}
|
||||||
|
\vspace*{0.2ex}
|
||||||
|
}
|
||||||
|
\setbeamertemplate{block alerted begin}{%
|
||||||
|
\setlength{\parskip}{\@metropolis@parskip}
|
||||||
|
\vspace*{1ex}
|
||||||
|
\begin{beamercolorbox}[%
|
||||||
|
ht=2.4ex,
|
||||||
|
dp=1ex,
|
||||||
|
leftskip=\@metropolis@blockskip,
|
||||||
|
rightskip=\@metropolis@blockskip]{block title alerted}
|
||||||
|
\usebeamerfont*{block title alerted}\insertblocktitle%
|
||||||
|
\end{beamercolorbox}%
|
||||||
|
\vspace*{-1pt}
|
||||||
|
\usebeamerfont{block body alerted}%
|
||||||
|
\begin{beamercolorbox}[%
|
||||||
|
dp=1ex,
|
||||||
|
leftskip=\@metropolis@blockskip,
|
||||||
|
rightskip=\@metropolis@blockskip,
|
||||||
|
vmode]{block body alerted}%
|
||||||
|
}
|
||||||
|
\setbeamertemplate{block alerted end}{%
|
||||||
|
\end{beamercolorbox}
|
||||||
|
\vspace*{0.2ex}
|
||||||
|
}
|
||||||
|
\setbeamertemplate{block example begin}{%
|
||||||
|
\setlength{\parskip}{\@metropolis@parskip}
|
||||||
|
\vspace*{1ex}
|
||||||
|
\begin{beamercolorbox}[%
|
||||||
|
ht=2.4ex,
|
||||||
|
dp=1ex,
|
||||||
|
leftskip=\@metropolis@blockskip,
|
||||||
|
rightskip=\@metropolis@blockskip]{block title example}
|
||||||
|
\usebeamerfont*{block title example}\insertblocktitle%
|
||||||
|
\end{beamercolorbox}%
|
||||||
|
\vspace*{-1pt}
|
||||||
|
\usebeamerfont{block body example}%
|
||||||
|
\begin{beamercolorbox}[%
|
||||||
|
dp=1ex,
|
||||||
|
leftskip=\@metropolis@blockskip,
|
||||||
|
rightskip=\@metropolis@blockskip,
|
||||||
|
vmode]{block body example}%
|
||||||
|
}
|
||||||
|
\setbeamertemplate{block example end}{%
|
||||||
|
\end{beamercolorbox}
|
||||||
|
\vspace*{0.2ex}
|
||||||
|
}
|
||||||
|
\setbeamertemplate{itemize items}{\textbullet}
|
||||||
|
\setbeamertemplate{caption label separator}{: }
|
||||||
|
\setbeamertemplate{caption}[numbered]
|
||||||
|
\setbeamertemplate{footnote}{%
|
||||||
|
\parindent 0em\noindent%
|
||||||
|
\raggedright
|
||||||
|
\usebeamercolor{footnote}\hbox to 0.8em{\hfil\insertfootnotemark}\insertfootnotetext\par%
|
||||||
|
}
|
||||||
|
\newlength{\@metropolis@parskip}
|
||||||
|
\setlength{\@metropolis@parskip}{0.5em}
|
||||||
|
\setlength{\parskip}{\@metropolis@parskip}
|
||||||
|
\linespread{1.15}
|
||||||
|
\define@key{beamerframe}{c}[true]{% centered
|
||||||
|
\beamer@frametopskip=0pt plus 1fill\relax%
|
||||||
|
\beamer@framebottomskip=0pt plus 1fill\relax%
|
||||||
|
\beamer@frametopskipautobreak=0pt plus .4\paperheight\relax%
|
||||||
|
\beamer@framebottomskipautobreak=0pt plus .6\paperheight\relax%
|
||||||
|
\def\beamer@initfirstlineunskip{}%
|
||||||
|
}
|
||||||
|
\@metropolis@inner@setdefaults
|
||||||
|
\ProcessPgfPackageOptions{/metropolis/inner}
|
||||||
|
\endinput
|
||||||
|
%%
|
||||||
|
%% End of file `beamerinnerthememetropolis.sty'.
|
|
@ -0,0 +1,158 @@
|
||||||
|
%%
|
||||||
|
%% This is file `beamerouterthememetropolis.sty',
|
||||||
|
%% generated with the docstrip utility.
|
||||||
|
%%
|
||||||
|
%% The original source files were:
|
||||||
|
%%
|
||||||
|
%% beamerouterthememetropolis.dtx (with options: `package')
|
||||||
|
%% ---------------------------------------------------------------------------
|
||||||
|
%% Copyright 2015 Matthias Vogelgesang and the LaTeX community. A full list of
|
||||||
|
%% contributors can be found at
|
||||||
|
%%
|
||||||
|
%% https://github.com/matze/mtheme/graphs/contributors
|
||||||
|
%%
|
||||||
|
%% and the original template was based on the HSRM theme by Benjamin Weiss.
|
||||||
|
%%
|
||||||
|
%% This work is licensed under a Creative Commons Attribution-ShareAlike 4.0
|
||||||
|
%% International License (https://creativecommons.org/licenses/by-sa/4.0/).
|
||||||
|
%% ---------------------------------------------------------------------------
|
||||||
|
\NeedsTeXFormat{LaTeX2e}
|
||||||
|
\ProvidesPackage{beamerouterthememetropolis}[2015/12/04 Metropolis outer theme]
|
||||||
|
\RequirePackage{etoolbox}
|
||||||
|
\RequirePackage{calc}
|
||||||
|
\RequirePackage{pgfopts}
|
||||||
|
\pgfkeys{
|
||||||
|
/metropolis/outer/numbering/.cd,
|
||||||
|
.is choice,
|
||||||
|
none/.code=\setbeamertemplate{frame numbering}[none],
|
||||||
|
counter/.code=\setbeamertemplate{frame numbering}[counter],
|
||||||
|
fraction/.code=\setbeamertemplate{frame numbering}[fraction],
|
||||||
|
}
|
||||||
|
\pgfkeys{
|
||||||
|
/metropolis/outer/progressbar/.cd,
|
||||||
|
.is choice,
|
||||||
|
none/.code={%
|
||||||
|
\setbeamertemplate{headline}[plain]
|
||||||
|
\setbeamertemplate{frametitle}[plain]
|
||||||
|
\setbeamertemplate{footline}[plain]
|
||||||
|
},
|
||||||
|
head/.code={\pgfkeys{/metropolis/outer/progressbar=none}
|
||||||
|
\addtobeamertemplate{headline}{}{%
|
||||||
|
\usebeamertemplate*{progress bar in head/foot}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
frametitle/.code={\pgfkeys{/metropolis/outer/progressbar=none}
|
||||||
|
\addtobeamertemplate{frametitle}{}{%
|
||||||
|
\usebeamertemplate*{progress bar in head/foot}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
foot/.code={\pgfkeys{/metropolis/outer/progressbar=none}
|
||||||
|
\addtobeamertemplate{footline}{}{%
|
||||||
|
\usebeamertemplate*{progress bar in head/foot}%
|
||||||
|
}
|
||||||
|
},
|
||||||
|
}
|
||||||
|
\pgfkeys{
|
||||||
|
/metropolis/outer/titleformat frame/.cd,
|
||||||
|
.is choice,
|
||||||
|
regular/.code={%
|
||||||
|
\let\@metropolis@frametitleformat\@empty%
|
||||||
|
\setbeamerfont{frametitle}{shape=\normalfont}%
|
||||||
|
\renewcommand{\@metropolis@frametitlestrut}{%
|
||||||
|
\vphantom{ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz}%
|
||||||
|
}
|
||||||
|
},
|
||||||
|
smallcaps/.code={%
|
||||||
|
\let\@metropolis@frametitleformat\@empty%
|
||||||
|
\setbeamerfont{frametitle}{shape=\scshape}%
|
||||||
|
\renewcommand{\@metropolis@frametitlestrut}{%
|
||||||
|
\vphantom{ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz}%
|
||||||
|
}
|
||||||
|
},
|
||||||
|
allsmallcaps/.code={%
|
||||||
|
\let\@metropolis@frametitleformat\MakeLowercase%
|
||||||
|
\setbeamerfont{frametitle}{shape=\scshape}%
|
||||||
|
\renewcommand{\@metropolis@frametitlestrut}{%
|
||||||
|
\vphantom{abcdefghijklmnopqrstuvwxyz}%
|
||||||
|
}
|
||||||
|
\PackageWarning{beamerthememetropolis}{%
|
||||||
|
Be aware that titleformat frame=allsmallcaps can lead to problems%
|
||||||
|
}
|
||||||
|
},
|
||||||
|
allcaps/.code={%
|
||||||
|
\let\@metropolis@frametitleformat\MakeUppercase%
|
||||||
|
\setbeamerfont{frametitle}{shape=\normalfont}
|
||||||
|
\renewcommand{\@metropolis@frametitlestrut}{%
|
||||||
|
\vphantom{ABCDEFGHIJKLMNOPQRSTUVWXYZ}%
|
||||||
|
}
|
||||||
|
\PackageWarning{beamerthememetropolis}{%
|
||||||
|
Be aware that titleformat frame=allcaps can lead to problems%
|
||||||
|
}
|
||||||
|
},
|
||||||
|
}
|
||||||
|
\newcommand{\@metropolis@outer@setdefaults}{
|
||||||
|
\pgfkeys{/metropolis/outer/.cd,
|
||||||
|
numbering=counter,
|
||||||
|
progressbar=none,
|
||||||
|
titleformat frame=regular,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
\setbeamertemplate{navigation symbols}{}
|
||||||
|
\defbeamertemplate{frame numbering}{none}{}
|
||||||
|
\defbeamertemplate{frame numbering}{counter}{\insertframenumber}
|
||||||
|
\defbeamertemplate{frame numbering}{fraction}{
|
||||||
|
\insertframenumber/\inserttotalframenumber
|
||||||
|
}
|
||||||
|
\defbeamertemplate{headline}{plain}{}
|
||||||
|
\defbeamertemplate{footline}{plain}{%
|
||||||
|
\begin{beamercolorbox}[wd=\textwidth, sep=3ex]{footline}%
|
||||||
|
\hfill%
|
||||||
|
\usebeamerfont{page number in head/foot}%
|
||||||
|
\usebeamertemplate*{frame numbering}
|
||||||
|
\end{beamercolorbox}%
|
||||||
|
}
|
||||||
|
\def\@metropolis@frametitleformat#1{#1}
|
||||||
|
\patchcmd{\beamer@@frametitle}
|
||||||
|
{\beamer@ifempty{#2}{}{%
|
||||||
|
\gdef\insertframetitle{{#2\ifnum\beamer@autobreakcount>0\relax{}\space%
|
||||||
|
\usebeamertemplate*{frametitle continuation}\fi}}%
|
||||||
|
\gdef\beamer@frametitle{#2}%
|
||||||
|
\gdef\beamer@shortframetitle{#1}%
|
||||||
|
}}
|
||||||
|
{\beamer@ifempty{#2}{}{%
|
||||||
|
\gdef\insertframetitle{{\@metropolis@frametitleformat{#2}\ifnum%
|
||||||
|
\beamer@autobreakcount>0\relax{}\space%
|
||||||
|
\usebeamertemplate*{frametitle continuation}\fi}}%
|
||||||
|
\gdef\beamer@frametitle{#2}%
|
||||||
|
\gdef\beamer@shortframetitle{#1}%
|
||||||
|
}}
|
||||||
|
{}
|
||||||
|
{\PackageError{beamerouterthememetropolis}{Patching frame title failed}}
|
||||||
|
\newlength{\@metropolis@frametitlestrut}
|
||||||
|
\defbeamertemplate{frametitle}{plain}{%
|
||||||
|
\nointerlineskip%
|
||||||
|
\begin{beamercolorbox}[%
|
||||||
|
wd=\paperwidth,%
|
||||||
|
sep=1.5ex,%
|
||||||
|
]{frametitle}%
|
||||||
|
\@metropolis@frametitlestrut\insertframetitle\@metropolis@frametitlestrut%
|
||||||
|
\end{beamercolorbox}%
|
||||||
|
}
|
||||||
|
\newlength{\metropolis@progressinheadfoot}
|
||||||
|
\setbeamertemplate{progress bar in head/foot}{
|
||||||
|
\nointerlineskip
|
||||||
|
\setlength{\metropolis@progressinheadfoot}{%
|
||||||
|
\paperwidth * \ratio{\insertframenumber pt}{\inserttotalframenumber pt}%
|
||||||
|
}%
|
||||||
|
\begin{beamercolorbox}[wd=\paperwidth]{progress bar in head/foot}
|
||||||
|
\begin{tikzpicture}
|
||||||
|
\draw[bg, fill=bg] (0,0) rectangle (\paperwidth, 0.4pt);
|
||||||
|
\draw[fg, fill=fg] (0,0) rectangle (\metropolis@progressinheadfoot, 0.4pt);
|
||||||
|
\end{tikzpicture}%
|
||||||
|
\end{beamercolorbox}
|
||||||
|
}
|
||||||
|
\@metropolis@outer@setdefaults
|
||||||
|
\ProcessPgfPackageOptions{/metropolis/outer}
|
||||||
|
\endinput
|
||||||
|
%%
|
||||||
|
%% End of file `beamerouterthememetropolis.sty'.
|
|
@ -0,0 +1,113 @@
|
||||||
|
%%
|
||||||
|
%% This is file `beamerthememetropolis.sty',
|
||||||
|
%% generated with the docstrip utility.
|
||||||
|
%%
|
||||||
|
%% The original source files were:
|
||||||
|
%%
|
||||||
|
%% beamerthememetropolis.dtx (with options: `package')
|
||||||
|
%% ---------------------------------------------------------------------------
|
||||||
|
%% Copyright 2015 Matthias Vogelgesang and the LaTeX community. A full list of
|
||||||
|
%% contributors can be found at
|
||||||
|
%%
|
||||||
|
%% https://github.com/matze/mtheme/graphs/contributors
|
||||||
|
%%
|
||||||
|
%% and the original template was based on the HSRM theme by Benjamin Weiss.
|
||||||
|
%%
|
||||||
|
%% This work is licensed under a Creative Commons Attribution-ShareAlike 4.0
|
||||||
|
%% International License (https://creativecommons.org/licenses/by-sa/4.0/).
|
||||||
|
%% ---------------------------------------------------------------------------
|
||||||
|
\NeedsTeXFormat{LaTeX2e}
|
||||||
|
\ProvidesPackage{beamerthememetropolis}[2015/12/04 Metropolis Beamer theme]
|
||||||
|
\RequirePackage{etoolbox}
|
||||||
|
\RequirePackage{pgfopts}
|
||||||
|
\newcommand{\metroset}[1]{\pgfkeys{/metropolis/.cd,#1}}
|
||||||
|
\pgfkeys{/metropolis/.cd,
|
||||||
|
.search also={
|
||||||
|
/metropolis/inner,
|
||||||
|
/metropolis/outer,
|
||||||
|
/metropolis/color,
|
||||||
|
},
|
||||||
|
block/.code=\pgfkeysalso{
|
||||||
|
inner/block=#1,
|
||||||
|
color/block=#1,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
\pgfkeys{
|
||||||
|
/metropolis/titleformat plain/.cd,
|
||||||
|
.is choice,
|
||||||
|
regular/.code={%
|
||||||
|
\let\@metropolis@plaintitleformat\@empty%
|
||||||
|
\setbeamerfont{plain title}{shape=\normalfont}%
|
||||||
|
},
|
||||||
|
smallcaps/.code={%
|
||||||
|
\let\@metropolis@plaintitleformat\@empty%
|
||||||
|
\setbeamerfont{plain title}{shape=\scshape}%
|
||||||
|
},
|
||||||
|
allsmallcaps/.code={%
|
||||||
|
\let\@metropolis@plaintitleformat\MakeLowercase%
|
||||||
|
\setbeamerfont{plain title}{shape=\scshape}%
|
||||||
|
\PackageWarning{beamerthememetropolis}{%
|
||||||
|
Be aware that titleformat plain=allsmallcaps can lead to problems%
|
||||||
|
}
|
||||||
|
},
|
||||||
|
allcaps/.code={%
|
||||||
|
\let\@metropolis@plaintitleformat\MakeUppercase%
|
||||||
|
\setbeamerfont{plain title}{shape=\normalfont}%
|
||||||
|
\PackageWarning{beamerthememetropolis}{%
|
||||||
|
Be aware that titleformat plain=allcaps can lead to problems%
|
||||||
|
}
|
||||||
|
},
|
||||||
|
}
|
||||||
|
\pgfkeys{
|
||||||
|
/metropolis/titleformat/.code=\pgfkeysalso{
|
||||||
|
inner/titleformat title=#1,
|
||||||
|
inner/titleformat subtitle=#1,
|
||||||
|
inner/titleformat section=#1,
|
||||||
|
outer/titleformat frame=#1,
|
||||||
|
titleformat plain=#1,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
\pgfkeys{/metropolis/.cd,
|
||||||
|
usetitleprogressbar/.code=\pgfkeysalso{outer/progressbar=frametitle},
|
||||||
|
noslidenumbers/.code=\pgfkeysalso{outer/numbering=none},
|
||||||
|
usetotalslideindicator/.code=\pgfkeysalso{outer/numbering=fraction},
|
||||||
|
nosectionslide/.code=\pgfkeysalso{inner/sectionpage=none},
|
||||||
|
darkcolors/.code=\pgfkeysalso{color/background=dark},
|
||||||
|
blockbg/.code=\pgfkeysalso{color/block=fill, inner/block=fill},
|
||||||
|
}
|
||||||
|
\newcommand{\@metropolis@setdefaults}{
|
||||||
|
\pgfkeys{/metropolis/.cd,
|
||||||
|
titleformat plain=regular,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
\useinnertheme{metropolis}
|
||||||
|
\useoutertheme{metropolis}
|
||||||
|
\usecolortheme{metropolis}
|
||||||
|
\usefonttheme{metropolis}
|
||||||
|
\AtEndPreamble{%
|
||||||
|
\@ifpackageloaded{pgfplots}{%
|
||||||
|
\RequirePackage{pgfplotsthemetol}
|
||||||
|
}{}
|
||||||
|
}
|
||||||
|
\def\@metropolis@plaintitleformat#1{#1}
|
||||||
|
\newcommand{\plain}[2][]{%
|
||||||
|
\begingroup
|
||||||
|
\setbeamercolor{background canvas}{
|
||||||
|
use=palette primary,
|
||||||
|
parent=palette primary
|
||||||
|
}
|
||||||
|
\begin{frame}[c]{#1}
|
||||||
|
\begin{center}
|
||||||
|
\usebeamercolor[fg]{palette primary}
|
||||||
|
\usebeamerfont{plain title}
|
||||||
|
\@metropolis@plaintitleformat{#2}
|
||||||
|
\end{center}
|
||||||
|
\end{frame}
|
||||||
|
\endgroup
|
||||||
|
}
|
||||||
|
\newcommand{\mreducelistspacing}{\vspace{-\topsep}}
|
||||||
|
\@metropolis@setdefaults
|
||||||
|
\ProcessPgfOptions{/metropolis}
|
||||||
|
\endinput
|
||||||
|
%%
|
||||||
|
%% End of file `beamerthememetropolis.sty'.
|
|
@ -0,0 +1,58 @@
|
||||||
|
\documentclass[ignorenonframetext,aspectratio=169]{beamer}
|
||||||
|
\usetheme{metropolis}
|
||||||
|
\usepackage{color}
|
||||||
|
\usepackage{fancyvrb}
|
||||||
|
\newcommand{\VerbBar}{|}
|
||||||
|
\newcommand{\VERB}{\Verb[commandchars=\\\{\}]}
|
||||||
|
\DefineVerbatimEnvironment{Highlighting}{Verbatim}{commandchars=\\\{\}}
|
||||||
|
% Add ',fontsize=\small' for more characters per line
|
||||||
|
\newenvironment{Shaded}{}{}
|
||||||
|
\newcommand{\KeywordTok}[1]{\textcolor[rgb]{0.00,0.44,0.13}{\textbf{{#1}}}}
|
||||||
|
\newcommand{\DataTypeTok}[1]{\textcolor[rgb]{0.56,0.13,0.00}{{#1}}}
|
||||||
|
\newcommand{\DecValTok}[1]{\textcolor[rgb]{0.25,0.63,0.44}{{#1}}}
|
||||||
|
\newcommand{\BaseNTok}[1]{\textcolor[rgb]{0.25,0.63,0.44}{{#1}}}
|
||||||
|
\newcommand{\FloatTok}[1]{\textcolor[rgb]{0.25,0.63,0.44}{{#1}}}
|
||||||
|
\newcommand{\ConstantTok}[1]{\textcolor[rgb]{0.53,0.00,0.00}{{#1}}}
|
||||||
|
\newcommand{\CharTok}[1]{\textcolor[rgb]{0.25,0.44,0.63}{{#1}}}
|
||||||
|
\newcommand{\SpecialCharTok}[1]{\textcolor[rgb]{0.25,0.44,0.63}{{#1}}}
|
||||||
|
\newcommand{\StringTok}[1]{\textcolor[rgb]{0.25,0.44,0.63}{{#1}}}
|
||||||
|
\newcommand{\VerbatimStringTok}[1]{\textcolor[rgb]{0.25,0.44,0.63}{{#1}}}
|
||||||
|
\newcommand{\SpecialStringTok}[1]{\textcolor[rgb]{0.73,0.40,0.53}{{#1}}}
|
||||||
|
\newcommand{\ImportTok}[1]{{#1}}
|
||||||
|
\newcommand{\CommentTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textit{{#1}}}}
|
||||||
|
\newcommand{\DocumentationTok}[1]{\textcolor[rgb]{0.73,0.13,0.13}{\textit{{#1}}}}
|
||||||
|
\newcommand{\AnnotationTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textbf{\textit{{#1}}}}}
|
||||||
|
\newcommand{\CommentVarTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textbf{\textit{{#1}}}}}
|
||||||
|
\newcommand{\OtherTok}[1]{\textcolor[rgb]{0.00,0.44,0.13}{{#1}}}
|
||||||
|
\newcommand{\FunctionTok}[1]{\textcolor[rgb]{0.02,0.16,0.49}{{#1}}}
|
||||||
|
\newcommand{\VariableTok}[1]{\textcolor[rgb]{0.10,0.09,0.49}{{#1}}}
|
||||||
|
\newcommand{\ControlFlowTok}[1]{\textcolor[rgb]{0.00,0.44,0.13}{\textbf{{#1}}}}
|
||||||
|
\newcommand{\OperatorTok}[1]{\textcolor[rgb]{0.40,0.40,0.40}{{#1}}}
|
||||||
|
\newcommand{\BuiltInTok}[1]{{#1}}
|
||||||
|
\newcommand{\ExtensionTok}[1]{{#1}}
|
||||||
|
\newcommand{\PreprocessorTok}[1]{\textcolor[rgb]{0.74,0.48,0.00}{{#1}}}
|
||||||
|
\newcommand{\AttributeTok}[1]{\textcolor[rgb]{0.49,0.56,0.16}{{#1}}}
|
||||||
|
\newcommand{\RegionMarkerTok}[1]{{#1}}
|
||||||
|
\newcommand{\InformationTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textbf{\textit{{#1}}}}}
|
||||||
|
\newcommand{\WarningTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textbf{\textit{{#1}}}}}
|
||||||
|
\newcommand{\AlertTok}[1]{\textcolor[rgb]{1.00,0.00,0.00}{\textbf{{#1}}}}
|
||||||
|
\newcommand{\ErrorTok}[1]{\textcolor[rgb]{1.00,0.00,0.00}{\textbf{{#1}}}}
|
||||||
|
\newcommand{\NormalTok}[1]{{#1}}
|
||||||
|
|
||||||
|
\providecommand{\tightlist}{%
|
||||||
|
\setlength{\itemsep}{0pt}\setlength{\parskip}{0pt}}
|
||||||
|
\setcounter{secnumdepth}{0}
|
||||||
|
|
||||||
|
\title{CRDTs}
|
||||||
|
\subtitle{Guaranteed Eventual Consistency}
|
||||||
|
\author{Levi Pearson}
|
||||||
|
\date{}
|
||||||
|
|
||||||
|
\begin{document}
|
||||||
|
\frame{\titlepage}
|
||||||
|
|
||||||
|
\mode<all>
|
||||||
|
\include{body}
|
||||||
|
\mode*
|
||||||
|
|
||||||
|
\end{document}
|
|
@ -0,0 +1,123 @@
|
||||||
|
%%
|
||||||
|
%% This is file `pgfplotsthemetol.sty',
|
||||||
|
%% generated with the docstrip utility.
|
||||||
|
%%
|
||||||
|
%% The original source files were:
|
||||||
|
%%
|
||||||
|
%% pgfplotsthemetol.dtx (with options: `package')
|
||||||
|
%% ---------------------------------------------------------------------------
|
||||||
|
%% Copyright 2015 Matthias Vogelgesang and the LaTeX community. A full list of
|
||||||
|
%% contributors can be found at
|
||||||
|
%%
|
||||||
|
%% https://github.com/matze/mtheme/graphs/contributors
|
||||||
|
%%
|
||||||
|
%% and the original template was based on the HSRM theme by Benjamin Weiss.
|
||||||
|
%%
|
||||||
|
%% This work is licensed under a Creative Commons Attribution-ShareAlike 4.0
|
||||||
|
%% International License (https://creativecommons.org/licenses/by-sa/4.0/).
|
||||||
|
%% ---------------------------------------------------------------------------
|
||||||
|
\NeedsTeXFormat{LaTeX2e}
|
||||||
|
\ProvidesPackage{pgfplotsthemetol}
|
||||||
|
[2015/06/16 PGFplots colors based on Paul Tol's SRON technical note]
|
||||||
|
\definecolor{TolDarkPurple}{HTML}{332288}
|
||||||
|
\definecolor{TolDarkBlue}{HTML}{6699CC}
|
||||||
|
\definecolor{TolLightBlue}{HTML}{88CCEE}
|
||||||
|
\definecolor{TolLightGreen}{HTML}{44AA99}
|
||||||
|
\definecolor{TolDarkGreen}{HTML}{117733}
|
||||||
|
\definecolor{TolDarkBrown}{HTML}{999933}
|
||||||
|
\definecolor{TolLightBrown}{HTML}{DDCC77}
|
||||||
|
\definecolor{TolDarkRed}{HTML}{661100}
|
||||||
|
\definecolor{TolLightRed}{HTML}{CC6677}
|
||||||
|
\definecolor{TolLightPink}{HTML}{AA4466}
|
||||||
|
\definecolor{TolDarkPink}{HTML}{882255}
|
||||||
|
\definecolor{TolLightPurple}{HTML}{AA4499}
|
||||||
|
\pgfplotscreateplotcyclelist{mbarplot cycle}{%
|
||||||
|
{draw=TolDarkBlue, fill=TolDarkBlue!70},
|
||||||
|
{draw=TolLightBrown, fill=TolLightBrown!70},
|
||||||
|
{draw=TolLightGreen, fill=TolLightGreen!70},
|
||||||
|
{draw=TolDarkPink, fill=TolDarkPink!70},
|
||||||
|
{draw=TolDarkPurple, fill=TolDarkPurple!70},
|
||||||
|
{draw=TolDarkRed, fill=TolDarkRed!70},
|
||||||
|
{draw=TolDarkBrown, fill=TolDarkBrown!70},
|
||||||
|
{draw=TolLightRed, fill=TolLightRed!70},
|
||||||
|
{draw=TolLightPink, fill=TolLightPink!70},
|
||||||
|
{draw=TolLightPurple, fill=TolLightPurple!70},
|
||||||
|
{draw=TolLightBlue, fill=TolLightBlue!70},
|
||||||
|
{draw=TolDarkGreen, fill=TolDarkGreen!70},
|
||||||
|
}
|
||||||
|
\pgfplotscreateplotcyclelist{mlineplot cycle}{%
|
||||||
|
{TolDarkBlue, mark=*, mark size=1.5pt},
|
||||||
|
{TolLightBrown, mark=square*, mark size=1.3pt},
|
||||||
|
{TolLightGreen, mark=triangle*, mark size=1.5pt},
|
||||||
|
{TolDarkBrown, mark=diamond*, mark size=1.5pt},
|
||||||
|
}
|
||||||
|
\pgfplotsset{
|
||||||
|
compat=1.9,
|
||||||
|
mlineplot/.style={
|
||||||
|
mbaseplot,
|
||||||
|
xmajorgrids=true,
|
||||||
|
ymajorgrids=true,
|
||||||
|
major grid style={dotted},
|
||||||
|
axis x line=bottom,
|
||||||
|
axis y line=left,
|
||||||
|
legend style={
|
||||||
|
cells={anchor=west},
|
||||||
|
draw=none
|
||||||
|
},
|
||||||
|
cycle list name=mlineplot cycle,
|
||||||
|
},
|
||||||
|
mbarplot base/.style={
|
||||||
|
mbaseplot,
|
||||||
|
bar width=6pt,
|
||||||
|
axis y line*=none,
|
||||||
|
},
|
||||||
|
mbarplot/.style={
|
||||||
|
mbarplot base,
|
||||||
|
ybar,
|
||||||
|
xmajorgrids=false,
|
||||||
|
ymajorgrids=true,
|
||||||
|
area legend,
|
||||||
|
legend image code/.code={%
|
||||||
|
\draw[#1] (0cm,-0.1cm) rectangle (0.15cm,0.1cm);
|
||||||
|
},
|
||||||
|
cycle list name=mbarplot cycle,
|
||||||
|
},
|
||||||
|
horizontal mbarplot/.style={
|
||||||
|
mbarplot base,
|
||||||
|
xmajorgrids=true,
|
||||||
|
ymajorgrids=false,
|
||||||
|
xbar stacked,
|
||||||
|
area legend,
|
||||||
|
legend image code/.code={%
|
||||||
|
\draw[#1] (0cm,-0.1cm) rectangle (0.15cm,0.1cm);
|
||||||
|
},
|
||||||
|
cycle list name=mbarplot cycle,
|
||||||
|
},
|
||||||
|
mbaseplot/.style={
|
||||||
|
legend style={
|
||||||
|
draw=none,
|
||||||
|
fill=none,
|
||||||
|
cells={anchor=west},
|
||||||
|
},
|
||||||
|
x tick label style={
|
||||||
|
font=\footnotesize
|
||||||
|
},
|
||||||
|
y tick label style={
|
||||||
|
font=\footnotesize
|
||||||
|
},
|
||||||
|
legend style={
|
||||||
|
font=\footnotesize
|
||||||
|
},
|
||||||
|
major grid style={
|
||||||
|
dotted,
|
||||||
|
},
|
||||||
|
axis x line*=bottom,
|
||||||
|
},
|
||||||
|
disable thousands separator/.style={
|
||||||
|
/pgf/number format/.cd,
|
||||||
|
1000 sep={}
|
||||||
|
},
|
||||||
|
}
|
||||||
|
\endinput
|
||||||
|
%%
|
||||||
|
%% End of file `pgfplotsthemetol.sty'.
|
Loading…
Reference in New Issue