<?xml version="1.0" encoding="UTF-8"?>
<rss  xmlns:atom="http://www.w3.org/2005/Atom" 
      xmlns:media="http://search.yahoo.com/mrss/" 
      xmlns:content="http://purl.org/rss/1.0/modules/content/" 
      xmlns:dc="http://purl.org/dc/elements/1.1/" 
      version="2.0">
<channel>
<title>Cameron Wimpy</title>
<link>https://cwimpy.com/posts/</link>
<atom:link href="https://cwimpy.com/posts/index.xml" rel="self" type="application/rss+xml"/>
<description></description>
<image>
<url>https://cwimpy.com/images/og/posts.png</url>
<title>Cameron Wimpy</title>
<link>https://cwimpy.com/posts/</link>
</image>
<generator>quarto-1.9.37</generator>
<lastBuildDate>Tue, 02 Jun 2026 07:00:00 GMT</lastBuildDate>
<item>
  <title>How does rural matter for election administration?</title>
  <dc:creator>Cameron Wimpy</dc:creator>
  <link>https://cwimpy.com/posts/2026-06-02-rural-ea-measurement-poster/</link>
  <description><![CDATA[ 





<div class="callout callout-style-default callout-note callout-titled" title="Rural Notes">
<div class="callout-header d-flex align-content-center">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">Note</span>Rural Notes
</div>
</div>
<div class="callout-body-container callout-body">
<p>This is a post in <a href="../../rural.html">Rural Notes</a>, my working-notes series on rural measurement and rural political behavior. It is an overview of a poster I am presenting today at <a href="https://esra-conference.org/2026-conference">ESRA 2026</a>, so it is very much research-in-progress. The downloadable poster is below, but I hope to have a related working paper posted soon.</p>
</div>
</div>
<p><a href="wimpy-esra-2026-rural-ea-poster.pdf" class="btn-pub"><i class="fa-solid fa-file-pdf" aria-label="file-pdf"></i> Download the poster (PDF)</a></p>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://cwimpy.com/posts/2026-06-02-rural-ea-measurement-poster/featured.png" class="img-fluid figure-img"></p>
<figcaption>How Rural Matters for Election Administration, ESRA 2026 poster</figcaption>
</figure>
</div>
<section id="the-setup" class="level2">
<h2 class="anchored" data-anchor-id="the-setup">The setup</h2>
<p>If you do applied work on rural America and you need to condition on rurality, you reach often for whatever classification is handy: USDA’s Rural–Urban Continuum Codes (RUCC), the Rural–Urban Commuting Areas (RUCA), the NCHS urban–rural scheme, OMB’s metro/nonmetro line, or a continuous index like the Index of Relative Rurality (IRR). These were built for the USDA, for rural health research, and for federal reporting. None of them were designed for studying how counties run elections, and they often disagree.</p>
<p>How often? Across U.S. counties, the four categorical schemes disagree on <strong>12.6%</strong> of cases. That sounds small until you look at where the disagreement lives. The contested counties are not fringe cases out at the edge of the distribution. They sit in the populous middle, where wealthy exurbs share a category boundary with struggling small cities.</p>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><a href="fig-contested-map.png" class="lightbox" data-gallery="quarto-lightbox-gallery-2" title="Counties shaded by how many schemes (RUCC, RUCA, NCHS, OMB) call them nonmetro. The contested cases concentrate in the South and along exurban metro fringes."><img src="https://cwimpy.com/posts/2026-06-02-rural-ea-measurement-poster/fig-contested-map.png" class="img-fluid figure-img" alt="Counties shaded by how many schemes (RUCC, RUCA, NCHS, OMB) call them nonmetro. The contested cases concentrate in the South and along exurban metro fringes."></a></p>
<figcaption>Counties shaded by how many schemes (RUCC, RUCA, NCHS, OMB) call them nonmetro. The contested cases concentrate in the South and along exurban metro fringes.</figcaption>
</figure>
</div>
<p>So I ask a simple question in the poster: <strong><em>when does the choice of rurality measure actually change what we conclude about how rural counties run elections, and when does it not?</em></strong></p>
</section>
<section id="what-i-did" class="level2">
<h2 class="anchored" data-anchor-id="what-i-did">What I did</h2>
<p>I pulled four election-administration outcomes from the <strong>2024 EAVS</strong> (spanning registration, ballot processing, and poll-worker capacity), plus county-weighted voter confidence from the <strong>pooled SPAE 2016–2024</strong> (about 46,000 respondents across 2,562 counties). I excluded the sub-county-jurisdiction states where county-level analysis doesn’t make sense (CT, MA, ME, NH, RI, VT, VA).</p>
<p>For each outcome I estimated the rural gradient, controlling for log population, and then put it through a ladder of progressively stricter inference:</p>
<ul>
<li>cluster the standard errors by state, since counties within a state aren’t independent;</li>
<li>add spatial dependence with Conley distance-based standard errors;</li>
<li>re-estimate <strong>within a single state</strong> (Texas), holding policy constant;</li>
<li>and re-estimate <strong>across rurality measures</strong> (IRR, RUCC, RUCA, NCHS, and the composite from my <code>rurality</code> package).</li>
</ul>
<p>An effect only counts as robust if it survives the whole ladder, including the measure swap.</p>
</section>
<section id="the-two-findings-that-matter" class="level2">
<h2 class="anchored" data-anchor-id="the-two-findings-that-matter">The two findings that matter</h2>
<p><strong>Most rural-urban gaps are cross-state.</strong> They look real in a naive specification, then vanish the moment the standard errors cluster by state. Adding state fixed effects drives the rural R² gain to near zero for every outcome. The rural signal, where there is one, lives <em>between</em> states, not <em>within</em> them. That makes some sense: states set most of the rules governing election administration, so the state matters more than the county. It also means the cross-state variation is tangled up with everything else that differs across states, which county-level data can’t fully separate.</p>
<p><strong>For the one outcome that survives, the answer flips depending on the measure.</strong> Only UOCAVA (overseas and military ballot handling) makes it through every rung of the ladder. It’s also the one outcome that is <em>federally</em> standardized, via the MOVE Act, so state policy explains just 31% of its variance versus 82–99% for state-discretion outcomes like poll-worker ratios. If any county-level rural signal is clean, it should be here. And yet: the effect is negative and significant under IRR, null under NCHS and an IRR alternative, and <strong>positive under RUCC and RUCA</strong>. The measures disagree on the <em>direction</em> of the effect.</p>
<p>That is the headline. There is no single “rurality.” The choice of measure is part of the research design, not a convenience, and picking the wrong one can hide real variation or manufacture a result that isn’t there.</p>
</section>
<section id="why-the-measures-diverge-where-they-do" class="level2">
<h2 class="anchored" data-anchor-id="why-the-measures-diverge-where-they-do">Why the measures diverge where they do</h2>
<p>The schemes mostly agree out in the tails. Searcy County, Arkansas is rural under everything: RUCC 9, NCHS 6, IRR 0.84. The disagreement is concentrated in the contested middle. Two more Arkansas counties make the point:</p>
<ul>
<li><strong>Hot Spring County</strong> (pop. 33k): RUCC 6 (rural), NCHS 5 (rural), OMB micro, but RUCA 3 (<strong>metro</strong>).</li>
<li><strong>Perry County</strong> (pop. 10k): RUCC 2 (metro), NCHS 3 (metro), OMB metro, but RUCA 7 (<strong>rural</strong>).</li>
</ul>
<p>The disagreement runs in opposite directions for the two counties. Of 394 contested counties nationally, 373 (95%) are RUCA against the rest: commuting flows versus population logic, fighting over exactly the heterogeneous middle of the distribution that these schemes were never built to tell apart.</p>
</section>
<section id="what-i-take-from-this" class="level2">
<h2 class="anchored" data-anchor-id="what-i-take-from-this">What I take from this</h2>
<p>A few practical implications for anyone conditioning on rurality:</p>
<ul>
<li><strong>Report your estimate across several measures.</strong> If it’s stable, you have at least some signal. If it flips sign, the effect is dimension-specific and you need to say which dimension.</li>
<li><strong>Match the measure to your mechanism.</strong> Commuting-based, density-based, and population-based schemes are answering different questions.</li>
<li><strong>Cluster by state.</strong> A lot of apparent rural effects are really cross-state variation wearing a rural costume.</li>
</ul>
<p>And the standard caveats apply: this is observational, not causal; the cross-state variation is entangled with all the state-level differences county data can’t separate; and it’s the 2024 EAVS with sub-county states excluded.</p>
</section>
<section id="whats-next" class="level2">
<h2 class="anchored" data-anchor-id="whats-next">What’s next</h2>
<ul>
<li><strong>The paper:</strong> the full nine-outcome analysis with clustered, spatial, and within-state robustness (forthcoming).</li>
<li><strong>An identity battery:</strong> a validated survey instrument for rural identity and place consciousness, aimed at outcomes like voter confidence that the structural measures don’t predict.</li>
<li><strong>Sub-county work:</strong> an analysis harmonized to minor civil divisions (MCDs, the towns and townships that run elections in place of counties in some states), paired with <code>rurality</code> v0.2. This brings the framework to the sub-county jurisdictions in New England and parts of Wisconsin and Michigan that the county-level analysis has to drop.</li>
</ul>
</section>
<section id="related" class="level2">
<h2 class="anchored" data-anchor-id="related">Related</h2>
<p>The measurement machinery behind this poster is my <a href="https://cran.r-project.org/package=rurality"><strong>rurality</strong></a> R package, which provides RUCC, RUCA, and a composite score under one interface (see <a href="../../software.html">Software</a> for the Stata port). For the broader research record, see <a href="../../research.html">Research</a>.</p>
<p><em>Rural Notes is a working-notes series. The posts are research-in-progress, not finished work. Subscribe via <a href="../../rural.xml">RSS</a> for occasional updates.</em></p>


</section>

<a onclick="window.scrollTo(0, 0); return false;" id="quarto-back-to-top"><i class="bi bi-arrow-up"></i> Back to top</a> ]]></description>
  <category>rural-notes</category>
  <category>election-administration</category>
  <category>measurement</category>
  <category>rurality</category>
  <guid>https://cwimpy.com/posts/2026-06-02-rural-ea-measurement-poster/</guid>
  <pubDate>Tue, 02 Jun 2026 07:00:00 GMT</pubDate>
  <media:content url="https://cwimpy.com/posts/2026-06-02-rural-ea-measurement-poster/featured.png" medium="image" type="image/png" height="102" width="144"/>
