# Краткое описание xml-формата документа SMath Studio

## Общие положения

- формат документа: `xml`;  
- документ структурирован в виде рабочего листа (`worksheet`), содержащего настройки (`settings`) и набор регионов (`regions`);  
- документ настраивается в постраничный режим, имеет графическое представление, может быть выведен на печать или экспортирован в PDF;  
- секцию дополнений (`dependencies`) нельзя убирать, заменять, модифицировать или дополнять вручную, она формируется автоматически средой;  
- заголовок документа (директивы `?xml`, `?application`) нельзя изменять вручную;  
- секция `math` (и вложенные `input`/`result`) представляет выражения в обратной польской записи, их синтаксис описан в отдельном документе (`SMathAI.md`);  
- корректность структуры означает:
  - каждый открывающий тег имеет закрывающий,  
  - атрибуты задаются в виде `ключ="значение"`,  
  - вложенность не нарушается;  
- минимальность и читаемость обеспечиваются:
  - отсутствием дублирующихся assembly в `dependencies`,  
  - недопустимостью пустых `region` без содержимого (кроме явно разрешённых, например, пустых `backgrounds`),  
  - сохранением компактности атрибутов;  
- непротиворечивость: идентификаторы (`id`, `guid`) должны быть уникальными в пределах документа;  
- все дополнения (`text`, `math`, `mathcadblock`, `xyplot`, `picture`) всегда обёрнуты в контейнер `region` с координатами и параметрами оформления: `left`, `top`, `width`, `height`, `color`, `fontSize`.

---

## 1. Общее описание структуры документа

```yml
document:
  -?xml:
    -version:"1.0"
    -encoding:"utf-8"
    -standalone:"yes"
  -?application:
    -progid:"SMath Studio настольная"
    -version:"1.2.9018.0"
  -worksheet:
    -settings:
      -identity: { id, revision }
      -metadata: { lang, author }
      -calculation: { precision, exponentialThreshold, ... }
      -pageModel: { paper, margins, header, footer, backgrounds }
      -dependencies: { assembly* }
    -regions (type="content"):
      -region*:
        -text | math | mathcadblock | xyplot | picture | ...
```

---

## 2.1. Секция рабочего листа

Описание тега:

```yml
worksheet:
  -settings: ...
```

Корень документа.


## 2.2. Секция рабочего листа

```yml
settings:
  -identity:
    -id:guid
    -revision:int
  -metadata:
    -lang:string
    -author:string
  -calculation:
    -precision:int
    -exponentialThreshold:int
    -trailingZeros:bool
    -significantDigitsMode:bool
    -mixedNumbers:bool
    -roundingMode:int
    -approximateEqualAccuracy:int
    -fractions:string("decimal"|"fraction")
  -pageModel:
    -active:bool
    -viewMode:int
    -printGrid:bool
    -printAreas:bool
    -simpleEqualsOnly:bool
    -printBackgroundImages:bool
    -hideElementsHighlightings:bool
    -paper:
      -id:int
      -orientation:"Portrait"|"Landscape"
      -width:int
      -height:int
    -margins:
      -left:int
      -right:int
      -top:int
      -bottom:int
    -header:
      -alignment:"Left"|"Center"|"Right"
      -color:hexRGB
      -text:string
    -footer:
      -alignment:"Left"|"Center"|"Right"
      -color:hexRGB
      -text:string
    -backgrounds: {...}
  -dependencies:
    -assembly*
```

Содержит настройки внешнего вида, вычислений, зависимости.


## 2.3. Секция дополнений `dependencies`

```yml
dependencies:
  -assembly:
    -name:"SMath Studio настольная"
    -version:"1.2.9018.0"
    -guid:"a37cba83-b69c-4c71-9992-55ff666763bd"
  -assembly:
    -name:"MathRegion"
    -version:"1.11.9018.0"
    -guid:"02f1ab51-215b-466e-a74d-5d8b1cf85e8d"
  -assembly:
    -name:"PictureRegion"
    -version:"1.10.9018.0"
    -guid:"06b5df04-393e-4be7-9107-305196fcb861"
  -assembly:
    -name:"Custom Functions"
    -version:"1.1.8726.29023"
    -guid:"18dadffd-79a3-4cf9-aee1-d66deb0ea720"
  -assembly:
    -name:"SpecialFunctions"
    -version:"1.12.9018.0"
    -guid:"2814e667-4e12-48b1-8d51-194e480eabc5"
  -assembly:
    -name:"TextRegion"
    -version:"1.11.9018.0"
    -guid:"485d28c5-349a-48b6-93be-12a35a1c1e39"
  -assembly:
    -name:"X-Y Plot Region (JXCharts)"
    -version:"0.3.9043.20036"
    -guid:"c12231ec-4873-43c1-a7d0-a167ebd17066"
  -assembly:
    -name:"Mathcad Toolbox"
    -version:"0.5.9065.32492"
    -guid:"ddc09821-49f1-4c21-a829-6499de0a8f06"
```

