Skill Tracer
Skills › Scientific Agent Skills › citation-management › metadata_extraction.md

metadata_extraction.md

893 lines · skills/citation-management/references/metadata_extraction.md at 5f2bc03

Open on GitHub

Most marks come from matching words in the file, so treat them as pointers.

1# Metadata Extraction Guide
2
3Comprehensive guide to extracting accurate citation metadata from DOIs, PMIDs, arXiv IDs, and URLs using various APIs and services.
4

Metadata Extraction Guide

Comprehensive guide to extracting accurate citation metadata from DOIs, PMIDs, arXiv IDs, and URLs using various APIs and services.

Raw lines 1 to 4
5## Overview
6
7Accurate metadata is essential for proper citations. This guide covers:
8- Identifying paper identifiers (DOI, PMID, arXiv ID)
9- Querying metadata APIs (CrossRef, PubMed, arXiv, DataCite)
10- Required BibTeX fields by entry type
11- Handling edge cases and special situations
12- Validating extracted metadata

Overview

Accurate metadata is essential for proper citations. This guide covers:

  • Identifying paper identifiers (DOI, PMID, arXiv ID)
  • Querying metadata APIs (CrossRef, PubMed, arXiv, DataCite)
  • Required BibTeX fields by entry type
  • Handling edge cases and special situations
  • Validating extracted metadata
Raw lines 5 to 13
14## Paper Identifiers

Paper Identifiers

Raw lines 14 to 15
16### DOI (Digital Object Identifier)
18**Format**: `10.XXXX/suffix`
20**Examples**:
21```
2210.1038/s41586-021-03819-2 # Nature article
2310.1126/science.aam9317 # Science article
2410.1016/j.cell.2023.01.001 # Cell article
2510.1371/journal.pone.0123456 # PLOS ONE article
26```
28**Properties**:
29- Permanent identifier
30- Most reliable for metadata
31- Resolves to current location
32- Publisher-assigned
34**Where to find**:
35- First page of article
36- Article webpage
37- CrossRef, Google Scholar, PubMed
38- Usually prominent on publisher site

DOI (Digital Object Identifier)

Format: 10.XXXX/suffix

Examples:

10.1038/s41586-021-03819-2    # Nature article
10.1126/science.aam9317       # Science article
10.1016/j.cell.2023.01.001    # Cell article
10.1371/journal.pone.0123456  # PLOS ONE article

Properties:

  • Permanent identifier
  • Most reliable for metadata
  • Resolves to current location
  • Publisher-assigned

Where to find:

  • First page of article
  • Article webpage
  • CrossRef, Google Scholar, PubMed
  • Usually prominent on publisher site
Raw lines 16 to 39
40### PMID (PubMed ID)
42**Format**: 8-digit number (typically)
44**Examples**:
45```
4634265844
4728445112
4835476778
49```
51**Properties**:
52- Specific to PubMed database
53- Biomedical literature only
54- Assigned by NCBI
55- Permanent identifier
57**Where to find**:
58- PubMed search results
59- Article page on PubMed
60- Often in article PDF footer
61- PMC (PubMed Central) pages

PMID (PubMed ID)

Format: 8-digit number (typically)

Examples:

34265844
28445112
35476778

Properties:

  • Specific to PubMed database
  • Biomedical literature only
  • Assigned by NCBI
  • Permanent identifier

Where to find:

  • PubMed search results
  • Article page on PubMed
  • Often in article PDF footer
  • PMC (PubMed Central) pages
Raw lines 40 to 62
63### PMCID (PubMed Central ID)
65**Format**: PMC followed by numbers
67**Examples**:
68```
69PMC8287551
70PMC7456789
71```
73**Properties**:
74- Free full-text articles in PMC
75- Subset of PubMed articles
76- Open access or author manuscripts

PMCID (PubMed Central ID)

Format: PMC followed by numbers

Examples:

PMC8287551
PMC7456789

Properties:

  • Free full-text articles in PMC
  • Subset of PubMed articles
  • Open access or author manuscripts
Raw lines 63 to 77
78### arXiv ID
80**Format**: YYMM.NNNNN or archive/YYMMNNN
82**Examples**:
83```
842103.14030 # New format (since 2007)
852401.12345 # 2024 submission
86arXiv:hep-th/9901001 # Old format
87```
89**Properties**:
90- Preprints (not peer-reviewed)
91- Physics, math, CS, q-bio, etc.
92- Version tracking (v1, v2, etc.)
93- Free, open access
95**Where to find**:
96- arXiv.org
97- Often cited before publication
98- Paper PDF header

arXiv ID

Format: YYMM.NNNNN or archive/YYMMNNN

Examples:

2103.14030        # New format (since 2007)
2401.12345        # 2024 submission
arXiv:hep-th/9901001  # Old format

Properties:

  • Preprints (not peer-reviewed)
  • Physics, math, CS, q-bio, etc.
  • Version tracking (v1, v2, etc.)
  • Free, open access

Where to find:

  • arXiv.org
  • Often cited before publication
  • Paper PDF header
Raw lines 78 to 99
100### Other Identifiers
102**ISBN** (Books):
103```
104978-0-12-345678-9
1050-123-45678-9
106```
108**arXiv category**:
109```
110cs.LG # Computer Science - Machine Learning
111q-bio.QM # Quantitative Biology - Quantitative Methods
112math.ST # Mathematics - Statistics
113```

Other Identifiers

ISBN (Books):

978-0-12-345678-9
0-123-45678-9

arXiv category:

cs.LG    # Computer Science - Machine Learning
q-bio.QM # Quantitative Biology - Quantitative Methods
math.ST  # Mathematics - Statistics
Raw lines 100 to 114
115## Metadata APIs
117### CrossRef API
119**Primary source for DOIs** - Most comprehensive metadata for journal articles.
121**Base URL**: `https://api.crossref.org/works/`
123**No API key required**. Identify your application with `User-Agent`; add your
124own contact email as `mailto` for the polite pool. Single-record requests are
125limited to 5/s public or 10/s polite; list queries to 1/s or 3/s respectively.
126Read response rate/concurrency headers and back off on 429. See the current
127[Crossref limits](https://community.crossref.org/t/refining-rest-api-limits-for-improved-stability-and-reliability/16137).
129#### Basic DOI Lookup
131**Request**:
132```
133GET https://api.crossref.org/works/10.1038/s41586-021-03819-2
134```
136**Response** (simplified):
137```json
139 "message": {
140 "DOI": "10.1038/s41586-021-03819-2",
141 "title": ["Article title here"],
142 "author": [
143 {"given": "John", "family": "Smith"},
144 {"given": "Jane", "family": "Doe"}
145 ],
146 "container-title": ["Nature"],
147 "volume": "595",
148 "issue": "7865",
149 "page": "123-128",
150 "published-print": {"date-parts": [[2021, 7, 1]]},
151 "publisher": "Springer Nature",
152 "type": "journal-article",
153 "ISSN": ["0028-0836"]
154 }
156```
158#### Fields Available
160**Identity/type fields**:
161- `DOI`: Digital Object Identifier
162- `title`: Article title (array; may be absent or empty)
163- `type`: Content type (journal-article, book-chapter, etc.)
165**Usually present**:
166- `author`: Array of author objects
167- `container-title`: Journal/book title
168- `published-print`, `published-online`, `published`, or `issued`: Publication date (do not substitute registration/deposit dates)
169- `volume`, `issue`, `page`: Publication details
170- `publisher`: Publisher name
172**Sometimes present**:
173- `abstract`: Article abstract
174- `subject`: Subject categories
175- `ISSN`: Journal ISSN
176- `ISBN`: Book ISBN
177- `reference`: Reference list
178- `is-referenced-by-count`: Citation count
180#### Content Types
182CrossRef `type` field values:
183- `journal-article`: Journal articles
184- `book-chapter`: Book chapters
185- `book`: Books
186- `proceedings-article`: Conference papers
187- `posted-content`: Preprints
188- `dataset`: Research datasets
189- `report`: Technical reports
190- `dissertation`: Theses/dissertations

CrossRef API

Primary source for DOIs - Most comprehensive metadata for journal articles.

Base URL: https://api.crossref.org/works/

No API key required. Identify your application with User-Agent; add your own contact email as mailto for the polite pool. Single-record requests are limited to 5/s public or 10/s polite; list queries to 1/s or 3/s respectively. Read response rate/concurrency headers and back off on 429. See the current Crossref limits.

Basic DOI Lookup

Request:

GET https://api.crossref.org/works/10.1038/s41586-021-03819-2

Response (simplified):

{
  "message": {
    "DOI": "10.1038/s41586-021-03819-2",
    "title": ["Article title here"],
    "author": [
      {"given": "John", "family": "Smith"},
      {"given": "Jane", "family": "Doe"}
    ],
    "container-title": ["Nature"],
    "volume": "595",
    "issue": "7865",
    "page": "123-128",
    "published-print": {"date-parts": [[2021, 7, 1]]},
    "publisher": "Springer Nature",
    "type": "journal-article",
    "ISSN": ["0028-0836"]
  }
}

Fields Available

Identity/type fields:

  • DOI: Digital Object Identifier
  • title: Article title (array; may be absent or empty)
  • type: Content type (journal-article, book-chapter, etc.)

Usually present:

  • author: Array of author objects
  • container-title: Journal/book title
  • published-print, published-online, published, or issued: Publication date (do not substitute registration/deposit dates)
  • volume, issue, page: Publication details
  • publisher: Publisher name

Sometimes present:

  • abstract: Article abstract
  • subject: Subject categories
  • ISSN: Journal ISSN
  • ISBN: Book ISBN
  • reference: Reference list
  • is-referenced-by-count: Citation count

Content Types

CrossRef type field values:

  • journal-article: Journal articles
  • book-chapter: Book chapters
  • book: Books
  • proceedings-article: Conference papers
  • posted-content: Preprints
  • dataset: Research datasets
  • report: Technical reports
  • dissertation: Theses/dissertations
Raw lines 117 to 191
192### PubMed E-utilities API
194**Specialized for biomedical literature** - Curated metadata with MeSH terms.
196**Base URL**: `https://eutils.ncbi.nlm.nih.gov/entrez/eutils/`
198**API key recommended** (free):
199- Higher rate limits
200- Better performance
202#### PMID to Metadata
204**Step 1: EFetch for full record**
206```
207GET https://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?
208 db=pubmed&
209 id=34265844&
210 retmode=xml&
211 api_key=YOUR_KEY
212```
214**Response**: XML with comprehensive metadata
216**Step 2: Parse XML**
218Key fields:
219```xml
220<PubmedArticle>
221 <MedlineCitation>
222 <PMID>34265844</PMID>
223 <Article>
224 <ArticleTitle>Title here</ArticleTitle>
225 <AuthorList>
226 <Author><LastName>Smith</LastName><ForeName>John</ForeName></Author>
227 </AuthorList>
228 <Journal>
229 <Title>Nature</Title>
230 <JournalIssue>
231 <Volume>595</Volume>
232 <Issue>7865</Issue>
233 <PubDate><Year>2021</Year></PubDate>
234 </JournalIssue>
235 </Journal>
236 <Pagination><MedlinePgn>123-128</MedlinePgn></Pagination>
237 <Abstract><AbstractText>Abstract text here</AbstractText></Abstract>
238 </Article>
239 </MedlineCitation>
240 <PubmedData>
241 <ArticleIdList>
242 <ArticleId IdType="doi">10.1038/s41586-021-03819-2</ArticleId>
243 <ArticleId IdType="pmc">PMC8287551</ArticleId>
244 </ArticleIdList>
245 </PubmedData>
246</PubmedArticle>
247```
249#### Unique PubMed Fields
251**MeSH Terms**: Controlled vocabulary
252```xml
253<MeshHeadingList>
254 <MeshHeading>
255 <DescriptorName UI="D003920">Diabetes Mellitus</DescriptorName>
256 </MeshHeading>
257</MeshHeadingList>
258```
260**Publication Types**:
261```xml
262<PublicationTypeList>
263 <PublicationType UI="D016428">Journal Article</PublicationType>
264 <PublicationType UI="D016449">Randomized Controlled Trial</PublicationType>
265</PublicationTypeList>
266```
268**Grant Information**:
269```xml
270<GrantList>
271 <Grant>
272 <GrantID>R01-123456</GrantID>
273 <Agency>NIAID NIH HHS</Agency>
274 <Country>United States</Country>
275 </Grant>
276</GrantList>
277```

PubMed E-utilities API

Specialized for biomedical literature - Curated metadata with MeSH terms.

Base URL: https://eutils.ncbi.nlm.nih.gov/entrez/eutils/

API key recommended (free):

  • Higher rate limits
  • Better performance

PMID to Metadata

Step 1: EFetch for full record

GET https://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?
  db=pubmed&
  id=34265844&
  retmode=xml&
  api_key=YOUR_KEY

Response: XML with comprehensive metadata

Step 2: Parse XML

Key fields:

<PubmedArticle>
  <MedlineCitation>
    <PMID>34265844</PMID>
    <Article>
      <ArticleTitle>Title here</ArticleTitle>
      <AuthorList>
        <Author><LastName>Smith</LastName><ForeName>John</ForeName></Author>
      </AuthorList>
      <Journal>
        <Title>Nature</Title>
        <JournalIssue>
          <Volume>595</Volume>
          <Issue>7865</Issue>
          <PubDate><Year>2021</Year></PubDate>
        </JournalIssue>
      </Journal>
      <Pagination><MedlinePgn>123-128</MedlinePgn></Pagination>
      <Abstract><AbstractText>Abstract text here</AbstractText></Abstract>
    </Article>
  </MedlineCitation>
  <PubmedData>
    <ArticleIdList>
      <ArticleId IdType="doi">10.1038/s41586-021-03819-2</ArticleId>
      <ArticleId IdType="pmc">PMC8287551</ArticleId>
    </ArticleIdList>
  </PubmedData>
</PubmedArticle>

Unique PubMed Fields

MeSH Terms: Controlled vocabulary

<MeshHeadingList>
  <MeshHeading>
    <DescriptorName UI="D003920">Diabetes Mellitus</DescriptorName>
  </MeshHeading>
</MeshHeadingList>

Publication Types:

<PublicationTypeList>
  <PublicationType UI="D016428">Journal Article</PublicationType>
  <PublicationType UI="D016449">Randomized Controlled Trial</PublicationType>
</PublicationTypeList>

Grant Information:

<GrantList>
  <Grant>
    <GrantID>R01-123456</GrantID>
    <Agency>NIAID NIH HHS</Agency>
    <Country>United States</Country>
  </Grant>
</GrantList>
Raw lines 192 to 278
279### arXiv API
281**Preprints in physics, math, CS, q-bio** - Free, open access.
283**Base URL**: `https://export.arxiv.org/api/query`
285**No API key required**
287#### arXiv ID to Metadata
289**Request**:
290```
291GET https://export.arxiv.org/api/query?id_list=1706.03762
292```
294**Response**: Atom XML
296```xml
297<!-- Illustrative response shape; namespaces are declared on the feed. -->
298<entry>
299 <id>http://arxiv.org/abs/1706.03762v7</id>
300 <title>Attention Is All You Need</title>
301 <author><name>Ashish Vaswani</name></author>
302 <!-- Additional authors omitted in this schematic, never omit them in a citation. -->
303 <published>2017-06-12T17:57:34Z</published>
304 <summary>Abstract text...</summary>
305 <category term="cs.CL" scheme="http://arxiv.org/schemas/atom"/>
306</entry>
307```
309#### Key Fields
311- `id`: arXiv URL
312- `title`: Preprint title
313- `author`: Author list
314- `published`: First version date
315- `updated`: Latest version date
316- `summary`: Abstract
317- `arxiv:doi`: Optional DOI; verify its registration metadata before calling it a journal version
318- `arxiv:journal_ref`: Journal reference if published
319- `category`: arXiv categories
321#### Version Tracking
323arXiv tracks versions:
324- `v1`: Initial submission
325- `v2`, `v3`, etc.: Revisions
327**Always check** for a journal version using publisher metadata and `arxiv:journal_ref`.
328A DOI alone does not prove peer review. The script preserves an explicit `vN`
329identifier; an unversioned request retrieves the current version. Make at most
330one request every three seconds over one connection across all your workers.
331The script enforces this interval within one extractor instance and rejects
332Atom error entries even when the transport returns HTTP 200.

arXiv API

Preprints in physics, math, CS, q-bio - Free, open access.

Base URL: https://export.arxiv.org/api/query

No API key required

arXiv ID to Metadata

Request:

GET https://export.arxiv.org/api/query?id_list=1706.03762

Response: Atom XML

<!-- Illustrative response shape; namespaces are declared on the feed. -->
<entry>
  <id>http://arxiv.org/abs/1706.03762v7</id>
  <title>Attention Is All You Need</title>
  <author><name>Ashish Vaswani</name></author>
  <!-- Additional authors omitted in this schematic, never omit them in a citation. -->
  <published>2017-06-12T17:57:34Z</published>
  <summary>Abstract text...</summary>
  <category term="cs.CL" scheme="http://arxiv.org/schemas/atom"/>
</entry>

Key Fields

  • id: arXiv URL
  • title: Preprint title
  • author: Author list
  • published: First version date
  • updated: Latest version date
  • summary: Abstract
  • arxiv:doi: Optional DOI; verify its registration metadata before calling it a journal version
  • arxiv:journal_ref: Journal reference if published
  • category: arXiv categories

Version Tracking

arXiv tracks versions:

  • v1: Initial submission
  • v2, v3, etc.: Revisions

Always check for a journal version using publisher metadata and arxiv:journal_ref. A DOI alone does not prove peer review. The script preserves an explicit vN identifier; an unversioned request retrieves the current version. Make at most one request every three seconds over one connection across all your workers. The script enforces this interval within one extractor instance and rejects Atom error entries even when the transport returns HTTP 200.

Raw lines 279 to 333
334### DataCite API
336**Research datasets, software, other outputs** - Assigns DOIs to non-traditional scholarly works.
338**Base URL**: `https://api.datacite.org/dois/`
340**Similar to CrossRef** but for datasets, software, code, etc.
342**Request**:
343```
344GET https://api.datacite.org/dois/10.5281/zenodo.1234567
345```
347**Response**: JSON:API object at `data.attributes`, including `titles`, `creators`,
348`publicationYear`, and `types`; this is not Crossref's `message` schema. A public
349GET needs no credentials and retrieves findable records. A missing DataCite or
350Crossref record does not prove a DOI is invalid: other agencies register DOIs.
352`extract_metadata.py --doi` currently reads Crossref records only. For DataCite
353DOIs use `doi_to_bibtex.py` (DOI content negotiation); `validate_citations.py`
354also checks DataCite after a Crossref 404. See the
355[DataCite singleton guide](https://support.datacite.org/docs/api-get-doi).

DataCite API

Research datasets, software, other outputs - Assigns DOIs to non-traditional scholarly works.

Base URL: https://api.datacite.org/dois/

Similar to CrossRef but for datasets, software, code, etc.

Request:

GET https://api.datacite.org/dois/10.5281/zenodo.1234567

Response: JSON:API object at data.attributes, including titles, creators, publicationYear, and types; this is not Crossref's message schema. A public GET needs no credentials and retrieves findable records. A missing DataCite or Crossref record does not prove a DOI is invalid: other agencies register DOIs.

extract_metadata.py --doi currently reads Crossref records only. For DataCite DOIs use doi_to_bibtex.py (DOI content negotiation); validate_citations.py also checks DataCite after a Crossref 404. See the DataCite singleton guide.

Raw lines 334 to 356
357### PMC ID conversion
359`extract_metadata.py --pmcid PMC7611378` uses
360`GET https://pmc.ncbi.nlm.nih.gov/tools/idconv/api/v1/articles/` with `ids`,
361`format=json`, `tool`, and optional `email`. It reads `records[0].pmid` (which
362may be numeric), then uses PubMed; if no PMID exists, it tries the returned DOI.
363Only articles present in PMC can be mapped. The service accepts up to 200 IDs
364of the same type per call, without pagination; this helper sends one ID.
366This active [ID converter](https://pmc.ncbi.nlm.nih.gov/tools/id-converter-api/)
367is separate from the retired PMC OA Web Service.

PMC ID conversion

extract_metadata.py --pmcid PMC7611378 uses GET https://pmc.ncbi.nlm.nih.gov/tools/idconv/api/v1/articles/ with ids, format=json, tool, and optional email. It reads records[0].pmid (which may be numeric), then uses PubMed; if no PMID exists, it tries the returned DOI. Only articles present in PMC can be mapped. The service accepts up to 200 IDs of the same type per call, without pagination; this helper sends one ID.

This active ID converter is separate from the retired PMC OA Web Service.

Raw lines 357 to 368
369## Required BibTeX Fields

Required BibTeX Fields

Raw lines 369 to 370
371### @article (Journal Articles)
373**Required**:
374- `author`: Author names
375- `title`: Article title
376- `journal`: Journal name
377- `year`: Publication year
379**Optional but recommended**:
380- `volume`: Volume number
381- `number`: Issue number
382- `pages`: Page range (e.g., 123--145)
383- `doi`: Digital Object Identifier
384- `url`: URL if no DOI
385- `month`: Publication month
387**Example**:
388```bibtex
389@article{Smith2024,
390 author = {Smith, John and Doe, Jane},
391 title = {Novel Approach to Protein Folding},
392 journal = {Nature},
393 year = {2024},
394 volume = {625},
395 number = {8001},
396 pages = {123--145},
397 doi = {10.1038/nature12345}
399```

@article (Journal Articles)

Required:

  • author: Author names
  • title: Article title
  • journal: Journal name
  • year: Publication year

Optional but recommended:

  • volume: Volume number
  • number: Issue number
  • pages: Page range (e.g., 123--145)
  • doi: Digital Object Identifier
  • url: URL if no DOI
  • month: Publication month

Example:

@article{Smith2024,
  author  = {Smith, John and Doe, Jane},
  title   = {Novel Approach to Protein Folding},
  journal = {Nature},
  year    = {2024},
  volume  = {625},
  number  = {8001},
  pages   = {123--145},
  doi     = {10.1038/nature12345}
}
Raw lines 371 to 400
401### @book (Books)
403**Required**:
404- `author` or `editor`: Author(s) or editor(s)
405- `title`: Book title
406- `publisher`: Publisher name
407- `year`: Publication year
409**Optional but recommended**:
410- `edition`: Edition number (if not first)
411- `address`: Publisher location
412- `isbn`: ISBN
413- `url`: URL
414- `series`: Series name
416**Example**:
417```bibtex
418@book{Kumar2021,
419 author = {Kumar, Vinay and Abbas, Abul K. and Aster, Jon C.},
420 title = {Robbins and Cotran Pathologic Basis of Disease},
421 publisher = {Elsevier},
422 year = {2021},
423 edition = {10},
424 isbn = {978-0-323-53113-9}
426```

@book (Books)

Required:

  • author or editor: Author(s) or editor(s)
  • title: Book title
  • publisher: Publisher name
  • year: Publication year

Optional but recommended:

  • edition: Edition number (if not first)
  • address: Publisher location
  • isbn: ISBN
  • url: URL
  • series: Series name

Example:

@book{Kumar2021,
  author    = {Kumar, Vinay and Abbas, Abul K. and Aster, Jon C.},
  title     = {Robbins and Cotran Pathologic Basis of Disease},
  publisher = {Elsevier},
  year      = {2021},
  edition   = {10},
  isbn      = {978-0-323-53113-9}
}
Raw lines 401 to 427
428### @inproceedings (Conference Papers)
430**Required**:
431- `author`: Author names
432- `title`: Paper title
433- `booktitle`: Conference/proceedings name
434- `year`: Year
436**Optional but recommended**:
437- `pages`: Page range
438- `organization`: Organizing body
439- `publisher`: Publisher
440- `address`: Conference location
441- `month`: Conference month
442- `doi`: DOI if available
444**Example**:
445```bibtex
446@inproceedings{Vaswani2017,
447 author = {Vaswani, Ashish and Shazeer, Noam and others},
448 title = {Attention is All You Need},
449 booktitle = {Advances in Neural Information Processing Systems},
450 year = {2017},
451 pages = {5998--6008},
452 volume = {30}
454```

@inproceedings (Conference Papers)

Required:

  • author: Author names
  • title: Paper title
  • booktitle: Conference/proceedings name
  • year: Year

Optional but recommended:

  • pages: Page range
  • organization: Organizing body
  • publisher: Publisher
  • address: Conference location
  • month: Conference month
  • doi: DOI if available

Example:

@inproceedings{Vaswani2017,
  author    = {Vaswani, Ashish and Shazeer, Noam and others},
  title     = {Attention is All You Need},
  booktitle = {Advances in Neural Information Processing Systems},
  year      = {2017},
  pages     = {5998--6008},
  volume    = {30}
}
Raw lines 428 to 455
456### @incollection (Book Chapters)
458**Required**:
459- `author`: Chapter author(s)
460- `title`: Chapter title
461- `booktitle`: Book title
462- `publisher`: Publisher name
463- `year`: Publication year
465**Optional but recommended**:
466- `editor`: Book editor(s)
467- `pages`: Chapter page range
468- `chapter`: Chapter number
469- `edition`: Edition
470- `address`: Publisher location
472**Example**:
473```bibtex
474@incollection{Brown2020,
475 author = {Brown, Peter O. and Botstein, David},
476 title = {Exploring the New World of the Genome with {DNA} Microarrays},
477 booktitle = {DNA Microarrays: A Molecular Cloning Manual},
478 editor = {Eisen, Michael B. and Brown, Patrick O.},
479 publisher = {Cold Spring Harbor Laboratory Press},
480 year = {2020},
481 pages = {1--45}
483```

@incollection (Book Chapters)

Required:

  • author: Chapter author(s)
  • title: Chapter title
  • booktitle: Book title
  • publisher: Publisher name
  • year: Publication year

Optional but recommended:

  • editor: Book editor(s)
  • pages: Chapter page range
  • chapter: Chapter number
  • edition: Edition
  • address: Publisher location

Example:

@incollection{Brown2020,
  author    = {Brown, Peter O. and Botstein, David},
  title     = {Exploring the New World of the Genome with {DNA} Microarrays},
  booktitle = {DNA Microarrays: A Molecular Cloning Manual},
  editor    = {Eisen, Michael B. and Brown, Patrick O.},
  publisher = {Cold Spring Harbor Laboratory Press},
  year      = {2020},
  pages     = {1--45}
}
Raw lines 456 to 484
485### @phdthesis (Dissertations)
487**Required**:
488- `author`: Author name
489- `title`: Thesis title
490- `school`: Institution
491- `year`: Year
493**Optional**:
494- `type`: Type (e.g., "PhD dissertation")
495- `address`: Institution location
496- `month`: Month
497- `url`: URL
499**Example**:
500```bibtex
501@phdthesis{Johnson2023,
502 author = {Johnson, Mary L.},
503 title = {Novel Approaches to Cancer Immunotherapy},
504 school = {Stanford University},
505 year = {2023},
506 type = {{PhD} dissertation}
508```

@phdthesis (Dissertations)

Required:

  • author: Author name
  • title: Thesis title
  • school: Institution
  • year: Year

Optional:

  • type: Type (e.g., "PhD dissertation")
  • address: Institution location
  • month: Month
  • url: URL

Example:

@phdthesis{Johnson2023,
  author = {Johnson, Mary L.},
  title  = {Novel Approaches to Cancer Immunotherapy},
  school = {Stanford University},
  year   = {2023},
  type   = {{PhD} dissertation}
}
Raw lines 485 to 509
510### @misc (Preprints, Software, Datasets)
512**Required**:
513- `author`: Author(s)
514- `title`: Title
515- `year`: Year
517**For preprints, add**:
518- `howpublished`: Repository (e.g., "bioRxiv")
519- `doi`: Preprint DOI
520- `note`: Preprint ID
522**Example (preprint)**:
523```bibtex
524@misc{Zhang2024,
525 author = {Zhang, Yi and Chen, Li and Wang, Hui},
526 title = {Novel Therapeutic Targets in Alzheimer's Disease},
527 year = {2024},
528 howpublished = {bioRxiv},
529 doi = {10.1101/2024.01.001},
530 note = {Preprint}
532```
534**Example (software)**:
535```bibtex
536@misc{AlphaFold2021,
537 author = {DeepMind},
538 title = {{AlphaFold} Protein Structure Database},
539 year = {2021},
540 howpublished = {Software},
541 url = {https://alphafold.ebi.ac.uk/},
542 doi = {10.5281/zenodo.5123456}
544```

@misc (Preprints, Software, Datasets)

Required:

  • author: Author(s)
  • title: Title
  • year: Year

For preprints, add:

  • howpublished: Repository (e.g., "bioRxiv")
  • doi: Preprint DOI
  • note: Preprint ID

Example (preprint):

@misc{Zhang2024,
  author       = {Zhang, Yi and Chen, Li and Wang, Hui},
  title        = {Novel Therapeutic Targets in Alzheimer's Disease},
  year         = {2024},
  howpublished = {bioRxiv},
  doi          = {10.1101/2024.01.001},
  note         = {Preprint}
}

Example (software):

@misc{AlphaFold2021,
  author       = {DeepMind},
  title        = {{AlphaFold} Protein Structure Database},
  year         = {2021},
  howpublished = {Software},
  url          = {https://alphafold.ebi.ac.uk/},
  doi          = {10.5281/zenodo.5123456}
}
Raw lines 510 to 545
546## Extraction Workflows

Extraction Workflows

Raw lines 546 to 547
548### From DOI
550**Best practice** - Most reliable source:
552```bash
553# Single DOI
554python scripts/extract_metadata.py --doi 10.1038/s41586-021-03819-2
556# Multiple DOIs
557python scripts/extract_metadata.py \
558 --doi 10.1038/nature12345 \
559 --doi 10.1126/science.abc1234 \
560 --output refs.bib
561```
563**Process**:
5641. Query CrossRef API with DOI
5652. Parse JSON response
5663. Extract required fields
5674. Determine entry type (@article, @book, etc.)
5685. Format as BibTeX
5696. Validate completeness

From DOI

Best practice - Most reliable source:

# Single DOI
python scripts/extract_metadata.py --doi 10.1038/s41586-021-03819-2

# Multiple DOIs
python scripts/extract_metadata.py \
  --doi 10.1038/nature12345 \
  --doi 10.1126/science.abc1234 \
  --output refs.bib

Process:

  1. Query CrossRef API with DOI
  2. Parse JSON response
  3. Extract required fields
  4. Determine entry type (@article, @book, etc.)
  5. Format as BibTeX
  6. Validate completeness
Raw lines 548 to 570
Runs code python scripts/extract_metadata.py :554
571### From PMID
573**For biomedical literature**:
575```bash
576# Single PMID
577python scripts/extract_metadata.py --pmid 34265844
579# Multiple PMIDs
580python scripts/extract_metadata.py \
581 --pmid 34265844 \
582 --pmid 28445112 \
583 --output refs.bib
584```
586**Process**:
5871. Query PubMed EFetch with PMID
5882. Parse XML response
5893. Extract citation fields (the bundled extractor does not retain MeSH terms)
5904. Check for DOI in response
5915. If DOI exists, optionally query CrossRef for additional metadata
5926. Format as BibTeX

From PMID

For biomedical literature:

# Single PMID
python scripts/extract_metadata.py --pmid 34265844

# Multiple PMIDs
python scripts/extract_metadata.py \
  --pmid 34265844 \
  --pmid 28445112 \
  --output refs.bib

Process:

  1. Query PubMed EFetch with PMID
  2. Parse XML response
  3. Extract citation fields (the bundled extractor does not retain MeSH terms)
  4. Check for DOI in response
  5. If DOI exists, optionally query CrossRef for additional metadata
  6. Format as BibTeX
Raw lines 571 to 593
Runs code python scripts/extract_metadata.py :577
594### From arXiv ID
596**For preprints**:
598```bash
599python scripts/extract_metadata.py --arxiv 2103.14030
600```
602**Process**:
6031. Query arXiv API with ID
6042. Parse Atom XML response
6053. Inspect journal reference and DOI for a possible published version
6064. If verified as published: explicitly re-extract publisher metadata by DOI
6075. If not published: Use preprint metadata
6086. Format as @misc with preprint note
610**Important**: Always check if preprint has been published!

From arXiv ID

For preprints:

python scripts/extract_metadata.py --arxiv 2103.14030

Process:

  1. Query arXiv API with ID
  2. Parse Atom XML response
  3. Inspect journal reference and DOI for a possible published version
  4. If verified as published: explicitly re-extract publisher metadata by DOI
  5. If not published: Use preprint metadata
  6. Format as @misc with preprint note

Important: Always check if preprint has been published!

Raw lines 594 to 611
Runs code python scripts/extract_metadata.py :599
612### From URL
614**When you only have URL**:
616```bash
617python scripts/extract_metadata.py \
618 --url "https://www.nature.com/articles/s41586-021-03819-2"
619```
621**Process**:
6221. Parse URL to extract identifier
6232. Identify type (DOI, PMID, arXiv)
6243. Extract identifier from URL
6254. Query appropriate API
6265. Format as BibTeX
628**URL patterns**:
629```
630# DOI URLs
631https://doi.org/10.1038/nature12345
632https://dx.doi.org/10.1126/science.abc123
633https://www.nature.com/articles/s41586-021-03819-2
635# PubMed URLs
636https://pubmed.ncbi.nlm.nih.gov/34265844/
637https://www.ncbi.nlm.nih.gov/pubmed/34265844
639# arXiv URLs
640https://arxiv.org/abs/2103.14030
641https://arxiv.org/pdf/2103.14030.pdf
642```

From URL

When you only have URL:

python scripts/extract_metadata.py \
  --url "https://www.nature.com/articles/s41586-021-03819-2"

Process:

  1. Parse URL to extract identifier
  2. Identify type (DOI, PMID, arXiv)
  3. Extract identifier from URL
  4. Query appropriate API
  5. Format as BibTeX

URL patterns:

# DOI URLs
https://doi.org/10.1038/nature12345
https://dx.doi.org/10.1126/science.abc123
https://www.nature.com/articles/s41586-021-03819-2

# PubMed URLs
https://pubmed.ncbi.nlm.nih.gov/34265844/
https://www.ncbi.nlm.nih.gov/pubmed/34265844

# arXiv URLs
https://arxiv.org/abs/2103.14030
https://arxiv.org/pdf/2103.14030.pdf
Raw lines 612 to 643
Runs code python scripts/extract_metadata.py :617
644### Batch Processing
646**From file with mixed identifiers**:
648```bash
649# Create file with one identifier per line
650# identifiers.txt:
651# 10.1038/nature12345
652# 34265844
653# 2103.14030
654# https://doi.org/10.1126/science.abc123
656python scripts/extract_metadata.py \
657 --input identifiers.txt \
658 --output references.bib
659```
661**Process**:
662- Script auto-detects identifier type
663- Queries appropriate API
664- Combines all into single BibTeX file
665- Handles errors gracefully

Batch Processing

From file with mixed identifiers:

# Create file with one identifier per line
# identifiers.txt:
#   10.1038/nature12345
#   34265844
#   2103.14030
#   https://doi.org/10.1126/science.abc123

python scripts/extract_metadata.py \
  --input identifiers.txt \
  --output references.bib

Process:

  • Script auto-detects identifier type
  • Queries appropriate API
  • Combines all into single BibTeX file
  • Handles errors gracefully
Raw lines 644 to 666
Runs code python scripts/extract_metadata.py :656
667## Special Cases and Edge Cases

Special Cases and Edge Cases

Raw lines 667 to 668
669### Preprints Later Published
671**Issue**: Preprint cited, but journal version now available.
673**Solution**:
6741. Check arXiv metadata for DOI field
6752. Verify the DOI points to a published version before replacing the preprint
6763. Update citation to journal article
6774. Note preprint version in comments if needed
679**Example**:
680```bibtex
681% Example publisher citation; do not infer an arXiv-to-DOI mapping from this template.
682% Published as:
683@article{Jumper2021,
684 author = {Jumper, John and Evans, Richard and others},
685 title = {Highly Accurate Protein Structure Prediction with {AlphaFold}},
686 journal = {Nature},
687 year = {2021},
688 volume = {596},
689 pages = {583--589},
690 doi = {10.1038/s41586-021-03819-2}
692```

Preprints Later Published

Issue: Preprint cited, but journal version now available.

Solution:

  1. Check arXiv metadata for DOI field
  2. Verify the DOI points to a published version before replacing the preprint
  3. Update citation to journal article
  4. Note preprint version in comments if needed

Example:

% Example publisher citation; do not infer an arXiv-to-DOI mapping from this template.
% Published as:
@article{Jumper2021,
  author  = {Jumper, John and Evans, Richard and others},
  title   = {Highly Accurate Protein Structure Prediction with {AlphaFold}},
  journal = {Nature},
  year    = {2021},
  volume  = {596},
  pages   = {583--589},
  doi     = {10.1038/s41586-021-03819-2}
}
Raw lines 669 to 693
694### Multiple Authors (et al.)
696**Issue**: Many authors (10+).
698**BibTeX practice**:
699- Preserve the complete author list from the verified source.
700- Let the bibliography style truncate display names; use `and others` only when the source or style requires it.
702**Example**:
703```bibtex
704@article{LargeCollaboration2024,
705 author = {First, Author and Second, Author and Third, Author and others},
706 ...
708```

Multiple Authors (et al.)

Issue: Many authors (10+).

BibTeX practice:

  • Preserve the complete author list from the verified source.
  • Let the bibliography style truncate display names; use and others only when the source or style requires it.

Example:

@article{LargeCollaboration2024,
  author = {First, Author and Second, Author and Third, Author and others},
  ...
}
Raw lines 694 to 709
710### Author Name Variations
712**Issue**: Authors publish under different name formats.
714**Standardization**:
715```
716# Common variations
717John Smith
718John A. Smith
719John Andrew Smith
720J. A. Smith
721Smith, J.
722Smith, J. A.
724# BibTeX format (recommended)
725author = {Smith, John A.}
726```
728**Extraction preference**:
7291. Use full name if available
7302. Include middle initial if available
7313. Format: Last, First Middle

Author Name Variations

Issue: Authors publish under different name formats.

Standardization:

# Common variations
John Smith
John A. Smith
John Andrew Smith
J. A. Smith
Smith, J.
Smith, J. A.

# BibTeX format (recommended)
author = {Smith, John A.}

Extraction preference:

  1. Use full name if available
  2. Include middle initial if available
  3. Format: Last, First Middle
Raw lines 710 to 732
733### No DOI Available
735**Issue**: Older papers or books without DOIs.
737**Solutions**:
7381. Use PMID if available (biomedical)
7392. Use ISBN for books
7403. Use URL to stable source
7414. Include full publication details
743**Example**:
744```bibtex
745@article{OldPaper1995,
746 author = {Author, Name},
747 title = {Title Here},
748 journal = {Journal Name},
749 year = {1995},
750 volume = {123},
751 pages = {45--67},
752 url = {https://stable-url-here},
753 note = {PMID: 12345678}
755```

No DOI Available

Issue: Older papers or books without DOIs.

Solutions:

  1. Use PMID if available (biomedical)
  2. Use ISBN for books
  3. Use URL to stable source
  4. Include full publication details

Example:

@article{OldPaper1995,
  author  = {Author, Name},
  title   = {Title Here},
  journal = {Journal Name},
  year    = {1995},
  volume  = {123},
  pages   = {45--67},
  url     = {https://stable-url-here},
  note    = {PMID: 12345678}
}
Raw lines 733 to 756
757### Conference Papers vs Journal Articles
759**Issue**: Same work published in both.
761**Best practice**:
762- Cite journal version if both available
763- Journal version is archival
764- Conference version for timeliness
766**If citing conference**:
767```bibtex
768@inproceedings{Smith2024conf,
769 author = {Smith, John},
770 title = {Title},
771 booktitle = {Proceedings of NeurIPS 2024},
772 year = {2024}
774```
776**If citing journal**:
777```bibtex
778@article{Smith2024journal,
779 author = {Smith, John},
780 title = {Title},
781 journal = {Journal of Machine Learning Research},
782 year = {2024}
784```

Conference Papers vs Journal Articles

Issue: Same work published in both.

Best practice:

  • Cite journal version if both available
  • Journal version is archival
  • Conference version for timeliness

If citing conference:

@inproceedings{Smith2024conf,
  author    = {Smith, John},
  title     = {Title},
  booktitle = {Proceedings of NeurIPS 2024},
  year      = {2024}
}

If citing journal:

@article{Smith2024journal,
  author  = {Smith, John},
  title   = {Title},
  journal = {Journal of Machine Learning Research},
  year    = {2024}
}
Raw lines 757 to 785
786### Book Chapters vs Edited Collections
788**Extract correctly**:
789- Chapter: Use `@incollection`
790- Whole book: Use `@book`
791- Book editor: List in `editor` field
792- Chapter author: List in `author` field

Book Chapters vs Edited Collections

Extract correctly:

  • Chapter: Use @incollection
  • Whole book: Use @book
  • Book editor: List in editor field
  • Chapter author: List in author field
Raw lines 786 to 793
794### Datasets and Software
796**Use @misc** with appropriate fields:
798```bibtex
799@misc{DatasetName2024,
800 author = {Author, Name},
801 title = {Dataset Title},
802 year = {2024},
803 howpublished = {Zenodo},
804 doi = {10.5281/zenodo.123456},
805 note = {Version 1.2}
807```

Datasets and Software

Use @misc with appropriate fields:

@misc{DatasetName2024,
  author       = {Author, Name},
  title        = {Dataset Title},
  year         = {2024},
  howpublished = {Zenodo},
  doi          = {10.5281/zenodo.123456},
  note         = {Version 1.2}
}
Raw lines 794 to 808
809## Validation After Extraction
811Always validate extracted metadata:
813```bash
814python scripts/validate_citations.py extracted_refs.bib
815```
817**Check**:
818- All required fields present
819- DOI resolves correctly
820- Author names formatted consistently
821- Year is reasonable (4 digits)
822- Journal/publisher names correct
823- Page ranges use -- not -
824- Special characters handled properly

Validation After Extraction

Always validate extracted metadata:

python scripts/validate_citations.py extracted_refs.bib

Check:

  • All required fields present
  • DOI resolves correctly
  • Author names formatted consistently
  • Year is reasonable (4 digits)
  • Journal/publisher names correct
  • Page ranges use -- not -
  • Special characters handled properly
Raw lines 809 to 825
Runs code python scripts/validate_citations.py :814
826## Best Practices

Best Practices

Raw lines 826 to 827
828### 1. Prefer DOI When Available
830DOIs provide:
831- Permanent identifier
832- Best metadata source
833- Publisher-verified information
834- Resolvable link

1. Prefer DOI When Available

DOIs provide:

  • Permanent identifier
  • Best metadata source
  • Publisher-verified information
  • Resolvable link
Raw lines 828 to 835
836### 2. Verify Automatically Extracted Metadata
838Spot-check:
839- Author names match publication
840- Title matches (including capitalization)
841- Year is correct
842- Journal name is complete

2. Verify Automatically Extracted Metadata

Spot-check:

  • Author names match publication
  • Title matches (including capitalization)
  • Year is correct
  • Journal name is complete
Raw lines 836 to 843
844### 3. Handle Special Characters
846**LaTeX special characters**:
847- Protect capitalization: `{AlphaFold}`
848- Handle accents: `M{\"u}ller` or use Unicode
849- Chemical formulas: `H$_2$O` or `\ce{H2O}`

3. Handle Special Characters

LaTeX special characters:

  • Protect capitalization: {AlphaFold}
  • Handle accents: M{\"u}ller or use Unicode
  • Chemical formulas: H$_2$O or \ce{H2O}
Raw lines 844 to 850
851### 4. Use Consistent Citation Keys
853**Convention**: `FirstAuthorYEARkeyword`
854```
855Smith2024protein
856Doe2023machine
857Johnson2024cancer
858```

4. Use Consistent Citation Keys

Convention: FirstAuthorYEARkeyword

Smith2024protein
Doe2023machine
Johnson2024cancer
Raw lines 851 to 859
860### 5. Include DOI for Modern Papers
862Include a DOI when one has been assigned; publication year does not guarantee one:
863```bibtex
864doi = {10.1038/nature12345}
865```

5. Include DOI for Modern Papers

Include a DOI when one has been assigned; publication year does not guarantee one:

doi = {10.1038/nature12345}
Raw lines 860 to 866
867### 6. Document Source
869For non-standard sources, add note:
870```bibtex
871note = {Preprint, not peer-reviewed}
872note = {Technical report}
873note = {Dataset accompanying [citation]}
874```

6. Document Source

For non-standard sources, add note:

note = {Preprint, not peer-reviewed}
note = {Technical report}
note = {Dataset accompanying [citation]}
Raw lines 867 to 875
876## Summary
878Metadata extraction workflow:
8801. **Identify**: Determine identifier type (DOI, PMID, arXiv, URL)
8812. **Query**: Use appropriate API (CrossRef, PubMed, arXiv)
8823. **Extract**: Parse response for required fields
8834. **Format**: Create properly formatted BibTeX entry
8845. **Validate**: Check completeness and accuracy
8856. **Verify**: Spot-check critical citations
887**Use scripts** to automate:
888- `extract_metadata.py`: Universal extractor
889- `doi_to_bibtex.py`: Quick DOI conversion
890- `validate_citations.py`: Verify accuracy
892**Always validate** extracted metadata before final submission!

Summary

Metadata extraction workflow:

  1. Identify: Determine identifier type (DOI, PMID, arXiv, URL)
  2. Query: Use appropriate API (CrossRef, PubMed, arXiv)
  3. Extract: Parse response for required fields
  4. Format: Create properly formatted BibTeX entry
  5. Validate: Check completeness and accuracy
  6. Verify: Spot-check critical citations

Use scripts to automate:

  • extract_metadata.py: Universal extractor
  • doi_to_bibtex.py: Quick DOI conversion
  • validate_citations.py: Verify accuracy

Always validate extracted metadata before final submission!

Raw lines 876 to 893