How to create a publication listing with Quarto

  • article
  • bibliography
  • quarto
  • Q&A
The following instructions will guide the reader through the process of creating a publication listing in Quarto.
Author
Published

Introduction

As an academic researcher or scientist, it is important to have an online presence. With the advent of the internet, having a personal website has become more crucial than ever. A personal website serves as a platform to showcase research one’s work and achievements to a global audience. It is possible to use academic social networks and scholarly literature databases, such as  Orcid,  Clarivate (web-of-science),  Google Scholar,  Scopus,  Academia,  ResearchGate… However, it may be preferable to share one’s contributions on one’s own website.

The creation of my website was based on Quarto (see also the history page). Should you not yet possess a Quarto website, you can find easily numerous blogs that provide instructions on how to create a blog or personal website with Quarto. Regardless of whether you are an experienced researcher or a novice, this guide is designed to provide some guidance to those interested in learning how to construct a publication page like mine.

Setting up your publication list with Quarto listing

To generate my publication page, I utilize the Quarto listing functionality. Following Quarto listing, you first have to define what documents are included in your publication listing by using the contents option. Hence, metadata in the front matter of the page listing you would write:

title: "My publications listing"
listing:
  - id: articles-list
    contents: articles/20*.qmd
    template: publications.ejs
    [...]
  - id: conferences-list
    contents: conferences/20*.qmd
    template: publications.ejs
Note

I have chosen to organize my publications by category, i.e articles, conferences, communications, theses… Some may prefer to classify their publications by year. It’s up to you.

In the corresponding folder, create a citeable Quarto document. Even if a classic Quarto HTML document can be used, the use of a citeable Quarto document facilitates the citation of one’s work by others.
This method implies to create a citeable Quarto document for each publication one’s want to share and to be appeared in the publication listing. A young researcher with a limited number of publications may find this publication listing method to be relatively straightforward. However, for a senior researcher with a substantial number of publications, this method may appear somewhat cumbersome. In such cases, the publication list can be narrowed to a select number of publications.

Create/Use a template

Quarto listing use EJS template to create custom listing. A simple template for outputting a list of publication might look like:

publications.ejs
<ol class="list publication-list" reversed>
<% for (const item of items) { %>
  <li <%=metadataAttrs(item) %>>
    <div class="publication-info">
      <span class="listing-date">(<%= item.date %>)</span>
      <span class="listing-author"><%= item.author %></span>.
      <a href="<%- item.path %>">
        <span class="listing-title"><%= item.title %></span>
        <% if (item.subtitle) { %>: <span class="listing-subtitle subtitle"><%= item.subtitle %></span><% } %>
      </a>.
      <% if (item["container-title-short"]) { %>
        <span class="listing-publication fst-italic"><%= item["container-title-short"] %></span>.
      <% } else if (item.citation["container-title-short"]) { %>
        <span class="listing-publication fst-italic"><%= item.citation["container-title-short"] %></span>.
      <% } else if (item["container-title"]) { %>
        <span class="listing-publication fst-italic"><%= item["container-title"] %></span>.
      <% } else if (item.citation["container-title"]) { %>
        <span class="listing-publication fst-italic"><%= item.citation["container-title"] %></span>.
      <% } %>
    </div>
  </li>
<% } %>
</ol>

This basic publication template requires the presence of date, author and title (with eventually a subtitle) is the metadata front matter of each citeable Quarto document.

Creating Content

Example 1 Below an example of metadata front matter of one of my publication.

type: journal
date: 2022-11
title: "Modeling and Estimation of Self-Phoretic Magnetic Janus Microrobot With Uncontrollable Inputs"
description: | 
  This paper theoretically investigates the modeling of  spherical catalytic 
  self-phoretic magnetic Janus microrobot (MJR) evolving in uniform viscous flow.
