# @citation-js/plugin-bibtex
Plugin for BibTeX formats for Citation.js.
[![NPM version](https://img.shields.io/npm/v/@citation-js/plugin-bibtex.svg)](https://npmjs.org/package/@citation-js/plugin-bibtex)
[![NPM total downloads](https://img.shields.io/npm/dt/@citation-js/plugin-bibtex.svg)](https://npmcharts.com/compare/@citation-js%2Fplugin-bibtex?minimal=true)
![License](https://img.shields.io/npm/l/@citation-js/plugin-bibtex.svg)
![Dependency status](https://img.shields.io/librariesio/release/npm/@citation-js/plugin-bibtex)
---
## Install
npm install @citation-js/plugin-bibtex
## Usage
Register by importing the package:
```js
require('@citation-js/plugin-bibtex')
```
## Formats
Formats and other features added by this plugin.
### BibTeX
This plugin adds input and output support for [BibTeX](http://www.bibtex.org/),
both in text form and as a JSON representation. Input types are called `@bibtex/text`
and `@bibtex/entry+object`, output format is `bibtex`. The output has format
dictionary support.
### BibLaTeX
This plugin adds input and output support for [BibLaTeX](https://www.ctan.org/pkg/biblatex),
both in text form and as a JSON representation. Input types are called `@biblatex/text`
and `@biblatex/entry+object`, output format is `biblatex`. The output has format
dictionary support.
### Bib.TXT
This plugin adds input and output support for [Bib.TXT](http://bibtxt.github.io/),
a simplified and modernised version of BibTeX. Input types are called `@bibtxt/text`
and `@biblatex/entry+object`, output format is `bibtxt`. The output has format
dictionary support.
## Configuration
Configuration can be accessed like the following:
```js
const { plugins } = require('@citation-js/core')
const config = plugins.config.get('@bibtex')
```
| Property | Values [default] | Description |
|----------|------------------|-------------|
| `config.parse.strict` | `true`, [`false`] | When true, entries are checked for required fields. |
| `config.parse.sentenceCase` | `'always'`, `'english'`, [`'never'`] | Convert titles to sentence case when parsing. |
| `config.format.useIdAsLabel` | `true`, [`false`] | Use the entry ID as the label instead of generating one. |
### Type mappings
Entry type mappings between BibLaTeX or BibTeX and CSL-JSON are available through
`config.types.biblatex` and `config.types.bibtex`. In both cases, the Bib(La)TeX
mappings are in the `source` field and the reverse mappings in the `target` field.
```js
config.types.biblatex.source.inproceedings = 'paper-conference'
config.types.biblatex.target['paper-conference'] = 'inproceedings'
```
### Required types
The list of required fields for each type for BibLaTeX and BibTeX is available
under `config.required.biblatex` and `config.required.bibtex` respectively. In
both cases, the list consists of strings for required fields and arrays for sets
of fields where at least one should be present (year OR date for BibLaTeX for
example).
```js
config.required.biblatex.book = [
'title',
['author', 'editor'],
'publisher',
['year', 'date']
]
```
### Field types
Field types (used for both BibLaTeX and BibTeX) are available through `config.constants.fieldTypes`.
This returns an object mapping Bib(La)TeX field names to an array containing a
field type and a value type. The former is either `field`, `list` (`" and "`-delimited),
or `separated` (comma-delimited). As for the latter:
| Value type | Description |
|------------|-------------|
| `literal` | Normal text or numeric content |
| `title` | Like `literal` but can be affected by `config.parse.sentenceCase` |
| `name` | A personal or organizational name |
| `date` | An EDTF Level 1 date |
| `verbatim` | Unaltered text (no expansion of commands, etc.) |
| `uri` | Same as `verbatim` but if needed the URL is encoded |
| other | No special behaviour, treated like `literal` |
```js
// Add `daturl` for dat:// URLs
config.constants.fieldTypes.daturl = ['field', 'uri']
// Do not treat `publisher` as a list
config.constants.fieldTypes.publisher = ['field', 'literal']
```
### Unicode
- `config.constants.diacritics` maps commands (`\"`) to diacritics
- `config.constants.commands` maps commands (`\textinterrobangdown`) to general unicode characters (`⸘`)
- `config.constants.ligatures` maps non-command character sequences (`---`, `~`, etc.) to their replacements (emdash, no-breaking space, etc.)
- `config.constants.ligaturePattern` is a RegExp that recognizes the ligatures mapped above
- `config.constants.mathScripts` maps superscript and subscript (in properties `^` and `_` respectively)
```js
config.constants.diacritics['"'] = '\u0308'
config.constants.commands.textinterrobangdown = '⸘'
config.constants.ligatures = {
'---': '\u2014',
'~': '\u00A0'
}
config.constants.ligaturePattern = /---|~/g // Don't forget the (g)lobal flag
config.constants.mathScripts = {
'^': { '1': '¹' },
'_': { '1': '₁' }
}
```
### Formatting
- `config.constants.formattingEnvs` maps environment commands to formatting
- `config.constants.formattingCommands` maps regular commands to formatting
- `config.constants.mathScriptFormatting` maps `^` and `_` to resp. super- and subscript
- `config.constants.formatting` maps formatting to HTML (though RTF or Markdown could be substituted)
```js
config.constants.formattingEnvs.bf = 'bold'
config.constants.formattingCommands.textbf = 'bold'
config.constants.mathScriptFormatting['^'] = 'superscript'
config.constants.formatting = {
bold: ['', ''],
superscript: ['', '']
}
```
### Other commands
The object `config.constants.argumentCommands` maps command names to functions
handling them. This does not include commands used above. Braced arguments are
parsed automatically based on how many arguments the function takes. It does not
support optional arguments (i.e. those in square braces) yet.
```js
config.constants.argumentCommands.href = function (url, displayText) {
// Note: tags are not supported by CSL so watch out if you use this
return `${displayText}`
}
// You can also use it to replace commands that produce text
config.constants.argumentCommands.LaTeX = () => 'LaTeX'
```
### English languages
The array `config.constants.sentenceCaseLanguages` affects which languages are
eligible for sentence-casing when `config.parse.sentenceCase` is set to `'english'`.
All entries should be lowercase.
```js
config.constants.sentenceCaseLanguages = [
'english',
'en-us',
'en-gb'
]
```
### Replacement strings
The object `config.constants.defaultStrings` determines which strings are defined
by default.
```js
config.constants.defaultStrings.larsgw = "Willighagen, Lars G"
```