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<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>Tom Louwerse</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="./icon.png" rel="icon" type="image/png">
40<script src="site_libs/quarto-listing/list.min.js"></script>
vendor: 1 bytes, line 40
40
41<script src="site_libs/quarto-listing/quarto-listing.js"></script>
vendor: 1 bytes, line 41
41
42<script src="site_libs/quarto-html/quarto.js" type="module"></script>
vendor: 1 bytes, line 42
42
43<script src="site_libs/quarto-html/tabsets/tabsets.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>
vendor: 1 bytes, line 45
45
46<script src="site_libs/quarto-html/anchor.min.js"></script>
46 47<link href="site_libs/quarto-html/tippy.css" rel="stylesheet"> 48<link href="site_libs/quarto-html/quarto-syntax-highlighting-64a204ab8560d761af7679ceaba22944.css" rel="stylesheet" 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-e9a52603d3f4ec3151646d1bed3a1b40.min.css" rel="stylesheet" append-hash="true" id="quarto-bootstrap" data-mode="light"> 52<link href="site_libs/quarto-contrib/fontawesome6-6.7.2/all.min.css" rel="stylesheet"> 53<link href="site_libs/quarto-contrib/fontawesome6-6.7.2/latex-fontsize.css" rel="stylesheet"> 54<link href="site_libs/quarto-contrib/academicons-1.9.4/all.css" rel="stylesheet"> 55<link href="site_libs/quarto-contrib/academicons-1.9.4/size.css" rel="stylesheet">
56<script id="quarto-search-options" type="application/json">{ 57 "location": "navbar", 58 "copy-button": false, 59 "collapse-after": 3, 60 "panel-placement": "end", 61 "type": "overlay", 62 "limit": 50, 63 "keyboard-shortcut": [ 64 "f", 65 "/", 66 "s" 67 ], 68 "show-item-context": false, 69 "language": { 70 "search-no-results-text": "No results", 71 "search-matching-documents-text": "matching documents", 72 "search-copy-link-title": "Copy link to search", 73 "search-hide-matches-text": "Hide additional matches", 74 "search-more-match-text": "more match in this document", 75 "search-more-matches-text": "more matches in this document", 76 "search-clear-button-title": "Clear", 77 "search-text-placeholder": "", 78 "search-detached-cancel-button-title": "Cancel", 79 "search-submit-button-title": "Submit", 80 "search-label": "Search" 81 } 82}</script>
vendor: 1 bytes, line 82
82
83<script> 84 85 window.document.addEventListener("DOMContentLoaded", function (_event) { 86 const listingTargetEl = window.document.querySelector('#listing-courses .list'); 87 if (!listingTargetEl) { 88 // No listing discovered, do not attach. 89 return; 90 } 91 92 const options = { 93 valueNames: ['listing-title','listing-author','listing-image','listing-description',{ data: ['index'] },{ data: ['categories'] },{ data: ['listing-date-sort'] },{ data: ['listing-file-modified-sort'] }], 94 95 searchColumns: ["listing-title","listing-author","listing-image","listing-description"], 96 }; 97 98 window['quarto-listings'] = window['quarto-listings'] || {}; 99 window['quarto-listings']['listing-courses'] = new List('listing-courses', options); 100 101 if (window['quarto-listing-loaded']) { 102 window['quarto-listing-loaded'](); 103 } 104 }); 105 106 window.addEventListener('hashchange',() => { 107 if (window['quarto-listing-loaded']) { 108 window['quarto-listing-loaded'](); 109 } 110 }) 111 112 113 window.document.addEventListener("DOMContentLoaded", function (_event) { 114 const listingTargetEl = window.document.querySelector('#listing-projects .list'); 115 if (!listingTargetEl) { 116 // No listing discovered, do not attach. 117 return; 118 } 119 120 const options = { 121 valueNames: ['listing-title','listing-author','listing-image','listing-description',{ data: ['index'] },{ data: ['categories'] },{ data: ['listing-date-sort'] },{ data: ['listing-file-modified-sort'] }], 122 123 searchColumns: ["listing-title","listing-author","listing-image","listing-description"], 124 }; 125 126 window['quarto-listings'] = window['quarto-listings'] || {}; 127 window['quarto-listings']['listing-projects'] = new List('listing-projects', options); 128 129 if (window['quarto-listing-loaded']) { 130 window['quarto-listing-loaded'](); 131 } 132 }); 133 134 window.addEventListener('hashchange',() => { 135 if (window['quarto-listing-loaded']) { 136 window['quarto-listing-loaded'](); 137 } 138 }) 139 140 141 window.document.addEventListener("DOMContentLoaded", function (_event) { 142 const listingTargetEl = window.document.querySelector('#listing-themes .list'); 143 if (!listingTargetEl) { 144 // No listing discovered, do not attach. 145 return; 146 } 147 148 const options = { 149 valueNames: ['listing-title','listing-author','listing-image','listing-description',{ data: ['index'] },{ data: ['categories'] },{ data: ['listing-date-sort'] },{ data: ['listing-file-modified-sort'] }], 150 page: 3, 151 pagination: { item: "<li class='page-item'><a class='page page-link' href='#'></a></li>" }, 152 searchColumns: ["listing-title","listing-author","listing-image","listing-description"], 153 }; 154 155 window['quarto-listings'] = window['quarto-listings'] || {}; 156 window['quarto-listings']['listing-themes'] = new List('listing-themes', options); 157 158 if (window['quarto-listing-loaded']) { 159 window['quarto-listing-loaded'](); 160 } 161 }); 162 163 window.addEventListener('hashchange',() => { 164 if (window['quarto-listing-loaded']) { 165 window['quarto-listing-loaded'](); 166 } 167 }) 168 169 170 window.document.addEventListener("DOMContentLoaded", function (_event) { 171 const listingTargetEl = window.document.querySelector('#listing-publications .list'); 172 if (!listingTargetEl) { 173 // No listing discovered, do not attach. 174 return; 175 } 176 177 const options = { 178 valueNames: ['listing-title','listing-author','listing-date','listing-image','listing-description',{ data: ['index'] },{ data: ['categories'] },{ data: ['listing-date-sort'] },{ data: ['listing-file-modified-sort'] }], 179 page: 18, 180 pagination: { item: "<li class='page-item'><a class='page page-link' href='#'></a></li>" }, 181 searchColumns: ["listing-title","listing-author","listing-date","listing-image","listing-description"], 182 }; 183 184 window['quarto-listings'] = window['quarto-listings'] || {}; 185 window['quarto-listings']['listing-publications'] = new List('listing-publications', options); 186 187 if (window['quarto-listing-loaded']) { 188 window['quarto-listing-loaded'](); 189 } 190 }); 191 192 window.addEventListener('hashchange',() => { 193 if (window['quarto-listing-loaded']) { 194 window['quarto-listing-loaded'](); 195 } 196 }) 197 198 199 window.document.addEventListener("DOMContentLoaded", function (_event) { 200 const listingTargetEl = window.document.querySelector('#listing-talks .list'); 201 if (!listingTargetEl) { 202 // No listing discovered, do not attach. 203 return; 204 } 205 206 const options = { 207 valueNames: ['listing-date','listing-title','listing-event',{ data: ['index'] },{ data: ['categories'] },{ data: ['listing-date-sort'] },{ data: ['listing-file-modified-sort'] }], 208 page: 18, 209 pagination: { item: "<li class='page-item'><a class='page page-link' href='#'></a></li>" }, 210 searchColumns: ["listing-title","listing-author","listing-date","listing-image","listing-description"], 211 }; 212 213 window['quarto-listings'] = window['quarto-listings'] || {}; 214 window['quarto-listings']['listing-talks'] = new List('listing-talks', options); 215 216 if (window['quarto-listing-loaded']) { 217 window['quarto-listing-loaded'](); 218 } 219 }); 220 221 window.addEventListener('hashchange',() => { 222 if (window['quarto-listing-loaded']) { 223 window['quarto-listing-loaded'](); 224 } 225 }) 226 </script>
226 227<style> 228.quarto-title-block, 229.title-block { 230 display: none !important; 231} 232</style> 233 234
234<script src="https://cdnjs.cloudflare.com/polyfill/v3/polyfill.min.js?features=es6"></script>
234 235
235<script defer="" src="https://cdn.jsdelivr.net/npm/mathjax@4/tex-chtml.js" type="text/javascript"></script>
235 236
237<script type="text/javascript"> 238const typesetMath = (el) => { 239 if (window.MathJax) { 240 // MathJax Typeset 241 window.MathJax.typeset([el]); 242 } else if (window.katex) { 243 // KaTeX Render 244 var mathElements = el.getElementsByClassName("math"); 245 var macros = []; 246 for (var i = 0; i < mathElements.length; i++) { 247 var texText = mathElements[i].firstChild; 248 if (mathElements[i].tagName == "SPAN" && texText && texText.data) { 249 window.katex.render(texText.data, mathElements[i], { 250 displayMode: mathElements[i].classList.contains('display'), 251 throwOnError: false, 252 macros: macros, 253 fleqn: false 254 }); 255 } 256 } 257 } 258} 259window.Quarto = { 260 typesetMath 261}; 262</script>
262 263 264<meta property="og:title" content="Tom Louwerse"> 265<meta property="og:description" content="Tom Louwerse, Professor of Political Behaviour and Research Methods at Leiden University"> 266<meta property="og:image" content="https://www.tomlouwerse.nl/images/tl-full.jpg"> 267<meta property="og:site_name" content="Tom Louwerse"> 268<meta name="twitter:title" content="Tom Louwerse"> 269<meta name="twitter:description" content="Tom Louwerse, Professor of Political Behaviour and Research Methods at Leiden University"> 270<meta name="twitter:image" content="https://www.tomlouwerse.nl/images/tl-full.jpg"> 271<meta name="twitter:card" content="summary_large_image"> 272<link rel="canonical" href="https://www.tomlouwerse.nl/"> 273</head> 274 275<body class="nav-fixed quarto-light"> 276 277<div id="quarto-search-results"></div> 278 <header id="quarto-header" class="headroom fixed-top"> 279 <nav class="navbar navbar-expand-lg " data-bs-theme="dark"> 280 <div class="navbar-container container-fluid"> 281 <div class="navbar-brand-container mx-auto"> 282 <a class="navbar-brand" href="./index.html"> 283 <span class="navbar-title">Tom Louwerse</span> 284 </a> 285 </div> 286 <div id="quarto-search" class="" title="Search"></div> 287 <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(); }"> 288 <span class="navbar-toggler-icon"></span> 289</button> 290 <div class="collapse navbar-collapse" id="navbarCollapse"> 291 <ul class="navbar-nav navbar-nav-scroll me-auto"> 292 <li class="nav-item"> 293 <a class="nav-link active" href="./index.html" aria-current="page"> 294<span class="menu-text">Home</span></a> 295 </li> 296 <li class="nav-item"> 297 <a class="nav-link" href="./bio/"> 298<span class="menu-text">Bio</span></a> 299 </li> 300 <li class="nav-item"> 301 <a class="nav-link" href="./index.html#teaching"> 302<span class="menu-text">Teaching</span></a> 303 </li> 304 <li class="nav-item"> 305 <a class="nav-link" href="./index.html#research"> 306<span class="menu-text">Research</span></a> 307 </li> 308 <li class="nav-item"> 309 <a class="nav-link" href="./publications/"> 310<span class="menu-text">Publications</span></a> 311 </li> 312 <li class="nav-item"> 313 <a class="nav-link" href="./index.html#data"> 314<span class="menu-text">Data</span></a> 315 </li> 316 <li class="nav-item"> 317 <a class="nav-link" href="./index.html#outreach"> 318<span class="menu-text">Outreach</span></a> 319 </li> 320 <li class="nav-item"> 321 <a class="nav-link" href="./index.html#contact"> 322<span class="menu-text">Contact</span></a> 323 </li> 324</ul> 325 <ul class="navbar-nav navbar-nav-scroll ms-auto"> 326 <li class="nav-item dropdown "> 327 <a class="nav-link dropdown-toggle" href="#" id="nav-menu-bi-globe" role="link" data-bs-toggle="dropdown" aria-expanded="false"> 328 <i class="bi bi-globe" role="img"> 329</i> 330 <span class="menu-text"></span> 331 </a> 332 <ul class="dropdown-menu dropdown-menu-end" aria-labelledby="nav-menu-bi-globe"> 333 <li> 334 <a class="dropdown-item" href="./index.html"> 335 <span class="dropdown-text">English</span></a> 336 </li> 337 <li> 338 <a class="dropdown-item" href="./nl/index.html"> 339 <span class="dropdown-text">Nederlands</span></a> 340 </li> 341 </ul> 342 </li> 343</ul> 344 </div> <!-- /navcollapse --> 345 <div class="quarto-navbar-tools"> 346</div> 347 </div> <!-- /container-fluid --> 348 </nav> 349</header> 350<!-- content --> 351<div id="quarto-content" class="quarto-container page-columns page-rows-contents page-layout-full page-navbar"> 352<!-- sidebar --> 353<!-- margin-sidebar --> 354 355<!-- main --> 356<main class="content column-page" id="quarto-document-content"> 357 358<header id="title-block-header" class="quarto-title-block default"> 359<div class="quarto-title"> 360<h1 class="title">Tom Louwerse</h1> 361</div> 362 363 364 365<div class="quarto-title-meta column-page"> 366 367 368 369 370 </div> 371 372 373 374</header> 375 376 377<div class="hero"> 378<div class="container"> 379<div class="hero-grid"> 380<div class="hero-left"> 381<p><img src="./images/tl-small.webp" class="avatar img-fluid"></p> 382<p><strong class="hero-name">Tom Louwerse</strong><br> 383<span class="hero-role">Professor of Political Behaviour<br> and Research Methods</span><br> 384<span class="hero-inst">Leiden University</span></p> 385<p><a href="mailto:[email protected]"><i class="fa-solid fa-envelope fa-xl" aria-label="envelope"></i></a> <a href="https://bsky.app/profile/tomlouwerse.nl"><i class="fa-brands fa-bluesky fa-xl" aria-label="bluesky"></i></a> <a href="https://github.com/louwerse"><i class="fa-brands fa-github fa-xl" aria-label="github"></i></a> <a href="https://scholar.google.co.uk/citations?user=aECGZgEAAAAJ"><i class="fa-brands fa-google-scholar fa-xl" aria-label="google-scholar"></i></a> <a href="https://dataverse.harvard.edu/dataverse/tomlouwerse"><i class="ai ai-dataverse ai-xl" aria-label="dataverse"></i></a> <a href="https://orcid.org/0000-0003-4131-2724"><i class="ai ai-orcid ai-xl" aria-label="orcid"></i></a> <a href="pdf/CV.pdf"><i class="ai ai-cv ai-xl" aria-label="cv"></i></a></p> 386</div> 387<div class="hero-right"> 388<p>As a political scientist I study and teach about elections, political representation and parliamentary politics in the Netherlands and other established democracies, at the <a href="https://www.universiteitleiden.nl/en/staffmembers/tom-louwerse">Institute of Political Science at Leiden University</a>. I am Vice-Dean of Research and Impact at the <a href="https://www.universiteitleiden.nl/sociale-wetenschappen">Faculty of Social and Behavioural Sciences</a> at Leiden University.</p> 389<p>My recent and current research focuses on political representation and parliamentary opposition. I am co-author of <a href="./publications/2020-andeweg-irwin-louwerse/">Governance and Politics of the Netherlands</a> and co-editor of the <a href="./publications/2024-de-lange-louwerse-t-hart-van-ham/">Oxford Handbook of Dutch Politics</a>.</p> 390<p>I created and maintain the polling aggregation project <a href="http://peilingwijzer.tomlouwerse.nl/">Peilingwijzer</a>, blog about my work and regularly appear in news media.</p> 391<p><i class="fa-brands fa-readme fa-xl" aria-label="readme"></i> <a href="./bio/">Biography</a></p>
392<div class="hero-details"> 393<div class="hero-interests"> 394<p><strong>Interests</strong></p> 395<ul> 396<li>Political Behaviour</li> 397<li>Elections</li> 398<li>Legislative Politics</li> 399<li>Political Representation</li> 400<li>Dutch Politics</li> 401<li>Opinion Polls</li> 402</ul> 403</div> 404<div class="hero-education"> 405<p><strong>Education</strong></p> 406<p> 407<i class="fa-solid fa-graduation-cap"></i> PhD in Political Science, 2011<br><span class="edu-inst">Leiden University</span> 408</p> 409<p> 410<i class="fa-solid fa-graduation-cap"></i> MA in Political Science, 2006<br><span class="edu-inst">Leiden University</span> 411</p> 412</div> 413</div> 414</div> 415</div> 416</div> 417</div> 418<section id="teaching" class="level2 home-section"> 419<h2 class="home-section anchored" data-anchor-id="teaching">Teaching</h2> 420<div class="container"> 421<p>Educating new generations of students is a key role of universities. In the academic year 2026-2027 I have the pleasure of teaching the following course:</p> 422<div id="listing-courses" class="quarto-listing quarto-listing-container-grid"> 423<div class="list grid quarto-listing-cols-3"> 424<div class="g-col-1" data-index="0" data-categories="QmFjaGVsb3I=" data-listing-file-modified-sort="1785770903524" data-listing-reading-time-sort="1" data-listing-word-count-sort="155"> 425<a href="./teaching/current_courses/nederlandse-politiek/index.html" class="quarto-grid-link"> 426<div class="quarto-grid-item card h-100 card-left"> 427<p class="card-img-top"> 428<img loading="lazy" src="./teaching/current_courses/nederlandse-politiek/featured.jpg" class="thumbnail-image card-img" style="height: 150px;" alt="Hofvijver, The Hague (CC BY-SA 4.0, Zairon)"> 429</p> 430<div class="card-body post-contents"> 431<h5 class="no-anchor card-title listing-title"> 432Dutch Politics [Nederlandse Politiek] 433</h5> 434<div class="card-text listing-description delink"> 435<p>Introductory course on Dutch politics, covering the political system, parties, elections andâ¦</p> 436</div> 437<div class="card-attribution card-text-small start"> 438<div class="listing-author"> 439 440</div> 441</div> 442</div> 443</div></a> 444</div> 445</div> 446<div class="listing-no-matching d-none">No matching items</div> 447</div> 448<p><a href="./teaching/previous_courses/">View past courses â</a></p> 449</div> 450</section> 451<section id="research" class="level2 home-section"> 452<h2 class="home-section anchored" data-anchor-id="research">Research</h2> 453<div class="container"> 454<section id="research-themes" class="level3"> 455<h3 class="anchored" data-anchor-id="research-themes">Research themes</h3> 456<div id="listing-themes" class="quarto-listing quarto-listing-container-grid"> 457<div class="list grid quarto-listing-cols-3"> 458<div class="g-col-1" data-index="0" data-listing-file-modified-sort="1778089913172" data-listing-reading-time-sort="1" data-listing-word-count-sort="47"> 459<a href="./research/themes/dutch-politics/index.html" class="quarto-grid-link"> 460<div class="quarto-grid-item card h-100 card-left"> 461<p class="card-img-top"> 462<img loading="lazy" src="./research/themes/dutch-politics/featured.png" class="thumbnail-image card-img" style="height: 150px;" alt="Map of the Netherlands (Public domain)"> 463</p> 464<div class="card-body post-contents"> 465<h5 class="no-anchor card-title listing-title"> 466Dutch Politics 467</h5> 468<div class="card-text listing-description delink"> 469<p>In much of my work there is an empirical focus on the Netherlands</p> 470</div> 471<div class="card-attribution card-text-small start"> 472<div class="listing-author"> 473 474</div> 475</div> 476</div> 477</div></a> 478</div> 479<div class="g-col-1" data-index="1" data-listing-file-modified-sort="1778090460198" data-listing-reading-time-sort="1" data-listing-word-count-sort="90"> 480<a href="./research/themes/opinion-polls/index.html" class="quarto-grid-link"> 481<div class="quarto-grid-item card h-100 card-left"> 482<p class="card-img-top"> 483<img loading="lazy" src="./research/themes/opinion-polls/featured.png" class="thumbnail-image card-img" style="height: 150px;"> 484</p> 485<div class="card-body post-contents"> 486<h5 class="no-anchor card-title listing-title"> 487Opinion Polls 488</h5> 489<div class="card-text listing-description delink"> 490<p>Opinion polls feature prominently in election campaigns. I study their impact and how pollingâ¦</p> 491</div> 492<div class="card-attribution card-text-small start"> 493<div class="listing-author"> 494 495</div> 496</div> 497</div> 498</div></a> 499</div> 500<div class="g-col-1" data-index="2" data-listing-file-modified-sort="1778089906044" data-listing-reading-time-sort="1" data-listing-word-count-sort="82"> 501<a href="./research/themes/parliaments/index.html" class="quarto-grid-link"> 502<div class="quarto-grid-item card h-100 card-left"> 503<p class="card-img-top"> 504<img loading="lazy" src="./research/themes/parliaments/featured.jpg" class="thumbnail-image card-img" style="height: 150px;
504" alt="CC-BY-SA 3.0 [Edwtie](https://commons.wikimedia.org/wiki/User:Edwtie)"> 505</p> 506<div class="card-body post-contents"> 507<h5 class="no-anchor card-title listing-title"> 508Parliaments 509</h5> 510<div class="card-text listing-description delink"> 511<p>How do MPs and parties behave in parliament?</p> 512</div> 513<div class="card-attribution card-text-small start"> 514<div class="listing-author"> 515 516</div> 517</div> 518</div> 519</div></a> 520</div> 521<div class="g-col-1" data-index="3" data-listing-file-modified-sort="1778089923360" data-listing-reading-time-sort="1" data-listing-word-count-sort="35"> 522<a href="./research/themes/political-representation/index.html" class="quarto-grid-link"> 523<div class="quarto-grid-item card h-100 card-left"> 524<p class="card-img-top"> 525<img loading="lazy" data-src="./research/themes/political-representation/featured.jpg" class="thumbnail-image card-img" style="height: 150px;" alt="Collectie SPAARNESTAD PHOTO/NA/Anefo/Kroon"> 526</p> 527<div class="card-body post-contents"> 528<h5 class="no-anchor card-title listing-title"> 529Political Representation 530</h5> 531<div class="card-text listing-description delink"> 532<p>Are representatives doing what people want?</p> 533</div> 534<div class="card-attribution card-text-small start"> 535<div class="listing-author"> 536 537</div> 538</div> 539</div> 540</div></a> 541</div> 542<div class="g-col-1" data-index="4" data-categories="ZWxlY3Rpb25zJTJDbWV0aG9kb2xvZ3klMkNhY3RpdmU=" data-listing-file-modified-sort="1778089485280" data-listing-reading-time-sort="1" data-listing-word-count-sort="99"> 543<a href="./research/themes/vaa/index.html" class="quarto-grid-link"> 544<div class="quarto-grid-item card h-100 card-left"> 545<p class="card-img-top"> 546<img loading="lazy" data-src="./research/themes/vaa/featured.jpg" class="thumbnail-image card-img" style="height: 150px;"> 547</p> 548<div class="card-body post-contents"> 549<h5 class="no-anchor card-title listing-title"> 550Voting Advice Applications 551</h5> 552<div class="card-text listing-description delink"> 553<p>VAAs help voters during elections. I study their design.</p> 554</div> 555<div class="card-attribution card-text-small start"> 556<div class="listing-author"> 557 558</div> 559</div> 560</div> 561</div></a> 562</div> 563</div> 564<div class="listing-no-matching d-none">No matching items</div> 565<nav id="themes-pagination" class="listing-pagination" aria-label="Page Navigation"> 566 <ul class="pagination"></ul> 567</nav> 568</div> 569</section> 570<section id="current-research-projects" class="level3"> 571<h3 class="anchored" data-anchor-id="current-research-projects">Current research projects</h3> 572<div id="listing-projects" class="quarto-listing quarto-listing-container-grid"> 573<div class="list grid quarto-listing-cols-3"> 574<div class="g-col-1" data-index="0" data-listing-file-modified-sort="1770929258606" data-listing-reading-time-sort="2" data-listing-word-count-sort="271"> 575<a href="./research/projects/democracyandai/index.html" class="quarto-grid-link"> 576<div class="quarto-grid-item card h-100 card-left"> 577<p class="card-img-top"> 578<img loading="lazy" src="./research/projects/democracyandai/featured.png" class="thumbnail-image card-img" style="height: 150px;" alt="The Democracy & AI logo was designed with the help of ChatGPT."> 579</p> 580<div class="card-body post-contents"> 581<h5 class="no-anchor card-title listing-title"> 582Democracy and AI 583</h5> 584<div class="card-text listing-description delink"> 585<p>This project investigates how generative artificial intelligence (AI) affects democratic systemsâ¦</p> 586</div> 587<div class="card-attribution card-text-small start"> 588<div class="listing-author"> 589 590</div> 591</div> 592</div> 593</div></a> 594</div> 595<div class="g-col-1" data-index="1" data-categories="cGFybGlhbWVudHMlMkNyZXByZXNlbnRhdGlvbg==" data-listing-file-modified-sort="1789073036802" data-listing-reading-time-sort="2" data-listing-word-count-sort="234"> 596<a href="./research/projects/parlementsonderoek/index.html" class="quarto-grid-link"> 597<div class="quarto-grid-item card h-100 card-left"> 598<p class="card-img-top"> 599<img loading="lazy" src="./research/projects/parlementsonderoek/featured.jpg" class="thumbnail-image card-img" style="height: 150px;" alt="Tweede Kamer der Staten-Generaal"> 600</p> 601<div class="card-body post-contents"> 602<h5 class="no-anchor card-title listing-title"> 603Dutch Parliamentary Study 604</h5> 605<div class="card-text listing-description delink"> 606<p>The 2025 Dutch Parliamentary Study is a comprehensive survey of views and experiences of membersâ¦</p> 607</div> 608<div class="card-attribution card-text-small start"> 609<div class="listing-author"> 610 611</div> 612</div> 613</div> 614</div></a> 615</div> 616<div class="g-col-1" data-index="2" data-categories="cGFybGlhbWVudHMlMkNyZXByZXNlbnRhdGlvbg==" data-listing-file-modified-sort="1785784710451" data-listing-reading-time-sort="2" data-listing-word-count-sort="251"> 617<a href="./research/projects/who-opposes/index.html" class="quarto-grid-link"> 618<div class="quarto-grid-item card h-100 card-left"> 619<p class="card-img-top"> 620<img loading="lazy" src="./research/projects/who-opposes/featured.jpg" class="thumbnail-image card-img" style="height: 150px;" alt="Image: Opposition by [Nick Youngson](http://www.nyphotographic.com/ ) CC BY-SA 3.0 [Alpha Stock Images](http://alphastockimages.com/ )"> 621</p> 622<div class="card-body post-contents"> 623<h5 class="no-anchor card-title listing-title"> 624Who opposes? 625</h5> 626<div class="card-text listing-description delink"> 627<p>The main objectives of this project were to measure and explain government-opposition cooperationâ¦</p> 628</div> 629<div class="card-attribution card-text-small start"> 630<div class="listing-author"> 631 632</div> 633</div> 634</div> 635</div></a> 636</div> 637</div> 638<div class="listing-no-matching d-none">No matching items</div> 639</div> 640<p><a href="./research/finished_projects/">View finished projects â</a></p> 641</section> 642</div> 643</section> 644<section id="publications" class="level2 home-section"> 645<h2 class="home-section anchored" data-anchor-id="publications">Recent publications</h2> 646<div class="container"> 647<p><a href="./publications/">View all publications â</a></p> 648<p><a href="./papers/">Conference and working papers â</a></p> 649<div id="listing-publications" class="quarto-listing quarto-listing-container-grid"> 650<div class="list grid quarto-listing-cols-3"> 651<div class="g-col-1" data-index="0" data-categories="UGFybGlhbWVudHMlMkNEdXRjaCUyMFBvbGl0aWNzJTJDUGFybGVtZW50c29uZGVyem9law==" data-listing-date-sort="1788818400000" data-listing-file-modified-sort="1789072944920" data-listing-date-modified-sort="NaN" data-listing-reading-time-sort="1" data-listing-word-count-sort="1"> 652<a href="./publications/2026-louwerse-van-vonno-van-well-van-holsteijn/index.html" class="quarto-grid-link"> 653<div class="quarto-grid-item card h-100 card-left"> 654<p class="card-img-top"> 655<img loading="lazy" src="./publications/2026-louwerse-van-vonno-van-well-van-holsteijn/featured.png" class="thumbnail-image card-img" style="height: 150px;"> 656</p> 657<div class="card-body post-contents"> 658<h5 class="no-anchor card-title listing-title"> 659Stemmen uit de Staten-Generaal 660</h5> 661<div class="card-text listing-description delink"> 662<p>
662Dit rapport biedt een eerste verslag van het Parlementsonderzoek 2025, een periodiekâ¦</p> 663</div> 664<div class="card-attribution card-text-small justify"> 665<div class="listing-author"> 666Tom Louwerse, Cynthia van Vonno, Rick van Well, Joop van Holsteyn 667</div> 668<div class="listing-date"> 6692026 670</div> 671</div> 672</div> 673</div></a> 674</div> 675<div class="g-col-1" data-index="1" data-categories="V2hvJTIwT3Bwb3NlcyUyMFByb2plY3QlMkNQYXJsaWFtZW50cyUyQ1BvbGl0aWNhbCUyMFJlcHJlc2VudGF0aW9u" data-listing-date-sort="1785535200000" data-listing-file-modified-sort="1785746984110" data-listing-date-modified-sort="NaN" data-listing-reading-time-sort="1" data-listing-word-count-sort="31"> 676<a href="./publications/2026-louwerse-van-well/index.html" class="quarto-grid-link"> 677<div class="quarto-grid-item card h-100 card-left"> 678<p class="card-img-top"> 679<img loading="lazy" src="./publications/2026-louwerse-van-well/featured.png" class="thumbnail-image card-img" style="height: 150px;"> 680</p> 681<div class="card-body post-contents"> 682<h5 class="no-anchor card-title listing-title"> 683Opposition Distinctiveness in Parliaments: A Longitudinal Analysis 684</h5> 685<div class="card-text listing-description delink"> 686<p>There are concerns about the distinctiveness of opposition party behaviour in parliaments, but theâ¦</p> 687</div> 688<div class="card-attribution card-text-small justify"> 689<div class="listing-author"> 690Tom Louwerse, Rick van Well 691</div> 692<div class="listing-date"> 6932026 694</div> 695</div> 696</div> 697</div></a> 698</div> 699<div class="g-col-1" data-index="2" data-categories="V2hvJTIwT3Bwb3NlcyUyMFByb2plY3QlMkNQb2xpdGljYWwlMjBSZXByZXNlbnRhdGlvbg==" data-listing-date-sort="1777586400000" data-listing-file-modified-sort="1780071326597" data-listing-date-modified-sort="NaN" data-listing-reading-time-sort="1" data-listing-word-count-sort="31"> 700<a href="./publications/2025-louwerse-zorina/index.html" class="quarto-grid-link"> 701<div class="quarto-grid-item card h-100 card-left"> 702<p class="card-img-top"> 703<img loading="lazy" src="./publications/2025-louwerse-zorina/featured.png" class="thumbnail-image card-img" style="height: 150px;"> 704</p> 705<div class="card-body post-contents"> 706<h5 class="no-anchor card-title listing-title"> 707What kind of opposition do citizens want? 708</h5> 709<div class="card-text listing-description delink"> 710<p>Opposition parties play a crucial role in democracies. While scholars have extensively studiedâ¦</p> 711</div> 712<div class="card-attribution card-text-small justify"> 713<div class="listing-author"> 714Tom Louwerse, Elina Zorina 715</div> 716<div class="listing-date"> 7172026 718</div> 719</div> 720</div> 721</div></a> 722</div> 723<div class="g-col-1" data-index="3" data-categories="UGFybGlhbWVudHM=" data-listing-date-sort="1777327200000" data-listing-file-modified-sort="1788899296120" data-listing-date-modified-sort="NaN" data-listing-reading-time-sort="1" data-listing-word-count-sort="1"> 724<a href="./publications/2026-van-well-louwerse-otjes/index.html" class="quarto-grid-link"> 725<div class="quarto-grid-item card h-100 card-left"> 726<p class="card-img-top"> 727<img loading="lazy" src="./publications/2026-van-well-louwerse-otjes/featured.png" class="thumbnail-image card-img" style="height: 150px;"> 728</p> 729<div class="card-body post-contents"> 730<h5 class="no-anchor card-title listing-title"> 731Schoof en de Kamer: Profilerende fracties en fractievoorzitters aan het roer 732</h5> 733<div class="card-text listing-description delink"> 734<p>Tijdens de kabinetsformatie van 2023 werd de optie van een zogenoemd âextraparlementair kabinetââ¦</p> 735</div> 736<div class="card-attribution card-text-small justify"> 737<div class="listing-author"> 738Rick van Well, Tom Louwerse, Simon Otjes 739</div> 740<div class="listing-date"> 7412026 742</div> 743</div> 744</div> 745</div></a> 746</div> 747<div class="g-col-1" data-index="4" data-categories="UGFybGlhbWVudHM=" data-listing-date-sort="1775512800000" data-listing-file-modified-sort="1776369567439" data-listing-date-modified-sort="NaN" data-listing-reading-time-sort="1" data-listing-word-count-sort="1"> 748<a href="./publications/2026-louwerse/index.html" class="quarto-grid-link"> 749<div class="quarto-grid-item card h-100 card-left"> 750<p class="card-img-top"> 751<img loading="lazy" src="./publications/2026-louwerse/featured.png" class="thumbnail-image card-img" style="height: 150px;"> 752</p> 753<div class="card-body post-contents"> 754<h5 class="no-anchor card-title listing-title"> 755Parliaments 756</h5> 757<div class="card-text listing-description delink"> 758<p>Parliaments are key democratic institutions. Their election is arguably one of the most directâ¦</p> 759</div> 760<div class="card-attribution card-text-small justify"> 761<div class="listing-author"> 762Tom Louwerse 763</div> 764<div class="listing-date"> 7652026 766</div> 767</div> 768</div> 769</div></a> 770</div> 771<div class="g-col-1" data-index="5" data-categories="UG9saXRpY2FsJTIwUmVwcmVzZW50YXRpb24=" data-listing-date-sort="1773702000000" data-listing-file-modified-sort="1777932101564" data-listing-date-modified-sort="NaN" data-listing-reading-time-sort="1" data-listing-word-count-sort="1"> 772<a href="./publications/2026-louwerse-andeweg/index.html" class="quarto-grid-link"> 773<div class="quarto-grid-item card h-100 card-left"> 774<p class="card-img-top"> 775<img loading="lazy" src="./publications/2026-louwerse-andeweg/featured.png" class="thumbnail-image card-img" style="height: 150px;"> 776</p> 777<div class="card-body post-contents"> 778<h5 class="no-anchor card-title listing-title"> 779Competitive vs. consensual government and political representation 780</h5> 781<div class="card-text listing-description delink"> 782<p>This article explores the dichotomy between competitive and consensual visions of democracyâ¦</p> 783</div> 784<div class="card-attribution card-text-small justify"> 785<div class="listing-author"> 786Tom Louwerse, Rudy B. Andeweg 787</div> 788<div class="listing-date"> 7892026 790</div> 791</div> 792</div> 793</div></a> 794</div> 795</div> 796<div class="listing-no-matching d-none">No matching items</div> 797</div> 798</div> 799</section> 800<section id="data" class="level2 home-section"> 801<h2 class="home-section anchored" data-anchor-id="data">Data</h2> 802<div class="container"> 803<section id="replication-data" class="level3"> 804<h3 class="anchored" data-anchor-id="replication-data">Replication data</h3> 805<p>Replication data sources for many of my publications are available via <a href="https://dataverse.harvard.edu/dataverse/tomlouwerse">my Harvard dataverse</a>.</p> 806</section> 807<section id="dutch-parliamentary-behaviour-dataset" class="level3"> 808<h3 class="anchored" data-anchor-id="dutch-parliamentary-behaviour-dataset">Dutch Parliamentary Behaviour Dataset</h3> 809<p>Data from the Dutch Parliamentary Behaviour Dataset project (with <a href="https://www.simonotjes.nl/">Simon Otjes</a>, <a href="https://www.universiteitleiden.nl/en/staffmembers/cynthia-van-vonno">Cynthia van Vonno</a> and <a href="https://www.universiteitleiden.nl/medewerkers/harmen-van-der-veer#tab-1">Harmen van der Veer</a>) is available in <a href="https://dataverse.harvard.edu/dataverse/dutchparl">this dataverse</a>. The R package for working with this data is on Github: <a href="https://louwerse.github.io/dutchparl/">louwerse/dutchparl</a>.</p> 810</section> 811</div> 812</section> 813<section id="outreach" class="level2 home-section"> 814<h2 class="home-section anchored" data-anchor-id="outreach">Outreach</h2> 815<div class="container"> 816<section id="popular-publications-and-blogs" class="level3"> 817<h3 class="anchored" data-anchor-id="popular-publications-and-blogs">Popular publications and blogs</h3> 818<p>From time to time, I publish blogs at Stuk Rood Vlees, a Dutch-language political science weblog. Please find <a href="http://stukroodvlees.nl/author/tom-louwerse/">an overview of my contributions here</a>. Before April 2013, my blogs <a href="http://blog.tomlouwerse.nl/">were published here</a>.</p> 819<p>A list of other recent popular publications and blogs is <a href="./blogs">available here</a>.</p> 820<p>I also microblog at <a rel="me" href="https://bsky.app/profile/tomlouwerse.nl">Bluesky</a> and, infrequently, at <a rel="me" href="https://akademienl.social/@tomlouwerse">Mastodon</a>.</p> 821</section> 822<section id="media" class="level3"> 823<h3 class="anchored" data-anchor-id="media">Media</h3> 824<p>
824I regularly share my research findings and observations regarding current events in media interviews with national and international outlets, including BBC World, Bloomberg, BNR, NOS, NRC Handelsblad, RTE, Volkskrant & ZDF.</p> 825<p><a href="./media">A full list of recent interviews and mentions is available here</a></p> 826</section> 827<section id="recent-talks" class="level3"> 828<h3 class="anchored" data-anchor-id="recent-talks">Recent talks</h3> 829<div id="listing-talks" class="quarto-listing quarto-listing-container-grid"> 830<div class="list grid quarto-listing-cols-3"> 831<div class="g-col-1" data-index="0" data-categories="RHV0Y2glMjBQb2xpdGljcyUyQ1BhcmxpYW1lbnRz" data-listing-date-sort="1790924400000" data-listing-file-modified-sort="1790957671611" data-listing-date-modified-sort="NaN" data-listing-reading-time-sort="2" data-listing-word-count-sort="277"> 832<a href="./talks/2026-10-02-copenhagen/index.html" class="quarto-grid-link"> 833<div class="quarto-grid-item card h-100 card-left"> 834<div class="card-body post-contents"> 835<h5 class="no-anchor card-title listing-title"> 836Fragmentation and coalition formation in the Netherlands 837</h5> 838<div class="card-attribution card-text-small end"> 839<div class="listing-date"> 84002-10-2026 841</div> 842</div> 843<table class="card-other-values"> 844 845<tbody><tr> 846<td> 847Event 848</td> 849<td class="event"> 850Seminar: An effective Peopleâs Government? 851</td> 852</tr> 853 854</tbody></table> 855</div> 856</div></a> 857</div> 858<div class="g-col-1" data-index="1" data-categories="UGFybGVtZW50c29uZGVyem9layUyQ0R1dGNoJTIwUG9saXRpY3M=" data-listing-date-sort="1788883200000" data-listing-file-modified-sort="1790957328451" data-listing-date-modified-sort="NaN" data-listing-reading-time-sort="6" data-listing-word-count-sort="1026"> 859<a href="./talks/2026-09-08-eerste-kamer/index.html" class="quarto-grid-link"> 860<div class="quarto-grid-item card h-100 card-left"> 861<div class="card-body post-contents"> 862<h5 class="no-anchor card-title listing-title"> 863Aanbieding Stemmen uit de Staten-Generaal 864</h5> 865<div class="card-attribution card-text-small end"> 866<div class="listing-date"> 86708-09-2026 868</div> 869</div> 870<table class="card-other-values"> 871 872<tbody><tr> 873<td> 874Event 875</td> 876<td class="event"> 877Eerste Kamer der Staten-Generaal 878</td> 879</tr> 880 881</tbody></table> 882</div> 883</div></a> 884</div> 885<div class="g-col-1" data-index="2" data-categories="T3BpbmlvbiUyMFBvbGxz" data-listing-date-sort="1761156000000" data-listing-file-modified-sort="1790957328403" data-listing-date-modified-sort="NaN" data-listing-reading-time-sort="1" data-listing-word-count-sort="1"> 886<a href="./talks/2025-10-22-sib/index.html" class="quarto-grid-link"> 887<div class="quarto-grid-item card h-100 card-left"> 888<div class="card-body post-contents"> 889<h5 class="no-anchor card-title listing-title"> 890Hoe gebruik je een peiling wijzer? 891</h5> 892<div class="card-attribution card-text-small end"> 893<div class="listing-date"> 89422-10-2025 895</div> 896</div> 897<table class="card-other-values"> 898 899<tbody><tr> 900<td> 901Event 902</td> 903<td class="event"> 904Studievereniging Internationale Betrekkingen (SIB) Leiden 905</td> 906</tr> 907 908</tbody></table> 909</div> 910</div></a> 911</div> 912</div> 913<div class="listing-no-matching d-none">No matching items</div> 914</div> 915</section> 916</div> 917</section> 918<section id="contact" class="level2 home-section contact"> 919<h2 class="home-section contact anchored" data-anchor-id="contact">Contact</h2> 920<div class="container"> 921<p>Email: <a href="mailto:[email protected]">[email protected]</a></p> 922</div> 923 924 925 926</section> 927 928</main> <!-- /main -->
929<script id="quarto-html-after-body" type="application/javascript"> 930 window.document.addEventListener("DOMContentLoaded", function (event) { 931 const icon = "î§"; 932 const anchorJS = new window.AnchorJS(); 933 anchorJS.options = { 934 placement: 'right', 935 icon: icon 936 }; 937 anchorJS.add('.anchored'); 938 const isCodeAnnotation = (el) => { 939 for (const clz of el.classList) { 940 if (clz.startsWith('code-annotation-')) { 941 return true; 942 } 943 } 944 return false; 945 } 946 const onCopySuccess = function(e) { 947 // button target 948 const button = e.trigger; 949 // don't keep focus 950 button.blur(); 951 // flash "checked" 952 button.classList.add('code-copy-button-checked'); 953 var currentTitle = button.getAttribute("title"); 954 button.setAttribute("title", "Copied!"); 955 let tooltip; 956 if (window.bootstrap) { 957 button.setAttribute("data-bs-toggle", "tooltip"); 958 button.setAttribute("data-bs-placement", "left"); 959 button.setAttribute("data-bs-title", "Copied!"); 960 tooltip = new bootstrap.Tooltip(button, 961 { trigger: "manual", 962 customClass: "code-copy-button-tooltip", 963 offset: [0, -8]}); 964 tooltip.show(); 965 } 966 setTimeout(function() { 967 if (tooltip) { 968 tooltip.hide(); 969 button.removeAttribute("data-bs-title"); 970 button.removeAttribute("data-bs-toggle"); 971 button.removeAttribute("data-bs-placement"); 972 } 973 button.setAttribute("title", currentTitle); 974 button.classList.remove('code-copy-button-checked'); 975 }, 1000); 976 // clear code selection 977 e.clearSelection(); 978 } 979 const getTextToCopy = function(trigger) { 980 const outerScaffold = trigger.parentElement.cloneNode(true); 981 const codeEl = outerScaffold.querySelector('code'); 982 for (const childEl of codeEl.children) { 983 if (isCodeAnnotation(childEl)) { 984 childEl.remove(); 985 } 986 } 987 return codeEl.innerText; 988 } 989 const clipboard = new window.ClipboardJS('.code-copy-button:not([data-in-quarto-modal])', { 990 text: getTextToCopy 991 }); 992 clipboard.on('success', onCopySuccess); 993 if (window.document.getElementById('quarto-embedded-source-code-modal')) { 994 const clipboardModal = new window.ClipboardJS('.code-copy-button[data-in-quarto-modal]', { 995 text: getTextToCopy, 996 container: window.document.getElementById('quarto-embedded-source-code-modal') 997 }); 998 clipboardModal.on('success', onCopySuccess); 999 } 1000 var localhostRegex = new RegExp(/^(?:http|https):\/\/localhost\:?[0-9]*\//); 1001 var mailtoRegex = new RegExp(/^mailto:/); 1002 var filterRegex = new RegExp("https:\/\/www\.tomlouwerse\.nl"); 1003 var isInternal = (href) => { 1004 return filterRegex.test(href) || localhostRegex.test(href) || mailtoRegex.test(href); 1005 } 1006 // Inspect non-navigation links and adorn them if external 1007 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)'); 1008 for (var i=0; i<links.length; i++) { 1009 const link = links[i]; 1010 if (!isInternal(link.href)) { 1011 // undo the damage that might have been done by quarto-nav.js in the case of 1012 // links that we want to consider external 1013 if (link.dataset.originalHref !== undefined) { 1014 link.href = link.dataset.originalHref; 1015 } 1016 } 1017 } 1018 function tippyHover(el, contentFn, onTriggerFn, onUntriggerFn) { 1019 const config = { 1020 allowHTML: true, 1021 maxWidth: 500, 1022 delay: 100, 1023 arrow: false, 1024 appendTo: function(el) { 1025 return el.parentElement; 1026 }, 1027 interactive: true, 1028 interactiveBorder: 10, 1029 theme: 'quarto', 1030 placement: 'bottom-start', 1031 }; 1032 if (contentFn) { 1033 config.content = contentFn; 1034 } 1035 if (onTriggerFn) { 1036 config.onTrigger = onTriggerFn; 1037 } 1038 if (onUntriggerFn) { 1039 config.onUntrigger = onUntriggerFn; 1040 } 1041 window.tippy(el, config); 1042 } 1043 const noterefs = window.document.querySelectorAll('a[role="doc-noteref"]'); 1044 for (var i=0; i<noterefs.length; i++) { 1045 const ref = noterefs[i]; 1046 tippyHover(ref, function() { 1047 // use id or data attribute instead here 1048 let href = ref.getAttribute('data-footnote-href') || ref.getAttribute('href'); 1049 try { href = new URL(href).hash; } catch {} 1050 const id = href.replace(/^#\/?/, ""); 1051 const note = window.document.getElementById(id); 1052 if (note) { 1053 return note.innerHTML; 1054 } else { 1055 return ""; 1056 } 1057 }); 1058 } 1059 const xrefs = window.document.querySelectorAll('a.quarto-xref'); 1060 const processXRef = (id, note) => { 1061 // Strip column container classes 1062 const stripColumnClz = (el) => { 1063 el.classList.remove("page-full", "page-columns"); 1064 if (el.children) { 1065 for (const child of el.children) {
1066 stripColumnClz(child); 1067 } 1068 } 1069 } 1070 stripColumnClz(note) 1071 if (id === null || id.startsWith('sec-')) { 1072 // Special case sections, only their first couple elements 1073 const container = document.createElement("div"); 1074 if (note.children && note.children.length > 2) { 1075 container.appendChild(note.children[0].cloneNode(true)); 1076 for (let i = 1; i < note.children.length; i++) { 1077 const child = note.children[i]; 1078 if (child.tagName === "P" && child.innerText === "") { 1079 continue; 1080 } else { 1081 container.appendChild(child.cloneNode(true)); 1082 break; 1083 } 1084 } 1085 if (window.Quarto?.typesetMath) { 1086 window.Quarto.typesetMath(container); 1087 } 1088 return container.innerHTML 1089 } else { 1090 if (window.Quarto?.typesetMath) { 1091 window.Quarto.typesetMath(note); 1092 } 1093 return note.innerHTML; 1094 } 1095 } else { 1096 // Remove any anchor links if they are present 1097 const anchorLink = note.querySelector('a.anchorjs-link'); 1098 if (anchorLink) { 1099 anchorLink.remove(); 1100 } 1101 if (window.Quarto?.typesetMath) { 1102 window.Quarto.typesetMath(note); 1103 } 1104 if (note.classList.contains("callout")) { 1105 return note.outerHTML; 1106 } else { 1107 return note.innerHTML; 1108 } 1109 } 1110 } 1111 for (var i=0; i<xrefs.length; i++) { 1112 const xref = xrefs[i]; 1113 tippyHover(xref, undefined, function(instance) { 1114 instance.disable(); 1115 let url = xref.getAttribute('href'); 1116 let hash = undefined; 1117 if (url.startsWith('#')) { 1118 hash = url; 1119 } else { 1120 try { hash = new URL(url).hash; } catch {} 1121 } 1122 if (hash) { 1123 const id = hash.replace(/^#\/?/, ""); 1124 const note = window.document.getElementById(id); 1125 if (note !== null) { 1126 try { 1127 const html = processXRef(id, note.cloneNode(true)); 1128 instance.setContent(html); 1129 } finally { 1130 instance.enable(); 1131 instance.show(); 1132 } 1133 } else { 1134 // See if we can fetch this 1135 fetch(url.split('#')[0]) 1136 .then(res => res.text()) 1137 .then(html => { 1138 const parser = new DOMParser(); 1139 const htmlDoc = parser.parseFromString(html, "text/html"); 1140 const note = htmlDoc.getElementById(id); 1141 if (note !== null) { 1142 const html = processXRef(id, note); 1143 instance.setContent(html); 1144 } 1145 }).finally(() => { 1146 instance.enable(); 1147 instance.show(); 1148 }); 1149 } 1150 } else { 1151 // See if we can fetch a full url (with no hash to target) 1152 // This is a special case and we should probably do some content thinning / targeting 1153 fetch(url) 1154 .then(res => res.text()) 1155 .then(html => { 1156 const parser = new DOMParser(); 1157 const htmlDoc = parser.parseFromString(html, "text/html"); 1158 const note = htmlDoc.querySelector('main.content'); 1159 if (note !== null) { 1160 // This should only happen for chapter cross references 1161 // (since there is no id in the URL) 1162 // remove the first header 1163 if (note.children.length > 0 && note.children[0].tagName === "HEADER") { 1164 note.children[0].remove(); 1165 } 1166 const html = processXRef(null, note); 1167 instance.setContent(html); 1168 } 1169 }).finally(() => { 1170 instance.enable(); 1171 instance.show(); 1172 }); 1173 } 1174 }, function(instance) { 1175 }); 1176 } 1177 let selectedAnnoteEl; 1178 const selectorForAnnotation = ( cell, annotation) => { 1179 let cellAttr = 'data-code-cell="' + cell + '"'; 1180 let lineAttr = 'data-code-annotation="' + annotation + '"'; 1181 const selector = 'span[' + cellAttr + '][' + lineAttr + ']'; 1182 return selector; 1183 } 1184 const selectCodeLines = (annoteEl) => { 1185 const doc = window.document; 1186 const targetCell = annoteEl.getAttribute("data-target-cell"); 1187 const targetAnnotation = annoteEl.getAttribute("data-target-annotation"); 1188 const annoteSpan = window.document.querySelector(selectorForAnnotation(targetCell, targetAnnotation)); 1189 const lines = annoteSpan.getAttribute("data-code-lines").split(","); 1190 const lineIds = lines.map((line) => { 1191 return targetCell + "-" + line; 1192 }) 1193 let top = null; 1194 let height = null; 1195 let parent = null; 1196 if (lineIds.length > 0) { 1197 //compute the position of the single el (top and bottom and make a div) 1198 const el = window.document.getElementById(lineIds[0]); 1199 top = el.offsetTop; 1200 height = el.offsetHeight; 1201 parent = el.parentElement.parentElement; 1202 if (lineIds.length > 1) { 1203 const lastEl = window.document.getElementById(lineIds[lineIds.length - 1]); 1204 const bottom = lastEl.offsetTop + lastEl.offsetHeight; 1205 height = bottom - top; 1206 } 1207 if (top !== null && height !== null && parent !== null) { 1208 // cook up a div (if necessary) and position it 1209 let div = window.document.getElementById("code-annotation-line-highlight"); 1210 if (div === null) { 1211 div = window.document.createElement("div"); 1212 div.setAttribute("id", "code-annotation-line-highlight"); 1213 div.style.position = 'absolute'; 1214 parent.appendChild(div); 1215 } 1216 div.style.top = top - 2 + "px"; 1217 div.style.height = height + 4 + "px"; 1218 div.style.left = 0; 1219 let gutterDiv = window.document.getElementById("code-annotation-line-highlight-gutter"); 1220 if (gutterDiv === null) { 1221 gutterDiv = window.document.createElement("div"); 1222 gutterDiv.setAttribute("id", "code-annotation-line-highlight-gutter"); 1223 gutterDiv.style.position = 'absolute'; 1224 const codeCell = window.document.getElementById(targetCell); 1225 const gutter = codeCell.querySelector('.code-annotation-gutter'); 1226 gutter.appendChild(gutterDiv); 1227 } 1228 gutterDiv.style.top = top - 2 + "px"; 1229 gutterDiv.style.height = height + 4 + "px"; 1230 } 1231 selectedAnnoteEl = annoteEl; 1232 } 1233 }; 1234 const unselectCodeLines = () => { 1235 const elementsIds = ["code-annotation-line-highlight", "code-annotation-line-highlight-gutter"]; 1236 elementsIds.forEach((elId) => { 1237 const div = window.document.getElementById(elId); 1238 if (div) { 1239 div.remove(); 1240 } 1241 }); 1242 selectedAnnoteEl = undefined; 1243 }; 1244 // Handle positioning of the toggle 1245 window.addEventListener( 1246 "resize", 1247 throttle(() => { 1248 elRect = undefined; 1249 if (selectedAnnoteEl) { 1250 selectCodeLines(selectedAnnoteEl); 1251 } 1252 }, 10) 1253 ); 1254 function throttle(fn, ms) { 1255 let throttle = false;
1256 let timer; 1257 return (...args) => { 1258 if(!throttle) { // first call gets through 1259 fn.apply(this, args); 1260 throttle = true; 1261 } else { // all the others get throttled 1262 if(timer) clearTimeout(timer); // cancel #2 1263 timer = setTimeout(() => { 1264 fn.apply(this, args); 1265 timer = throttle = false; 1266 }, ms); 1267 } 1268 }; 1269 } 1270 // Attach click handler to the DT 1271 const annoteDls = window.document.querySelectorAll('dt[data-target-cell]'); 1272 for (const annoteDlNode of annoteDls) { 1273 annoteDlNode.addEventListener('click', (event) => { 1274 const clickedEl = event.target; 1275 if (clickedEl !== selectedAnnoteEl) { 1276 unselectCodeLines(); 1277 const activeEl = window.document.querySelector('dt[data-target-cell].code-annotation-active'); 1278 if (activeEl) { 1279 activeEl.classList.remove('code-annotation-active'); 1280 } 1281 selectCodeLines(clickedEl); 1282 clickedEl.classList.add('code-annotation-active'); 1283 } else { 1284 // Unselect the line 1285 unselectCodeLines(); 1286 clickedEl.classList.remove('code-annotation-active'); 1287 } 1288 }); 1289 } 1290 const findCites = (el) => { 1291 const parentEl = el.parentElement; 1292 if (parentEl) { 1293 const cites = parentEl.dataset.cites; 1294 if (cites) { 1295 return { 1296 el, 1297 cites: cites.split(' ') 1298 }; 1299 } else { 1300 return findCites(el.parentElement) 1301 } 1302 } else { 1303 return undefined; 1304 } 1305 }; 1306 var bibliorefs = window.document.querySelectorAll('a[role="doc-biblioref"]'); 1307 for (var i=0; i<bibliorefs.length; i++) { 1308 const ref = bibliorefs[i]; 1309 const citeInfo = findCites(ref); 1310 if (citeInfo) { 1311 tippyHover(citeInfo.el, function() { 1312 var popup = window.document.createElement('div'); 1313 citeInfo.cites.forEach(function(cite) { 1314 var citeDiv = window.document.createElement('div'); 1315 citeDiv.classList.add('hanging-indent'); 1316 citeDiv.classList.add('csl-entry'); 1317 var biblioDiv = window.document.getElementById('ref-' + cite); 1318 if (biblioDiv) { 1319 citeDiv.innerHTML = biblioDiv.innerHTML; 1320 } 1321 popup.appendChild(citeDiv); 1322 }); 1323 return popup.innerHTML; 1324 }); 1325 } 1326 } 1327 }); 1328 </script>
1328 1329</div> <!-- /content --> 1330 1331 1332 1333 1334</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.