</item>
<item>
  <title>What county election websites (unevenly) tell voters</title>
  <dc:creator>Cameron Wimpy</dc:creator>
  <link>https://cwimpy.com/posts/2026-06-02-uneven-access-county-websites/</link>
  <description><![CDATA[ 





<div class="callout callout-style-default callout-note callout-titled" title="Rural Notes">
<div class="callout-header d-flex align-content-center">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">Note</span>Rural Notes
</div>
</div>
<div class="callout-body-container callout-body">
<p>This is a post in <a href="../../rural.html">Rural Notes</a>, my working-notes series on rural measurement and rural political behavior. It overviews a paper I presented at <a href="https://esra-conference.org/2026-conference">ESRA 2026</a>, <em>Uneven Access</em>, joint work with Will McLean. The draft is below. It is preliminary: the findings are pending a blind inter-coder reliability re-code, so please don’t cite without asking.</p>
</div>
</div>
<p><a href="wimpy-mclean-uneven-access.pdf" class="btn-pub"><i class="fa-solid fa-file-pdf" aria-label="file-pdf"></i> Download the working paper (PDF)</a></p>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://cwimpy.com/posts/2026-06-02-uneven-access-county-websites/featured.png" class="img-fluid figure-img"></p>
<figcaption>Uneven Access: county-level Election Information Content Scale, mapped</figcaption>
</figure>
</div>
<section id="the-question" class="level2">
<h2 class="anchored" data-anchor-id="the-question">The question</h2>
<p>Counties run the bulk American elections at the local level, and for a lot of voters the county election website is the first place they actually meet that work: checking a registration, finding a polling place, requesting a mail ballot, looking up results. So a simple question: what do those sites tell voters, and how evenly?</p>
<p>The honest answer is that we didn’t know. The one well-known study, King and Youngblood’s 2016 audit of Alabama county sites, found that counties provide limited information and fall short on accessibility and usability. But it was one state, almost a decade old, and from before 2020 reorganized how Americans vote. Nobody had checked whether Alabama was typical.</p>
<p>So Will McLean and I built a national audit. We scored the election websites of 2,804 county jurisdictions across 40 states on an 18-item Election Information Content Scale (EICS), extending the King and Youngblood framework with three items that got salient after 2020: mail-ballot tracking, signature cure, and felon-rights restoration. We dropped the states where the county isn’t the unit of election administration (the New England town states, Michigan and Wisconsin, Alaska, and DC), so everything here is conditional on the county-administered model.</p>
</section>
<section id="coverage-is-low-and-it-clusters" class="level2">
<h2 class="anchored" data-anchor-id="coverage-is-low-and-it-clusters">Coverage is low, and it clusters</h2>
<p>The average county provides 7.2 of 18 items, and the distribution isn’t a smooth normal. It’s more bimodal with a tall spike at zero and a second mode around eight or nine. About 11% of counties score zero. Some have no identifiable election site at all; others have a site that carries none of the 18 items. The top is thin: only 22 counties (0.8%) score 17 or 18. The modal county provides a core set of old, foundational items (registration, polling place, results, absentee) and nothing newer.</p>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><a href="fig-histogram.png" class="lightbox" data-gallery="quarto-lightbox-gallery-2" title="National distribution of the EICS. A tall mode at zero, a second mode near 8–9, and a thin top."><img src="https://cwimpy.com/posts/2026-06-02-uneven-access-county-websites/fig-histogram.png" class="img-fluid figure-img" alt="National distribution of the EICS. A tall mode at zero, a second mode near 8–9, and a thin top."></a></p>
<figcaption>National distribution of the EICS. A tall mode at zero, a second mode near 8–9, and a thin top.</figcaption>
</figure>
</div>
<p>Three forces organize the rest of the variation, and they pull in different directions.</p>
</section>
<section id="a-national-floor-on-the-new-stuff" class="level2">
<h2 class="anchored" data-anchor-id="a-national-floor-on-the-new-stuff">A national floor on the “new stuff”</h2>
<p>The post-2020 items are scarce almost everywhere. Only 22% of counties give voters a way to track a mail ballot, 10% mention felon-rights restoration, and 4% provide a signature-cure form. Local information simply hasn’t kept up with how people vote now, and that shortfall barely varies across the country. It’s a universal gap, not a rural one.</p>
</section>
<section id="a-state-ceiling" class="level2">
<h2 class="anchored" data-anchor-id="a-state-ceiling">A state ceiling</h2>
<p>Much of the variation occurs at the state level. Mean coverage runs from 14.6 in Florida down to 1.1 in Oklahoma, a 13.5-point spread that’s wider than a full standard deviation of the county distribution. A regression with nothing but state fixed effects gets R² = 0.47: about half of all county-level variation is just between states. That points at state-level institutions (statewide templates, mandates, the capacity a secretary of state’s office pushes down to counties), but sorting out which of those drives it is still open.</p>
</section>
<section id="the-rural-gradient-and-why-its-mostly-about-size" class="level2">
<h2 class="anchored" data-anchor-id="the-rural-gradient-and-why-its-mostly-about-size">The rural gradient, and why it’s mostly about size</h2>
<p>Here’s the part that belongs in Rural Notes. Coverage does decline with rurality. Metro counties average 9.1 on the scale, nonmetro-urban 7.3, and rural counties 5.0. The gradient is continuous across the Index of Relative Rurality, and it holds <em>within</em> states: 36 of 38 states with enough counties show the expected negative slope. By every descriptive cut, more rural counties provide less.</p>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><a href="fig-rucc-gradient.png" class="lightbox" data-gallery="quarto-lightbox-gallery-3" title="EICS by RUCC category: metro 9.1, nonmetro-urban 7.3, rural 5.0."><img src="https://cwimpy.com/posts/2026-06-02-uneven-access-county-websites/fig-rucc-gradient.png" class="img-fluid figure-img" alt="EICS by RUCC category: metro 9.1, nonmetro-urban 7.3, rural 5.0."></a></p>
<figcaption>EICS by RUCC category: metro 9.1, nonmetro-urban 7.3, rural 5.0.</figcaption>
</figure>
</div>
<p>But the raw gap is mostly compositional. In a bare bivariate specification rural counties sit 4.1 points below metro. Add state fixed effects and it’s −3.45. Add the demographic and partisan controls and it collapses to −0.81, with the nonmetro-urban gap vanishing entirely. About three-quarters of the rural deficit was never really about rurality. It was about scale.</p>
<p>What absorbs it is log(population), the single strongest predictor in the model: a ten-fold larger county provides about 2.2 more EICS items, holding everything else constant. That’s a fixed-cost story. A bigger jurisdiction can amortize dedicated IT staff, a maintained content-management system, and the ongoing work of keeping a site current over a larger pool of voters. Rural places are, by definition, the small and sparse ones, so scale is the channel rurality mostly runs through here.</p>
<p>This is exactly the kind of thing I hope to consider in this rural notes series. The IRR is a clean, useful continuous measure, but it correlates −0.88 with log(population), and population alone explains about three-quarters of its variance. If you drop the IRR and population into the same model you’ve double-counted size and called part of it “rurality.” So we use categorical RUCC together with log(population) whenever we want to ask how much of the gap is scale, and we never put IRR and population in together. Same finding, different measure, a different story about <em>why</em>.</p>
</section>
<section id="infrastructure-or-content" class="level2">
<h2 class="anchored" data-anchor-id="infrastructure-or-content">Infrastructure or content?</h2>
<p>Because no-website counties enter at zero, the rural coefficient could mean two very different things: rural counties not putting up a site at all (an infrastructure problem), or rural counties running thinner sites (a content problem). Those call for different fixes, so we split them with a two-stage hurdle.</p>
<p>They separate cleanly. On the question of <em>whether a county has an election website at all</em>, the rural coefficient is a precise zero (+0.4 points, p = .76). Rural counties are no less likely to have a site. The entire rural deficit is on the second margin: content depth among counties that already have a site (−0.83, essentially identical to the pooled estimate). The gap isn’t that rural counties can’t get online. It’s that the ongoing work of filling a site out tracks capacity, and capacity tracks size.</p>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><a href="fig-hurdle.png" class="lightbox" data-gallery="quarto-lightbox-gallery-4" title="The rural coefficient splits across the two hurdle margins: a precise zero on whether a site exists, the full effect on content depth. Note the different scales."><img src="https://cwimpy.com/posts/2026-06-02-uneven-access-county-websites/fig-hurdle.png" class="img-fluid figure-img" alt="The rural coefficient splits across the two hurdle margins: a precise zero on whether a site exists, the full effect on content depth. Note the different scales."></a></p>
<figcaption>The rural coefficient splits across the two hurdle margins: a precise zero on whether a site exists, the full effect on content depth. Note the different scales.</figcaption>
</figure>
</div>
<p>And the residual rural gap that survives the controls isn’t evenly spread either. Fit one model per state and the median state’s rural gap is just −0.24; only three states (Tennessee, Kentucky, North Dakota) show a significant rural deficit after controls. What’s left concentrates in foundational items (results, poll-worker applications, schedules, the polling-place locator) in a handful of states, not a nationwide rural divide. The post-2020 items show no rural gap at all, but only because metro counties don’t provide them either. The national floor leaves nothing to lag behind.</p>
</section>
<section id="what-i-take-from-this" class="level2">
<h2 class="anchored" data-anchor-id="what-i-take-from-this">What I take from this</h2>
<p>Three patterns, three different problems:</p>
<ul>
<li><strong>The national floor</strong> on post-2020 information is a universal failure that doesn’t care about urbanicity. Closing it needs a national push.</li>
<li><strong>The state ceiling</strong> is the biggest single source of variation, and it’s the most promising thing left to explain.</li>
<li><strong>The rural gradient</strong> is real but mostly a gradient in county size, with a small rural-specific remainder in foundational items in a few states.</li>
</ul>
</section>
<section id="caveats" class="level2">
<h2 class="anchored" data-anchor-id="caveats">Caveats</h2>
<p>This is preliminary, and a few measurement calls are genuinely unresolved (these are where we most want feedback):</p>
<ul>
<li><strong>The county site, or the voter’s whole information environment?</strong> In high-capacity states the secretary of state’s portal may serve voters a tracker or lookup the county itself doesn’t. Scoring the county site alone answers “what does the county provide?”; crediting the state tool answers “can the voter find it?” We may report both.</li>
<li><strong>A denominator for the post-2020 items.</strong> A county with no signature-cure page in a state that has no signature-cure process is currently scored the same as one that should have it and doesn’t. The floor may mix real gaps with legal non-applicability. The fix is a state-law crosswalk.</li>
<li><strong>A scale, or a checklist?</strong> The EICS is an unweighted sum of 18 binary items. We haven’t validated that they tap one construct, and a polling-place locator and a felon-rights page probably aren’t worth the same point.</li>
</ul>
<p>We hope to update and expand this project as time and resources allow.</p>
</section>
<section id="related" class="level2">
<h2 class="anchored" data-anchor-id="related">Related</h2>
<p>This pairs with the measurement argument behind my <a href="https://cran.r-project.org/package=rurality"><strong>rurality</strong></a> R package and a companion ESRA poster on rurality and election administration (also in <a href="../../rural.html">Rural Notes</a>). For the broader research record, see <a href="../../research.html">Research</a>.</p>
<p><em>Rural Notes is a working-notes series. The posts are research-in-progress, not finished work. Subscribe via <a href="../../rural.xml">RSS</a> for occasional updates.</em></p>


</section>

<a onclick="window.scrollTo(0, 0); return false;" id="quarto-back-to-top"><i class="bi bi-arrow-up"></i> Back to top</a> ]]></description>
  <category>rural-notes</category>
  <category>election-administration</category>
  <category>measurement</category>
  <category>digital-divide</category>
  <category>rurality</category>
  <guid>https://cwimpy.com/posts/2026-06-02-uneven-access-county-websites/</guid>
  <pubDate>Tue, 02 Jun 2026 07:00:00 GMT</pubDate>
  <media:content url="https://cwimpy.com/posts/2026-06-02-uneven-access-county-websites/featured.png" medium="image" type="image/png" height="98" width="144"/>
