1#![doc = include_str!("readme.md")]
2use core::range::Range;
3
4#[derive(Debug, Clone)]
6#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
7pub struct TexRoot {
8 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
10 pub span: Range<usize>,
11 pub items: Vec<TexItem>,
13}
14
15#[derive(Debug, Clone)]
17#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
18pub enum TexItem {
19 Command(TexCommand),
21 Environment(TexEnvironment),
23 Group(TexGroup),
25 Math(TexMath),
27 Superscript(TexSuperscript),
29 Subscript(TexSubscript),
31 Text {
33 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
35 span: Range<usize>,
36 content: String,
38 },
39 Comment {
41 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
43 span: Range<usize>,
44 content: String,
46 },
47}
48
49#[derive(Debug, Clone)]
51#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
52pub struct TexEnvironment {
53 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
55 pub span: Range<usize>,
56 pub name: String,
58 pub arguments: Vec<TexArgument>,
60 pub content: TexRoot,
62}
63
64#[derive(Debug, Clone)]
66#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
67pub struct TexSuperscript {
68 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
70 pub span: Range<usize>,
71 pub target: Option<Box<TexItem>>,
73 pub content: Box<TexRoot>,
75}
76
77#[derive(Debug, Clone)]
79#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
80pub struct TexSubscript {
81 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
83 pub span: Range<usize>,
84 pub target: Option<Box<TexItem>>,
86 pub content: Box<TexRoot>,
88}
89
90#[derive(Debug, Clone)]
92#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
93pub struct TexMath {
94 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
96 pub span: Range<usize>,
97 pub content: TexRoot,
99 pub is_display: bool,
101}
102
103#[derive(Debug, Clone)]
105#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
106pub struct TexCommand {
107 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
109 pub span: Range<usize>,
110 pub name: String,
112 pub arguments: Vec<TexArgument>,
114}
115
116#[derive(Debug, Clone)]
118#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
119pub enum TexArgument {
120 Optional(TexRoot),
122 Required(TexRoot),
124}
125
126#[derive(Debug, Clone)]
128#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
129pub struct TexGroup {
130 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
132 pub span: Range<usize>,
133 pub content: TexRoot,
135}
136
137impl TexRoot {
138 pub fn new(span: Range<usize>) -> Self {
140 Self { span, items: Vec::new() }
141 }
142}