PageSourceSearch

https://www.tomlouwerse.nl/

html tomlouwerse.nl collected 2026-10-02 18:56:54 UTC 54,963 bytes, 1,334 lines download raw bytes

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 &amp; 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.&nbsp;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 &amp; 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.