rshow 0.0.5 → 0.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/main.js +15258 -631
- package/package.json +2 -1
- package/skills/rshow/SKILL.md +7 -0
- package/skills/rshow/reference/mockups.md +1 -0
- package/skills/rshow/reference/reports.md +5 -1
- package/skills/rshow-slides/SKILL.md +9 -0
- package/skills/rshow-slides/reference/layouts.md +15 -0
- package/themes/default/deck.css +325 -1
- package/themes/default/deck.js +255 -5
- package/themes/default/example/index.html +19 -2
- package/themes/default/example/report.html +17 -10
- package/themes/default/fonts/katex/KaTeX_AMS-Regular.woff2 +0 -0
- package/themes/default/fonts/katex/KaTeX_Caligraphic-Bold.woff2 +0 -0
- package/themes/default/fonts/katex/KaTeX_Caligraphic-Regular.woff2 +0 -0
- package/themes/default/fonts/katex/KaTeX_Fraktur-Bold.woff2 +0 -0
- package/themes/default/fonts/katex/KaTeX_Fraktur-Regular.woff2 +0 -0
- package/themes/default/fonts/katex/KaTeX_Main-Bold.woff2 +0 -0
- package/themes/default/fonts/katex/KaTeX_Main-BoldItalic.woff2 +0 -0
- package/themes/default/fonts/katex/KaTeX_Main-Italic.woff2 +0 -0
- package/themes/default/fonts/katex/KaTeX_Main-Regular.woff2 +0 -0
- package/themes/default/fonts/katex/KaTeX_Math-BoldItalic.woff2 +0 -0
- package/themes/default/fonts/katex/KaTeX_Math-Italic.woff2 +0 -0
- package/themes/default/fonts/katex/KaTeX_SansSerif-Bold.woff2 +0 -0
- package/themes/default/fonts/katex/KaTeX_SansSerif-Italic.woff2 +0 -0
- package/themes/default/fonts/katex/KaTeX_SansSerif-Regular.woff2 +0 -0
- package/themes/default/fonts/katex/KaTeX_Script-Regular.woff2 +0 -0
- package/themes/default/fonts/katex/KaTeX_Size1-Regular.woff2 +0 -0
- package/themes/default/fonts/katex/KaTeX_Size2-Regular.woff2 +0 -0
- package/themes/default/fonts/katex/KaTeX_Size3-Regular.woff2 +0 -0
- package/themes/default/fonts/katex/KaTeX_Size4-Regular.woff2 +0 -0
- package/themes/default/fonts/katex/KaTeX_Typewriter-Regular.woff2 +0 -0
- package/themes/default/fonts/katex/LICENSE +21 -0
- package/themes/default/math.css +46 -0
- package/themes/default/math.js +58 -0
- package/themes/default/mockup.css +105 -2
- package/themes/default/mockup.js +342 -18
- package/themes/default/report.css +15 -6
- package/themes/default/terminal.css +8 -0
- package/themes/default/terminal.js +70 -13
- package/themes/default/theme.json +7 -0
- package/worker/index.js +15 -15
package/themes/default/deck.js
CHANGED
|
@@ -4,7 +4,8 @@
|
|
|
4
4
|
* Markup: <main class="deck"><section class="slide">...</section>...</main>
|
|
5
5
|
* Keys: arrows, space, PageUp/PageDown, Home/End, f = fullscreen, n = notes,
|
|
6
6
|
* p = presenter view, t = mode (system, light, dark).
|
|
7
|
-
* Mouse: click advances, shift-click goes back,
|
|
7
|
+
* Mouse: a click on empty space advances, shift-click goes back, a click or a
|
|
8
|
+
* drag on text selects it, swipe left/right navigates.
|
|
8
9
|
* URL hash #N keeps the slide. Steps reveal one per advance.
|
|
9
10
|
*
|
|
10
11
|
* Mode. The deck and a page share one storage key, "rshow-mode", holding
|
|
@@ -177,7 +178,7 @@
|
|
|
177
178
|
deck.style.transform = 'translate(' + x + 'px, ' + y + 'px) scale(' + scale + ')';
|
|
178
179
|
}
|
|
179
180
|
|
|
180
|
-
function
|
|
181
|
+
function writeHashNow() {
|
|
181
182
|
var want = '#' + (current + 1);
|
|
182
183
|
if (window.location.hash === want) {
|
|
183
184
|
return;
|
|
@@ -185,8 +186,25 @@
|
|
|
185
186
|
try {
|
|
186
187
|
window.history.replaceState(null, '', want);
|
|
187
188
|
} catch (err) {
|
|
188
|
-
|
|
189
|
+
// Assigning the hash here fires hashchange, and that listener would send
|
|
190
|
+
// the deck back to an old slide, so the address is left as it is.
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
// A browser counts the replaceState calls it honours and drops the rest: in
|
|
195
|
+
// Chrome a burst of keys leaves the address on an old slide, and in Safari the
|
|
196
|
+
// call throws. One write, 300 ms after the deck comes to rest, keeps the
|
|
197
|
+
// address current without touching that limit.
|
|
198
|
+
var hashTimer = null;
|
|
199
|
+
|
|
200
|
+
function writeHash() {
|
|
201
|
+
if (hashTimer) {
|
|
202
|
+
window.clearTimeout(hashTimer);
|
|
189
203
|
}
|
|
204
|
+
hashTimer = window.setTimeout(function () {
|
|
205
|
+
hashTimer = null;
|
|
206
|
+
writeHashNow();
|
|
207
|
+
}, 300);
|
|
190
208
|
}
|
|
191
209
|
|
|
192
210
|
function slideTitle(n) {
|
|
@@ -309,6 +327,9 @@
|
|
|
309
327
|
writeHash();
|
|
310
328
|
syncNotes();
|
|
311
329
|
syncPresenter();
|
|
330
|
+
if (reading) {
|
|
331
|
+
scrollToCurrent();
|
|
332
|
+
}
|
|
312
333
|
}
|
|
313
334
|
|
|
314
335
|
function go(n) {
|
|
@@ -619,19 +640,91 @@
|
|
|
619
640
|
cycleMode();
|
|
620
641
|
event.preventDefault();
|
|
621
642
|
break;
|
|
643
|
+
case 'Escape':
|
|
644
|
+
// Out of one slide at a time, back to the stack the phone reads.
|
|
645
|
+
if (reading || forced !== null) {
|
|
646
|
+
forced = null;
|
|
647
|
+
setReading(wantsReading());
|
|
648
|
+
event.preventDefault();
|
|
649
|
+
}
|
|
650
|
+
break;
|
|
622
651
|
default:
|
|
623
652
|
break;
|
|
624
653
|
}
|
|
625
654
|
});
|
|
626
655
|
|
|
656
|
+
// Text under a point, so a click on it can select instead of navigating. The
|
|
657
|
+
// deck canvas is scaled by a transform, but client rects are already in screen
|
|
658
|
+
// space, so the point needs no maths.
|
|
659
|
+
function onText(x, y) {
|
|
660
|
+
try {
|
|
661
|
+
var node = null;
|
|
662
|
+
if (document.caretRangeFromPoint) {
|
|
663
|
+
var caret = document.caretRangeFromPoint(x, y);
|
|
664
|
+
node = caret ? caret.startContainer : null;
|
|
665
|
+
} else if (document.caretPositionFromPoint) {
|
|
666
|
+
var position = document.caretPositionFromPoint(x, y);
|
|
667
|
+
node = position ? position.offsetNode : null;
|
|
668
|
+
}
|
|
669
|
+
if (!node || node.nodeType !== 3) {
|
|
670
|
+
return false;
|
|
671
|
+
}
|
|
672
|
+
var range = document.createRange();
|
|
673
|
+
range.selectNodeContents(node);
|
|
674
|
+
var rects = range.getClientRects();
|
|
675
|
+
for (var k = 0; k < rects.length; k += 1) {
|
|
676
|
+
if (x >= rects[k].left && x <= rects[k].right &&
|
|
677
|
+
y >= rects[k].top && y <= rects[k].bottom) {
|
|
678
|
+
return true;
|
|
679
|
+
}
|
|
680
|
+
}
|
|
681
|
+
return false;
|
|
682
|
+
} catch (err) {
|
|
683
|
+
return false;
|
|
684
|
+
}
|
|
685
|
+
}
|
|
686
|
+
|
|
687
|
+
var pressX = 0;
|
|
688
|
+
var pressY = 0;
|
|
689
|
+
var pressTracked = false;
|
|
690
|
+
|
|
691
|
+
deck.addEventListener('mousedown', function (event) {
|
|
692
|
+
if (event.button !== 0) {
|
|
693
|
+
return;
|
|
694
|
+
}
|
|
695
|
+
pressTracked = true;
|
|
696
|
+
pressX = event.clientX;
|
|
697
|
+
pressY = event.clientY;
|
|
698
|
+
});
|
|
699
|
+
|
|
700
|
+
// A drag that selects text ends in a click too, so a click counts as a key
|
|
701
|
+
// press only when the pointer stayed put, it was a single click, the selection
|
|
702
|
+
// is empty and there is no text under it.
|
|
627
703
|
deck.addEventListener('click', function (event) {
|
|
704
|
+
var moved = pressTracked &&
|
|
705
|
+
(Math.abs(event.clientX - pressX) > 4 || Math.abs(event.clientY - pressY) > 4);
|
|
706
|
+
pressTracked = false;
|
|
628
707
|
var node = event.target;
|
|
708
|
+
var tag;
|
|
629
709
|
while (node && node !== deck) {
|
|
630
|
-
|
|
710
|
+
tag = node.tagName;
|
|
711
|
+
if (tag === 'A' || tag === 'BUTTON' || tag === 'INPUT' || tag === 'SELECT' ||
|
|
712
|
+
tag === 'TEXTAREA' || tag === 'LABEL' || tag === 'SUMMARY' ||
|
|
713
|
+
node.isContentEditable) {
|
|
631
714
|
return;
|
|
632
715
|
}
|
|
633
716
|
node = node.parentNode;
|
|
634
717
|
}
|
|
718
|
+
if (event.detail > 1 || moved) {
|
|
719
|
+
return;
|
|
720
|
+
}
|
|
721
|
+
var sel = window.getSelection ? window.getSelection() : null;
|
|
722
|
+
if (sel && !sel.isCollapsed && String(sel) !== '') {
|
|
723
|
+
return;
|
|
724
|
+
}
|
|
725
|
+
if (onText(event.clientX, event.clientY)) {
|
|
726
|
+
return;
|
|
727
|
+
}
|
|
635
728
|
if (event.shiftKey) {
|
|
636
729
|
prev();
|
|
637
730
|
} else {
|
|
@@ -673,6 +766,147 @@
|
|
|
673
766
|
}
|
|
674
767
|
}, { passive: true });
|
|
675
768
|
|
|
769
|
+
// ------------------------------------------------------------- reading --
|
|
770
|
+
|
|
771
|
+
// A phone held upright has no room for a 1280 x 720 canvas: the slide arrives
|
|
772
|
+
// as a 390 x 219 strip. deck.css stacks every slide down the page as a block
|
|
773
|
+
// at the width of the screen and reflows its type, so there is no scale to
|
|
774
|
+
// work out here; this is the part that decides when, and the small fixed
|
|
775
|
+
// button and Esc are how a reader switches.
|
|
776
|
+
var READING = window.matchMedia
|
|
777
|
+
? window.matchMedia('(max-width: 699px) and (orientation: portrait)')
|
|
778
|
+
: null;
|
|
779
|
+
var reading = false;
|
|
780
|
+
var forced = null; // 'read', 'present', or null for whatever the device is
|
|
781
|
+
var toggleButton = null;
|
|
782
|
+
|
|
783
|
+
function wantsReading() {
|
|
784
|
+
if (forced === 'read') {
|
|
785
|
+
return true;
|
|
786
|
+
}
|
|
787
|
+
if (forced === 'present') {
|
|
788
|
+
return false;
|
|
789
|
+
}
|
|
790
|
+
return READING !== null && READING.matches;
|
|
791
|
+
}
|
|
792
|
+
|
|
793
|
+
function scrollToCurrent() {
|
|
794
|
+
if (!slides[current]) {
|
|
795
|
+
return;
|
|
796
|
+
}
|
|
797
|
+
var box = slides[current].getBoundingClientRect();
|
|
798
|
+
var top = (window.pageYOffset || document.documentElement.scrollTop || 0) + box.top;
|
|
799
|
+
window.scrollTo(0, top);
|
|
800
|
+
}
|
|
801
|
+
|
|
802
|
+
// Scrolling the stack is navigating it: the slide at the top of the window is
|
|
803
|
+
// the current one, so the counter and the URL follow the reader.
|
|
804
|
+
function followScroll() {
|
|
805
|
+
if (!reading) {
|
|
806
|
+
return;
|
|
807
|
+
}
|
|
808
|
+
var top = window.pageYOffset || document.documentElement.scrollTop || 0;
|
|
809
|
+
var at = 0;
|
|
810
|
+
var k;
|
|
811
|
+
var box;
|
|
812
|
+
for (k = 0; k < slides.length; k += 1) {
|
|
813
|
+
box = slides[k].getBoundingClientRect();
|
|
814
|
+
if (box.top <= 4) {
|
|
815
|
+
at = k;
|
|
816
|
+
}
|
|
817
|
+
}
|
|
818
|
+
if (top + window.innerHeight >= document.documentElement.scrollHeight - 4) {
|
|
819
|
+
at = slides.length - 1;
|
|
820
|
+
}
|
|
821
|
+
if (at === current) {
|
|
822
|
+
return;
|
|
823
|
+
}
|
|
824
|
+
current = at;
|
|
825
|
+
syncHud();
|
|
826
|
+
writeHash();
|
|
827
|
+
syncNotes();
|
|
828
|
+
syncPresenter();
|
|
829
|
+
}
|
|
830
|
+
|
|
831
|
+
function syncToggle() {
|
|
832
|
+
if (!toggleButton) {
|
|
833
|
+
return;
|
|
834
|
+
}
|
|
835
|
+
toggleButton.hidden = !reading && forced !== 'present';
|
|
836
|
+
toggleButton.textContent = reading ? 'Present' : 'Read';
|
|
837
|
+
toggleButton.setAttribute('aria-label', reading
|
|
838
|
+
? 'Present: one slide at a time, Esc comes back to reading'
|
|
839
|
+
: 'Read: every slide down the page, Esc comes back to presenting');
|
|
840
|
+
}
|
|
841
|
+
|
|
842
|
+
function setReading(on) {
|
|
843
|
+
reading = on;
|
|
844
|
+
deck.classList.toggle('is-reading', on);
|
|
845
|
+
document.documentElement.classList.toggle('is-reading', on);
|
|
846
|
+
document.body.classList.toggle('is-reading', on);
|
|
847
|
+
syncToggle();
|
|
848
|
+
if (on) {
|
|
849
|
+
var k;
|
|
850
|
+
// The reader sees the whole deck, so no step waits for a key.
|
|
851
|
+
for (k = 0; k < slides.length; k += 1) {
|
|
852
|
+
revealed[k] = stepsOf(k).length;
|
|
853
|
+
}
|
|
854
|
+
render();
|
|
855
|
+
return;
|
|
856
|
+
}
|
|
857
|
+
fit();
|
|
858
|
+
render();
|
|
859
|
+
}
|
|
860
|
+
|
|
861
|
+
function flip(which) {
|
|
862
|
+
forced = which;
|
|
863
|
+
setReading(wantsReading());
|
|
864
|
+
}
|
|
865
|
+
|
|
866
|
+
function mountToggle() {
|
|
867
|
+
toggleButton = document.createElement('button');
|
|
868
|
+
toggleButton.type = 'button';
|
|
869
|
+
toggleButton.className = 'deck-present';
|
|
870
|
+
toggleButton.addEventListener('click', function () {
|
|
871
|
+
flip(reading ? 'present' : 'read');
|
|
872
|
+
});
|
|
873
|
+
document.body.appendChild(toggleButton);
|
|
874
|
+
syncToggle();
|
|
875
|
+
}
|
|
876
|
+
|
|
877
|
+
if (READING !== null) {
|
|
878
|
+
if (READING.addEventListener) {
|
|
879
|
+
READING.addEventListener('change', function () {
|
|
880
|
+
if (forced === null) {
|
|
881
|
+
setReading(wantsReading());
|
|
882
|
+
}
|
|
883
|
+
});
|
|
884
|
+
} else if (READING.addListener) {
|
|
885
|
+
READING.addListener(function () {
|
|
886
|
+
if (forced === null) {
|
|
887
|
+
setReading(wantsReading());
|
|
888
|
+
}
|
|
889
|
+
});
|
|
890
|
+
}
|
|
891
|
+
}
|
|
892
|
+
|
|
893
|
+
var followQueued = false;
|
|
894
|
+
window.addEventListener('scroll', function () {
|
|
895
|
+
if (!reading || followQueued) {
|
|
896
|
+
return;
|
|
897
|
+
}
|
|
898
|
+
followQueued = true;
|
|
899
|
+
var run = function () {
|
|
900
|
+
followQueued = false;
|
|
901
|
+
followScroll();
|
|
902
|
+
};
|
|
903
|
+
if (window.requestAnimationFrame) {
|
|
904
|
+
window.requestAnimationFrame(run);
|
|
905
|
+
} else {
|
|
906
|
+
run();
|
|
907
|
+
}
|
|
908
|
+
}, { passive: true });
|
|
909
|
+
|
|
676
910
|
var resizeQueued = false;
|
|
677
911
|
function onResize() {
|
|
678
912
|
if (resizeQueued) {
|
|
@@ -681,7 +915,15 @@
|
|
|
681
915
|
resizeQueued = true;
|
|
682
916
|
var run = function () {
|
|
683
917
|
resizeQueued = false;
|
|
684
|
-
|
|
918
|
+
// A turn of the phone crosses the reading query: follow it, then lay the
|
|
919
|
+
// deck out for the mode it landed in.
|
|
920
|
+
if (forced === null && wantsReading() !== reading) {
|
|
921
|
+
setReading(wantsReading());
|
|
922
|
+
return;
|
|
923
|
+
}
|
|
924
|
+
if (!reading) {
|
|
925
|
+
fit();
|
|
926
|
+
}
|
|
685
927
|
};
|
|
686
928
|
if (window.requestAnimationFrame) {
|
|
687
929
|
window.requestAnimationFrame(run);
|
|
@@ -715,6 +957,11 @@
|
|
|
715
957
|
deck.appendChild(hud);
|
|
716
958
|
}
|
|
717
959
|
hud.setAttribute('aria-hidden', 'true');
|
|
960
|
+
// Reading mode numbers each slide "n / total", and CSS cannot count the
|
|
961
|
+
// deck, so the count is a property the stack reads. content takes a string,
|
|
962
|
+
// so the value carries its quotes and the label prints 3 and not a bare
|
|
963
|
+
// number the counter cannot join.
|
|
964
|
+
deck.style.setProperty('--deck-total', '"' + slides.length + '"');
|
|
718
965
|
|
|
719
966
|
var match = /^#(\d+)$/.exec(window.location.hash);
|
|
720
967
|
current = match ? clamp(parseInt(match[1], 10) - 1) : 0;
|
|
@@ -723,6 +970,9 @@
|
|
|
723
970
|
|
|
724
971
|
fit();
|
|
725
972
|
render();
|
|
973
|
+
|
|
974
|
+
mountToggle();
|
|
975
|
+
setReading(wantsReading());
|
|
726
976
|
}
|
|
727
977
|
|
|
728
978
|
window.rshowDeck = {
|
|
@@ -11,14 +11,20 @@
|
|
|
11
11
|
<link rel="stylesheet" href="/_themes/<name>@<n>/fonts.css">
|
|
12
12
|
<link rel="stylesheet" href="/_themes/<name>@<n>/tokens.css">
|
|
13
13
|
<link rel="stylesheet" href="/_themes/<name>@<n>/deck.css">
|
|
14
|
+
<link rel="stylesheet" href="/_themes/<name>@<n>/math.css">
|
|
15
|
+
<script defer src="/_themes/<name>@<n>/math.js"></script>
|
|
14
16
|
<script src="/_themes/<name>@<n>/deck.js"></script>
|
|
15
17
|
|
|
16
18
|
This copy links the theme folder itself, so it previews from a local checkout
|
|
17
|
-
with `rshow preview .` from this folder, and no network.
|
|
19
|
+
with `rshow preview .` from this folder, and no network. math.css and math.js
|
|
20
|
+
are the math addon of the theme and are optional: a deck with an equation
|
|
21
|
+
links them, and math.js goes before deck.js. A $ in the prose of a slide is a
|
|
22
|
+
price, not a formula.
|
|
18
23
|
|
|
19
24
|
Twelve slides, one per layout in deck.css, so every class the theme ships is
|
|
20
25
|
shown here: title, statement, bullets, section, figure, chart, table,
|
|
21
|
-
two-col, code, figure-two, quote, big-number.
|
|
26
|
+
two-col, code, figure-two, quote, big-number. A thirteenth slide carries one
|
|
27
|
+
equation and shows the math addon.
|
|
22
28
|
|
|
23
29
|
The numbers on the chart and the table are example data. They are round on
|
|
24
30
|
purpose and the caption says so, because an example must never read as a
|
|
@@ -31,6 +37,8 @@
|
|
|
31
37
|
<link rel="stylesheet" href="../fonts.css">
|
|
32
38
|
<link rel="stylesheet" href="../tokens.css">
|
|
33
39
|
<link rel="stylesheet" href="../deck.css">
|
|
40
|
+
<link rel="stylesheet" href="../math.css">
|
|
41
|
+
<script defer src="../math.js"></script>
|
|
34
42
|
</head>
|
|
35
43
|
<body>
|
|
36
44
|
|
|
@@ -294,6 +302,15 @@
|
|
|
294
302
|
</aside>
|
|
295
303
|
</section>
|
|
296
304
|
|
|
305
|
+
<section class="slide bullets">
|
|
306
|
+
<h2>A republish sends only the bytes that changed</h2>
|
|
307
|
+
<div class="math">\mathrm{sent}(n) = \sum_{f \in \mathrm{new}(n)} |f|</div>
|
|
308
|
+
<aside class="notes">
|
|
309
|
+
<p>Same folder, second publish: the sum drops every file the host already
|
|
310
|
+
holds, so what leaves the laptop is the edit and nothing else.</p>
|
|
311
|
+
</aside>
|
|
312
|
+
</section>
|
|
313
|
+
|
|
297
314
|
<section class="slide big-number">
|
|
298
315
|
<p class="value">5 versions, 1 link</p>
|
|
299
316
|
<p class="caption">Five publishes of one folder, each at its own path, all reachable from the link the first publish printed.</p>
|
|
@@ -12,25 +12,32 @@
|
|
|
12
12
|
<link rel="stylesheet" href="/_themes/<name>@<n>/fonts.css">
|
|
13
13
|
<link rel="stylesheet" href="/_themes/<name>@<n>/tokens.css">
|
|
14
14
|
<link rel="stylesheet" href="/_themes/<name>@<n>/report.css">
|
|
15
|
+
<link rel="stylesheet" href="/_themes/<name>@<n>/math.css">
|
|
15
16
|
<script src="/_themes/<name>@<n>/mode.js"></script>
|
|
17
|
+
<script defer src="/_themes/<name>@<n>/math.js"></script>
|
|
16
18
|
<script defer src="/_themes/<name>@<n>/report.js"></script>
|
|
17
19
|
|
|
18
20
|
This copy links the theme folder itself, so it previews from a local checkout
|
|
19
21
|
and makes no remote request. mode.js runs in the head, before the body paints,
|
|
20
|
-
so a reader who chose dark never sees a white flash.
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
22
|
+
so a reader who chose dark never sees a white flash. math.css and math.js are
|
|
23
|
+
the math addon of the theme and are optional: a report that writes LaTeX links
|
|
24
|
+
them, and the equation below is the one line that does. math.js is deferred and
|
|
25
|
+
goes before report.js. report.js is deferred: it numbers the sections, figures
|
|
26
|
+
and tables, resolves the cross-references, builds the contents and moves the
|
|
27
|
+
notes into the margin. With JavaScript off the document is still a readable
|
|
28
|
+
paper, it just loses the generated labels and the equation shows its LaTeX.
|
|
24
29
|
|
|
25
|
-
Six sections, two figures, one table, three notes
|
|
26
|
-
authors, the affiliations, the date and the version line are
|
|
27
|
-
fill them in when the report is real. Every number in figure 2
|
|
28
|
-
prose around it is example data and says so.
|
|
30
|
+
Six sections, two figures, one table, one equation, three notes and six
|
|
31
|
+
references. The authors, the affiliations, the date and the version line are
|
|
32
|
+
placeholders: fill them in when the report is real. Every number in figure 2
|
|
33
|
+
and in the prose around it is example data and says so.
|
|
29
34
|
-->
|
|
30
35
|
<link rel="stylesheet" href="../fonts.css">
|
|
31
36
|
<link rel="stylesheet" href="../tokens.css">
|
|
32
37
|
<link rel="stylesheet" href="../report.css">
|
|
38
|
+
<link rel="stylesheet" href="../math.css">
|
|
33
39
|
<script src="../mode.js"></script>
|
|
40
|
+
<script defer src="../math.js"></script>
|
|
34
41
|
<script defer src="../report.js"></script>
|
|
35
42
|
</head>
|
|
36
43
|
<body>
|
|
@@ -193,10 +200,10 @@
|
|
|
193
200
|
<p>The cost of a publish follows the same rule. Let the files of a version
|
|
194
201
|
be <code>files(n)</code> and let the host's store be the set of hashes it
|
|
195
202
|
already holds. The bytes a publish must send are the size of every file
|
|
196
|
-
whose hash is missing from the store.</p>
|
|
203
|
+
<span class="math">f</span> whose hash is missing from the store.</p>
|
|
197
204
|
|
|
198
205
|
<div class="equation" id="eq-bytes">
|
|
199
|
-
<
|
|
206
|
+
<div class="math">\mathrm{bytes}(n) = \sum_{f \in \mathrm{new}(n)} |f|</div>
|
|
200
207
|
</div>
|
|
201
208
|
|
|
202
209
|
<p>The equation is the whole reason a republish of a mostly unchanged deck
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
The MIT License (MIT)
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2013-2020 Khan Academy and other contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* KaTeX 0.19.1, MIT licence, https://github.com/KaTeX/KaTeX
|
|
3
|
+
*
|
|
4
|
+
* Vendored by packages/cli/scripts/vendor-katex.mjs from the katex package:
|
|
5
|
+
* dist/katex.min.css with every @font-face cut down to its woff2 file under
|
|
6
|
+
* fonts/katex/, then scripts/math-runtime.css.
|
|
7
|
+
*
|
|
8
|
+
* Do not edit this file by hand; run the script after an upgrade.
|
|
9
|
+
*/
|
|
10
|
+
@font-face{font-display:block;font-family:KaTeX_AMS;font-style:normal;font-weight:400;src:url(fonts/katex/KaTeX_AMS-Regular.woff2) format("woff2")}@font-face{font-display:block;font-family:KaTeX_Caligraphic;font-style:normal;font-weight:700;src:url(fonts/katex/KaTeX_Caligraphic-Bold.woff2) format("woff2")}@font-face{font-display:block;font-family:KaTeX_Caligraphic;font-style:normal;font-weight:400;src:url(fonts/katex/KaTeX_Caligraphic-Regular.woff2) format("woff2")}@font-face{font-display:block;font-family:KaTeX_Fraktur;font-style:normal;font-weight:700;src:url(fonts/katex/KaTeX_Fraktur-Bold.woff2) format("woff2")}@font-face{font-display:block;font-family:KaTeX_Fraktur;font-style:normal;font-weight:400;src:url(fonts/katex/KaTeX_Fraktur-Regular.woff2) format("woff2")}@font-face{font-display:block;font-family:KaTeX_Main;font-style:normal;font-weight:700;src:url(fonts/katex/KaTeX_Main-Bold.woff2) format("woff2")}@font-face{font-display:block;font-family:KaTeX_Main;font-style:italic;font-weight:700;src:url(fonts/katex/KaTeX_Main-BoldItalic.woff2) format("woff2")}@font-face{font-display:block;font-family:KaTeX_Main;font-style:italic;font-weight:400;src:url(fonts/katex/KaTeX_Main-Italic.woff2) format("woff2")}@font-face{font-display:block;font-family:KaTeX_Main;font-style:normal;font-weight:400;src:url(fonts/katex/KaTeX_Main-Regular.woff2) format("woff2")}@font-face{font-display:block;font-family:KaTeX_Math;font-style:italic;font-weight:700;src:url(fonts/katex/KaTeX_Math-BoldItalic.woff2) format("woff2")}@font-face{font-display:block;font-family:KaTeX_Math;font-style:italic;font-weight:400;src:url(fonts/katex/KaTeX_Math-Italic.woff2) format("woff2")}@font-face{font-display:block;font-family:"KaTeX_SansSerif";font-style:normal;font-weight:700;src:url(fonts/katex/KaTeX_SansSerif-Bold.woff2) format("woff2")}@font-face{font-display:block;font-family:"KaTeX_SansSerif";font-style:italic;font-weight:400;src:url(fonts/katex/KaTeX_SansSerif-Italic.woff2) format("woff2")}@font-face{font-display:block;font-family:"KaTeX_SansSerif";font-style:normal;font-weight:400;src:url(fonts/katex/KaTeX_SansSerif-Regular.woff2) format("woff2")}@font-face{font-display:block;font-family:KaTeX_Script;font-style:normal;font-weight:400;src:url(fonts/katex/KaTeX_Script-Regular.woff2) format("woff2")}@font-face{font-display:block;font-family:KaTeX_Size1;font-style:normal;font-weight:400;src:url(fonts/katex/KaTeX_Size1-Regular.woff2) format("woff2")}@font-face{font-display:block;font-family:KaTeX_Size2;font-style:normal;font-weight:400;src:url(fonts/katex/KaTeX_Size2-Regular.woff2) format("woff2")}@font-face{font-display:block;font-family:KaTeX_Size3;font-style:normal;font-weight:400;src:url(fonts/katex/KaTeX_Size3-Regular.woff2) format("woff2")}@font-face{font-display:block;font-family:KaTeX_Size4;font-style:normal;font-weight:400;src:url(fonts/katex/KaTeX_Size4-Regular.woff2) format("woff2")}@font-face{font-display:block;font-family:KaTeX_Typewriter;font-style:normal;font-weight:400;src:url(fonts/katex/KaTeX_Typewriter-Regular.woff2) format("woff2")}.katex{font:normal 1.21em KaTeX_Main,math,Times New Roman,serif;line-height:1.2;position:relative;text-indent:0;text-rendering:auto}.katex *{-ms-high-contrast-adjust:none!important;border-color:currentColor}.katex .katex-version:after{content:"0.19.1"}.katex .katex-mathml{border:0;-webkit-clip-path:inset(50%);clip-path:inset(50%);height:1px;overflow:hidden;padding:0;position:absolute;width:1px}.katex .katex-html>.katex-newline{display:block}.katex .katex-base{position:relative;white-space:nowrap;width:-webkit-min-content;width:-moz-min-content;width:min-content}.katex .katex-base,.katex .katex-strut{display:inline-block}.katex .textbf{font-weight:700}.katex .textit{font-style:italic}.katex .textrm{font-family:KaTeX_Main}.katex .textsf{font-family:KaTeX_SansSerif}.katex .texttt{font-family:KaTeX_Typewriter}.katex .mathnormal{font-family:KaTeX_Math;font-style:italic}.katex .mathit{font-family:KaTeX_Main;font-style:italic}.katex .mathrm{font-style:normal}.katex .mathbf{font-family:KaTeX_Main;font-weight:700}.katex .boldsymbol{font-family:KaTeX_Math;font-style:italic;font-weight:700}.katex .amsrm,.katex .mathbb,.katex .textbb{font-family:KaTeX_AMS}.katex .mathcal{font-family:KaTeX_Caligraphic}.katex .mathfrak,.katex .textfrak{font-family:KaTeX_Fraktur}.katex .mathboldfrak,.katex .textboldfrak{font-family:KaTeX_Fraktur;font-weight:700}.katex .mathtt{font-family:KaTeX_Typewriter}.katex .mathscr,.katex .textscr{font-family:KaTeX_Script}.katex .mathsf,.katex .textsf{font-family:KaTeX_SansSerif}.katex .mathboldsf,.katex .textboldsf{font-family:KaTeX_SansSerif;font-weight:700}.katex .mathitsf,.katex .mathsfit,.katex .textitsf{font-family:KaTeX_SansSerif;font-style:italic}.katex .mainrm{font-family:KaTeX_Main;font-style:normal}.katex .vlist-t{border-collapse:collapse;display:inline-table;table-layout:fixed}.katex .vlist-r{display:table-row}.katex .vlist{display:table-cell;position:relative;vertical-align:bottom}.katex .vlist>span{display:block;height:0;position:relative}.katex .vlist>span>span{display:inline-block}.katex .vlist>span>.pstrut{overflow:hidden;width:0}.katex .vlist-t2{margin-right:-2px}.katex .vlist-s{display:table-cell;font-size:1px;min-width:2px;vertical-align:bottom;width:2px}.katex .katex-vbox{align-items:baseline;display:inline-flex;flex-direction:column}.katex .katex-thinbox{display:inline-flex;flex-direction:row;max-width:0;width:0}.katex .msupsub{text-align:left}.katex .mfrac>span>span{text-align:center}.katex .mfrac .frac-line{border-bottom-style:solid;display:inline-block;width:100%}.katex .katex-hdashline,.katex .katex-hline,.katex .katex-overline .overline-line,.katex .katex-rule,.katex .katex-underline .underline-line,.katex .mfrac .frac-line{min-height:1px}.katex .mspace{display:inline-block}.katex .katex-smash{display:inline;line-height:0}.katex .clap,.katex .llap,.katex .rlap{position:relative;width:0}.katex .clap>.katex-inner,.katex .llap>.katex-inner,.katex .rlap>.katex-inner{position:absolute}.katex .clap>.katex-fix,.katex .llap>.katex-fix,.katex .rlap>.katex-fix{display:inline-block}.katex .llap>.katex-inner{right:0}.katex .clap>.katex-inner,.katex .rlap>.katex-inner{left:0}.katex .clap>.katex-inner>span{margin-left:-50%;margin-right:50%}.katex .katex-rule{border:0 solid;display:inline-block;position:relative}.katex .katex-hline,.katex .katex-overline .overline-line,.katex .katex-underline .underline-line{border-bottom-style:solid;display:inline-block;width:100%}.katex .katex-hdashline{border-bottom-style:dashed;display:inline-block;width:100%}.katex .sqrt>.katex-root{margin-left:.2777777778em;margin-right:-.5555555556em}.katex .fontsize-ensurer.reset-size1.size1,.katex .katex-sizing.reset-size1.size1{font-size:1em}.katex .fontsize-ensurer.reset-size1.size2,.katex .katex-sizing.reset-size1.size2{font-size:1.2em}.katex .fontsize-ensurer.reset-size1.size3,.katex .katex-sizing.reset-size1.size3{font-size:1.4em}.katex .fontsize-ensurer.reset-size1.size4,.katex .katex-sizing.reset-size1.size4{font-size:1.6em}.katex .fontsize-ensurer.reset-size1.size5,.katex .katex-sizing.reset-size1.size5{font-size:1.8em}.katex .fontsize-ensurer.reset-size1.size6,.katex .katex-sizing.reset-size1.size6{font-size:2em}.katex .fontsize-ensurer.reset-size1.size7,.katex .katex-sizing.reset-size1.size7{font-size:2.4em}.katex .fontsize-ensurer.reset-size1.size8,.katex .katex-sizing.reset-size1.size8{font-size:2.88em}.katex .fontsize-ensurer.reset-size1.size9,.katex .katex-sizing.reset-size1.size9{font-size:3.456em}.katex .fontsize-ensurer.reset-size1.size10,.katex .katex-sizing.reset-size1.size10{font-size:4.148em}.katex .fontsize-ensurer.reset-size1.size11,.katex .katex-sizing.reset-size1.size11{font-size:4.976em}.katex .fontsize-ensurer.reset-size2.size1,.katex .katex-sizing.reset-size2.size1{font-size:.8333333333em}.katex .fontsize-ensurer.reset-size2.size2,.katex .katex-sizing.reset-size2.size2{font-size:1em}.katex .fontsize-ensurer.reset-size2.size3,.katex .katex-sizing.reset-size2.size3{font-size:1.1666666667em}.katex .fontsize-ensurer.reset-size2.size4,.katex .katex-sizing.reset-size2.size4{font-size:1.3333333333em}.katex .fontsize-ensurer.reset-size2.size5,.katex .katex-sizing.reset-size2.size5{font-size:1.5em}.katex .fontsize-ensurer.reset-size2.size6,.katex .katex-sizing.reset-size2.size6{font-size:1.6666666667em}.katex .fontsize-ensurer.reset-size2.size7,.katex .katex-sizing.reset-size2.size7{font-size:2em}.katex .fontsize-ensurer.reset-size2.size8,.katex .katex-sizing.reset-size2.size8{font-size:2.4em}.katex .fontsize-ensurer.reset-size2.size9,.katex .katex-sizing.reset-size2.size9{font-size:2.88em}.katex .fontsize-ensurer.reset-size2.size10,.katex .katex-sizing.reset-size2.size10{font-size:3.4566666667em}.katex .fontsize-ensurer.reset-size2.size11,.katex .katex-sizing.reset-size2.size11{font-size:4.1466666667em}.katex .fontsize-ensurer.reset-size3.size1,.katex .katex-sizing.reset-size3.size1{font-size:.7142857143em}.katex .fontsize-ensurer.reset-size3.size2,.katex .katex-sizing.reset-size3.size2{font-size:.8571428571em}.katex .fontsize-ensurer.reset-size3.size3,.katex .katex-sizing.reset-size3.size3{font-size:1em}.katex .fontsize-ensurer.reset-size3.size4,.katex .katex-sizing.reset-size3.size4{font-size:1.1428571429em}.katex .fontsize-ensurer.reset-size3.size5,.katex .katex-sizing.reset-size3.size5{font-size:1.2857142857em}.katex .fontsize-ensurer.reset-size3.size6,.katex .katex-sizing.reset-size3.size6{font-size:1.4285714286em}.katex .fontsize-ensurer.reset-size3.size7,.katex .katex-sizing.reset-size3.size7{font-size:1.7142857143em}.katex .fontsize-ensurer.reset-size3.size8,.katex .katex-sizing.reset-size3.size8{font-size:2.0571428571em}.katex .fontsize-ensurer.reset-size3.size9,.katex .katex-sizing.reset-size3.size9{font-size:2.4685714286em}.katex .fontsize-ensurer.reset-size3.size10,.katex .katex-sizing.reset-size3.size10{font-size:2.9628571429em}.katex .fontsize-ensurer.reset-size3.size11,.katex .katex-sizing.reset-size3.size11{font-size:3.5542857143em}.katex .fontsize-ensurer.reset-size4.size1,.katex .katex-sizing.reset-size4.size1{font-size:.625em}.katex .fontsize-ensurer.reset-size4.size2,.katex .katex-sizing.reset-size4.size2{font-size:.75em}.katex .fontsize-ensurer.reset-size4.size3,.katex .katex-sizing.reset-size4.size3{font-size:.875em}.katex .fontsize-ensurer.reset-size4.size4,.katex .katex-sizing.reset-size4.size4{font-size:1em}.katex .fontsize-ensurer.reset-size4.size5,.katex .katex-sizing.reset-size4.size5{font-size:1.125em}.katex .fontsize-ensurer.reset-size4.size6,.katex .katex-sizing.reset-size4.size6{font-size:1.25em}.katex .fontsize-ensurer.reset-size4.size7,.katex .katex-sizing.reset-size4.size7{font-size:1.5em}.katex .fontsize-ensurer.reset-size4.size8,.katex .katex-sizing.reset-size4.size8{font-size:1.8em}.katex .fontsize-ensurer.reset-size4.size9,.katex .katex-sizing.reset-size4.size9{font-size:2.16em}.katex .fontsize-ensurer.reset-size4.size10,.katex .katex-sizing.reset-size4.size10{font-size:2.5925em}.katex .fontsize-ensurer.reset-size4.size11,.katex .katex-sizing.reset-size4.size11{font-size:3.11em}.katex .fontsize-ensurer.reset-size5.size1,.katex .katex-sizing.reset-size5.size1{font-size:.5555555556em}.katex .fontsize-ensurer.reset-size5.size2,.katex .katex-sizing.reset-size5.size2{font-size:.6666666667em}.katex .fontsize-ensurer.reset-size5.size3,.katex .katex-sizing.reset-size5.size3{font-size:.7777777778em}.katex .fontsize-ensurer.reset-size5.size4,.katex .katex-sizing.reset-size5.size4{font-size:.8888888889em}.katex .fontsize-ensurer.reset-size5.size5,.katex .katex-sizing.reset-size5.size5{font-size:1em}.katex .fontsize-ensurer.reset-size5.size6,.katex .katex-sizing.reset-size5.size6{font-size:1.1111111111em}.katex .fontsize-ensurer.reset-size5.size7,.katex .katex-sizing.reset-size5.size7{font-size:1.3333333333em}.katex .fontsize-ensurer.reset-size5.size8,.katex .katex-sizing.reset-size5.size8{font-size:1.6em}.katex .fontsize-ensurer.reset-size5.size9,.katex .katex-sizing.reset-size5.size9{font-size:1.92em}.katex .fontsize-ensurer.reset-size5.size10,.katex .katex-sizing.reset-size5.size10{font-size:2.3044444444em}.katex .fontsize-ensurer.reset-size5.size11,.katex .katex-sizing.reset-size5.size11{font-size:2.7644444444em}.katex .fontsize-ensurer.reset-size6.size1,.katex .katex-sizing.reset-size6.size1{font-size:.5em}.katex .fontsize-ensurer.reset-size6.size2,.katex .katex-sizing.reset-size6.size2{font-size:.6em}.katex .fontsize-ensurer.reset-size6.size3,.katex .katex-sizing.reset-size6.size3{font-size:.7em}.katex .fontsize-ensurer.reset-size6.size4,.katex .katex-sizing.reset-size6.size4{font-size:.8em}.katex .fontsize-ensurer.reset-size6.size5,.katex .katex-sizing.reset-size6.size5{font-size:.9em}.katex .fontsize-ensurer.reset-size6.size6,.katex .katex-sizing.reset-size6.size6{font-size:1em}.katex .fontsize-ensurer.reset-size6.size7,.katex .katex-sizing.reset-size6.size7{font-size:1.2em}.katex .fontsize-ensurer.reset-size6.size8,.katex .katex-sizing.reset-size6.size8{font-size:1.44em}.katex .fontsize-ensurer.reset-size6.size9,.katex .katex-sizing.reset-size6.size9{font-size:1.728em}.katex .fontsize-ensurer.reset-size6.size10,.katex .katex-sizing.reset-size6.size10{font-size:2.074em}.katex .fontsize-ensurer.reset-size6.size11,.katex .katex-sizing.reset-size6.size11{font-size:2.488em}.katex .fontsize-ensurer.reset-size7.size1,.katex .katex-sizing.reset-size7.size1{font-size:.4166666667em}.katex .fontsize-ensurer.reset-size7.size2,.katex .katex-sizing.reset-size7.size2{font-size:.5em}.katex .fontsize-ensurer.reset-size7.size3,.katex .katex-sizing.reset-size7.size3{font-size:.5833333333em}.katex .fontsize-ensurer.reset-size7.size4,.katex .katex-sizing.reset-size7.size4{font-size:.6666666667em}.katex .fontsize-ensurer.reset-size7.size5,.katex .katex-sizing.reset-size7.size5{font-size:.75em}.katex .fontsize-ensurer.reset-size7.size6,.katex .katex-sizing.reset-size7.size6{font-size:.8333333333em}.katex .fontsize-ensurer.reset-size7.size7,.katex .katex-sizing.reset-size7.size7{font-size:1em}.katex .fontsize-ensurer.reset-size7.size8,.katex .katex-sizing.reset-size7.size8{font-size:1.2em}.katex .fontsize-ensurer.reset-size7.size9,.katex .katex-sizing.reset-size7.size9{font-size:1.44em}.katex .fontsize-ensurer.reset-size7.size10,.katex .katex-sizing.reset-size7.size10{font-size:1.7283333333em}.katex .fontsize-ensurer.reset-size7.size11,.katex .katex-sizing.reset-size7.size11{font-size:2.0733333333em}.katex .fontsize-ensurer.reset-size8.size1,.katex .katex-sizing.reset-size8.size1{font-size:.3472222222em}.katex .fontsize-ensurer.reset-size8.size2,.katex .katex-sizing.reset-size8.size2{font-size:.4166666667em}.katex .fontsize-ensurer.reset-size8.size3,.katex .katex-sizing.reset-size8.size3{font-size:.4861111111em}.katex .fontsize-ensurer.reset-size8.size4,.katex .katex-sizing.reset-size8.size4{font-size:.5555555556em}.katex .fontsize-ensurer.reset-size8.size5,.katex .katex-sizing.reset-size8.size5{font-size:.625em}.katex .fontsize-ensurer.reset-size8.size6,.katex .katex-sizing.reset-size8.size6{font-size:.6944444444em}.katex .fontsize-ensurer.reset-size8.size7,.katex .katex-sizing.reset-size8.size7{font-size:.8333333333em}.katex .fontsize-ensurer.reset-size8.size8,.katex .katex-sizing.reset-size8.size8{font-size:1em}.katex .fontsize-ensurer.reset-size8.size9,.katex .katex-sizing.reset-size8.size9{font-size:1.2em}.katex .fontsize-ensurer.reset-size8.size10,.katex .katex-sizing.reset-size8.size10{font-size:1.4402777778em}.katex .fontsize-ensurer.reset-size8.size11,.katex .katex-sizing.reset-size8.size11{font-size:1.7277777778em}.katex .fontsize-ensurer.reset-size9.size1,.katex .katex-sizing.reset-size9.size1{font-size:.2893518519em}.katex .fontsize-ensurer.reset-size9.size2,.katex .katex-sizing.reset-size9.size2{font-size:.3472222222em}.katex .fontsize-ensurer.reset-size9.size3,.katex .katex-sizing.reset-size9.size3{font-size:.4050925926em}.katex .fontsize-ensurer.reset-size9.size4,.katex .katex-sizing.reset-size9.size4{font-size:.462962963em}.katex .fontsize-ensurer.reset-size9.size5,.katex .katex-sizing.reset-size9.size5{font-size:.5208333333em}.katex .fontsize-ensurer.reset-size9.size6,.katex .katex-sizing.reset-size9.size6{font-size:.5787037037em}.katex .fontsize-ensurer.reset-size9.size7,.katex .katex-sizing.reset-size9.size7{font-size:.6944444444em}.katex .fontsize-ensurer.reset-size9.size8,.katex .katex-sizing.reset-size9.size8{font-size:.8333333333em}.katex .fontsize-ensurer.reset-size9.size9,.katex .katex-sizing.reset-size9.size9{font-size:1em}.katex .fontsize-ensurer.reset-size9.size10,.katex .katex-sizing.reset-size9.size10{font-size:1.2002314815em}.katex .fontsize-ensurer.reset-size9.size11,.katex .katex-sizing.reset-size9.size11{font-size:1.4398148148em}.katex .fontsize-ensurer.reset-size10.size1,.katex .katex-sizing.reset-size10.size1{font-size:.2410800386em}.katex .fontsize-ensurer.reset-size10.size2,.katex .katex-sizing.reset-size10.size2{font-size:.2892960463em}.katex .fontsize-ensurer.reset-size10.size3,.katex .katex-sizing.reset-size10.size3{font-size:.337512054em}.katex .fontsize-ensurer.reset-size10.size4,.katex .katex-sizing.reset-size10.size4{font-size:.3857280617em}.katex .fontsize-ensurer.reset-size10.size5,.katex .katex-sizing.reset-size10.size5{font-size:.4339440694em}.katex .fontsize-ensurer.reset-size10.size6,.katex .katex-sizing.reset-size10.size6{font-size:.4821600771em}.katex .fontsize-ensurer.reset-size10.size7,.katex .katex-sizing.reset-size10.size7{font-size:.5785920926em}.katex .fontsize-ensurer.reset-size10.size8,.katex .katex-sizing.reset-size10.size8{font-size:.6943105111em}.katex .fontsize-ensurer.reset-size10.size9,.katex .katex-sizing.reset-size10.size9{font-size:.8331726133em}.katex .fontsize-ensurer.reset-size10.size10,.katex .katex-sizing.reset-size10.size10{font-size:1em}.katex .fontsize-ensurer.reset-size10.size11,.katex .katex-sizing.reset-size10.size11{font-size:1.1996142719em}.katex .fontsize-ensurer.reset-size11.size1,.katex .katex-sizing.reset-size11.size1{font-size:.2009646302em}.katex .fontsize-ensurer.reset-size11.size2,.katex .katex-sizing.reset-size11.size2{font-size:.2411575563em}.katex .fontsize-ensurer.reset-size11.size3,.katex .katex-sizing.reset-size11.size3{font-size:.2813504823em}.katex .fontsize-ensurer.reset-size11.size4,.katex .katex-sizing.reset-size11.size4{font-size:.3215434084em}.katex .fontsize-ensurer.reset-size11.size5,.katex .katex-sizing.reset-size11.size5{font-size:.3617363344em}.katex .fontsize-ensurer.reset-size11.size6,.katex .katex-sizing.reset-size11.size6{font-size:.4019292605em}.katex .fontsize-ensurer.reset-size11.size7,.katex .katex-sizing.reset-size11.size7{font-size:.4823151125em}.katex .fontsize-ensurer.reset-size11.size8,.katex .katex-sizing.reset-size11.size8{font-size:.578778135em}.katex .fontsize-ensurer.reset-size11.size9,.katex .katex-sizing.reset-size11.size9{font-size:.6945337621em}.katex .fontsize-ensurer.reset-size11.size10,.katex .katex-sizing.reset-size11.size10{font-size:.8336012862em}.katex .fontsize-ensurer.reset-size11.size11,.katex .katex-sizing.reset-size11.size11{font-size:1em}.katex .delimsizing.size1{font-family:KaTeX_Size1}.katex .delimsizing.size2{font-family:KaTeX_Size2}.katex .delimsizing.size3{font-family:KaTeX_Size3}.katex .delimsizing.size4{font-family:KaTeX_Size4}.katex .delimsizing.mult .delim-size1>span{font-family:KaTeX_Size1}.katex .delimsizing.mult .delim-size4>span{font-family:KaTeX_Size4}.katex .nulldelimiter{display:inline-block;width:.12em}.katex .delimcenter,.katex .op-symbol{position:relative}.katex .op-symbol.small-op{font-family:KaTeX_Size1}.katex .op-symbol.large-op{font-family:KaTeX_Size2}.katex .katex-accent>.vlist-t,.katex .op-limits>.vlist-t{text-align:center}.katex .katex-accent .accent-body{position:relative}.katex .katex-accent .accent-body:not(.accent-full){width:0}.katex .katex-overlay{display:block}.katex .mtable .vertical-separator{display:inline-block;min-width:1px}.katex .mtable .arraycolsep{display:inline-block}.katex .mtable .col-align-c>.vlist-t{text-align:center}.katex .mtable .col-align-l>.vlist-t{text-align:left}.katex .mtable .col-align-r>.vlist-t{text-align:right}.katex .svg-align{text-align:left}.katex svg{fill:currentColor;stroke:currentColor;display:block;height:inherit;position:absolute;width:100%}.katex svg path{stroke:none}.katex svg{fill-rule:nonzero;fill-opacity:1;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1}.katex img{border-style:none;max-height:none;max-width:none;min-height:0;min-width:0}.katex .katex-stretchy{display:block;overflow:hidden;position:relative;width:100%}.katex .katex-stretchy:after,.katex .katex-stretchy:before{content:""}.katex .hide-tail{overflow:hidden;position:relative;width:100%}.katex .halfarrow-left{left:0;overflow:hidden;position:absolute;width:50.2%}.katex .halfarrow-right{overflow:hidden;position:absolute;right:0;width:50.2%}.katex .brace-left{left:0;overflow:hidden;position:absolute;width:25.1%}.katex .brace-center{left:25%;overflow:hidden;position:absolute;width:50%}.katex .brace-right{overflow:hidden;position:absolute;right:0;width:25.1%}.katex .x-arrow-pad{padding:0 .5em}.katex .cd-arrow-pad{padding:0 .55556em 0 .27778em}.katex .mover,.katex .munder,.katex .x-arrow{text-align:center}.katex .boxpad{padding:0 .3em}.katex .fbox,.katex .fcolorbox{border:.04em solid;box-sizing:border-box}.katex .cancel-pad{padding:0 .2em}.katex .cancel-lap{margin-left:-.2em;margin-right:-.2em}.katex .katex-sout{border-bottom-style:solid;border-bottom-width:.08em}.katex .angl{border-right:.049em solid;border-top:.049em solid;box-sizing:border-box;margin-right:.03889em}.katex .anglpad{padding:0 .03889em}.katex .reflectbox{display:inline-block;transform:scaleX(-1)}.katex .eqn-num:before{content:"(" counter(katexEqnNo) ")";counter-increment:katexEqnNo}.katex .mml-eqn-num:before{content:"(" counter(mmlEqnNo) ")";counter-increment:mmlEqnNo}.katex .mtr-glue{width:50%}.katex .cd-vert-arrow{display:inline-block;position:relative}.katex .cd-label-left{display:inline-block;position:absolute;right:calc(50% + .3em);text-align:left}.katex .cd-label-right{display:inline-block;left:calc(50% + .3em);position:absolute;text-align:right}.katex-display{display:block;margin:1em 0;text-align:center}.katex-display>.katex{display:block;text-align:center;white-space:nowrap}.katex-display>.katex>.katex-html{display:block;position:relative}.katex-display>.katex>.katex-html>.katex-tag{position:absolute;right:0}.katex-display.leqno>.katex>.katex-html>.katex-tag{left:0;right:auto}.katex-display.fleqn>.katex{padding-left:2em;text-align:left}body{counter-reset:katexEqnNo mmlEqnNo}
|
|
11
|
+
/* KaTeX sets 1.21em, which reads too large beside IBM Plex at body size. */
|
|
12
|
+
.katex {
|
|
13
|
+
font-size: 1.1em;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/* A wide equation scrolls inside its own box on a phone, so it never widens the
|
|
17
|
+
page. The colour is inherited, which is what lets dark mode work.
|
|
18
|
+
The padding gives a tall equation, such as a root over a fraction, the room
|
|
19
|
+
its glyphs need, and the margin gives back what the padding takes, so the
|
|
20
|
+
space around the equation stays the space of one step. */
|
|
21
|
+
div.math {
|
|
22
|
+
margin: calc(var(--space-05) - 0.2em) 0;
|
|
23
|
+
padding: 0.4em 0;
|
|
24
|
+
overflow-x: auto;
|
|
25
|
+
overflow-y: hidden;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
div.math .katex-display {
|
|
29
|
+
margin: 0;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/* A deck sets an equation at the size of a heading, and flush left under the
|
|
33
|
+
title it belongs to, rather than in the middle of the slide. */
|
|
34
|
+
.slide div.math {
|
|
35
|
+
font-size: var(--text-xl);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
.slide .katex-display > .katex {
|
|
39
|
+
text-align: left;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/* Reading mode on a phone is a column of text, so the equation keeps the size
|
|
43
|
+
of the text it sits in and never widens the page. */
|
|
44
|
+
main.deck.is-reading div.math {
|
|
45
|
+
font-size: var(--text-base);
|
|
46
|
+
}
|