PageSourceSearch

https://arturosanjuan.xyz/about

html arturosanjuan.xyz collected 2026-10-10 01:54:57 UTC 35,574 bytes, 818 lines download raw bytes

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.