Check BibTeX entries for completeness, DOI resolution, and broken links. Verify required fields per entry type (article, book, inproceedings), resolve and validate DOIs via the CrossRef API, check URL accessibility, and flag duplicate entries, missing abstracts, and inconsistent formatting. Use when preparing a manuscript bibliography for journal submission, auditing a shared .bib file before a project milestone, after merging bibliographies from multiple sources, when citations render incorrectly, or as a CI check on version-controlled .bib files.
Check BibTeX entries for completeness, DOI resolution, and broken links. Verify required fields per entry type (article, book, inproceedings), resolve and validate DOIs via the CrossRef API, check URL accessibility, and flag duplicate entries, missing abstracts, and inconsistent formatting. Use when preparing a manuscript bibliography for journal submission, auditing a shared .bib file before a project milestone, after merging bibliographies from multiple sources, when citations render incorrectly, or as a CI check on version-controlled .bib files.
Check BibTeX bibliography entries for completeness, accuracy, and consistency.
This skill covers verifying required fields per entry type, resolving DOIs via
the CrossRef API, checking URL accessibility, detecting duplicate entries, and
producing a structured validation report that flags issues by severity. It
ensures that .bib files are publication-ready before rendering.
When to Use
Preparing a manuscript bibliography for journal submission
Auditing a shared .bib file for quality before a project milestone
After merging bibliographies from multiple sources
When citations render incorrectly and you need to diagnose .bib issues
As a CI check on .bib files in version-controlled projects
Got: A list of issues where required fields are missing. Zero issues for a
well-maintained bibliography.
If fail: This step runs locally and should not fail. If it does, check that the
.bib file parsed correctly in Step 2.
Step 4: Resolve and Validate DOIs
validate_dois <-function(bib, email =NULL){
issues <-list()# Set polite API headers
headers <-list(`User-Agent` ="R-bibliography-validator/1.0")if(!is.null(email)){
headers[["mailto"]]<- email
}for(i inseq_along(bib)){
key <-names(bib)[i]
doi <- bib[[i]]$doi
if(is.null(doi)||!nzchar(doi)){
issues[[length(issues)+1]]<-list(
key = key, severity ="info",
message ="No DOI present")next}# Normalize DOI
doi <- gsub("^https?://doi\\.org/","", doi)
doi <- gsub("^doi:","", doi, ignore.case =TRUE)
doi <- trimws(doi)# Resolve via CrossRef
tryCatch({
resp <- httr2::request(sprintf("https://api.crossref.org/works/%s", doi))|>
httr2::req_headers(!!!headers)|>
httr2::req_timeout(10)|>
httr2::req_perform()if(httr2::resp_status(resp)!=200){
issues[[length(issues)+1]]<-list(
key = key, severity ="error",
message = sprintf("DOI does not resolve: %s (HTTP %d)", doi,
httr2::resp_status(resp)))}}, error =function(e){
issues[[length(issues)+1]]<<-list(
key = key, severity ="warning",
message = sprintf("DOI check failed for %s: %s", doi, e$message))})
Sys.sleep(0.5)# Rate limiting}
issues
}# Only run online checks if requested
doi_issues <- validate_dois(bib, email ="your.email@example.com")
message(sprintf("DOI validation: %d issues found",length(doi_issues)))
Got: Each DOI resolves successfully (HTTP 200 from CrossRef). Entries without
DOIs are flagged as informational.
If fail: Network errors or rate limiting produce warnings rather than hard
failures. Set the email parameter for higher rate limits from CrossRef's polite pool.