├── .gitignore ├── README.md ├── _freeze ├── site_libs │ ├── clipboard │ │ └── clipboard.min.js │ ├── quarto-listing │ │ ├── list.min.js │ │ └── quarto-listing.js │ └── revealjs │ │ ├── dist │ │ ├── reset.css │ │ ├── reveal.css │ │ ├── reveal.esm.js │ │ ├── reveal.esm.js.map │ │ ├── reveal.js │ │ ├── reveal.js.map │ │ └── theme │ │ │ ├── fonts │ │ │ ├── league-gothic │ │ │ │ ├── LICENSE │ │ │ │ ├── league-gothic.css │ │ │ │ ├── league-gothic.eot │ │ │ │ ├── league-gothic.ttf │ │ │ │ └── league-gothic.woff │ │ │ └── source-sans-pro │ │ │ │ ├── LICENSE │ │ │ │ ├── source-sans-pro-italic.eot │ │ │ │ ├── source-sans-pro-italic.ttf │ │ │ │ ├── source-sans-pro-italic.woff │ │ │ │ ├── source-sans-pro-regular.eot │ │ │ │ ├── source-sans-pro-regular.ttf │ │ │ │ ├── source-sans-pro-regular.woff │ │ │ │ ├── source-sans-pro-semibold.eot │ │ │ │ ├── source-sans-pro-semibold.ttf │ │ │ │ ├── source-sans-pro-semibold.woff │ │ │ │ ├── source-sans-pro-semibolditalic.eot │ │ │ │ ├── source-sans-pro-semibolditalic.ttf │ │ │ │ ├── source-sans-pro-semibolditalic.woff │ │ │ │ └── source-sans-pro.css │ │ │ └── quarto.css │ │ └── plugin │ │ ├── highlight │ │ ├── highlight.esm.js │ │ ├── highlight.js │ │ ├── monokai.css │ │ ├── plugin.js │ │ └── zenburn.css │ │ ├── markdown │ │ ├── markdown.esm.js │ │ ├── markdown.js │ │ └── plugin.js │ │ ├── math │ │ ├── katex.js │ │ ├── math.esm.js │ │ ├── math.js │ │ ├── mathjax2.js │ │ ├── mathjax3.js │ │ └── plugin.js │ │ ├── multiplex │ │ ├── multiplex.js │ │ ├── plugin.yml │ │ └── socket.io.js │ │ ├── notes │ │ ├── notes.esm.js │ │ ├── notes.js │ │ ├── plugin.js │ │ └── speaker-view.html │ │ ├── pdf-export │ │ ├── pdfexport.js │ │ └── plugin.yml │ │ ├── quarto-line-highlight │ │ ├── line-highlight.css │ │ ├── line-highlight.js │ │ └── plugin.yml │ │ ├── quarto-support │ │ ├── footer.css │ │ ├── plugin.yml │ │ └── support.js │ │ ├── reveal-menu │ │ ├── menu.css │ │ ├── menu.js │ │ ├── plugin.yml │ │ ├── quarto-menu.css │ │ └── quarto-menu.js │ │ ├── search │ │ ├── plugin.js │ │ ├── search.esm.js │ │ └── search.js │ │ └── zoom │ │ ├── plugin.js │ │ ├── zoom.esm.js │ │ └── zoom.js └── talks │ ├── 1-welcome │ └── welcome │ │ └── execute-results │ │ └── html.json │ ├── 2-intro-ds │ └── intro-ds │ │ └── execute-results │ │ └── html.json │ ├── 3-r-python │ └── r-python │ │ └── execute-results │ │ └── html.json │ └── 5-teaching-materials │ └── quarto-teaching-materials │ └── execute-results │ └── html.json ├── _quarto.yml ├── index.qmd ├── jsm-logo.png ├── talks ├── 1-welcome │ ├── featured.png │ ├── images │ │ ├── hello-quarto.png │ │ ├── horst-teach-quarto.png │ │ ├── horst_meteor.png │ │ ├── horst_qmd_render_schema.png │ │ ├── horst_quarto_schematic.png │ │ ├── quarto-blog.png │ │ ├── quarto-org.png │ │ ├── source-editor.png │ │ ├── thank-you.png │ │ ├── visual-editor.png │ │ ├── yaml-less.png │ │ └── yaml-more.png │ ├── index.qmd │ ├── mine.jpeg │ ├── welcome-speaker.html │ ├── welcome.qmd │ └── welcome.scss ├── 2-intro-ds │ ├── elijah.png │ ├── featured.png │ ├── images │ │ ├── ChunkArguments.png │ │ ├── YAML.png │ │ ├── ae-demo.gif │ │ ├── citation.png │ │ ├── code.png │ │ ├── commonanswer1.png │ │ ├── commonanswer2.png │ │ ├── commonanswer3.png │ │ ├── commonmistake1.png │ │ ├── commonmistake2.png │ │ ├── commonmistake3.png │ │ ├── crossref.png │ │ ├── crossref2.png │ │ ├── demo1.gif │ │ ├── demo2.gif │ │ ├── demodoc.png │ │ ├── doc.png │ │ ├── ezgif.com-crop.gif │ │ ├── figure-set.gif │ │ ├── lines.png │ │ ├── logo.png │ │ ├── logo_199.png │ │ ├── message-complete.gif │ │ ├── pnas.png │ │ ├── process.png │ │ ├── process2.png │ │ ├── process3.png │ │ ├── process4.png │ │ ├── process5.png │ │ ├── process6.png │ │ ├── project1.png │ │ ├── project2.png │ │ ├── projectvid.gif │ │ ├── quarto1.png │ │ ├── quarto2.png │ │ ├── quarto_logo.png │ │ ├── quarto_visual.png │ │ ├── quarto_visual2.png │ │ ├── render.png │ │ ├── reproduce.png │ │ ├── source.png │ │ ├── source2.png │ │ ├── text.png │ │ ├── visual.png │ │ └── visual2.png │ ├── index.qmd │ ├── intro-ds.qmd │ ├── intro-ds.scss │ └── references.bib ├── 3-r-python │ ├── featured.png │ ├── images │ │ └── global_opts_python.png │ ├── index.qmd │ ├── kelly-bodwin.jpg │ └── r-python.qmd ├── 4-automation │ ├── colin.jpeg │ ├── featured.png │ └── index.qmd └── 5-teaching-materials │ ├── featured.png │ ├── img │ ├── file-structure-annoated.png │ ├── file-structure.png │ ├── python-slide-code.png │ ├── python-slide.png │ ├── sta210-assignment.png │ ├── sta210-long-notes.png │ ├── sta210-slide-code.png │ ├── sta210-slide.png │ └── sta210-website.png │ ├── index.qmd │ ├── maria-tackett-photo.png │ ├── quarto-teaching-materials.qmd │ └── quarto-teaching-materials.scss └── teach-with-quarto.Rproj /.gitignore: -------------------------------------------------------------------------------- 1 | .Rproj.user 2 | .Rhistory 3 | .Rdata 4 | .httr-oauth 5 | .DS_Store 6 | .quarto 7 | 8 | /.quarto/ 9 | _site -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # teach-with-quarto 2 | 3 | Slides and materials for the "Teaching (with) Quarto" session at JSM 2023. 4 | 5 | The rendered website can be found at https://mine-cetinkaya-rundel.github.io/teach-with-quarto. 6 | -------------------------------------------------------------------------------- /_freeze/site_libs/clipboard/clipboard.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * clipboard.js v2.0.11 3 | * https://clipboardjs.com/ 4 | * 5 | * Licensed MIT © Zeno Rocha 6 | */ 7 | !function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return n={686:function(t,e,n){"use strict";n.d(e,{default:function(){return b}});var e=n(279),i=n.n(e),e=n(370),u=n.n(e),e=n(817),r=n.n(e);function c(t){try{return document.execCommand(t)}catch(t){return}}var a=function(t){t=r()(t);return c("cut"),t};function o(t,e){var n,o,t=(n=t,o="rtl"===document.documentElement.getAttribute("dir"),(t=document.createElement("textarea")).style.fontSize="12pt",t.style.border="0",t.style.padding="0",t.style.margin="0",t.style.position="absolute",t.style[o?"right":"left"]="-9999px",o=window.pageYOffset||document.documentElement.scrollTop,t.style.top="".concat(o,"px"),t.setAttribute("readonly",""),t.value=n,t);return e.container.appendChild(t),e=r()(t),c("copy"),t.remove(),e}var f=function(t){var e=1 { 5 | if (categoriesLoaded) { 6 | activateCategory(category); 7 | setCategoryHash(category); 8 | } 9 | }; 10 | 11 | window["quarto-listing-loaded"] = () => { 12 | // Process any existing hash 13 | const hash = getHash(); 14 | 15 | if (hash) { 16 | // If there is a category, switch to that 17 | if (hash.category) { 18 | activateCategory(hash.category); 19 | } 20 | // Paginate a specific listing 21 | const listingIds = Object.keys(window["quarto-listings"]); 22 | for (const listingId of listingIds) { 23 | const page = hash[getListingPageKey(listingId)]; 24 | if (page) { 25 | showPage(listingId, page); 26 | } 27 | } 28 | } 29 | 30 | const listingIds = Object.keys(window["quarto-listings"]); 31 | for (const listingId of listingIds) { 32 | // The actual list 33 | const list = window["quarto-listings"][listingId]; 34 | 35 | // Update the handlers for pagination events 36 | refreshPaginationHandlers(listingId); 37 | 38 | // Render any visible items that need it 39 | renderVisibleProgressiveImages(list); 40 | 41 | // Whenever the list is updated, we also need to 42 | // attach handlers to the new pagination elements 43 | // and refresh any newly visible items. 44 | list.on("updated", function () { 45 | renderVisibleProgressiveImages(list); 46 | setTimeout(() => refreshPaginationHandlers(listingId)); 47 | 48 | // Show or hide the no matching message 49 | toggleNoMatchingMessage(list); 50 | }); 51 | } 52 | }; 53 | 54 | window.document.addEventListener("DOMContentLoaded", function (_event) { 55 | // Attach click handlers to categories 56 | const categoryEls = window.document.querySelectorAll( 57 | ".quarto-listing-category .category" 58 | ); 59 | 60 | for (const categoryEl of categoryEls) { 61 | const category = categoryEl.getAttribute("data-category"); 62 | categoryEl.onclick = () => { 63 | activateCategory(category); 64 | setCategoryHash(category); 65 | }; 66 | } 67 | 68 | // Attach a click handler to the category title 69 | // (there should be only one, but since it is a class name, handle N) 70 | const categoryTitleEls = window.document.querySelectorAll( 71 | ".quarto-listing-category-title" 72 | ); 73 | for (const categoryTitleEl of categoryTitleEls) { 74 | categoryTitleEl.onclick = () => { 75 | activateCategory(""); 76 | setCategoryHash(""); 77 | }; 78 | } 79 | 80 | categoriesLoaded = true; 81 | }); 82 | 83 | function toggleNoMatchingMessage(list) { 84 | const selector = `#${list.listContainer.id} .listing-no-matching`; 85 | const noMatchingEl = window.document.querySelector(selector); 86 | if (noMatchingEl) { 87 | if (list.visibleItems.length === 0) { 88 | noMatchingEl.classList.remove("d-none"); 89 | } else { 90 | if (!noMatchingEl.classList.contains("d-none")) { 91 | noMatchingEl.classList.add("d-none"); 92 | } 93 | } 94 | } 95 | } 96 | 97 | function setCategoryHash(category) { 98 | setHash({ category }); 99 | } 100 | 101 | function setPageHash(listingId, page) { 102 | const currentHash = getHash() || {}; 103 | currentHash[getListingPageKey(listingId)] = page; 104 | setHash(currentHash); 105 | } 106 | 107 | function getListingPageKey(listingId) { 108 | return `${listingId}-page`; 109 | } 110 | 111 | function refreshPaginationHandlers(listingId) { 112 | const listingEl = window.document.getElementById(listingId); 113 | const paginationEls = listingEl.querySelectorAll( 114 | ".pagination li.page-item:not(.disabled) .page.page-link" 115 | ); 116 | for (const paginationEl of paginationEls) { 117 | paginationEl.onclick = (sender) => { 118 | setPageHash(listingId, sender.target.getAttribute("data-i")); 119 | showPage(listingId, sender.target.getAttribute("data-i")); 120 | return false; 121 | }; 122 | } 123 | } 124 | 125 | function renderVisibleProgressiveImages(list) { 126 | // Run through the visible items and render any progressive images 127 | for (const item of list.visibleItems) { 128 | const itemEl = item.elm; 129 | if (itemEl) { 130 | const progressiveImgs = itemEl.querySelectorAll( 131 | `img[${kProgressiveAttr}]` 132 | ); 133 | for (const progressiveImg of progressiveImgs) { 134 | const srcValue = progressiveImg.getAttribute(kProgressiveAttr); 135 | if (srcValue) { 136 | progressiveImg.setAttribute("src", srcValue); 137 | } 138 | progressiveImg.removeAttribute(kProgressiveAttr); 139 | } 140 | } 141 | } 142 | } 143 | 144 | function getHash() { 145 | // Hashes are of the form 146 | // #name:value|name1:value1|name2:value2 147 | const currentUrl = new URL(window.location); 148 | const hashRaw = currentUrl.hash ? currentUrl.hash.slice(1) : undefined; 149 | return parseHash(hashRaw); 150 | } 151 | 152 | const kAnd = "&"; 153 | const kEquals = "="; 154 | 155 | function parseHash(hash) { 156 | if (!hash) { 157 | return undefined; 158 | } 159 | const hasValuesStrs = hash.split(kAnd); 160 | const hashValues = hasValuesStrs 161 | .map((hashValueStr) => { 162 | const vals = hashValueStr.split(kEquals); 163 | if (vals.length === 2) { 164 | return { name: vals[0], value: vals[1] }; 165 | } else { 166 | return undefined; 167 | } 168 | }) 169 | .filter((value) => { 170 | return value !== undefined; 171 | }); 172 | 173 | const hashObj = {}; 174 | hashValues.forEach((hashValue) => { 175 | hashObj[hashValue.name] = decodeURIComponent(hashValue.value); 176 | }); 177 | return hashObj; 178 | } 179 | 180 | function makeHash(obj) { 181 | return Object.keys(obj) 182 | .map((key) => { 183 | return `${key}${kEquals}${obj[key]}`; 184 | }) 185 | .join(kAnd); 186 | } 187 | 188 | function setHash(obj) { 189 | const hash = makeHash(obj); 190 | window.history.pushState(null, null, `#${hash}`); 191 | } 192 | 193 | function showPage(listingId, page) { 194 | const list = window["quarto-listings"][listingId]; 195 | if (list) { 196 | list.show((page - 1) * list.page + 1, list.page); 197 | } 198 | } 199 | 200 | function activateCategory(category) { 201 | // Deactivate existing categories 202 | const activeEls = window.document.querySelectorAll( 203 | ".quarto-listing-category .category.active" 204 | ); 205 | for (const activeEl of activeEls) { 206 | activeEl.classList.remove("active"); 207 | } 208 | 209 | // Activate this category 210 | const categoryEl = window.document.querySelector( 211 | `.quarto-listing-category .category[data-category='${category}'` 212 | ); 213 | if (categoryEl) { 214 | categoryEl.classList.add("active"); 215 | } 216 | 217 | // Filter the listings to this category 218 | filterListingCategory(category); 219 | } 220 | 221 | function filterListingCategory(category) { 222 | const listingIds = Object.keys(window["quarto-listings"]); 223 | for (const listingId of listingIds) { 224 | const list = window["quarto-listings"][listingId]; 225 | if (list) { 226 | if (category === "") { 227 | // resets the filter 228 | list.filter(); 229 | } else { 230 | // filter to this category 231 | list.filter(function (item) { 232 | const itemValues = item.values(); 233 | if (itemValues.categories !== null) { 234 | const categories = itemValues.categories.split(","); 235 | return categories.includes(category); 236 | } else { 237 | return false; 238 | } 239 | }); 240 | } 241 | } 242 | } 243 | } 244 | -------------------------------------------------------------------------------- /_freeze/site_libs/revealjs/dist/reset.css: -------------------------------------------------------------------------------- 1 | /* http://meyerweb.com/eric/tools/css/reset/ 2 | v4.0 | 20180602 3 | License: none (public domain) 4 | */ 5 | 6 | html, body, div, span, applet, object, iframe, 7 | h1, h2, h3, h4, h5, h6, p, blockquote, pre, 8 | a, abbr, acronym, address, big, cite, code, 9 | del, dfn, em, img, ins, kbd, q, s, samp, 10 | small, strike, strong, sub, sup, tt, var, 11 | b, u, i, center, 12 | dl, dt, dd, ol, ul, li, 13 | fieldset, form, label, legend, 14 | table, caption, tbody, tfoot, thead, tr, th, td, 15 | article, aside, canvas, details, embed, 16 | figure, figcaption, footer, header, hgroup, 17 | main, menu, nav, output, ruby, section, summary, 18 | time, mark, audio, video { 19 | margin: 0; 20 | padding: 0; 21 | border: 0; 22 | font-size: 100%; 23 | font: inherit; 24 | vertical-align: baseline; 25 | } 26 | /* HTML5 display-role reset for older browsers */ 27 | article, aside, details, figcaption, figure, 28 | footer, header, hgroup, main, menu, nav, section { 29 | display: block; 30 | } -------------------------------------------------------------------------------- /_freeze/site_libs/revealjs/dist/theme/fonts/league-gothic/LICENSE: -------------------------------------------------------------------------------- 1 | SIL Open Font License (OFL) 2 | http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&id=OFL 3 | -------------------------------------------------------------------------------- /_freeze/site_libs/revealjs/dist/theme/fonts/league-gothic/league-gothic.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'League Gothic'; 3 | src: url('./league-gothic.eot'); 4 | src: url('./league-gothic.eot?#iefix') format('embedded-opentype'), 5 | url('./league-gothic.woff') format('woff'), 6 | url('./league-gothic.ttf') format('truetype'); 7 | 8 | font-weight: normal; 9 | font-style: normal; 10 | } 11 | -------------------------------------------------------------------------------- /_freeze/site_libs/revealjs/dist/theme/fonts/league-gothic/league-gothic.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mine-cetinkaya-rundel/teach-with-quarto/f8b6ebed58ec9ebd2501643d06b5cd4b20449246/_freeze/site_libs/revealjs/dist/theme/fonts/league-gothic/league-gothic.eot -------------------------------------------------------------------------------- /_freeze/site_libs/revealjs/dist/theme/fonts/league-gothic/league-gothic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mine-cetinkaya-rundel/teach-with-quarto/f8b6ebed58ec9ebd2501643d06b5cd4b20449246/_freeze/site_libs/revealjs/dist/theme/fonts/league-gothic/league-gothic.ttf -------------------------------------------------------------------------------- /_freeze/site_libs/revealjs/dist/theme/fonts/league-gothic/league-gothic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mine-cetinkaya-rundel/teach-with-quarto/f8b6ebed58ec9ebd2501643d06b5cd4b20449246/_freeze/site_libs/revealjs/dist/theme/fonts/league-gothic/league-gothic.woff -------------------------------------------------------------------------------- /_freeze/site_libs/revealjs/dist/theme/fonts/source-sans-pro/LICENSE: -------------------------------------------------------------------------------- 1 | SIL Open Font License 2 | 3 | Copyright 2010, 2012 Adobe Systems Incorporated (http://www.adobe.com/), with Reserved Font Name ‘Source’. All Rights Reserved. Source is a trademark of Adobe Systems Incorporated in the United States and/or other countries. 4 | 5 | This Font Software is licensed under the SIL Open Font License, Version 1.1. 6 | This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL 7 | 8 | —————————————————————————————- 9 | SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 10 | —————————————————————————————- 11 | 12 | PREAMBLE 13 | The goals of the Open Font License (OFL) are to stimulate worldwide development of collaborative font projects, to support the font creation efforts of academic and linguistic communities, and to provide a free and open framework in which fonts may be shared and improved in partnership with others. 14 | 15 | The OFL allows the licensed fonts to be used, studied, modified and redistributed freely as long as they are not sold by themselves. The fonts, including any derivative works, can be bundled, embedded, redistributed and/or sold with any software provided that any reserved names are not used by derivative works. The fonts and derivatives, however, cannot be released under any other type of license. The requirement for fonts to remain under this license does not apply to any document created using the fonts or their derivatives. 16 | 17 | DEFINITIONS 18 | “Font Software” refers to the set of files released by the Copyright Holder(s) under this license and clearly marked as such. This may include source files, build scripts and documentation. 19 | 20 | “Reserved Font Name” refers to any names specified as such after the copyright statement(s). 21 | 22 | “Original Version” refers to the collection of Font Software components as distributed by the Copyright Holder(s). 23 | 24 | “Modified Version” refers to any derivative made by adding to, deleting, or substituting—in part or in whole—any of the components of the Original Version, by changing formats or by porting the Font Software to a new environment. 25 | 26 | “Author” refers to any designer, engineer, programmer, technical writer or other person who contributed to the Font Software. 27 | 28 | PERMISSION & CONDITIONS 29 | Permission is hereby granted, free of charge, to any person obtaining a copy of the Font Software, to use, study, copy, merge, embed, modify, redistribute, and sell modified and unmodified copies of the Font Software, subject to the following conditions: 30 | 31 | 1) Neither the Font Software nor any of its individual components, in Original or Modified Versions, may be sold by itself. 32 | 33 | 2) Original or Modified Versions of the Font Software may be bundled, redistributed and/or sold with any software, provided that each copy contains the above copyright notice and this license. These can be included either as stand-alone text files, human-readable headers or in the appropriate machine-readable metadata fields within text or binary files as long as those fields can be easily viewed by the user. 34 | 35 | 3) No Modified Version of the Font Software may use the Reserved Font Name(s) unless explicit written permission is granted by the corresponding Copyright Holder. This restriction only applies to the primary font name as presented to the users. 36 | 37 | 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font Software shall not be used to promote, endorse or advertise any Modified Version, except to acknowledge the contribution(s) of the Copyright Holder(s) and the Author(s) or with their explicit written permission. 38 | 39 | 5) The Font Software, modified or unmodified, in part or in whole, must be distributed entirely under this license, and must not be distributed under any other license. The requirement for fonts to remain under this license does not apply to any document created using the Font Software. 40 | 41 | TERMINATION 42 | This license becomes null and void if any of the above conditions are not met. 43 | 44 | DISCLAIMER 45 | THE FONT SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. -------------------------------------------------------------------------------- /_freeze/site_libs/revealjs/dist/theme/fonts/source-sans-pro/source-sans-pro-italic.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mine-cetinkaya-rundel/teach-with-quarto/f8b6ebed58ec9ebd2501643d06b5cd4b20449246/_freeze/site_libs/revealjs/dist/theme/fonts/source-sans-pro/source-sans-pro-italic.eot -------------------------------------------------------------------------------- /_freeze/site_libs/revealjs/dist/theme/fonts/source-sans-pro/source-sans-pro-italic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mine-cetinkaya-rundel/teach-with-quarto/f8b6ebed58ec9ebd2501643d06b5cd4b20449246/_freeze/site_libs/revealjs/dist/theme/fonts/source-sans-pro/source-sans-pro-italic.ttf -------------------------------------------------------------------------------- /_freeze/site_libs/revealjs/dist/theme/fonts/source-sans-pro/source-sans-pro-italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mine-cetinkaya-rundel/teach-with-quarto/f8b6ebed58ec9ebd2501643d06b5cd4b20449246/_freeze/site_libs/revealjs/dist/theme/fonts/source-sans-pro/source-sans-pro-italic.woff -------------------------------------------------------------------------------- /_freeze/site_libs/revealjs/dist/theme/fonts/source-sans-pro/source-sans-pro-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mine-cetinkaya-rundel/teach-with-quarto/f8b6ebed58ec9ebd2501643d06b5cd4b20449246/_freeze/site_libs/revealjs/dist/theme/fonts/source-sans-pro/source-sans-pro-regular.eot -------------------------------------------------------------------------------- /_freeze/site_libs/revealjs/dist/theme/fonts/source-sans-pro/source-sans-pro-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mine-cetinkaya-rundel/teach-with-quarto/f8b6ebed58ec9ebd2501643d06b5cd4b20449246/_freeze/site_libs/revealjs/dist/theme/fonts/source-sans-pro/source-sans-pro-regular.ttf -------------------------------------------------------------------------------- /_freeze/site_libs/revealjs/dist/theme/fonts/source-sans-pro/source-sans-pro-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mine-cetinkaya-rundel/teach-with-quarto/f8b6ebed58ec9ebd2501643d06b5cd4b20449246/_freeze/site_libs/revealjs/dist/theme/fonts/source-sans-pro/source-sans-pro-regular.woff -------------------------------------------------------------------------------- /_freeze/site_libs/revealjs/dist/theme/fonts/source-sans-pro/source-sans-pro-semibold.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mine-cetinkaya-rundel/teach-with-quarto/f8b6ebed58ec9ebd2501643d06b5cd4b20449246/_freeze/site_libs/revealjs/dist/theme/fonts/source-sans-pro/source-sans-pro-semibold.eot -------------------------------------------------------------------------------- /_freeze/site_libs/revealjs/dist/theme/fonts/source-sans-pro/source-sans-pro-semibold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mine-cetinkaya-rundel/teach-with-quarto/f8b6ebed58ec9ebd2501643d06b5cd4b20449246/_freeze/site_libs/revealjs/dist/theme/fonts/source-sans-pro/source-sans-pro-semibold.ttf -------------------------------------------------------------------------------- /_freeze/site_libs/revealjs/dist/theme/fonts/source-sans-pro/source-sans-pro-semibold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mine-cetinkaya-rundel/teach-with-quarto/f8b6ebed58ec9ebd2501643d06b5cd4b20449246/_freeze/site_libs/revealjs/dist/theme/fonts/source-sans-pro/source-sans-pro-semibold.woff -------------------------------------------------------------------------------- /_freeze/site_libs/revealjs/dist/theme/fonts/source-sans-pro/source-sans-pro-semibolditalic.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mine-cetinkaya-rundel/teach-with-quarto/f8b6ebed58ec9ebd2501643d06b5cd4b20449246/_freeze/site_libs/revealjs/dist/theme/fonts/source-sans-pro/source-sans-pro-semibolditalic.eot -------------------------------------------------------------------------------- /_freeze/site_libs/revealjs/dist/theme/fonts/source-sans-pro/source-sans-pro-semibolditalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mine-cetinkaya-rundel/teach-with-quarto/f8b6ebed58ec9ebd2501643d06b5cd4b20449246/_freeze/site_libs/revealjs/dist/theme/fonts/source-sans-pro/source-sans-pro-semibolditalic.ttf -------------------------------------------------------------------------------- /_freeze/site_libs/revealjs/dist/theme/fonts/source-sans-pro/source-sans-pro-semibolditalic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mine-cetinkaya-rundel/teach-with-quarto/f8b6ebed58ec9ebd2501643d06b5cd4b20449246/_freeze/site_libs/revealjs/dist/theme/fonts/source-sans-pro/source-sans-pro-semibolditalic.woff -------------------------------------------------------------------------------- /_freeze/site_libs/revealjs/dist/theme/fonts/source-sans-pro/source-sans-pro.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Source Sans Pro'; 3 | src: url('./source-sans-pro-regular.eot'); 4 | src: url('./source-sans-pro-regular.eot?#iefix') format('embedded-opentype'), 5 | url('./source-sans-pro-regular.woff') format('woff'), 6 | url('./source-sans-pro-regular.ttf') format('truetype'); 7 | font-weight: normal; 8 | font-style: normal; 9 | } 10 | 11 | @font-face { 12 | font-family: 'Source Sans Pro'; 13 | src: url('./source-sans-pro-italic.eot'); 14 | src: url('./source-sans-pro-italic.eot?#iefix') format('embedded-opentype'), 15 | url('./source-sans-pro-italic.woff') format('woff'), 16 | url('./source-sans-pro-italic.ttf') format('truetype'); 17 | font-weight: normal; 18 | font-style: italic; 19 | } 20 | 21 | @font-face { 22 | font-family: 'Source Sans Pro'; 23 | src: url('./source-sans-pro-semibold.eot'); 24 | src: url('./source-sans-pro-semibold.eot?#iefix') format('embedded-opentype'), 25 | url('./source-sans-pro-semibold.woff') format('woff'), 26 | url('./source-sans-pro-semibold.ttf') format('truetype'); 27 | font-weight: 600; 28 | font-style: normal; 29 | } 30 | 31 | @font-face { 32 | font-family: 'Source Sans Pro'; 33 | src: url('./source-sans-pro-semibolditalic.eot'); 34 | src: url('./source-sans-pro-semibolditalic.eot?#iefix') format('embedded-opentype'), 35 | url('./source-sans-pro-semibolditalic.woff') format('woff'), 36 | url('./source-sans-pro-semibolditalic.ttf') format('truetype'); 37 | font-weight: 600; 38 | font-style: italic; 39 | } 40 | -------------------------------------------------------------------------------- /_freeze/site_libs/revealjs/plugin/highlight/monokai.css: -------------------------------------------------------------------------------- 1 | /* 2 | Monokai style - ported by Luigi Maselli - http://grigio.org 3 | */ 4 | 5 | .hljs { 6 | display: block; 7 | overflow-x: auto; 8 | padding: 0.5em; 9 | background: #272822; 10 | color: #ddd; 11 | } 12 | 13 | .hljs-tag, 14 | .hljs-keyword, 15 | .hljs-selector-tag, 16 | .hljs-literal, 17 | .hljs-strong, 18 | .hljs-name { 19 | color: #f92672; 20 | } 21 | 22 | .hljs-code { 23 | color: #66d9ef; 24 | } 25 | 26 | .hljs-class .hljs-title { 27 | color: white; 28 | } 29 | 30 | .hljs-attribute, 31 | .hljs-symbol, 32 | .hljs-regexp, 33 | .hljs-link { 34 | color: #bf79db; 35 | } 36 | 37 | .hljs-string, 38 | .hljs-bullet, 39 | .hljs-subst, 40 | .hljs-title, 41 | .hljs-section, 42 | .hljs-emphasis, 43 | .hljs-type, 44 | .hljs-built_in, 45 | .hljs-builtin-name, 46 | .hljs-selector-attr, 47 | .hljs-selector-pseudo, 48 | .hljs-addition, 49 | .hljs-variable, 50 | .hljs-template-tag, 51 | .hljs-template-variable { 52 | color: #a6e22e; 53 | } 54 | 55 | .hljs-comment, 56 | .hljs-quote, 57 | .hljs-deletion, 58 | .hljs-meta { 59 | color: #75715e; 60 | } 61 | 62 | .hljs-keyword, 63 | .hljs-selector-tag, 64 | .hljs-literal, 65 | .hljs-doctag, 66 | .hljs-title, 67 | .hljs-section, 68 | .hljs-type, 69 | .hljs-selector-id { 70 | font-weight: bold; 71 | } 72 | -------------------------------------------------------------------------------- /_freeze/site_libs/revealjs/plugin/highlight/zenburn.css: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Zenburn style from voldmar.ru (c) Vladimir Epifanov 4 | based on dark.css by Ivan Sagalaev 5 | 6 | */ 7 | 8 | .hljs { 9 | display: block; 10 | overflow-x: auto; 11 | padding: 0.5em; 12 | background: #3f3f3f; 13 | color: #dcdcdc; 14 | } 15 | 16 | .hljs-keyword, 17 | .hljs-selector-tag, 18 | .hljs-tag { 19 | color: #e3ceab; 20 | } 21 | 22 | .hljs-template-tag { 23 | color: #dcdcdc; 24 | } 25 | 26 | .hljs-number { 27 | color: #8cd0d3; 28 | } 29 | 30 | .hljs-variable, 31 | .hljs-template-variable, 32 | .hljs-attribute { 33 | color: #efdcbc; 34 | } 35 | 36 | .hljs-literal { 37 | color: #efefaf; 38 | } 39 | 40 | .hljs-subst { 41 | color: #8f8f8f; 42 | } 43 | 44 | .hljs-title, 45 | .hljs-name, 46 | .hljs-selector-id, 47 | .hljs-selector-class, 48 | .hljs-section, 49 | .hljs-type { 50 | color: #efef8f; 51 | } 52 | 53 | .hljs-symbol, 54 | .hljs-bullet, 55 | .hljs-link { 56 | color: #dca3a3; 57 | } 58 | 59 | .hljs-deletion, 60 | .hljs-string, 61 | .hljs-built_in, 62 | .hljs-builtin-name { 63 | color: #cc9393; 64 | } 65 | 66 | .hljs-addition, 67 | .hljs-comment, 68 | .hljs-quote, 69 | .hljs-meta { 70 | color: #7f9f7f; 71 | } 72 | 73 | 74 | .hljs-emphasis { 75 | font-style: italic; 76 | } 77 | 78 | .hljs-strong { 79 | font-weight: bold; 80 | } 81 | -------------------------------------------------------------------------------- /_freeze/site_libs/revealjs/plugin/math/katex.js: -------------------------------------------------------------------------------- 1 | /** 2 | * A plugin which enables rendering of math equations inside 3 | * of reveal.js slides. Essentially a thin wrapper for KaTeX. 4 | * 5 | * @author Hakim El Hattab 6 | * @author Gerhard Burger 7 | */ 8 | export const KaTeX = () => { 9 | let deck; 10 | 11 | let defaultOptions = { 12 | version: 'latest', 13 | delimiters: [ 14 | {left: '$$', right: '$$', display: true}, // Note: $$ has to come before $ 15 | {left: '$', right: '$', display: false}, 16 | {left: '\\(', right: '\\)', display: false}, 17 | {left: '\\[', right: '\\]', display: true} 18 | ], 19 | ignoredTags: ['script', 'noscript', 'style', 'textarea', 'pre'] 20 | } 21 | 22 | const loadCss = src => { 23 | let link = document.createElement('link'); 24 | link.rel = 'stylesheet'; 25 | link.href = src; 26 | document.head.appendChild(link); 27 | }; 28 | 29 | /** 30 | * Loads a JavaScript file and returns a Promise for when it is loaded 31 | * Credits: https://aaronsmith.online/easily-load-an-external-script-using-javascript/ 32 | */ 33 | const loadScript = src => { 34 | return new Promise((resolve, reject) => { 35 | const script = document.createElement('script') 36 | script.type = 'text/javascript' 37 | script.onload = resolve 38 | script.onerror = reject 39 | script.src = src 40 | document.head.append(script) 41 | }) 42 | }; 43 | 44 | async function loadScripts(urls) { 45 | for(const url of urls) { 46 | await loadScript(url); 47 | } 48 | } 49 | 50 | return { 51 | id: 'katex', 52 | 53 | init: function (reveal) { 54 | 55 | deck = reveal; 56 | 57 | let revealOptions = deck.getConfig().katex || {}; 58 | 59 | let options = {...defaultOptions, ...revealOptions}; 60 | const {local, version, extensions, ...katexOptions} = options; 61 | 62 | let baseUrl = options.local || 'https://cdn.jsdelivr.net/npm/katex'; 63 | let versionString = options.local ? '' : '@' + options.version; 64 | 65 | let cssUrl = baseUrl + versionString + '/dist/katex.min.css'; 66 | let katexUrl = baseUrl + versionString + '/dist/katex.min.js'; 67 | let mhchemUrl = baseUrl + versionString + '/dist/contrib/mhchem.min.js' 68 | let karUrl = baseUrl + versionString + '/dist/contrib/auto-render.min.js'; 69 | 70 | let katexScripts = [katexUrl]; 71 | if(options.extensions && options.extensions.includes("mhchem")) { 72 | katexScripts.push(mhchemUrl); 73 | } 74 | katexScripts.push(karUrl); 75 | 76 | const renderMath = () => { 77 | renderMathInElement(reveal.getSlidesElement(), katexOptions); 78 | deck.layout(); 79 | } 80 | 81 | loadCss(cssUrl); 82 | 83 | // For some reason dynamically loading with defer attribute doesn't result in the expected behavior, the below code does 84 | loadScripts(katexScripts).then(() => { 85 | if( deck.isReady() ) { 86 | renderMath(); 87 | } 88 | else { 89 | deck.on( 'ready', renderMath.bind( this ) ); 90 | } 91 | }); 92 | 93 | } 94 | } 95 | 96 | }; 97 | -------------------------------------------------------------------------------- /_freeze/site_libs/revealjs/plugin/math/mathjax2.js: -------------------------------------------------------------------------------- 1 | /** 2 | * A plugin which enables rendering of math equations inside 3 | * of reveal.js slides. Essentially a thin wrapper for MathJax. 4 | * 5 | * @author Hakim El Hattab 6 | */ 7 | export const MathJax2 = () => { 8 | 9 | // The reveal.js instance this plugin is attached to 10 | let deck; 11 | 12 | let defaultOptions = { 13 | messageStyle: 'none', 14 | tex2jax: { 15 | inlineMath: [ [ '$', '$' ], [ '\\(', '\\)' ] ], 16 | skipTags: [ 'script', 'noscript', 'style', 'textarea', 'pre' ] 17 | }, 18 | skipStartupTypeset: true 19 | }; 20 | 21 | function loadScript( url, callback ) { 22 | 23 | let head = document.querySelector( 'head' ); 24 | let script = document.createElement( 'script' ); 25 | script.type = 'text/javascript'; 26 | script.src = url; 27 | 28 | // Wrapper for callback to make sure it only fires once 29 | let finish = () => { 30 | if( typeof callback === 'function' ) { 31 | callback.call(); 32 | callback = null; 33 | } 34 | } 35 | 36 | script.onload = finish; 37 | 38 | // IE 39 | script.onreadystatechange = () => { 40 | if ( this.readyState === 'loaded' ) { 41 | finish(); 42 | } 43 | } 44 | 45 | // Normal browsers 46 | head.appendChild( script ); 47 | 48 | } 49 | 50 | return { 51 | id: 'mathjax2', 52 | 53 | init: function( reveal ) { 54 | 55 | deck = reveal; 56 | 57 | let revealOptions = deck.getConfig().mathjax2 || deck.getConfig().math || {}; 58 | 59 | let options = { ...defaultOptions, ...revealOptions }; 60 | let mathjax = options.mathjax || 'https://cdn.jsdelivr.net/npm/mathjax@2/MathJax.js'; 61 | let config = options.config || 'TeX-AMS_HTML-full'; 62 | let url = mathjax + '?config=' + config; 63 | 64 | options.tex2jax = { ...defaultOptions.tex2jax, ...revealOptions.tex2jax }; 65 | 66 | options.mathjax = options.config = null; 67 | 68 | loadScript( url, function() { 69 | 70 | MathJax.Hub.Config( options ); 71 | 72 | // Typeset followed by an immediate reveal.js layout since 73 | // the typesetting process could affect slide height 74 | MathJax.Hub.Queue( [ 'Typeset', MathJax.Hub, deck.getRevealElement() ] ); 75 | MathJax.Hub.Queue( deck.layout ); 76 | 77 | // Reprocess equations in slides when they turn visible 78 | deck.on( 'slidechanged', function( event ) { 79 | 80 | MathJax.Hub.Queue( [ 'Typeset', MathJax.Hub, event.currentSlide ] ); 81 | 82 | } ); 83 | 84 | } ); 85 | 86 | } 87 | } 88 | 89 | }; 90 | -------------------------------------------------------------------------------- /_freeze/site_libs/revealjs/plugin/math/mathjax3.js: -------------------------------------------------------------------------------- 1 | /** 2 | * A plugin which enables rendering of math equations inside 3 | * of reveal.js slides. Essentially a thin wrapper for MathJax 3 4 | * 5 | * @author Hakim El Hattab 6 | * @author Gerhard Burger 7 | */ 8 | export const MathJax3 = () => { 9 | 10 | // The reveal.js instance this plugin is attached to 11 | let deck; 12 | 13 | let defaultOptions = { 14 | tex: { 15 | inlineMath: [ [ '$', '$' ], [ '\\(', '\\)' ] ] 16 | }, 17 | options: { 18 | skipHtmlTags: [ 'script', 'noscript', 'style', 'textarea', 'pre' ] 19 | }, 20 | startup: { 21 | ready: () => { 22 | MathJax.startup.defaultReady(); 23 | MathJax.startup.promise.then(() => { 24 | Reveal.layout(); 25 | }); 26 | } 27 | } 28 | }; 29 | 30 | function loadScript( url, callback ) { 31 | 32 | let script = document.createElement( 'script' ); 33 | script.type = "text/javascript" 34 | script.id = "MathJax-script" 35 | script.src = url; 36 | script.async = true 37 | 38 | // Wrapper for callback to make sure it only fires once 39 | script.onload = () => { 40 | if (typeof callback === 'function') { 41 | callback.call(); 42 | callback = null; 43 | } 44 | }; 45 | 46 | document.head.appendChild( script ); 47 | 48 | } 49 | 50 | return { 51 | id: 'mathjax3', 52 | init: function(reveal) { 53 | 54 | deck = reveal; 55 | 56 | let revealOptions = deck.getConfig().mathjax3 || {}; 57 | let options = {...defaultOptions, ...revealOptions}; 58 | options.tex = {...defaultOptions.tex, ...revealOptions.tex} 59 | options.options = {...defaultOptions.options, ...revealOptions.options} 60 | options.startup = {...defaultOptions.startup, ...revealOptions.startup} 61 | 62 | let url = options.mathjax || 'https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js'; 63 | options.mathjax = null; 64 | 65 | window.MathJax = options; 66 | 67 | loadScript( url, function() { 68 | // Reprocess equations in slides when they turn visible 69 | Reveal.addEventListener( 'slidechanged', function( event ) { 70 | MathJax.typeset(); 71 | } ); 72 | } ); 73 | 74 | } 75 | } 76 | 77 | }; 78 | -------------------------------------------------------------------------------- /_freeze/site_libs/revealjs/plugin/math/plugin.js: -------------------------------------------------------------------------------- 1 | import {KaTeX} from "./katex"; 2 | import {MathJax2} from "./mathjax2"; 3 | import {MathJax3} from "./mathjax3"; 4 | 5 | const defaultTypesetter = MathJax2; 6 | 7 | /*! 8 | * This plugin is a wrapper for the MathJax2, 9 | * MathJax3 and KaTeX typesetter plugins. 10 | */ 11 | export default Plugin = Object.assign( defaultTypesetter(), { 12 | KaTeX, 13 | MathJax2, 14 | MathJax3 15 | } ); -------------------------------------------------------------------------------- /_freeze/site_libs/revealjs/plugin/multiplex/multiplex.js: -------------------------------------------------------------------------------- 1 | (function() { 2 | 3 | // emulate async script load 4 | window.addEventListener( 'load', function() { 5 | var multiplex = Reveal.getConfig().multiplex; 6 | var socketId = multiplex.id; 7 | var socket = io.connect(multiplex.url); 8 | 9 | function post( evt ) { 10 | var messageData = { 11 | state: Reveal.getState(), 12 | secret: multiplex.secret, 13 | socketId: multiplex.id, 14 | content: (evt || {}).content 15 | }; 16 | socket.emit( 'multiplex-statechanged', messageData ); 17 | }; 18 | 19 | // master 20 | if (multiplex.secret !== null) { 21 | 22 | // Don't emit events from inside of notes windows 23 | if ( window.location.search.match( /receiver/gi ) ) { return; } 24 | 25 | // post once the page is loaded, so the client follows also on "open URL". 26 | post(); 27 | 28 | // Monitor events that trigger a change in state 29 | Reveal.on( 'slidechanged', post ); 30 | Reveal.on( 'fragmentshown', post ); 31 | Reveal.on( 'fragmenthidden', post ); 32 | Reveal.on( 'overviewhidden', post ); 33 | Reveal.on( 'overviewshown', post ); 34 | Reveal.on( 'paused', post ); 35 | Reveal.on( 'resumed', post ); 36 | document.addEventListener( 'send', post ); // broadcast custom events sent by other plugins 37 | 38 | // client 39 | } else { 40 | socket.on(multiplex.id, function(message) { 41 | // ignore data from sockets that aren't ours 42 | if (message.socketId !== socketId) { return; } 43 | if( window.location.host === 'localhost:1947' ) return; 44 | 45 | if ( message.state ) { 46 | Reveal.setState(message.state); 47 | } 48 | if ( message.content ) { 49 | // forward custom events to other plugins 50 | var event = new CustomEvent('received'); 51 | event.content = message.content; 52 | document.dispatchEvent( event ); 53 | } 54 | }); 55 | } 56 | }); 57 | }()); -------------------------------------------------------------------------------- /_freeze/site_libs/revealjs/plugin/multiplex/plugin.yml: -------------------------------------------------------------------------------- 1 | name: multiplex 2 | script: [socket.io.js, multiplex.js] 3 | register: false 4 | config: 5 | multiplex: 6 | secret: null 7 | id: null 8 | url: "https://reveal-multiplex.glitch.me/" 9 | -------------------------------------------------------------------------------- /_freeze/site_libs/revealjs/plugin/notes/plugin.js: -------------------------------------------------------------------------------- 1 | import speakerViewHTML from './speaker-view.html'; 2 | 3 | import { marked } from 'marked'; 4 | 5 | /** 6 | * Handles opening of and synchronization with the reveal.js 7 | * notes window. 8 | * 9 | * Handshake process: 10 | * 1. This window posts 'connect' to notes window 11 | * - Includes URL of presentation to show 12 | * 2. Notes window responds with 'connected' when it is available 13 | * 3. This window proceeds to send the current presentation state 14 | * to the notes window 15 | */ 16 | const Plugin = () => { 17 | 18 | let connectInterval; 19 | let speakerWindow = null; 20 | let deck; 21 | 22 | /** 23 | * Opens a new speaker view window. 24 | */ 25 | function openSpeakerWindow() { 26 | 27 | // If a window is already open, focus it 28 | if( speakerWindow && !speakerWindow.closed ) { 29 | speakerWindow.focus(); 30 | } 31 | else { 32 | speakerWindow = window.open( 'about:blank', 'reveal.js - Notes', 'width=1100,height=700' ); 33 | speakerWindow.marked = marked; 34 | speakerWindow.document.write( speakerViewHTML ); 35 | 36 | if( !speakerWindow ) { 37 | alert( 'Speaker view popup failed to open. Please make sure popups are allowed and reopen the speaker view.' ); 38 | return; 39 | } 40 | 41 | connect(); 42 | } 43 | 44 | } 45 | 46 | /** 47 | * Reconnect with an existing speaker view window. 48 | */ 49 | function reconnectSpeakerWindow( reconnectWindow ) { 50 | 51 | if( speakerWindow && !speakerWindow.closed ) { 52 | speakerWindow.focus(); 53 | } 54 | else { 55 | speakerWindow = reconnectWindow; 56 | window.addEventListener( 'message', onPostMessage ); 57 | onConnected(); 58 | } 59 | 60 | } 61 | 62 | /** 63 | * Connect to the notes window through a postmessage handshake. 64 | * Using postmessage enables us to work in situations where the 65 | * origins differ, such as a presentation being opened from the 66 | * file system. 67 | */ 68 | function connect() { 69 | 70 | const presentationURL = deck.getConfig().url; 71 | 72 | const url = typeof presentationURL === 'string' ? presentationURL : 73 | window.location.protocol + '//' + window.location.host + window.location.pathname + window.location.search; 74 | 75 | // Keep trying to connect until we get a 'connected' message back 76 | connectInterval = setInterval( function() { 77 | speakerWindow.postMessage( JSON.stringify( { 78 | namespace: 'reveal-notes', 79 | type: 'connect', 80 | state: deck.getState(), 81 | url 82 | } ), '*' ); 83 | }, 500 ); 84 | 85 | window.addEventListener( 'message', onPostMessage ); 86 | 87 | } 88 | 89 | /** 90 | * Calls the specified Reveal.js method with the provided argument 91 | * and then pushes the result to the notes frame. 92 | */ 93 | function callRevealApi( methodName, methodArguments, callId ) { 94 | 95 | let result = deck[methodName].apply( deck, methodArguments ); 96 | speakerWindow.postMessage( JSON.stringify( { 97 | namespace: 'reveal-notes', 98 | type: 'return', 99 | result, 100 | callId 101 | } ), '*' ); 102 | 103 | } 104 | 105 | /** 106 | * Posts the current slide data to the notes window. 107 | */ 108 | function post( event ) { 109 | 110 | let slideElement = deck.getCurrentSlide(), 111 | notesElement = slideElement.querySelector( 'aside.notes' ), 112 | fragmentElement = slideElement.querySelector( '.current-fragment' ); 113 | 114 | let messageData = { 115 | namespace: 'reveal-notes', 116 | type: 'state', 117 | notes: '', 118 | markdown: false, 119 | whitespace: 'normal', 120 | state: deck.getState() 121 | }; 122 | 123 | // Look for notes defined in a slide attribute 124 | if( slideElement.hasAttribute( 'data-notes' ) ) { 125 | messageData.notes = slideElement.getAttribute( 'data-notes' ); 126 | messageData.whitespace = 'pre-wrap'; 127 | } 128 | 129 | // Look for notes defined in a fragment 130 | if( fragmentElement ) { 131 | let fragmentNotes = fragmentElement.querySelector( 'aside.notes' ); 132 | if( fragmentNotes ) { 133 | notesElement = fragmentNotes; 134 | } 135 | else if( fragmentElement.hasAttribute( 'data-notes' ) ) { 136 | messageData.notes = fragmentElement.getAttribute( 'data-notes' ); 137 | messageData.whitespace = 'pre-wrap'; 138 | 139 | // In case there are slide notes 140 | notesElement = null; 141 | } 142 | } 143 | 144 | // Look for notes defined in an aside element 145 | if( notesElement ) { 146 | messageData.notes = notesElement.innerHTML; 147 | messageData.markdown = typeof notesElement.getAttribute( 'data-markdown' ) === 'string'; 148 | } 149 | 150 | speakerWindow.postMessage( JSON.stringify( messageData ), '*' ); 151 | 152 | } 153 | 154 | function onPostMessage( event ) { 155 | 156 | let data = JSON.parse( event.data ); 157 | if( data && data.namespace === 'reveal-notes' && data.type === 'connected' ) { 158 | clearInterval( connectInterval ); 159 | onConnected(); 160 | } 161 | else if( data && data.namespace === 'reveal-notes' && data.type === 'call' ) { 162 | callRevealApi( data.methodName, data.arguments, data.callId ); 163 | } 164 | 165 | } 166 | 167 | /** 168 | * Called once we have established a connection to the notes 169 | * window. 170 | */ 171 | function onConnected() { 172 | 173 | // Monitor events that trigger a change in state 174 | deck.on( 'slidechanged', post ); 175 | deck.on( 'fragmentshown', post ); 176 | deck.on( 'fragmenthidden', post ); 177 | deck.on( 'overviewhidden', post ); 178 | deck.on( 'overviewshown', post ); 179 | deck.on( 'paused', post ); 180 | deck.on( 'resumed', post ); 181 | 182 | // Post the initial state 183 | post(); 184 | 185 | } 186 | 187 | return { 188 | id: 'notes', 189 | 190 | init: function( reveal ) { 191 | 192 | deck = reveal; 193 | 194 | if( !/receiver/i.test( window.location.search ) ) { 195 | 196 | // If the there's a 'notes' query set, open directly 197 | if( window.location.search.match( /(\?|\&)notes/gi ) !== null ) { 198 | openSpeakerWindow(); 199 | } 200 | else { 201 | // Keep listening for speaker view hearbeats. If we receive a 202 | // heartbeat from an orphaned window, reconnect it. This ensures 203 | // that we remain connected to the notes even if the presentation 204 | // is reloaded. 205 | window.addEventListener( 'message', event => { 206 | 207 | if( !speakerWindow && typeof event.data === 'string' ) { 208 | let data; 209 | 210 | try { 211 | data = JSON.parse( event.data ); 212 | } 213 | catch( error ) {} 214 | 215 | if( data && data.namespace === 'reveal-notes' && data.type === 'heartbeat' ) { 216 | reconnectSpeakerWindow( event.source ); 217 | } 218 | } 219 | }); 220 | } 221 | 222 | // Open the notes when the 's' key is hit 223 | deck.addKeyBinding({keyCode: 83, key: 'S', description: 'Speaker notes view'}, function() { 224 | openSpeakerWindow(); 225 | } ); 226 | 227 | } 228 | 229 | }, 230 | 231 | open: openSpeakerWindow 232 | }; 233 | 234 | }; 235 | 236 | export default Plugin; 237 | -------------------------------------------------------------------------------- /_freeze/site_libs/revealjs/plugin/pdf-export/pdfexport.js: -------------------------------------------------------------------------------- 1 | var PdfExport = ( function( _Reveal ){ 2 | 3 | var Reveal = _Reveal; 4 | var setStylesheet = null; 5 | var installAltKeyBindings = null; 6 | 7 | function getRevealJsPath(){ 8 | var regex = /\b[^/]+\/reveal.css$/i; 9 | var script = Array.from( document.querySelectorAll( 'link' ) ).find( function( e ){ 10 | return e.attributes.href && e.attributes.href.value.search( regex ) >= 0; 11 | }); 12 | if( !script ){ 13 | console.error( 'reveal.css could not be found in included elements. Did you rename this file?' ); 14 | return ''; 15 | } 16 | return script.attributes.href.value.replace( regex, '' ); 17 | } 18 | 19 | function setStylesheet3( pdfExport ){ 20 | var link = document.querySelector( '#print' ); 21 | if( !link ){ 22 | link = document.createElement( 'link' ); 23 | link.rel = 'stylesheet'; 24 | link.id = 'print'; 25 | document.querySelector( 'head' ).appendChild( link ); 26 | } 27 | var style = 'paper'; 28 | if( pdfExport ){ 29 | style = 'pdf'; 30 | } 31 | link.href = getRevealJsPath() + 'css/print/' + style + '.css'; 32 | } 33 | 34 | function setStylesheet4( pdfExport ){ 35 | } 36 | 37 | function installAltKeyBindings3(){ 38 | } 39 | 40 | function installAltKeyBindings4(){ 41 | if( isPrintingPDF() ){ 42 | var config = Reveal.getConfig(); 43 | var shortcut = config.pdfExportShortcut || 'E'; 44 | window.addEventListener( 'keydown', function( e ){ 45 | if( e.target.nodeName.toUpperCase() == 'BODY' 46 | && ( e.key.toUpperCase() == shortcut.toUpperCase() || e.keyCode == shortcut.toUpperCase().charCodeAt( 0 ) ) ){ 47 | e.preventDefault(); 48 | togglePdfExport(); 49 | return false; 50 | } 51 | }, true ); 52 | } 53 | } 54 | 55 | function isPrintingPDF(){ 56 | return ( /print-pdf/gi ).test( window.location.search ); 57 | } 58 | 59 | function togglePdfExport(){ 60 | var url_doc = new URL( document.URL ); 61 | var query_doc = new URLSearchParams( url_doc.searchParams ); 62 | if( isPrintingPDF() ){ 63 | query_doc.delete( 'print-pdf' ); 64 | }else{ 65 | query_doc.set( 'print-pdf', '' ); 66 | } 67 | url_doc.search = ( query_doc.toString() ? '?' + query_doc.toString() : '' ); 68 | window.location.href = url_doc.toString(); 69 | } 70 | 71 | function installKeyBindings(){ 72 | var config = Reveal.getConfig(); 73 | var shortcut = config.pdfExportShortcut || 'E'; 74 | Reveal.addKeyBinding({ 75 | keyCode: shortcut.toUpperCase().charCodeAt( 0 ), 76 | key: shortcut.toUpperCase(), 77 | description: 'PDF export mode' 78 | }, togglePdfExport ); 79 | installAltKeyBindings(); 80 | } 81 | 82 | function install(){ 83 | installKeyBindings(); 84 | setStylesheet( isPrintingPDF() ); 85 | } 86 | 87 | var Plugin = { 88 | } 89 | 90 | if( Reveal && Reveal.VERSION && Reveal.VERSION.length && Reveal.VERSION[ 0 ] == '3' ){ 91 | // reveal 3.x 92 | setStylesheet = setStylesheet3; 93 | installAltKeyBindings = installAltKeyBindings3; 94 | install(); 95 | }else{ 96 | // must be reveal 4.x 97 | setStylesheet = setStylesheet4; 98 | installAltKeyBindings = installAltKeyBindings4; 99 | Plugin.id = 'pdf-export'; 100 | Plugin.init = function( _Reveal ){ 101 | Reveal = _Reveal; 102 | install(); 103 | }; 104 | Plugin.togglePdfExport = function () { 105 | togglePdfExport(); 106 | }; 107 | } 108 | 109 | return Plugin; 110 | 111 | })( Reveal ); 112 | -------------------------------------------------------------------------------- /_freeze/site_libs/revealjs/plugin/pdf-export/plugin.yml: -------------------------------------------------------------------------------- 1 | name: PdfExport 2 | script: pdfexport.js 3 | -------------------------------------------------------------------------------- /_freeze/site_libs/revealjs/plugin/quarto-line-highlight/line-highlight.css: -------------------------------------------------------------------------------- 1 | .reveal 2 | div.sourceCode 3 | pre 4 | code.has-line-highlights 5 | > span:not(.highlight-line) { 6 | opacity: 0.4; 7 | } 8 | 9 | .reveal pre.numberSource { 10 | padding-left: 0; 11 | } 12 | 13 | .reveal pre.numberSource code > span { 14 | left: -2.1em; 15 | } 16 | 17 | pre.numberSource code > span > a:first-child::before { 18 | left: -0.7em; 19 | } 20 | 21 | .reveal pre > code:not(:first-child).fragment { 22 | position: absolute; 23 | top: 0; 24 | left: 0; 25 | width: 100%; 26 | box-sizing: border-box; 27 | } 28 | 29 | .reveal div.sourceCode pre code { 30 | min-height: 100%; 31 | } 32 | -------------------------------------------------------------------------------- /_freeze/site_libs/revealjs/plugin/quarto-line-highlight/plugin.yml: -------------------------------------------------------------------------------- 1 | # adapted from https://github.com/hakimel/reveal.js/tree/master/plugin/highlight 2 | name: QuartoLineHighlight 3 | script: line-highlight.js 4 | stylesheet: line-highlight.css 5 | -------------------------------------------------------------------------------- /_freeze/site_libs/revealjs/plugin/quarto-support/footer.css: -------------------------------------------------------------------------------- 1 | .reveal .slide-logo { 2 | display: block; 3 | position: fixed; 4 | bottom: 0; 5 | right: 12px; 6 | max-height: 2.2rem; 7 | height: 100%; 8 | width: auto; 9 | z-index: 2; 10 | } 11 | 12 | .reveal .footer { 13 | display: block; 14 | position: fixed; 15 | bottom: 18px; 16 | width: 100%; 17 | margin: 0 auto; 18 | text-align: center; 19 | font-size: 18px; 20 | z-index: 2; 21 | } 22 | 23 | .reveal .footer > * { 24 | margin-top: 0; 25 | margin-bottom: 0; 26 | } 27 | 28 | .reveal .slide .footer { 29 | display: none; 30 | } 31 | 32 | .reveal .slide-number { 33 | bottom: 10px; 34 | right: 10px; 35 | font-size: 16px; 36 | background-color: transparent; 37 | } 38 | 39 | .reveal.has-logo .slide-number { 40 | bottom: initial; 41 | top: 8px; 42 | right: 8px; 43 | } 44 | 45 | .reveal .slide-number .slide-number-delimiter { 46 | margin: 0; 47 | } 48 | 49 | .reveal .slide-menu-button { 50 | left: 8px; 51 | bottom: 8px; 52 | } 53 | 54 | .reveal .slide-chalkboard-buttons { 55 | position: fixed; 56 | left: 12px; 57 | bottom: 8px; 58 | z-index: 30; 59 | font-size: 24px; 60 | } 61 | 62 | .reveal .slide-chalkboard-buttons.slide-menu-offset { 63 | left: 54px; 64 | } 65 | 66 | .reveal .slide-chalkboard-buttons > span { 67 | margin-right: 14px; 68 | cursor: pointer; 69 | } 70 | 71 | @media screen and (max-width: 800px) { 72 | .reveal .slide-logo { 73 | max-height: 1.1rem; 74 | bottom: -2px; 75 | right: 10px; 76 | } 77 | .reveal .footer { 78 | font-size: 14px; 79 | bottom: 12px; 80 | } 81 | .reveal .slide-number { 82 | font-size: 12px; 83 | bottom: 7px; 84 | } 85 | .reveal .slide-menu-button .fas::before { 86 | height: 1.3rem; 87 | width: 1.3rem; 88 | vertical-align: -0.125em; 89 | background-size: 1.3rem 1.3rem; 90 | } 91 | 92 | .reveal .slide-chalkboard-buttons .fas::before { 93 | height: 0.95rem; 94 | width: 0.95rem; 95 | background-size: 0.95rem 0.95rem; 96 | vertical-align: -0em; 97 | } 98 | 99 | .reveal .slide-chalkboard-buttons.slide-menu-offset { 100 | left: 36px; 101 | } 102 | .reveal .slide-chalkboard-buttons > span { 103 | margin-right: 9px; 104 | } 105 | } 106 | 107 | html.print-pdf .reveal .slide-menu-button, 108 | html.print-pdf .reveal .slide-chalkboard-buttons { 109 | display: none; 110 | } 111 | -------------------------------------------------------------------------------- /_freeze/site_libs/revealjs/plugin/quarto-support/plugin.yml: -------------------------------------------------------------------------------- 1 | name: QuartoSupport 2 | script: support.js 3 | stylesheet: footer.css 4 | config: 5 | smaller: false 6 | -------------------------------------------------------------------------------- /_freeze/site_libs/revealjs/plugin/quarto-support/support.js: -------------------------------------------------------------------------------- 1 | // catch all plugin for various quarto features 2 | window.QuartoSupport = function () { 3 | function isPrintView() { 4 | return /print-pdf/gi.test(window.location.search); 5 | } 6 | 7 | // implement controlsAudo 8 | function controlsAuto(deck) { 9 | const config = deck.getConfig(); 10 | if (config.controlsAuto === true) { 11 | const iframe = window.location !== window.parent.location; 12 | const localhost = 13 | window.location.hostname === "localhost" || 14 | window.location.hostname === "127.0.0.1"; 15 | deck.configure({ 16 | controls: 17 | (iframe && !localhost) || 18 | (deck.hasVerticalSlides() && config.navigationMode !== "linear"), 19 | }); 20 | } 21 | } 22 | 23 | // helper to provide event handlers for all links in a container 24 | function handleLinkClickEvents(deck, container) { 25 | Array.from(container.querySelectorAll("a")).forEach((el) => { 26 | const url = el.getAttribute("href"); 27 | if (/^(http|www)/gi.test(url)) { 28 | el.addEventListener( 29 | "click", 30 | (ev) => { 31 | const fullscreen = !!window.document.fullscreen; 32 | const dataPreviewLink = el.getAttribute("data-preview-link"); 33 | 34 | // if there is a local specifcation then use that 35 | if (dataPreviewLink) { 36 | if ( 37 | dataPreviewLink === "true" || 38 | (dataPreviewLink === "auto" && fullscreen) 39 | ) { 40 | ev.preventDefault(); 41 | deck.showPreview(url); 42 | return false; 43 | } 44 | } else { 45 | const previewLinks = !!deck.getConfig().previewLinks; 46 | const previewLinksAuto = 47 | deck.getConfig().previewLinksAuto === true; 48 | if (previewLinks == true || (previewLinksAuto && fullscreen)) { 49 | ev.preventDefault(); 50 | deck.showPreview(url); 51 | return false; 52 | } 53 | } 54 | 55 | // if the deck is in an iframe we want to open it externally 56 | // (don't do this when in vscode though as it has its own 57 | // handler for opening links externally that will be play) 58 | const iframe = window.location !== window.parent.location; 59 | if ( 60 | iframe && 61 | !window.location.search.includes("quartoPreviewReqId=") 62 | ) { 63 | ev.preventDefault(); 64 | ev.stopImmediatePropagation(); 65 | window.open(url, "_blank"); 66 | return false; 67 | } 68 | 69 | // if the user has set data-preview-link to "auto" we need to handle the event 70 | // (because reveal will interpret "auto" as true) 71 | if (dataPreviewLink === "auto") { 72 | ev.preventDefault(); 73 | ev.stopImmediatePropagation(); 74 | const target = 75 | el.getAttribute("target") || 76 | (ev.ctrlKey || ev.metaKey ? "_blank" : ""); 77 | if (target) { 78 | window.open(url, target); 79 | } else { 80 | window.location.href = url; 81 | } 82 | return false; 83 | } 84 | }, 85 | false 86 | ); 87 | } 88 | }); 89 | } 90 | 91 | // implement previewLinksAuto 92 | function previewLinksAuto(deck) { 93 | handleLinkClickEvents(deck, deck.getRevealElement()); 94 | } 95 | 96 | // apply styles 97 | function applyGlobalStyles(deck) { 98 | if (deck.getConfig()["smaller"] === true) { 99 | const revealParent = deck.getRevealElement(); 100 | revealParent.classList.add("smaller"); 101 | } 102 | } 103 | 104 | // add logo image 105 | function addLogoImage(deck) { 106 | const revealParent = deck.getRevealElement(); 107 | const logoImg = document.querySelector(".slide-logo"); 108 | if (logoImg) { 109 | revealParent.appendChild(logoImg); 110 | revealParent.classList.add("has-logo"); 111 | } 112 | } 113 | 114 | // add footer text 115 | function addFooter(deck) { 116 | const revealParent = deck.getRevealElement(); 117 | const defaultFooterDiv = document.querySelector(".footer-default"); 118 | if (defaultFooterDiv) { 119 | revealParent.appendChild(defaultFooterDiv); 120 | handleLinkClickEvents(deck, defaultFooterDiv); 121 | if (!isPrintView()) { 122 | deck.on("slidechanged", function (ev) { 123 | const prevSlideFooter = document.querySelector( 124 | ".reveal > .footer:not(.footer-default)" 125 | ); 126 | if (prevSlideFooter) { 127 | prevSlideFooter.remove(); 128 | } 129 | const currentSlideFooter = ev.currentSlide.querySelector(".footer"); 130 | if (currentSlideFooter) { 131 | defaultFooterDiv.style.display = "none"; 132 | const slideFooter = currentSlideFooter.cloneNode(true); 133 | handleLinkClickEvents(deck, slideFooter); 134 | deck.getRevealElement().appendChild(slideFooter); 135 | } else { 136 | defaultFooterDiv.style.display = "block"; 137 | } 138 | }); 139 | } 140 | } 141 | } 142 | 143 | // add chalkboard buttons 144 | function addChalkboardButtons(deck) { 145 | const chalkboard = deck.getPlugin("RevealChalkboard"); 146 | if (chalkboard && !isPrintView()) { 147 | const revealParent = deck.getRevealElement(); 148 | const chalkboardDiv = document.createElement("div"); 149 | chalkboardDiv.classList.add("slide-chalkboard-buttons"); 150 | if (document.querySelector(".slide-menu-button")) { 151 | chalkboardDiv.classList.add("slide-menu-offset"); 152 | } 153 | // add buttons 154 | const buttons = [ 155 | { 156 | icon: "easel2", 157 | title: "Toggle Chalkboard (b)", 158 | onclick: chalkboard.toggleChalkboard, 159 | }, 160 | { 161 | icon: "brush", 162 | title: "Toggle Notes Canvas (c)", 163 | onclick: chalkboard.toggleNotesCanvas, 164 | }, 165 | ]; 166 | buttons.forEach(function (button) { 167 | const span = document.createElement("span"); 168 | span.title = button.title; 169 | const icon = document.createElement("i"); 170 | icon.classList.add("fas"); 171 | icon.classList.add("fa-" + button.icon); 172 | span.appendChild(icon); 173 | span.onclick = function (event) { 174 | event.preventDefault(); 175 | button.onclick(); 176 | }; 177 | chalkboardDiv.appendChild(span); 178 | }); 179 | revealParent.appendChild(chalkboardDiv); 180 | const config = deck.getConfig(); 181 | if (!config.chalkboard.buttons) { 182 | chalkboardDiv.classList.add("hidden"); 183 | } 184 | 185 | // show and hide chalkboard buttons on slidechange 186 | deck.on("slidechanged", function (ev) { 187 | const config = deck.getConfig(); 188 | let buttons = !!config.chalkboard.buttons; 189 | const slideButtons = ev.currentSlide.getAttribute( 190 | "data-chalkboard-buttons" 191 | ); 192 | if (slideButtons) { 193 | if (slideButtons === "true" || slideButtons === "1") { 194 | buttons = true; 195 | } else if (slideButtons === "false" || slideButtons === "0") { 196 | buttons = false; 197 | } 198 | } 199 | if (buttons) { 200 | chalkboardDiv.classList.remove("hidden"); 201 | } else { 202 | chalkboardDiv.classList.add("hidden"); 203 | } 204 | }); 205 | } 206 | } 207 | 208 | function handleTabbyClicks() { 209 | const tabs = document.querySelectorAll(".panel-tabset-tabby > li > a"); 210 | for (let i = 0; i < tabs.length; i++) { 211 | const tab = tabs[i]; 212 | tab.onclick = function (ev) { 213 | ev.preventDefault(); 214 | ev.stopPropagation(); 215 | return false; 216 | }; 217 | } 218 | } 219 | 220 | function fixupForPrint(deck) { 221 | if (isPrintView()) { 222 | const slides = deck.getSlides(); 223 | slides.forEach(function (slide) { 224 | slide.removeAttribute("data-auto-animate"); 225 | }); 226 | window.document.querySelectorAll(".hljs").forEach(function (el) { 227 | el.classList.remove("hljs"); 228 | }); 229 | window.document.querySelectorAll(".hljs-ln-code").forEach(function (el) { 230 | el.classList.remove("hljs-ln-code"); 231 | }); 232 | } 233 | } 234 | 235 | function handleSlideChanges(deck) { 236 | // dispatch for htmlwidgets 237 | const fireSlideEnter = () => { 238 | const event = window.document.createEvent("Event"); 239 | event.initEvent("slideenter", true, true); 240 | window.document.dispatchEvent(event); 241 | }; 242 | 243 | const fireSlideChanged = (previousSlide, currentSlide) => { 244 | fireSlideEnter(); 245 | 246 | // dispatch for shiny 247 | if (window.jQuery) { 248 | if (previousSlide) { 249 | window.jQuery(previousSlide).trigger("hidden"); 250 | } 251 | if (currentSlide) { 252 | window.jQuery(currentSlide).trigger("shown"); 253 | } 254 | } 255 | }; 256 | 257 | // fire slideEnter for tabby tab activations (for htmlwidget resize behavior) 258 | document.addEventListener("tabby", fireSlideEnter, false); 259 | 260 | deck.on("slidechanged", function (event) { 261 | fireSlideChanged(event.previousSlide, event.currentSlide); 262 | }); 263 | } 264 | 265 | function workaroundMermaidDistance(deck) { 266 | if (window.document.querySelector("pre.mermaid-js")) { 267 | const slideCount = deck.getTotalSlides(); 268 | deck.configure({ 269 | mobileViewDistance: slideCount, 270 | viewDistance: slideCount, 271 | }); 272 | } 273 | } 274 | 275 | return { 276 | id: "quarto-support", 277 | init: function (deck) { 278 | controlsAuto(deck); 279 | previewLinksAuto(deck); 280 | fixupForPrint(deck); 281 | applyGlobalStyles(deck); 282 | addLogoImage(deck); 283 | addFooter(deck); 284 | addChalkboardButtons(deck); 285 | handleTabbyClicks(); 286 | handleSlideChanges(deck); 287 | workaroundMermaidDistance(deck); 288 | }, 289 | }; 290 | }; 291 | -------------------------------------------------------------------------------- /_freeze/site_libs/revealjs/plugin/reveal-menu/menu.css: -------------------------------------------------------------------------------- 1 | .slide-menu-wrapper { 2 | font-family: 'Source Sans Pro', Helvetica, sans-serif; 3 | } 4 | 5 | .slide-menu-wrapper .slide-menu { 6 | background-color: #333; 7 | z-index: 200; 8 | position: fixed; 9 | top: 0; 10 | width: 300px; 11 | height: 100%; 12 | /*overflow-y: scroll;*/ 13 | transition: transform 0.3s; 14 | font-size: 16px; 15 | font-weight: normal; 16 | } 17 | 18 | .slide-menu-wrapper .slide-menu.slide-menu--wide { 19 | width: 500px; 20 | } 21 | 22 | .slide-menu-wrapper .slide-menu.slide-menu--third { 23 | width: 33%; 24 | } 25 | 26 | .slide-menu-wrapper .slide-menu.slide-menu--half { 27 | width: 50%; 28 | } 29 | 30 | .slide-menu-wrapper .slide-menu.slide-menu--full { 31 | width: 95%; 32 | } 33 | 34 | /* 35 | * Slides menu 36 | */ 37 | 38 | .slide-menu-wrapper .slide-menu-items { 39 | margin: 0; 40 | padding: 0; 41 | width: 100%; 42 | border-bottom: solid 1px #555; 43 | } 44 | 45 | .slide-menu-wrapper .slide-menu-item, 46 | .slide-menu-wrapper .slide-menu-item-vertical { 47 | display: block; 48 | text-align: left; 49 | padding: 10px 18px; 50 | color: #aaa; 51 | cursor: pointer; 52 | } 53 | 54 | .slide-menu-wrapper .slide-menu-item-vertical { 55 | padding-left: 30px; 56 | } 57 | 58 | .slide-menu-wrapper .slide-menu--wide .slide-menu-item-vertical, 59 | .slide-menu-wrapper .slide-menu--third .slide-menu-item-vertical, 60 | .slide-menu-wrapper .slide-menu--half .slide-menu-item-vertical, 61 | .slide-menu-wrapper .slide-menu--full .slide-menu-item-vertical, 62 | .slide-menu-wrapper .slide-menu--custom .slide-menu-item-vertical { 63 | padding-left: 50px; 64 | } 65 | 66 | .slide-menu-wrapper .slide-menu-item { 67 | border-top: solid 1px #555; 68 | } 69 | 70 | .slide-menu-wrapper .active-menu-panel li.selected { 71 | background-color: #222; 72 | color: white; 73 | } 74 | 75 | .slide-menu-wrapper .active-menu-panel li.active { 76 | color: #eee; 77 | } 78 | 79 | .slide-menu-wrapper .slide-menu-item.no-title .slide-menu-item-title, 80 | .slide-menu-wrapper .slide-menu-item-vertical.no-title .slide-menu-item-title { 81 | font-style: italic; 82 | } 83 | 84 | .slide-menu-wrapper .slide-menu-item-number { 85 | color: #999; 86 | padding-right: 6px; 87 | } 88 | 89 | .slide-menu-wrapper .slide-menu-item i.far, 90 | .slide-menu-wrapper .slide-menu-item i.fas, 91 | .slide-menu-wrapper .slide-menu-item-vertical i.far, 92 | .slide-menu-wrapper .slide-menu-item-vertical i.fas, 93 | .slide-menu-wrapper .slide-menu-item svg.svg-inline--fa, 94 | .slide-menu-wrapper .slide-menu-item-vertical svg.svg-inline--fa { 95 | padding-right: 12px; 96 | display: none; 97 | } 98 | 99 | .slide-menu-wrapper .slide-menu-item.past i.fas.past, 100 | .slide-menu-wrapper .slide-menu-item-vertical.past i.fas.past, 101 | .slide-menu-wrapper .slide-menu-item.active i.fas.active, 102 | .slide-menu-wrapper .slide-menu-item-vertical.active i.fas.active, 103 | .slide-menu-wrapper .slide-menu-item.future i.far.future, 104 | .slide-menu-wrapper .slide-menu-item-vertical.future i.far.future, 105 | .slide-menu-wrapper .slide-menu-item.past svg.svg-inline--fa.past, 106 | .slide-menu-wrapper .slide-menu-item-vertical.past svg.svg-inline--fa.past, 107 | .slide-menu-wrapper .slide-menu-item.active svg.svg-inline--fa.active, 108 | .slide-menu-wrapper .slide-menu-item-vertical.active svg.svg-inline--fa.active, 109 | .slide-menu-wrapper .slide-menu-item.future svg.svg-inline--fa.future, 110 | .slide-menu-wrapper .slide-menu-item-vertical.future svg.svg-inline--fa.future { 111 | display: inline-block; 112 | } 113 | 114 | .slide-menu-wrapper .slide-menu-item.past i.fas.past, 115 | .slide-menu-wrapper .slide-menu-item-vertical.past i.fas.past, 116 | .slide-menu-wrapper .slide-menu-item.future i.far.future, 117 | .slide-menu-wrapper .slide-menu-item-vertical.future i.far.future, 118 | .slide-menu-wrapper .slide-menu-item.past svg.svg-inline--fa.past, 119 | .slide-menu-wrapper .slide-menu-item-vertical.past svg.svg-inline--fa.past, 120 | .slide-menu-wrapper .slide-menu-item.future svg.svg-inline--fa.future, 121 | .slide-menu-wrapper .slide-menu-item-vertical.future svg.svg-inline--fa.future { 122 | opacity: 0.4; 123 | } 124 | 125 | .slide-menu-wrapper .slide-menu-item.active i.fas.active, 126 | .slide-menu-wrapper .slide-menu-item-vertical.active i.fas.active, 127 | .slide-menu-wrapper .slide-menu-item.active svg.svg-inline--fa.active, 128 | .slide-menu-wrapper .slide-menu-item-vertical.active svg.svg-inline--fa.active { 129 | opacity: 0.8; 130 | } 131 | 132 | .slide-menu-wrapper .slide-menu--left { 133 | left: 0; 134 | -webkit-transform: translateX(-100%); 135 | -ms-transform: translateX(-100%); 136 | transform: translateX(-100%); 137 | } 138 | 139 | .slide-menu-wrapper .slide-menu--left.active { 140 | -webkit-transform: translateX(0); 141 | -ms-transform: translateX(0); 142 | transform: translateX(0); 143 | } 144 | 145 | .slide-menu-wrapper .slide-menu--right { 146 | right: 0; 147 | -webkit-transform: translateX(100%); 148 | -ms-transform: translateX(100%); 149 | transform: translateX(100%); 150 | } 151 | 152 | .slide-menu-wrapper .slide-menu--right.active { 153 | -webkit-transform: translateX(0); 154 | -ms-transform: translateX(0); 155 | transform: translateX(0); 156 | } 157 | 158 | .slide-menu-wrapper { 159 | transition: transform 0.3s; 160 | } 161 | 162 | /* 163 | * Toolbar 164 | */ 165 | .slide-menu-wrapper .slide-menu-toolbar { 166 | height: 60px; 167 | width: 100%; 168 | font-size: 12px; 169 | display: table; 170 | table-layout: fixed; /* ensures equal width */ 171 | margin: 0; 172 | padding: 0; 173 | border-bottom: solid 2px #666; 174 | } 175 | 176 | .slide-menu-wrapper .slide-menu-toolbar > li { 177 | display: table-cell; 178 | line-height: 150%; 179 | text-align: center; 180 | vertical-align: middle; 181 | cursor: pointer; 182 | color: #aaa; 183 | border-radius: 3px; 184 | } 185 | 186 | .slide-menu-wrapper .slide-menu-toolbar > li.toolbar-panel-button i, 187 | .slide-menu-wrapper 188 | .slide-menu-toolbar 189 | > li.toolbar-panel-button 190 | svg.svg-inline--fa { 191 | font-size: 1.7em; 192 | } 193 | 194 | .slide-menu-wrapper .slide-menu-toolbar > li.active-toolbar-button { 195 | color: white; 196 | text-shadow: 0 1px black; 197 | text-decoration: underline; 198 | } 199 | 200 | .slide-menu-toolbar > li.toolbar-panel-button:hover { 201 | color: white; 202 | } 203 | 204 | .slide-menu-toolbar 205 | > li.toolbar-panel-button:hover 206 | span.slide-menu-toolbar-label, 207 | .slide-menu-wrapper 208 | .slide-menu-toolbar 209 | > li.active-toolbar-button 210 | span.slide-menu-toolbar-label { 211 | visibility: visible; 212 | } 213 | 214 | /* 215 | * Panels 216 | */ 217 | .slide-menu-wrapper .slide-menu-panel { 218 | position: absolute; 219 | width: 100%; 220 | visibility: hidden; 221 | height: calc(100% - 60px); 222 | overflow-x: hidden; 223 | overflow-y: auto; 224 | color: #aaa; 225 | } 226 | 227 | .slide-menu-wrapper .slide-menu-panel.active-menu-panel { 228 | visibility: visible; 229 | } 230 | 231 | .slide-menu-wrapper .slide-menu-panel h1, 232 | .slide-menu-wrapper .slide-menu-panel h2, 233 | .slide-menu-wrapper .slide-menu-panel h3, 234 | .slide-menu-wrapper .slide-menu-panel h4, 235 | .slide-menu-wrapper .slide-menu-panel h5, 236 | .slide-menu-wrapper .slide-menu-panel h6 { 237 | margin: 20px 0 10px 0; 238 | color: #fff; 239 | line-height: 1.2; 240 | letter-spacing: normal; 241 | text-shadow: none; 242 | } 243 | 244 | .slide-menu-wrapper .slide-menu-panel h1 { 245 | font-size: 1.6em; 246 | } 247 | .slide-menu-wrapper .slide-menu-panel h2 { 248 | font-size: 1.4em; 249 | } 250 | .slide-menu-wrapper .slide-menu-panel h3 { 251 | font-size: 1.3em; 252 | } 253 | .slide-menu-wrapper .slide-menu-panel h4 { 254 | font-size: 1.1em; 255 | } 256 | .slide-menu-wrapper .slide-menu-panel h5 { 257 | font-size: 1em; 258 | } 259 | .slide-menu-wrapper .slide-menu-panel h6 { 260 | font-size: 0.9em; 261 | } 262 | 263 | .slide-menu-wrapper .slide-menu-panel p { 264 | margin: 10px 0 5px 0; 265 | } 266 | 267 | .slide-menu-wrapper .slide-menu-panel a { 268 | color: #ccc; 269 | text-decoration: underline; 270 | } 271 | 272 | .slide-menu-wrapper .slide-menu-panel a:hover { 273 | color: white; 274 | } 275 | 276 | .slide-menu-wrapper .slide-menu-item a { 277 | text-decoration: none; 278 | } 279 | 280 | .slide-menu-wrapper .slide-menu-custom-panel { 281 | width: calc(100% - 20px); 282 | padding-left: 10px; 283 | padding-right: 10px; 284 | } 285 | 286 | .slide-menu-wrapper .slide-menu-custom-panel .slide-menu-items { 287 | width: calc(100% + 20px); 288 | margin-left: -10px; 289 | margin-right: 10px; 290 | } 291 | 292 | /* 293 | * Theme and Transitions buttons 294 | */ 295 | 296 | .slide-menu-wrapper div[data-panel='Themes'] li, 297 | .slide-menu-wrapper div[data-panel='Transitions'] li { 298 | display: block; 299 | text-align: left; 300 | cursor: pointer; 301 | color: #848484; 302 | } 303 | 304 | /* 305 | * Menu controls 306 | */ 307 | .reveal .slide-menu-button { 308 | position: fixed; 309 | left: 30px; 310 | bottom: 30px; 311 | z-index: 30; 312 | font-size: 24px; 313 | } 314 | 315 | /* 316 | * Menu overlay 317 | */ 318 | 319 | .slide-menu-wrapper .slide-menu-overlay { 320 | position: fixed; 321 | z-index: 199; 322 | top: 0; 323 | left: 0; 324 | overflow: hidden; 325 | width: 0; 326 | height: 0; 327 | background-color: #000; 328 | opacity: 0; 329 | transition: opacity 0.3s, width 0s 0.3s, height 0s 0.3s; 330 | } 331 | 332 | .slide-menu-wrapper .slide-menu-overlay.active { 333 | width: 100%; 334 | height: 100%; 335 | opacity: 0.7; 336 | transition: opacity 0.3s; 337 | } 338 | 339 | /* 340 | * Hide menu for pdf printing 341 | */ 342 | body.print-pdf .slide-menu-wrapper .slide-menu, 343 | body.print-pdf .reveal .slide-menu-button, 344 | body.print-pdf .slide-menu-wrapper .slide-menu-overlay { 345 | display: none; 346 | } 347 | -------------------------------------------------------------------------------- /_freeze/site_libs/revealjs/plugin/reveal-menu/plugin.yml: -------------------------------------------------------------------------------- 1 | name: RevealMenu 2 | script: [menu.js, quarto-menu.js] 3 | stylesheet: [menu.css, quarto-menu.css] 4 | config: 5 | menu: 6 | side: "left" 7 | useTextContentForMissingTitles: true 8 | markers: false 9 | loadIcons: false 10 | -------------------------------------------------------------------------------- /_freeze/site_libs/revealjs/plugin/reveal-menu/quarto-menu.css: -------------------------------------------------------------------------------- 1 | .slide-menu-wrapper .slide-tool-item { 2 | display: block; 3 | text-align: left; 4 | padding: 10px 18px; 5 | color: #aaa; 6 | cursor: pointer; 7 | border-top: solid 1px #555; 8 | } 9 | 10 | .slide-menu-wrapper .slide-tool-item a { 11 | text-decoration: none; 12 | } 13 | 14 | .slide-menu-wrapper .slide-tool-item kbd { 15 | font-family: monospace; 16 | margin-right: 10px; 17 | padding: 3px 8px; 18 | color: inherit; 19 | border: 1px solid; 20 | border-radius: 5px; 21 | border-color: #555; 22 | } 23 | 24 | .slide-menu-wrapper .slide-menu-toolbar > li.active-toolbar-button { 25 | text-decoration: none; 26 | } 27 | 28 | .reveal .slide-menu-button { 29 | left: 8px; 30 | bottom: 8px; 31 | } 32 | 33 | .reveal .slide-menu-button .fas::before, 34 | .reveal .slide-chalkboard-buttons .fas::before, 35 | .slide-menu-wrapper .slide-menu-toolbar .fas::before { 36 | display: inline-block; 37 | height: 2.2rem; 38 | width: 2.2rem; 39 | content: ""; 40 | vertical-align: -0.125em; 41 | background-repeat: no-repeat; 42 | background-size: 2.2rem 2.2rem; 43 | } 44 | 45 | .reveal .slide-chalkboard-buttons .fas::before { 46 | height: 1.45rem; 47 | width: 1.45rem; 48 | background-size: 1.45rem 1.45rem; 49 | vertical-align: 0.1em; 50 | } 51 | 52 | .slide-menu-wrapper .slide-menu-toolbar .fas::before { 53 | height: 1.8rem; 54 | width: 1.8rem; 55 | background-size: 1.8rem 1.8rem; 56 | } 57 | 58 | .slide-menu-wrapper .slide-menu-toolbar .fa-images::before { 59 | background-image: url('data:image/svg+xml,'); 60 | } 61 | 62 | .slide-menu-wrapper .slide-menu-toolbar .fa-gear::before { 63 | background-image: url('data:image/svg+xml,'); 64 | } 65 | 66 | .slide-menu-wrapper .slide-menu-toolbar .fa-times::before { 67 | background-image: url('data:image/svg+xml,'); 68 | } 69 | -------------------------------------------------------------------------------- /_freeze/site_libs/revealjs/plugin/reveal-menu/quarto-menu.js: -------------------------------------------------------------------------------- 1 | window.revealMenuToolHandler = function (handler) { 2 | return function (event) { 3 | event.preventDefault(); 4 | handler(); 5 | Reveal.getPlugin("menu").closeMenu(); 6 | }; 7 | }; 8 | 9 | window.RevealMenuToolHandlers = { 10 | fullscreen: revealMenuToolHandler(function () { 11 | const element = document.documentElement; 12 | const requestMethod = 13 | element.requestFullscreen || 14 | element.webkitRequestFullscreen || 15 | element.webkitRequestFullScreen || 16 | element.mozRequestFullScreen || 17 | element.msRequestFullscreen; 18 | if (requestMethod) { 19 | requestMethod.apply(element); 20 | } 21 | }), 22 | speakerMode: revealMenuToolHandler(function () { 23 | Reveal.getPlugin("notes").open(); 24 | }), 25 | keyboardHelp: revealMenuToolHandler(function () { 26 | Reveal.toggleHelp(true); 27 | }), 28 | overview: revealMenuToolHandler(function () { 29 | Reveal.toggleOverview(true); 30 | }), 31 | toggleChalkboard: revealMenuToolHandler(function () { 32 | RevealChalkboard.toggleChalkboard(); 33 | }), 34 | toggleNotesCanvas: revealMenuToolHandler(function () { 35 | RevealChalkboard.toggleNotesCanvas(); 36 | }), 37 | downloadDrawings: revealMenuToolHandler(function () { 38 | RevealChalkboard.download(); 39 | }), 40 | togglePdfExport: revealMenuToolHandler(function () { 41 | PdfExport.togglePdfExport(); 42 | }), 43 | }; 44 | -------------------------------------------------------------------------------- /_freeze/site_libs/revealjs/plugin/search/plugin.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * Handles finding a text string anywhere in the slides and showing the next occurrence to the user 3 | * by navigatating to that slide and highlighting it. 4 | * 5 | * @author Jon Snyder , February 2013 6 | */ 7 | 8 | const Plugin = () => { 9 | 10 | // The reveal.js instance this plugin is attached to 11 | let deck; 12 | 13 | let searchElement; 14 | let searchButton; 15 | let searchInput; 16 | 17 | let matchedSlides; 18 | let currentMatchedIndex; 19 | let searchboxDirty; 20 | let hilitor; 21 | 22 | function render() { 23 | 24 | searchElement = document.createElement( 'div' ); 25 | searchElement.classList.add( 'searchbox' ); 26 | searchElement.style.position = 'absolute'; 27 | searchElement.style.top = '10px'; 28 | searchElement.style.right = '10px'; 29 | searchElement.style.zIndex = 10; 30 | 31 | //embedded base64 search icon Designed by Sketchdock - http://www.sketchdock.com/: 32 | searchElement.innerHTML = ` 33 | `; 34 | 35 | searchInput = searchElement.querySelector( '.searchinput' ); 36 | searchInput.style.width = '240px'; 37 | searchInput.style.fontSize = '14px'; 38 | searchInput.style.padding = '4px 6px'; 39 | searchInput.style.color = '#000'; 40 | searchInput.style.background = '#fff'; 41 | searchInput.style.borderRadius = '2px'; 42 | searchInput.style.border = '0'; 43 | searchInput.style.outline = '0'; 44 | searchInput.style.boxShadow = '0 2px 18px rgba(0, 0, 0, 0.2)'; 45 | searchInput.style['-webkit-appearance'] = 'none'; 46 | 47 | deck.getRevealElement().appendChild( searchElement ); 48 | 49 | // searchButton.addEventListener( 'click', function(event) { 50 | // doSearch(); 51 | // }, false ); 52 | 53 | searchInput.addEventListener( 'keyup', function( event ) { 54 | switch (event.keyCode) { 55 | case 13: 56 | event.preventDefault(); 57 | doSearch(); 58 | searchboxDirty = false; 59 | break; 60 | default: 61 | searchboxDirty = true; 62 | } 63 | }, false ); 64 | 65 | closeSearch(); 66 | 67 | } 68 | 69 | function openSearch() { 70 | if( !searchElement ) render(); 71 | 72 | searchElement.style.display = 'inline'; 73 | searchInput.focus(); 74 | searchInput.select(); 75 | } 76 | 77 | function closeSearch() { 78 | if( !searchElement ) render(); 79 | 80 | searchElement.style.display = 'none'; 81 | if(hilitor) hilitor.remove(); 82 | } 83 | 84 | function toggleSearch() { 85 | if( !searchElement ) render(); 86 | 87 | if (searchElement.style.display !== 'inline') { 88 | openSearch(); 89 | } 90 | else { 91 | closeSearch(); 92 | } 93 | } 94 | 95 | function doSearch() { 96 | //if there's been a change in the search term, perform a new search: 97 | if (searchboxDirty) { 98 | var searchstring = searchInput.value; 99 | 100 | if (searchstring === '') { 101 | if(hilitor) hilitor.remove(); 102 | matchedSlides = null; 103 | } 104 | else { 105 | //find the keyword amongst the slides 106 | hilitor = new Hilitor("slidecontent"); 107 | matchedSlides = hilitor.apply(searchstring); 108 | currentMatchedIndex = 0; 109 | } 110 | } 111 | 112 | if (matchedSlides) { 113 | //navigate to the next slide that has the keyword, wrapping to the first if necessary 114 | if (matchedSlides.length && (matchedSlides.length <= currentMatchedIndex)) { 115 | currentMatchedIndex = 0; 116 | } 117 | if (matchedSlides.length > currentMatchedIndex) { 118 | deck.slide(matchedSlides[currentMatchedIndex].h, matchedSlides[currentMatchedIndex].v); 119 | currentMatchedIndex++; 120 | } 121 | } 122 | } 123 | 124 | // Original JavaScript code by Chirp Internet: www.chirp.com.au 125 | // Please acknowledge use of this code by including this header. 126 | // 2/2013 jon: modified regex to display any match, not restricted to word boundaries. 127 | function Hilitor(id, tag) { 128 | 129 | var targetNode = document.getElementById(id) || document.body; 130 | var hiliteTag = tag || "EM"; 131 | var skipTags = new RegExp("^(?:" + hiliteTag + "|SCRIPT|FORM)$"); 132 | var colors = ["#ff6", "#a0ffff", "#9f9", "#f99", "#f6f"]; 133 | var wordColor = []; 134 | var colorIdx = 0; 135 | var matchRegex = ""; 136 | var matchingSlides = []; 137 | 138 | this.setRegex = function(input) 139 | { 140 | input = input.replace(/^[^\w]+|[^\w]+$/g, "").replace(/[^\w'-]+/g, "|"); 141 | matchRegex = new RegExp("(" + input + ")","i"); 142 | } 143 | 144 | this.getRegex = function() 145 | { 146 | return matchRegex.toString().replace(/^\/\\b\(|\)\\b\/i$/g, "").replace(/\|/g, " "); 147 | } 148 | 149 | // recursively apply word highlighting 150 | this.hiliteWords = function(node) 151 | { 152 | if(node == undefined || !node) return; 153 | if(!matchRegex) return; 154 | if(skipTags.test(node.nodeName)) return; 155 | 156 | if(node.hasChildNodes()) { 157 | for(var i=0; i < node.childNodes.length; i++) 158 | this.hiliteWords(node.childNodes[i]); 159 | } 160 | if(node.nodeType == 3) { // NODE_TEXT 161 | var nv, regs; 162 | if((nv = node.nodeValue) && (regs = matchRegex.exec(nv))) { 163 | //find the slide's section element and save it in our list of matching slides 164 | var secnode = node; 165 | while (secnode != null && secnode.nodeName != 'SECTION') { 166 | secnode = secnode.parentNode; 167 | } 168 | 169 | var slideIndex = deck.getIndices(secnode); 170 | var slidelen = matchingSlides.length; 171 | var alreadyAdded = false; 172 | for (var i=0; i < slidelen; i++) { 173 | if ( (matchingSlides[i].h === slideIndex.h) && (matchingSlides[i].v === slideIndex.v) ) { 174 | alreadyAdded = true; 175 | } 176 | } 177 | if (! alreadyAdded) { 178 | matchingSlides.push(slideIndex); 179 | } 180 | 181 | if(!wordColor[regs[0].toLowerCase()]) { 182 | wordColor[regs[0].toLowerCase()] = colors[colorIdx++ % colors.length]; 183 | } 184 | 185 | var match = document.createElement(hiliteTag); 186 | match.appendChild(document.createTextNode(regs[0])); 187 | match.style.backgroundColor = wordColor[regs[0].toLowerCase()]; 188 | match.style.fontStyle = "inherit"; 189 | match.style.color = "#000"; 190 | 191 | var after = node.splitText(regs.index); 192 | after.nodeValue = after.nodeValue.substring(regs[0].length); 193 | node.parentNode.insertBefore(match, after); 194 | } 195 | } 196 | }; 197 | 198 | // remove highlighting 199 | this.remove = function() 200 | { 201 | var arr = document.getElementsByTagName(hiliteTag); 202 | var el; 203 | while(arr.length && (el = arr[0])) { 204 | el.parentNode.replaceChild(el.firstChild, el); 205 | } 206 | }; 207 | 208 | // start highlighting at target node 209 | this.apply = function(input) 210 | { 211 | if(input == undefined || !input) return; 212 | this.remove(); 213 | this.setRegex(input); 214 | this.hiliteWords(targetNode); 215 | return matchingSlides; 216 | }; 217 | 218 | } 219 | 220 | return { 221 | 222 | id: 'search', 223 | 224 | init: reveal => { 225 | 226 | deck = reveal; 227 | deck.registerKeyboardShortcut( 'CTRL + Shift + F', 'Search' ); 228 | 229 | document.addEventListener( 'keydown', function( event ) { 230 | if( event.key == "F" && (event.ctrlKey || event.metaKey) ) { //Control+Shift+f 231 | event.preventDefault(); 232 | toggleSearch(); 233 | } 234 | }, false ); 235 | 236 | }, 237 | 238 | open: openSearch 239 | 240 | } 241 | }; 242 | 243 | export default Plugin; -------------------------------------------------------------------------------- /_freeze/site_libs/revealjs/plugin/zoom/plugin.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * reveal.js Zoom plugin 3 | */ 4 | const Plugin = { 5 | 6 | id: 'zoom', 7 | 8 | init: function( reveal ) { 9 | 10 | reveal.getRevealElement().addEventListener( 'mousedown', function( event ) { 11 | var defaultModifier = /Linux/.test( window.navigator.platform ) ? 'ctrl' : 'alt'; 12 | 13 | var modifier = ( reveal.getConfig().zoomKey ? reveal.getConfig().zoomKey : defaultModifier ) + 'Key'; 14 | var zoomLevel = ( reveal.getConfig().zoomLevel ? reveal.getConfig().zoomLevel : 2 ); 15 | 16 | if( event[ modifier ] && !reveal.isOverview() ) { 17 | event.preventDefault(); 18 | 19 | zoom.to({ 20 | x: event.clientX, 21 | y: event.clientY, 22 | scale: zoomLevel, 23 | pan: false 24 | }); 25 | } 26 | } ); 27 | 28 | }, 29 | 30 | destroy: () => { 31 | 32 | zoom.reset(); 33 | 34 | } 35 | 36 | }; 37 | 38 | export default () => Plugin; 39 | 40 | /*! 41 | * zoom.js 0.3 (modified for use with reveal.js) 42 | * http://lab.hakim.se/zoom-js 43 | * MIT licensed 44 | * 45 | * Copyright (C) 2011-2014 Hakim El Hattab, http://hakim.se 46 | */ 47 | var zoom = (function(){ 48 | 49 | // The current zoom level (scale) 50 | var level = 1; 51 | 52 | // The current mouse position, used for panning 53 | var mouseX = 0, 54 | mouseY = 0; 55 | 56 | // Timeout before pan is activated 57 | var panEngageTimeout = -1, 58 | panUpdateInterval = -1; 59 | 60 | // Check for transform support so that we can fallback otherwise 61 | var supportsTransforms = 'transform' in document.body.style; 62 | 63 | if( supportsTransforms ) { 64 | // The easing that will be applied when we zoom in/out 65 | document.body.style.transition = 'transform 0.8s ease'; 66 | } 67 | 68 | // Zoom out if the user hits escape 69 | document.addEventListener( 'keyup', function( event ) { 70 | if( level !== 1 && event.keyCode === 27 ) { 71 | zoom.out(); 72 | } 73 | } ); 74 | 75 | // Monitor mouse movement for panning 76 | document.addEventListener( 'mousemove', function( event ) { 77 | if( level !== 1 ) { 78 | mouseX = event.clientX; 79 | mouseY = event.clientY; 80 | } 81 | } ); 82 | 83 | /** 84 | * Applies the CSS required to zoom in, prefers the use of CSS3 85 | * transforms but falls back on zoom for IE. 86 | * 87 | * @param {Object} rect 88 | * @param {Number} scale 89 | */ 90 | function magnify( rect, scale ) { 91 | 92 | var scrollOffset = getScrollOffset(); 93 | 94 | // Ensure a width/height is set 95 | rect.width = rect.width || 1; 96 | rect.height = rect.height || 1; 97 | 98 | // Center the rect within the zoomed viewport 99 | rect.x -= ( window.innerWidth - ( rect.width * scale ) ) / 2; 100 | rect.y -= ( window.innerHeight - ( rect.height * scale ) ) / 2; 101 | 102 | if( supportsTransforms ) { 103 | // Reset 104 | if( scale === 1 ) { 105 | document.body.style.transform = ''; 106 | } 107 | // Scale 108 | else { 109 | var origin = scrollOffset.x +'px '+ scrollOffset.y +'px', 110 | transform = 'translate('+ -rect.x +'px,'+ -rect.y +'px) scale('+ scale +')'; 111 | 112 | document.body.style.transformOrigin = origin; 113 | document.body.style.transform = transform; 114 | } 115 | } 116 | else { 117 | // Reset 118 | if( scale === 1 ) { 119 | document.body.style.position = ''; 120 | document.body.style.left = ''; 121 | document.body.style.top = ''; 122 | document.body.style.width = ''; 123 | document.body.style.height = ''; 124 | document.body.style.zoom = ''; 125 | } 126 | // Scale 127 | else { 128 | document.body.style.position = 'relative'; 129 | document.body.style.left = ( - ( scrollOffset.x + rect.x ) / scale ) + 'px'; 130 | document.body.style.top = ( - ( scrollOffset.y + rect.y ) / scale ) + 'px'; 131 | document.body.style.width = ( scale * 100 ) + '%'; 132 | document.body.style.height = ( scale * 100 ) + '%'; 133 | document.body.style.zoom = scale; 134 | } 135 | } 136 | 137 | level = scale; 138 | 139 | if( document.documentElement.classList ) { 140 | if( level !== 1 ) { 141 | document.documentElement.classList.add( 'zoomed' ); 142 | } 143 | else { 144 | document.documentElement.classList.remove( 'zoomed' ); 145 | } 146 | } 147 | } 148 | 149 | /** 150 | * Pan the document when the mosue cursor approaches the edges 151 | * of the window. 152 | */ 153 | function pan() { 154 | var range = 0.12, 155 | rangeX = window.innerWidth * range, 156 | rangeY = window.innerHeight * range, 157 | scrollOffset = getScrollOffset(); 158 | 159 | // Up 160 | if( mouseY < rangeY ) { 161 | window.scroll( scrollOffset.x, scrollOffset.y - ( 1 - ( mouseY / rangeY ) ) * ( 14 / level ) ); 162 | } 163 | // Down 164 | else if( mouseY > window.innerHeight - rangeY ) { 165 | window.scroll( scrollOffset.x, scrollOffset.y + ( 1 - ( window.innerHeight - mouseY ) / rangeY ) * ( 14 / level ) ); 166 | } 167 | 168 | // Left 169 | if( mouseX < rangeX ) { 170 | window.scroll( scrollOffset.x - ( 1 - ( mouseX / rangeX ) ) * ( 14 / level ), scrollOffset.y ); 171 | } 172 | // Right 173 | else if( mouseX > window.innerWidth - rangeX ) { 174 | window.scroll( scrollOffset.x + ( 1 - ( window.innerWidth - mouseX ) / rangeX ) * ( 14 / level ), scrollOffset.y ); 175 | } 176 | } 177 | 178 | function getScrollOffset() { 179 | return { 180 | x: window.scrollX !== undefined ? window.scrollX : window.pageXOffset, 181 | y: window.scrollY !== undefined ? window.scrollY : window.pageYOffset 182 | } 183 | } 184 | 185 | return { 186 | /** 187 | * Zooms in on either a rectangle or HTML element. 188 | * 189 | * @param {Object} options 190 | * - element: HTML element to zoom in on 191 | * OR 192 | * - x/y: coordinates in non-transformed space to zoom in on 193 | * - width/height: the portion of the screen to zoom in on 194 | * - scale: can be used instead of width/height to explicitly set scale 195 | */ 196 | to: function( options ) { 197 | 198 | // Due to an implementation limitation we can't zoom in 199 | // to another element without zooming out first 200 | if( level !== 1 ) { 201 | zoom.out(); 202 | } 203 | else { 204 | options.x = options.x || 0; 205 | options.y = options.y || 0; 206 | 207 | // If an element is set, that takes precedence 208 | if( !!options.element ) { 209 | // Space around the zoomed in element to leave on screen 210 | var padding = 20; 211 | var bounds = options.element.getBoundingClientRect(); 212 | 213 | options.x = bounds.left - padding; 214 | options.y = bounds.top - padding; 215 | options.width = bounds.width + ( padding * 2 ); 216 | options.height = bounds.height + ( padding * 2 ); 217 | } 218 | 219 | // If width/height values are set, calculate scale from those values 220 | if( options.width !== undefined && options.height !== undefined ) { 221 | options.scale = Math.max( Math.min( window.innerWidth / options.width, window.innerHeight / options.height ), 1 ); 222 | } 223 | 224 | if( options.scale > 1 ) { 225 | options.x *= options.scale; 226 | options.y *= options.scale; 227 | 228 | magnify( options, options.scale ); 229 | 230 | if( options.pan !== false ) { 231 | 232 | // Wait with engaging panning as it may conflict with the 233 | // zoom transition 234 | panEngageTimeout = setTimeout( function() { 235 | panUpdateInterval = setInterval( pan, 1000 / 60 ); 236 | }, 800 ); 237 | 238 | } 239 | } 240 | } 241 | }, 242 | 243 | /** 244 | * Resets the document zoom state to its default. 245 | */ 246 | out: function() { 247 | clearTimeout( panEngageTimeout ); 248 | clearInterval( panUpdateInterval ); 249 | 250 | magnify( { x: 0, y: 0 }, 1 ); 251 | 252 | level = 1; 253 | }, 254 | 255 | // Alias 256 | magnify: function( options ) { this.to( options ) }, 257 | reset: function() { this.out() }, 258 | 259 | zoomLevel: function() { 260 | return level; 261 | } 262 | } 263 | 264 | })(); 265 | -------------------------------------------------------------------------------- /_freeze/site_libs/revealjs/plugin/zoom/zoom.esm.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * reveal.js Zoom plugin 3 | */ 4 | var e={id:"zoom",init:function(e){e.getRevealElement().addEventListener("mousedown",(function(n){var o=/Linux/.test(window.navigator.platform)?"ctrl":"alt",i=(e.getConfig().zoomKey?e.getConfig().zoomKey:o)+"Key",d=e.getConfig().zoomLevel?e.getConfig().zoomLevel:2;n[i]&&!e.isOverview()&&(n.preventDefault(),t.to({x:n.clientX,y:n.clientY,scale:d,pan:!1}))}))},destroy:function(){t.reset()}},t=function(){var e=1,n=0,o=0,i=-1,d=-1,l="transform"in document.body.style;function s(t,n){var o=r();if(t.width=t.width||1,t.height=t.height||1,t.x-=(window.innerWidth-t.width*n)/2,t.y-=(window.innerHeight-t.height*n)/2,l)if(1===n)document.body.style.transform="";else{var i=o.x+"px "+o.y+"px",d="translate("+-t.x+"px,"+-t.y+"px) scale("+n+")";document.body.style.transformOrigin=i,document.body.style.transform=d}else 1===n?(document.body.style.position="",document.body.style.left="",document.body.style.top="",document.body.style.width="",document.body.style.height="",document.body.style.zoom=""):(document.body.style.position="relative",document.body.style.left=-(o.x+t.x)/n+"px",document.body.style.top=-(o.y+t.y)/n+"px",document.body.style.width=100*n+"%",document.body.style.height=100*n+"%",document.body.style.zoom=n);e=n,document.documentElement.classList&&(1!==e?document.documentElement.classList.add("zoomed"):document.documentElement.classList.remove("zoomed"))}function c(){var t=.12*window.innerWidth,i=.12*window.innerHeight,d=r();owindow.innerHeight-i&&window.scroll(d.x,d.y+(1-(window.innerHeight-o)/i)*(14/e)),nwindow.innerWidth-t&&window.scroll(d.x+(1-(window.innerWidth-n)/t)*(14/e),d.y)}function r(){return{x:void 0!==window.scrollX?window.scrollX:window.pageXOffset,y:void 0!==window.scrollY?window.scrollY:window.pageYOffset}}return l&&(document.body.style.transition="transform 0.8s ease"),document.addEventListener("keyup",(function(n){1!==e&&27===n.keyCode&&t.out()})),document.addEventListener("mousemove",(function(t){1!==e&&(n=t.clientX,o=t.clientY)})),{to:function(n){if(1!==e)t.out();else{if(n.x=n.x||0,n.y=n.y||0,n.element){var o=n.element.getBoundingClientRect();n.x=o.left-20,n.y=o.top-20,n.width=o.width+40,n.height=o.height+40}void 0!==n.width&&void 0!==n.height&&(n.scale=Math.max(Math.min(window.innerWidth/n.width,window.innerHeight/n.height),1)),n.scale>1&&(n.x*=n.scale,n.y*=n.scale,s(n,n.scale),!1!==n.pan&&(i=setTimeout((function(){d=setInterval(c,1e3/60)}),800)))}},out:function(){clearTimeout(i),clearInterval(d),s({x:0,y:0},1),e=1},magnify:function(e){this.to(e)},reset:function(){this.out()},zoomLevel:function(){return e}}}();export default function(){return e} 5 | -------------------------------------------------------------------------------- /_freeze/site_libs/revealjs/plugin/zoom/zoom.js: -------------------------------------------------------------------------------- 1 | !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).RevealZoom=t()}(this,(function(){"use strict"; 2 | /*! 3 | * reveal.js Zoom plugin 4 | */var e={id:"zoom",init:function(e){e.getRevealElement().addEventListener("mousedown",(function(o){var n=/Linux/.test(window.navigator.platform)?"ctrl":"alt",i=(e.getConfig().zoomKey?e.getConfig().zoomKey:n)+"Key",d=e.getConfig().zoomLevel?e.getConfig().zoomLevel:2;o[i]&&!e.isOverview()&&(o.preventDefault(),t.to({x:o.clientX,y:o.clientY,scale:d,pan:!1}))}))},destroy:function(){t.reset()}},t=function(){var e=1,o=0,n=0,i=-1,d=-1,l="transform"in document.body.style;function s(t,o){var n=r();if(t.width=t.width||1,t.height=t.height||1,t.x-=(window.innerWidth-t.width*o)/2,t.y-=(window.innerHeight-t.height*o)/2,l)if(1===o)document.body.style.transform="";else{var i=n.x+"px "+n.y+"px",d="translate("+-t.x+"px,"+-t.y+"px) scale("+o+")";document.body.style.transformOrigin=i,document.body.style.transform=d}else 1===o?(document.body.style.position="",document.body.style.left="",document.body.style.top="",document.body.style.width="",document.body.style.height="",document.body.style.zoom=""):(document.body.style.position="relative",document.body.style.left=-(n.x+t.x)/o+"px",document.body.style.top=-(n.y+t.y)/o+"px",document.body.style.width=100*o+"%",document.body.style.height=100*o+"%",document.body.style.zoom=o);e=o,document.documentElement.classList&&(1!==e?document.documentElement.classList.add("zoomed"):document.documentElement.classList.remove("zoomed"))}function c(){var t=.12*window.innerWidth,i=.12*window.innerHeight,d=r();nwindow.innerHeight-i&&window.scroll(d.x,d.y+(1-(window.innerHeight-n)/i)*(14/e)),owindow.innerWidth-t&&window.scroll(d.x+(1-(window.innerWidth-o)/t)*(14/e),d.y)}function r(){return{x:void 0!==window.scrollX?window.scrollX:window.pageXOffset,y:void 0!==window.scrollY?window.scrollY:window.pageYOffset}}return l&&(document.body.style.transition="transform 0.8s ease"),document.addEventListener("keyup",(function(o){1!==e&&27===o.keyCode&&t.out()})),document.addEventListener("mousemove",(function(t){1!==e&&(o=t.clientX,n=t.clientY)})),{to:function(o){if(1!==e)t.out();else{if(o.x=o.x||0,o.y=o.y||0,o.element){var n=o.element.getBoundingClientRect();o.x=n.left-20,o.y=n.top-20,o.width=n.width+40,o.height=n.height+40}void 0!==o.width&&void 0!==o.height&&(o.scale=Math.max(Math.min(window.innerWidth/o.width,window.innerHeight/o.height),1)),o.scale>1&&(o.x*=o.scale,o.y*=o.scale,s(o,o.scale),!1!==o.pan&&(i=setTimeout((function(){d=setInterval(c,1e3/60)}),800)))}},out:function(){clearTimeout(i),clearInterval(d),s({x:0,y:0},1),e=1},magnify:function(e){this.to(e)},reset:function(){this.out()},zoomLevel:function(){return e}}}();return function(){return e}})); 5 | -------------------------------------------------------------------------------- /_freeze/talks/1-welcome/welcome/execute-results/html.json: -------------------------------------------------------------------------------- 1 | { 2 | "hash": "5b17e68081a551f2f0f08bf543a7c120", 3 | "result": { 4 | "markdown": "---\ntitle: Welcome to Quarto\nsubtitle: From course notes to journal articles to books\nauthor: Mine Çetinkaya-Rundel\ninstitution: Duke University + Posit\ndate: 2023-08-06\nfooter: \"[🔗 bit.ly/teach-quarto](https://bit.ly/teach-quarto)\"\ntitle-slide-attributes:\n data-background-image: images/horst-teach-quarto.png\n data-background-size: stretch\n data-background-opacity: \"0.8\"\nformat: \n revealjs: \n theme: welcome.scss\n multiplex: true\n transition: fade\n embed-resources: true\nexecute:\n echo: true\n---\n\n# What is Quarto?\n\n## Quarto ...\n\n- is a new, open-source, scientific, and technical publishing system\n- aims to make the process of creating and collaborating dramatically better\n\n![Artwork from \"Hello, Quarto\" keynote by Julia Lowndes and Mine Çetinkaya-Rundel, presented at RStudio Conference 2022. Illustrated by Allison Horst.](images/horst_quarto_schematic.png){fig-alt=\"A schematic representing the multi-language input (e.g. Python, R, Observable, Julia) and multi-format output (e.g. PDF, html, Word documents, and more) versatility of Quarto.\" fig-align=\"center\"}\n\n## A bit of magic {background-image=\"images/horst_meteor.png\" background-size=\"70%\" background-repeat=\"no-repeat\"}\n\n::: {style=\"text-align: center; font-size: 2em;\"}\n[bit.ly/teach-quarto](https://bit.ly/teach-quarto)\n:::\n\n## Quarto ... {.center auto-animate=\"true\"}\n\n**unifies** + **extends** the R Markdown ecosystem\n\n## Quarto ... {.center auto-animate=\"true\"}\n\n**unifies** + **extends** the R Markdown ecosystem\n\n
\n\n**unifies** for people who love R Markdown\n\n## Quarto ... {.center auto-animate=\"true\"}\n\n**unifies** + **extends** the R Markdown ecosystem\n\n
\n\n**unifies** for people who love R Markdown\n\n**extends** for people who don't know R Markdown\n\n## Quarto unifies + extends R Markdown\n\n::: incremental\n- Consistent implementation of attractive and handy features across outputs: tabsets, code-folding, syntax highlighting, etc.\n- More accessible defaults as well as better support for accessibility\n- Guardrails, particularly helpful for new learners: YAML completion, informative syntax errors, etc.\n- Support for other languages like Python, Julia, Observable, and more via Jupyter engine for executable code chunks.\n:::\n\n## Quarto, in a nutshell\n\n\n```{=html}\n
\"\"
\n```\n\n# Anatomy of a Quarto document\n\n## YAML\n\nDocument metadata\n\n::: columns\n::: {.column width=\"50%\"}\n``` yaml\ntitle: \"Hello, Penguins!\"\nformat: html\neditor: visual\n```\n:::\n\n::: {.column width=\"50%\"}\n![](images/yaml-less.png)\n:::\n:::\n\n. . .\n\n::: columns\n::: {.column width=\"50%\"}\n``` yaml\ntitle: \"Hello, Penguins!\"\nauthor: Mine Çetinkaya-Rundel\ninstitute: Duke University\ndate: now\n...\nformat: html\neditor: visual\n```\n:::\n\n::: {.column width=\"50%\"}\n![](images/yaml-more.png)\n:::\n:::\n\n## Text\n\nMarkdown, that can be edited with any editor, including RStudio's source or visual editors.\n\n::: columns\n::: {.column width=\"50%\"}\n![](images/source-editor.png)\n:::\n\n::: {.column width=\"50%\"}\n![](images/visual-editor.png)\n:::\n:::\n\n## Code\n\n::: columns\n::: {.column width=\"50%\"}\nR code chunks executed with **knitr** \n:::\n\n::: {.column width=\"50%\"}\nPython, Julia, and Observable chunks executed with **jupyter** \n````markdown\n\n::: {#822187d8 .cell execution_count=1}\n``` {.python .cell-code}\n# Python code goes here\n```\n:::\n\n\n````\n:::\n:::\n\n# Quarto + various document types\n\n## Documents\n\n\n```{=html}\n
\"\"
\n```\n\n::: notes\n- Bold palmerpenguins and add link to \n- Add code chunk options with YAML completion:\n - fig-alt\n - code-fold\n - echo: fenced\n- Annotate table making code \\# \\<1\\>\n 1. Take `penguins` data frame , and then, \\# \\<2\\>\n 2. Slice the top 10 rows, and then, \\# \\<3\\>\n 3. Select the variables indicates, and then, \\# \\<4\\>\n 4. Make a gt table\n- Add code-annotation: hover to YAML, and then change to code-annotation: select, and then remove\n- Add a citation: 10.1371/journal.pone.0090081 to palmerpenguins\n- Make document PDF\n:::\n\n## Slides\n\n\n```{=html}\n
\"\"
\n```\n\n::: notes\n- Change format: revealjs\n\n- Add section headings: First level headings Introduction and Analysis, under Analysis a second level heading called Modeling\n\n- Add columns to slides\n\n- Reveal code with echo: true\n\n- teaching-tip: code-line-numbers\n\n- Change output-location of figure\n:::\n\n## Websites\n\n\n```{=html}\n
\"\"
\n```\n\n::: notes\n- Add Quarto file and call it index.qmd\n\n- Add \\_quarto.yml\n\n- Restart project\n\n- Build Tab \\> Render Website\n:::\n\n## Publications\n\n- You can already write reproducible journal articles with Quarto (like you could with the **rticles** and similar packages and R Markdown), and an ASA template is available!\n\n- You can now also write fully reproducible `manuscripts` with embedded computation and render to multiple formats!\n\n::: callout-warning\n## Quarto 1.4\n\nThe `manuscript` project type is available in Quarto 1.4. Pre-release now available, release coming soon!\n:::\n\n## Manuscripts\n\n\n```{=html}\n
\"\"
\n```\n\n# Parting remarks\n\n## Quarto CLI...\n\norchestrates each step of rendering\n\n![Artwork from \"Hello, Quarto\" keynote by Julia Lowndes and Mine Çetinkaya-Rundel, presented at RStudio Conference 2022. Illustrated by Allison Horst.](images/horst_qmd_render_schema.png){fig-alt=\"A schematic representing rendering of Quarto documents from .qmd, to knitr or jupyter, to plain text markdown, then converted by pandoc into any number of output types including html, PDF, or Word document.\"}\n\n## Learning more\n\n[https://quarto.org](https://quarto.org/)\n\n\n```{=html}\n\n```\n\n## Follow up with...\n\nthe Quarto Blog: \n\n\n```{=html}\n\n```\n\n## Thank you! {background-image=\"images/thank-you.png\"}\n\n🔗 [bit.ly/teach-quarto](https://bit.ly/teach-quarto)\n\n🐘 [fosstodon.org/\\@minecr](https://fosstodon.org/@minecr)\n\n✉️ [mc301\\@duke.edu](mailto:mc301@duke.edu)\n\n", 5 | "supporting": [ 6 | "welcome_files" 7 | ], 8 | "filters": [], 9 | "includes": {} 10 | } 11 | } -------------------------------------------------------------------------------- /_freeze/talks/2-intro-ds/intro-ds/execute-results/html.json: -------------------------------------------------------------------------------- 1 | { 2 | "hash": "96665abb799d9ef9359ef5e794d433c4", 3 | "result": { 4 | "markdown": "---\ntitle: \"Teaching
in Introductory Data Science\"\ntitle-slide-attributes:\n data-background-image: images/quarto_logo.png\n data-background-size: 31%\n data-background-position: 62% 18% \nauthor: \"Dr. Elijah Meyer\"\ninstitute: \"Duke University\"\ndate: now\nformat: \n revealjs:\n incremental: true \n slide-number: c\n show-slide-number: all\n theme: [dark, intro-ds.scss]\n embed-resources: true\nbibliography: references.bib\n---\n\n\n## Outline\n\n::: nonincremental\n1. How\n\n2. Benefits\n:::\n\n## How: Application Exercises\n\n![](images/ae-demo.gif){width=\"1000\" height=\"600\"}\n\n## When First Teaching\n\n- Stick to \"what's familiar\"\n\n- Stick to \"basics\"\n\n## Visual vs Source Tab\n\n::: {#fig-R2 layout-ncol=\"2\"}\n![](images/source2.png){#fig-s width=\"1000\"}\n\n![](images/visual2.png){#fig-v width=\"1000\"}\n\nSource (a) vs Visual (b)\n:::\n\n## Quarto Layout\n\n![](images/quarto2.png){fig-align=\"center\" width=\"1000\"}\n\n## Quarto as a Teaching Tool\n\nOnce students have the layout...Lean into what Quarto has to offer\n\n- Informative Syntax and Completion\n\n- Informative Error Messages\n\n## Informative Syntax and Completion\n\n![](images/figure-set.gif){width=\"1000\" height=\"600\"}\n\n## Informative Errors and Common Mistakes\n\nApproachability of Quarto error messages alleviates some tension in an intro class\n\n## Missing Syntax\n\n```{{r}}\n#| label: plot1\n#| warning false\n```\n\n. . .\n\n
\n\nIn the **Background Jobs** pane:\n\n``` bash\nScanner error: while scanning a simple key at line 2, column 1 could not find\n expected : at line 3, column 1\n```\n\n## Indentation Error\n\n``` yaml\ntitle: \"Demo Document\"\n author: \"Student 1\"\nformat: html\neditor: visual\n```\n\n. . .\n\n
\n\nIn the **Background Jobs** pane:\n\n``` bash\nERROR: YAMLError: bad indentation of a mapping entry at line 3, column 3:\n author: \"Student 1\"\n ^\n```\n\n# How do we set this up?\n\n## In-class activity\n\nUse well scaffolded Quarto documents\n\n- provide the code early\n\n- provide documentation\n\n- fill in the blank code\n\n- provide code with errors\n\n## Suggestions: In-class activity\n\n\n::: {.cell}\n\n:::\n\n\n::: columns\n::: {.column width=\"50%\"}\nMinimal chunk options\n\n::: nonincremental\n- `label:`\n- `warning:`\n- `message:`\n- `echo:`\n- figure options\n:::\n:::\n\n::: {.column width=\"50%\"}\nMinimal YAML\n\n::: nonincremental\n- `title:`\n- `author:`\n- `format:`\n- `editor:`\n:::\n:::\n:::\n\n## In-class activity\n\nRender early and often!\n\n::: nonincremental\n- provide check points to build habit\n\n- [Example Application Exercise](https://github.com/ElijahMeyer3/demo-ae)\n:::\n\n# Benefits\n\n## From the student's perspective\n\n- Useful tool: Good habit to build for future coursework + career\n\n- Proof of work: A project they can take with them\n\n## Project with Quarto\n\n![](images/projectvid.gif){width=\"1000\" height=\"600\"}\n\n## How we do it\n\n![](images/project1.png){width=\"700\" height=\"500\"}\n\n## How we do it\n\n![](images/project2.png){width=\"700\" height=\"500\"}\n\n## Project: Professional Document\n\n**R Markdown:**\n\n\n::: {.cell}\n\n```{.r .cell-code}\nknitr::opts_chunk$set(echo = FALSE) \n```\n:::\n\n\n. . .\n\n
\n\n**Quarto:** Easier to get started and attempts to \"smooth\" the edges of R Markdown\n\n\n::: {.cell}\n\n```{.r .cell-code}\ntitle: \"Project Title\" \nexecute:\n echo: false\n```\n:::\n\n\n## From the instructor's perspective\n\nEfficiency\n\n- Reproducible lessons to adapt\n\n- Consistent formatting = easier grading\n\n## Going Beyond\n\nCitations\n\n![](images/citation.png){fig-align=\"center\" width=\"1000\"}\n\n## In Summary\n\n- Start **minimal** and build up!\n\n- Continuously practice\n\n- Reproducibility becomes not optional\n\n- Know that the investment pays off\n\n# Questions\n\n## Motivating Example\n\n![Lack of Trust in Science [@fanelli2018]](images/pnas.png){fig-align=\"left\" fig-alt=\"Crisis\" width=\"730\"}\n\n## References\n", 5 | "supporting": [], 6 | "filters": [ 7 | "rmarkdown/pagebreak.lua" 8 | ], 9 | "includes": { 10 | "include-after-body": [ 11 | "\n\n\n" 12 | ] 13 | }, 14 | "engineDependencies": {}, 15 | "preserve": {}, 16 | "postProcess": true 17 | } 18 | } -------------------------------------------------------------------------------- /_freeze/talks/3-r-python/r-python/execute-results/html.json: -------------------------------------------------------------------------------- 1 | { 2 | "hash": "56a96a8ec3763c6921362bbb380f1f1b", 3 | "result": { 4 | "markdown": "---\ntitle: \"Bilingual Materials with Quarto\"\nauthor: \"Dr. Kelly Bodwin\"\ninstitute: \"California Polytechnic State University\"\ndate: now\nformat: \n revealjs:\n incremental: true \n slide-number: c\n show-slide-number: all\n theme: sky\n embed-resources: true\nexecute:\n eval: false\n echo: true\n---\n\n\n# How does Quarto make python easier?\n\n## Engine Setup\n\nIn **R Markdown**, to use python, you had to set everything up **in R** using the *reticulate* package:\n\n## {auto-animate=\"true\"}\n\n\n::: {.cell}\n\n```{.r .cell-code}\nlibrary(reticulate)\n```\n:::\n\n\n## {auto-animate=\"true\"}\n\n\n::: {.cell}\n\n```{.r .cell-code}\nlibrary(reticulate)\npy_config()\nuse_python(\"/usr/local/bin/python3\")\npy_discover_config()\n```\n:::\n\n\n## {auto-animate=\"true\"}\n\n\n::: {.cell}\n\n```{.r .cell-code}\nlibrary(reticulate)\npy_config()\nuse_python(\"/usr/local/bin/python3\")\npy_discover_config()\n\n## You may need the code below if you are working on your home Windows computer:\npy_run_string(\"import os as os\")\npy_run_string(\"os.environ['QT_QPA_PLATFORM_PLUGIN_PATH'] = 'C:/Users/kbodwin/Anaconda3/Library/plugins/platforms'\")\n```\n:::\n\n\n## {auto-animate=\"true\"}\n\n\n::: {.cell}\n\n```{.r .cell-code}\nlibrary(reticulate)\npy_config()\nuse_python(\"/usr/local/bin/python3\")\npy_discover_config()\n\n## You may need the code below if you are working on your home Windows computer:\npy_run_string(\"import os as os\")\npy_run_string(\"os.environ['QT_QPA_PLATFORM_PLUGIN_PATH'] = 'C:/Users/kbodwin/Anaconda3/Library/plugins/platforms'\")\n\nreticulate::py_install(\"pandas\")\nreticulate::py_install(\"scikit-learn\")\nreticulate::py_install(\"scipy\")\n```\n:::\n\n\n## Engine Setup\n\nNow, it's all \"under the hood\":\n\n``` \n---\ntitle: \"My document\"\njupyter: python3\n---\n```\n\n# Tricks for interweaving R and python\n\n## Choose your install in Global Options\n\n![](./images/global_opts_python.png)\n\n## Object passing\n\n- Automatic variables named `py` and `r`\n\n- Access *python* objects from *R* with `py$`\n\n- Access *R* objects from *python* with `r.`\n\n## Object passing\n\n\n\n````default\n\n```{r}\n# read and filter data with R\nlibrary(palmerpenguins)\n\nadelie <-\n penguins %>%\n filter(species == \"Adelie\")\n```\n\n```{python}\n# model with python\nLR = LinearRegression()\n\nX = r.adelie[['bill_length_mm', 'bill_depth_mm']]\ny = r.adelie['mass_g']\n\nmod = LR.fit(X, y)\ncoef = mod.coef_\n```\n\n```{r}\n# summarize with R\npy$coef\n```\n\n````\n\n\n## Jupyter\n\n- Do you like Jupyter notebooks? **Me too!**\n\n- Do you like Colab and/or Posit Cloud? **Me too!**\n\n- Do you want to make your materials in Quarto but distribute to students in Jupyter form? **Me too!**\n\n\n::: {.cell}\n\n```{.r .cell-code code-fold=\"true\"}\nquarto convert class_notes.qmd\nquarto convert class_notes.ipynb \n\nquarto render class_notes.ipynb\n```\n:::\n\n\n## Remaining challenges of multilingual docs\n\n1. Most undergrad programs **don't require** multiple languages.\n\n2. Detecting python **installs and packages** isn't perfect.\n\n3. R and python do not always have the **same default implementations** for models.\n\n4. What if what you want is not a **multilingual** document, but duplicated **translated** documents?\n\n# `versions()` functions in `templar` mini-package\n\n## What it does\n\nUpon rendering...\n\n1. Identifies the **R chunks** from the **python chunks**\n\n2. Identifies the **labeled text sections** for R or python.\n\n3. Writes new **unilingual source files** (qmds) in separate folders\n\n4. (Optionally) **Renders** those source files\n\n5. (Optionally) **Converts** the python one to ipynb.\n\n# Example\n\n## First chunk\n\n\n\n````default\n```{r, version = \"none\"}\ntemplar::versions_quarto_multilingual(global_eval = FALSE,\n to_jupyter = TRUE, \n warn_edit = FALSE)\n```\n````\n\n\n- `{version = \"none\"}`: this code itself should not appear in generated files\n\n- `global_eval`: do you want to\n\n- `to_jupyter`: do you want to convert the python version?\n\n- `warn_edit`: put a warning at the top of generated files to not edit directly?\n\n## Code chunk versions\n\n\n\n````default\n\nThe first thing we need to do with any dataset is check for\nmissing data, and make sure the variables are the right type:\n\n```{r, version = \"R\"}\ndf %>% summary()\n```\n\n```{python, version = \"python\"}\ndf.info()\n```\n\n````\n\n\n## Versioned text\n\n\n\n````default\n\nThe next step is to clean the data.\n\n%%% version: R\n\nThe \"Color\" variable is being treated as a \"character\" variable,\ni.e., just an ordinary word.\n\nBut we know it should be *categorical*, aka a `factor` variable.\nLet's `mutate` the dataset to fix this:\n\n```{r, version = \"R\"}\ndf <- df %>%\n mutate(\n Color = factor(Color)\n )\n\ndf %>% summary()\n```\n\n%%%\n\n%%% version: python\n\nThe \"Color\" variable is being treated as an \"object\" variable,\ni.e., just an ordinary word.\n\nBut we know it should be *categorical*, aka a `category` variable.\nLet's *retype* the variable to fix this:\n\n%%%\n\n```{python, version = \"python\"}\nkelly_df['Gender'] = kelly_df['Gender'].astype('category')\nkelly_df.info()\n```\n````\n\n\n## Why it's useful\n\n- Keep the content creation all in one place - more **reproducible**!\n\n- Elements of the document can be **shared** - e.g. data descriptions, question prompts, css chunks\n\n- Give you **source files** to disseminate to students, not just *rendered files*.\n\n- (Also lets you do *student* and *solution* version, or *Exam A* and *Exam B*, etc.)\n\n# What's next for `templar` and Quarto?\n\n## Lua translation\n\n- **Parse** the source file text more elegantly\n\n- Match **syntax** to Quarto's\n\n- (`:::` instead of `%%%`)\n\n- (`#| version: R` instad of `{version = \"R}`)\n\n- Do you know Lua and `knitr`? Let's be friends.\n\n## Quarto's multi-output trick\n\nWhat it can do now:\n\n\n\n````default\n---\ntitle: \"My Versioned Doc\"\nformat: \n html:\n output-file: my_versioned_doc.html\n pdf:\n output-file: my_versioned_doc.pdf\n---\n\n::: {.content-visible when-format=\"html\"}\nClick here to expand!\n:::\n\n````\n\n\n## Quarto's multi-output trick\n\nWhat I want:\n\n\n\n````default\n---\ntitle: \"My Versioned Doc\"\nformat: \n html+R:\n output-file: handout-r.html\n html+python:\n output-file: handout-python.html\n---\n\n::: {.content-visible when-variant=\"R\"}\nThe function `mutate()` will add a new variable.\n:::\n````\n\n\n## Resources\n\nInstall the `templar` package:\n\n\n::: {.cell}\n\n```{.r .cell-code}\nremotes::install_github(\"r-for-educators/templar\")\n```\n:::\n\n\n**Co-author: Ian Flores Siaca**\n\nContribute at [www.github.com/r-for-educators/templar](www.github.com/r-for-educators/templar)\n\nExamples of course materials generated with templar:\n\n\n\n# Thank You!\n\nFind me:\n\n**Email:** kbodwin\\@calpoly.edu\n\n**Website:** [www.kelly-bodwin.com](www.kelly-bodwin.com)\n\n**GitHub:** kbodwin\n\n**Mastodon:** kellybodwin\\@mastodon.social\n\n**Threads:** @kellbod\n", 5 | "supporting": [], 6 | "filters": [ 7 | "rmarkdown/pagebreak.lua" 8 | ], 9 | "includes": { 10 | "include-after-body": [ 11 | "\n\n\n" 12 | ] 13 | }, 14 | "engineDependencies": {}, 15 | "preserve": {}, 16 | "postProcess": true 17 | } 18 | } -------------------------------------------------------------------------------- /_freeze/talks/5-teaching-materials/quarto-teaching-materials/execute-results/html.json: -------------------------------------------------------------------------------- 1 | { 2 | "hash": "734537b5b0fb1eda5833f847048dc182", 3 | "result": { 4 | "markdown": "---\ntitle: \"Using Quarto for Making and Organizing Teaching Materials\"\nsubtitle: \"Joint Statistical Meeting\"\nauthor: \"Maria Tackett\"\ndate: \"August 7, 2023\"\ndate-format: long\nfooter: \"[🔗 bit.ly/teach-quarto](https://bit.ly/teach-quarto)\"\nformat: \n revealjs:\n theme: quarto-teaching-materials.scss\n slide-number: false\n incremental: false \n chalkboard: \n theme: whiteboard\n code-link: true\nexecute: \n eval: true\n echo: true\neditor: visual\n---\n\n\n## Outline\n\n\n\n\n\n- Why use Quarto to make teaching materials?\n\n- What teaching materials can I create using Quarto?\n\n- How do I get started?\n\n# Why use Quarto to make teaching materials? {background-color=\"#993399\"}\n\n## Benefits for instructor\n\n- Reproducible course materials that are easier to update\n\n- Integrate narrative, executable R code, images, and interactive elements\n\n- Easily share course materials with students and more broadly\n\n- Regularly use the same technology as your students\n\n## Benefits for students\n\n- Navigation menu on all documents to easily to find content\n\n- Search capabilities on website to more easily find content by topic\n\n- Option to export PDF of slides\n\n- Read course materials on multiple devices\n\n# What teaching materials can I create using Quarto? {background-color=\"#993399\"}\n\n## Teaching materials in Quarto {.incremental}\n\n::: columns\n::: {.column .fragment width=\"45%\" fragment-index=\"1\"}\n**Course websites**\n\n![](img/sta210-website.png){width=\"2973\"}\n:::\n\n::: {.column width=\"5%\"}\n:::\n\n::: {.column .fragment width=\"45%\" fragment-index=\"2\"}\n**Slides**\n\n![](img/sta210-slide.png){width=\"2854\"}\n:::\n:::\n\n## Teaching materials in Quarto {.incremental}\n\n::: columns\n::: {.column .fragment width=\"45%\" fragment-index=\"1\"}\n**Long-form notes**\n\n![](img/sta210-long-notes.png)\n:::\n\n::: {.column width=\"5%\"}\n:::\n\n::: {.column .fragment width=\"45%\" fragment-index=\"2\"}\n**Assignment instructions**\n\n![](img/sta210-assignment.png)\n:::\n:::\n\n# Slides\n\n## Slide menu\n\n- Slide navigation\n\n- Print to PDF\n\n- Speaker view\n\n- Annotation\n\n- Chalkboard\n\n## Slide with code + output\n\n::: columns\n::: {.column width=\"50%\"}\n**Published slide**\n\n![](img/python-slide.png)\n:::\n\n::: {.column width=\"50%\"}\n**Source code**\n\n![](img/python-slide-code.png)\n:::\n:::\n\n::: aside\nSource: [SciPy lecture](https://sta663-sp23.github.io/slides/Lec07.html#/title-slide) by Colin Rundel\n:::\n\n## Slide with mathematical notation\n\n::: columns\n::: {.column width=\"50%\"}\n**Published slide**\n\n![](img/sta210-slide.png)\n:::\n\n::: {.column width=\"50%\"}\n**Source code**\n\n![](img/sta210-slide-code.png)\n:::\n:::\n\n::: aside\nSource: [SLR: Mathematical models for inference](https://sta210-fa22.netlify.app/slides/07-slr-math-models#/mathematical-representation-of-the-model) by Maria Tackett\n:::\n\n# Websites\n\n## Navigating course website\n\n\n{{< video https://youtu.be/dPDXbKGoFus width=\"700\" height=\"400\" >}}\n\n\n\n::: aside\n[Introduction to Data Science](https://sta199-f22-1.github.io/) taught by Mine Çetinkaya-Rundel\n:::\n\n## Example website file structure\n\n
![](img/file-structure-annoated.png){width=\"451\"}
\n\n## Interactive documents with webR\n\n::: midi\n*\"Run R code in the browser without the need for an R server to execute the code\"*\n:::\n\n\n{{< video https://youtu.be/Kb_5GM3aUSk width=\"700\" height=\"400\" >}}\n\n\n\n::: aside\nwebR demo: [maria.quarto.pub/webr-demo](https://maria.quarto.pub/webr-demo/)\n:::\n\n## webR source code\n\n**YAML**\n\n\n::: {.cell layout-align=\"center\"}\n\n```{.r .cell-code code-line-numbers=\"2|3|4,5|6,7,8,9\"}\n---\ntitle: \"webR document\"\nformat: html\nfilters:\n - webr\nwebr:\n packages: ['dplyr', 'ggplot2']\n Cross-Origin-Opener-Policy: same-origin\n Cross-Origin-Embedder-Policy: require-corp\n---\n```\n:::\n\n\n. . .\n\n**Executable code chunk**\n\n\n::: {.cell layout-align=\"center\"}\n\n```{.r .cell-code}\n{webr-r}\nmpg |>\n count(manufacturer, _____)\n```\n:::\n\n\n------------------------------------------------------------------------\n\n# \n\n
\n\n::: callout-caution\nWebR is in active development. Learn more at [github.com/coatless/quarto-webr](https://github.com/coatless/quarto-webr)\n:::\n\n
\n\n# How do I get started? {background-color=\"#993399\"}\n\n## Getting started: slides + documents\n\n::: panel-tabset\n## Basic\n\n\n::: {.cell layout-align=\"center\"}\n\n```{.r .cell-code}\n---\ntitle: \"Lecture 01\"\nsubtitle: \"Statistics 101\"\nauthor: \"Instructor\"\ndate: \"August 7, 2023\"\nformat: revealjs\n---\n```\n:::\n\n\n::: callout-tip\nEasily produce multiple types of documents by changing the `format` in the YAML.\n:::\n\n## Customized\n\n\n::: {.cell layout-align=\"center\"}\n\n```{.r .cell-code}\n---\ntitle: \"Lecture 01\"\nsubtitle: \"Statistics 101\"\nauthor: \"Instructor\"\ndate: \"August 7, 2023\"\ndate-format: long\nfooter: \"URL to course website\"\nformat: \n revealjs:\n theme: slides.scss\n transition: fade\n slide-number: false\n incremental: false \n chalkboard: \n code-link: true\neditor: visual\nexecute: \n eval: true\n echo: true\n---\n```\n:::\n\n:::\n\n## Getting started: websites\n\n- Make a website repo on GitHub\n\n- Clone the repo and start a new RStudio project\n\n- Run the following code in the **Terminal**\n\n ``` \n quarto create-project --type website\n ```\n\nYou will see the standard files for a new website in the **Files** pane. See [Creating a Website](https://quarto.org/docs/websites/) on quarto.org for more information.\n\n## Publishing materials\n\nRun the following code in the **Terminal**\n\n**GitHub pages**\n\n``` \nquarto publish gh-pages\n```\n\n**Quarto pub**\n\n``` \nquarto publish quarto-pub\n```\n\n**Netlify**\n\n``` \nquarto publish netlify\n```\n\n
\n\nSee [Publishing Basics](https://quarto.org/docs/publishing/) on quarto.org for more information and publishing options.\n\n## Course websites created with Quarto\n\n- Introduction to Data Science, Elijah Meyer\n - \\[[website](https://sta199-summer-1.github.io/)\\]\\[[GitHub repo](https://github.com/sta199-summer-1/sta199-summer-1.github.io)\\]\n- Regression Analysis, Maria Tackett\n - \\[[website](https://sta210-fa22.netlify.app/)\\]\\[[GitHub repo](https://github.com/sta210-fa22/website)\\]\n- Advanced Data Visualization, Mine Çetinkaya-Rundel\n - \\[[website](https://vizdata.org/)\\]\\[[GitHub repo](https://github.com/vizdata-s23/vizdata-s23)\\]\n- Applied Experimental Design and Regression Models, Allison Theobold\n - \\[[website](https://atheobold.github.io/stat-313-website/)\\]\\[[Github repo](https://github.com/atheobold/stat-313-website)\\]\n\n## Course slides created with Quarto\n\n- Statistical Computing and Computation, Colin Rundel\n\n - \\[[website](https://sta663-sp23.github.io/)\\]\\[[GitHub repo](https://github.com/sta663-sp23/sta663-sp23.github.io)\\]\n\n- Statistical Learning with R, Kelly Bodwin\n\n - \\[[GitHub repo](https://github.com/Statistical-Learning-with-R)\\]\n\n## Learn more!\n\n- [*Organizing Teaching Materials*](https://rstudio-conf-2022.github.io/teach-ds/modules/d2-08-organizing.html) by Maria Tackett & Mine Çetinkaya-Rundel\n\n- [*Reproducible documents, presentations, and websites with Quarto*](https://atheobold.github.io/uscots-quarto/) by Hunter Glanz, Emily Robinson & Allison Theobold\n\n- [*Hello Quarto: Share, Collaborate, Teach, Reimagine*](https://www.youtube.com/watch?v=p7Hxu4coDl8) by Mine Çetinkaya-Rundel & Julia Lowndes\n\n- [quarto.org](https://quarto.org)\n\n# Thank you! {background-color=\"#993399\"}\n\n🔗 [bit.ly/teach-quarto](https://bit.ly/teach-quarto){style=\"color: white\"}\n\n💻 [github.com/mine-cetinkaya-rundel/teach-with-quarto](https://github.com/mine-cetinkaya-rundel/teach-with-quarto){style=\"color: white\"}\n\n📧 [maria.tackett\\@duke.edu](mailto:maria.tackett@duke.edu){style=\"color: white\"}\n", 5 | "supporting": [], 6 | "filters": [ 7 | "rmarkdown/pagebreak.lua" 8 | ], 9 | "includes": { 10 | "include-after-body": [ 11 | "\n\n\n" 12 | ] 13 | }, 14 | "engineDependencies": {}, 15 | "preserve": {}, 16 | "postProcess": true 17 | } 18 | } -------------------------------------------------------------------------------- /_quarto.yml: -------------------------------------------------------------------------------- 1 | project: 2 | type: website 3 | resources: 4 | - talks/1-welcome/welcome.scss 5 | 6 | website: 7 | #logo: jsm-logo.png 8 | repo-url: https://github.com/mine-cetinkaya-rundel/teach-with-quarto 9 | repo-actions: [edit, issue] 10 | navbar: 11 | logo: jsm-logo.png 12 | search: true 13 | left: 14 | - href: index.qmd 15 | text: Home 16 | tools: 17 | - icon: github 18 | href: https://github.com/mine-cetinkaya-rundel/teach-with-quarto 19 | 20 | format: 21 | html: 22 | theme: cosmo 23 | toc: true 24 | 25 | editor: visual 26 | 27 | execute: 28 | freeze: auto 29 | -------------------------------------------------------------------------------- /index.qmd: -------------------------------------------------------------------------------- 1 | --- 2 | title: Teaching (with) Quarto 3 | subtitle: JSM 2023 4 | listing: 5 | contents: talks/*/index.qmd 6 | fields: [image, title, author, subtitle] 7 | type: grid 8 | sort: 9 | - filename 10 | --- 11 | 12 | ![](jsm-logo.png){style="float: right;" fig-alt="JSM 2023 Logo" width="150"} 13 | 14 | Monday, Aug 7\ 15 | 2:00 PM - 3:50 PM\ 16 | [Session \# 1797](https://ww2.aievolution.com/JSMAnnual/index.cfm?do=ev.viewEv&ev=2605) \ 17 | Metro Toronto Convention Centre Room: CC-803B 18 | 19 | ## Homepage 20 | 21 | All session materials can be viewed at . The GitHub repo that serves this site, , contains the source code for all presentations. 22 | 23 | ## Overview 24 | 25 | Quarto is an open-source scientific and technical publishing system that unifies and extends the R Markdown ecosystem. This session features five speakers who have been using and teaching R Markdown over the last decade and who have adopted Quarto over the last two years. The speakers will share their experiences teaching Quarto to students in a wide range of courses that span from first-year introductory data science to Master's level statistical computing courses. The talks will also touch on multiple languages and tools as these courses teach R and Python using both RStudio and Jupyter Notebooks. The educators will also discuss building course materials with Quarto, using Quarto for standardizing and organizing student work, as well as for academic authoring broadly. The session will conclude with a discussion on the importance of teaching reproducible computing early and often as well as tips for educators for adopting and teaching new tools and technologies in a constantly evolving landscape. 26 | 27 | **Session chair:** [Allison Theobold](https://statistics.calpoly.edu/allison-theobold) - Cal Poly 28 | 29 | **Session organizer:** [Mine Çetinkaya-Rundel](https://mine-cr.com/) - Duke University + Posit 30 | 31 | ## Talks 32 | -------------------------------------------------------------------------------- /jsm-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mine-cetinkaya-rundel/teach-with-quarto/f8b6ebed58ec9ebd2501643d06b5cd4b20449246/jsm-logo.png -------------------------------------------------------------------------------- /talks/1-welcome/featured.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mine-cetinkaya-rundel/teach-with-quarto/f8b6ebed58ec9ebd2501643d06b5cd4b20449246/talks/1-welcome/featured.png -------------------------------------------------------------------------------- /talks/1-welcome/images/hello-quarto.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mine-cetinkaya-rundel/teach-with-quarto/f8b6ebed58ec9ebd2501643d06b5cd4b20449246/talks/1-welcome/images/hello-quarto.png -------------------------------------------------------------------------------- /talks/1-welcome/images/horst-teach-quarto.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mine-cetinkaya-rundel/teach-with-quarto/f8b6ebed58ec9ebd2501643d06b5cd4b20449246/talks/1-welcome/images/horst-teach-quarto.png -------------------------------------------------------------------------------- /talks/1-welcome/images/horst_meteor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mine-cetinkaya-rundel/teach-with-quarto/f8b6ebed58ec9ebd2501643d06b5cd4b20449246/talks/1-welcome/images/horst_meteor.png -------------------------------------------------------------------------------- /talks/1-welcome/images/horst_qmd_render_schema.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mine-cetinkaya-rundel/teach-with-quarto/f8b6ebed58ec9ebd2501643d06b5cd4b20449246/talks/1-welcome/images/horst_qmd_render_schema.png -------------------------------------------------------------------------------- /talks/1-welcome/images/horst_quarto_schematic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mine-cetinkaya-rundel/teach-with-quarto/f8b6ebed58ec9ebd2501643d06b5cd4b20449246/talks/1-welcome/images/horst_quarto_schematic.png -------------------------------------------------------------------------------- /talks/1-welcome/images/quarto-blog.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mine-cetinkaya-rundel/teach-with-quarto/f8b6ebed58ec9ebd2501643d06b5cd4b20449246/talks/1-welcome/images/quarto-blog.png -------------------------------------------------------------------------------- /talks/1-welcome/images/quarto-org.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mine-cetinkaya-rundel/teach-with-quarto/f8b6ebed58ec9ebd2501643d06b5cd4b20449246/talks/1-welcome/images/quarto-org.png -------------------------------------------------------------------------------- /talks/1-welcome/images/source-editor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mine-cetinkaya-rundel/teach-with-quarto/f8b6ebed58ec9ebd2501643d06b5cd4b20449246/talks/1-welcome/images/source-editor.png -------------------------------------------------------------------------------- /talks/1-welcome/images/thank-you.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mine-cetinkaya-rundel/teach-with-quarto/f8b6ebed58ec9ebd2501643d06b5cd4b20449246/talks/1-welcome/images/thank-you.png -------------------------------------------------------------------------------- /talks/1-welcome/images/visual-editor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mine-cetinkaya-rundel/teach-with-quarto/f8b6ebed58ec9ebd2501643d06b5cd4b20449246/talks/1-welcome/images/visual-editor.png -------------------------------------------------------------------------------- /talks/1-welcome/images/yaml-less.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mine-cetinkaya-rundel/teach-with-quarto/f8b6ebed58ec9ebd2501643d06b5cd4b20449246/talks/1-welcome/images/yaml-less.png -------------------------------------------------------------------------------- /talks/1-welcome/images/yaml-more.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mine-cetinkaya-rundel/teach-with-quarto/f8b6ebed58ec9ebd2501643d06b5cd4b20449246/talks/1-welcome/images/yaml-more.png -------------------------------------------------------------------------------- /talks/1-welcome/index.qmd: -------------------------------------------------------------------------------- 1 | --- 2 | title: "Welcome to Quarto: From course notes to journal articles to books" 3 | subtitle: "2:05 - 2:25" 4 | author: Mine Çetinkaya-Rundel 5 | image: featured.png 6 | description: Introduce Quarto from the lens of an educator, highlighting aspects of Quarto that facilitate teaching and learning reproducible data science as well as that improve the lives of educators. 7 | --- 8 | 9 | ## Abstract 10 | 11 | Quarto is a reproducible authoring system that unifies and extends the R Markdown ecosystem and enables you to weave together your code and prose to create documents, presentations, websites, books, and even journal articles. In this talk we will introduce Quarto from the lens of an educator, highlighting aspects of Quarto that facilitate teaching and learning reproducible data science as well as that improve the lives of educators. 12 | 13 | ## Slides 14 | 15 | ```{=html} 16 | 17 | ``` 18 | ## Links 19 | 20 | - Demo document, slides, and website repo: 21 | 22 | - Manuscript repo: 23 | 24 | ## Speaker 25 | 26 | ![](mine.jpeg){style="float: right; padding-left: 10px;" fig-alt="Photo of Mine Çetinkaya-Rundel" width="300"} 27 | 28 | [Mine Çetinkaya-Rundel](https://mine-cr.com/) is Professor of the Practice at Duke University and Developer Educator at RStudio. Mine's work focuses on innovation in statistics and data science pedagogy, with an emphasis on computing, reproducible research, student-centered learning, and open-source education as well as pedagogical approaches for enhancing retention of women and under-represented minorities in STEM. Mine works on integrating computation into the undergraduate statistics curriculum, using reproducible research methodologies and analysis of real and complex datasets. Mine works on the OpenIntro project, whose mission is to make educational products that are free, transparent, and lower barriers to education. As part of this project she co-authored four open-source introductory statistics textbooks. She is also the creator and maintainer of datasciencebox.org and she teaches the popular Statistics with R MOOC on Coursera. Mine is a Fellow of the ASA and Elected Member of the ISI as well as the winner of the 2021 Robert V. Hogg Award for For Excellence in Teaching Introductory Statistics. In 2023, she is the Chair of the ASA Section on Statistical Computing. 29 | -------------------------------------------------------------------------------- /talks/1-welcome/mine.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mine-cetinkaya-rundel/teach-with-quarto/f8b6ebed58ec9ebd2501643d06b5cd4b20449246/talks/1-welcome/mine.jpeg -------------------------------------------------------------------------------- /talks/1-welcome/welcome.qmd: -------------------------------------------------------------------------------- 1 | --- 2 | title: Welcome to Quarto 3 | subtitle: From course notes to journal articles to books 4 | author: Mine Çetinkaya-Rundel 5 | institution: Duke University + Posit 6 | date: 2023-08-06 7 | footer: "[🔗 bit.ly/teach-quarto](https://bit.ly/teach-quarto)" 8 | title-slide-attributes: 9 | data-background-image: images/horst-teach-quarto.png 10 | data-background-size: stretch 11 | data-background-opacity: "0.8" 12 | format: 13 | revealjs: 14 | theme: welcome.scss 15 | multiplex: true 16 | transition: fade 17 | embed-resources: true 18 | execute: 19 | echo: true 20 | --- 21 | 22 | # What is Quarto? 23 | 24 | ## Quarto ... 25 | 26 | - is a new, open-source, scientific, and technical publishing system 27 | - aims to make the process of creating and collaborating dramatically better 28 | 29 | ![Artwork from "Hello, Quarto" keynote by Julia Lowndes and Mine Çetinkaya-Rundel, presented at RStudio Conference 2022. Illustrated by Allison Horst.](images/horst_quarto_schematic.png){fig-alt="A schematic representing the multi-language input (e.g. Python, R, Observable, Julia) and multi-format output (e.g. PDF, html, Word documents, and more) versatility of Quarto." fig-align="center"} 30 | 31 | ## Quarto ... {.center auto-animate="true"} 32 | 33 | **unifies** + **extends** the R Markdown ecosystem 34 | 35 | ## Quarto ... {.center auto-animate="true"} 36 | 37 | **unifies** + **extends** the R Markdown ecosystem 38 | 39 |
40 | 41 | **unifies** for people who love R Markdown 42 | 43 | ## Quarto ... {.center auto-animate="true"} 44 | 45 | **unifies** + **extends** the R Markdown ecosystem 46 | 47 |
48 | 49 | **unifies** for people who love R Markdown 50 | 51 | **extends** for people who don't know R Markdown 52 | 53 | ## Quarto unifies + extends R Markdown 54 | 55 | ::: incremental 56 | - Consistent implementation of attractive and handy features across outputs: tabsets, code-folding, syntax highlighting, etc. 57 | - More accessible defaults as well as better support for accessibility 58 | - Guardrails, particularly helpful for new learners: YAML completion, informative syntax errors, etc. 59 | - Support for other languages like Python, Julia, Observable, and more via Jupyter engine for executable code chunks. 60 | ::: 61 | 62 | ## Quarto, in a nutshell 63 | 64 | ```{=html} 65 |
66 | ``` 67 | # Anatomy of a Quarto document 68 | 69 | ## YAML 70 | 71 | Document metadata 72 | 73 | ::: columns 74 | ::: {.column width="50%"} 75 | ``` yaml 76 | title: "Hello, Penguins!" 77 | format: html 78 | editor: visual 79 | ``` 80 | ::: 81 | 82 | ::: {.column width="50%"} 83 | ![](images/yaml-less.png){fig-alt="Rendered YAML with title (Hello, Penguins!)."} 84 | ::: 85 | ::: 86 | 87 | . . . 88 | 89 | ::: columns 90 | ::: {.column width="50%"} 91 | ``` yaml 92 | title: "Hello, Penguins!" 93 | author: Mine Çetinkaya-Rundel 94 | institute: Duke University 95 | date: now 96 | ... 97 | format: html 98 | editor: visual 99 | ``` 100 | ::: 101 | 102 | ::: {.column width="50%"} 103 | ![](images/yaml-more.png){fig-alt="Rendered YAML with title (Hello, Penguins!), author (Mine Çetinkaya-Rundel), affiliation (Duke University), and published date (August 7, 2023)"} 104 | ::: 105 | ::: 106 | 107 | ## Text 108 | 109 | Markdown, that can be edited with any editor, including RStudio's source or visual editors. 110 | 111 | ::: columns 112 | ::: {.column width="50%"} 113 | ![](images/source-editor.png){fig-alt="Top of the document titled penguins.qmd in the RStudio source editor, including YAML, headings, text, and a code chunk for loading packages."} 114 | ::: 115 | 116 | ::: {.column width="50%"} 117 | ![](images/visual-editor.png){fig-alt="Top of the document titled penguins.qmd in the RStudio visual editor, including YAML, headings, text, and a code chunk for loading packages."} 118 | ::: 119 | ::: 120 | 121 | ## Code 122 | 123 | - R code chunks executed with **knitr**: `{r}` 124 | 125 | - Python, Julia, and Observable chunks executed with **jupyter**: `{python}` 126 | 127 | # Quarto + various document types 128 | 129 | ## Documents 130 | 131 | ```{=html} 132 |
133 | ``` 134 | ::: notes 135 | - Bold palmerpenguins and add link to 136 | - Add code chunk options with YAML completion: 137 | - fig-alt 138 | - code-fold 139 | - echo: fenced 140 | - Annotate table making code \# \<1\> 141 | 1. Take `penguins` data frame , and then, \# \<2\> 142 | 2. Slice the top 10 rows, and then, \# \<3\> 143 | 3. Select the variables indicates, and then, \# \<4\> 144 | 4. Make a gt table 145 | - Add code-annotation: hover to YAML, and then change to code-annotation: select, and then remove 146 | - Add a citation: 10.1371/journal.pone.0090081 to palmerpenguins 147 | - Make document PDF 148 | ::: 149 | 150 | ## Slides 151 | 152 | ```{=html} 153 |
154 | ``` 155 | ::: notes 156 | - Change format: revealjs 157 | 158 | - Add section headings: First level headings Introduction and Analysis, under Analysis a second level heading called Modeling 159 | 160 | - Add columns to slides 161 | 162 | - Reveal code with echo: true 163 | 164 | - teaching-tip: code-line-numbers 165 | 166 | - Change output-location of figure 167 | ::: 168 | 169 | ## Websites 170 | 171 | ```{=html} 172 |
173 | ``` 174 | ::: notes 175 | - Add Quarto file and call it index.qmd 176 | 177 | - Add \_quarto.yml 178 | 179 | - Restart project 180 | 181 | - Build Tab \> Render Website 182 | ::: 183 | 184 | ## Publications 185 | 186 | - You can already write reproducible journal articles with Quarto (like you could with the **rticles** and similar packages and R Markdown), and an ASA template is available! 187 | 188 | - You can now also write fully reproducible `manuscripts` with embedded computation and render to multiple formats! 189 | 190 | ::: callout-warning 191 | ## Quarto 1.4 192 | 193 | The `manuscript` project type is available in Quarto 1.4. Pre-release now available, release coming soon! 194 | ::: 195 | 196 | ## Manuscripts 197 | 198 | ```{=html} 199 |
200 | ``` 201 | # Parting remarks 202 | 203 | ## Quarto CLI... 204 | 205 | orchestrates each step of rendering 206 | 207 | ![Artwork from "Hello, Quarto" keynote by Julia Lowndes and Mine Çetinkaya-Rundel, presented at RStudio Conference 2022. Illustrated by Allison Horst.](images/horst_qmd_render_schema.png){fig-alt="A schematic representing rendering of Quarto documents from .qmd, to knitr or jupyter, to plain text markdown, then converted by pandoc into any number of output types including html, PDF, or Word document."} 208 | 209 | ## Learning more 210 | 211 | [https://quarto.org](https://quarto.org/) 212 | 213 | ![](images/quarto-org.png){fig-alt="Screenshot of quarto.org" fig-align="center" width="1000"} 214 | 215 | ## Follow up with... 216 | 217 | the Quarto Blog: 218 | 219 | ![](images/quarto-blog.png){fig-alt="Screenshot of Quarto Blog" fig-align="center" width="1000"} 220 | 221 | ## Thank you! {background-image="images/thank-you.png"} 222 | 223 | 🔗 [bit.ly/teach-quarto](https://bit.ly/teach-quarto) 224 | 225 | 🐘 [fosstodon.org/\@minecr](https://fosstodon.org/@minecr) 226 | 227 | ✉️ [mc301\@duke.edu](mailto:mc301@duke.edu) 228 | -------------------------------------------------------------------------------- /talks/1-welcome/welcome.scss: -------------------------------------------------------------------------------- 1 | /*-- scss:defaults --*/ 2 | 3 | // fonts 4 | @import 'https://fonts.googleapis.com/css2?family=Atkinson+Hyperlegible&display=swap'; 5 | 6 | $font-family-sans-serif: "Atkinson Hyperlegible", sans-serif; 7 | $presentation-heading-color: #556e87; 8 | $presentation-font-size-root: 36px; 9 | $code-block-font-size: 0.7em; 10 | $link-color: #556e87; 11 | 12 | /*-- scss:rules --*/ 13 | 14 | #title-slide .subtitle { 15 | color: #F0F0F0; 16 | background-color: #556e8780; 17 | font-size: 1.4em; 18 | } 19 | 20 | #title-slide .title { 21 | color: #F0F0F0; 22 | background-color: #556e8780; 23 | } 24 | 25 | #title-slide .quarto-title-authors { 26 | color: #F0F0F0; 27 | background-color: #556e8780; 28 | } 29 | 30 | #title-slide .date { 31 | color: #F0F0F0; 32 | background-color: #556e8780; 33 | } 34 | 35 | details>summary { 36 | font-size: 0.75em; 37 | } 38 | 39 | .smaller { 40 | font-size: 0.5em; 41 | } 42 | 43 | .small { 44 | font-size: 0.75em; 45 | } 46 | 47 | .larger { 48 | font-size: 1.5em; 49 | } 50 | 51 | .largest { 52 | font-size: 3em; 53 | } 54 | 55 | .reveal countdown { 56 | position: fixed; 57 | bottom: 0em; 58 | right: 0em; 59 | font-size: 40px; 60 | border: 2px solid; 61 | border-radius: 5px; 62 | padding-left: 12px; 63 | padding-right: 12px; 64 | user-select: none; 65 | } 66 | -------------------------------------------------------------------------------- /talks/2-intro-ds/elijah.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mine-cetinkaya-rundel/teach-with-quarto/f8b6ebed58ec9ebd2501643d06b5cd4b20449246/talks/2-intro-ds/elijah.png -------------------------------------------------------------------------------- /talks/2-intro-ds/featured.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mine-cetinkaya-rundel/teach-with-quarto/f8b6ebed58ec9ebd2501643d06b5cd4b20449246/talks/2-intro-ds/featured.png -------------------------------------------------------------------------------- /talks/2-intro-ds/images/ChunkArguments.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mine-cetinkaya-rundel/teach-with-quarto/f8b6ebed58ec9ebd2501643d06b5cd4b20449246/talks/2-intro-ds/images/ChunkArguments.png -------------------------------------------------------------------------------- /talks/2-intro-ds/images/YAML.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mine-cetinkaya-rundel/teach-with-quarto/f8b6ebed58ec9ebd2501643d06b5cd4b20449246/talks/2-intro-ds/images/YAML.png -------------------------------------------------------------------------------- /talks/2-intro-ds/images/ae-demo.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mine-cetinkaya-rundel/teach-with-quarto/f8b6ebed58ec9ebd2501643d06b5cd4b20449246/talks/2-intro-ds/images/ae-demo.gif -------------------------------------------------------------------------------- /talks/2-intro-ds/images/citation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mine-cetinkaya-rundel/teach-with-quarto/f8b6ebed58ec9ebd2501643d06b5cd4b20449246/talks/2-intro-ds/images/citation.png -------------------------------------------------------------------------------- /talks/2-intro-ds/images/code.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mine-cetinkaya-rundel/teach-with-quarto/f8b6ebed58ec9ebd2501643d06b5cd4b20449246/talks/2-intro-ds/images/code.png -------------------------------------------------------------------------------- /talks/2-intro-ds/images/commonanswer1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mine-cetinkaya-rundel/teach-with-quarto/f8b6ebed58ec9ebd2501643d06b5cd4b20449246/talks/2-intro-ds/images/commonanswer1.png -------------------------------------------------------------------------------- /talks/2-intro-ds/images/commonanswer2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mine-cetinkaya-rundel/teach-with-quarto/f8b6ebed58ec9ebd2501643d06b5cd4b20449246/talks/2-intro-ds/images/commonanswer2.png -------------------------------------------------------------------------------- /talks/2-intro-ds/images/commonanswer3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mine-cetinkaya-rundel/teach-with-quarto/f8b6ebed58ec9ebd2501643d06b5cd4b20449246/talks/2-intro-ds/images/commonanswer3.png -------------------------------------------------------------------------------- /talks/2-intro-ds/images/commonmistake1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mine-cetinkaya-rundel/teach-with-quarto/f8b6ebed58ec9ebd2501643d06b5cd4b20449246/talks/2-intro-ds/images/commonmistake1.png -------------------------------------------------------------------------------- /talks/2-intro-ds/images/commonmistake2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mine-cetinkaya-rundel/teach-with-quarto/f8b6ebed58ec9ebd2501643d06b5cd4b20449246/talks/2-intro-ds/images/commonmistake2.png -------------------------------------------------------------------------------- /talks/2-intro-ds/images/commonmistake3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mine-cetinkaya-rundel/teach-with-quarto/f8b6ebed58ec9ebd2501643d06b5cd4b20449246/talks/2-intro-ds/images/commonmistake3.png -------------------------------------------------------------------------------- /talks/2-intro-ds/images/crossref.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mine-cetinkaya-rundel/teach-with-quarto/f8b6ebed58ec9ebd2501643d06b5cd4b20449246/talks/2-intro-ds/images/crossref.png -------------------------------------------------------------------------------- /talks/2-intro-ds/images/crossref2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mine-cetinkaya-rundel/teach-with-quarto/f8b6ebed58ec9ebd2501643d06b5cd4b20449246/talks/2-intro-ds/images/crossref2.png -------------------------------------------------------------------------------- /talks/2-intro-ds/images/demo1.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mine-cetinkaya-rundel/teach-with-quarto/f8b6ebed58ec9ebd2501643d06b5cd4b20449246/talks/2-intro-ds/images/demo1.gif -------------------------------------------------------------------------------- /talks/2-intro-ds/images/demo2.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mine-cetinkaya-rundel/teach-with-quarto/f8b6ebed58ec9ebd2501643d06b5cd4b20449246/talks/2-intro-ds/images/demo2.gif -------------------------------------------------------------------------------- /talks/2-intro-ds/images/demodoc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mine-cetinkaya-rundel/teach-with-quarto/f8b6ebed58ec9ebd2501643d06b5cd4b20449246/talks/2-intro-ds/images/demodoc.png -------------------------------------------------------------------------------- /talks/2-intro-ds/images/doc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mine-cetinkaya-rundel/teach-with-quarto/f8b6ebed58ec9ebd2501643d06b5cd4b20449246/talks/2-intro-ds/images/doc.png -------------------------------------------------------------------------------- /talks/2-intro-ds/images/ezgif.com-crop.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mine-cetinkaya-rundel/teach-with-quarto/f8b6ebed58ec9ebd2501643d06b5cd4b20449246/talks/2-intro-ds/images/ezgif.com-crop.gif -------------------------------------------------------------------------------- /talks/2-intro-ds/images/figure-set.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mine-cetinkaya-rundel/teach-with-quarto/f8b6ebed58ec9ebd2501643d06b5cd4b20449246/talks/2-intro-ds/images/figure-set.gif -------------------------------------------------------------------------------- /talks/2-intro-ds/images/lines.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mine-cetinkaya-rundel/teach-with-quarto/f8b6ebed58ec9ebd2501643d06b5cd4b20449246/talks/2-intro-ds/images/lines.png -------------------------------------------------------------------------------- /talks/2-intro-ds/images/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mine-cetinkaya-rundel/teach-with-quarto/f8b6ebed58ec9ebd2501643d06b5cd4b20449246/talks/2-intro-ds/images/logo.png -------------------------------------------------------------------------------- /talks/2-intro-ds/images/logo_199.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mine-cetinkaya-rundel/teach-with-quarto/f8b6ebed58ec9ebd2501643d06b5cd4b20449246/talks/2-intro-ds/images/logo_199.png -------------------------------------------------------------------------------- /talks/2-intro-ds/images/message-complete.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mine-cetinkaya-rundel/teach-with-quarto/f8b6ebed58ec9ebd2501643d06b5cd4b20449246/talks/2-intro-ds/images/message-complete.gif -------------------------------------------------------------------------------- /talks/2-intro-ds/images/pnas.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mine-cetinkaya-rundel/teach-with-quarto/f8b6ebed58ec9ebd2501643d06b5cd4b20449246/talks/2-intro-ds/images/pnas.png -------------------------------------------------------------------------------- /talks/2-intro-ds/images/process.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mine-cetinkaya-rundel/teach-with-quarto/f8b6ebed58ec9ebd2501643d06b5cd4b20449246/talks/2-intro-ds/images/process.png -------------------------------------------------------------------------------- /talks/2-intro-ds/images/process2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mine-cetinkaya-rundel/teach-with-quarto/f8b6ebed58ec9ebd2501643d06b5cd4b20449246/talks/2-intro-ds/images/process2.png -------------------------------------------------------------------------------- /talks/2-intro-ds/images/process3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mine-cetinkaya-rundel/teach-with-quarto/f8b6ebed58ec9ebd2501643d06b5cd4b20449246/talks/2-intro-ds/images/process3.png -------------------------------------------------------------------------------- /talks/2-intro-ds/images/process4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mine-cetinkaya-rundel/teach-with-quarto/f8b6ebed58ec9ebd2501643d06b5cd4b20449246/talks/2-intro-ds/images/process4.png -------------------------------------------------------------------------------- /talks/2-intro-ds/images/process5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mine-cetinkaya-rundel/teach-with-quarto/f8b6ebed58ec9ebd2501643d06b5cd4b20449246/talks/2-intro-ds/images/process5.png -------------------------------------------------------------------------------- /talks/2-intro-ds/images/process6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mine-cetinkaya-rundel/teach-with-quarto/f8b6ebed58ec9ebd2501643d06b5cd4b20449246/talks/2-intro-ds/images/process6.png -------------------------------------------------------------------------------- /talks/2-intro-ds/images/project1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mine-cetinkaya-rundel/teach-with-quarto/f8b6ebed58ec9ebd2501643d06b5cd4b20449246/talks/2-intro-ds/images/project1.png -------------------------------------------------------------------------------- /talks/2-intro-ds/images/project2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mine-cetinkaya-rundel/teach-with-quarto/f8b6ebed58ec9ebd2501643d06b5cd4b20449246/talks/2-intro-ds/images/project2.png -------------------------------------------------------------------------------- /talks/2-intro-ds/images/projectvid.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mine-cetinkaya-rundel/teach-with-quarto/f8b6ebed58ec9ebd2501643d06b5cd4b20449246/talks/2-intro-ds/images/projectvid.gif -------------------------------------------------------------------------------- /talks/2-intro-ds/images/quarto1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mine-cetinkaya-rundel/teach-with-quarto/f8b6ebed58ec9ebd2501643d06b5cd4b20449246/talks/2-intro-ds/images/quarto1.png -------------------------------------------------------------------------------- /talks/2-intro-ds/images/quarto2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mine-cetinkaya-rundel/teach-with-quarto/f8b6ebed58ec9ebd2501643d06b5cd4b20449246/talks/2-intro-ds/images/quarto2.png -------------------------------------------------------------------------------- /talks/2-intro-ds/images/quarto_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mine-cetinkaya-rundel/teach-with-quarto/f8b6ebed58ec9ebd2501643d06b5cd4b20449246/talks/2-intro-ds/images/quarto_logo.png -------------------------------------------------------------------------------- /talks/2-intro-ds/images/quarto_visual.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mine-cetinkaya-rundel/teach-with-quarto/f8b6ebed58ec9ebd2501643d06b5cd4b20449246/talks/2-intro-ds/images/quarto_visual.png -------------------------------------------------------------------------------- /talks/2-intro-ds/images/quarto_visual2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mine-cetinkaya-rundel/teach-with-quarto/f8b6ebed58ec9ebd2501643d06b5cd4b20449246/talks/2-intro-ds/images/quarto_visual2.png -------------------------------------------------------------------------------- /talks/2-intro-ds/images/render.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mine-cetinkaya-rundel/teach-with-quarto/f8b6ebed58ec9ebd2501643d06b5cd4b20449246/talks/2-intro-ds/images/render.png -------------------------------------------------------------------------------- /talks/2-intro-ds/images/reproduce.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mine-cetinkaya-rundel/teach-with-quarto/f8b6ebed58ec9ebd2501643d06b5cd4b20449246/talks/2-intro-ds/images/reproduce.png -------------------------------------------------------------------------------- /talks/2-intro-ds/images/source.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mine-cetinkaya-rundel/teach-with-quarto/f8b6ebed58ec9ebd2501643d06b5cd4b20449246/talks/2-intro-ds/images/source.png -------------------------------------------------------------------------------- /talks/2-intro-ds/images/source2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mine-cetinkaya-rundel/teach-with-quarto/f8b6ebed58ec9ebd2501643d06b5cd4b20449246/talks/2-intro-ds/images/source2.png -------------------------------------------------------------------------------- /talks/2-intro-ds/images/text.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mine-cetinkaya-rundel/teach-with-quarto/f8b6ebed58ec9ebd2501643d06b5cd4b20449246/talks/2-intro-ds/images/text.png -------------------------------------------------------------------------------- /talks/2-intro-ds/images/visual.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mine-cetinkaya-rundel/teach-with-quarto/f8b6ebed58ec9ebd2501643d06b5cd4b20449246/talks/2-intro-ds/images/visual.png -------------------------------------------------------------------------------- /talks/2-intro-ds/images/visual2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mine-cetinkaya-rundel/teach-with-quarto/f8b6ebed58ec9ebd2501643d06b5cd4b20449246/talks/2-intro-ds/images/visual2.png -------------------------------------------------------------------------------- /talks/2-intro-ds/index.qmd: -------------------------------------------------------------------------------- 1 | --- 2 | title: Teaching Quarto in Introduction to Data Science Courses 3 | author: Elijah Meyer 4 | subtitle: "2:25 - 2:45" 5 | image: featured.png 6 | description: Share how Quarto is used in an Introductory Data Science course for students with little to no coding experience at Duke University. 7 | --- 8 | 9 | ## Abstract 10 | 11 | Quarto, the next-generation version of R Markdown, is a powerful tool that helps students be more of an active participant in class while simultaneously highlighting the importance of reproducibility in science. In this talk, we discuss how to facilitate the use of Quarto into classroom pedagogy for students who are learning the programming language R and Quarto at the same time. In combination with R, this tool can help instructions create interactive live-coding experiences for students. Features of Quarto provide multiple ways for students to write code and type written answers to questions on their own, in groups, or along with the instructor during lecture. Students can also learn to create their own project reports, and turn their projects into hosted websites. In this session, we share how Quarto is used in an Introductory Data Science course for students with little to no coding experience at Duke University. Further, we go into benefits and challenges of teaching with Quarto from both the instructor and student perspective. 12 | 13 | ## Slides 14 | 15 | ```{=html} 16 | 17 | ``` 18 | ## Speaker 19 | 20 | ![](elijah.png){style="float: right; padding-left: 10px;" fig-alt="Photo of Elijah Meyer" width="300"} 21 | 22 | Elijah Meyer ([elijah.meyer\@duke.edu](mailto:elijah.meyer@duke.edu)) is currently a teaching postdoctoral associate at Duke University. Taught Quarto in introductory data science at Duke the last fall, spring, and summer sessions. His work focuses on curricula and course creation, as well as studying how to best support newer instructor's use of active learning. 23 | -------------------------------------------------------------------------------- /talks/2-intro-ds/intro-ds.qmd: -------------------------------------------------------------------------------- 1 | --- 2 | title: "Teaching
in Introductory Data Science" 3 | title-slide-attributes: 4 | data-background-image: images/quarto_logo.png 5 | data-background-size: 31% 6 | data-background-position: 62% 18% 7 | author: "Dr. Elijah Meyer" 8 | institute: "Duke University" 9 | date: now 10 | format: 11 | revealjs: 12 | incremental: true 13 | slide-number: c 14 | show-slide-number: all 15 | theme: [dark, intro-ds.scss] 16 | embed-resources: true 17 | bibliography: references.bib 18 | --- 19 | 20 | ## Outline 21 | 22 | ::: nonincremental 23 | 1. How 24 | 25 | 2. Benefits 26 | ::: 27 | 28 | ## How: Application Exercises 29 | 30 | ![](images/ae-demo.gif){width="1000" height="600"} 31 | 32 | ## When First Teaching 33 | 34 | - Stick to "what's familiar" 35 | 36 | - Stick to "basics" 37 | 38 | ## Visual vs Source Tab 39 | 40 | ::: {#fig-R2 layout-ncol="2"} 41 | ![](images/source2.png){#fig-s width="1000"} 42 | 43 | ![](images/visual2.png){#fig-v width="1000"} 44 | 45 | Source (a) vs Visual (b) 46 | ::: 47 | 48 | ## Quarto Layout 49 | 50 | ![](images/quarto2.png){fig-align="center" width="1000"} 51 | 52 | ## Quarto as a Teaching Tool 53 | 54 | Once students have the layout...Lean into what Quarto has to offer 55 | 56 | - Informative Syntax and Completion 57 | 58 | - Informative Error Messages 59 | 60 | ## Informative Syntax and Completion 61 | 62 | ![](images/figure-set.gif){width="1000" height="600"} 63 | 64 | ## Informative Errors and Common Mistakes 65 | 66 | Approachability of Quarto error messages alleviates some tension in an intro class 67 | 68 | ## Missing Syntax 69 | 70 | ```{{r}} 71 | #| label: plot1 72 | #| warning false 73 | ``` 74 | 75 | . . . 76 | 77 |
78 | 79 | In the **Background Jobs** pane: 80 | 81 | ``` bash 82 | Scanner error: while scanning a simple key at line 2, column 1 could not find 83 | expected : at line 3, column 1 84 | ``` 85 | 86 | ## Indentation Error 87 | 88 | ``` yaml 89 | title: "Demo Document" 90 | author: "Student 1" 91 | format: html 92 | editor: visual 93 | ``` 94 | 95 | . . . 96 | 97 |
98 | 99 | In the **Background Jobs** pane: 100 | 101 | ``` bash 102 | ERROR: YAMLError: bad indentation of a mapping entry at line 3, column 3: 103 | author: "Student 1" 104 | ^ 105 | ``` 106 | 107 | # How do we set this up? 108 | 109 | ## In-class activity 110 | 111 | Use well scaffolded Quarto documents 112 | 113 | - provide the code early 114 | 115 | - provide documentation 116 | 117 | - fill in the blank code 118 | 119 | - provide code with errors 120 | 121 | ## Suggestions: In-class activity 122 | 123 | ```{css echo=FALSE} 124 | .column { 125 | text-align: left; 126 | } 127 | ``` 128 | 129 | ::: columns 130 | ::: {.column width="50%"} 131 | Minimal chunk options 132 | 133 | ::: nonincremental 134 | - `label:` 135 | - `warning:` 136 | - `message:` 137 | - `echo:` 138 | - figure options 139 | ::: 140 | ::: 141 | 142 | ::: {.column width="50%"} 143 | Minimal YAML 144 | 145 | ::: nonincremental 146 | - `title:` 147 | - `author:` 148 | - `format:` 149 | - `editor:` 150 | ::: 151 | ::: 152 | ::: 153 | 154 | ## In-class activity 155 | 156 | Render early and often! 157 | 158 | ::: nonincremental 159 | - provide check points to build habit 160 | 161 | - [Example Application Exercise](https://github.com/ElijahMeyer3/demo-ae) 162 | ::: 163 | 164 | # Benefits 165 | 166 | ## From the student's perspective 167 | 168 | - Useful tool: Good habit to build for future coursework + career 169 | 170 | - Proof of work: A project they can take with them 171 | 172 | ## Project with Quarto 173 | 174 | ![](images/projectvid.gif){width="1000" height="600"} 175 | 176 | ## How we do it 177 | 178 | ![](images/project1.png){width="700" height="500"} 179 | 180 | ## How we do it 181 | 182 | ![](images/project2.png){width="700" height="500"} 183 | 184 | ## Project: Professional Document 185 | 186 | **R Markdown:** 187 | 188 | ```{r} 189 | #| eval: false 190 | #| echo: true 191 | knitr::opts_chunk$set(echo = FALSE) 192 | ``` 193 | 194 | . . . 195 | 196 |
197 | 198 | **Quarto:** Easier to get started and attempts to "smooth" the edges of R Markdown 199 | 200 | ```{r} 201 | #| eval: false 202 | #| echo: true 203 | title: "Project Title" 204 | execute: 205 | echo: false 206 | ``` 207 | 208 | ## From the instructor's perspective 209 | 210 | Efficiency 211 | 212 | - Reproducible lessons to adapt 213 | 214 | - Consistent formatting = easier grading 215 | 216 | ## Going Beyond 217 | 218 | Citations 219 | 220 | ![](images/citation.png){fig-align="center" width="1000"} 221 | 222 | ## In Summary 223 | 224 | - Start **minimal** and build up! 225 | 226 | - Continuously practice 227 | 228 | - Reproducibility becomes not optional 229 | 230 | - Know that the investment pays off 231 | 232 | # Questions 233 | 234 | ## Motivating Example 235 | 236 | ![Lack of Trust in Science [@fanelli2018]](images/pnas.png){fig-align="left" fig-alt="Crisis" width="730"} 237 | 238 | ## References 239 | -------------------------------------------------------------------------------- /talks/2-intro-ds/intro-ds.scss: -------------------------------------------------------------------------------- 1 | /*-- scss:defaults --*/ 2 | 3 | // fonts 4 | @import 'https://fonts.googleapis.com/css2?family=Atkinson+Hyperlegible&display=swap'; 5 | 6 | $font-family-sans-serif: "Atkinson Hyperlegible", sans-serif; 7 | $presentation-heading-color: #325b74; /* Pantone Midnight - Fall 2022 */ 8 | $presentation-title-slide-text-align: "left"; 9 | $link-color: #325b74; 10 | $code-block-font-size: 0.7em; 11 | 12 | /*-- scss:rules --*/ 13 | 14 | 15 | details>summary { 16 | font-size: 0.75em; 17 | } 18 | 19 | #title-slide .subtitle { 20 | color: #325b74; 21 | font-weight: bold 22 | } 23 | 24 | #title-slide .author { 25 | text-align: center; 26 | } 27 | 28 | #title-slide .institute { 29 | text-align: center; 30 | } 31 | 32 | #title-slide .date { 33 | text-align: left; 34 | 35 | } 36 | 37 | 38 | .small { 39 | font-size: 0.75em; 40 | } 41 | 42 | .reveal .slide .question { 43 | border-left: 3px solid #325b74; 44 | padding-left: 0.5em; 45 | padding-top: 0.25em; 46 | padding-bottom: 0.25em; 47 | background: #D9E3E4; 48 | } 49 | 50 | .reveal .slide .poll { 51 | border-left: 3px solid #fcd06b; /* Pantone Samoan Sun - Fall 2022 */ 52 | padding-left: 0.5em; 53 | padding-top: 0.25em; 54 | padding-bottom: 0.25em; 55 | background: #FFEDC2; 56 | } 57 | 58 | .reveal .slide .appex { 59 | border-left: 3px solid #1f7349; /* Pantone Amazon - Fall 2022 */ 60 | margin-top: 0.5em; 61 | margin-bottom: 0.5em; 62 | padding: 0.5em; 63 | background: #EBF7FF; 64 | } -------------------------------------------------------------------------------- /talks/2-intro-ds/references.bib: -------------------------------------------------------------------------------- 1 | 2 | @article{fanelli2018, 3 | title = {Is science really facing a reproducibility crisis, and do we need it to?}, 4 | author = {Fanelli, Daniele}, 5 | year = {2018}, 6 | month = {03}, 7 | date = {2018-03-12}, 8 | journal = {Proceedings of the National Academy of Sciences}, 9 | pages = {2628--2631}, 10 | volume = {115}, 11 | number = {11}, 12 | doi = {10.1073/pnas.1708272114}, 13 | url = {http://dx.doi.org/10.1073/pnas.1708272114}, 14 | langid = {en} 15 | } 16 | -------------------------------------------------------------------------------- /talks/3-r-python/featured.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mine-cetinkaya-rundel/teach-with-quarto/f8b6ebed58ec9ebd2501643d06b5cd4b20449246/talks/3-r-python/featured.png -------------------------------------------------------------------------------- /talks/3-r-python/images/global_opts_python.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mine-cetinkaya-rundel/teach-with-quarto/f8b6ebed58ec9ebd2501643d06b5cd4b20449246/talks/3-r-python/images/global_opts_python.png -------------------------------------------------------------------------------- /talks/3-r-python/index.qmd: -------------------------------------------------------------------------------- 1 | --- 2 | title: Blending R and Python in Quarto documents 3 | author: Kelly Bodwin 4 | subtitle: "2:45 - 3:05" 5 | image: featured.png 6 | description: 'Overview of the advantages and drawbacks of using Quarto for "bilingual" materials in the data science classroom as well as tips and tricks for managing these blended documents.' 7 | --- 8 | 9 | ## Abstract 10 | 11 | Data science teams are increasingly "multilingual", using more than one statistical computing tool for analyses and models. While many typesetting and notebook approaches support more than one language, Quarto is specifically designed for this flexibility. In particular, Quarto offers the ability to combine source code in both R and python into one single, reproducible document. These new capabilities have made it easier than ever to incorporate both languages simultaneously into statistics and data science courses. In this talk, I will give an overview of the advantages and drawbacks of using Quarto for "bilingual" materials in the data science classroom. I'll also offer some tips and tricks - as well as some helper scripts - for managing these blended documents. 12 | 13 | ## Slides 14 | 15 | ```{=html} 16 | 17 | ``` 18 | ## Links 19 | 20 | `templar` package: 21 | 22 | Example materials: 23 | 24 | ## Speaker 25 | 26 | ![](kelly-bodwin.jpg){style="float: right; padding-left: 10px;" fig-alt="Photo of Kelly Bodwin" fig-align="right" width="300"} 27 | 28 | Kelly Bodwin is an Associate Professor of Statistics and Data Science at Cal Poly, in San Luis Obispo, CA. Her research includes R package development, studies of statistical education, and applications in a variety of fields such as history, biology, and viticulture. While R will always be her first love, she is slowly learning to accept python into her life. 29 | -------------------------------------------------------------------------------- /talks/3-r-python/kelly-bodwin.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mine-cetinkaya-rundel/teach-with-quarto/f8b6ebed58ec9ebd2501643d06b5cd4b20449246/talks/3-r-python/kelly-bodwin.jpg -------------------------------------------------------------------------------- /talks/3-r-python/r-python.qmd: -------------------------------------------------------------------------------- 1 | --- 2 | title: "Bilingual Materials with Quarto" 3 | author: "Dr. Kelly Bodwin" 4 | institute: "California Polytechnic State University" 5 | date: now 6 | format: 7 | revealjs: 8 | incremental: true 9 | slide-number: c 10 | show-slide-number: all 11 | theme: sky 12 | embed-resources: true 13 | execute: 14 | eval: false 15 | echo: true 16 | --- 17 | 18 | # How does Quarto make python easier? 19 | 20 | ## Engine Setup 21 | 22 | In **R Markdown**, to use python, you had to set everything up **in R** using the *reticulate* package: 23 | 24 | ## {auto-animate="true"} 25 | 26 | ```{r} 27 | library(reticulate) 28 | ``` 29 | 30 | ## {auto-animate="true"} 31 | 32 | ```{r} 33 | library(reticulate) 34 | py_config() 35 | use_python("/usr/local/bin/python3") 36 | py_discover_config() 37 | ``` 38 | 39 | ## {auto-animate="true"} 40 | 41 | ```{r} 42 | library(reticulate) 43 | py_config() 44 | use_python("/usr/local/bin/python3") 45 | py_discover_config() 46 | 47 | ## You may need the code below if you are working on your home Windows computer: 48 | py_run_string("import os as os") 49 | py_run_string("os.environ['QT_QPA_PLATFORM_PLUGIN_PATH'] = 'C:/Users/kbodwin/Anaconda3/Library/plugins/platforms'") 50 | ``` 51 | 52 | ## {auto-animate="true"} 53 | 54 | ```{r} 55 | library(reticulate) 56 | py_config() 57 | use_python("/usr/local/bin/python3") 58 | py_discover_config() 59 | 60 | ## You may need the code below if you are working on your home Windows computer: 61 | py_run_string("import os as os") 62 | py_run_string("os.environ['QT_QPA_PLATFORM_PLUGIN_PATH'] = 'C:/Users/kbodwin/Anaconda3/Library/plugins/platforms'") 63 | 64 | reticulate::py_install("pandas") 65 | reticulate::py_install("scikit-learn") 66 | reticulate::py_install("scipy") 67 | ``` 68 | 69 | ## Engine Setup 70 | 71 | Now, it's all "under the hood": 72 | 73 | ``` 74 | --- 75 | title: "My document" 76 | jupyter: python3 77 | --- 78 | ``` 79 | 80 | # Tricks for interweaving R and python 81 | 82 | ## Choose your install in Global Options 83 | 84 | ![](./images/global_opts_python.png) 85 | 86 | ## Object passing 87 | 88 | - Automatic variables named `py` and `r` 89 | 90 | - Access *python* objects from *R* with `py$` 91 | 92 | - Access *R* objects from *python* with `r.` 93 | 94 | ## Object passing 95 | 96 | ````{verbatim} 97 | 98 | ```{r} 99 | # read and filter data with R 100 | library(palmerpenguins) 101 | 102 | adelie <- 103 | penguins %>% 104 | filter(species == "Adelie") 105 | ``` 106 | 107 | ```{python} 108 | # model with python 109 | LR = LinearRegression() 110 | 111 | X = r.adelie[['bill_length_mm', 'bill_depth_mm']] 112 | y = r.adelie['mass_g'] 113 | 114 | mod = LR.fit(X, y) 115 | coef = mod.coef_ 116 | ``` 117 | 118 | ```{r} 119 | # summarize with R 120 | py$coef 121 | ``` 122 | 123 | ```` 124 | 125 | ## Jupyter 126 | 127 | - Do you like Jupyter notebooks? **Me too!** 128 | 129 | - Do you like Colab and/or Posit Cloud? **Me too!** 130 | 131 | - Do you want to make your materials in Quarto but distribute to students in Jupyter form? **Me too!** 132 | 133 | ```{r} 134 | #| code-fold: true 135 | quarto convert class_notes.qmd 136 | quarto convert class_notes.ipynb 137 | 138 | quarto render class_notes.ipynb 139 | ``` 140 | 141 | ## Remaining challenges of multilingual docs 142 | 143 | 1. Most undergrad programs **don't require** multiple languages. 144 | 145 | 2. Detecting python **installs and packages** isn't perfect. 146 | 147 | 3. R and python do not always have the **same default implementations** for models. 148 | 149 | 4. What if what you want is not a **multilingual** document, but duplicated **translated** documents? 150 | 151 | # `versions()` functions in `templar` mini-package 152 | 153 | ## What it does 154 | 155 | Upon rendering... 156 | 157 | 1. Identifies the **R chunks** from the **python chunks** 158 | 159 | 2. Identifies the **labeled text sections** for R or python. 160 | 161 | 3. Writes new **unilingual source files** (qmds) in separate folders 162 | 163 | 4. (Optionally) **Renders** those source files 164 | 165 | 5. (Optionally) **Converts** the python one to ipynb. 166 | 167 | # Example 168 | 169 | ## First chunk 170 | 171 | ````{verbatim} 172 | ```{r, version = "none"} 173 | templar::versions_quarto_multilingual(global_eval = FALSE, 174 | to_jupyter = TRUE, 175 | warn_edit = FALSE) 176 | ``` 177 | ```` 178 | 179 | - `{version = "none"}`: this code itself should not appear in generated files 180 | 181 | - `global_eval`: do you want to 182 | 183 | - `to_jupyter`: do you want to convert the python version? 184 | 185 | - `warn_edit`: put a warning at the top of generated files to not edit directly? 186 | 187 | ## Code chunk versions 188 | 189 | ````{verbatim} 190 | 191 | The first thing we need to do with any dataset is check for 192 | missing data, and make sure the variables are the right type: 193 | 194 | 195 | ```{r, version = "R"} 196 | df %>% summary() 197 | ``` 198 | 199 | ```{python, version = "python"} 200 | df.info() 201 | ``` 202 | 203 | ```` 204 | 205 | ## Versioned text 206 | 207 | ````{verbatim} 208 | 209 | The next step is to clean the data. 210 | 211 | %%% version: R 212 | 213 | The "Color" variable is being treated as a "character" variable, 214 | i.e., just an ordinary word. 215 | 216 | But we know it should be *categorical*, aka a `factor` variable. 217 | Let's `mutate` the dataset to fix this: 218 | 219 | ```{r, version = "R"} 220 | df <- df %>% 221 | mutate( 222 | Color = factor(Color) 223 | ) 224 | 225 | df %>% summary() 226 | ``` 227 | 228 | %%% 229 | 230 | %%% version: python 231 | 232 | The "Color" variable is being treated as an "object" variable, 233 | i.e., just an ordinary word. 234 | 235 | But we know it should be *categorical*, aka a `category` variable. 236 | Let's *retype* the variable to fix this: 237 | 238 | %%% 239 | 240 | 241 | ```{python, version = "python"} 242 | kelly_df['Gender'] = kelly_df['Gender'].astype('category') 243 | kelly_df.info() 244 | ``` 245 | ```` 246 | 247 | ## Why it's useful 248 | 249 | - Keep the content creation all in one place - more **reproducible**! 250 | 251 | - Elements of the document can be **shared** - e.g. data descriptions, question prompts, css chunks 252 | 253 | - Give you **source files** to disseminate to students, not just *rendered files*. 254 | 255 | - (Also lets you do *student* and *solution* version, or *Exam A* and *Exam B*, etc.) 256 | 257 | # What's next for `templar` and Quarto? 258 | 259 | ## Lua translation 260 | 261 | - **Parse** the source file text more elegantly 262 | 263 | - Match **syntax** to Quarto's 264 | 265 | - (`:::` instead of `%%%`) 266 | 267 | - (`#| version: R` instad of `{version = "R}`) 268 | 269 | - Do you know Lua and `knitr`? Let's be friends. 270 | 271 | ## Quarto's multi-output trick 272 | 273 | What it can do now: 274 | 275 | ```{verbatim} 276 | --- 277 | title: "My Versioned Doc" 278 | format: 279 | html: 280 | output-file: my_versioned_doc.html 281 | pdf: 282 | output-file: my_versioned_doc.pdf 283 | --- 284 | 285 | ::: {.content-visible when-format="html"} 286 | Click here to expand! 287 | ::: 288 | 289 | ``` 290 | 291 | ## Quarto's multi-output trick 292 | 293 | What I want: 294 | 295 | ```{verbatim} 296 | --- 297 | title: "My Versioned Doc" 298 | format: 299 | html+R: 300 | output-file: handout-r.html 301 | html+python: 302 | output-file: handout-python.html 303 | --- 304 | 305 | ::: {.content-visible when-variant="R"} 306 | The function `mutate()` will add a new variable. 307 | ::: 308 | ``` 309 | 310 | ## Resources 311 | 312 | Install the `templar` package: 313 | 314 | ```{r} 315 | remotes::install_github("r-for-educators/templar") 316 | ``` 317 | 318 | **Co-author: Ian Flores Siaca** 319 | 320 | Contribute at [www.github.com/r-for-educators/templar](www.github.com/r-for-educators/templar) 321 | 322 | Examples of course materials generated with templar: 323 | 324 | 325 | 326 | # Thank You! 327 | 328 | Find me: 329 | 330 | **Email:** kbodwin\@calpoly.edu 331 | 332 | **Website:** [www.kelly-bodwin.com](www.kelly-bodwin.com) 333 | 334 | **GitHub:** kbodwin 335 | 336 | **Mastodon:** kellybodwin\@mastodon.social 337 | 338 | **Threads:** @kellbod 339 | -------------------------------------------------------------------------------- /talks/4-automation/colin.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mine-cetinkaya-rundel/teach-with-quarto/f8b6ebed58ec9ebd2501643d06b5cd4b20449246/talks/4-automation/colin.jpeg -------------------------------------------------------------------------------- /talks/4-automation/featured.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mine-cetinkaya-rundel/teach-with-quarto/f8b6ebed58ec9ebd2501643d06b5cd4b20449246/talks/4-automation/featured.png -------------------------------------------------------------------------------- /talks/4-automation/index.qmd: -------------------------------------------------------------------------------- 1 | --- 2 | title: Quarto and automation in teaching statistical computing 3 | author: Colin Rundel 4 | subtitle: "3:05 - 3:25" 5 | image: featured.png 6 | description: Discuss the use of GitHub actions and Quarto to provide automated feedback to students in a variety of statistical computing courses spanning the undergraduate and graduate curriculum and make use of both R and Python. 7 | --- 8 | 9 | ## Abstract 10 | 11 | In this talk we will discuss the use of GitHub actions and Quarto to provide automated feedback to students in a variety of statistical computing courses. These courses span the undergraduate and graduate curriculum and make use of both R and Python. The flexibility and power of the Quarto framework provide for the development of common tooling and workflows that can be adapted the specific needs of each course. We will provide concrete examples of how these tools are currently being used in these courses as well as discussing how they can be extended and adopted for new courses. 12 | 13 | ## Slides 14 | 15 | ```{=html} 16 | 17 | ``` 18 | ## Speaker 19 | 20 | ![](colin.jpeg){style="float: right; padding-left: 10px;" fig-alt="Photo of Colin Rundel" width="300"} 21 | 22 | Colin Rundel is Associate Professor of the Practice at Duke University where he has been teaching since 2012. His work focuses on teaching statistical computing to both undergraduate and graduate students in both R and Python. 23 | -------------------------------------------------------------------------------- /talks/5-teaching-materials/featured.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mine-cetinkaya-rundel/teach-with-quarto/f8b6ebed58ec9ebd2501643d06b5cd4b20449246/talks/5-teaching-materials/featured.png -------------------------------------------------------------------------------- /talks/5-teaching-materials/img/file-structure-annoated.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mine-cetinkaya-rundel/teach-with-quarto/f8b6ebed58ec9ebd2501643d06b5cd4b20449246/talks/5-teaching-materials/img/file-structure-annoated.png -------------------------------------------------------------------------------- /talks/5-teaching-materials/img/file-structure.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mine-cetinkaya-rundel/teach-with-quarto/f8b6ebed58ec9ebd2501643d06b5cd4b20449246/talks/5-teaching-materials/img/file-structure.png -------------------------------------------------------------------------------- /talks/5-teaching-materials/img/python-slide-code.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mine-cetinkaya-rundel/teach-with-quarto/f8b6ebed58ec9ebd2501643d06b5cd4b20449246/talks/5-teaching-materials/img/python-slide-code.png -------------------------------------------------------------------------------- /talks/5-teaching-materials/img/python-slide.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mine-cetinkaya-rundel/teach-with-quarto/f8b6ebed58ec9ebd2501643d06b5cd4b20449246/talks/5-teaching-materials/img/python-slide.png -------------------------------------------------------------------------------- /talks/5-teaching-materials/img/sta210-assignment.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mine-cetinkaya-rundel/teach-with-quarto/f8b6ebed58ec9ebd2501643d06b5cd4b20449246/talks/5-teaching-materials/img/sta210-assignment.png -------------------------------------------------------------------------------- /talks/5-teaching-materials/img/sta210-long-notes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mine-cetinkaya-rundel/teach-with-quarto/f8b6ebed58ec9ebd2501643d06b5cd4b20449246/talks/5-teaching-materials/img/sta210-long-notes.png -------------------------------------------------------------------------------- /talks/5-teaching-materials/img/sta210-slide-code.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mine-cetinkaya-rundel/teach-with-quarto/f8b6ebed58ec9ebd2501643d06b5cd4b20449246/talks/5-teaching-materials/img/sta210-slide-code.png -------------------------------------------------------------------------------- /talks/5-teaching-materials/img/sta210-slide.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mine-cetinkaya-rundel/teach-with-quarto/f8b6ebed58ec9ebd2501643d06b5cd4b20449246/talks/5-teaching-materials/img/sta210-slide.png -------------------------------------------------------------------------------- /talks/5-teaching-materials/img/sta210-website.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mine-cetinkaya-rundel/teach-with-quarto/f8b6ebed58ec9ebd2501643d06b5cd4b20449246/talks/5-teaching-materials/img/sta210-website.png -------------------------------------------------------------------------------- /talks/5-teaching-materials/index.qmd: -------------------------------------------------------------------------------- 1 | --- 2 | title: Using Quarto for Making and Organizing Teaching Materials 3 | author: Maria Tackett 4 | subtitle: "3:25 - 3:45" 5 | image: featured.png 6 | description: Demo how to use Quarto to create and organize teaching materials, introduce resources and templates for getting started with Quarto for organizing your own teaching materials, and share best practices. 7 | --- 8 | 9 | ## Abstract 10 | 11 | In addition to creating reproducible documents, Quarto offers a rich suite of options for creation slide decks, books, and websites, allowing instructors to create all of their teaching materials reproducibly. In this talk we will demo how we've been using Quarto to create and organize teaching materials, introduce resources and templates for getting started with Quarto for organizing your own teaching materials, and share best practices. 12 | 13 | ## Slides 14 | 15 | ```{=html} 16 | 17 | ``` 18 | ## Speaker 19 | 20 | ![](maria-tackett-photo.png){style="float: right; padding-left: 10px;" fig-alt="Photo of Maria Tackett" fig-align="right" width="300"} 21 | 22 | Maria Tackett is an Assistant Professor of the Practice in the Department of Statistical Science at Duke University. Her research focuses on understanding factors that impact students' sense of belonging in introductory math and statistics courses with the aim to identify pedagogies that foster community and a supportive learning environment. She's an active member of the statistics education community and its effort to make statistics more engaging and accessible for all students. 23 | -------------------------------------------------------------------------------- /talks/5-teaching-materials/maria-tackett-photo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mine-cetinkaya-rundel/teach-with-quarto/f8b6ebed58ec9ebd2501643d06b5cd4b20449246/talks/5-teaching-materials/maria-tackett-photo.png -------------------------------------------------------------------------------- /talks/5-teaching-materials/quarto-teaching-materials.qmd: -------------------------------------------------------------------------------- 1 | --- 2 | title: "Using Quarto for Making and Organizing Teaching Materials" 3 | subtitle: "Joint Statistical Meeting" 4 | author: "Maria Tackett" 5 | date: "August 7, 2023" 6 | date-format: long 7 | footer: "[🔗 bit.ly/teach-quarto](https://bit.ly/teach-quarto)" 8 | format: 9 | revealjs: 10 | theme: quarto-teaching-materials.scss 11 | slide-number: false 12 | incremental: false 13 | chalkboard: 14 | theme: whiteboard 15 | code-link: true 16 | execute: 17 | eval: true 18 | echo: true 19 | editor: visual 20 | --- 21 | 22 | ## Outline 23 | 24 | ```{r} 25 | #| include: false 26 | #| warning: false 27 | #| message: false 28 | 29 | library(tidyverse) 30 | library(openintro) # for duke forest dataset 31 | library(scales) 32 | library(reticulate) # for python code 33 | options(reticulate.useImportHook=FALSE) 34 | 35 | ggplot2::theme_set(ggplot2::theme_minimal(base_size = 14)) 36 | 37 | # set width of code output 38 | options(width = 65) 39 | 40 | # set figure parameters for knitr 41 | knitr::opts_chunk$set( 42 | fig.width = 7, # 7" width 43 | fig.asp = 0.618, # the golden ratio 44 | fig.retina = 3, # dpi multiplier for displaying HTML output on retina 45 | fig.align = "center", # center align figures 46 | dpi = 300 # higher dpi, sharper image 47 | ) 48 | ``` 49 | 50 | - Why use Quarto to make teaching materials? 51 | 52 | - What teaching materials can I create using Quarto? 53 | 54 | - How do I get started? 55 | 56 | # Why use Quarto to make teaching materials? {background-color="#993399"} 57 | 58 | ## Benefits for instructor 59 | 60 | - Reproducible course materials that are easier to update 61 | 62 | - Integrate narrative, executable R code, images, and interactive elements 63 | 64 | - Easily share course materials with students and more broadly 65 | 66 | - Regularly use the same technology as your students 67 | 68 | ## Benefits for students 69 | 70 | - Navigation menu on all documents to easily to find content 71 | 72 | - Search capabilities on website to more easily find content by topic 73 | 74 | - Option to export PDF of slides 75 | 76 | - Read course materials on multiple devices 77 | 78 | # What teaching materials can I create using Quarto? {background-color="#993399"} 79 | 80 | ## Teaching materials in Quarto {.incremental} 81 | 82 | ::: columns 83 | ::: {.column .fragment width="45%" fragment-index="1"} 84 | **Course websites** 85 | 86 | ![](img/sta210-website.png){width="2973"} 87 | ::: 88 | 89 | ::: {.column width="5%"} 90 | ::: 91 | 92 | ::: {.column .fragment width="45%" fragment-index="2"} 93 | **Slides** 94 | 95 | ![](img/sta210-slide.png){width="2854"} 96 | ::: 97 | ::: 98 | 99 | ## Teaching materials in Quarto {.incremental} 100 | 101 | ::: columns 102 | ::: {.column .fragment width="45%" fragment-index="1"} 103 | **Long-form notes** 104 | 105 | ![](img/sta210-long-notes.png) 106 | ::: 107 | 108 | ::: {.column width="5%"} 109 | ::: 110 | 111 | ::: {.column .fragment width="45%" fragment-index="2"} 112 | **Assignment instructions** 113 | 114 | ![](img/sta210-assignment.png) 115 | ::: 116 | ::: 117 | 118 | # Slides 119 | 120 | ## Slide menu 121 | 122 | - Slide navigation 123 | 124 | - Print to PDF 125 | 126 | - Speaker view 127 | 128 | - Annotation 129 | 130 | - Chalkboard 131 | 132 | ## Slide with code + output 133 | 134 | ::: columns 135 | ::: {.column width="50%"} 136 | **Published slide** 137 | 138 | ![](img/python-slide.png) 139 | ::: 140 | 141 | ::: {.column width="50%"} 142 | **Source code** 143 | 144 | ![](img/python-slide-code.png) 145 | ::: 146 | ::: 147 | 148 | ::: aside 149 | Source: [SciPy lecture](https://sta663-sp23.github.io/slides/Lec07.html#/title-slide) by Colin Rundel 150 | ::: 151 | 152 | ## Slide with mathematical notation 153 | 154 | ::: columns 155 | ::: {.column width="50%"} 156 | **Published slide** 157 | 158 | ![](img/sta210-slide.png) 159 | ::: 160 | 161 | ::: {.column width="50%"} 162 | **Source code** 163 | 164 | ![](img/sta210-slide-code.png) 165 | ::: 166 | ::: 167 | 168 | ::: aside 169 | Source: [SLR: Mathematical models for inference](https://sta210-fa22.netlify.app/slides/07-slr-math-models#/mathematical-representation-of-the-model) by Maria Tackett 170 | ::: 171 | 172 | # Websites 173 | 174 | ## Navigating course website 175 | 176 | {{< video https://youtu.be/dPDXbKGoFus width="700" height="400" >}} 177 | 178 | ::: aside 179 | [Introduction to Data Science](https://sta199-f22-1.github.io/) taught by Mine Çetinkaya-Rundel 180 | ::: 181 | 182 | ## Example website file structure 183 | 184 |
![](img/file-structure-annoated.png){width="451"}
185 | 186 | ## Interactive documents with webR 187 | 188 | ::: midi 189 | *"Run R code in the browser without the need for an R server to execute the code"* 190 | ::: 191 | 192 | {{< video https://youtu.be/Kb_5GM3aUSk width="700" height="400" >}} 193 | 194 | ::: aside 195 | webR demo: [maria.quarto.pub/webr-demo](https://maria.quarto.pub/webr-demo/) 196 | ::: 197 | 198 | ## webR source code 199 | 200 | **YAML** 201 | 202 | ```{r} 203 | #| eval: false 204 | #| code-line-numbers: "2|3|4,5|6,7,8,9" 205 | --- 206 | title: "webR document" 207 | format: html 208 | filters: 209 | - webr 210 | webr: 211 | packages: ['dplyr', 'ggplot2'] 212 | Cross-Origin-Opener-Policy: same-origin 213 | Cross-Origin-Embedder-Policy: require-corp 214 | --- 215 | ``` 216 | 217 | . . . 218 | 219 | **Executable code chunk** 220 | 221 | ```{r} 222 | #| eval: false 223 | {webr-r} 224 | mpg |> 225 | count(manufacturer, _____) 226 | ``` 227 | 228 | ------------------------------------------------------------------------ 229 | 230 | # 231 | 232 |
233 | 234 | ::: callout-caution 235 | WebR is in active development. Learn more at [github.com/coatless/quarto-webr](https://github.com/coatless/quarto-webr) 236 | ::: 237 | 238 |
239 | 240 | # How do I get started? {background-color="#993399"} 241 | 242 | ## Getting started: slides + documents 243 | 244 | ::: panel-tabset 245 | ## Basic 246 | 247 | ```{r} 248 | #| eval: false 249 | --- 250 | title: "Lecture 01" 251 | subtitle: "Statistics 101" 252 | author: "Instructor" 253 | date: "August 7, 2023" 254 | format: revealjs 255 | --- 256 | ``` 257 | 258 | ::: callout-tip 259 | Easily produce multiple types of documents by changing the `format` in the YAML. 260 | ::: 261 | 262 | ## Customized 263 | 264 | ```{r} 265 | #| eval: false 266 | --- 267 | title: "Lecture 01" 268 | subtitle: "Statistics 101" 269 | author: "Instructor" 270 | date: "August 7, 2023" 271 | date-format: long 272 | footer: "URL to course website" 273 | format: 274 | revealjs: 275 | theme: slides.scss 276 | transition: fade 277 | slide-number: false 278 | incremental: false 279 | chalkboard: 280 | code-link: true 281 | editor: visual 282 | execute: 283 | eval: true 284 | echo: true 285 | --- 286 | ``` 287 | ::: 288 | 289 | ## Getting started: websites 290 | 291 | - Make a website repo on GitHub 292 | 293 | - Clone the repo and start a new RStudio project 294 | 295 | - Run the following code in the **Terminal** 296 | 297 | ``` 298 | quarto create-project --type website 299 | ``` 300 | 301 | You will see the standard files for a new website in the **Files** pane. See [Creating a Website](https://quarto.org/docs/websites/) on quarto.org for more information. 302 | 303 | ## Publishing materials 304 | 305 | Run the following code in the **Terminal** 306 | 307 | **GitHub pages** 308 | 309 | ``` 310 | quarto publish gh-pages 311 | ``` 312 | 313 | **Quarto pub** 314 | 315 | ``` 316 | quarto publish quarto-pub 317 | ``` 318 | 319 | **Netlify** 320 | 321 | ``` 322 | quarto publish netlify 323 | ``` 324 | 325 |
326 | 327 | See [Publishing Basics](https://quarto.org/docs/publishing/) on quarto.org for more information and publishing options. 328 | 329 | ## Course websites created with Quarto 330 | 331 | - Introduction to Data Science, Elijah Meyer 332 | - \[[website](https://sta199-summer-1.github.io/)\]\[[GitHub repo](https://github.com/sta199-summer-1/sta199-summer-1.github.io)\] 333 | - Regression Analysis, Maria Tackett 334 | - \[[website](https://sta210-fa22.netlify.app/)\]\[[GitHub repo](https://github.com/sta210-fa22/website)\] 335 | - Advanced Data Visualization, Mine Çetinkaya-Rundel 336 | - \[[website](https://vizdata.org/)\]\[[GitHub repo](https://github.com/vizdata-s23/vizdata-s23)\] 337 | - Applied Experimental Design and Regression Models, Allison Theobold 338 | - \[[website](https://atheobold.github.io/stat-313-website/)\]\[[Github repo](https://github.com/atheobold/stat-313-website)\] 339 | 340 | ## Course slides created with Quarto 341 | 342 | - Statistical Computing and Computation, Colin Rundel 343 | 344 | - \[[website](https://sta663-sp23.github.io/)\]\[[GitHub repo](https://github.com/sta663-sp23/sta663-sp23.github.io)\] 345 | 346 | - Statistical Learning with R, Kelly Bodwin 347 | 348 | - \[[GitHub repo](https://github.com/Statistical-Learning-with-R)\] 349 | 350 | ## Learn more! 351 | 352 | - [*Organizing Teaching Materials*](https://rstudio-conf-2022.github.io/teach-ds/modules/d2-08-organizing.html) by Maria Tackett & Mine Çetinkaya-Rundel 353 | 354 | - [*Reproducible documents, presentations, and websites with Quarto*](https://atheobold.github.io/uscots-quarto/) by Hunter Glanz, Emily Robinson & Allison Theobold 355 | 356 | - [*Hello Quarto: Share, Collaborate, Teach, Reimagine*](https://www.youtube.com/watch?v=p7Hxu4coDl8) by Mine Çetinkaya-Rundel & Julia Lowndes 357 | 358 | - [quarto.org](https://quarto.org) 359 | 360 | # Thank you! {background-color="#993399"} 361 | 362 | 🔗 [bit.ly/teach-quarto](https://bit.ly/teach-quarto){style="color: white"} 363 | 364 | 💻 [github.com/mine-cetinkaya-rundel/teach-with-quarto](https://github.com/mine-cetinkaya-rundel/teach-with-quarto){style="color: white"} 365 | 366 | 📧 [maria.tackett\@duke.edu](mailto:maria.tackett@duke.edu){style="color: white"} 367 | -------------------------------------------------------------------------------- /talks/5-teaching-materials/quarto-teaching-materials.scss: -------------------------------------------------------------------------------- 1 | /*-- scss:defaults --*/ 2 | 3 | // fonts 4 | @import 'https://fonts.googleapis.com/css2?family=Atkinson+Hyperlegible&display=swap'; 5 | 6 | $font-family: "Atkinson Hyperlegible", sans-serif; 7 | 8 | /*$font-family-sans-serif: "Open Sans", sans-serif*/ 9 | $presentation-heading-color: #993399; 10 | $presentation-title-slide-text-align: "left"; 11 | $presentation-font-size-root: 36px; 12 | $code-block-font-size: 0.7em; 13 | $link-color: #799100; 14 | 15 | /*-- scss:rules --*/ 16 | 17 | details>summary { 18 | font-size: 0.75em; 19 | } 20 | 21 | .smaller { 22 | font-size: 0.5em; 23 | } 24 | 25 | .small { 26 | font-size: 0.75em; 27 | } 28 | 29 | .midi { 30 | font-size: 0.85em; 31 | } 32 | 33 | .larger { 34 | font-size: 1.5em; 35 | } 36 | 37 | .largest { 38 | font-size: 3em; 39 | } 40 | 41 | .reveal .slide .question { 42 | border-left: 3px solid #993399; 43 | padding-left: 0.5em; 44 | padding-top: 0.25em; 45 | padding-bottom: 0.25em; 46 | background: #e0bcdd; 47 | } 48 | 49 | .reveal .slide .poll { 50 | border-left: 3px solid #993399; 51 | padding-left: 0.5em; 52 | padding-top: 0.25em; 53 | padding-bottom: 0.25em; 54 | background: #e0bcdd; 55 | } 56 | 57 | .reveal .slide .appex { 58 | border-left: 3px solid #003559; 59 | padding: 0.25em; 60 | background: #EBF7FF; 61 | } 62 | 63 | .reveal .slide .cloud { 64 | border-left: 3px solid #8DB6DB; 65 | margin-top: 0.5em; 66 | padding: 0.25em; 67 | background: #F3F7FB; 68 | font-size: 0.75em; 69 | } 70 | 71 | .reveal .slide .share { 72 | border-left: 3px solid #717DEF; 73 | padding: 0.25em; 74 | background: #F0F2FD; 75 | font-size: 0.75em; 76 | } 77 | 78 | .reveal .slide .in-out { 79 | margin-top: 0.5em; 80 | margin-bottom: 0.5em; 81 | padding-top: 0.1em; 82 | padding-bottom: 0.1em; 83 | padding-left: 1em; 84 | background: #E8E8E8; 85 | font-family: $font-family-monospace; 86 | font-size: 0.6em; 87 | } 88 | 89 | 90 | .reveal .slide .goal { 91 | margin-top: 0.5em; 92 | margin-bottom: 0.5em; 93 | padding-top: 0.1em; 94 | padding-bottom: 0.1em; 95 | padding-left: 1em; 96 | background: #ccddeb; 97 | } 98 | 99 | .reveal countdown { 100 | position: fixed; 101 | bottom: 0em; 102 | right: 0em; 103 | font-size: 40px; 104 | border: 2px solid; 105 | border-radius: 5px; 106 | padding-left: 12px; 107 | padding-right: 12px; 108 | user-select: none; 109 | } 110 | 111 | .reveal pre { 112 | overflow-x: auto; 113 | } 114 | .reveal pre code { 115 | word-wrap: normal; 116 | white-space: pre; 117 | } 118 | 119 | 120 | 121 | -------------------------------------------------------------------------------- /teach-with-quarto.Rproj: -------------------------------------------------------------------------------- 1 | Version: 1.0 2 | 3 | RestoreWorkspace: Default 4 | SaveWorkspace: Default 5 | AlwaysSaveHistory: Default 6 | 7 | EnableCodeIndexing: Yes 8 | UseSpacesForTab: Yes 9 | NumSpacesForTab: 2 10 | Encoding: UTF-8 11 | 12 | RnwWeave: Sweave 13 | LaTeX: pdfLaTeX 14 | --------------------------------------------------------------------------------