Publications
All articles should be accessible here directly as a download (in the spirit of decentralized and distributed archiving of scientific output) or as open access articles via my Google Scholar profile. Please get in touch if this does not work.
journal_data = FileAttachment("publications/journal_articles.json").json()
preprints_data = FileAttachment("publications/preprints.json").json()
chapters_data = FileAttachment("publications/book_chapters.json").json()
reports_data = FileAttachment("publications/reports.json").json()
datasets_data = FileAttachment("publications/datasets.json").json()
// Combine all publications for counting
allPublications = [
...journal_data.map(p => ({...p, pubType: 'journal'})),
...preprints_data.map(p => ({...p, pubType: 'preprint'})),
...chapters_data.map(p => ({...p, pubType: 'chapter'})),
...reports_data.map(p => ({...p, pubType: 'report'})),
...datasets_data.map(p => ({...p, pubType: 'dataset'}))
]
// Filter function
filterPublications = (pubs, query) => {
if (!query || query.trim() === '') return pubs;
const q = query.toLowerCase().trim();
return pubs.filter(pub => {
const title = (pub.title || '').toLowerCase();
const abstract = (pub.abstract || '').toLowerCase();
return title.includes(q) || abstract.includes(q);
});
}
// Reusable function to render a publication
renderPublication = (pub, index, type) => {
const title = pub.title;
const authors = pub.authors;
const year = pub.year;
// Build main detail line with emoji and specific venue fields
let venueInfo = '';
let emoji = '';
if (pub.journal) {
emoji = '📄';
venueInfo = pub.journal;
} else if (pub.conference) {
emoji = '🏛️';
venueInfo = pub.conference;
} else if (pub.book_title) {
emoji = '📚';
venueInfo = pub.book_title;
} else if (pub.preprint_server) {
emoji = '📝';
venueInfo = pub.preprint_server;
} else if (pub.repository) {
emoji = '💾';
venueInfo = pub.repository;
}
let mainDetail = venueInfo;
let details = [];
if (pub.volume) details.push(`Vol. ${pub.volume}`);
if (pub.issue) details.push(pub.volume ? `(${pub.issue})` : `Issue ${pub.issue}`);
if (pub.pages) details.push(`pp. ${pub.pages}`);
if (pub.article) details.push(`Art. ${pub.article}`);
if (pub.date) details.push(pub.date);
if (pub.editors) details.push(`Ed. by ${pub.editors}`);
if (pub.edition) details.push(pub.edition);
if (pub.publisher && !mainDetail.includes(pub.publisher)) details.push(pub.publisher);
if (details.length > 0) {
mainDetail += ` - ${details.join(', ')}`;
}
// Build links
let links = "";
if (pub.pdf) {
const linkText = type === 'dataset' ? '⬇️ Download' : '⬇️ Download paper';
links += `<a href="${pub.pdf}" class="download-link">${linkText}</a>`;
}
if (pub.doi) {
const doi_url = pub.doi.startsWith('http') ? pub.doi : `https://doi.org/${pub.doi}`;
links += `<a href="${doi_url}" class="doi-link" target="_blank"><img src="assets/icons/doi_logo.svg" class="doi-icon" alt="DOI">${doi_url}</a>`;
}
if (pub.replication_data) {
const replicationIcon = pub.zenodo
? `<img src="assets/icons/zenodo_logo.svg" class="zenodo-icon" alt="Zenodo">`
: `📊`;
links += `<a href="${pub.replication_data}" class="repo-link" target="_blank">${replicationIcon} Replication Materials: ${pub.replication_data}</a>`;
}
if (pub.url) {
links += `<a href="${pub.url}" target="_blank">🔗 Link</a>`;
}
// Build abstract section
const abstractId = `abstract-${type}-${index}`;
let abstractSection = "";
if (pub.abstract) {
abstractSection = `
<button class="abstract-toggle" onclick="toggleAbstract('${abstractId}')">Show Abstract</button>
<div id="${abstractId}" class="abstract-content">
${pub.abstract}
</div>
`;
}
return `
<div class="publication-item">
<div class="publication-title">${title}</div>
<div class="publication-authors">${authors} (${year})</div>
<div class="publication-venue">${emoji ? `<span class="venue-emoji">${emoji}</span> ` : ''}<span class="venue-text">${mainDetail}</span></div>
${links ? `<div class="publication-links">${links}</div>` : ''}
${abstractSection}
</div>
`;
}// Toggle abstract function
window.toggleAbstract = function(id) {
const element = document.getElementById(id);
const button = element.previousElementSibling;
if (element.classList.contains('show')) {
element.classList.remove('show');
button.textContent = 'Show Abstract';
} else {
element.classList.add('show');
button.textContent = 'Hide Abstract';
}
}filteredJournalData = filterPublications(journal_data, searchQuery).sort((a, b) => b.year - a.year)
filteredPreprints = filterPublications(preprints_data, searchQuery).sort((a, b) => b.year - a.year)
filteredChapters = filterPublications(chapters_data, searchQuery).sort((a, b) => b.year - a.year)
filteredReports = filterPublications(reports_data, searchQuery).sort((a, b) => b.year - a.year)
filteredDatasets = filterPublications(datasets_data, searchQuery).sort((a, b) => b.year - a.year)
// Calculate totals
totalFiltered = filteredJournalData.length + filteredPreprints.length +
filteredChapters.length + filteredReports.length + filteredDatasets.lengthhtml`${searchQuery && searchQuery.trim() !== '' ? `
<div class="search-results-summary">
<div>Showing ${totalFiltered} of ${allPublications.length} publications</div>
<div class="search-results-breakdown">${
(() => {
const breakdown = [];
if (filteredJournalData.length > 0) breakdown.push(`${filteredJournalData.length} journal article${filteredJournalData.length !== 1 ? 's' : ''}`);
if (filteredPreprints.length > 0) breakdown.push(`${filteredPreprints.length} preprint${filteredPreprints.length !== 1 ? 's' : ''}`);
if (filteredChapters.length > 0) breakdown.push(`${filteredChapters.length} book chapter${filteredChapters.length !== 1 ? 's' : ''}`);
if (filteredReports.length > 0) breakdown.push(`${filteredReports.length} report${filteredReports.length !== 1 ? 's' : ''}`);
if (filteredDatasets.length > 0) breakdown.push(`${filteredDatasets.length} dataset${filteredDatasets.length !== 1 ? 's' : ''}`);
return breakdown.length > 0 ? breakdown.join(', ') : 'No results';
})()
}</div>
</div>
` : ''}`Journal articles (peer-reviewed)
Preprints (not peer reviewed yet)
Book chapters
Reports
Datasets
More
If you speak German, you might also want to check out this small piece on sustainable digitalization, a 3 minute intro video to sustainable digitalization, a short talk on digitalization and climate measures in companies here or even this Podcast Interview with me on “Digitalisierung: Ökokiller oder Hoffnungsträger?”.