1<!DOCTYPE html> 2<html xmlns="http://www.w3.org/1999/xhtml" lang="es" xml:lang="es"><head> 3 4<meta charset="utf-8"> 5<meta name="generator" content="quarto-1.10.18"> 6 7<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes"> 8 9 10<title>Acerca de â Arturo Sanjuán</title> 11<style> 12/* Default styles provided by pandoc. 13** See https://pandoc.org/MANUAL.html#variables-for-html for config info. 14*/ 15span.smallcaps{font-variant: small-caps;} 16div.columns{display: flex; gap: 1.5em;} 17div.column{flex: auto;} 18@media screen { 19div.columns{gap: min(4vw, 1.5em);} 20div.column{overflow-x: auto;} 21} 22div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;} 23ul.task-list{list-style: none;} 24ul.task-list li input[type="checkbox"] { 25 width: 0.8em; 26 margin: 0 0.8em 0.2em -1em; /* quarto-specific, see https://github.com/quarto-dev/quarto-cli/issues/4556 */ 27 vertical-align: middle; 28} 29</style> 30 31
32<script src="site_libs/quarto-nav/quarto-nav.js"></script>
vendor: 1 bytes, line 32
32
33<script src="site_libs/quarto-nav/headroom.min.js"></script>
vendor: 1 bytes, line 33
33
34<script src="site_libs/clipboard/clipboard.min.js"></script>
vendor: 1 bytes, line 34
34
35<script src="site_libs/quarto-search/autocomplete.umd.js"></script>
vendor: 1 bytes, line 35
35
36<script src="site_libs/quarto-search/fuse.min.js"></script>
vendor: 1 bytes, line 36
36
37<script src="site_libs/quarto-search/quarto-search.js"></script>
37 38<meta name="quarto:offset" content="./"> 39<link href="./favicon.png" rel="icon" type="image/png">
40<script src="site_libs/quarto-html/quarto.js" type="module"></script>
vendor: 1 bytes, line 40
40
41<script src="site_libs/quarto-html/tabsets/tabsets.js" type="module"></script>
vendor: 1 bytes, line 41
41
42<script src="site_libs/quarto-html/popper.min.js"></script>
vendor: 1 bytes, line 42
42
43<script src="site_libs/quarto-html/tippy.umd.min.js"></script>
vendor: 1 bytes, line 43
43
44<script src="site_libs/quarto-html/anchor.min.js"></script>
44 45<link href="site_libs/quarto-html/tippy.css" rel="stylesheet"> 46<link href="site_libs/quarto-html/quarto-syntax-highlighting-64a204ab8560d761af7679ceaba22944.css" rel="stylesheet" class="quarto-color-scheme" id="quarto-text-highlighting-styles"> 47<link href="site_libs/quarto-html/quarto-syntax-highlighting-dark-b85bc7c33db8c58e0ec93c3465666fed.css" rel="stylesheet" class="quarto-color-scheme quarto-color-alternate" id="quarto-text-highlighting-styles"> 48<link href="site_libs/quarto-html/quarto-syntax-highlighting-64a204ab8560d761af7679ceaba22944.css" rel="stylesheet" class="quarto-color-scheme-extra" id="quarto-text-highlighting-styles">
49<script src="site_libs/bootstrap/bootstrap.min.js"></script>
49 50<link href="site_libs/bootstrap/bootstrap-icons.css" rel="stylesheet"> 51<link href="site_libs/bootstrap/bootstrap-20e8419ce0e5e504df81ebb4f0516dd0.min.css" rel="stylesheet" append-hash="true" class="quarto-color-scheme" id="quarto-bootstrap" data-mode="light"> 52<link href="site_libs/bootstrap/bootstrap-dark-690a39555877842da32c80663def9b9f.min.css" rel="stylesheet" append-hash="true" class="quarto-color-scheme quarto-color-alternate" id="quarto-bootstrap" data-mode="dark"> 53<link href="site_libs/bootstrap/bootstrap-20e8419ce0e5e504df81ebb4f0516dd0.min.css" rel="stylesheet" append-hash="true" class="quarto-color-scheme-extra" id="quarto-bootstrap" data-mode="light">
54<script id="quarto-search-options" type="application/json">{ 55 "location": "navbar", 56 "copy-button": false, 57 "collapse-after": 3, 58 "panel-placement": "end", 59 "type": "overlay", 60 "limit": 50, 61 "keyboard-shortcut": [ 62 "f", 63 "/", 64 "s" 65 ], 66 "show-item-context": false, 67 "language": { 68 "search-no-results-text": "No se han encontrado resultados", 69 "search-matching-documents-text": "documentos encontrados", 70 "search-copy-link-title": "Copiar el enlace en la búsqueda", 71 "search-hide-matches-text": "Ocultar resultados adicionales", 72 "search-more-match-text": "resultado adicional en este documento", 73 "search-more-matches-text": "resultados adicionales en este documento", 74 "search-clear-button-title": "Borrar", 75 "search-text-placeholder": "", 76 "search-detached-cancel-button-title": "Cancelar", 77 "search-submit-button-title": "Enviar", 78 "search-label": "Buscar" 79 } 80}</script>
80 81 82 83<link rel="stylesheet" href="styles.css"> 84</head> 85 86<body class="nav-fixed quarto-light">
86<script id="quarto-html-before-body" type="application/javascript"> 87 const toggleBodyColorMode = (bsSheetEl) => { 88 const mode = bsSheetEl.getAttribute("data-mode"); 89 const bodyEl = window.document.querySelector("body"); 90 if (mode === "dark") { 91 bodyEl.classList.add("quarto-dark"); 92 bodyEl.classList.remove("quarto-light"); 93 } else { 94 bodyEl.classList.add("quarto-light"); 95 bodyEl.classList.remove("quarto-dark"); 96 } 97 } 98 const toggleBodyColorPrimary = () => { 99 const bsSheetEl = window.document.querySelector("link#quarto-bootstrap:not([rel=disabled-stylesheet])"); 100 if (bsSheetEl) { 101 toggleBodyColorMode(bsSheetEl); 102 } 103 } 104 const setColorSchemeToggle = (alternate) => { 105 const toggles = window.document.querySelectorAll('.quarto-color-scheme-toggle'); 106 for (let i=0; i < toggles.length; i++) { 107 const toggle = toggles[i]; 108 if (toggle) { 109 if (alternate) { 110 toggle.classList.add("alternate"); 111 } else { 112 toggle.classList.remove("alternate"); 113 } 114 } 115 } 116 }; 117 const toggleColorMode = (alternate) => { 118 // Switch the stylesheets 119 const primaryStylesheets = window.document.querySelectorAll('link.quarto-color-scheme:not(.quarto-color-alternate)'); 120 const alternateStylesheets = window.document.querySelectorAll('link.quarto-color-scheme.quarto-color-alternate'); 121 manageTransitions('#quarto-margin-sidebar .nav-link', false); 122 if (alternate) { 123 // note: dark is layered on light, we don't disable primary! 124 enableStylesheet(alternateStylesheets); 125 for (const sheetNode of alternateStylesheets) { 126 if (sheetNode.id === "quarto-bootstrap") { 127 toggleBodyColorMode(sheetNode); 128 } 129 } 130 } else { 131 disableStylesheet(alternateStylesheets); 132 enableStylesheet(primaryStylesheets) 133 toggleBodyColorPrimary(); 134 } 135 manageTransitions('#quarto-margin-sidebar .nav-link', true); 136 // Switch the toggles 137 setColorSchemeToggle(alternate) 138 // Hack to workaround the fact that safari doesn't 139 // properly recolor the scrollbar when toggling (#1455) 140 if (navigator.userAgent.indexOf('Safari') > 0 && navigator.userAgent.indexOf('Chrome') == -1) { 141 manageTransitions("body", false); 142 window.scrollTo(0, 1); 143 setTimeout(() => { 144 window.scrollTo(0, 0); 145 manageTransitions("body", true); 146 }, 40); 147 } 148 } 149 const disableStylesheet = (stylesheets) => { 150 for (let i=0; i < stylesheets.length; i++) { 151 const stylesheet = stylesheets[i]; 152 stylesheet.rel = 'disabled-stylesheet'; 153 } 154 } 155 const enableStylesheet = (stylesheets) => { 156 for (let i=0; i < stylesheets.length; i++) { 157 const stylesheet = stylesheets[i]; 158 if(stylesheet.rel !== 'stylesheet') { // for Chrome, which will still FOUC without this check 159 stylesheet.rel = 'stylesheet'; 160 } 161 } 162 } 163 const manageTransitions = (selector, allowTransitions) => { 164 const els = window.document.querySelectorAll(selector); 165 for (let i=0; i < els.length; i++) { 166 const el = els[i]; 167 if (allowTransitions) { 168 el.classList.remove('notransition'); 169 } else { 170 el.classList.add('notransition'); 171 } 172 } 173 } 174 const isFileUrl = () => { 175 return window.location.protocol === 'file:'; 176 } 177 const hasAlternateSentinel = () => { 178 let styleSentinel = getColorSchemeSentinel(); 179 if (styleSentinel !== null) { 180 return styleSentinel === "alternate"; 181 } else { 182 return false; 183 } 184 } 185 const setStyleSentinel = (alternate) => { 186 const value = alternate ? "alternate" : "default"; 187 if (!isFileUrl()) { 188 window.localStorage.setItem("quarto-color-scheme", value); 189 } else { 190 localAlternateSentinel = value; 191 } 192 } 193 const getColorSchemeSentinel = () => { 194 if (!isFileUrl()) { 195 const storageValue = window.localStorage.getItem("quarto-color-scheme"); 196 return storageValue != null ? storageValue : localAlternateSentinel; 197 } else { 198 return localAlternateSentinel; 199 } 200 } 201 const toggleGiscusIfUsed = (isAlternate, darkModeDefault) => { 202 const baseTheme = document.querySelector('#giscus-base-theme')?.value ?? 'light'; 203 const alternateTheme = document.querySelector('#giscus-alt-theme')?.value ?? 'dark'; 204 let newTheme = ''; 205 if(authorPrefersDark) { 206 newTheme = isAlternate ? baseTheme : alternateTheme; 207 } else { 208 newTheme = isAlternate ? alternateTheme : baseTheme; 209 } 210 const changeGiscusTheme = () => { 211 // From: https://github.com/giscus/giscus/issues/336 212 const sendMessage = (message) => { 213 const iframe = document.querySelector('iframe.giscus-frame'); 214 if (!iframe) return; 215 iframe.contentWindow.postMessage({ giscus: message }, 'https://giscus.app'); 216 } 217 sendMessage({ 218 setConfig: { 219 theme: newTheme 220 } 221 }); 222 } 223 const isGiscussLoaded = window.document.querySelector('iframe.giscus-frame') !== null; 224 if (isGiscussLoaded) { 225 changeGiscusTheme(); 226 } 227 }; 228 const authorPrefersDark = false;
229 const darkModeDefault = authorPrefersDark; 230 document.querySelector('link#quarto-text-highlighting-styles.quarto-color-scheme-extra').rel = 'disabled-stylesheet'; 231 document.querySelector('link#quarto-bootstrap.quarto-color-scheme-extra').rel = 'disabled-stylesheet'; 232 let localAlternateSentinel = darkModeDefault ? 'alternate' : 'default'; 233 // Dark / light mode switch 234 window.quartoToggleColorScheme = () => { 235 // Read the current dark / light value 236 let toAlternate = !hasAlternateSentinel(); 237 toggleColorMode(toAlternate); 238 setStyleSentinel(toAlternate); 239 toggleGiscusIfUsed(toAlternate, darkModeDefault); 240 window.dispatchEvent(new Event('resize')); 241 }; 242 // Switch to dark mode if need be 243 if (hasAlternateSentinel()) { 244 toggleColorMode(true); 245 } else { 246 toggleColorMode(false); 247 } 248 </script>
248 249 250<div id="quarto-search-results"></div> 251 <header id="quarto-header" class="headroom fixed-top"> 252 <nav class="navbar navbar-expand-lg " data-bs-theme="dark"> 253 <div class="navbar-container container-fluid"> 254 <div class="navbar-brand-container mx-auto"> 255 <a class="navbar-brand" href="./index.html"> 256 <span class="navbar-title">Arturo Sanjuán</span> 257 </a> 258 </div> 259 <div id="quarto-search" class="" title="Buscar"></div> 260 <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarCollapse" aria-controls="navbarCollapse" role="menu" aria-expanded="false" aria-label="Navegación de palanca" onclick="if (window.quartoToggleHeadroom) { window.quartoToggleHeadroom(); }"> 261 <span class="navbar-toggler-icon"></span> 262</button> 263 <div class="collapse navbar-collapse" id="navbarCollapse"> 264 <ul class="navbar-nav navbar-nav-scroll me-auto"> 265 <li class="nav-item"> 266 <a class="nav-link" href="./research/index.html"> 267<span class="menu-text">research</span></a> 268 </li> 269 <li class="nav-item"> 270 <a class="nav-link" href="./cursos/index.html"> 271<span class="menu-text">cursos</span></a> 272 </li> 273 <li class="nav-item"> 274 <a class="nav-link" href="./trabajos/index.html"> 275<span class="menu-text">trabajos</span></a> 276 </li> 277 <li class="nav-item"> 278 <a class="nav-link" href="./research/genealogy/index.html"> 279<span class="menu-text">genealogy</span></a> 280 </li> 281 <li class="nav-item"> 282 <a class="nav-link active" href="./about.html" aria-current="page"> 283<span class="menu-text">about</span></a> 284 </li> 285 <li class="nav-item"> 286 <a class="nav-link" href="./links.html"> 287<span class="menu-text">contacto</span></a> 288 </li> 289</ul> 290 <ul class="navbar-nav navbar-nav-scroll ms-auto"> 291 <li class="nav-item"> 292 <a class="nav-link" href="./files/cv_sanjuan.pdf"> 293<span class="menu-text">CV</span></a> 294 </li> 295</ul> 296 </div> <!-- /navcollapse --> 297 <div class="quarto-navbar-tools"> 298 <a href="" class="quarto-color-scheme-toggle quarto-navigation-tool px-1" onclick="window.quartoToggleColorScheme(); return false;" title="Alternar modo oscuro"><i class="bi"></i></a> 299</div> 300 </div> <!-- /container-fluid --> 301 </nav> 302</header> 303<!-- content --> 304<div id="quarto-content" class="quarto-container page-columns page-rows-contents page-layout-article page-navbar"> 305<!-- sidebar --> 306<!-- margin-sidebar --> 307 <div id="quarto-margin-sidebar" class="sidebar margin-sidebar"> 308 <nav id="TOC" role="doc-toc" class="toc-active"> 309 <h2 id="toc-title">En esta página</h2> 310 311 <ul> 312 <li><a href="#estancias-de-investigación" id="toc-estancias-de-investigación" class="nav-link active" data-scroll-target="#estancias-de-investigación">Estancias de investigación</a></li> 313 <li><a href="#distinciones-y-servicio-académico" id="toc-distinciones-y-servicio-académico" class="nav-link" data-scroll-target="#distinciones-y-servicio-académico">Distinciones y servicio académico</a></li> 314 <li><a href="#un-pedacito-de-linaje" id="toc-un-pedacito-de-linaje" class="nav-link" data-scroll-target="#un-pedacito-de-linaje">Un pedacito de linaje</a></li> 315 <li><a href="#contacto" id="toc-contacto" class="nav-link" data-scroll-target="#contacto">Contacto</a></li> 316 </ul> 317</nav> 318 </div> 319<!-- main --> 320<main class="content" id="quarto-document-content"> 321 322 323<header id="title-block-header" class="quarto-title-block default"> 324<div class="quarto-title"> 325<h1 class="title">Acerca de</h1> 326</div> 327 328 329 330<div class="quarto-title-meta"> 331 332 333 334 335 </div> 336 337 338 339</header> 340 341 342<p><em><a href="./about.en.html">ðºð¸ English version</a></em></p> 343<p>Soy profesor titular en el área de matemáticas de la Universidad Distrital Francisco José de Caldas, en Bogotá, y hago parte de los grupos de investigación MESCUD y CMyT. Estudié pregrado, maestrÃa y doctorado en Matemáticas en la Universidad Nacional de Colombia, bajo la dirección de los profesores Alfonso Castro (Harvey Mudd College) y Francisco Caicedo (Universidad Nacional de Colombia). Antes de llegar a la Universidad Distrital fui profesor en la Universidad de los Andes.</p> 344<p>Mi trabajo está en el análisis no lineal aplicado a ecuaciones diferenciales parciales, con énfasis en la ecuación de onda semilineal con condiciones Dirichlet periódicas, problemas elÃpticos de frontera, ecuaciones diferenciales ordinarias singulares de cuarto orden (modelos de nanovigas y MEMS) y ecuaciones funcional diferenciales con retardo. Combino métodos to
344pológicos, como el grado de Leray Schauder, con métodos numéricos como disparo, elementos finitos y técnicas espectrales o FFT.</p> 345<section id="estancias-de-investigación" class="level2"> 346<h2 class="anchored" data-anchor-id="estancias-de-investigación">Estancias de investigación</h2> 347<p>Entre febrero y mayo de 2018 estuve en la Universidad de Buenos Aires y el Centro Latinoamericano de Formación Interdisciplinaria (CELFI), trabajando en ecuaciones funcional diferenciales aplicadas a biologÃa bajo la dirección de Pablo Amster. Entre mayo y agosto del mismo año estuve en la Universidad Complutense de Madrid, trabajando en soluciones a problemas elÃpticos superlineales bajo la dirección de Rosa Pardo.</p> 348</section> 349<section id="distinciones-y-servicio-académico" class="level2"> 350<h2 class="anchored" data-anchor-id="distinciones-y-servicio-académico">Distinciones y servicio académico</h2> 351<p>En 2016 recibà una mención de honor con la medalla Yu Takeuchi, otorgada por la Academia Colombiana de Ciencias Exactas, FÃsicas y Naturales a los mejores trabajos en ciencias matemáticas.</p> 352<p>Soy revisor de la American Mathematical Society (AMS) y secretario de la Sociedad Colombiana de Matemáticas (SCM). Dirijo el Semillero en Análisis Matemático (SAMAT) de la Universidad Distrital, un espacio de formación en investigación para estudiantes de pregrado, con el que organizamos el I Encuentro Juvenil en Ecuaciones Diferenciales en abril de 2026.</p> 353</section> 354<section id="un-pedacito-de-linaje" class="level2"> 355<h2 class="anchored" data-anchor-id="un-pedacito-de-linaje">Un pedacito de linaje</h2> 356<p>He dirigido tesis de pregrado y maestrÃa, pero todavÃa ninguna de doctorado, que es lo único que registra el <a href="https://www.mathgenealogy.org/id.php?id=191294">Mathematics Genealogy Project</a>; asà que por ahora mi rama del árbol solo crece hacia arriba. Se remonta a Alfonso Castro y José Francisco Caicedo, y desde ahà a Poisson, los Bernoulli y, finalmente, a Leibniz, que no por casualidad es también el nombre de mi portátil principal. Como anécdota, dâAlembert llegó a solución de la ecuación de onda continua con la que sigo trabajando hoy llevando al lÃmite un modelo discreto, en diferencias finitas, que Johann Bernoulli ya habÃa estudiado dos décadas antes. <a href="./research/genealogy/">Ver el árbol completo â</a></p> 357</section> 358<section id="contacto" class="level2"> 359<h2 class="anchored" data-anchor-id="contacto">Contacto</h2> 360<p>Correo: <a href="mailto:[email protected]" class="email">[email protected]</a></p> 361<p>Para la lista completa de publicaciones, el CV en PDF y mis perfiles académicos, ve a la página de <a href="./research/index.html">Research</a>. Los trabajos y notas más antiguos, casi todos en español, están en <a href="./trabajos/index.html">Trabajos</a>.</p> 362 363 364</section> 365 366</main> <!-- /main -->
367<script id="quarto-html-after-body" type="application/javascript"> 368 window.document.addEventListener("DOMContentLoaded", function (event) { 369 // Ensure there is a toggle, if there isn't float one in the top right 370 if (window.document.querySelector('.quarto-color-scheme-toggle') === null) { 371 const a = window.document.createElement('a'); 372 a.classList.add('top-right'); 373 a.classList.add('quarto-color-scheme-toggle'); 374 a.href = ""; 375 a.onclick = function() { try { window.quartoToggleColorScheme(); } catch {} return false; }; 376 const i = window.document.createElement("i"); 377 i.classList.add('bi'); 378 a.appendChild(i); 379 window.document.body.appendChild(a); 380 } 381 setColorSchemeToggle(hasAlternateSentinel()) 382 const icon = "î§"; 383 const anchorJS = new window.AnchorJS(); 384 anchorJS.options = { 385 placement: 'right', 386 icon: icon 387 }; 388 anchorJS.add('.anchored'); 389 const isCodeAnnotation = (el) => { 390 for (const clz of el.classList) { 391 if (clz.startsWith('code-annotation-')) { 392 return true; 393 } 394 } 395 return false; 396 } 397 const onCopySuccess = function(e) { 398 // button target 399 const button = e.trigger; 400 // don't keep focus 401 button.blur(); 402 // flash "checked" 403 button.classList.add('code-copy-button-checked'); 404 var currentTitle = button.getAttribute("title"); 405 button.setAttribute("title", "Copiado"); 406 let tooltip; 407 if (window.bootstrap) { 408 button.setAttribute("data-bs-toggle", "tooltip"); 409 button.setAttribute("data-bs-placement", "left"); 410 button.setAttribute("data-bs-title", "Copiado"); 411 tooltip = new bootstrap.Tooltip(button, 412 { trigger: "manual", 413 customClass: "code-copy-button-tooltip", 414 offset: [0, -8]}); 415 tooltip.show(); 416 } 417 setTimeout(function() { 418 if (tooltip) { 419 tooltip.hide(); 420 button.removeAttribute("data-bs-title"); 421 button.removeAttribute("data-bs-toggle"); 422 button.removeAttribute("data-bs-placement"); 423 } 424 button.setAttribute("title", currentTitle); 425 button.classList.remove('code-copy-button-checked'); 426 }, 1000); 427 // clear code selection 428 e.clearSelection(); 429 } 430 const getTextToCopy = function(trigger) { 431 const outerScaffold = trigger.parentElement.cloneNode(true); 432 const codeEl = outerScaffold.querySelector('code'); 433 for (const childEl of codeEl.children) { 434 if (isCodeAnnotation(childEl)) { 435 childEl.remove(); 436 } 437 } 438 return codeEl.innerText; 439 } 440 const clipboard = new window.ClipboardJS('.code-copy-button:not([data-in-quarto-modal])', { 441 text: getTextToCopy 442 }); 443 clipboard.on('success', onCopySuccess); 444 if (window.document.getElementById('quarto-embedded-source-code-modal')) { 445 const clipboardModal = new window.ClipboardJS('.code-copy-button[data-in-quarto-modal]', { 446 text: getTextToCopy, 447 container: window.document.getElementById('quarto-embedded-source-code-modal') 448 }); 449 clipboardModal.on('success', onCopySuccess); 450 } 451 var localhostRegex = new RegExp(/^(?:http|https):\/\/localhost\:?[0-9]*\//); 452 var mailtoRegex = new RegExp(/^mailto:/); 453 var filterRegex = new RegExp("https:\/\/arturosanjuan\.xyz"); 454 var isInternal = (href) => { 455 return filterRegex.test(href) || localhostRegex.test(href) || mailtoRegex.test(href); 456 } 457 // Inspect non-navigation links and adorn them if external 458 var links = window.document.querySelectorAll('a[href]:not(.nav-link):not(.navbar-brand):not(.toc-action):not(.sidebar-link):not(.sidebar-item-toggle):not(.pagination-link):not(.no-external):not([aria-hidden]):not(.dropdown-item):not(.quarto-navigation-tool):not(.about-link)'); 459 for (var i=0; i<links.length; i++) { 460 const link = links[i]; 461 if (!isInternal(link.href)) { 462 // undo the damage that might have been done by quarto-nav.js in the case of 463 // links that we want to consider external 464 if (link.dataset.originalHref !== undefined) { 465 link.href = link.dataset.originalHref; 466 } 467 } 468 } 469 function tippyHover(el, contentFn, onTriggerFn, onUntriggerFn) { 470 const config = { 471 allowHTML: true, 472 maxWidth: 500, 473 delay: 100,
474 arrow: false, 475 appendTo: function(el) { 476 return el.parentElement; 477 }, 478 interactive: true, 479 interactiveBorder: 10, 480 theme: 'quarto', 481 placement: 'bottom-start', 482 }; 483 if (contentFn) { 484 config.content = contentFn; 485 } 486 if (onTriggerFn) { 487 config.onTrigger = onTriggerFn; 488 } 489 if (onUntriggerFn) { 490 config.onUntrigger = onUntriggerFn; 491 } 492 window.tippy(el, config); 493 } 494 const noterefs = window.document.querySelectorAll('a[role="doc-noteref"]'); 495 for (var i=0; i<noterefs.length; i++) { 496 const ref = noterefs[i]; 497 tippyHover(ref, function() { 498 // use id or data attribute instead here 499 let href = ref.getAttribute('data-footnote-href') || ref.getAttribute('href'); 500 try { href = new URL(href).hash; } catch {} 501 const id = href.replace(/^#\/?/, ""); 502 const note = window.document.getElementById(id); 503 if (note) { 504 return note.innerHTML; 505 } else { 506 return ""; 507 } 508 }); 509 } 510 const xrefs = window.document.querySelectorAll('a.quarto-xref'); 511 const processXRef = (id, note) => { 512 // Strip column container classes 513 const stripColumnClz = (el) => { 514 el.classList.remove("page-full", "page-columns"); 515 if (el.children) { 516 for (const child of el.children) { 517 stripColumnClz(child); 518 } 519 } 520 } 521 stripColumnClz(note) 522 if (id === null || id.startsWith('sec-')) { 523 // Special case sections, only their first couple elements 524 const container = document.createElement("div"); 525 if (note.children && note.children.length > 2) { 526 container.appendChild(note.children[0].cloneNode(true)); 527 for (let i = 1; i < note.children.length; i++) { 528 const child = note.children[i]; 529 if (child.tagName === "P" && child.innerText === "") { 530 continue; 531 } else { 532 container.appendChild(child.cloneNode(true)); 533 break; 534 } 535 } 536 if (window.Quarto?.typesetMath) { 537 window.Quarto.typesetMath(container); 538 } 539 return container.innerHTML 540 } else { 541 if (window.Quarto?.typesetMath) { 542 window.Quarto.typesetMath(note); 543 } 544 return note.innerHTML; 545 } 546 } else { 547 // Remove any anchor links if they are present 548 const anchorLink = note.querySelector('a.anchorjs-link'); 549 if (anchorLink) { 550 anchorLink.remove(); 551 } 552 if (window.Quarto?.typesetMath) { 553 window.Quarto.typesetMath(note); 554 } 555 if (note.classList.contains("callout")) { 556 return note.outerHTML; 557 } else { 558 return note.innerHTML; 559 } 560 } 561 } 562 for (var i=0; i<xrefs.length; i++) { 563 const xref = xrefs[i]; 564 tippyHover(xref, undefined, function(instance) { 565 instance.disable(); 566 let url = xref.getAttribute('href'); 567 let hash = undefined; 568 if (url.startsWith('#')) { 569 hash = url; 570 } else { 571 try { hash = new URL(url).hash; } catch {} 572 } 573 if (hash) { 574 const id = hash.replace(/^#\/?/, ""); 575 const note = window.document.getElementById(id); 576 if (note !== null) { 577 try { 578 const html = processXRef(id, note.cloneNode(true)); 579 instance.setContent(html); 580 } finally { 581 instance.enable(); 582 instance.show(); 583 } 584 } else { 585 // See if we can fetch this 586 fetch(url.split('#')[0]) 587 .then(res => res.text()) 588 .then(html => { 589 const parser = new DOMParser(); 590 const htmlDoc = parser.parseFromString(html, "text/html"); 591 const note = htmlDoc.getElementById(id); 592 if (note !== null) { 593 const html = processXRef(id, note); 594 instance.setContent(html); 595 } 596 }).finally(() => { 597 instance.enable(); 598 instance.show(); 599 }); 600 } 601 } else { 602 // See if we can fetch a full url (with no hash to target)
603 // This is a special case and we should probably do some content thinning / targeting 604 fetch(url) 605 .then(res => res.text()) 606 .then(html => { 607 const parser = new DOMParser(); 608 const htmlDoc = parser.parseFromString(html, "text/html"); 609 const note = htmlDoc.querySelector('main.content'); 610 if (note !== null) { 611 // This should only happen for chapter cross references 612 // (since there is no id in the URL) 613 // remove the first header 614 if (note.children.length > 0 && note.children[0].tagName === "HEADER") { 615 note.children[0].remove(); 616 } 617 const html = processXRef(null, note); 618 instance.setContent(html); 619 } 620 }).finally(() => { 621 instance.enable(); 622 instance.show(); 623 }); 624 } 625 }, function(instance) { 626 }); 627 } 628 let selectedAnnoteEl; 629 const selectorForAnnotation = ( cell, annotation) => { 630 let cellAttr = 'data-code-cell="' + cell + '"'; 631 let lineAttr = 'data-code-annotation="' + annotation + '"'; 632 const selector = 'span[' + cellAttr + '][' + lineAttr + ']'; 633 return selector; 634 } 635 const selectCodeLines = (annoteEl) => { 636 const doc = window.document; 637 const targetCell = annoteEl.getAttribute("data-target-cell"); 638 const targetAnnotation = annoteEl.getAttribute("data-target-annotation"); 639 const annoteSpan = window.document.querySelector(selectorForAnnotation(targetCell, targetAnnotation)); 640 const lines = annoteSpan.getAttribute("data-code-lines").split(","); 641 const lineIds = lines.map((line) => { 642 return targetCell + "-" + line; 643 }) 644 let top = null; 645 let height = null; 646 let parent = null; 647 if (lineIds.length > 0) { 648 //compute the position of the single el (top and bottom and make a div) 649 const el = window.document.getElementById(lineIds[0]); 650 top = el.offsetTop; 651 height = el.offsetHeight; 652 parent = el.parentElement.parentElement; 653 if (lineIds.length > 1) { 654 const lastEl = window.document.getElementById(lineIds[lineIds.length - 1]); 655 const bottom = lastEl.offsetTop + lastEl.offsetHeight; 656 height = bottom - top; 657 } 658 if (top !== null && height !== null && parent !== null) { 659 // cook up a div (if necessary) and position it 660 let div = window.document.getElementById("code-annotation-line-highlight"); 661 if (div === null) { 662 div = window.document.createElement("div"); 663 div.setAttribute("id", "code-annotation-line-highlight"); 664 div.style.position = 'absolute'; 665 parent.appendChild(div); 666 } 667 div.style.top = top - 2 + "px"; 668 div.style.height = height + 4 + "px"; 669 div.style.left = 0; 670 let gutterDiv = window.document.getElementById("code-annotation-line-highlight-gutter"); 671 if (gutterDiv === null) { 672 gutterDiv = window.document.createElement("div"); 673 gutterDiv.setAttribute("id", "code-annotation-line-highlight-gutter"); 674 gutterDiv.style.position = 'absolute'; 675 const codeCell = window.document.getElementById(targetCell); 676 const gutter = codeCell.querySelector('.code-annotation-gutter'); 677 gutter.appendChild(gutterDiv); 678 } 679 gutterDiv.style.top = top - 2 + "px"; 680 gutterDiv.style.height = height + 4 + "px"; 681 } 682 selectedAnnoteEl = annoteEl; 683 } 684 }; 685 const unselectCodeLines = () => { 686 const elementsIds = ["code-annotation-line-highlight", "code-annotation-line-highlight-gutter"]; 687 elementsIds.forEach((elId) => { 688 const div = window.document.getElementById(elId); 689 if (div) { 690 div.remove(); 691 } 692 }); 693 selectedAnnoteEl = undefined; 694 }; 695 // Handle positioning of the toggle 696 window.addEventListener( 697 "resize", 698 throttle(() => { 699 elRect = undefined; 700 if (selectedAnnoteEl) { 701 selectCodeLines(selectedAnnoteEl); 702 } 703 }, 10) 704 ); 705 function throttle(fn, ms) { 706 let throttle = false;
707 let timer; 708 return (...args) => { 709 if(!throttle) { // first call gets through 710 fn.apply(this, args); 711 throttle = true; 712 } else { // all the others get throttled 713 if(timer) clearTimeout(timer); // cancel #2 714 timer = setTimeout(() => { 715 fn.apply(this, args); 716 timer = throttle = false; 717 }, ms); 718 } 719 }; 720 } 721 // Attach click handler to the DT 722 const annoteDls = window.document.querySelectorAll('dt[data-target-cell]'); 723 for (const annoteDlNode of annoteDls) { 724 annoteDlNode.addEventListener('click', (event) => { 725 const clickedEl = event.target; 726 if (clickedEl !== selectedAnnoteEl) { 727 unselectCodeLines(); 728 const activeEl = window.document.querySelector('dt[data-target-cell].code-annotation-active'); 729 if (activeEl) { 730 activeEl.classList.remove('code-annotation-active'); 731 } 732 selectCodeLines(clickedEl); 733 clickedEl.classList.add('code-annotation-active'); 734 } else { 735 // Unselect the line 736 unselectCodeLines(); 737 clickedEl.classList.remove('code-annotation-active'); 738 } 739 }); 740 } 741 const findCites = (el) => { 742 const parentEl = el.parentElement; 743 if (parentEl) { 744 const cites = parentEl.dataset.cites; 745 if (cites) { 746 return { 747 el, 748 cites: cites.split(' ') 749 }; 750 } else { 751 return findCites(el.parentElement) 752 } 753 } else { 754 return undefined; 755 } 756 }; 757 var bibliorefs = window.document.querySelectorAll('a[role="doc-biblioref"]'); 758 for (var i=0; i<bibliorefs.length; i++) { 759 const ref = bibliorefs[i]; 760 const citeInfo = findCites(ref); 761 if (citeInfo) { 762 tippyHover(citeInfo.el, function() { 763 var popup = window.document.createElement('div'); 764 citeInfo.cites.forEach(function(cite) { 765 var citeDiv = window.document.createElement('div'); 766 citeDiv.classList.add('hanging-indent'); 767 citeDiv.classList.add('csl-entry'); 768 var biblioDiv = window.document.getElementById('ref-' + cite); 769 if (biblioDiv) { 770 citeDiv.innerHTML = biblioDiv.innerHTML; 771 } 772 popup.appendChild(citeDiv); 773 }); 774 return popup.innerHTML; 775 }); 776 } 777 } 778 }); 779 </script>
779 780<input type="hidden" id="giscus-base-theme" value="preferred_color_scheme"> 781<input type="hidden" id="giscus-alt-theme" value="preferred_color_scheme">
782<script> 783 function loadGiscus() { 784 // Function to get the theme based on body class 785 const getTheme = () => { 786 let baseTheme = document.getElementById('giscus-base-theme').value; 787 let altTheme = document.getElementById('giscus-alt-theme').value; 788 if (authorPrefersDark) { 789 [baseTheme, altTheme] = [altTheme, baseTheme]; 790 } 791 return document.body.classList.contains('quarto-dark') ? altTheme : baseTheme; 792 }; 793 const script = document.createElement("script"); 794 script.src = "https://giscus.app/client.js"; 795 script.async = true; 796 script.dataset.repo = "asanjuanc/arturosanjuan-sitio"; 797 script.dataset.repoId = "R_kgDOTzuHrw"; 798 script.dataset.category = "Comentarios"; 799 script.dataset.categoryId = "DIC_kwDOTzuHr84DD_eD"; 800 script.dataset.mapping = "pathname"; 801 script.dataset.reactionsEnabled = "1"; 802 script.dataset.emitMetadata = "0"; 803 script.dataset.inputPosition = "top"; 804 script.dataset.theme = getTheme(); 805 script.dataset.lang = "es"; 806 script.crossOrigin = "anonymous"; 807 // Append the script to the desired div instead of at the end of the body 808 document.getElementById("quarto-content").appendChild(script); 809 } 810 loadGiscus(); 811</script>
811 812</div> <!-- /content --> 813 814 815 816
817<script type="module" src="https://static.cloudflareinsights.com/beacon.min.js/v4bc70e2c01a94c73b74392e4234840661791215815920" integrity="sha512-L0ha0OXavK/8okipN9F8BtP84dg9DUhPERbBXzwI6dgTA55d2+yweo3pn5CSFYs45/r8md2+xvUPtTdvTNRfjA==" data-cf-beacon='{"version":"2024.11.0","token":"9c7b21c36bb64c69868de214c62806f4","r":1,"spa":2}' crossorigin="anonymous"></script>
817 818</body></html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.