1<!DOCTYPE html> 2<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"><head> 3 4<meta charset="utf-8"> 5<!-- This site is hosted on Netlify. Anyone can build and deploy a site 6 like this one for free: https://netlify.new/?utm_campaign=loops&utm_source=ai-legible&utm_medium=owned&utm_content=comment&utm_id=6214997d-9e50-4e83-a6ea-306b634eeb3a 7 Netlify hosting facts for this site: static/SSR served via Netlify Edge. --> 8<meta name="generator" content="quarto-1.9.17"> 9 10<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes"> 11 12 13<title>Domingo López RodrÃguez</title> 14<style> 15/* Default styles provided by pandoc. 16** See https://pandoc.org/MANUAL.html#variables-for-html for config info. 17*/ 18code{white-space: pre-wrap;} 19span.smallcaps{font-variant: small-caps;} 20div.columns{display: flex; gap: min(4vw, 1.5em);} 21div.column{flex: auto; overflow-x: auto;} 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<script src="../site_libs/cookie-consent/cookie-consent.js"></script>
39 40<link href="../site_libs/cookie-consent/cookie-consent.css" rel="stylesheet">
41<script src="../site_libs/quarto-html/quarto.js" type="module"></script>
vendor: 1 bytes, line 41
41
42<script src="../site_libs/quarto-html/tabsets/tabsets.js" type="module"></script>
vendor: 1 bytes, line 42
42
43<script src="../site_libs/quarto-html/axe/axe-check.js" type="module"></script>
vendor: 1 bytes, line 43
43
44<script src="../site_libs/quarto-html/popper.min.js"></script>
vendor: 1 bytes, line 44
44
45<script src="../site_libs/quarto-html/tippy.umd.min.js"></script>
45 46<link href="../site_libs/quarto-html/tippy.css" rel="stylesheet"> 47<link href="../site_libs/quarto-html/quarto-syntax-highlighting-ce4278342a015d016477ed09bce942c5.css" rel="stylesheet" id="quarto-text-highlighting-styles">
48<script src="../site_libs/bootstrap/bootstrap.min.js"></script>
48 49<link href="../site_libs/bootstrap/bootstrap-icons.css" rel="stylesheet"> 50<link href="../site_libs/bootstrap/bootstrap-137ad79071c2adac38395dead4c968d4.min.css" rel="stylesheet" append-hash="true" id="quarto-bootstrap" data-mode="light">
51<script id="quarto-search-options" type="application/json">{ 52 "location": "navbar", 53 "copy-button": false, 54 "collapse-after": 3, 55 "panel-placement": "end", 56 "type": "overlay", 57 "limit": 50, 58 "keyboard-shortcut": [ 59 "f", 60 "/", 61 "s" 62 ], 63 "show-item-context": false, 64 "language": { 65 "search-no-results-text": "No results", 66 "search-matching-documents-text": "matching documents", 67 "search-copy-link-title": "Copy link to search", 68 "search-hide-matches-text": "Hide additional matches", 69 "search-more-match-text": "more match in this document", 70 "search-more-matches-text": "more matches in this document", 71 "search-clear-button-title": "Clear", 72 "search-text-placeholder": "", 73 "search-detached-cancel-button-title": "Cancel", 74 "search-submit-button-title": "Submit", 75 "search-label": "Search" 76 } 77}</script>
vendor: 67 bytes, lines 77-78
77 78<script async="" src="https://www.googletagmanager.com/gtag/js?id=
78G-SSMR9M3FZG
vendor: 13 bytes, lines 78-79
78"></script> 79
80<script type="text/plain" cookie-consent="tracking"> 81
vendor: 127 bytes, lines 82-85
82window.dataLayer = window.dataLayer || []; 83function gtag(){dataLayer.push(arguments);} 84gtag('js', new Date()); 85gtag('config', '
85G-SSMR9M3FZG
vendor: 29 bytes, line 85
85', { 'anonymize_ip': true});
86</script>
86 87
88<script type="text/javascript" charset="UTF-8"> 89document.addEventListener('DOMContentLoaded', function () { 90cookieconsent.run({ 91 "notice_banner_type":"simple", 92 "consent_type":"express", 93 "palette":"light", 94 "language":"en", 95 "page_load_consent_levels":["strictly-necessary"], 96 "notice_banner_reject_button_hide":false, 97 "preferences_center_close_button_hide":false, 98 "website_name":"" 99 , 100"language":"en" 101 }); 102}); 103</script>
103 104 105<style>html{ scroll-behavior: smooth; }</style> 106<link href="https://fonts.googleapis.com/css?family=Fira+Sans|Merriweather" rel="stylesheet">
107<script src="https://kit.fontawesome.com/0fba9333d8.js" crossorigin="anonymous"></script>
107 108<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/jpswalsh/academicons@1/css/academicons.min.css"> 109<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/animate.css/4.1.1/animate.min.css"> 110
111<script src="https://code.iconify.design/iconify-icon/1.0.7/iconify-icon.min.js"></script>
111 112
113<script src="https://cdnjs.cloudflare.com/ajax/libs/pdf.js/3.4.120/pdf.min.js"></script>
vendor: 1 bytes, line 113
113
114<script src="../prism.js"></script>
vendor: 1 bytes, line 114
114
115<script> 116// Carga el archivo JavaScript de resaltado de sintaxis 117// (sustituye "prism.js" por el nombre del archivo que hayas descargado) 118 119// Crea una función que muestre una ventana popup con el contenido del archivo "cite.bib" 120function showPopup() { 121 // Abre la ventana popup 122 var popupWindow = window.open("", "Popup", "height=500,width=500"); 123 124 // Lee el contenido del archivo "cite.bib" usando Ajax 125 var xhr = new XMLHttpRequest(); 126 xhr.onreadystatechange = function() { 127 if (xhr.readyState == XMLHttpRequest.DONE) { 128 // Cuando el archivo se haya cargado, muestra su contenido en la ventana popup 129 // usando resaltado de sintaxis 130 var text = xhr.responseText; 131 popupWindow.document.body.innerHTML = "<pre><code class='language-bibtex'>" + text + "</code></pre>"; 132 133 // Aplica el resaltado de sintaxis a la ventana popup 134 Prism.highlightAll(); 135 } 136 } 137 xhr.open("GET", "cite.bib", true); 138 xhr.send(); 139} 140 141document.addEventListener("DOMContentLoaded", function() { 142 // Configure PDF.js Worker 143 pdfjsLib.GlobalWorkerOptions.workerSrc = 'https://cdnjs.cloudflare.com/ajax/libs/pdf.js/3.4.120/pdf.worker.min.js'; 144 145 // Inyectar estructura del Slides Modal en el body 146 const modalDiv = document.createElement("div"); 147 modalDiv.className = "slides-modal"; 148 modalDiv.id = "global-slides-modal"; 149 modalDiv.innerHTML = ` 150 <div class="slides-modal-content animate__animated animate__fadeInUp animate__faster"> 151 <div class="slides-modal-header"> 152 <h3 class="slides-modal-title"><i class="bi bi-easel"></i> Presentation Slides</h3> 153 <button class="slides-modal-close" id="global-slides-modal-close">×</button> 154 </div> 155 156 <!-- Container for reveal.js or HTML slides --> 157 <div class="slides-modal-body" id="slides-iframe-container" style="display: none; width: 100%; height: 100%;"> 158 <iframe src="" id="global-slides-modal-iframe" allowfullscreen></iframe> 159 </div> 160 161 <!-- Container for PDF slides (Slide deck player) --> 162 <div class="slides-modal-body" id="slides-pdf-container" style="background-color: #1a1a1a; display: flex; align-items: center; justify-content: center; overflow: auto; padding: 20px; position: relative; min-height: 400px; flex: 1;"> 163 <!-- Loading spinner --> 164 <div id="slides-loading" style="color: #fff; display: flex; flex-direction: column; align-items: center; gap: 10px; position: absolute; z-index: 10;"> 165 <div class="spinner-border text-light" role="status" style="width: 2rem; height: 2rem;"></div> 166 <span style="font-weight: 500; font-size: 0.95rem;">Loading presentation...</span> 167 </div> 168 <!-- Canvas for rendering slides --> 169 <canvas id="slides-canvas" style="box-shadow: 0 8px 30px rgba(0,0,0,0.6); max-width: 100%; max-height: 100%; display: none; background-color: #fff; border-radius: 4px;"></canvas> 170 </div> 171 172 <!-- PDF Player Controls --> 173 <div class="slides-modal-footer" id="slides-pdf-controls" style="padding: 12px 20px; background-color: #f8f9fa; border-top: 1px solid #dee2e6; display: flex; align-items: center; justify-content: space-between;"> 174 <button class="slides-modal-btn" id="prev-slide-btn" style="border: none; background: #dee2e6; color: #333; padding: 6px 18px; border-radius: 20px; font-weight: 600; cursor: pointer; display: inline-flex; align-items: center; gap: 6px; transition: all 0.2s ease;"> 175 <i class="bi bi-chevron-left"></i> Previous 176 </button> 177 <span style="font-size: 0.95rem; font-weight: 600; color: #495057; font-family: var(--font-sans);"> 178 Slide <span id="current-page-num">0</span> of <span id="total-page-count">0</span> 179 </span> 180 <button class="slides-modal-btn" id="next-slide-btn" style="border: none; background: #dee2e6; color: #333; padding: 6px 18px; border-radius: 20px; font-weight: 600; cursor: pointer; display: inline-flex; align-items: center; gap: 6px; transition: all 0.2s ease;"> 181 Next <i class="bi bi-chevron-right"></i> 182 </button> 183 </div> 184 </div> 185 `; 186 document.body.appendChild(modalDiv); 187 188 const modal = document.getElementById("global-slides-modal"); 189 const iframe = document.getElementById("global-slides-modal-iframe"); 190 const closeBtn = document.getElementById("global-slides-modal-close"); 191 const canvas = document.getElementById("slides-canvas"); 192 const ctx = canvas.getContext("2d"); 193 194 let pdfDoc = null, 195 pageNum = 1, 196 pageRendering = false, 197 pageNumPending = null; 198 199 // Escuchar clics en los enlaces de slides 200 document.addEventListener("click", function(e) { 201 const trigger = e.target.closest(".slides-modal-trigger"); 202 if (trigger) { 203 e.preventDefault(); 204 const href = trigger.getAttribute("href"); 205 206 modal.style.display = "flex"; 207 document.body.style.overflow = "hidden"; 208 209 const isPdf = href.toLowerCase().endsWith(".pdf"); 210 211 if (isPdf) { 212 document.getElementById("slides-iframe-container").style.display = "none"; 213 document.getElementById("slides-pdf-container").style.display = "flex";
214 document.getElementById("slides-pdf-controls").style.display = "flex"; 215 document.getElementById("slides-loading").style.display = "flex"; 216 document.getElementById("slides-loading").innerHTML = ` 217 <div class="spinner-border text-light" role="status" style="width: 2rem; height: 2rem;"></div> 218 <span style="font-weight: 500; font-size: 0.95rem;">Loading presentation...</span> 219 `; 220 canvas.style.display = "none"; 221 222 pdfjsLib.getDocument(href).promise.then(function(pdfDoc_) { 223 pdfDoc = pdfDoc_; 224 document.getElementById("total-page-count").textContent = pdfDoc.numPages; 225 pageNum = 1; 226 227 document.getElementById("slides-loading").style.display = "none"; 228 canvas.style.display = "block"; 229 230 renderPage(pageNum); 231 }).catch(function(err) { 232 console.error("Error loading PDF: ", err); 233 document.getElementById("slides-loading").innerHTML = '<span style="color: #c92a2a; font-weight: 600;">Error: Failed to load slides.</span>'; 234 }); 235 } else { 236 document.getElementById("slides-pdf-container").style.display = "none"; 237 document.getElementById("slides-pdf-controls").style.display = "none"; 238 document.getElementById("slides-iframe-container").style.display = "block"; 239 iframe.src = href; 240 } 241 } 242 }); 243 244 function renderPage(num) { 245 pageRendering = true; 246 pdfDoc.getPage(num).then(function(page) { 247 // Responsive responsiveScale based on viewport size 248 let unscaledViewport = page.getViewport({scale: 1.0}); 249 let containerWidth = canvas.parentElement.clientWidth - 40; 250 let containerHeight = canvas.parentElement.clientHeight - 40; 251 252 let widthScale = containerWidth / unscaledViewport.width; 253 let heightScale = containerHeight / unscaledViewport.height; 254 let responsiveScale = Math.min(widthScale, heightScale); 255 256 // Clamp values to keep it crisp and fast 257 responsiveScale = Math.min(Math.max(responsiveScale, 0.8), 2.2); 258 259 let viewport = page.getViewport({scale: responsiveScale}); 260 canvas.height = viewport.height; 261 canvas.width = viewport.width; 262 263 let renderContext = { 264 canvasContext: ctx, 265 viewport: viewport 266 }; 267 let renderTask = page.render(renderContext); 268 269 renderTask.promise.then(function() { 270 pageRendering = false; 271 if (pageNumPending !== null) { 272 renderPage(pageNumPending); 273 pageNumPending = null; 274 } 275 }); 276 }); 277 278 document.getElementById("current-page-num").textContent = num; 279 } 280 281 function queueRenderPage(num) { 282 if (pageRendering) { 283 pageNumPending = num; 284 } else { 285 renderPage(num); 286 } 287 } 288 289 function onPrevPage() { 290 if (!pdfDoc || pageNum <= 1) return; 291 pageNum--; 292 queueRenderPage(pageNum); 293 } 294 295 function onNextPage() { 296 if (!pdfDoc || pageNum >= pdfDoc.numPages) return; 297 pageNum++; 298 queueRenderPage(pageNum); 299 } 300 301 document.getElementById("prev-slide-btn").addEventListener("click", onPrevPage); 302 document.getElementById("next-slide-btn").addEventListener("click", onNextPage); 303 304 // Keyboard navigation for PDF slide viewer 305 document.addEventListener("keydown", function(e) { 306 if (modal.style.display === "flex" && pdfDoc) { 307 if (e.key === "ArrowLeft" || e.key === "PageUp") { 308 onPrevPage(); 309 } else if (e.key === "ArrowRight" || e.key === " " || e.key === "PageDown") { 310 e.preventDefault(); 311 onNextPage(); 312 } 313 } 314 }); 315 316 // Cerrar modal 317 function closeModal() { 318 modal.style.display = "none"; 319 iframe.src = ""; 320 pdfDoc = null; 321 document.body.style.overflow = ""; // Reactivar scroll 322 } 323 324 closeBtn.addEventListener("click", closeModal); 325 modal.addEventListener("click", function(e) { 326 if (e.target === modal) { 327 closeModal(); 328 } 329 }); 330 331 // Inyectar estructura del BibTeX Modal en el body 332 const bibModalDiv = document.createElement("div"); 333 bibModalDiv.className = "bibtex-modal"; 334 bibModalDiv.id = "global-bibtex-modal"; 335 bibModalDiv.innerHTML = ` 336 <div class="bibtex-modal-content animate__animated animate__fadeInUp animate__faster"> 337 <div class="bibtex-modal-header"> 338 <h3 class="bibtex-modal-title">
338<i class="bi bi-code-slash"></i> BibTeX Citation</h3> 339 <button class="bibtex-modal-close" id="global-bibtex-modal-close">×</button> 340 </div> 341 <div class="bibtex-modal-body"> 342 <pre><code id="global-bibtex-modal-code"></code></pre> 343 </div> 344 <div class="bibtex-modal-footer"> 345 <button class="bibtex-modal-btn bibtex-modal-btn-secondary" id="global-bibtex-modal-copy"> 346 <i class="bi bi-clipboard"></i> Copy BibTeX 347 </button> 348 <button class="bibtex-modal-btn bibtex-modal-btn-primary" id="global-bibtex-modal-download"> 349 <i class="bi bi-download"></i> Download .bib 350 </button> 351 </div> 352 </div> 353 `; 354 document.body.appendChild(bibModalDiv); 355 356 const bibModal = document.getElementById("global-bibtex-modal"); 357 const bibCode = document.getElementById("global-bibtex-modal-code"); 358 const bibCloseBtn = document.getElementById("global-bibtex-modal-close"); 359 const bibCopyBtn = document.getElementById("global-bibtex-modal-copy"); 360 const bibDownloadBtn = document.getElementById("global-bibtex-modal-download"); 361 362 let currentBibtex = ""; 363 let currentFilename = "citation.bib"; 364 365 // Escuchar clics en los botones de BibTeX 366 document.addEventListener("click", function(e) { 367 const trigger = e.target.closest(".show-bibtex-btn"); 368 if (trigger) { 369 e.preventDefault(); 370 currentBibtex = trigger.getAttribute("data-bibtex") || ""; 371 currentFilename = trigger.getAttribute("data-filename") || "citation.bib"; 372 373 bibCode.textContent = currentBibtex; 374 bibModal.style.display = "flex"; 375 document.body.style.overflow = "hidden"; 376 377 // Reset copy button 378 bibCopyBtn.innerHTML = '<i class="bi bi-clipboard"></i> Copy BibTeX'; 379 bibCopyBtn.classList.remove("copied"); 380 } 381 }); 382 383 // Cerrar BibTeX modal 384 function closeBibModal() { 385 bibModal.style.display = "none"; 386 document.body.style.overflow = ""; 387 } 388 389 bibCloseBtn.addEventListener("click", closeBibModal); 390 bibModal.addEventListener("click", function(e) { 391 if (e.target === bibModal) { 392 closeBibModal(); 393 } 394 }); 395 396 // Copiar al portapapeles 397 bibCopyBtn.addEventListener("click", function() { 398 navigator.clipboard.writeText(currentBibtex).then(function() { 399 bibCopyBtn.innerHTML = '<i class="bi bi-check-lg"></i> Copied!'; 400 bibCopyBtn.classList.add("copied"); 401 setTimeout(function() { 402 bibCopyBtn.innerHTML = '<i class="bi bi-clipboard"></i> Copy BibTeX'; 403 bibCopyBtn.classList.remove("copied"); 404 }, 2000); 405 }).catch(function(err) { 406 console.error("Could not copy BibTeX: ", err); 407 }); 408 }); 409 410 // Descargar archivo .bib 411 bibDownloadBtn.addEventListener("click", function() { 412 const blob = new Blob([currentBibtex], { type: "text/plain;charset=utf-8" }); 413 const link = document.createElement("a"); 414 link.href = URL.createObjectURL(blob); 415 link.download = currentFilename; 416 document.body.appendChild(link); 417 link.click(); 418 document.body.removeChild(link); 419 }); 420 421 document.addEventListener("keydown", function(e) { 422 if (e.key === "Escape") { 423 if (modal.style.display === "flex") { 424 closeModal(); 425 } 426 if (bibModal.style.display === "flex") { 427 closeBibModal(); 428 } 429 } 430 }); 431 432 // --- PREMIUM BLOG INTERACTIVE UX --- 433 const isBlogPost = window.location.pathname.includes("/blog/") && 434 !window.location.pathname.endsWith("/blog/") && 435 !window.location.pathname.endsWith("/blog/index.html"); 436 437 if (isBlogPost) { 438 // 1. Reading progress bar 439 const progBar = document.createElement("div"); 440 progBar.id = "reading-progress-bar"; 441 progBar.style.cssText = "position: fixed; top: 0; left: 0; height: 3px; background-color: #bd666d; width: 0%; z-index: 9999; transition: width 0.1s ease;"; 442 document.body.appendChild(progBar); 443 444 window.addEventListener("scroll", function() { 445 const winScroll = document.documentElement.scrollTop || document.body.scrollTop; 446 const height = document.documentElement.scrollHeight - document.documentElement.clientHeight; 447 const scrolled = height > 0 ? (winScroll / height) * 100 : 0; 448 progBar.style.width = scrolled + "%"; 449 }); 450 451 // 2. Dynamic Share widget 452 const shareDiv = document.createElement("div"); 453 shareDiv.className = "blog-share-widget"; 454 shareDiv.innerHTML = ` 455 <a href="https://twitter.com/intent/tweet?url=${encodeURIComponent(window.location.href)}&text=${encodeURIComponent(document.title)}" target="_blank" title="Share on Twitter"><i class="fa-brands fa-twitter"></i></a> 456 <a href="https://www.linkedin.com/sharing/share-offsite/?url=${encodeURIComponent(window.location.href)}" target="_blank" title="Share on LinkedIn"><i class="fa-brands fa-linkedin"></i></a> 457 <button id="blog-copy-link" title="Copy Link"><i class="fa-solid fa-link"></i></button> 458 `; 459 document.body.appendChild(shareDiv); 460 461 document.getElementById("blog-copy-link").addEventListener("click", function() { 462 navigator.clipboard.writeText(window.location.href).then(function() { 463 const btn = document.getElementById("blog-copy-link"); 464 btn.innerHTML = '<i class="fa-solid fa-check" style="color: #bd666d;"></i>'; 465 setTimeout(() => { 466 btn.innerHTML = '<i class="fa-solid fa-link"></i>'; 467 }, 2000); 468 }); 469 }); 470 } 471}); 472</script>
472 473 474 475<link rel="stylesheet" href="../styles.css"> 476<meta property="og:title" content="Domingo López RodrÃguez"> 477<meta property="og:site_name" content="Domingo López RodrÃguez"> 478<meta name="twitter:title" content="Domingo López RodrÃguez"> 479<meta name="twitter:creator" content="@dominlopez"> 480<meta name="twitter:card" content="summary_large_image"> 481</head> 482 483<body class="nav-fixed quarto-light"> 484 485<div id="quarto-search-results"></div> 486 <header id="quarto-header" class="headroom fixed-top"> 487 <nav class="navbar navbar-expand-lg " data-bs-theme="dark"> 488 <div class="navbar-container container-fluid"> 489 <div class="navbar-brand-container mx-auto"> 490 <a class='navbar-brand' href='/'> 491 <span class="navbar-title">Domingo López RodrÃguez</span> 492 </a> 493 </div> 494 <div id="quarto-search" class="" title="Search"></div> 495 <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarCollapse" aria-controls="navbarCollapse" role="menu" aria-expanded="false" aria-label="Toggle navigation" onclick="if (window.quartoToggleHeadroom) { window.quartoToggleHeadroom(); }"> 496 <span class="navbar-toggler-icon"></span> 497</button> 498 <div class="collapse navbar-collapse" id="navbarCollapse"> 499 <ul class="navbar-nav navbar-nav-scroll ms-auto"> 500 <li class="nav-item"> 501 <a aria-current='page' class='nav-link active' href='/about/'> 502<span class="menu-text">About</span></a> 503 </li> 504 <li class="nav-item"> 505 <a class='nav-link' href='/teaching/'> 506<span class="menu-text">Teaching</span></a> 507 </li> 508 <li class="nav-item dropdown "> 509 <a class="nav-link dropdown-toggle" href="#" id="nav-menu-research" role="link" data-bs-toggle="dropdown" aria-expanded="false"> 510 <span class="menu-text">Research</span> 511 </a> 512 <ul class="dropdown-menu dropdown-menu-end" aria-labelledby="nav-menu-research"> 513 <li> 514 <a class='dropdown-item' href='/research/'> 515 <span class="dropdown-text">Research summary</span></a> 516 </li> 517 <li> 518 <a class='dropdown-item' href='/publications/'> 519 <span class="dropdown-text">Publications</span></a> 520 </li> 521 <li> 522 <a class='dropdown-item' href='/projects/'> 523 <span class="dropdown-text">Projects</span></a> 524 </li> 525 <li> 526 <a class='dropdown-item' href='/talks/'> 527 <span class="dropdown-text">Talks</span></a> 528 </li> 529 </ul> 530 </li> 531 <li class="nav-item"> 532 <a class='nav-link' href='/resources/'> 533<span class="menu-text">Resources</span></a> 534 </li> 535 <li class="nav-item"> 536 <a class='nav-link' href='/blog/'> 537<span class="menu-text">Blog</span></a> 538 </li> 539</ul> 540 </div> <!-- /navcollapse --> 541 <div class="quarto-navbar-tools"> 542</div> 543 </div> <!-- /container-fluid --> 544 </nav> 545</header> 546<!-- content --> 547<div id="quarto-content" class="quarto-container page-columns page-rows-contents page-layout-full page-navbar"> 548<!-- sidebar --> 549<!-- margin-sidebar --> 550 551<!-- main --> 552<div class="quarto-about-solana page-columns page-full column-body"> 553 <div class="about-entity page-columns page-full"> 554 <div class="entity-contents page-columns page-full"> 555 <header id="title-block-header" class="quarto-title-block default"> 556<div class="quarto-title"> 557<h1 class="title">Domingo López RodrÃguez</h1> 558</div> 559<div class="quarto-title-meta column-body"> 560 </div> 561</header> <div class="about-links"> 562 <a href="https://twitter.com/dominlopez" class="about-link" rel="" target=""> 563 <i class="bi bi-twitter"></i> 564 <span class="about-link-text">Twitter</span> 565 </a> 566 <a href="https://mastodon.social/" class="about-link" rel="" target=""> 567 <i class="bi bi-mastodon"></i> 568 <span class="about-link-text">Mastodon</span> 569 </a> 570 <a href="https://github.com/neuroimaginador" class="about-link" rel="" target=""> 571 <i class="bi bi-github"></i> 572 <span class="about-link-text">Github</span> 573 </a> 574 <a href="mailto:[email protected]" class="about-link" rel="" target=""> 575 <i class="bi bi-envelope"></i> 576 <span class="about-link-text">Email</span> 577 </a> 578 <a href="/cv.pdf" class="about-link" rel="" target=""> 579 <i class="bi bi-file-earmark-pdf-fill"></i> 580 <span class="about-link-text">CV (Full)</span> 581 </a> 582 <a href="/cv-5years.pdf" class="about-link" rel="" target=""> 583 <i class="bi bi-file-earmark-pdf"></i> 584 <span class="about-link-text">CV (5 Years)</span> 585 </a> 586</div> 587 <div class="about-contents page-columns page-full"><main class="content page-columns page-full column-body" id="quarto-document-content"> 588<div class="column-page"> 589<div class="tabset-margin-container"></div><div class="panel-tabset"> 590<ul class="nav nav-tabs" role="tablist"><li class="nav-item" role="presentation"><a class="nav-link active" id="tabset-1-1-tab" data-bs-toggle="tab" data-bs-target="#tabset-1-1" role="tab" aria-controls="tabset-1-1" aria-selected="true" href="">Biography</a></li><li class="nav-item" role="presentation"><a class="nav-link" id="tabset-1-2-tab" data-bs-toggle="tab" data-bs-target="#tabset-1-2" role="tab" aria-controls="tabset-1-2" aria-selected="false" href="">Education & Interests</a></li><li class="nav-item" role="presentation"><a class="nav-link" id="tabset-1-3-tab" data-bs-toggle="tab" data-bs-target="#tabset-1-3" role="tab" aria-controls="tabset-1-3" aria-selected="false" href="">Responsibilities</a></li><li class="nav-item" role="presentation"><a class="nav-link" id="tabset-1-4-tab" data-bs-toggle="tab" data-bs-target="#tabset-1-4" role="tab" aria-controls="tabset-1-4" aria-selected="false" href="">Contact & Location</a></li></ul> 591<div class="tab-content"> 592<div id="tabset-1-1" class="tab-pane active" role="tabpanel" aria-labelledby="tabset-1-1-tab"> 593<p>I am currently a professor at the <strong>University of Málaga</strong> in Spain, in the Department of Applied Mathematics.</p> 594<p>I studied for my undergraduate degree in Mathematics at the same university, and later obtained my Doctoral degree by defending my thesis on a new method of mathematical optimization with applications to artificial neural networks. I specialized in neural networks, computational learning, and image analysis.</p> 595<p>Before joining the university, I worked for <strong>nine years as an R&D manager</strong> in a private company, focusing on digital processing of medical images (neuroimaging) and developing products for neuroscience.</p> 596<p>This experience led me to expert mastery of <strong>R</strong>, developing over 20 packages for research and teaching.</p> 597<div class="text-center my-4"> 598<p class="text-muted"> 599<em>Member of the <a href="http://circulodeilusionismomalaga.blogspot.com/">CÃrculo de Ilusionistas Malagueños</a> and founder of the <a href="https://malagarusers.netlify.app/">R usersâ group in Málaga</a>.</em> 600</p> 601</div> 602</div> 603<div id="tabset-1-2" class="tab-pane" role="tabpanel" aria-labelledby="tabset-1-2-tab"> 604<section id="education" class="level3"> 605<h3 data-anchor-id="education">Education</h3> 606<ul> 607<li><i class="bi bi-mortarboard-fill"></i> <strong>Doctorate</strong>, University of Málaga (2007)</li> 608<li><i class="bi bi-mortarboard"></i> <strong>Bachelorâs Degree in Mathematics</strong>, University of Málaga (2001)</li> 609</ul> 610</section> 611<section id="interests" class="level3"> 612<h3 data-anchor-id="interests">Interests</h3> 613<div class="grid"> 614<div class="g-col-12 g-col-md-4"> 615<p><strong>Data Science</strong></p> 616<ul> 617<li>Data Visualization</li> 618<li>Scientific Communication</li> 619<li>R Programming</li> 620</ul> 621</div> 622<div class="g-col-12 g-col-md-4"> 623<p><strong>Research</strong></p> 624<ul> 625<li>Formal Concept Analysis</li> 626<li>Machine/Deep Learning</li> 627<li>Neuroimaging</li> 628</ul> 629</div> 630<div class="g-col-12 g-col-md-4"> 631<p><strong>Community</strong></p> 632<ul> 633<li>Open Source</li> 634<li>Education & Teaching</li> 635</ul> 636</div> 637</div> 638</section> 639<section id="trivia" class="level3"> 640<h3 data-anchor-id="trivia">Trivia</h3> 641<p>My <a href="http://www.oakland.edu/enp/">Erdös number</a> is 4 via Nicolás Madrid / Vladik Kreinovich / Paul C. Kainen / Paul Erdös.</p> 642</section> 643</div> 644<div id="tabset-1-3" class="tab-pane" role="tabpanel" aria-labelledby="tabset-1-3-tab"> 645<section id="conferences-organization" class="level3"> 646<h3 data-anchor-id="conferences-organization">Conferences & Organization</h3> 647<p><strong>Conferences and Sessions organizing committee</strong>:</p> 648<ul> 649<li>Special Session on <em>Formal Concept Analysis and Uncertainty</em> at the <a href="https://ipmu2022.disco.unimib.it/">19th International Conference on Information Processing and Management of Uncertainty in Knowledge-Based Systems</a> (IPMU 2022), held in Milan, Italy, on July 11th â 15th, 2022.</li> 650<li>Program Chair of the <a href="https://www.kde.cs.uni-kassel.de/icfca2023/">17th International Conference on Formal Concept Analysis</a> (ICFCA 2023), held at the University of Kassel, Germany, on July 17th â 21st, 2023.</li> 651<li>Symposium Chair of the <a href="https://attend.ieee.org/ssci-2023/ieee-symposium-on-foundations-of-computational-intelligence-ieee-foci/">IEEE Symposium on Foundations of Computational Intelligence</a> (SSCI FOCI 2023) held at Mexico City, Mexico, on December 5th â 8th, 2023.</li> 652<li>Program Chair of the <a href="https://concepts2026.org/">3rd International Conference on Conceptual Structures</a> (CONCEPTS 2026), at Montpellier, France, on August, 31st â September, 4th, 2026.</li> 653</ul> 654<p><strong>Programme Committee member for</strong>:</p> 655<ul> 656<li><a href="https://concepts2024.uca.es/">International Joint Conference on Conceptual Knowledge Structures 2024</a> (CONCEPTS 2024), held in Cádiz, Spain.</li> 657<li><a href="https://caepia24.aepia.org/">Conferencia de la Asociación Española para la Inteligencia Artificial 2024</a> (CAEPIA 2024), <em>Conference of the Spanish Association for Artificial Intelligence</em>, held in A Coruña, Spain.</li> 658<li><a href="https://ijcrs24.cs.smu.ca/">International Joint Conference on Rough Sets 2024</a> (IJCRS 2024), held in Halifax, Nova Scotia, Canada.</li> 659</ul> 660</section> 661<section id="administrative" class="level3"> 662<h3 data-anchor-id="administrative">Administrative</h3> 663<ul> 664<li>ERASMUS+ academic tutor at the <em>ETSI de Informática</em> for the following destinations: 665<ul> 666<li>Universitaet Kassel (Germany).</li> 667<li>Pavol Jozef Safarik University at Kosice (Slovakia).</li> 668<li>Université de Lille (France).</li> 669<li>Université Clermont-Auvergne (France).</li> 670<li>Charles University at Prague (Czech Republic).</li> 671</ul></li> 672<li>Coordinator of the <em>EstadÃstica y Métodos Numéricos</em> (Statistics and Numerical Methods) subject in <em>ETSI de Telecomunicaciones</em> from 2020 to 2023.</li> 673<li>Coordinator of the <em>Estructuras Algebraicas para la Computación</em> (Algebraic Structures for Computation) subject in <em>ETSI de Informática</em> from 2023.</li> 674</ul> 675</section> 676</div> 677<div id="tabset-1-4" class="tab-pane" role="tabpanel" aria-labelledby="tabset-1-4-tab"> 678<p><a href="https://www.uma.es/matematica-aplicada/">Departmento de Matemática Aplicada</a>, <a href="https://www.uma.es/">Universidad de Málaga</a>, Campus de Teatinos, 29071, Málaga, Spain. Office 2.2.7, ETSI de Informática y Telecomunicaciones.</p> 679<iframe src="https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d25586.456052121437!2d-4.493380899922942!3d36.715187349837!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0xd72f74b9f3606f1%3A0x9fa32cc2e6b0bbf9!2sE.T.S.%20de%20Ingenier%C3%ADa%20Inform%C3%A1tica!5e0!3m2!1ses!2ses!4v1671016531150!5m2!1ses!2ses" width="100%" height="400" style="border:0;" allowfullscreen="" loading="lazy" referrerpolicy="no-referrer-when-downgrade"> 680</iframe> 681</div> 682</div> 683</div> 684</div> 685 686 687</main></div> 688 </div> 689 <img src="/avatar.png" class="about-image 690 rounded " style="width: 15em;"> 691 </div> 692</div> 693 <!-- /main -->
694<script id="quarto-html-after-body" type="application/javascript"> 695 window.document.addEventListener("DOMContentLoaded", function (event) { 696 const isCodeAnnotation = (el) => { 697 for (const clz of el.classList) { 698 if (clz.startsWith('code-annotation-')) { 699 return true; 700 } 701 } 702 return false; 703 } 704 const onCopySuccess = function(e) { 705 // button target 706 const button = e.trigger; 707 // don't keep focus 708 button.blur(); 709 // flash "checked" 710 button.classList.add('code-copy-button-checked'); 711 var currentTitle = button.getAttribute("title"); 712 button.setAttribute("title", "Copied!"); 713 let tooltip; 714 if (window.bootstrap) { 715 button.setAttribute("data-bs-toggle", "tooltip"); 716 button.setAttribute("data-bs-placement", "left"); 717 button.setAttribute("data-bs-title", "Copied!"); 718 tooltip = new bootstrap.Tooltip(button, 719 { trigger: "manual", 720 customClass: "code-copy-button-tooltip", 721 offset: [0, -8]}); 722 tooltip.show(); 723 } 724 setTimeout(function() { 725 if (tooltip) { 726 tooltip.hide(); 727 button.removeAttribute("data-bs-title"); 728 button.removeAttribute("data-bs-toggle"); 729 button.removeAttribute("data-bs-placement"); 730 } 731 button.setAttribute("title", currentTitle); 732 button.classList.remove('code-copy-button-checked'); 733 }, 1000); 734 // clear code selection 735 e.clearSelection(); 736 } 737 const getTextToCopy = function(trigger) { 738 const outerScaffold = trigger.parentElement.cloneNode(true); 739 const codeEl = outerScaffold.querySelector('code'); 740 for (const childEl of codeEl.children) { 741 if (isCodeAnnotation(childEl)) { 742 childEl.remove(); 743 } 744 } 745 return codeEl.innerText; 746 } 747 const clipboard = new window.ClipboardJS('.code-copy-button:not([data-in-quarto-modal])', { 748 text: getTextToCopy 749 }); 750 clipboard.on('success', onCopySuccess); 751 if (window.document.getElementById('quarto-embedded-source-code-modal')) { 752 const clipboardModal = new window.ClipboardJS('.code-copy-button[data-in-quarto-modal]', { 753 text: getTextToCopy, 754 container: window.document.getElementById('quarto-embedded-source-code-modal') 755 }); 756 clipboardModal.on('success', onCopySuccess); 757 } 758 var localhostRegex = new RegExp(/^(?:http|https):\/\/localhost\:?[0-9]*\//); 759 var mailtoRegex = new RegExp(/^mailto:/); 760 var filterRegex = new RegExp("https:\/\/dominlopez\.netlify\.app"); 761 var isInternal = (href) => { 762 return filterRegex.test(href) || localhostRegex.test(href) || mailtoRegex.test(href); 763 } 764 // Inspect non-navigation links and adorn them if external 765 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)'); 766 for (var i=0; i<links.length; i++) { 767 const link = links[i]; 768 if (!isInternal(link.href)) { 769 // undo the damage that might have been done by quarto-nav.js in the case of 770 // links that we want to consider external 771 if (link.dataset.originalHref !== undefined) { 772 link.href = link.dataset.originalHref; 773 } 774 } 775 } 776 function tippyHover(el, contentFn, onTriggerFn, onUntriggerFn) { 777 const config = { 778 allowHTML: true, 779 maxWidth: 500, 780 delay: 100, 781 arrow: false, 782 appendTo: function(el) { 783 return el.parentElement; 784 }, 785 interactive: true, 786 interactiveBorder: 10, 787 theme: 'quarto', 788 placement: 'bottom-start', 789 }; 790 if (contentFn) { 791 config.content = contentFn; 792 } 793 if (onTriggerFn) { 794 config.onTrigger = onTriggerFn; 795 } 796 if (onUntriggerFn) { 797 config.onUntrigger = onUntriggerFn; 798 } 799 window.tippy(el, config); 800 } 801 const noterefs = window.document.querySelectorAll('a[role="doc-noteref"]'); 802 for (var i=0; i<noterefs.length; i++) { 803 const ref = noterefs[i]; 804 tippyHover(ref, function() { 805 // use id or data attribute instead here 806 let href = ref.getAttribute('data-footnote-href') || ref.getAttribute('href'); 807 try { href = new URL(href).hash; } catch {} 808 const id = href.replace(/^#\/?/, ""); 809 const note = window.document.getElementById(id); 810 if (note) { 811 return note.innerHTML; 812 } else { 813 return ""; 814 } 815 }); 816 } 817 const xrefs = window.document.querySelectorAll('a.quarto-xref'); 818 const processXRef = (id, note) => { 819 // Strip column container classes 820 const stripColumnClz = (el) => { 821 el.classList.remove("page-full", "page-columns"); 822 if (el.children) { 823 for (const child of el.children) {
824 stripColumnClz(child); 825 } 826 } 827 } 828 stripColumnClz(note) 829 if (id === null || id.startsWith('sec-')) { 830 // Special case sections, only their first couple elements 831 const container = document.createElement("div"); 832 if (note.children && note.children.length > 2) { 833 container.appendChild(note.children[0].cloneNode(true)); 834 for (let i = 1; i < note.children.length; i++) { 835 const child = note.children[i]; 836 if (child.tagName === "P" && child.innerText === "") { 837 continue; 838 } else { 839 container.appendChild(child.cloneNode(true)); 840 break; 841 } 842 } 843 if (window.Quarto?.typesetMath) { 844 window.Quarto.typesetMath(container); 845 } 846 return container.innerHTML 847 } else { 848 if (window.Quarto?.typesetMath) { 849 window.Quarto.typesetMath(note); 850 } 851 return note.innerHTML; 852 } 853 } else { 854 // Remove any anchor links if they are present 855 const anchorLink = note.querySelector('a.anchorjs-link'); 856 if (anchorLink) { 857 anchorLink.remove(); 858 } 859 if (window.Quarto?.typesetMath) { 860 window.Quarto.typesetMath(note); 861 } 862 if (note.classList.contains("callout")) { 863 return note.outerHTML; 864 } else { 865 return note.innerHTML; 866 } 867 } 868 } 869 for (var i=0; i<xrefs.length; i++) { 870 const xref = xrefs[i]; 871 tippyHover(xref, undefined, function(instance) { 872 instance.disable(); 873 let url = xref.getAttribute('href'); 874 let hash = undefined; 875 if (url.startsWith('#')) { 876 hash = url; 877 } else { 878 try { hash = new URL(url).hash; } catch {} 879 } 880 if (hash) { 881 const id = hash.replace(/^#\/?/, ""); 882 const note = window.document.getElementById(id); 883 if (note !== null) { 884 try { 885 const html = processXRef(id, note.cloneNode(true)); 886 instance.setContent(html); 887 } finally { 888 instance.enable(); 889 instance.show(); 890 } 891 } else { 892 // See if we can fetch this 893 fetch(url.split('#')[0]) 894 .then(res => res.text()) 895 .then(html => { 896 const parser = new DOMParser(); 897 const htmlDoc = parser.parseFromString(html, "text/html"); 898 const note = htmlDoc.getElementById(id); 899 if (note !== null) { 900 const html = processXRef(id, note); 901 instance.setContent(html); 902 } 903 }).finally(() => { 904 instance.enable(); 905 instance.show(); 906 }); 907 } 908 } else { 909 // See if we can fetch a full url (with no hash to target) 910 // This is a special case and we should probably do some content thinning / targeting 911 fetch(url) 912 .then(res => res.text()) 913 .then(html => { 914 const parser = new DOMParser(); 915 const htmlDoc = parser.parseFromString(html, "text/html"); 916 const note = htmlDoc.querySelector('main.content'); 917 if (note !== null) { 918 // This should only happen for chapter cross references 919 // (since there is no id in the URL) 920 // remove the first header 921 if (note.children.length > 0 && note.children[0].tagName === "HEADER") { 922 note.children[0].remove(); 923 } 924 const html = processXRef(null, note); 925 instance.setContent(html); 926 } 927 }).finally(() => { 928 instance.enable(); 929 instance.show(); 930 }); 931 } 932 }, function(instance) { 933 }); 934 } 935 let selectedAnnoteEl; 936 const selectorForAnnotation = ( cell, annotation) => { 937 let cellAttr = 'data-code-cell="' + cell + '"'; 938 let lineAttr = 'data-code-annotation="' + annotation + '"'; 939 const selector = 'span[' + cellAttr + '][' + lineAttr + ']'; 940 return selector; 941 } 942 const selectCodeLines = (annoteEl) => { 943 const doc = window.document; 944 const targetCell = annoteEl.getAttribute("data-target-cell"); 945 const targetAnnotation = annoteEl.getAttribute("data-target-annotation"); 946 const annoteSpan = window.document.querySelector(selectorForAnnotation(targetCell, targetAnnotation)); 947 const lines = annoteSpan.getAttribute("data-code-lines").split(","); 948 const lineIds = lines.map((line) => { 949 return targetCell + "-" + line; 950 }) 951 let top = null; 952 let height = null; 953 let parent = null; 954 if (lineIds.length > 0) { 955 //compute the position of the single el (top and bottom and make a div) 956 const el = window.document.getElementById(lineIds[0]); 957 top = el.offsetTop; 958 height = el.offsetHeight; 959 parent = el.parentElement.parentElement; 960 if (lineIds.length > 1) { 961 const lastEl = window.document.getElementById(lineIds[lineIds.length - 1]); 962 const bottom = lastEl.offsetTop + lastEl.offsetHeight; 963 height = bottom - top; 964 } 965 if (top !== null && height !== null && parent !== null) { 966 // cook up a div (if necessary) and position it 967 let div = window.document.getElementById("code-annotation-line-highlight"); 968 if (div === null) { 969 div = window.document.createElement("div"); 970 div.setAttribute("id", "code-annotation-line-highlight"); 971 div.style.position = 'absolute'; 972 parent.appendChild(div); 973 } 974 div.style.top = top - 2 + "px"; 975 div.style.height = height + 4 + "px"; 976 div.style.left = 0; 977 let gutterDiv = window.document.getElementById("code-annotation-line-highlight-gutter"); 978 if (gutterDiv === null) { 979 gutterDiv = window.document.createElement("div"); 980 gutterDiv.setAttribute("id", "code-annotation-line-highlight-gutter"); 981 gutterDiv.style.position = 'absolute'; 982 const codeCell = window.document.getElementById(targetCell); 983 const gutter = codeCell.querySelector('.code-annotation-gutter'); 984 gutter.appendChild(gutterDiv); 985 } 986 gutterDiv.style.top = top - 2 + "px"; 987 gutterDiv.style.height = height + 4 + "px"; 988 } 989 selectedAnnoteEl = annoteEl; 990 } 991 }; 992 const unselectCodeLines = () => { 993 const elementsIds = ["code-annotation-line-highlight", "code-annotation-line-highlight-gutter"]; 994 elementsIds.forEach((elId) => { 995 const div = window.document.getElementById(elId); 996 if (div) { 997 div.remove(); 998 } 999 }); 1000 selectedAnnoteEl = undefined; 1001 }; 1002 // Handle positioning of the toggle 1003 window.addEventListener( 1004 "resize", 1005 throttle(() => { 1006 elRect = undefined; 1007 if (selectedAnnoteEl) { 1008 selectCodeLines(selectedAnnoteEl); 1009 } 1010 }, 10) 1011 ); 1012 function throttle(fn, ms) { 1013 let throttle = false;
1014 let timer; 1015 return (...args) => { 1016 if(!throttle) { // first call gets through 1017 fn.apply(this, args); 1018 throttle = true; 1019 } else { // all the others get throttled 1020 if(timer) clearTimeout(timer); // cancel #2 1021 timer = setTimeout(() => { 1022 fn.apply(this, args); 1023 timer = throttle = false; 1024 }, ms); 1025 } 1026 }; 1027 } 1028 // Attach click handler to the DT 1029 const annoteDls = window.document.querySelectorAll('dt[data-target-cell]'); 1030 for (const annoteDlNode of annoteDls) { 1031 annoteDlNode.addEventListener('click', (event) => { 1032 const clickedEl = event.target; 1033 if (clickedEl !== selectedAnnoteEl) { 1034 unselectCodeLines(); 1035 const activeEl = window.document.querySelector('dt[data-target-cell].code-annotation-active'); 1036 if (activeEl) { 1037 activeEl.classList.remove('code-annotation-active'); 1038 } 1039 selectCodeLines(clickedEl); 1040 clickedEl.classList.add('code-annotation-active'); 1041 } else { 1042 // Unselect the line 1043 unselectCodeLines(); 1044 clickedEl.classList.remove('code-annotation-active'); 1045 } 1046 }); 1047 } 1048 const findCites = (el) => { 1049 const parentEl = el.parentElement; 1050 if (parentEl) { 1051 const cites = parentEl.dataset.cites; 1052 if (cites) { 1053 return { 1054 el, 1055 cites: cites.split(' ') 1056 }; 1057 } else { 1058 return findCites(el.parentElement) 1059 } 1060 } else { 1061 return undefined; 1062 } 1063 }; 1064 var bibliorefs = window.document.querySelectorAll('a[role="doc-biblioref"]'); 1065 for (var i=0; i<bibliorefs.length; i++) { 1066 const ref = bibliorefs[i]; 1067 const citeInfo = findCites(ref); 1068 if (citeInfo) { 1069 tippyHover(citeInfo.el, function() { 1070 var popup = window.document.createElement('div'); 1071 citeInfo.cites.forEach(function(cite) { 1072 var citeDiv = window.document.createElement('div'); 1073 citeDiv.classList.add('hanging-indent'); 1074 citeDiv.classList.add('csl-entry'); 1075 var biblioDiv = window.document.getElementById('ref-' + cite); 1076 if (biblioDiv) { 1077 citeDiv.innerHTML = biblioDiv.innerHTML; 1078 } 1079 popup.appendChild(citeDiv); 1080 }); 1081 return popup.innerHTML; 1082 }); 1083 } 1084 } 1085 }); 1086 </script>
1086 1087<input type="hidden" id="giscus-base-theme" value="light"> 1088<input type="hidden" id="giscus-alt-theme" value="light">
1089<script> 1090 function loadGiscus() { 1091 // Function to get the theme based on body class 1092 const getTheme = () => { 1093 let baseTheme = document.getElementById('giscus-base-theme').value; 1094 let altTheme = document.getElementById('giscus-alt-theme').value; 1095 return document.body.classList.contains('quarto-dark') ? altTheme : baseTheme; 1096 }; 1097 const script = document.createElement("script"); 1098 script.src = "https://giscus.app/client.js"; 1099 script.async = true; 1100 script.dataset.repo = "neuroimaginador/website"; 1101 script.dataset.repoId = "R_kgDOJ1sUKw"; 1102 script.dataset.category = "General"; 1103 script.dataset.categoryId = "DIC_kwDOJ1sUK84CdJtu"; 1104 script.dataset.mapping = "title"; 1105 script.dataset.reactionsEnabled = "1"; 1106 script.dataset.emitMetadata = "0"; 1107 script.dataset.inputPosition = "top"; 1108 script.dataset.theme = getTheme(); 1109 script.dataset.lang = "en"; 1110 script.crossOrigin = "anonymous"; 1111 // Append the script to the desired div instead of at the end of the body 1112 document.getElementById("quarto-content").appendChild(script); 1113 } 1114 loadGiscus(); 1115</script>
1115 1116</div> <!-- /content --> 1117<footer class="footer"> 1118 <div class="nav-footer"> 1119 <div class="nav-footer-left"> 1120<p><strong>Domingo López-RodrÃguez</strong><br> Department of Applied Mathematics<br> University of Málaga</p> 1121</div> 1122 <div class="nav-footer-center"> 1123 <ul class="footer-items list-unstyled"> 1124 <li class="nav-item compact"> 1125 <a class="nav-link" href="https://twitter.com/dominlopez"> 1126 <i class="bi bi-twitter" role="img" aria-label="Twitter"> 1127</i> 1128 </a> 1129 </li> 1130 <li class="nav-item compact"> 1131 <a class="nav-link" href="https://mastodon.social/"> 1132 <i class="bi bi-mastodon" role="img" aria-label="Mastodon"> 1133</i> 1134 </a> 1135 </li> 1136 <li class="nav-item compact"> 1137 <a class="nav-link" href="https://github.com/neuroimaginador"> 1138 <i class="bi bi-github" role="img" aria-label="Github"> 1139</i> 1140 </a> 1141 </li> 1142 <li class="nav-item compact"> 1143 <a class="nav-link" href="mailto:[email protected]"> 1144 <i class="bi bi-envelope" role="img" aria-label="Email"> 1145</i> 1146 </a> 1147 </li> 1148</ul> 1149 <div class="cookie-consent-footer"><a href="#" id="open_preferences_center">Cookie Preferences</a></div></div> 1150 <div class="nav-footer-right"> 1151<p><a href="https://www.uma.es" target="_blank" style="color: #fdfbf7; text-decoration: underline;">University of Málaga</a><br> Built with <a href="https://quarto.org">Quarto</a></p> 1152</div> 1153 </div> 1154</footer> 1155 1156 1157 1158
1159<script src="../site_libs/quarto-html/zenscroll-min.js"></script>
1159 1160</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.