author:
  - name: David Folio
    orcid: 0000-0001-9430-6091
    url: https://dfolio.fr
    image: "https://dfolio.fr/images/david-folio.webp"
    attributes:
      corresponding: true
      equal-contributor: true
    affiliations:
      - ref: PRISME
  - name: Antoine Ferreira
    url: https://www.researchgate.net/profile/Antoine-Ferreira
    affiliations:
      - ref: PRISME
    attributes:
      equal-contributor: true
citation:
  url: https://ieeexplore.ieee.org/document/9678101
  citation-key: 2022folioTCST
  type: article-journal
  publisher: "IEEE"
  container-title: "IEEE Transactions on Control Systems Technology"
  container-title-short: "IEEE Trans. Cont. Syst. Technol."
  issn: 1558-0865
  number: 6
  page: 2681-2688
  volume: 30
  keyword: Dual Kalman filtering, estimation, Janus particle, Kalman filters, magnetic microrobot, mathematical
    models, modeling, propulsion, state-space representation
  abstract: |      
    The abstract go there

Depending on the CSS style, the output will be like

  1. (2022) David Folio, Antoine Ferreira: Modeling and Estimation of Self-Phoretic Magnetic Janus Microrobot With Uncontrollable Inputs. IEEE Trans. Cont. Syst. Technol..

Finally, the citeable Quarto document body can include any information about the article. The basic content is to include the abstract, authors affiliation, acknowledgment, funding… If any of this information is included in metadata front end, its rendering can be automated using a proper template or partial. In my case, I have modified the title-block.html partial, such that it displays, by default, only the title on each page of my website, and includes the metadata only on selected page where title-block-meta metadata is true:

title-block.html
<header id="title-block-header">
<div class="quarto-title-banner">
  <h1 class="title" itemprop="headline">$title$</h1>
  $if(subtitle)$<p class="subtitle lead">$subtitle$</p>$endif$
</div>
$if(title-block-meta)$
$title-metadata.html()$
$endif$
</header>

The title-block-metadata.html partial have then to handle the said metadata:

title-block.html
$if(by-affiliation/first)$
<div class="quarto-title-meta-author by-affiliation">
  <div class="quarto-title-meta-heading">$labels.authors$</div>
  <div class="quarto-title-meta-heading">$labels.affiliations$</div>
  $for(by-author)$
  <div class="quarto-title-meta-contents">
    <p class="author$if(by-author.attributes.supervised)$ supervised$endif$">
    $title-metadata-author.html()$
    </p>
  </div>
  $if(by-author.affiliations)$
  <div class="quarto-title-meta-contents">
    $for(by-author.affiliations)$
    <p class="affiliation">
      $if(it.url)$<a href="$it.url$" class="url" rel="noopener noreferrer">$endif$$it.name$$if(it.url)$</a>$endif$
    </p>
    $endfor$
  </div>
  $endif$
  $endfor$
</div>
$endif$

$if(by-affiliation)$
$elseif(by-author)$
<div class="quarto-title-meta by-author">
  <div>
    <div class="quarto-title-meta-heading">$labels.authors$</div>
    <div class="quarto-title-meta-contents">
      $for(by-author)$<p class="author$if(by-author.attributes.supervised)$ supervised$endif$">
      $title-metadata-author.html()$
      </p>$endfor$
    </div>
  </div>
</div>
$endif$

$if(abstract)$
<div>
  <div class="abstract">
    <div class="abstract-title">$labels.abstract$</div>
    $abstract$
  </div>
  $if(keywords)$<div class="keywords"><span class="keywords-title">Keywords:</span> $for(keyword)$$keyword$$sep$, $endfor$</div>$endif$
</div>
$endif$
Tip

Quarto allows to define the metadata at different level: _quarto.yml, _metadata.yml, and document-level YAML options which are merged together. Hence, for documents that share the same metadata, put them in dir/_metadata.yml.

Note

It is my hope that this simple tutorial will prove useful in the creation of your own publication list. Should this be the case, I would be grateful if you would share your feedback in the comments section below.

Additionally, the above EJS template is a simplified version of the one used on my website. If you would like to have supplementary tips, ask below.