add_wavenumber_marker() and add_band() now respect label_aesthetics = list(vjust = ...) so peak labels can be vertically offset to reduce overlap (@pbulsink, #38).
fit_peaks() now documents explicit fitting controls and clarifies that automatic peak discovery is a heuristic starting point for fitting, not a validated deconvolution standard (#33).
Peak fitting functionality added with find_ftir_peaks(), fit_peaks(), and related functions. (#33)
Added Raman spectral plotting with plot_raman(), read_raman(), and utilities for baseline correction, smoothing, and peak finding (#34).
smooth_spectra(), baseline_correct(), normalize_raman(), and find_peak_maxima() accept sample_ids = NULL to select every sample (#34).
smooth_spectra() and baseline_correct() now report a clear error when given FTIR absorbance or transmittance data instead of Raman spectra (#34).
normalize_raman() now rejects spectra with a non-positive maximum and reports NA intensity values rather than silently propagating them (#34).
read_raman() captures single-# header metadata, reports true file line numbers for invalid data, and warns about malformed rows (#34).
read_ftir_jdx() now auto-converts .jdx files with wavelength (micrometer) x-axis units to wavenumber (#43)print() now provides pretty printing for PlotFTIR data structures, showing spectral range, resolution, intensity type, number of samples, and sample IDs. (#27)ggplot2::coord_transform() instead of coord_trans, which is now deprecated. (#25)ir package. (#35)check_ftir_data for downstream packages. (related to #19)readJDX. (#20)options(). (#10)