Содержит список всех дополнений, использующихся в документе.


## 2.4. Секция регионов

```yml
regions:
  -region: {...}
  -region: {...}
  -region: {...}
  {...}
  -region: {...}
```

---

## 3.1. Секция `picture`

```yml
region:
  -picture:
    -raw:
      -format:"png"
      -encoding:"base64"
```

---

## 3.2. Секция `math`

```yml
region:
  -math:
    -input: <rpn_expression>
    -result (optional):
      -action:"numeric"|"symbolic"
      -value: <rpn_expression>
```

Содержит математическое выражение. Вложенные элементы <e> задают операнды, функции и операторы в RPN-формате. Синтаксис приведён в SMathAI.md

Пример:

```xml
<region left="10" top="20" width="50" height="20">
  <math>
    <input>
      <e type="operand">2</e>
      <e type="operand">3</e>
      <e type="operator" args="2">+</e>
    </input>
  </math>
</region>
```
(результат: `2+3`)

---

## 3.3. Секция `mathcadblock`

```yml
region:
  -mathcadblock:
    -width:int
    -height:int
    -seqop:"sys"|"line"|...
    -input: <rpn_expression>
```

Используется в качестве рамки для группировки (объединения) набора выражений.

Пример:

```xml
<region left="0" top="45" width="260" height="123">
  <mathcadblock width="250" height="115" seqop="sys">
    <input>
      <e type="operand">funvec</e>
    </input>
  </mathcadblock>
</region>
```

---

## 3.4. Секция `xyplot`

```yml
region:
  -xyplot:
    -width:int
    -height:int
    -points:int
    -name:string
    -chartstyle: {...}
    -grid: {...}
    -xaxes: {...}
    -yaxes: {...}
    -y2axes: {...}
    -title2d: {...}
    -xylabel: {...}
    -legend: {...}
    -traces: { trace* }
    -input: <rpn_expression>
```

Используется для отображения 2D-графиков. В input задаётся система из выражений поддерживаемых форматов.

Пример:

```xml
<region left="0" top="774" width="742" height="268">
  <xyplot width="732" height="260" points="150" name="XYPlot">
    <input>
      <e type="operand">M</e>
      <e type="operand">2</e>
      <e type="function" args="2">col</e>
    </input>
  </xyplot>
</region>
```

---

## 3.5. Секция `text`

```yml
region:
  -text:
    -lang:"rus"|"eng"|...
    -fontFamily:string
    -fontSize:int
    -content: <p>...</p>
```

Текстовые элементы документа (заголовки, комментарии).

Пример:

```xml
<region left="297" top="9" width="156" height="29">
  <text lang="rus" fontFamily="Arial" fontSize="10">
    <content>
      <p style="font-size:14px;">Задача трёх тел</p>
    </content>
  </text>
</region>
```

---

## 4. Примеры использования дополнений

### 4.1. MathRegion

```xml
<region left="10" top="100" width="80" height="20">
  <math>
    <input>
      <e type="operand">x</e>
      <e type="operand">2</e>
      <e type="operator" args="2">^</e>
    </input>
  </math>
</region>
```

(результат: `x^2`)

### 4.2. TextRegion

```xml
<region left="50" top="20" width="200" height="30">
  <text lang="eng" fontFamily="Calibri" fontSize="12">
    <content>
      <p style="font-size:12px;">Simulation results</p>
    </content>
  </text>
</region>
```

### 4.3. PictureRegion

```xml
<region left="0" top="200" width="300" height="150">
  <picture>
    <raw format="png" encoding="base64">iVBORw0KGgoAAAANS...</raw>
  </picture>
</region>
```

### 4.4. X-Y Plot Region