</item>
<item>
  <title>Introducing rurality.app: A Field Guide to Rural America</title>
  <dc:creator>Cameron Wimpy</dc:creator>
  <link>https://cwimpy.com/posts/2026-05-07-rurality-app/</link>
  <description><![CDATA[ 





<div class="callout callout-style-default callout-note callout-titled" title="Rural Notes">
<div class="callout-header d-flex align-content-center">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">Note</span>Rural Notes
</div>
</div>
<div class="callout-body-container callout-body">
<p>This is the opening post in <a href="../../rural.html">Rural Notes</a>, a working-notes series on rural measurement and rural political behavior. My posts in this series will include downloadable PDFs and, where appropriate, replication code.</p>
</div>
</div>
<section id="a-field-guide-to-rural-america" class="level2">
<h2 class="anchored" data-anchor-id="a-field-guide-to-rural-america">A field guide to rural America</h2>
<p><a href="https://rurality.app"><strong>rurality.app</strong></a> is a new web companion that I created as a complement to my <a href="https://cran.r-project.org/package=rurality"><strong>rurality</strong></a> R package. It takes the same county- and ZIP-level rural–urban classifications that the package exposes to R users and puts them behind a browser interface that anyone (e.g., journalists, county officials, students, curious readers) can use without needing to work with R.</p>
<p>The site’s tagline is its premise: <em>a field guide to rural America</em>. I do not really envision this as a database. My hope is that it is an invitation to look more carefully at things you’d otherwise pass over. Rural America is not a single category, and the app is built to make that visible.</p>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><a href="https://rurality.app"><img src="https://cwimpy.com/posts/2026-05-07-rurality-app/hero_image.png" class="img-fluid quarto-figure quarto-figure-center figure-img"></a></p>
</figure>
</div>
</section>
<section id="what-you-can-do-with-it" class="level2">
<h2 class="anchored" data-anchor-id="what-you-can-do-with-it">What you can do with it</h2>
<ul>
<li>Look up any U.S. county or ZIP and see its RUCC, RUCA, and composite rurality score</li>
<li>Browse a national map and select any location to learn more</li>
<li>Compare up to five places side-by-side</li>
<li>Download the full dataset</li>
<li>Read short field-notes on what each measure captures and where it diverges from the others</li>
<li>Download the field notes</li>
</ul>
<section id="look-up-a-place" class="level3">
<h3 class="anchored" data-anchor-id="look-up-a-place">Look up a place</h3>
<p>To look up a place, go to rurality.app and type a location into the search bar. You can also use your device’s GPS, with permission. Nothing is tracked intentionally; if you find otherwise, let me know. Once you pick a spot, you should get information about it fairly quickly. Below is the exportable field card for Jasper, AR.</p>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><a href="https://rurality.app"><img src="https://cwimpy.com/posts/2026-05-07-rurality-app/jasper_ar_example.png" class="img-fluid quarto-figure quarto-figure-center figure-img"></a></p>
</figure>
</div>
</section>
<section id="see-the-national-picture" class="level3">
<h3 class="anchored" data-anchor-id="see-the-national-picture">See the national picture</h3>
<p>You can also click on the map feature and simply pick out a spot. From either the map or the search, you can then learn all about the place using the dashboard. I plan to keep adding to this over time as I get the data cleaned and accessed through APIs.</p>
<section id="for-rucc-specifically" class="level4">
<h4 class="anchored" data-anchor-id="for-rucc-specifically">For RUCC, specifically</h4>
<p>The US counties page provides an interactive map of the RUCC. Simply click on a county to learn more.</p>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><a href="https://rurality.app"><img src="https://cwimpy.com/posts/2026-05-07-rurality-app/rucc_map.png" class="img-fluid quarto-figure quarto-figure-center figure-img"></a></p>
</figure>
</div>
</section>
</section>
<section id="read-the-measure-not-just-the-value" class="level3">
<h3 class="anchored" data-anchor-id="read-the-measure-not-just-the-value">Read the measure, not just the value</h3>
<p>Each measurement captures specific things. It is a good idea to understand what each one does, and does not capture. Many of the measures were developed for specific applications and need to be understood in that context. The measures also apply to different levels of geography. For example, the RUC codes will map to counties that may have metro centers but relatively rural areas otherwise. The RUCA codes, on the other hand, are mapped to the <a href="https://www.census.gov/programs-surveys/geography/guidance/geo-areas/zctas.html">ZIP Code Tabulation Areas (ZCTAs)</a>, which are obviously much more granular than the whole county. The methodology page provides more details on this and links to the original source documentation.</p>
</section>
<section id="take-the-data-with-you" class="level3">
<h3 class="anchored" data-anchor-id="take-the-data-with-you">Take the data with you</h3>
<p>The safest place to fetch any of the included data may be the original sources! But, since that is not always easy, I included a “for researchers” page that allows you to download the data used in the app/package. I have done my best to make sure everything is cleaned and merged properly, but just note that I am not currently making any promises. This page also provides examples of using the R package. If you cite anything please cite the original sources. If you end up using my index please cite me, but again, do so knowing it is under development.</p>
</section>
</section>
<section id="why-a-web-tool-not-just-a-package" class="level2">
<h2 class="anchored" data-anchor-id="why-a-web-tool-not-just-a-package">Why a web tool, not just a package</h2>
<p>The rurality R package already does some of the heavy lifting for researchers. It includes USDA’s Rural–Urban Continuum Codes, Rural–Urban Commuting Area codes, and a composite rurality score under a single consistent interface. I am working to make sure these merge as cleanly as possible with county FIPS or local zip.</p>
<p>Most of the people who might benefit from looking up rural–urban classifications are not R users. They are reporters writing about a specific county, county officials trying to make sense of a federal funding formula that hinges on metro/non-metro status, students writing papers, and perhaps anyone who has ever read a story about “rural America” and wondered which rural America it was talking about. My hope is that rurality.app makes this an easier process.</p>
<p>I also have been working on expanding my research agenda on rural election administration, measurement, and public opinion. This selfish reason, as much as anything, is why I have created a new way to publicly document that effort. In Rural Notes (the series this post opens) I argue that a finding about rural America is only as good as the rurality measure that produced it. That argument is easier to make when the reader can spend two minutes on rurality.app and see for themselves how a single county can be “rural” under one classification and “metro-adjacent” under another.</p>
</section>
<section id="the-data-underneath" class="level2">
<h2 class="anchored" data-anchor-id="the-data-underneath">The data underneath</h2>
<p>Three layers, all keyed by FIPS or ZIP, all available in the <a href="https://cran.r-project.org/package=rurality"><strong>rurality</strong></a> R package and <a href="https://github.com/cwimpy/rurality-stata"><strong>rurality-stata</strong></a>:</p>
<ul>
<li><strong>Rural–Urban Continuum Codes (RUCC 2023)</strong>: USDA’s nine-point metro/non-metro scale, one row per county. This is one of the most accessible and (at least in my experience) one of the most commonly used measures since it neatly maps to counties.</li>
<li><strong>Rural–Urban Commuting Area Codes (RUCA 2020)</strong>: USDA’s commuting-flow-based classification, finer-grained than RUCC, one row per ZIP code tabulation area.</li>
<li><strong>A composite rurality score</strong>: a continuous measure I built for situations where collapsing nine RUCC buckets into “rural vs.&nbsp;urban” throws away too much signal but keeping all nine as categorical dummies eats degrees of freedom. <em>This one is a work in progress and should be used under that assumption.</em></li>
</ul>
<p>The web app and the R/Stata packages are deliberately three faces of the same thing. If you look up a county on rurality.app, the values you see are the values you’d get from <code>rurality_counties()</code> in R. There is no hidden version, no proprietary score behind the web app, and the data will move forward in step when USDA releases new vintages.</p>
</section>
<section id="where-it-fits-in-the-rural-notes-program" class="level2">
<h2 class="anchored" data-anchor-id="where-it-fits-in-the-rural-notes-program">Where it fits in the Rural Notes program</h2>
<p>rurality.app is the public front door to a research program on three dimensions of rural in which I am currently interested: measurement, public policy (mostly in the form of election administration), and political attitudes and behavior. The posts that follow this one will often use the data the app provides. Sometimes these data will be joined to public-opinion surveys like the Pew American Trends Panel, sometimes joined to election returns, and sometimes just considered on its own. I want to ask substantive questions both about how rural Americans think and experience public policy, and how the answer depends on which “rural” you mean.</p>
<p>The next post in the series will work through that measurement question directly, using the app’s own data layers as the running example. After that, I hope to settle into a rotation of measurement essays, re-analyses of public data, reviews of other people’s work, and short puzzles about what an ideal survey would have to measure.</p>
</section>
<section id="try-it" class="level2">
<h2 class="anchored" data-anchor-id="try-it">Try it</h2>
<p><a href="https://rurality.app"><strong>rurality.app</strong></a> is live and free. There is nothing to install and no account to create. If you find something broken, confusing, or worth a feature request, you can reach me through the <a href="../../contact.html">contact form</a> or open an issue on the <a href="https://github.com/cwimpy/rurality">GitHub repository</a>.</p>
<p><em>Rural Notes is a working-notes series. The posts are research-in-progress, not finished work. Subscribe via <a href="../../rural.xml">RSS</a> for occasional updates.</em></p>


</section>

<a onclick="window.scrollTo(0, 0); return false;" id="quarto-back-to-top"><i class="bi bi-arrow-up"></i> Back to top</a> ]]></description>
  <category>rural-notes</category>
  <category>rurality</category>
  <category>app</category>
  <category>tools</category>
  <guid>https://cwimpy.com/posts/2026-05-07-rurality-app/</guid>
  <pubDate>Fri, 08 May 2026 07:00:00 GMT</pubDate>
  <media:content url="https://cwimpy.com/posts/2026-05-07-rurality-app/hero_image.png" medium="image" type="image/png" height="66" width="144"/>
