PageSourceSearch

https://eleanorjackson.com/publications

html eleanorjackson.com collected 2026-09-25 22:31:44 UTC 35,232 bytes, 610 lines download raw bytes

1<!DOCTYPE html>
2<html xmlns="http://www.w3.org/1999/xhtml" lang="en-GB" xml:lang="en-GB"><head>
3
4<meta charset="utf-8">
5<meta name="generator" content="quarto-1.9.37">
6
7<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
8
9
10<title>Publications – Eleanor Jackson</title>
11<style>
12/* Default styles provided by pandoc.
13** See https://pandoc.org/MANUAL.html#variables-for-html for config info.
14*/
15code{white-space: pre-wrap;}
16span.smallcaps{font-variant: small-caps;}
17div.columns{display: flex; gap: min(4vw, 1.5em);}
18div.column{flex: auto; overflow-x: auto;}
19div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}
20ul.task-list{list-style: none;}
21ul.task-list li input[type="checkbox"] {
22  width: 0.8em;
23  margin: 0 0.8em 0.2em -1em; /* quarto-specific, see https://github.com/quarto-dev/quarto-cli/issues/4556 */ 
24  vertical-align: middle;
25}
26</style>
27
28
29<script src="site_libs/quarto-nav/quarto-nav.js"></script>
vendor: 1 bytes, line 29
29
30<script src="site_libs/quarto-nav/headroom.min.js"></script>
30
31<link href="./images/icon.png" rel="icon" type="image/png">
32<script src="site_libs/clipboard/clipboard.min.js"></script>
vendor: 1 bytes, line 32
32
33<script src="site_libs/quarto-html/quarto.js" type="module"></script>
vendor: 1 bytes, line 33
33
34<script src="site_libs/quarto-html/tabsets/tabsets.js" type="module"></script>
vendor: 1 bytes, line 34
34
35<script src="site_libs/quarto-html/popper.min.js"></script>
vendor: 1 bytes, line 35
35
36<script src="site_libs/quarto-html/tippy.umd.min.js"></script>
vendor: 1 bytes, line 36
36
37<script src="site_libs/quarto-html/anchor.min.js"></script>
37
38<link href="site_libs/quarto-html/tippy.css" rel="stylesheet">
39<link href="site_libs/quarto-html/quarto-syntax-highlighting-7f8f88aac4f3542376d5c11b86a4c14d.css" rel="stylesheet" id="quarto-text-highlighting-styles">
40<script src="site_libs/bootstrap/bootstrap.min.js"></script>
40
41<link href="site_libs/bootstrap/bootstrap-icons.css" rel="stylesheet">
42<link href="site_libs/bootstrap/bootstrap-2f324a3e2402b1b1411e6a4607dc701e.min.css" rel="stylesheet" append-hash="true" id="quarto-bootstrap" data-mode="light">
43<link href="site_libs/quarto-contrib/fontawesome6-6.7.2/all.min.css" rel="stylesheet">
44<link href="site_libs/quarto-contrib/fontawesome6-6.7.2/latex-fontsize.css" rel="stylesheet">
45<script id="quarto-search-options" type="application/json">{
46  "language": {
47    "search-no-results-text": "No results",
48    "search-matching-documents-text": "matching documents",
49    "search-copy-link-title": "Copy link to search",
50    "search-hide-matches-text": "Hide additional matches",
51    "search-more-match-text": "more match in this document",
52    "search-more-matches-text": "more matches in this document",
53    "search-clear-button-title": "Clear",
54    "search-text-placeholder": "",
55    "search-detached-cancel-button-title": "Cancel",
56    "search-submit-button-title": "Submit",
57    "search-label": "Search"
58  }
59}</script>
59
60
61
62<link rel="stylesheet" href="styles.css">
63<meta property="og:title" content="Publications">
64<meta property="og:description" content="Research scientist and ecologist">
65<meta property="og:image" content="https://eleanorjackson.com/images/icon.png">
66<meta property="og:site_name" content="Eleanor Jackson">
67<meta property="og:locale" content="en_GB">
68<meta property="og:image:height" content="512">
69<meta property="og:image:width" content="512">
70</head>
71
72<body class="nav-fixed quarto-light">
73
74<div id="quarto-search-results"></div>
75  <header id="quarto-header" class="headroom fixed-top">
76    <nav class="navbar navbar-expand-lg " data-bs-theme="dark">
77      <div class="navbar-container container-fluid">
78      <div class="navbar-brand-container mx-auto">
79    <a class='navbar-brand navbar-brand-logo' href='/'>
80    <img src="./images/logo.png" alt="" class="navbar-logo light-content">
81    <img src="./images/logo.png" alt="" class="navbar-logo dark-content">
82    </a>
83  </div>
84          <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(); }">
85  <span class="navbar-toggler-icon"></span>
86</button>
87          <div class="collapse navbar-collapse" id="navbarCollapse">
88            <ul class="navbar-nav navbar-nav-scroll me-auto">
89  <li class="nav-item">
90    <a aria-current='page' class='nav-link active' href='/publications'> 
91<span class="menu-text">Publications</span></a>
92  </li>  
93</ul>
94          </div> <!-- /navcollapse -->
95            <div class="quarto-navbar-tools">
96</div>
97      </div> <!-- /container-fluid -->
98    </nav>
99</header>
100<!-- content -->
101<div id="quarto-content" class="quarto-container page-columns page-rows-contents page-layout-article page-navbar">
102<!-- sidebar -->
103<!-- margin-sidebar -->
104    <div id="quarto-margin-sidebar" class="sidebar margin-sidebar">
105        <nav id="TOC" role="doc-toc" class="toc-active">
106    <h2 id="toc-title">On this page</h2>
107   
108  <ul>
109  <li><a href="#preprints" id="toc-preprints" class="nav-link active" data-scroll-target="#preprints">Preprints</a></li>
110  <li><a href="#peer-reviewed-publications" id="toc-peer-reviewed-publications" class="nav-link" data-scroll-target="#peer-reviewed-publications">Peer-reviewed publications</a>
111  <ul class="collapse">
112  <li><a href="#section" id="toc-section" class="nav-link" data-scroll-target="#section">2026</a></li>
113  <li><a href="#section-1" id="toc-section-1" class="nav-link" data-scroll-target="#section-1">2025</a></li>
114  <li><a href="#section-2" id="toc-section-2" class="nav-link" data-scroll-target="#section-2">2024</a></li>
115  <li><a href="#section-3" id="toc-section-3" class="nav-link" data-scroll-target="#section-3">2023</a></li>
116  <li><a href="#section-4" id="toc-section-4" class="nav-link" data-scroll-target="#section-4">2022</a></li>
117  <li><a href="#section-5" id="toc-section-5" class="nav-link" data-scroll-target="#section-5">2021</a></li>
118  </ul></li>
119  </ul>
120</nav>
121    </div>
122<!-- main -->
123<main class="content" id="quarto-document-content">
124
125<header id="title-block-header" class="quarto-title-block default">
126<div class="quarto-title">
127<h1 class="title">Publications</h1>
128</div>
129
130
131
132<div class="quarto-title-meta">
133
134    
135  
136    
137  </div>
138  
139
140
141</header>
142
143
144<section id="preprints" class="level2">
145<h2 class="anchored" data-anchor-id="preprints">Preprints</h2>
146<p><strong>Eleanor E. Jackson</strong>, Tord Snäll, Emma Gardner, James M. Bullock, Rebecca Spake (2025). Towards causal predictions of site-specific management effects in applied ecology. <em>EcoEvoRxiv.</em><br> <a href="https://ecoevorxiv.org/repository/object/9335/download/20248/"><i class="fa-solid fa-file-pdf" aria-label="file-pdf"></i> PDF</a> · <a href="https://doi.org/10.32942/X2KK95"><i class="fa-solid fa-link" aria-label="link"></i> DOI</a> · <a href="https://doi.org/10.5281/zenodo.13269917"><i class="fa-solid fa-code" aria-label="code"></i> code</a> · <a href="https://doi.org/10.5281/zenodo.13269917"><i class="fa-solid fa-database" aria-label="database"></i> data</a> <br></p>
147</section>
148<section id="peer-reviewed-publications" class="level2">
149<h2 class="anchored" data-anchor-id="peer-reviewed-publications">Peer-reviewed publications</h2>
150<section id="section" class="level3">
151<h3 class="anchored" data-anchor-id="section">2026</h3>
152<p>The BES Data and Code Hackathon Group<a href="#fn1" class="footnote-ref" id="fnref1" role="doc-noteref"><sup>1</sup></a> (2026). Data- and code-archiving in the British Ecological Society journals: present status and recommendations for future improvements. <em>Methods in Ecology and Evolution.</em><br> <a href="https://besjournals.onlinelibrary.wiley.com/doi/pdfdirect/10.1111/2041-210x.70338?download=false"><i class="fa-solid fa-file-pdf" aria-label="file-pdf"></i> PDF</a> · <a href="http://doi.org/10.1111/2041-210x.70338"><i class="fa-solid fa-link" aria-label="link"></i> DOI</a> · <a href="https://doi.org/10.5281/zenodo.19737911">
152<i class="fa-solid fa-code" aria-label="code"></i> code</a> · <a href="https://doi.org/10.5281/zenodo.19737911"><i class="fa-solid fa-database" aria-label="database"></i> data</a> <br></p>
153<p>Toby D. Jackson, Lucy V.J. Beese, Andy Hector, <strong>Eleanor E. Jackson</strong>, Michael O’Brien, Gianluca Cerullo, David A. Coomes, David F.R.P. Burslem, Fabian J. Fischer, Christopher D. Philipson, Elia Godoong, Charissa Wong, Martin Svátek, Michele Dalponte, Wan Shafrina Wan Mohd Jaafar, Tommaso Jucker (2026). Liana cutting accelerates the structural recovery of once-logged tropical forests at a fraction of the cost of tree planting. <em>Current Biology.</em> <br> <a href="https://www.cell.com/current-biology/pdfExtended/S0960-9822(26)00526-9"><i class="fa-solid fa-file-pdf" aria-label="file-pdf"></i> PDF</a> · <a href="https://doi.org/10.1016/j.cub.2026.04.056"><i class="fa-solid fa-link" aria-label="link"></i> DOI</a> · <a href="https://doi.org/10.5281/zenodo.19692749"><i class="fa-solid fa-code" aria-label="code"></i> code</a> · <a href="https://doi.org/10.5281/zenodo.14917551"><i class="fa-solid fa-database" aria-label="database"></i> data</a> <br></p>
154</section>
155<section id="section-1" class="level3">
156<h3 class="anchored" data-anchor-id="section-1">2025</h3>
157<p>L. Crowley, P. Mulhair, O.T. Lewis, P.W.H. Holland, T. Hesselberg, L.R. Cole, C.N. Hackforth, P. Waring, S. Falk, <strong>E.E. Jackson,</strong> S. Gripenberg, E. Eatough, T. Lander, C.A.L. Dahlsjö, B.C. Sheldon, D. Linton, C. Lamberth, A. Raulo (2025). Changes in the Fauna. In <em>Wytham Woods: How a Landscape Works.</em> K. J. Kirby. pp.&nbsp;141—175. Oxford University Press.</p>
158<p><strong>Eleanor E. Jackson</strong>, Matthew P. Greenwell, James M. Bullock, Tom H. Oliver, Susie Topple, Christopher W. Foster, Sofia Gripenberg (2025). Density-dependent effects on the reproductive ecology of trees in a temperate woodland. <em>Ecology and Evolution.</em><br> <a href="https://onlinelibrary.wiley.com/doi/pdfdirect/10.1002/ece3.71491?download=false"><i class="fa-solid fa-file-pdf" aria-label="file-pdf"></i> PDF</a> · <a href="https://doi.org/10.1002/ece3.71491"><i class="fa-solid fa-link" aria-label="link"></i> DOI</a> · <a href="https://doi.org/10.5281/zenodo.15124592"><i class="fa-solid fa-code" aria-label="code"></i> code</a> · <a href="https://doi.org/10.5281/zenodo.10599206"><i class="fa-solid fa-database" aria-label="database"></i> data</a> <br></p>
159<p>Rebecca Spake, <strong>Eleanor E. Jackson</strong>, James M. Bullock, Emma Gardener, Elizabeth Tipton, Matthew Grainger, C. Patrick Doncaster (2025). Precision ecology for targeted conservation action. <em>Nature Ecology &amp; Evolution.</em><br> <a href="https://rdcu.be/eoaR4"><i class="fa-solid fa-file-pdf" aria-label="file-pdf"></i> PDF</a> · <a href="https://doi.org/10.1038/s41559-025-02733-4"><i class="fa-solid fa-link" aria-label="link"></i> DOI</a> <br></p>
160</section>
161<section id="section-2" class="level3">
162<h3 class="anchored" data-anchor-id="section-2">2024</h3>
163<p><strong>Eleanor E. Jackson</strong> (2024). Conspecific density and the reproductive ecology of trees – implications for species coexistence. PhD thesis, University of Reading.<br> <a href="https://centaur.reading.ac.uk/119733/1/JACKSON_Thesis.pdf"><i class="fa-solid fa-file-pdf" aria-label="file-pdf"></i> PDF</a> · <a href="https://doi.org/10.48683/1926.00119733"><i class="fa-solid fa-link" aria-label="link"></i> DOI</a> <br></p>
164</section>
165<section id="section-3" class="level3">
166<h3 class="anchored" data-anchor-id="section-3">2023</h3>
167<p>The Herbivory Variability Network<a href="#fn2" class="footnote-ref" id="fnref2" role="doc-noteref"><sup>2</sup></a> (2023). Plant size, latitude, and phylogeny explain within-population variability in herbivory. <em>Science.</em><br> <a href="http://herbvar.org/products/herbvar-et-al-2023-science.pdf"><i class="fa-solid fa-file-pdf" aria-label="file-pdf"></i> PDF</a> · <a href="https://doi.org/10.1126/science.adh8830"><i class="fa-solid fa-link" aria-label="link"></i> DOI</a> · <a href="https://doi.org/10.5281/zenodo.8133118">
167<i class="fa-solid fa-code" aria-label="code"></i> code</a> · <a href="https://doi.org/10.5061/dryad.44j0zpckm"><i class="fa-solid fa-database" aria-label="database"></i> data</a> <br></p>
168</section>
169<section id="section-4" class="level3">
170<h3 class="anchored" data-anchor-id="section-4">2022</h3>
171<p>Josianne Lachapelle, Elvire Bestion, <strong>Eleanor E. Jackson</strong>, C.-Elisa Schaum (2022). Presence of a resident species aids invader evolution. <em>Limnology and Oceanography.</em><br> <a href="https://aslopubs.onlinelibrary.wiley.com/doi/pdfdirect/10.1002/lno.12200?download=false"><i class="fa-solid fa-file-pdf" aria-label="file-pdf"></i> PDF</a> · <a href="https://doi.org/10.1002/lno.12200"><i class="fa-solid fa-link" aria-label="link"></i> DOI</a> · <a href="https://doi.org/10.5281/zenodo.6884040"><i class="fa-solid fa-code" aria-label="code"></i> code</a> · <a href="https://doi.org/10.5281/zenodo.6884040"><i class="fa-solid fa-database" aria-label="database"></i> data</a> <br></p>
172<p><strong>Eleanor E. Jackson</strong>, S. Joseph Wright, Osvaldo Calderón, James M. Bullock, Tom H. Oliver, Sofia Gripenberg (2022). Pre‐dispersal seed predation could help explain premature fruit drop in a tropical forest. <em>Journal of Ecology.</em><br> <a href="https://besjournals.onlinelibrary.wiley.com/doi/pdfdirect/10.1111/1365-2745.13867?download=false"><i class="fa-solid fa-file-pdf" aria-label="file-pdf"></i> PDF</a> · <a href="https://doi.org/10.1111/1365-2745.13867"><i class="fa-solid fa-link" aria-label="link"></i> DOI</a> · <a href="https://doi.org/10.5281/zenodo.5767680"><i class="fa-solid fa-code" aria-label="code"></i> code</a> · <a href="https://doi.org/10.5061/dryad.4mw6m909j"><i class="fa-solid fa-database" aria-label="database"></i> data</a> <br></p>
173</section>
174<section id="section-5" class="level3">
175<h3 class="anchored" data-anchor-id="section-5">2021</h3>
176<p><strong>Eleanor E. Jackson</strong>, Ian Hawes, Anne D. Jungblut (2021). 16S rRNA gene and 18S rRNA gene diversity in microbial mat communities in meltwater ponds on the McMurdo Ice Shelf, Antarctica. <em>Polar Biology.</em> <br> <a href="https://link.springer.com/content/pdf/10.1007/s00300-021-02843-2.pdf"><i class="fa-solid fa-file-pdf" aria-label="file-pdf"></i> PDF</a> · <a href="https://doi.org/10.1007/s00300-021-02843-2"><i class="fa-solid fa-link" aria-label="link"></i> DOI</a> <br></p>
177
178
179</section>
180</section>
181
182
183<div id="quarto-appendix" class="default"><section id="footnotes" class="footnotes footnotes-end-of-document" role="doc-endnotes"><h2 class="anchored quarto-appendix-heading">Footnotes</h2>
184
185<ol>
186<li id="fn1"><p>N. Cooper, B.J. Allen, N. Almaani, R. Altwegg, J. Balogh, H. Balti, R.A. Barber, M.E. Barbosa de Sousa, J.G.N. Barreat, C.F. Barrett, R. Bates, A.M.J.M. Beale, L. Bliard, N. Blömer, D. Borovyk, C. Bunnenberg, E.A. Bygate, L. Cash, N. Chatterjee, T.-W. Chen, A. Chiti, S.S.-W. Chung, H. Chuquillanqui, A. Ciezarek, A. Clarkson, E. Codling, A. Corradini, A. Cowans, S. Dartnell, A.J.S. Davis, L.L.M. De Benedictis, G.G. Deme, C. Devenish, S. Dimri, C. Dittrich, K.R. Dorheim, H.B. Drage, M.-A. Dueñas, A. Efstathiou, L.C. Evans, M.E. Ferreira Santos, A.J. Foxx, R.J. Gardiner, J. Gaudard, W. Gearty, L. Graham, V.M. Graves, H.M. Green, R.V. Greensmith, S. Gérard, A.H. Halbritter, T.R. Hartke, R.M. Hechler, B.J. Hindle, P.-Y. Hsing, S. Illanas, G. Iossa, <strong>E.E. Jackson</strong>, L.A. Jones, F.A.M. Jones, J.A. Jones, J.F. Jupke, N.N. Kaunain, R. Kennedy, M.R. Kerr, N.J. Kester, M. Klaassen, O. Konecka, R. Krasnow, R. Kukowski, A. Kumar, R. Kuminski, K.S. Kuzey, L. Laccetti, M. Lagisz, H. Latifi, N. Lecomte, K.D. Luchmun, A. Lévêque, A. Markitantova, B.M. Marshall, E. Menares-Barraza, D. Mertens, G. Mesbahi, J. Meyer, J. Millard, L.M. Montilla, B. Moreira, A. Morera, G. Murali, M.P. Murray, F. Märker, K. Nagahawatte, C.L. Narraway, H.I. Niven, A.G. Nytko, B. Ohse, S. Patterson, H.R.P. Phillips, R. Pienaar, P. Pollo, A. Ponce, L.M.V. Porto, E.F.R. Preston, C.S. Prieul, A. Prylutska, O. Prylutskyi, K. Radman-Daw, A.M. Raharison, R. Rao, F.R. Read, S. Record, W. Rees, R. Reeve, H. Rhodes, C. Rocabado, A. Rouviere, A. Rönnfeldt, A. Sagouis, S.P. Sakhalkar, G.S. Santos, M.A.&nbsp;Shakur, R. Shaw, D. Siegieda, L. Šmídova, B.I. Simmons, H.G. Sisley, A. Sánchez-Tójar, F.G. Taboada, N.G. Taylor, H. Teague, K. Thrikkadeeri, V. Thuroczy, A. Varah, K.L. Vinay, 
186C.M. Watrobska, Z.B. Williams and S.M. Windecker <br><a href="#fnref1" class="footnote-back" role="doc-backlink">↩︎</a></p></li>
187<li id="fn2"><p>M.L. Robinson, P.G. Hahn, B.D. Inouye, N. Underwood, S.R. Whitehead, K.C. Abbott, E.M. Bruna, N.I. Cacho, L.A. Dyer, L. Abdala-Roberts, W.J. Allen, J.F. Andrade, D.F. Angulo, D. Anjos, D.N. Anstett, R. Bagchi, S. Bagchi, M. Barbosa, S. Barrett, C.A. Baskett, E. Ben-Simchon, K.J. Bloodworth, J.L. Bronstein, Y.M. Buckley, K.T. Burghardt, C. Bustos-Segura, E.S. Calixto, R.L. Carvalho, B. Castagneyrol, M.C. Chiuffo, D. Cinoğlu, E. Cinto Mejía, M.C. Cock, R. Cogni, O.L. Cope, T. Cornelissen, D.R. Cortez, D.W. Crowder, C. Dallstream, W. Dáttilo, J.K. Davis, R.D. Dimarco, H.E. Dole, I.N. Egbon, M. Eisenring, A. Ejomah, B.D. Elderd, M.-J. Endara, M.D.&nbsp;Eubanks, S.E. Everingham, K.N. Farah, R.P. Farias, A.P. Fernandes, G.W. Fernandes, M. Ferrante, A. Finn, G.A. Florjancic, M.L. Forister, Q.N. Fox, E. Frago, F.M. França, A.S. Getman-Pickering, Z. Getman-Pickering, E. Gianoli, B. Gooden, M.M. Gossner, K.A. Greig, S. Gripenberg, R. Groenteman, P. Grof-Tisza, N. Haack, L. Hahn, S.M. Haq, A.M. Helms, J. Hennecke, S.L. Hermann, L.M. Holeski, S. Holm, M.C. Hutchinson, <strong>E.E. Jackson</strong>, S. Kagiya, A. Kalske, M. Kalwajtys, R. Karban, R. Kariyat, T. Keasar, M.F. Kersch-Becker, H.M. Kharouba, T.N. Kim, D.M. Kimuyu, J. Kluse, S.E. Koerner, K.J. Komatsu, S. Krishnan, M. Laihonen, L. Lamelas-López, M.C. LaScaleia, N. Lecomte, C.R. Lehn, X. Li, R.L. Lindroth, E.F. LoPresti, M. Losada, A.M. Louthan, V.J. Luizzi, S.C. Lynch, J.S. Lynn, N.J. Lyon, L.F. Maia, R.A. Maia, T.L. Mannall, B.S. Martin, T.J. Massad, A.C. McCall, K. McGurrin, A.C. Merwin, Z. Mijango-Ramos, C.H. Mills, A.T. Moles, C.M. Moore, X. Moreira, C.R. Morrison, M.C. Moshobane, A. Muola, R. Nakadai, K. Nakajima, S. Novais, C.O. Ogbebor, H. Ohsaki, V.S. Pan, N.A. Pardikes, M. Pareja, N. Parthasarathy, R.R. Pawar, Q. Paynter, I.S. Pearse, R.M. Penczykowski, A.A. Pepi, C.C. Pereira, S.S. Phartyal, F.I. Piper, K. Poveda, E.G. Pringle, J. Puy, T. Quijano, C. Quintero, S. Rasmann, C. Rosche, L.Y. Rosenheim, J.A. Rosenheim, J.B. Runyon, A. Sadeh, Y. Sakata, D.M. Salcido, C. Salgado-Luarte, B.A. Santos, Y. Sapir, Y. Sasal, Y. Sato, M. Sawant, H. Schroeder, I. Schumann, M. Segoli, H. Segre, O. Shelef, N. Shinohara, R.P. Singh, D.S. Smith, M. Sobral, G.C. Stotz, A.J.M. Tack, M. Tayal, J.F. Tooker, D. Torrico-Bazoberry, K. Tougeron, A.M. Trowbridge, S. Utsumi, O. Uyi, J.L. Vaca-Uribe, A. Valtonen, L.J.A. van Dijk, V. Vandvik, J. Villellas, L.P. Waller, M.G. Weber, A. Yamawo, S. Yim, P.L. Zarnetske, L.N. Zehr, Z. Zhong, and W.C. Wetzel <br><a href="#fnref2" class="footnote-back" role="doc-backlink">↩︎</a></p></li>
188</ol>
189</section></div></main> <!-- /main -->
190<script id="quarto-html-after-body" type="application/javascript">
191  window.document.addEventListener("DOMContentLoaded", function (event) {
192    const icon = "";
193    const anchorJS = new window.AnchorJS();
194    anchorJS.options = {
195      placement: 'right',
196      icon: icon
197    };
198    anchorJS.add('.anchored');
199    const isCodeAnnotation = (el) => {
200      for (const clz of el.classList) {
201        if (clz.startsWith('code-annotation-')) {                     
202          return true;
203        }
204      }
205      return false;
206    }
207    const onCopySuccess = function(e) {
208      // button target
209      const button = e.trigger;
210      // don't keep focus
211      button.blur();
212      // flash "checked"
213      button.classList.add('code-copy-button-checked');
214      var currentTitle = button.getAttribute("title");
215      button.setAttribute("title", "Copied!");
216      let tooltip;
217      if (window.bootstrap) {
218        button.setAttribute("data-bs-toggle", "tooltip");
219        button.setAttribute("data-bs-placement", "left");
220        button.setAttribute("data-bs-title", "Copied!");
221        tooltip = new bootstrap.Tooltip(button, 
222          { trigger: "manual", 
223            customClass: "code-copy-button-tooltip",
224            offset: [0, -8]});
225        tooltip.show();    
226      }
227      setTimeout(function() {
228        if (tooltip) {
229          tooltip.hide();
230          button.removeAttribute("data-bs-title");
231          button.removeAttribute("data-bs-toggle");
232          button.removeAttribute("data-bs-placement");
233        }
234        button.setAttribute("title", currentTitle);
235        button.classList.remove('code-copy-button-checked');
236      }, 1000);
237      // clear code selection
238      e.clearSelection();
239    }
240    const getTextToCopy = function(trigger) {
241      const outerScaffold = trigger.parentElement.cloneNode(true);
242      const codeEl = outerScaffold.querySelector('code');
243      for (const childEl of codeEl.children) {
244        if (isCodeAnnotation(childEl)) {
245          childEl.remove();
246        }
247      }
248      return codeEl.innerText;
249    }
250    const clipboard = new window.ClipboardJS('.code-copy-button:not([data-in-quarto-modal])', {
251      text: getTextToCopy
252    });
253    clipboard.on('success', onCopySuccess);
254    if (window.document.getElementById('quarto-embedded-source-code-modal')) {
255      const clipboardModal = new window.ClipboardJS('.code-copy-button[data-in-quarto-modal]', {
256        text: getTextToCopy,
257        container: window.document.getElementById('quarto-embedded-source-code-modal')
258      });
259      clipboardModal.on('success', onCopySuccess);
260    }
261      var localhostRegex = new RegExp(/^(?:http|https):\/\/localhost\:?[0-9]*\//);
262      var mailtoRegex = new RegExp(/^mailto:/);
263        var filterRegex = new RegExp("https:\/\/eleanorjackson\.com");
264      var isInternal = (href) => {
265          return filterRegex.test(href) || localhostRegex.test(href) || mailtoRegex.test(href);
266      }
267      // Inspect non-navigation links and adorn them if external
268     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)');
269      for (var i=0; i<links.length; i++) {
270        const link = links[i];
271        if (!isInternal(link.href)) {
272          // undo the damage that might have been done by quarto-nav.js in the case of
273          // links that we want to consider external
274          if (link.dataset.originalHref !== undefined) {
275            link.href = link.dataset.originalHref;
276          }
277        }
278      }
279    function tippyHover(el, contentFn, onTriggerFn, onUntriggerFn) {
280      const config = {
281        allowHTML: true,
282        maxWidth: 500,
283        delay: 100,
284        arrow: false,
285        appendTo: function(el) {
286            return el.parentElement;
287        },
288        interactive: true,
289        interactiveBorder: 10,
290        theme: 'quarto',
291        placement: 'bottom-start',
292      };
293      if (contentFn) {
294        config.content = contentFn;
295      }
296      if (onTriggerFn) {
297        config.onTrigger = onTriggerFn;
298      }
299      if (onUntriggerFn) {
300        config.onUntrigger = onUntriggerFn;
301      }
302      window.tippy(el, config); 
303    }
304    const noterefs = window.document.querySelectorAll('a[role="doc-noteref"]');
305    for (var i=0; i<noterefs.length; i++) {
306      const ref = noterefs[i];
307      tippyHover(ref, function() {
308        // use id or data attribute instead here
309        let href = ref.getAttribute('data-footnote-href') || ref.getAttribute('href');
310        try { href = new URL(href).hash; } catch {}
311        const id = href.replace(/^#\/?/, "");
312        const note = window.document.getElementById(id);
313        if (note) {
314          return note.innerHTML;
315        } else {
316          return "";
317        }
318      });
319    }
320    const xrefs = window.document.querySelectorAll('a.quarto-xref');
321    const processXRef = (id, note) => {
322      // Strip column container classes
323      const stripColumnClz = (el) => {
324        el.classList.remove("page-full", "page-columns");
325        if (el.children) {
326          for (const child of el.children) {
327            stripColumnClz(child);
328          }
329        }
330      }
331      stripColumnClz(note)
332      if (id === null || id.startsWith('sec-')) {
333        // Special case sections, only their first couple elements
334        const container = document.createElement("div");
335        if (note.children && note.children.length > 2) {
336          container.appendChild(note.children[0].cloneNode(true));
337          for (let i = 1; i < note.children.length; i++) {
338            const child = note.children[i];
339            if (child.tagName === "P" && child.innerText === "") {
340              continue;
341            } else {
342              container.appendChild(child.cloneNode(true));
343              break;
344            }
345          }
346          if (window.Quarto?.typesetMath) {
347            window.Quarto.typesetMath(container);
348          }
349          return container.innerHTML
350        } else {
351          if (window.Quarto?.typesetMath) {
352            window.Quarto.typesetMath(note);
353          }
354          return note.innerHTML;
355        }
356      } else {
357        // Remove any anchor links if they are present
358        const anchorLink = note.querySelector('a.anchorjs-link');
359        if (anchorLink) {
360          anchorLink.remove();
361        }
362        if (window.Quarto?.typesetMath) {
363          window.Quarto.typesetMath(note);
364        }
365        if (note.classList.contains("callout")) {
366          return note.outerHTML;
367        } else {
368          return note.innerHTML;
369        }
370      }
371    }
372    for (var i=0; i<xrefs.length; i++) {
373      const xref = xrefs[i];
374      tippyHover(xref, undefined, function(instance) {
375        instance.disable();
376        let url = xref.getAttribute('href');
377        let hash = undefined; 
378        if (url.startsWith('#')) {
379          hash = url;
380        } else {
381          try { hash = new URL(url).hash; } catch {}
382        }
383        if (hash) {
384          const id = hash.replace(/^#\/?/, "");
385          const note = window.document.getElementById(id);
386          if (note !== null) {
387            try {
388              const html = processXRef(id, note.cloneNode(true));
389              instance.setContent(html);
390            } finally {
391              instance.enable();
392              instance.show();
393            }
394          } else {
395            // See if we can fetch this
396            fetch(url.split('#')[0])
397            .then(res => res.text())
398            .then(html => {
399              const parser = new DOMParser();
400              const htmlDoc = parser.parseFromString(html, "text/html");
401              const note = htmlDoc.getElementById(id);
402              if (note !== null) {
403                const html = processXRef(id, note);
404                instance.setContent(html);
405              } 
406            }).finally(() => {
407              instance.enable();
408              instance.show();
409            });
410          }
411        } else {
412          // See if we can fetch a full url (with no hash to target)
413          // This is a special case and we should probably do some content thinning / targeting
414          fetch(url)
415          .then(res => res.text())
416          .then(html => {
417            const parser = new DOMParser();
418            const htmlDoc = parser.parseFromString(html, "text/html");
419            const note = htmlDoc.querySelector('main.content');
420            if (note !== null) {
421              // This should only happen for chapter cross references
422              // (since there is no id in the URL)
423              // remove the first header
424              if (note.children.length > 0 && note.children[0].tagName === "HEADER") {
425                note.children[0].remove();
426              }
427              const html = processXRef(null, note);
428              instance.setContent(html);
429            } 
430          }).finally(() => {
431            instance.enable();
432            instance.show();
433          });
434        }
435      }, function(instance) {
436      });
437    }
438        let selectedAnnoteEl;
439        const selectorForAnnotation = ( cell, annotation) => {
440          let cellAttr = 'data-code-cell="' + cell + '"';
441          let lineAttr = 'data-code-annotation="' +  annotation + '"';
442          const selector = 'span[' + cellAttr + '][' + lineAttr + ']';
443          return selector;
444        }
445        const selectCodeLines = (annoteEl) => {
446          const doc = window.document;
447          const targetCell = annoteEl.getAttribute("data-target-cell");
448          const targetAnnotation = annoteEl.getAttribute("data-target-annotation");
449          const annoteSpan = window.document.querySelector(selectorForAnnotation(targetCell, targetAnnotation));
450          const lines = annoteSpan.getAttribute("data-code-lines").split(",");
451          const lineIds = lines.map((line) => {
452            return targetCell + "-" + line;
453          })
454          let top = null;
455          let height = null;
456          let parent = null;
457          if (lineIds.length > 0) {
458              //compute the position of the single el (top and bottom and make a div)
459              const el = window.document.getElementById(lineIds[0]);
460              top = el.offsetTop;
461              height = el.offsetHeight;
462              parent = el.parentElement.parentElement;
463            if (lineIds.length > 1) {
464              const lastEl = window.document.getElementById(lineIds[lineIds.length - 1]);
465              const bottom = lastEl.offsetTop + lastEl.offsetHeight;
466              height = bottom - top;
467            }
468            if (top !== null && height !== null && parent !== null) {
469              // cook up a div (if necessary) and position it 
470              let div = window.document.getElementById("code-annotation-line-highlight");
471              if (div === null) {
472                div = window.document.createElement("div");
473                div.setAttribute("id", "code-annotation-line-highlight");
474                div.style.position = 'absolute';
475                parent.appendChild(div);
476              }
477              div.style.top = top - 2 + "px";
478              div.style.height = height + 4 + "px";
479              div.style.left = 0;
480              let gutterDiv = window.document.getElementById("code-annotation-line-highlight-gutter");
481              if (gutterDiv === null) {
482                gutterDiv = window.document.createElement("div");
483                gutterDiv.setAttribute("id", "code-annotation-line-highlight-gutter");
484                gutterDiv.style.position = 'absolute';
485                const codeCell = window.document.getElementById(targetCell);
486                const gutter = codeCell.querySelector('.code-annotation-gutter');
487                gutter.appendChild(gutterDiv);
488              }
489              gutterDiv.style.top = top - 2 + "px";
490              gutterDiv.style.height = height + 4 + "px";
491            }
492            selectedAnnoteEl = annoteEl;
493          }
494        };
495        const unselectCodeLines = () => {
496          const elementsIds = ["code-annotation-line-highlight", "code-annotation-line-highlight-gutter"];
497          elementsIds.forEach((elId) => {
498            const div = window.document.getElementById(elId);
499            if (div) {
500              div.remove();
501            }
502          });
503          selectedAnnoteEl = undefined;
504        };
505          // Handle positioning of the toggle
506      window.addEventListener(
507        "resize",
508        throttle(() => {
509          elRect = undefined;
510          if (selectedAnnoteEl) {
511            selectCodeLines(selectedAnnoteEl);
512          }
513        }, 10)
514      );
515      function throttle(fn, ms) {
516      let throttle = false;
517      let timer;
518        return (...args) => {
519          if(!throttle) { // first call gets through
520              fn.apply(this, args);
521              throttle = true;
522          } else { // all the others get throttled
523              if(timer) clearTimeout(timer); // cancel #2
524              timer = setTimeout(() => {
525                fn.apply(this, args);
526                timer = throttle = false;
527              }, ms);
528          }
529        };
530      }
531        // Attach click handler to the DT
532        const annoteDls = window.document.querySelectorAll('dt[data-target-cell]');
533        for (const annoteDlNode of annoteDls) {
534          annoteDlNode.addEventListener('click', (event) => {
535            const clickedEl = event.target;
536            if (clickedEl !== selectedAnnoteEl) {
537              unselectCodeLines();
538              const activeEl = window.document.querySelector('dt[data-target-cell].code-annotation-active');
539              if (activeEl) {
540                activeEl.classList.remove('code-annotation-active');
541              }
542              selectCodeLines(clickedEl);
543              clickedEl.classList.add('code-annotation-active');
544            } else {
545              // Unselect the line
546              unselectCodeLines();
547              clickedEl.classList.remove('code-annotation-active');
548            }
549          });
550        }
551    const findCites = (el) => {
552      const parentEl = el.parentElement;
553      if (parentEl) {
554        const cites = parentEl.dataset.cites;
555        if (cites) {
556          return {
557            el,
558            cites: cites.split(' ')
559          };
560        } else {
561          return findCites(el.parentElement)
562        }
563      } else {
564        return undefined;
565      }
566    };
567    var bibliorefs = window.document.querySelectorAll('a[role="doc-biblioref"]');
568    for (var i=0; i<bibliorefs.length; i++) {
569      const ref = bibliorefs[i];
570      const citeInfo = findCites(ref);
571      if (citeInfo) {
572        tippyHover(citeInfo.el, function() {
573          var popup = window.document.createElement('div');
574          citeInfo.cites.forEach(function(cite) {
575            var citeDiv = window.document.createElement('div');
576            citeDiv.classList.add('hanging-indent');
577            citeDiv.classList.add('csl-entry');
578            var biblioDiv = window.document.getElementById('ref-' + cite);
579            if (biblioDiv) {
580              citeDiv.innerHTML = biblioDiv.innerHTML;
581            }
582            popup.appendChild(citeDiv);
583          });
584          return popup.innerHTML;
585        });
586      }
587    }
588  });
589  </script>
589
590</div> <!-- /content -->
591<footer class="footer">
592  <div class="nav-footer">
593    <div class="nav-footer-left">
594<i class="fa-regular fa-copyright" aria-label="copyright"></i> Eleanor Jackson,
595<script>document.write(/\d{4}/.exec(Date())[0])</script>
595
596</div>   
597    <div class="nav-footer-center">
598      &nbsp;
599    </div>
600    <div class="nav-footer-right">
601<p><a href="https://github.com/ee-jackson/quarto-site" title="source code"><i class="fa-solid fa-code" aria-label="code"></i></a></p>
602</div>
603  </div>
604</footer>
605
606
607
608
609<script data-goatcounter="https://eejackson.goatcounter.com/count"
610        async src="//gc.zgo.at/count.js"></script>
610</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.