Skip to main content

Compose SVG figures and LaTeX equations into a panel template

Project description

pc — Panel Compiler

Compose scientific figures from SVG plots, PDF figures, and LaTeX equations into a single SVG or PDF panel.

You define a panel template in Inkscape with named group placeholders (set via the layer/group label field), then write a small YAML config that maps each label to an SVG file, PDF, or a LaTeX string. pc scales each figure to fit its placeholder and writes the compiled panel.

Example

Panel template example/panel.svg — 180×120mm, three rect placeholders (a formula, b linear, c log):

panel template

Input figures generated by example/subfigures.py:

logistic.svg logistic_log.svg
logistic logistic_log

example/pc.yaml:

panel: panel.svg
output:
  - out.svg
  - panel.pdf

logistic_log:
  file: logistic_log.svg
  fit: contain

logistic:
  file: logistic.svg
  fit: contain

formula:
  tex: $\frac{dN}{dt} = rN\!\left(1 - \frac{N}{K}\right)$
  size: 10pt

Compiled result example/out.svg:

compiled panel

cd example
python subfigures.py
pc pc.yaml

Installation

uv tool install git+https://github.com/mfuegger/pc.git

or with pip:

pip install git+https://github.com/mfuegger/pc.git

For LaTeX rendering, pdflatex must be on your PATH. For PDF figures and PDF output, pdf2svg and inkscape must be on your PATH. On macOS: brew install pdf2svg.

Usage

pc [config.yaml]
Argument Default Description
config.yaml pc.yaml YAML config (see below)

The output path is taken from the output key in the config. If omitted, it defaults to the config filename with .svg extension (e.g. pc.yamlpc.svg).

Config format

Single panel

panel: panel.svg    # required — path to the panel SVG, relative to this config file
output: out.svg     # optional — defaults to <config-stem>.svg if omitted

output can also be a list to produce multiple formats in one run:

output:
  - out.svg
  - out.pdf

Each remaining key is a label that must match an element in the panel SVG. pc looks it up by inkscape:label first, then label, then id. The element can be a <g> group or a <rect> placeholder — a <rect> is automatically replaced by a <g> positioned at the rect's x/y.

Figure entry (SVG or PDF)

plot:
  file: results.svg   # path relative to this config file; .svg or .pdf  (alias: svg:)
  fit: contain        # contain | height | width  (default: contain)
  width: 200          # optional — override the target width  (SVG user units)
  height: 100         # optional — override the target height (SVG user units)

Fit strategies:

  • contain — scale uniformly to fit within the placeholder box (default)
  • height — scale to match the placeholder height exactly
  • width — scale to match the placeholder width exactly

Target dimensions come from width/height attributes on the group element in the panel SVG. The config width/height are used as a fallback when the group has no such attributes.

PDF files are converted via pdf2svg before embedding.

LaTeX entry

label:
  tex: $y = \sin(x)$   # any LaTeX — math mode, text, amsmath, …
  size: 12pt           # font size (default: 10pt); scales the rendered output

Rendered via pdflatex + inkscape. No fit scaling — the output is sized by size alone.

Shorthand

A plain string value is treated as an SVG file path with fit: contain:

other: path/to/fig.svg

Multiple panels

Use a YAML list; each entry must have its own output:

- panel: panel1.svg
  output: out1.svg
  plot:
    file: results.svg

- panel: panel2.svg
  output:
    - out2.svg
    - out2.pdf
  label:
    tex: $E = mc^2$
    size: 12pt

License

Apache 2.0 — see LICENSE.

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

panel_compiler-0.1.0.tar.gz (28.4 kB view details)

Uploaded Source

Built Distribution

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

panel_compiler-0.1.0-py3-none-any.whl (12.3 kB view details)

Uploaded Python 3

File details

Details for the file panel_compiler-0.1.0.tar.gz.

File metadata

  • Download URL: panel_compiler-0.1.0.tar.gz
  • Upload date:
  • Size: 28.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for panel_compiler-0.1.0.tar.gz
Algorithm Hash digest
SHA256 3be4b7c949797b3674bc34857657f4bc432eadf14110c328c25d5c357e07c2ed
MD5 db67d13005d3bf784086341c4945543c
BLAKE2b-256 8b0cef10fb2cc7fb0318a638a70e6d03dda619ec57d068d8736806b2b7e96f5e

See more details on using hashes here.

Provenance

The following attestation bundles were made for panel_compiler-0.1.0.tar.gz:

Publisher: publish.yml on mfuegger/panel-compiler

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

File details

Details for the file panel_compiler-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: panel_compiler-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 12.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for panel_compiler-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 1482c2a63a2a0d975661b92fac8e6d5cdfcf86331237f7ff96453e0001a56e29
MD5 4e624e63fb5ffcf29bd44471148ca632
BLAKE2b-256 b624e343f6ec6733d285fcbab21a5d249e05b01a6d58f8824d874fe342122ae2

See more details on using hashes here.

Provenance

The following attestation bundles were made for panel_compiler-0.1.0-py3-none-any.whl:

Publisher: publish.yml on mfuegger/panel-compiler

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