Skip to main content

Write scientific articles in Markdown and convert them to journal-ready LaTeX/PDF (Copernicus, Science, AMS, ...)

Project description

texmark

pypi

Write scientific articles in markdown

Installation

for development, after cloning:

pip install -e .

and soon:

pip install texmark

Example

See example.md for a sample markdown file with yaml metadata in the header.

The command to convert the markdow to tex is:

texmark example.md

And to convert to PDF

texmark example.md --pdf

For another journal, it is enough to change the journal -> template' field in the yaml metadata. For testing it is also possible to pass -jfor--journal-template`:

texmark example.md --pdf -j science -o build/example-science.pdf --tex build/example-science.tex

See the example tex and pdf results in build

Journal templates

Pick the template that matches your target journal and add it to the yaml header of your markdown:

journal:
    template: ametsoc          # template name, see table below
    options: twocol            # optional, per-template — see the docs page
template covers example docs
copernicus (aliases cp, esd, ...) Copernicus / EGU: ACP, BG, CP, ESD, HESS, NHESS, TC, ... PDF docs
science AAAS Science, Science Advances PDF docs
ametsoc (aliases jclim, jas, mwr, bams, ...) AMS: J. Climate, JAS, MWR, BAMS, ... PDF docs
arxiv (alias preprint) arXiv preprint, generic article-class PDF docs
elsarticle (alias elsevier) Elsevier: QSR, EPSL, GPC, Earth-Science Reviews, Cell, Lancet, ... PDF docs
agujournal (aliases agu, jgr, grl, james, wrr, ...) AGU: JGR family, GRL, Earth's Future, JAMES, ... PDF docs
springernature (aliases nature, naturecomms, natclimchange, natgeoscience, scirep) Springer Nature: Nature, Nature Communications, Nature Climate Change, Nature Geoscience, Scientific Reports, ... PDF docs
pnas PNAS PDF docs

Each template ships a default journal.options value chosen to produce a publication-style PDF (typeset 2-column journal look, no draft watermarks). For peer-review submission you usually want to switch to the publisher's submission options (e.g. preprint,12pt for Elsevier, draft for AGU, the empty default for AMS 1.5-spacing). The per-journal docs page lists the alternatives.

Partial support only. Before submitting, you will likely need to hand-edit the final LaTeX — appendix structure, special sections (Methods Online, Extended Data, Significance, …) and journal-specific cross-reference macros are not all wired up automatically. Use the example PDF to confirm the layout looks reasonable, then run texmark --tex out.tex and finish the manuscript in LaTeX directly.

Common yaml fields (all templates)

title: "Paper title"
authors:
  - firstname: Mahé
    lastname: Perrette
    affiliation: 1              # integer index into `affiliations` (most templates)
    email: mahe.perrette@gmail.com
  - firstname: Co
    lastname: Author
    affiliation: 2
affiliations:
  - "Alfred Wegener Institute, ..."
  - "Another Institution"
date: "2026-05-26"
bibliography: references.bib
journal:
    template: <name>            # required: picks the journal template + filters
    options: <str or list>      # optional: class options (per-template default)
collect_figures_and_tables: true       # optional: see section below
figure-width: 80%                      # optional: pandoc figure default
figure-span: full                      # optional: wraps in figure* (full text width)

Section-style metadata can also be given as markdown # ... headings. Any of # Abstract, # Acknowledgments, # Data Availability, # Appendix, # Supplementary Material, # Significance, # Capsule, # Key Points, # Plain Language Summary, # Author Contributions, # Competing Interests, # Materials and Methods, # Funding, # Highlights, # Keywords will be extracted out of the body and injected into the right LaTeX command for the target journal. The exact list each template recognises is in texmark/filters/main.py.

Collect figures and tables at the end of the document

Just add

collect_figures_and_tables: true

to your markdown yaml metadata.

Advanced: latex template

The templates are written in jinja2.

Just copy from e.g. texmark/templates/science/template.tex to your own, e.g. custom_template.tex And run again with:

texmark example.md --pdf -j science -o build/example-science.pdf --tex build/example-science.tex --template custom_template.tex

The -j journal template option (here science) is still used to set custom filters (e.g. only \cite for Science, no \citet ; extract specific sections as metadata to be injected as {{section}} instead of {{body}} etc). The machinery is defined in texmark/filters.py and can in principle be extended or copied. Two approaches are possible:

  • just add more filters via the --filters command or in the yaml metadata.
  • extend the existing filters in a module, e.g. custom_filter.py, that extends the filters dict from the texmark.filters module (see the source code to check the details). And then pass it via --filters-module custom_filter parameter (or custom_filter in the metadata) to prompt the texmark filter to load that module and make it available via -j your-custom-name. Note that will require you to explicitly pass --template as well. Unless you overwrite an existing filter.

Ackowledgements

This project benefited greatly from AI support to extend the initial list of supported journals and further extend this package capability.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

texmark-0.6.tar.gz (369.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

texmark-0.6-py3-none-any.whl (383.6 kB view details)

Uploaded Python 3

File details

Details for the file texmark-0.6.tar.gz.

File metadata

  • Download URL: texmark-0.6.tar.gz
  • Upload date:
  • Size: 369.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for texmark-0.6.tar.gz
Algorithm Hash digest
SHA256 acbfa2e11d1fb4d0a74a8dfac60a7ba7b8cbab028e7478a38b9f5f6c2ef6f815
MD5 af81b9d0b03dfa418439b7c53b937161
BLAKE2b-256 b0b1b6a6d7ab9c76a9cb4256ccb555f8d09b4b03dac077e1a13570cca387b7f2

See more details on using hashes here.

Provenance

The following attestation bundles were made for texmark-0.6.tar.gz:

Publisher: pypi.yml on perrette/texmark

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file texmark-0.6-py3-none-any.whl.

File metadata

  • Download URL: texmark-0.6-py3-none-any.whl
  • Upload date:
  • Size: 383.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for texmark-0.6-py3-none-any.whl
Algorithm Hash digest
SHA256 933de057e824e58431a75d7b64080bfdb68baccf496de6462fe45e6eb83f4076
MD5 a46a4436f0fe8911d44d69d7de5e00b1
BLAKE2b-256 0059cc5b47e04d7dbe098ba5be2459ea7a8ad8ed5a1b383675dce43cce470864

See more details on using hashes here.

Provenance

The following attestation bundles were made for texmark-0.6-py3-none-any.whl:

Publisher: pypi.yml on perrette/texmark

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page