```xml
<region left="0" top="400" width="400" height="300">
  <xyplot width="390" height="290" points="100" name="Trajectory">
    <input>
      <e type="operand">~t</e>
      <e type="function" args="1">x1</e>
      <e type="operand">~t</e>
      <e type="function" args="1">y1</e>
      <e type="operand">2</e>
      <e type="operand">1</e>
      <e type="function" args="4">mat</e>
    </input>
  </xyplot>
</region>
```

### 4.5. Mathcad Toolbox (пример блоков)

```xml
<region left="100" top="500" width="250" height="80">
  <mathcadblock width="240" height="70" seqop="sys">
    <input>
      <e type="operand">M</e>
      <e type="operand">R</e>
      <e type="operand">t.end</e>
      <e type="operand">1000</e>
      <e type="function" args="3">Rkadapt</e>
      <e type="operator" args="2">:</e>
    </input>
  </mathcadblock>
</region>
```

---

## 5. Минимальные шаблоны регионов

### Пустой текстовый регион

```xml
<region left="0" top="0" width="100" height="20">
  <text lang="eng" fontFamily="Arial" fontSize="10">
    <content><p></p></content>
  </text>
</region>
```

### Пустой math регион

```xml
<region left="0" top="0" width="50" height="20">
  <math>
    <input />
  </math>
</region>
```

### Пустой mathcadblock

```xml
<region left="0" top="0" width="100" height="40">
  <mathcadblock width="90" height="30" seqop="sys">
    <input />
  </mathcadblock>
</region>
```

### Пустой xyplot

```xml
<region left="0" top="0" width="200" height="150">
  <xyplot width="190" height="140" points="10" name="Plot">
    <input />
  </xyplot>
</region>
```

### Пустой picture

```xml
<region left="0" top="0" width="100" height="100">
  <picture>
    <raw format="png" encoding="base64"></raw>
  </picture>
</region>
```

---

## 6. Минимальный пример пустого документа

```xml
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<?application progid="SMath Studio настольная" version="1.2.9018.0"?>
<worksheet xmlns="http://smath.info/schemas/worksheet/1.0">
  <settings ppi="96">
    <identity>
      <id>00000000-0000-0000-0000-000000000000</id>
      <revision>1</revision>
    </identity>
    <metadata lang="eng">
      <author>Author</author>
    </metadata>
    <calculation>
      <precision>4</precision>
      <exponentialThreshold>5</exponentialThreshold>
      <trailingZeros>false</trailingZeros>
      <significantDigitsMode>false</significantDigitsMode>
      <mixedNumbers>false</mixedNumbers>
      <roundingMode>0</roundingMode>
      <approximateEqualAccuracy>0</approximateEqualAccuracy>
      <fractions>decimal</fractions>
    </calculation>
    <pageModel active="false" viewMode="2" printGrid="false" printAreas="true" simpleEqualsOnly="false" printBackgroundImages="true" hideElementsHighlightings="false">
      <paper id="9" orientation="Portrait" width="827" height="1169" />
      <margins left="19" right="19" top="39" bottom="39" />
      <header alignment="Center" color="#a9a9a9" />
      <footer alignment="Center" color="#a9a9a9" />
      <backgrounds />
    </pageModel>
    <dependencies>
      <assembly name="SMath Studio настольная" version="1.2.9018.0" guid="a37cba83-b69c-4c71-9992-55ff666763bd" />
      <assembly name="MathRegion" version="1.11.9018.0" guid="02f1ab51-215b-466e-a74d-5d8b1cf85e8d" />
      <assembly name="PictureRegion" version="1.10.9018.0" guid="06b5df04-393e-4be7-9107-305196fcb861" />
      <assembly name="Custom Functions" version="1.1.8726.29023" guid="18dadffd-79a3-4cf9-aee1-d66deb0ea720" />
      <assembly name="SpecialFunctions" version="1.12.9018.0" guid="2814e667-4e12-48b1-8d51-194e480eabc5" />
      <assembly name="TextRegion" version="1.11.9018.0" guid="485d28c5-349a-48b6-93be-12a35a1c1e39" />
      <assembly name="X-Y Plot Region (JXCharts)" version="0.3.9043.20036" guid="c12231ec-4873-43c1-a7d0-a167ebd17066" />
      <assembly name="Mathcad Toolbox" version="0.5.9065.32492" guid="ddc09821-49f1-4c21-a829-6499de0a8f06" />
    </dependencies>
  </settings>
  <regions type="content">
  </regions>
</worksheet>
```