</item>
<item>
  <title>Introducing slxr: A tool for implementing Spatial-X models</title>
  <dc:creator>Cameron Wimpy</dc:creator>
  <link>https://cwimpy.com/posts/2026-04-22-slxr-r-package/</link>
  <description><![CDATA[ 





<p>Spatial econometrics has significant startup costs. If you’ve taken a course or read a textbook chapter on the subject, odds are you learned SAR first, SDM second, and the Spatial-X (SLX) model (if at all) as a footnote on the way to something fancier. That’s backwards. SLX is the simplest of the three, it has a closed-form interpretation, and for a huge share of applied problems in political (and social) science it is exactly the model you want.</p>
<p><a href="https://cran.r-project.org/package=slxr"><strong>slxr</strong></a> is a new R package I built to make SLX the first thing you reach for instead of the last. Install it, write a formula, get a fitted model.<sup>1</sup></p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb1" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb1-1"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">install.packages</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"slxr"</span>)</span></code></pre></div></div>
<section id="the-slx-model-in-basic-terms" class="level2">
<h2 class="anchored" data-anchor-id="the-slx-model-in-basic-terms">The SLX model in basic terms</h2>
<p>An SLX model is just OLS with spatial lags of your covariates on the right-hand side. If <code>W</code> is a spatial weights matrix, you’re fitting <code>y = Xβ + WXθ + ε</code>. That’s it. No lagged <code>y</code>, no simultaneity, no likelihood maximization, no simulation to get effects out. The direct, indirect, and total effects of any covariate are simple functions of <code>β</code> and <code>θ</code>, and they are readable straight off the coefficient table.</p>
<p>The upshot: SLX gives you spatial spillovers without giving up the interpretability of a linear model. For most applied questions where you actually care about <em>where things spill over to</em> rather than <em>whether there’s autocorrelation left in your residuals</em>, that’s a trade worth considering.</p>
</section>
<section id="the-paper-that-inspired-this-package" class="level2">
<h2 class="anchored" data-anchor-id="the-paper-that-inspired-this-package">The paper that inspired this package</h2>
<p><code>slxr</code> is the software counterpart to <a href="https://doi.org/10.1086/710089">Wimpy, Whitten, and Williams (2021)</a>, the <em>Journal of Politics</em> piece my coauthors and I wrote to make the case for SLX as the <em>default</em> starting point for spatial work in political science. That paper had three moving parts.</p>
<p><strong>A literature review.</strong> We went through every paper in the discipline that used spatial methods through 2015 and coded what the authors’ theories actually claimed versus what their models implicitly imposed. The mismatch was striking: The SAR model, which assumes global dependence, feedback, and infinite-order spillovers—was used in roughly 73% of studies, but fewer than 10% of those studies articulated a theory that was genuinely <em>global</em>. Most theories were about neighbors affecting neighbors. We argue those theories fit SLX, not SAR.</p>
<p><strong>A Monte Carlo.</strong> When the true data-generating process was SAR, a simple SLX model augmented with <code>W²</code> and <code>W³</code> terms recovered the direct, indirect, and total effects at rates comparable to SAR itself. When the true DGP was SLX, however, SAR routinely found “phantom” higher-order and feedback effects that were not in the data, and the bias got worse under spatial heterogeneity (where different covariates flow through different networks). The asymmetry matters. The cost of using SLX when you should have used SAR is small; the cost of using SAR when you should have used SLX is not.</p>
<p><strong>An application.</strong> We looked at countries’ defense burdens (operationalized as military spending as a share of GDP) from 1953 to 2008 and asked whether spatial spillovers in defense spending flowed through one network or several. Using variable-specific weights matrices, we let civil war spill over through contiguity, let interstate war spill over through contiguity <em>and</em> alliance ties, and let a country’s own lagged defense burden propagate through contiguity <em>and</em> shared defense pacts. The SAR model produces one ρ, and thus it assumes one spatial story for every covariate. The SLX model showed that civil-war spillovers ran negative (a neighbor’s civil war <em>depressed</em> your defense burden), that alliance-mediated spillovers from interstate war ran positive, and that SAR’s single-ρ summary qualitatively <em>reversed</em> one of those patterns. None of that is legible from a single ρ.</p>
<p>The paper closed with four guidelines for applied researchers and an explicit acknowledgment that software accessibility was, at the time, a barrier to widespread adoption. That’s the gap <code>slxr</code> is built to close.</p>
</section>
<section id="from-the-paper-to-the-package" class="level2">
<h2 class="anchored" data-anchor-id="from-the-paper-to-the-package">From the paper to the package</h2>
<p>The defense-burden are included with the package. Here’s Table 3, Model 3 of the 2021 paper, written in <code>slxr</code> syntax:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb2" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb2-1"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">library</span>(slxr)</span>
<span id="cb2-2"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">data</span>(defense_burden)</span>
<span id="cb2-3"></span>
<span id="cb2-4">W_contig   <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">slx_weights</span>(<span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">style =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"custom"</span>,</span>
<span id="cb2-5">                          <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">matrix =</span> defense_burden<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>W_contig,</span>
<span id="cb2-6">                          <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">row_standardize =</span> <span class="cn" style="color: #8f5902;
background-color: null;
font-style: inherit;">FALSE</span>)</span>
<span id="cb2-7">W_alliance <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">slx_weights</span>(<span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">style =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"custom"</span>,</span>
<span id="cb2-8">                          <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">matrix =</span> defense_burden<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>W_alliance,</span>
<span id="cb2-9">                          <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">row_standardize =</span> <span class="cn" style="color: #8f5902;
background-color: null;
font-style: inherit;">FALSE</span>)</span>
<span id="cb2-10">W_defense  <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">slx_weights</span>(<span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">style =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"custom"</span>,</span>
<span id="cb2-11">                          <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">matrix =</span> defense_burden<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>W_defense,</span>
<span id="cb2-12">                          <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">row_standardize =</span> <span class="cn" style="color: #8f5902;
background-color: null;
font-style: inherit;">FALSE</span>)</span>
<span id="cb2-13"></span>
<span id="cb2-14">fit <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">slx</span>(</span>
<span id="cb2-15">  ch_milex <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">~</span> milex_tm1 <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> log_pop_tm1 <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> civilwar_tm1 <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> total_wars_tm1 <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span></span>
<span id="cb2-16">             alliance_us <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> ch_milex_us <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> ch_milex_ussr,</span>
<span id="cb2-17">  <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">data    =</span> defense_burden<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>data,</span>
<span id="cb2-18">  <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">spatial =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">list</span>(</span>
<span id="cb2-19">    <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">civilwar_tm1   =</span> W_contig,</span>
<span id="cb2-20">    <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">total_wars_tm1 =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">list</span>(<span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">contig =</span> W_contig, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">alliance =</span> W_alliance),</span>
<span id="cb2-21">    <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">milex_tm1      =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">list</span>(<span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">contig =</span> W_contig, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">defense  =</span> W_defense)</span>
<span id="cb2-22">  )</span>
<span id="cb2-23">)</span>
<span id="cb2-24"></span>
<span id="cb2-25"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">slx_effects</span>(fit)</span>
<span id="cb2-26"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">slx_plot_effects</span>(fit, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">types =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">c</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"indirect"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"total"</span>))</span></code></pre></div></div>
<p>The <code>spatial = list(...)</code> argument is the piece that makes variable-specific <code>W</code> first-class. Each covariate can spill over through its own network — and, as in the <code>milex_tm1</code> and <code>total_wars_tm1</code> rows above, through multiple networks at once.</p>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><a href="effects.png" class="lightbox" data-gallery="quarto-lightbox-gallery-1" title="SLX effects decomposition on the defense-burden data."><img src="https://cwimpy.com/posts/2026-04-22-slxr-r-package/effects.png" class="img-fluid figure-img" alt="Four-panel coefficient plot showing the direct, indirect, and total SLX effects for civilwar_tm1, milex_tm1, and total_wars_tm1 across the contiguity, alliance, and defense-pact weights matrices."></a></p>
<figcaption>SLX effects decomposition on the defense-burden data.</figcaption>
</figure>
</div>
<p><code>slx_plot_effects()</code> turns that fitted object into the figure above. Each panel is one <code>W</code>; each row is one covariate; each point is the decomposed effect with 95% confidence intervals. The pattern you’re looking at — <code>milex_tm1</code>’s negative spillover through the defense-pact network paired with a civil-war indirect effect that runs opposite the direct — is exactly the kind of heterogeneity a single-ρ SAR model cannot resolve.</p>
</section>
<section id="what-else-is-inside" class="level2">
<h2 class="anchored" data-anchor-id="what-else-is-inside">What else is inside</h2>
<p>Variable-specific <code>W</code> is the headline, but it’s not the whole package. The other features I built <code>slxr</code> around are the ones that are fiddly with existing tools:</p>
<ul>
<li><strong>Higher-order lags.</strong> <code>W</code>, <code>W²</code>, <code>W³</code>, with effects decomposed at each order.</li>
<li><strong>Temporally-lagged spatial variables (TSLS)</strong> for panel data — which is what most applied political science actually looks like.</li>
<li><strong>Tidy effects.</strong> <code>slx_effects()</code> returns a tibble. <code>tidy()</code> and <code>glance()</code> methods plug straight into <code>modelsummary</code>. No more hand-built tables.</li>
<li><strong>Sensible defaults.</strong> Row-standardization, queen contiguity, and a formula interface that doesn’t require you to pre-build a <code>listw</code> object just to find out whether your data file even has coordinates on it.</li>
</ul>
</section>
<section id="why-a-package-instead-of-replication-code" class="level2">
<h2 class="anchored" data-anchor-id="why-a-package-instead-of-replication-code">Why a package instead of replication code</h2>
<p>Because replication code works great, but it is often tied to the specific application of the paper. A package turns a method into a tool. <code>slx()</code> works whether you’re studying defense spending, infant mortality, school board decisions, or the diffusion of state policy. The spatial econometrics is the same; only the weights matrix and the covariates change. Wrapping that into one function with a formula interface hopefully allows for easier implementation.</p>
</section>
<section id="who-this-is-for" class="level2">
<h2 class="anchored" data-anchor-id="who-this-is-for">Who this is for</h2>
<p>If you’ve ever:</p>
<ul>
<li>Fit a SAR model and wished you could just read the spillovers off the coefficients,</li>
<li>Looked at spdep and bounced off the <code>listw</code> object,</li>
<li>Wanted to say something substantive about how variable A spills over via one network while variable B spills over via another,</li>
<li>Or wanted to include a <code>WX</code> term in <code>lm()</code> and been annoyed that there wasn’t a clean way to do it,</li>
<li>Or even looking to work with spatial econometric theories and data for the first time,</li>
</ul>
<p>then this package might be for you.</p>
</section>
<section id="whats-next" class="level2">
<h2 class="anchored" data-anchor-id="whats-next">What’s next</h2>
<p>Four concrete pieces are on the near-term roadmap:</p>
<ul>
<li><strong>A replication vignette for Wimpy, Whitten, and Williams (2021).</strong> The full Table 3 end-to-end, from weights matrices to effects plots, in a single Quarto document. The goal is to make the JoP paper something a graduate student can reproduce in an afternoon without ever opening a <code>listw</code> object.</li>
<li><strong>Diagnostics for <code>W</code> selection.</strong> The choice of weights matrix is routinely the most consequential modeling decision in a spatial paper and gets an eyeball test and a sentence. I’d like <code>slxr</code> to include a principled toolkit for comparing competing <code>W</code> specifications. This includes information-criterion ranking, permutation tests, and sensitivity plots. This helps make that choice of <code>W</code> defensible rather than improvised.</li>
<li><strong>First-class <code>sf</code> pipelines.</strong> <code>slx()</code> already accepts <code>sf</code> input, but the round trip from a shapefile to a fitted model still asks more of the user than it should. A <code>sf</code>-aware wrapper that generates contiguity, k-nearest-neighbor, and distance-decay <code>W</code> matrices from a geometry column. This keeps them aligned across panel waves, and I hope it is my next big update</li>
<li><strong>Panel conveniences.</strong> Unbalanced panels work today, but the ergonomics of swapping in year-specific <code>W</code> matrices, handling isolates, and comparing time-invariant vs.&nbsp;time-varying connectivity can be much better than they are.</li>
</ul>
<p>If any of these would unblock your work, or if you have a use case I haven’t anticipated, the <a href="https://github.com/cwimpy/slxr/issues">GitHub issue tracker</a> is open and pull requests are welcome. The package is MIT-licensed.</p>
<p>If you just want to try it, the whole thing is one install away:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb3" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb3-1"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">install.packages</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"slxr"</span>)</span></code></pre></div></div>
<p>Let me know what you think.</p>


</section>


<a onclick="window.scrollTo(0, 0); return false;" id="quarto-back-to-top"><i class="bi bi-arrow-up"></i> Back to top</a><div id="quarto-appendix" class="default"><section id="footnotes" class="footnotes footnotes-end-of-document"><h2 class="anchored quarto-appendix-heading">Footnotes</h2>

<ol>
<li id="fn1"><p>I built this with scaffolding and testing help from Claude Code. It helped me turn the working development version I had on my Github to something that is now on CRAN.↩︎</p></li>
</ol>
</section></div> ]]></description>
  <category>R</category>
  <category>package</category>
  <category>spatial</category>
  <category>methodology</category>
  <category>SLX</category>
  <guid>https://cwimpy.com/posts/2026-04-22-slxr-r-package/</guid>
  <pubDate>Wed, 22 Apr 2026 07:00:00 GMT</pubDate>
  <media:content url="https://cwimpy.com/posts/2026-04-22-slxr-r-package/hex.png" medium="image" type="image/png" height="166" width="144"/>
</item>
<item>
  <title>Introducing rurality: a one-stop R package for U.S. rural–urban data</title>
  <dc:creator>Cameron Wimpy</dc:creator>
  <link>https://cwimpy.com/posts/2026-04-13-rurality-r-package/</link>
  <description><![CDATA[ 





<p>If you do any applied work on rural America, you’ve probably hit the same wall I have: the data you need isn’t on CRAN. It’s on USDA’s website, spread across half a dozen Excel files, with column names that change between vintages and codebooks that live in separate PDFs.</p>
<p><strong><a href="https://cran.r-project.org/package=rurality">rurality</a></strong> is a new R package I built to make that wall disappear. Install it, load it, get a tidy tibble of rural–urban classifications for every U.S. county and ZIP code. That’s the pitch.</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb1" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb1-1"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">install.packages</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"rurality"</span>)</span></code></pre></div></div>
<section id="whats-inside" class="level2">
<h2 class="anchored" data-anchor-id="whats-inside">What’s inside</h2>
<p>The package ships three things, all on CRAN, all keyed by FIPS or ZIP:</p>
<ul>
<li><strong>USDA Rural–Urban Continuum Codes (RUCC 2023)</strong>: the nine-point metro–nonmetro scale, one row per county.</li>
<li><strong>USDA Rural–Urban Commuting Area Codes (RUCA 2020)</strong>: finer-grained, commuting-flow-based, one row per ZIP.</li>
<li><strong>A composite rurality score</strong>: a single continuous measure I built for situations where you want more resolution than RUCC but don’t want to hand your reviewers two different classification systems to reconcile.</li>
</ul>
<p>All three are available through a single consistent interface. You don’t have to know which USDA file they came from or which release year is current.</p>
</section>
<section id="the-shape-of-the-api" class="level2">
<h2 class="anchored" data-anchor-id="the-shape-of-the-api">The shape of the API</h2>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb2" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb2-1"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">library</span>(rurality)</span>
<span id="cb2-2"></span>
<span id="cb2-3"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Every U.S. county with its RUCC and composite score</span></span>
<span id="cb2-4">counties <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">rurality_counties</span>()</span>
<span id="cb2-5"></span>
<span id="cb2-6"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Every ZIP with RUCA</span></span>
<span id="cb2-7">zips <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">rurality_zips</span>()</span>
<span id="cb2-8"></span>
<span id="cb2-9"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Attach rurality to your own data by FIPS or ZIP</span></span>
<span id="cb2-10">my_data <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">|&gt;</span></span>
<span id="cb2-11">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">rurality_join</span>(<span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">by =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"fips"</span>)</span></code></pre></div></div>
<p>That’s it. No <code>read_excel</code>, no FIPS padding, no column renaming, no digging for the latest codebook.</p>
</section>
<section id="why-a-package-instead-of-a-cleaned-up-csv" class="level2">
<h2 class="anchored" data-anchor-id="why-a-package-instead-of-a-cleaned-up-csv">Why a package instead of a cleaned-up CSV?</h2>
<p>Two reasons.</p>
<p><strong>First, the data is going to change.</strong> USDA releases a new RUCC vintage every ten years or so, and RUCA on its own cadence. Wiring the data into a package means when a new release drops, every project downstream gets the update with <code>update.packages()</code>. No one has to remember which CSV they downloaded in which project folder.</p>
<p><strong>Second, a consistent API is what social scientists actually need.</strong> Half the “rural” studies I review are built on whichever classification the author happened to find first. A package possible standardizes those choices, everyone is using the same definitions, with the same vintages, documented in one place.</p>
</section>
<section id="behind-the-composite-score" class="level2">
<h2 class="anchored" data-anchor-id="behind-the-composite-score">Behind the composite score</h2>
<p>The composite score is the piece I’m most nervous about and most excited about. It’s designed to give you a continuous measure in situations where collapsing 9 RUCC buckets into “rural vs.&nbsp;urban” throws away too much signal, but where keeping all 9 as categorical dummies eats your degrees of freedom.</p>
<p>Under the hood it combines RUCC, population density, distance to the nearest metro, and a handful of other county characteristics into a single scalar, standardized across the full 3,235-county universe. If you use it in a paper, please cite the package and the <a href="https://cran.r-project.org/package=rurality">documentation site</a>, I’d like to know where it’s showing up.</p>
</section>
<section id="a-companion-the-rurality-app" class="level2">
<h2 class="anchored" data-anchor-id="a-companion-the-rurality-app">A companion: the rurality app</h2>
<p>There’s also a companion web app at <a href="https://rurality.app">rurality.app</a> for exploring the data without opening R. Type in a county, get its scores. Useful for students, policymakers, or anyone who needs a quick lookup without writing code. The Stata port (<a href="https://github.com/cwimpy/rurality-stata">rurality-stata</a>) mirrors the R API for folks living on the other side of the open-source aisle.</p>
</section>
<section id="where-this-came-from" class="level2">
<h2 class="anchored" data-anchor-id="where-this-came-from">Where this came from</h2>
<p>I built <code>rurality</code> because I got tired of copying the same USDA-download script into every new project, and because the <a href="https://www.astate.edu/a/iri/">Institute for Rural Initiatives</a> I direct at Arkansas State is in the business of making rural public policy research easier to do. A good chunk of what we try to do at IRI is lower the friction between “interesting question about rural America” and “peer-reviewable answer.” This package is one small brick in that wall.</p>
</section>
<section id="whats-next" class="level2">
<h2 class="anchored" data-anchor-id="whats-next">What’s next</h2>
<p>A few things on the roadmap:</p>
<ul>
<li><strong>Historical RUCC coverage</strong> so you can build change-over-time panels without manually joining 2003, 2013, and 2023 releases. (The homepage map on <a href="../..">cwimpy.com</a> already does this for 2013 → 2023; the plan is to make that kind of analysis one line of code.)</li>
<li><strong>RUCA on a county-aggregate basis</strong> for users who need commuting-flow information without descending to ZIP level.</li>
<li><strong>Vignettes</strong> for common applied workflows, which involve merging onto survey data, stratifying outcomes by rurality, building the kind of figures that make rural variation legible to readers who don’t live there.</li>
</ul>
<p>If you have thoughts, feature requests, or a use case I haven’t anticipated, the <a href="https://github.com/cwimpy/rurality/issues">GitHub issue tracker</a> is open, and I try to respond within a week or two. Pull requests welcome too as the package is MIT-licensed.</p>
<p>If you just want to try it, the whole thing is one install away:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb3" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb3-1"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">install.packages</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"rurality"</span>)</span></code></pre></div></div>
<p>Happy merging.</p>


</section>

<a onclick="window.scrollTo(0, 0); return false;" id="quarto-back-to-top"><i class="bi bi-arrow-up"></i> Back to top</a> ]]></description>
  <category>R</category>
  <category>package</category>
  <category>rural</category>
  <category>methodology</category>
  <category>rurality</category>
  <guid>https://cwimpy.com/posts/2026-04-13-rurality-r-package/</guid>
  <pubDate>Mon, 13 Apr 2026 07:00:00 GMT</pubDate>
  <media:content url="https://cwimpy.com/posts/2026-04-13-rurality-r-package/hex.png" medium="image" type="image/png" height="166" width="144"/>
