1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
// Embedded SVG content can contain bracketed text (e.g. axis labels
// like "t [s]") that rustdoc mis-parses as intra-doc links. The
// embeds are checked-in HTML, not docstrings — silence the lint.
//! BLAND — pure-Rust technical drawing.
//!
//! A library for paper-ready, monochrome, hatch-patterned plots in the
//! visual tradition of 1960s-80s engineering reports. Output is SVG —
//! resolution-independent, prints clean on any printer, embeds cleanly
//! into LaTeX, PDF pipelines, and HTML documents.
//!
//! # Quick start
//!
//! ```no_run
//! use bland::{Figure, PaperSize, Stroke};
//!
//! let xs: Vec<f64> = (0..=100).map(|i| i as f64 / 10.0).collect();
//! let ys: Vec<f64> = xs.iter().map(|t| (-t / 4.0).exp() * t.cos()).collect();
//! let env: Vec<f64> = xs.iter().map(|t| (-t / 4.0).exp()).collect();
//!
//! let fig = Figure::new()
//! .size(PaperSize::A5Landscape)
//! .title("Damped oscillation")
//! .xlabel("t [s]")
//! .ylabel("x(t)")
//! .line(&xs, &ys, |s| s.label("response"))
//! .line(&xs, &env, |s| s.label("envelope").stroke(Stroke::Dashed))
//! .hline(0.0, |s| s.stroke(Stroke::Dotted))
//! .legend_top_right();
//!
//! std::fs::write("oscillation.svg", fig.to_svg()).unwrap();
//! ```
//!
//! # Why monochrome?
//!
//! - **Prints clean.** Plots look the same on a laser printer, a color
//! printer, and a photocopy. No "figure unreadable in proceedings"
//! surprises.
//! - **Accessible by default.** Hatching, stroke dashing, and marker
//! shape distinguish series — so plots survive grayscale rendering and
//! are legible to readers with color vision deficiency.
//!
//! # Plot gallery
//!
//! ## Histograms with hatched fills
//!
//! ## Grouped bar charts
//!
//! ## Heatmaps with monochrome ramps
//!
//! ## Iso-line contours
//!
//! ## Box plots with computed Tukey fences
//!
//! ## Vector fields
//!
//! ## Polar coordinates
//!
//! ## Smith chart
//!
//! ## Geographic basemaps
//!
//! ## Lunar maria
//!
//! # Features
//!
//! - **Series**: line, scatter, bar (grouped), area, histogram, heatmap,
//! polygon, error bars, box plots, stem plots, quiver / vector fields,
//! contour iso-lines, reference rules.
//! - **Hatch patterns**: 15 presets — diagonals, crosshatch, dots, brick,
//! zigzag, checker. Build your own via [`Hatch::DEFAULT_RAMP`] for
//! heatmap shading.
//! - **Markers**: 12 presets, alternating open / filled / cross variants.
//! - **Stroke dashes**: solid, dashed, dotted, dash-dot, long-dash, fine.
//! - **Paper presets**: A4, A5, Letter, Legal, Square — portrait & landscape.
//! - **Themes**: [`Theme::report_1972`] (serif), [`Theme::blueprint`]
//! (monospace), [`Theme::gazette`] (newspaper).
//! - **Engineering [`TitleBlock`]** with project / drawn-by / date / scale
//! / sheet / revision.
//! - **Annotations**: in-data text and arrows with anti-overlap halos.
//! - **Linear and log axes** with nice-rounded tick placement.
//! - **Projections**: polar, Smith, Mercator, equirectangular.
//! - **Built-in basemaps**: Earth coastlines & borders (Natural Earth
//! 1:110m, optional 1:50m via the `high-res-basemaps` feature),
//! reference parallels, lunar maria.
//! - **Multi-panel layouts** via [`multi_panel`].
//! - **Composite helpers**: [`bode`], [`qq_plot`].
//! - **Pure Rust, zero dependencies.**
pub use ;
pub use ;
pub use ;
pub use ;
pub use Hatch;
pub use ;
pub use Marker;
pub use ;
pub use ;
pub use ;
pub use ;
pub use Stroke;
pub use ;
pub use ;