</item>
<item>
  <title>Building a Programmatic Academic CV with Quarto and Typst</title>
  <dc:creator>Cameron Wimpy</dc:creator>
  <link>https://cwimpy.com/posts/2026-04-05-typst-cv/</link>
  <description><![CDATA[ 





<p>If you have ever wrestled with LaTeX to format a CV, you know the pain: cryptic error messages, fragile spacing, package conflicts, and the nagging feeling that there must be a better way. There might be. <a href="https://typst.app/">Typst</a> is a modern typesetting system that is fast, readable, and increasingly supported by <a href="https://posit.co/">Posit</a> through <a href="https://quarto.org/">Quarto</a>. In this post, I walk through how I built a fully programmatic academic CV that pulls publications directly from a BibTeX file, formats them in APSA style with hanging indents and bold author highlighting, and produces a clean PDF that I think competes with anything you could design in Adobe InDesign.</p>
<p>The full source code is available on <a href="https://github.com/cwimpy/my-cv">GitHub</a>.</p>
<section id="why-typst" class="level2">
<h2 class="anchored" data-anchor-id="why-typst">Why Typst?</h2>
<p>LaTeX has been the standard for academic typesetting for decades, and for good reason. It handles complex math, cross-references, and bibliographies well. But it comes with real costs:</p>
<ul>
<li><strong>Compilation is slow.</strong> A multi-page document with bibliographies can take several seconds. Typst compiles in milliseconds.</li>
<li><strong>The syntax is hostile to newcomers.</strong> Even experienced users regularly fight with vspace, hfill, and mysterious overfull hbox warnings.</li>
<li><strong>Error messages are cryptic.</strong> A missing brace on line 47 might produce an error on line 312.</li>
<li><strong>Package management is fragile.</strong> CTAN packages can conflict, and getting a specific look often requires stacking multiple packages.</li>
</ul>
<p>Typst addresses all of these. Its syntax reads like a mix of Markdown and a scripting language. It compiles instantly. And because Quarto now supports Typst as a first-class output format, you can combine R or Python code chunks with Typst templates in a single .qmd file.</p>
</section>
<section id="the-architecture" class="level2">
<h2 class="anchored" data-anchor-id="the-architecture">The architecture</h2>
<p>My CV has four files:</p>
<pre class="text"><code>my-cv/
├── my-cv.qmd           # Content and data (Quarto document)
├── cv-template.typ      # Design and layout (Typst template)
├── publications.bib     # Bibliography (BibTeX)
└── _quarto.yml          # Project config (post-render cleanup)</code></pre>
<p>The .qmd file contains the CV content and an R chunk that reads the BibTeX file. The .typ file defines the visual design (e.g., fonts, colors, spacing, and custom functions for entries). The .bib file is the same one I use for my website and papers. One source of truth for publications, used everywhere. The <code>_quarto.yml</code> file handles a small annoyance: Quarto generates a mediabag folder (<code>my-cv_files/</code>) during rendering that is not needed after the PDF is built. A post-render hook takes care of it:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb2" style="background: #f1f3f5;"><pre class="sourceCode yaml code-with-copy"><code class="sourceCode yaml"><span id="cb2-1"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">project</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span></span>
<span id="cb2-2"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">post-render</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span></span>
<span id="cb2-3"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">    </span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">-</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> </span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"rm -rf my-cv_files"</span></span></code></pre></div></div>
</section>
<section id="the-typst-template" class="level2">
<h2 class="anchored" data-anchor-id="the-typst-template">The Typst template</h2>
<p>The template (cv-template.typ) is where the design lives. At the top, I define colors and fonts:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb3" style="background: #f1f3f5;"><pre class="sourceCode typst code-with-copy"><code class="sourceCode typst"><span id="cb3-1"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">#let</span> <span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">color-darknight</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> rgb<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">(</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"#131A28"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">)</span></span>
<span id="cb3-2"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">#let</span> <span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">color-darkgray</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> rgb<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">(</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"#333333"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">)</span></span>
<span id="cb3-3"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">#let</span> <span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">color-gray</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> rgb<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">(</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"#5d5d5d"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">)</span></span>
<span id="cb3-4"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">#let</span> <span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">color-lightgray</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> rgb<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">(</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"#999999"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">)</span></span>
<span id="cb3-5"></span>
<span id="cb3-6"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">#let</span> <span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">font-header</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">(</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Myriad Pro"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Arial"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Helvetica"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">)</span></span>
<span id="cb3-7"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">#let</span> <span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">font-text</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">(</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Myriad Pro"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Arial"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Helvetica"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">)</span></span></code></pre></div></div>
<p>If you have Myriad Pro installed (it comes with Adobe products), the CV uses it. Otherwise, it falls back to Arial. This is already easier than LaTeX, where using a custom font often requires fontspec, XeLaTeX, and a specific compilation chain.</p>
<section id="the-cv-entry-function" class="level3">
<h3 class="anchored" data-anchor-id="the-cv-entry-function">The CV entry function</h3>
<p>The core building block is cv-entry, a reusable function for employment, education, grants, and everything else:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb4" style="background: #f1f3f5;"><pre class="sourceCode typst code-with-copy"><code class="sourceCode typst"><span id="cb4-1"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">#let</span> <span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">cv-entry</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">(</span></span>
<span id="cb4-2">  title<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">""</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb4-3">  organization<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">""</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb4-4">  location<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">""</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb4-5">  dates<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">""</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb4-6">  description<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">""</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb4-7">  amount<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">none</span></span>
<span id="cb4-8"><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">)</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span></span>
<span id="cb4-9">  pad<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">[</span></span>
<span id="cb4-10">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">#</span>justified-header<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">(</span>title<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> location<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> amount<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> amount<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">)</span></span>
<span id="cb4-11">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">#</span>secondary-justified-header<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">(</span>organization<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> dates<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">)</span></span>
<span id="cb4-12">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">#</span><span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">if</span> description <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">!=</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">""</span> and organization <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">!=</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">""</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">[</span></span>
<span id="cb4-13">      <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">#</span>v<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">(</span><span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.2em</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">)</span></span>
<span id="cb4-14">      <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">#</span>pad<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">(</span>left<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">1em</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb4-15">        text<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">(</span>size<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">11pt</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> fill<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> color-gray<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">)[</span>- <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">#</span>description<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">]</span></span>
<span id="cb4-16">      <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">)</span></span>
<span id="cb4-17">    <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">]</span></span>
<span id="cb4-18">  <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">]</span></span>
<span id="cb4-19">  v<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">(</span><span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.5em</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">)</span></span>
<span id="cb4-20"><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span></span></code></pre></div></div>
<p>This produces a clean two-line entry with the title and location on the first line (justified left and right), and the organization and dates on the second. The amount parameter is optional, but I use it for grants:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb5" style="background: #f1f3f5;"><pre class="sourceCode typst code-with-copy"><code class="sourceCode typst"><span id="cb5-1"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">#</span>cv-entry<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">(</span></span>
<span id="cb5-2">  title<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Exploring Rural Election Administration"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb5-3">  organization<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"MIT Election Data and Science Lab"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb5-4">  dates<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"2022"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb5-5">  amount<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"$95,173"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb5-6"><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">)</span></span></code></pre></div></div>
<p>Compare this to the LaTeX equivalent, which typically involves tabular environments, manual hfill calls, and careful spacing. In Typst, the function handles all of that.</p>
<p>One style note: for conference and invited presentation titles, I wrap them in typographic curly quotes (01c 01d) in the .qmd source to follow standard academic citation conventions for shorter works. Grant titles and employment entries remain unquoted. Since the template renders titles in bold, the quotes provide a visual cue that distinguishes presentation titles from section labels or position titles.</p>
</section>
<section id="section-headings" class="level3">
<h3 class="anchored" data-anchor-id="section-headings">Section headings</h3>
<p>Section headings get a bold title with a full-width rule underneath:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb6" style="background: #f1f3f5;"><pre class="sourceCode typst code-with-copy"><code class="sourceCode typst"><span id="cb6-1"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">#let</span> <span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">section</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">(</span>title<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">)</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span></span>
<span id="cb6-2">  <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">set</span> <span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">block</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">(</span>above<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">1.5em</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> below<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">1em</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">)</span></span>
<span id="cb6-3">  <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">set</span> <span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">text</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">(</span>size<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">16pt</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> weight<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"regular"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">)</span></span>
<span id="cb6-4">  stack<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">(</span></span>
<span id="cb6-5">    spacing<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.3em</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb6-6">    text<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">(</span>color-accent<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> weight<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"bold"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">)[</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">#</span>title<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">],</span></span>
<span id="cb6-7">    line<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">(</span>length<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">100%</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">)</span></span>
<span id="cb6-8">  <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">)</span></span>
<span id="cb6-9"><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span></span></code></pre></div></div>
<p>Quarto’s heading syntax (# Education) automatically maps to this function through a show rule:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb7" style="background: #f1f3f5;"><pre class="sourceCode typst code-with-copy"><code class="sourceCode typst"><span id="cb7-1"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">#show</span> heading<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span>where<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">(</span>level<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">):</span> it =&gt; section(it.body)</span></code></pre></div></div>
<p>This means the .qmd content file uses plain Markdown headings, and the template handles the styling. Clean separation of content and design.</p>
</section>
</section>
<section id="programmatic-publications" class="level2">
<h2 class="anchored" data-anchor-id="programmatic-publications">Programmatic publications</h2>
<p>This is the part that makes the CV truly programmatic. Instead of manually typing each publication (and inevitably introducing inconsistencies), an R chunk reads publications.bib and generates Typst data structures at render time.</p>
<section id="the-r-chunk" class="level3">
<h3 class="anchored" data-anchor-id="the-r-chunk">The R chunk</h3>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb8" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb8-1"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">library</span>(RefManageR)</span>
<span id="cb8-2">bib <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">ReadBib</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"publications.bib"</span>)</span>
<span id="cb8-3"></span>
<span id="cb8-4"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">cat</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"```{=typst}</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">\n</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span>)</span>
<span id="cb8-5"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">cat</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"#let my-publications = (</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">\n</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span>)</span>
<span id="cb8-6"></span>
<span id="cb8-7"><span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> (i <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">length</span>(bib)) {</span>
<span id="cb8-8">  entry <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> bib[[i]]</span>
<span id="cb8-9">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">cat</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"  (</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">\n</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span>)</span>
<span id="cb8-10">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">cat</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"    type: </span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">\"</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">article</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">\"</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">,</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">\n</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span>)</span>
<span id="cb8-11">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">cat</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"    author: </span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">\"</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span>, authors, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">\"</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">,</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">\n</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">sep=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">""</span>)</span>
<span id="cb8-12">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">cat</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"    title: </span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">\"</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span>, title, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">\"</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">,</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">\n</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">sep=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">""</span>)</span>
<span id="cb8-13">  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># ... more fields</span></span>
<span id="cb8-14">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">cat</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"  )"</span>)</span>
<span id="cb8-15">}</span>
<span id="cb8-16"></span>
<span id="cb8-17"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">cat</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">")</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">\n</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span>)</span>
<span id="cb8-18"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">cat</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"#display-publications-from-data(</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">\n</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span>)</span>
<span id="cb8-19"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">cat</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"  publications: my-publications,</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">\n</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span>)</span>
<span id="cb8-20"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">cat</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"  bold-name: </span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">\"</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">Cameron Wimpy</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">\"</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">,</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">\n</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span>)</span>
<span id="cb8-21"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">cat</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"  reverse-numbering: true,</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">\n</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span>)</span>
<span id="cb8-22"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">cat</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"  categories: (</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">\n</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span>)</span>
<span id="cb8-23"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">cat</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"    (</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">\"</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">article</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">\"</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">, </span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">\"</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">Journal Articles</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">\"</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">),</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">\n</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span>)</span>
<span id="cb8-24"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">cat</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"    (</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">\"</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">incollection</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">\"</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">, </span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">\"</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">Book Chapters</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">\"</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">),</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">\n</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span>)</span>
<span id="cb8-25"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">cat</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"    (</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">\"</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">essay</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">\"</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">, </span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">\"</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">Essays &amp; Reviews</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">\"</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">)</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">\n</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span>)</span>
<span id="cb8-26"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">cat</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"  )</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">\n</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span>)</span>
<span id="cb8-27"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">cat</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">")</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">\n</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span>)</span>
<span id="cb8-28"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">cat</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"```</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">\n</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span>)</span></code></pre></div></div>
<p>This chunk uses RefManageR to parse the BibTeX file, then emits raw Typst code as a data array. Each publication becomes a Typst dictionary with fields like type, author, title, journal, year, etc. The display-publications-from-data function (defined in the template) takes this array and renders formatted citations.</p>
</section>
<section id="apsa-style-formatting-in-typst" class="level3">
<h3 class="anchored" data-anchor-id="apsa-style-formatting-in-typst">APSA-style formatting in Typst</h3>
<p>The template’s format-publication function handles APSA citation style with proper hanging indents:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb9" style="background: #f1f3f5;"><pre class="sourceCode typst code-with-copy"><code class="sourceCode typst"><span id="cb9-1"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">#let</span> <span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">format-publication</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">(</span>entry<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> number<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">none</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> bold-name<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Cameron Wimpy"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">)</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span></span>
<span id="cb9-2">  <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">set</span> <span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">text</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">(</span>size<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">10pt</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> fill<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> color-darknight<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">)</span></span>
<span id="cb9-3">  <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">set</span> <span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">par</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">(</span>leading<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.65em</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> hanging-indent<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">2em</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">)</span></span>
<span id="cb9-4"></span>
<span id="cb9-5">  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">// Build citation string in APSA format</span></span>
<span id="cb9-6">  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">// Author. Year. "Title." Journal Volume (Number): Pages.</span></span>
<span id="cb9-7"><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span></span></code></pre></div></div>
<p>The key line is hanging-indent: 2em, as Typst handles this natively. In LaTeX, you would need something like the hangparas environment from the hanging package, or manual hangindent and hangafter commands.</p>
<p>The function also bolds your name automatically:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb10" style="background: #f1f3f5;"><pre class="sourceCode typst code-with-copy"><code class="sourceCode typst"><span id="cb10-1"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">#let</span> <span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">bold-author-name</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">(</span>authors-str<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> bold-name<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">)</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span></span>
<span id="cb10-2">  <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">let</span> <span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">parts</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> authors-str<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span>split<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">(</span>regex<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">(</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">" and |, and | &amp; "</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">))</span></span>
<span id="cb10-3">  <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">let</span> <span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">formatted-parts</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">()</span></span>
<span id="cb10-4">  <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> part <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> parts <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span></span>
<span id="cb10-5">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">let</span> <span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">clean-part</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> part<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span>trim<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">()</span></span>
<span id="cb10-6">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">if</span> clean-part<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span>contains<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">(</span>bold-name<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">)</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span></span>
<span id="cb10-7">      formatted-parts<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span>push<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">(</span>text<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">(</span>weight<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"bold"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">)[</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">#</span>clean-part<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">])</span></span>
<span id="cb10-8">    <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span> <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">else</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span></span>
<span id="cb10-9">      formatted-parts<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span>push<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">(</span>clean-part<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">)</span></span>
<span id="cb10-10">    <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span></span>
<span id="cb10-11">  <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span></span>
<span id="cb10-12">  formatted-parts<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span>join<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">(</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">" and "</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">)</span></span>
<span id="cb10-13"><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span></span></code></pre></div></div>
</section>
<section id="automatic-categorization-and-numbering" class="level3">
<h3 class="anchored" data-anchor-id="automatic-categorization-and-numbering">Automatic categorization and numbering</h3>
<p>Publications are automatically sorted by year (newest first), grouped into categories (Journal Articles, Book Chapters, Essays &amp; Reviews), and numbered in reverse order. Adding a new publication means adding it to publications.bib and re-rendering. No manual formatting, no renumbering, no copy-paste errors.</p>
<p>Equal authorship is flagged automatically with a star symbol when the BibTeX entry includes note = {equal authorship}.</p>
</section>
</section>
<section id="the-header" class="level2">
<h2 class="anchored" data-anchor-id="the-header">The header</h2>
<p>The CV header uses Font Awesome and Academicons for social links, laid out in a three-column grid:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb11" style="background: #f1f3f5;"><pre class="sourceCode typst code-with-copy"><code class="sourceCode typst"><span id="cb11-1"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">#</span>grid<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">(</span></span>
<span id="cb11-2">  columns<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">(</span><span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">1fr</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">1fr</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">1fr</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">),</span></span>
<span id="cb11-3">  <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">[</span></span>
<span id="cb11-4">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">#</span>fa-icon<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">(</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"location-dot"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">)</span> <span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">$address$</span> <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">\</span></span>
<span id="cb11-5">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">#</span>fa-icon<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">(</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"envelope"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">)</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">#</span>link<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">(</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"mailto:$email$"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">)[</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">$email$</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">]</span> <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">\</span></span>
<span id="cb11-6">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">#</span>fa-icon<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">(</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"orcid"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> font<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Font Awesome 6 Brands"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">)</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">#</span>link<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">(</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"$orcidurl$"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">)[</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">$orcidhandle$</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">]</span></span>
<span id="cb11-7">  <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">],</span></span>
<span id="cb11-8">  <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">[</span></span>
<span id="cb11-9">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">#</span>fa-icon<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">(</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"phone"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">)</span> <span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">$phone$</span> <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">\</span></span>
<span id="cb11-10">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">#</span>fa-icon<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">(</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"earth-americas"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">)</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">#</span>link<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">(</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"$websiteurl$"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">)[</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">$websitedisplay$</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">]</span> <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">\</span></span>
<span id="cb11-11">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">#</span>fa-icon<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">(</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"linkedin"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> font<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Font Awesome 6 Brands"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">)</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">#</span>link<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">(</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"$linkedin$"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">)[</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">$linkedinhandle$</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">]</span></span>
<span id="cb11-12">  <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">],</span></span>
<span id="cb11-13">  <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">[</span></span>
<span id="cb11-14">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">#</span>fa-icon<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">(</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"x-twitter"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> font<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Font Awesome 6 Brands"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">)</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">#</span>link<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">(</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"$twitter$"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">)[</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">\@</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">$twitterhandle$</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">]</span> <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">\</span></span>
<span id="cb11-15">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">#</span>fa-icon<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">(</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"github"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> font<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Font Awesome 6 Brands"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">)</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">#</span>link<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">(</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"$github$"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">)[</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">$githubhandle$</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">]</span> <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">\</span></span>
<span id="cb11-16">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">#</span>ai-icon<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">(</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"google-scholar"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">)</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">#</span>link<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">(</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"$google-scholar$"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">)[</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">$google-scholarhandle$</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">]</span></span>
<span id="cb11-17">  <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">]</span></span>
<span id="cb11-18"><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">)</span></span></code></pre></div></div>
<p>The <img src="https://latex.codecogs.com/png.latex?variable"> syntax is Quarto’s template variable interpolation—values come from the YAML frontmatter in the .qmd file:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb12" style="background: #f1f3f5;"><pre class="sourceCode yaml code-with-copy"><code class="sourceCode yaml"><span id="cb12-1"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">firstname</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> </span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Cameron"</span></span>
<span id="cb12-2"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">lastname</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> </span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Wimpy"</span></span>
<span id="cb12-3"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">email</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> </span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"cwimpy@astate.edu"</span></span>
<span id="cb12-4"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">website</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> </span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"cwimpy.com"</span></span>
<span id="cb12-5"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">github</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> </span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"https://github.com/cwimpy"</span></span>
<span id="cb12-6"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">orcidurl</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> </span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"https://orcid.org/0000-0002-2049-5229"</span></span></code></pre></div></div>
</section>
<section id="the-footer" class="level2">
<h2 class="anchored" data-anchor-id="the-footer">The footer</h2>
<p>Every page gets an automatic footer with the revision date, name, and page number:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb13" style="background: #f1f3f5;"><pre class="sourceCode typst code-with-copy"><code class="sourceCode typst"><span id="cb13-1"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">#set</span> <span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">page</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">(</span></span>
<span id="cb13-2">  footer<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> context <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">[</span></span>
<span id="cb13-3">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">#set</span> <span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">text</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">(</span>fill<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> color-lightgray<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> size<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">8pt</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">)</span></span>
<span id="cb13-4">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">#</span>grid<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">(</span></span>
<span id="cb13-5">      columns<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">(</span><span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">1fr</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">1fr</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">1fr</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">),</span></span>
<span id="cb13-6">      align<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">(</span>left<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">)[</span>Revised <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">#</span>datetime<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span>today<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">().</span>display<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">(</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"[month repr:long] [year]"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">)],</span></span>
<span id="cb13-7">      align<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">(</span>center<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">)[</span>Cameron Wimpy · CV<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">],</span></span>
<span id="cb13-8">      align<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">(</span>right<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">)[</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">#</span>counter<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">(</span>page<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">).</span>display<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">(</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"1 / 1"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> both<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">true</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">)]</span></span>
<span id="cb13-9">    <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">)</span></span>
<span id="cb13-10">  <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">]</span></span>
<span id="cb13-11"><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">)</span></span></code></pre></div></div>
<p>The revision date updates automatically every time you render. No more forgetting to update the “Last revised” line.</p>
</section>
<section id="rendering" class="level2">
<h2 class="anchored" data-anchor-id="rendering">Rendering</h2>
<p>To build the CV:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb14" style="background: #f1f3f5;"><pre class="sourceCode bash code-with-copy"><code class="sourceCode bash"><span id="cb14-1"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">quarto</span> render my-cv.qmd</span></code></pre></div></div>
<p>That is it. Quarto runs the R chunk, which reads the BibTeX file and emits Typst code, then Typst compiles the whole thing into a PDF. On my machine, the entire process takes about two seconds for a 13-page CV.</p>
</section>
<section id="what-i-like-about-this-approach" class="level2">
<h2 class="anchored" data-anchor-id="what-i-like-about-this-approach">What I like about this approach</h2>
<ol type="1">
<li><strong>Single source of truth.</strong> Publications live in one .bib file used across my CV, website, and papers.</li>
<li><strong>Separation of content and design.</strong> The .qmd has the data; the .typ has the styling. Change the font or colors in one place.</li>
<li><strong>Readable source files.</strong> Anyone can look at cv-entry(title: “Department Chair”, …) and understand what it does.</li>
<li><strong>Fast iteration.</strong> Typst compiles in milliseconds, so you can preview changes instantly.</li>
<li><strong>Programmatic publications.</strong> Add a BibTeX entry, re-render, done. No manual formatting.</li>
<li><strong>Modern tooling.</strong> Quarto, R, and Typst are all actively developed and well-documented.</li>
</ol>
</section>
<section id="getting-started" class="level2">
<h2 class="anchored" data-anchor-id="getting-started">Getting started</h2>
<p>If you want to try this yourself:</p>
<ol type="1">
<li>Install <a href="https://quarto.org/docs/get-started/">Quarto</a> (1.4 or later for Typst support)</li>
<li>Clone the repository and navigate into it:</li>
</ol>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb15" style="background: #f1f3f5;"><pre class="sourceCode bash code-with-copy"><code class="sourceCode bash"><span id="cb15-1"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">git</span> clone https://github.com/cwimpy/my-cv.git</span>
<span id="cb15-2"><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">cd</span> my-cv</span></code></pre></div></div>
<ol start="3" type="1">
<li>Replace the content in my-cv.qmd with your own information</li>
<li>Replace publications.bib with your own bibliography</li>
<li>Render the CV:</li>
</ol>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb16" style="background: #f1f3f5;"><pre class="sourceCode bash code-with-copy"><code class="sourceCode bash"><span id="cb16-1"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">quarto</span> render my-cv.qmd</span></code></pre></div></div>
<p>The Typst template is designed to be modifiable. Change the colors at the top, swap the fonts, and adjust the spacing as needed. It is all in one file with clear variable names.</p>
<p>Typst is still young, but Posit’s investment in Quarto integration signals that it has a real future in academic publishing. For CVs, at least in my experience so far, it is already beating LaTeX in almost every way that matters.</p>


</section>

<a onclick="window.scrollTo(0, 0); return false;" id="quarto-back-to-top"><i class="bi bi-arrow-up"></i> Back to top</a> ]]></description>
  <category>quarto</category>
  <category>typst</category>
  <category>tutorial</category>
  <category>academic</category>
  <guid>https://cwimpy.com/posts/2026-04-05-typst-cv/</guid>
  <pubDate>Sun, 05 Apr 2026 07:00:00 GMT</pubDate>
  <media:content url="https://cwimpy.com/posts/2026-04-05-typst-cv/cv-preview.png" medium="image" type="image/png" height="186" width="144"/>
</item>
<item>
  <title>Asking for a Letter of Recommendation</title>
  <dc:creator>Cameron Wimpy</dc:creator>
  <link>https://cwimpy.com/posts/2023-06-22-recommendation-letters/</link>
  <description><![CDATA[ 





<section id="so-you-need-a-letter" class="level2">
<h2 class="anchored" data-anchor-id="so-you-need-a-letter">So You Need a Letter?</h2>
<p>I am often asked to write letters of recommendation for students. This is an important part of our jobs as professors, but I often find myself struggling to write the letter I think the student needs because my experience with them is either limited to a single course or otherwise negative.</p>
<p>Here are some guidelines to help ensure you get the best possible letter:</p>
<section id="before-you-ask" class="level3">
<h3 class="anchored" data-anchor-id="before-you-ask">Before You Ask</h3>
<ol type="1">
<li><p><strong>Consider your relationship with the professor</strong> - Have you taken multiple courses? Participated actively in class? Done well academically?</p></li>
<li><p><strong>Give plenty of notice</strong> - Ask at least 2-3 weeks in advance, preferably more for important applications.</p></li>
<li><p><strong>Think about fit</strong> - Is this professor familiar with the type of program/position you’re applying for?</p></li>
</ol>
</section>
<section id="when-you-ask" class="level3">
<h3 class="anchored" data-anchor-id="when-you-ask">When You Ask</h3>
<p><strong>Provide comprehensive information:</strong></p>
<ul>
<li>Your CV/resume</li>
<li>Personal statement or cover letter</li>
<li>Details about what you’re applying for</li>
<li>Specific deadline dates</li>
<li>Any forms that need to be completed</li>
</ul>
<p><strong>Be specific about your request:</strong> - What type of letter do you need? - What should be emphasized? - Are there particular experiences you’d like highlighted?</p>
</section>
<section id="follow-up-appropriately" class="level3">
<h3 class="anchored" data-anchor-id="follow-up-appropriately">Follow Up Appropriately</h3>
<ul>
<li>Send a polite reminder 1 week before the deadline</li>
<li>Provide any additional materials if requested</li>
<li>Update your recommender on outcomes when appropriate</li>
</ul>
</section>
<section id="making-the-most-of-your-request" class="level3">
<h3 class="anchored" data-anchor-id="making-the-most-of-your-request">Making the Most of Your Request</h3>
<p>Remember, a good letter of recommendation tells a story about you as a student, researcher, or future professional. Help your recommender tell that story by providing context and specific examples of your work together.</p>
<p>The best letters come from professors who know you well and can speak specifically to your abilities and potential. If our interaction has been limited, consider whether another faculty member might be able to write a stronger letter on your behalf.</p>
<p><a href="letter-wimpy.pdf" class="pdf-download"><i class="fa-solid fa-file-pdf" aria-label="file-pdf"></i> Download PDF</a></p>


</section>
</section>

<a onclick="window.scrollTo(0, 0); return false;" id="quarto-back-to-top"><i class="bi bi-arrow-up"></i> Back to top</a> ]]></description>
  <category>teaching</category>
  <category>advice</category>
  <guid>https://cwimpy.com/posts/2023-06-22-recommendation-letters/</guid>
  <pubDate>Thu, 22 Jun 2023 07:00:00 GMT</pubDate>
  <media:content url="https://cwimpy.com/posts/2023-06-22-recommendation-letters/letter.jpg" medium="image" type="image/jpeg"/>
</item>
<item>
  <title>New publication on spatial-x models</title>
  <dc:creator>Cameron Wimpy</dc:creator>
  <link>https://cwimpy.com/posts/2023-06-22-spatial-x-models/</link>
  <description><![CDATA[ 





<p><a href="featured.png" class="lightbox" data-gallery="quarto-lightbox-gallery-1"><img src="https://cwimpy.com/posts/2023-06-22-spatial-x-models/featured.png" class="img-fluid"></a></p>
<p>I’m excited to share that our article “X Marks the Spot: Discovering the Treasure of Spatial-X Models” has been published in <em>The Journal of Politics</em>.</p>
<section id="about-the-research" class="level2">
<h2 class="anchored" data-anchor-id="about-the-research">About the Research</h2>
<p>This work, conducted with Guy D. Whitten and Laron K. Williams, explores the spatial-X framework for analyzing spatial dependencies in political and social data.</p>
<section id="key-contributions" class="level3">
<h3 class="anchored" data-anchor-id="key-contributions">Key Contributions</h3>
<ul>
<li>Develops new methodological approaches for spatial modeling</li>
<li>Provides practical guidance for researchers working with spatial data</li>
<li>Demonstrates applications across multiple substantive areas</li>
</ul>
</section>
<section id="access-the-research" class="level3">
<h3 class="anchored" data-anchor-id="access-the-research">Access the Research</h3>
<ul>
<li><strong>Published Article</strong>: <a href="https://doi.org/10.1086/710089">The Journal of Politics</a></li>
<li><strong>Replication Materials</strong>: Available on our project repository</li>
<li><strong>Software</strong>: R packages and code for implementing spatial-X models</li>
</ul>
<p>This research builds on our ongoing work to make spatial analysis more accessible and useful for political scientists and other social researchers.</p>
</section>
<section id="related-work" class="level3">
<h3 class="anchored" data-anchor-id="related-work">Related Work</h3>
<p>This publication is part of a broader research program on spatial methods. See also our work on <a href="../2023-06-22-spatial-interpretation/">“Interpretation: The Final Spatial Frontier”</a> in <em>Political Science Research and Methods</em>.</p>
<p>For questions about the methodology or replication, feel free to reach out!</p>


</section>
</section>

<a onclick="window.scrollTo(0, 0); return false;" id="quarto-back-to-top"><i class="bi bi-arrow-up"></i> Back to top</a> ]]></description>
  <category>research</category>
  <category>publications</category>
  <guid>https://cwimpy.com/posts/2023-06-22-spatial-x-models/</guid>
  <pubDate>Thu, 22 Jun 2023 07:00:00 GMT</pubDate>
  <media:content url="https://cwimpy.com/posts/2023-06-22-spatial-x-models/featured.png" medium="image" type="image/png" height="90" width="144"/>
</item>
<item>
  <title>New publication on the interpretation of spatial models</title>
  <dc:creator>Cameron Wimpy</dc:creator>
  <link>https://cwimpy.com/posts/2021-03-06-spatial-interpretation/</link>
  <description><![CDATA[ 





<p>Along with <a href="https://pols.tamu.edu/about-us/faculty-directory/guy-d-whitten-professor/">Guy D. Whitten</a> and <a href="http://web.missouri.edu/~williamslaro/">Laron K. Williams</a>, I have a recently published article in <a href="https://www.cambridge.org/core/journals/political-science-research-and-methods"><em>Political Science Research and Methods</em></a>. Check it out <a href="https://doi.org/10.1017/psrm.2019.9">here</a>.</p>



<a onclick="window.scrollTo(0, 0); return false;" id="quarto-back-to-top"><i class="bi bi-arrow-up"></i> Back to top</a> ]]></description>
  <category>research</category>
  <category>spatial</category>
  <guid>https://cwimpy.com/posts/2021-03-06-spatial-interpretation/</guid>
  <pubDate>Sat, 06 Mar 2021 07:00:00 GMT</pubDate>
  <media:content url="https://cwimpy.com/posts/2021-03-06-spatial-interpretation/featured.png" medium="image" type="image/png" height="180" width="144"/>
</item>
<item>
  <title>Doing an Independent Study with Dr. Wimpy</title>
  <dc:creator>Cameron Wimpy</dc:creator>
  <link>https://cwimpy.com/posts/2023-06-22-independent-study/</link>
  <description><![CDATA[ 





<section id="so-you-need-an-independent-study" class="level2">
<h2 class="anchored" data-anchor-id="so-you-need-an-independent-study">So you need an independent study?</h2>
<p>I am often approached by students who want to complete an independent study with me. In most cases, they “want” to do this because they “need” a certain amount of credit for a given sub-field to graduate. In other cases it is a matter of convenience in scheduling or professor.</p>
<p>While I understand these issues, an independent study should be much more than just a way to fulfill degree requirements. Here’s what I look for and expect:</p>
<section id="what-makes-a-good-independent-study" class="level3">
<h3 class="anchored" data-anchor-id="what-makes-a-good-independent-study">What Makes a Good Independent Study</h3>
<p><strong>Clear Research Question</strong>: You should have a specific research question or topic you want to explore in depth. “I need comparative politics credits” is not a research question.</p>
<p><strong>Genuine Interest</strong>: I want to see that you’re genuinely curious about the topic, not just trying to check a box.</p>
<p><strong>Preparatory Work</strong>: You should have already done some background reading and have a sense of the existing literature.</p>
<p><strong>Realistic Scope</strong>: The project should be ambitious enough to be worthwhile but manageable given the time constraints.</p>
</section>
<section id="the-application-process" class="level3">
<h3 class="anchored" data-anchor-id="the-application-process">The Application Process</h3>
<p>When you approach me about an independent study, please include:</p>
<ol type="1">
<li><p><strong>A 1–2 page proposal</strong> outlining:</p>
<ul>
<li>Your research question</li>
<li>Why you’re interested in this topic</li>
<li>Preliminary literature you’ve identified</li>
<li>Your proposed methodology/approach</li>
<li>Expected deliverables</li>
</ul></li>
<li><p><strong>Your academic background</strong> relevant to the topic</p></li>
<li><p><strong>Your timeline</strong> and how this fits with your other commitments</p></li>
</ol>
</section>
<section id="what-to-expect" class="level3">
<h3 class="anchored" data-anchor-id="what-to-expect">What to Expect</h3>
<p><strong>Regular Meetings</strong>: We’ll meet bi-weekly to discuss progress, challenges, and next steps.</p>
<p><strong>Substantial Reading</strong>: Expect to engage with 15–20 academic sources minimum.</p>
<p><strong>Written Work</strong>: Usually a substantial research paper (20–30 pages) or equivalent project.</p>
<p><strong>Presentation</strong>: You may be asked to present your work to other students or faculty.</p>
</section>
<section id="when-i-say-no" class="level3">
<h3 class="anchored" data-anchor-id="when-i-say-no">When I Say No</h3>
<p>I may decline to supervise an independent study if:</p>
<ul>
<li><p>The proposal lacks focus or genuine engagement.</p></li>
<li><p>You haven’t demonstrated preparatory work.</p></li>
<li><p>The topic falls too far outside my expertise.</p></li>
<li><p>I don’t have the bandwidth to provide adequate supervision.</p></li>
</ul>
</section>
<section id="alternative-suggestions" class="level3">
<h3 class="anchored" data-anchor-id="alternative-suggestions">Alternative Suggestions</h3>
<p>If an independent study isn’t the right fit, consider:</p>
<ul>
<li><p><strong>Directed readings courses</strong> for exploring a literature</p></li>
<li><p><strong>Research assistant positions</strong> to gain hands-on experience</p></li>
<li><p><strong>Thesis work</strong> if you’re looking for a capstone experience</p></li>
<li><p><strong>Existing courses</strong> that might meet your needs</p></li>
</ul>
<p>Remember: an independent study should be an intellectually rewarding experience for both of us. If you’re just looking to fulfill requirements, there are likely better options available.</p>
<p><a href="independent-study-wimpy.pdf" class="pdf-download"><i class="fa-solid fa-file-pdf" aria-label="file-pdf"></i> Download PDF</a></p>


</section>
</section>

<a onclick="window.scrollTo(0, 0); return false;" id="quarto-back-to-top"><i class="bi bi-arrow-up"></i> Back to top</a> ]]></description>
  <category>teaching</category>
  <category>advice</category>
  <guid>https://cwimpy.com/posts/2023-06-22-independent-study/</guid>
  <pubDate>Wed, 18 Mar 2020 07:00:00 GMT</pubDate>
  <media:content url="https://cwimpy.com/posts/2023-06-22-independent-study/image.jpg" medium="image" type="image/jpeg"/>
</item>
<item>
  <title>Best practices for virtual meetings</title>
  <dc:creator>Cameron Wimpy</dc:creator>
  <link>https://cwimpy.com/posts/2020-03-17-virtual-meetings/</link>
  <description><![CDATA[ 





<section id="introduction" class="level1">
<h1>Introduction</h1>
<p>This post provides best practices for virtual meetings and seminars in the event that they are necessary during the pandemic. We often need to employ video conferencing for our seminars, one-on-one and group meetings, or for other unforeseen circumstances. This type of meeting is likely new to most of you, and the purpose of this document is to make them run as smoothly and professionally as possible. Keep in mind that almost all of the points below apply across video conferencing applications—whether it is <a href="https://www.bluejeans.com">BlueJeans</a>, <a href="https://www.gotomeeting.com">GoToMeeting</a>, <a href="https://www.webex.com">Webex</a>, <a href="https://zoom.us">Zoom</a>, etc. In general, some of the same points will apply to free services such as <a href="https://duo.google.com/about/">Google Duo</a>, <a href="https://apps.apple.com/us/app/facetime/id1110145091">Apple FaceTime</a>, <a href="https://www.skype.com/en/">Skype</a>, etc., but the options on those platforms are typically more limited. You can think of these types of applications as aimed at enterprise solutions versus ordinary consumer use. There is also a distinction between multipurpose collaboration applications such as <a href="https://teams.microsoft.com/start">Microsoft Teams</a> and <a href="https://slack.com">Slack</a>, which are chat and collaboration first, with video conferencing serving a secondary function.</p>
<p>It is now very common to experience virtual meetings in private industry, and increasingly first-round job interviews are being conducted remotely. We are also seeing an increased use in the university setting. This means that it is an important part of professional development to become competent in participating in remote meetings, regardless of whether it is for a course or another activity. You are best served to learn now how the process works given the large scale of importance of many meetings. For my classes and students, I will expect anyone to have read this post before requesting assistance.</p>
</section>
<section id="how-does-this-work" class="level1">
<h1>How does this work?</h1>
<p>In general, video conferencing applications allow remote users to connect with other users or to a centralized meeting location where others are meeting in-person. Most applications include video support via webcam (e.g., built-in, external, or industrial), computer, and/or phone-based audio. If you are in a meeting room and are not in charge of the meeting, then you can simply participate in person. If you are joining the meeting remotely, then you need to have your computer, phone, and meeting space all prepared.</p>
</section>
<section id="getting-started" class="level1">
<h1>Getting started</h1>
<p>Most meetings are initiated with a URL that takes you to an associated website with the aim of downloading a local copy of the software. If you click the link and give the software permission to run, then most of the time you are prepared. Once it launches, you will likely want to identify and select the “mute” and “video” buttons so you can have those options off until the meeting begins. If your connection is unstable or slow, then you can opt to join with your phone (this varies by application and meeting host) using a phone number with the associated meeting ID.</p>
<p>If the URL is supplied in advance, then you typically have the option of downloading a free copy of the software from the provider’s website (e.g., Zoom). The upside of this approach is that you can ensure that the software will run on your machine, and you can better familiarize yourself with the various options. In any case, once the meeting starts troubleshooting becomes much more costly, and downright embarrassing, depending on the situation.</p>
<p>This should be one of many opportunities in your career as a student (and beyond) for you to become better acquainted with how your computer works. For example, you should know exactly where the input/output audio/video settings are in your operating system. You should also know any keyboard shortcuts for volume controls, preferences, and anything else potentially related to operating quickly in the moment. Be familiar with how to respond to the versions of your operating system and any given application. This allows you to more easily troubleshoot issues as they arise.</p>
</section>
<section id="setting-up-your-meeting-space" class="level1">
<h1>Setting up your meeting space</h1>
<p>If you are joining the meeting remotely, you will still need your own meeting space. The best spaces are quiet rooms with good acoustics (when possible). You should avoid settings with personal items in the background, and always remember that others can see anything in your immediate area. It is also best to avoid loud places with other people talking or otherwise making any noise. This is disruptive to the entire meeting, and it almost always reflects poorly on the individual causing the disruption.</p>
</section>
<section id="during-the-meeting" class="level1">
<h1>During the meeting</h1>
<p>The following points are a list of best practices to follow while in or planning a virtual meeting:</p>
<ul>
<li><p><strong>Dress for the meeting as if it was in person.</strong> If you have a job interview, dress formally. If it is a class, dress as you would for the class. If you do not normally wear pajamas to class, it is best to stick to the norm.</p></li>
<li><p><strong>Position your camera so you are looking straight ahead.</strong> It appears unprofessional when people are looking down or up into the camera. If you are using a laptop I find that stacking books is an adequate solution.</p></li>
<li><p><strong>Look at the camera and not the screen when you are talking.</strong> In some cases this is accomplished very easily since the camera is attached to the screen. However, in large meeting rooms the camera(s) may be in a different location than the screen. You should understand the mechanics of the meeting before it begins so you can participate in a way that maximizes your contribution.</p></li>
<li><p><strong>If there are others within earshot of the meeting, wear headphones.</strong> This is common courtesy to those individuals not in your meeting, and it ensures that meeting discussions are kept discrete.</p></li>
<li><p><strong>Do not work on unrelated tasks during the meeting.</strong> This is rude and disruptive, and it is more obvious to spot than you might think. This includes staying off your phone if possible. If you are typing notes, then make sure to mute yourself and try to stay engaged as much as you can while you type.</p></li>
<li><p><strong>Treat the meeting the same as if it were in-person.</strong> This can be situational. For example, you would not leave a job interview to take a break without asking. You also would not yell or talk over others without some social consequence—these same rules apply to virtual meetings.</p></li>
<li><p><strong>Use the same meeting ID for recurring meetings.</strong> This allows individuals in recurring meetings to avoid the confusion of having to remember multiple meeting IDs. There are exceptions to this rule when privacy and/or security are concerned—use your own discretion. For most cases in the academic world, a recurring meeting is best and most convenient. Typically the application will allow you to set a meeting as recurring and will automatically generate a meeting ID.</p></li>
<li><p><strong>Mute yourself when you are not talking—especially in formal meetings.</strong> This allows for freedom when it comes to outside noise, and it also ensures you are not accidentally disrupting the sound for those who are talking.</p></li>
<li><p><strong>Always check your open application and browser tabs before screen sharing.</strong> Some of the potential issues here are obvious, and they range from the potential for seeming disorganized to the potential for losing out on a job (or, worse, being terminated from one). Most applications let you select exactly what you want to share. For example, if I am going to show some results from Stata or R, I select only those applications. The same goes for when showing a paper or slideshow (select the PDF application or browser).</p></li>
<li><p><strong>Apologize when you disrupt the meeting.</strong> If you cause a disruption, take responsibility, apologize, correct it, and move on.</p></li>
<li><p><strong>Use calendar invitations to invite others to your meeting.</strong> Professionalism counts, always. This also provides the added benefit of knowing that your meeting colleagues both had an e-mail and calendar setting from you (so no excuses if they are absent!)</p></li>
<li><p><strong>Do not talk over others.</strong> Just be nice. You can always be the kinder colleague and take it upon yourself to ensure that everyone is heard without interruption. If you talk over someone or interrupt, treat it as if you are there in person, kindly apologize, and give them the floor. Listening is almost always better than talking unless it is specifically your turn to talk/present.</p></li>
<li><p><strong>Use the chat function sparingly.</strong> This is another potential avenue for embarrassment as individuals will often intend to message one person, and instead message the entire group. Making a negative comment about a colleague or superior that everyone can see has any number of social and/or professional consequences. The best use of the chat function is to greet a new person in a large meeting and/or letting the organizer know you are working on some technical issue that you plan to resolve soon. You can also send files and links via some applications, but these will disappear when the meeting ends so you should ask if that is the best approach for sharing.</p></li>
<li><p><strong>Do not use an audio-only meeting when video is better or vice versa.</strong> Sometimes a quick phone call will suffice, but typically a more formal meeting with video is the best replacement for when it is difficult to meet in person. However, some meetings can be avoided entirely, and that is something I suggest keeping in the back of your mind.</p></li>
<li><p><strong>Do have an agenda (even if informal and in your own notes) if you are running the meeting.</strong> If it is a formal meeting and there are a myriad of issues to cover, send a formal agenda to the group in advance of the meeting.</p></li>
<li><p><strong>Do have Plan B for connecting to the meeting.</strong> If the meeting is really important, try to locate a backup device, whether it is another computer, phone or tablet. Otherwise, (at the very least) be prepared to call via phone and just participate via audio.</p></li>
</ul>
<p>Keep in mind that most of these points are situational—just use your best judgment and common sense.</p>
</section>
<section id="troubleshooting" class="level1">
<h1>Troubleshooting</h1>
<p>As is the case with all technology, there are occasional failures. Most issues fall into three categories: (1) connectivity, (2) hardware, and/or (3) software. If you think the issue is connectivity, then check another application that accesses the internet (e.g., Chrome, Firefox, Safari) to see if that is the problem. If it is, then check your Wi-Fi connection (or Ethernet as applicable) and make sure the network is broadcasting internet signal to your machine. If it is not, and you are unable to diagnose the problem, then notify the meeting organizer immediately. In many cases the best option is to join the meeting via your phone using the dial-in number and meeting ID.</p>
<p>If you have an internet connection and the application is slow to respond then I would suggest the following steps in successive steps (if one does not work move to the next):</p>
<ol type="1">
<li>Restart the application.</li>
<li>Restart your computer.</li>
<li>Delete and re-install the latest version of the application.</li>
<li>Visit the associated troubleshooting page for the developer and try to diagnose your specific problem.</li>
</ol>
<p>Hardware issues typically cannot be resolved in time for the meeting. This is why it is a good idea to test things out beforehand. You should also have a Plan B in place.</p>
<section id="audio-issues" class="level2">
<h2 class="anchored" data-anchor-id="audio-issues">Audio issues</h2>
<p>As mentioned above, if you have connectivity issues, you can revert to using your phone for joining the meeting. The same rule applies if you have audio trouble. You can also use your phone in conjunction with the video on your computer, but you should never use the audio from two devices in the same room. This creates a feedback echo that can ruin a meeting and immediately identify you as technology illiterate, which for some situations can be quite embarrassing. However, everyone will occasionally have issues from time to time, and when it does happen simply apologize, correct the issue, and move on.</p>
<p>The most common audio issue is that a user is on “mute” and they simply do not realize it. Check that first. If you are not on “mute,” then check your audio input (or microphone) settings for your computer. Keep in mind that these can exist both within the application and your operating system. If you have alternative input options (e.g., headphones, built-in microphone) you can also try toggling those to see if one works when the other does not.</p>
</section>
<section id="video" class="level2">
<h2 class="anchored" data-anchor-id="video">Video</h2>
<p>As with audio, video problems often begin with the video option off. If you are sure that you do, then the next step is to check the video settings in both the application and the operating system. If the webcam has an “on” indicator light and is not illuminated, then you likely have a settings or driver problem. If the webcam connects externally, make sure it works elsewhere and the appropriate software is installed as needed. You can try your webcam with another application to see if it works at all. If it does not, then you likely have a hardware issue that will need to be addressed at a later time.</p>
<p>It is crucial to remember that the potential for embarrassment with video is something that you should never forget. This can make or break your presentation, interview, career (at least your current step on the ladder), and even reputation. Always be mindful of your appearance, your verbal and nonverbal reactions to others, and anything else in your environment.</p>
</section>
</section>
<section id="final-remarks" class="level1">
<h1>Final remarks</h1>
<p>Virtual meetings are increasingly becoming part of working in a professional environment. The sooner that you become proficient in them, the better your career and professional life will be. No one is going to be amazed when you are able to make things work and participate, but if you are unable to properly join the meeting then it will almost certainly diminish your ability to make an impact—whether that means getting a job or participating in class.</p>
<p><a href="virtual-meetings-wimpy.pdf" class="pdf-download"><i class="fa-solid fa-file-pdf" aria-label="file-pdf"></i> Download PDF</a></p>


</section>

<a onclick="window.scrollTo(0, 0); return false;" id="quarto-back-to-top"><i class="bi bi-arrow-up"></i> Back to top</a> ]]></description>
  <category>teaching</category>
  <category>advice</category>
  <guid>https://cwimpy.com/posts/2020-03-17-virtual-meetings/</guid>
  <pubDate>Tue, 17 Mar 2020 07:00:00 GMT</pubDate>
  <media:content url="https://cwimpy.com/posts/2020-03-17-virtual-meetings/image.jpeg" medium="image" type="image/jpeg"/>
</item>
</channel>
</rss>
