# DAT gráfico v2: fuentes, series, ejes y paneles

Estado: **operativo de punta a punta; el PARAPLOT es uno solo**. Slex genera `GLOBAL.simplot` estructurado para todas las órdenes del lenguaje, las históricas incluidas (`doc/PARAPLOT-UNICO.md`); Siru conserva ese objeto y Simplot lo valida y dibuja. Las tablas se leen mediante `interpola --exportar-simul` de Tabular2. `SIMPLOT_VERSION` ya no elige motor: se ignora con aviso, y un DAT v1 ya escrito se regenera de su `.ds` con d2datdinc.

## Uso

Desde slex 1.0-25, Simplot pide `d2datdinc --graficos`: cuando el documento sólo tiene OUTPUTS, se prepara una gráfica por variable contra la primera indicada (o contra la abscisa explícita `X:Y,Z`). No se agrega T/TIME. La adaptación sólo se solicita para dibujar: el DAT de cálculo habitual no cambia. También funciona con DAT sin DS; no sobrescribe el DAT. Si falta la tabla del mismo nombre, el diagnóstico muestra su ruta. Las descripciones gráficas explícitas conservan prioridad y versión.

El lector selecciona automáticamente el modelo que corresponde a las órdenes presentes en el `.ds` o `.ds2`; no hace falta un control de versión. El ejemplo completo está en [lineas-panel.ds](../corpus/modelo-v2/lineas-panel.ds). Se puede entregar directamente a Simplot o generar antes el DAT con d2datdinc y entregar solo ese DAT. Siru llama a Simplot por defecto al terminar y usa un pipe; `-nosimplot` lo desactiva. Calcular y dibujar siguen siendo procesos separados.

```sh
simplot_fuentes="$HOME/svn/siru/simplot"
simplot_salida=$(mktemp -d /tmp/simplot-v2-ejemplo.XXXXXX)
cd "$simplot_salida"
perl -I"$simplot_fuentes/lib" "$simplot_fuentes/scripts/simplot.pl" \
     -graf=4 "$simplot_fuentes/corpus/modelo-v2/lineas-panel.ds"
```

Simplot informa un directorio nuevo `simplot-v2-XXXXXX` con imágenes, tablas exportadas con 17 cifras y `graficos.gnu`. Cada corrida usa otro directorio: no pisa imágenes anteriores. Los originales no se modifican. Dependencias: Gnuplot, módulos Perl del README, `tabular >= 2.0-16` y `d2datdinc >= 1.0-25`. Desde el árbol usa los ejecutables hermanos compilados; instalado los busca en PATH. No se agregó SWIG.

### Órdenes de PARAPLOT traducidas hoy

Desde las fuentes r2774, con una sola fuente se admite `lineas G = X:Y,Z` o `puntos G = X:Y`. En .ds/.ds2, sin fuentes declaradas, se completa SIMULADO con la tabla homónima; también se puede escribir SIMULADO expresamente sin RESULTADOS ni declaración archivo. Una sola fuente externa declarada también permite omitir el nombre. Con varias fuentes hay que nombrarlas en cada serie: `lineas G = SIMULADO,T:TEMP` y `puntos G = MEDICIONES,T:TEMP`, declarando solo `archivo MEDICIONES = mediciones.simul`. Las referencias a SIMULADO y las declaraciones se resuelven antes de las series; omitir el nombre si resulta ambiguo produce error. Una declaración explícita de SIMULADO prevalece. El DAT resultante siempre lleva la fuente completa.

Ejemplos ejecutables: [comparacion.ds](manual/ejemplos/comparacion.ds), una fuente implícita, y [dos-fuentes.ds](manual/ejemplos/dos-fuentes.ds), fuente implícita y externa. Pruebas: tests/fuente-implicita.t. El recorrido gráfico de `.d` todavía requiere verificación específica.

| Orden | Forma y resultado |
|---|---|
| `archivo F = datos.simul` | Fuente explícita; admite ruta entre comillas, relativa al documento |
| `lineas G = F,1:A,B` | Dos series, columnas A y B contra la 1; nombres simples o índices físicos desde 1 |
| `puntos G = F,T:A` | Serie de puntos; varias órdenes sobre G acumulan series en orden |
| `titulo G = Texto` | Título de gráfico o panel; admite comillas |
| `rangox G = 0,10` / `rangoy G = -1,1` | Extremos numéricos finitos y crecientes; no expresiones |
| `ejes G = Tiempo(s),Amplitud` | Etiquetas y unidades opcionales; una unidad explícita pide conversión a Tabular2 |
| `mostrarjuntos P = G,H` | Panel vertical; referencias a gráficos, sin repetirlos ni anidar paneles |

Las mismas órdenes pueden estar en GRAFICOS/PARAPLOT y GRAFICOS_ADICIONALES. Los identificadores son sensibles a mayúsculas; las palabras clave, no. Se permiten referencias adelantadas. Los bloques, escalas log/temporal, inversión, número de columnas del panel y formatos se configuran por ahora en el DAT tipado; todavía no tienen órdenes DS propias. El DAT también admite nombres de columnas que no sean identificadores simples, siempre que Tabular2 pueda exportarlos.

RESULTADOS, UNIDADES y ANADIR_GRAFICOS están admitidos en las fuentes actuales, y las órdenes históricas (`variables`, `magnitudes`, `unipri`, `selec`, `arch_var`, `variaciones`, `funcion`, `guardar`, `nomostrar`, `eco`) se traducen todas al modelo (`doc/PARAPLOT-UNICO.md`); una orden rota corta la lectura sin publicar un DAT parcial. El JSON v1 ya existente continúa por el motor histórico; este traductor no es un conversor general de archivos DAT v1.

Esta separación es transitoria, no el diseño final del lenguaje. El objetivo acordado es un único PARAPLOT que conserve las prestaciones históricas, permita describir desde .ds todas las capacidades del modelo v2 y añada las mejoras gráficas pertinentes de Observable Plot. Véase el programa de migración «PARAPLOT único» en [PLAN-FUNCIONAL.md](PLAN-FUNCIONAL.md). La compatibilidad no se declarará completa ni se retirará el motor histórico antes de verificarla con el corpus.

### PARAPLOT: barras de error con límites dados por el productor

Disponible en las fuentes de Simplot y slex desde r2760; los paquetes anteriores no incorporan esta ampliación. No se agregan estadísticas ni transformaciones numéricas a Simplot. Los extremos vienen en columnas de la misma tabla que el punto.

    puntos MEDICION = DATOS,X:Y,limites_y=YMIN:YMAX
    puntos MEDICION = DATOS,X:Y,limites_x=XMIN:XMAX,limites_y=YMIN:YMAX
    lineas CURVA = DATOS,X:Y,limites_y=YMIN:YMAX

Las opciones se escriben después de X:Y; con límites se admite una sola serie por orden. Para superponer, repetir la orden con el mismo nombre de gráfico. También se permiten índices de columnas, por ejemplo limites_y=3:4. Las órdenes sin límites conservan su significado.

| Aspecto | Contrato |
|---|---|
| Valores | Límites absolutos inferior/superior, simétricos o asimétricos respecto del centro; no deltas ni porcentajes |
| DAT | Campos opcionales limites_x y limites_y en cada serie; cada uno tiene inferior y superior, ambos selectores de columna |
| Correspondencia | Centro y extremos en la misma fila y fuente |
| Validación | Valores finitos e inferior <= centro <= superior; igualdad permitida |
| Unidades | Centros y límites deben llegar a la misma unidad; toda conversión la hace Tabular2 |
| Temperatura | Límites absolutos con tempC/tempF, no intervalos degC/degF; se convierte también el origen |
| Logaritmos | Se exige positividad de centros y extremos |
| Dibujo | puntos usa x/y/xyerrorbars; lineas usa x/y/xyerrorlines; un estado aislado mantiene sus barras |
| No incluido | Cálculo de incertidumbres, medias, desviaciones, porcentajes ni bandas rellenas |

Ejemplo de campo DAT:

    "limites_y": {
      "inferior": {"nombre": "YMIN"},
      "superior": {"nombre": "YMAX"}
    }

Si el eje declara una unidad, se convierte cada columna a esa unidad. Sin unidad explícita del eje, se usa la del centro; si todas carecen de unidad se admiten valores numéricos sin unidad declarada. Una unidad de origen ausente que impida convertir no se inventa. Las tablas originales no se modifican.

Corpus: [barras-error](../corpus/barras-error/README.md). Pruebas: tests/barras-error.t, incluyendo .ds -> DAT -> dibujo, DAT independiente y transporte por stdin.

### RESULTADOS y UNIDADES

RESULTADOS es la sintaxis ultrasimple de PARAPLOT: el campo interno `resultados` conserva un pedido abreviado hasta disponer de los metadatos necesarios para expandirlo a series y gráficos. No define un lenguaje ni un motor de dibujo independiente. La lista de variables y la descripción explícita son grados de detalle del mismo pedido; deben mantener reglas de expansión y combinación documentadas.

La cadena es **Simplot → Tabular2 (`interpola --exportar-simul`) → libunidades → GNU units**. Se requiere Tabular2 2.0-16 con `--unidad`, `--unidad-origen` y `--magnitud-origen`; el mínimo histórico 2.0-14 no alcanza para estas opciones. Simplot no mantiene factores ni algoritmos de conversión.

| Unidad | Significado |
|---|---|
| `tempC`, `tempF` | Temperatura absoluta Celsius/Fahrenheit; incluye el desplazamiento del cero |
| `K` | Kelvin |
| `degC`, `degF` | Intervalos de temperatura; no desplazan el cero: 10 degC = 18 degF = 10 K |
| `C`, `F` | Coulomb y farad, incluso si la magnitud dice «temperatura» |
| `s`, `min`, `km/hr` | Nombres y expresiones de GNU units |

No se traducen alias propios como `seg` o `gradosC`. Los archivos históricos que escribían `C` para Celsius necesitan corregir explícitamente ese metadato a `tempC`. Cambiar la leyenda o la magnitud no cambia la unidad de origen. Una conversión incompatible, desconocida o sin origen produce error; los archivos originales no se modifican.

En unidades compuestas térmicas se usa `K` o una unidad de intervalo, por ejemplo `W/(m^2*K)`, no la función `tempC`. En los metadatos se escribe `tempC`; `tempC(20)` es una expresión de GNU units, no el nombre de la unidad de una columna. Explicación y ejemplo completo en `manual-extraido/unidades.tex`.

```text
RESULTADOS
A(Interior,temperatura,tempF), B(Exterior,temperatura,tempF)
UNIDADES
plantilla=Generico
A:tempC,temperatura
B:tempC,temperatura
```

UNIDADES aporta el origen `tempC` sólo cuando falta en los metadatos de la tabla; RESULTADOS pide presentar `tempF`. Si la tabla ya declara otra unidad, ésa es el origen. Se admite una plantilla explícita y reglas `PREFIJO:unidad,magnitud[,alias]`; no se inventa una plantilla térmica por defecto. El alias es otro prefijo de selección, no una unidad ni una traducción desde `.tvar`. Varias plantillas distintas o reglas coincidentes se rechazan.

RESULTADOS acepta nombres o índices, solos o con `(leyenda,magnitud,unidad)` y campos omitidos. Sin fuente SIMULADO explícita se usa el nombre base del documento con extensión `.simul`. Al cargar las tablas, Simplot agrupa por magnitud/unidad (incluso pedidos no consecutivos), conservando el orden de primera aparición. Para leyenda, magnitud y unidad de presentación, lo explícito prevalece sobre los metadatos, y éstos sobre UNIDADES. El origen numérico siempre viene de la tabla o, si falta, de la regla: nunca de la unidad de presentación.

Las órdenes principales de PARAPLOT/GRAFICOS reemplazan RESULTADOS salvo `ANADIR_GRAFICOS=1`; GRAFICOS_ADICIONALES lo conserva. Esto también se aplica si la única orden principal es `archivo`: para redefinir SIMULADO manteniendo RESULTADOS se debe indicar `ANADIR_GRAFICOS=1`. No se genera el DAT con gráficos incompletos por una orden no soportada.

### Estados sin tiempo y punto único

```sh
simplot --pares estado.simul
simplot --pares --columnas TEMP,TBH,WWW --directorio dibujos estado.ds
simplot --pares --fuente MEDIDAS --bloque 2 --formatos png,pdf estado.dat
```

`--pares` dibuja todas las combinaciones distintas de dos columnas, con puntos. Acepta tabla, DS/DAT v2 u OUTPUTS sin PARAPLOT; para un documento v1 se puede entregar la tabla directamente. Con varias fuentes hay que indicar `--fuente`. `--columnas` acepta nombres exactos o índices desde 1, sin repetidos. Se limita a 2–12 columnas por pedido y agrupa en paneles de hasta 15 proyecciones con resolución proporcional al tamaño. No interpreta ningún eje como tiempo ni deduce trayectorias o relaciones causales de las filas.

El campo opcional `pares` contiene objetos `{ "id": "ESPACIO", "fuente": "PSICRO", "columnas": [{"nombre":"TEMP"},{"nombre":"WWW"}] }`. `columnas` es opcional (todas si se omite). `graficos` y `paneles` pueden estar vacíos: el renderizador los completa tras cargar la tabla con Tabular2. `corpus/psicro-punto/espacio.dat` es un ejemplo listo para ejecutar.

PARAPLOT selecciona variables cualesquiera con `X:Y`; no requiere TIME ni supone que x es tiempo. LISTA/RESULTADOS usa la primera columna por defecto, sin cambiar su significado. [psicro-punto](../corpus/psicro-punto/README.md) prueba WWW contra TBH y PV contra TEMP con una sola fila. Se recomienda `puntos` para estados aislados; v2 también representa `lineas` con un marcador cuando sólo hay una muestra, sin duplicarla. Dos o más muestras mantienen el estilo pedido. El motor v1 requiere `puntos` explícito para este caso.

## Objetivo y límites

| Modelo v1 | Modelo v2 |
|---|---|
| Órdenes con `comando`, `objeto` y `valor` textual | Fuentes, gráficos, series, ejes y paneles con campos tipados |
| El motor vuelve a interpretar listas dentro de `valor` | Los selectores de columnas y las referencias ya tienen estructura |
| GRAFICOS reemplaza/agrega sobre RESULTADOS al procesar | Slex decide si conservar RESULTADOS; Simplot completa sus grupos con los metadatos de Tabular2 |
| Puede contener funciones y rangos interpretados por el motor histórico | El subconjunto inicial solo contiene referencias a datos y rangos numéricos; no fórmulas ejecutables |

El procesamiento numérico general corresponde a [Tabular2](../../tabular2/doc/PLAN-PROCESAMIENTO-NUMERICO.md). El modelo gráfico consume columnas ya obtenidas. No define operaciones `eval`, FFT, integral ni transformación: cuando exista el contrato numérico de Tabular2, se acordará cómo referenciar sus resultados, sin inventar ahora otra API ni serializar código Perl/Gnuplot.

## Esquema inicial

Todos los campos no enumerados se rechazan; las listas conservan su orden. `null` no sustituye campos opcionales: se omiten. Números y booleanos deben ser valores JSON de esos tipos, no textos como `"2"` o enteros que suplanten booleanos. Solo se admiten números finitos.

| Objeto | Obligatorios | Opcionales | Reglas |
|---|---|---|---|
| `GLOBAL.simplot` | `version: 2`, `fuentes: []`, `graficos: []`, `paneles: []` | `salida`, `resultados`, `pares`, `automatico`, `mensajes` | Al menos una fuente; gráficos puede estar vacío si hay resultados, pares o `automatico: 1`; paneles puede estar vacío; `mensajes` es la lista de textos de `eco`, que salen por stderr al terminar |
| Pedido de pares | `id`, `fuente` | `columnas: []` | Fuente existente; selectores sin repetir, 2–12 columnas al resolver; paneles de hasta 15 pares |
| Resultados | `fuente`, `series: []`, `defectos: []` | `plantilla` | Fuente existente y al menos una serie solicitada |
| Serie solicitada | `columna` | `leyenda`, `magnitud`, `unidad` | Selector de columna y metadatos opcionales |
| Regla de UNIDADES | `prefijo`, `unidad`, `magnitud` | `alias` | Prefijos únicos; coincidencias múltiples fallan al resolver columnas |
| Fuente | `id`, y `archivo` **o** `seleccion` | `bloque`, `tabla`, `columnas`, `leyendas`, `magnitudes`, `unidades`, `indices`, `unipri`, `arch_var`, `variaciones` | Ruta literal; identificación de una tabla sin leerla en esta etapa. Los metadatos declarados (las órdenes históricas `sceptrevars`→`columnas`, `variables`→`leyendas`, `magnitudes`, `unidades`) son listas de textos por columna y prevalecen sobre la cabecera; `indices` da la columna de cada posición declarada (enteros desde 1, sin repetir); `unipri` es la unidad en que se muestra la primera columna si el eje no pide otra; `arch_var` lista los archivos de cada corrida de un rerun (la principal primero) y `variaciones` sus rótulos desde la segunda |
| Selección | `de`, `columna`, `min`, `max` | — | El `selec` histórico: la fuente es `de` recortada a las filas con `columna` entre `min` y `max` (números finitos, `min <= max`); `de` existente, puede ser otra selección, sin ciclos |
| Selector de bloque | `indice` **o** `nombre` | — | Exactamente uno; índice entero desde 1 o nombre textual no vacío |
| Gráfico | `id`, `ejes`, `series: []` | `titulo`, `salida`, `mostrar` | Al menos una serie; `ejes` contiene exactamente `x` e `y`; `salida` (el `guardar` histórico) es el nombre de los archivos del gráfico, único entre dibujos; `mostrar: 0` (el `nomostrar`) no abre ventana y los archivos se escriben igual |
| Serie | `id`, `tipo`; con `lineas`/`puntos` además `fuente`, `x`, `y`; con `funcion`, `expresion` | `leyenda`, `limites_x`, `limites_y` | `tipo`: `lineas`, `puntos` o `funcion`; cada coordenada es un selector; cada límite contiene `inferior` y `superior`, también selectores. Una serie `funcion` es una curva analítica en `x` —sólo letras, dígitos, `+ - * / ^ , . _` y paréntesis balanceados, sin comillas— y no lleva fuente, columnas ni límites |
| Selector de columna | `indice` **o** `nombre` | — | Exactamente uno; índice entero desde 1 o nombre literal no vacío |
| Eje | `escala` | `etiqueta`, `unidad`, `rango`, `invertido`, `base`, `zona` | Escala `lineal`, `log` o `temporal`; opciones específicas según escala |
| Panel | `id`, `graficos: []` | `titulo`, `columnas`, `salida` | Referencias a gráficos existentes, sin repeticiones; no contiene paneles; `salida` como en los gráficos |
| Salida | `formatos: []` | `ventanas` | Lista no vacía, sin repetidos, de `png`, `eps`, `pdf`, `svg`; ventanas es booleano |

### Identificadores y textos

- Identificadores: `[A-Za-z_][A-Za-z0-9_.-]*`, sensibles a mayúsculas. No son rutas ni etiquetas. Fuentes tienen su espacio de nombres; gráficos y paneles comparten otro; las series tienen identificadores únicos en todo el modelo.
- Etiquetas, títulos, unidades, rutas y nombres de columna son textos, no expresiones. Se rechazan caracteres de control. Títulos/etiquetas/leyendas/unidades pueden estar vacíos; rutas y nombres de columna/bloque, no.
- No aplicar mayúsculas al nombre físico de un archivo ni de una columna. Una futura migración general de v1 deberá resolver su normalización histórica y detectar colisiones, sin cambiar este contrato.
- Las rutas relativas se resuelven contra el documento DAT, no contra el directorio desde el que se ejecuta Simplot. El modelo no copia tablas ni rebasa rutas al exportarlo: esa operación requiere contexto externo.

### Columnas y tablas

- `indice` cuenta columnas físicas desde 1; el renderizador lo mantiene al usar las columnas del archivo exportado por Tabular2.
- `nombre` identifica una columna literal de la fuente seleccionada. El renderizador comprueba su existencia/unicidad y los límites de un índice después de abrir la tabla; no lo hace `Modelo::validar`.
- Una serie toma ambas coordenadas de una misma fuente/bloque. Comparar corridas significa varias series; hacer operaciones entre ellas corresponde a Tabular2 y exige política de alineación.
- Sin `leyenda`, se usa el nombre descriptivo de la columna Y; una leyenda vacía omite su texto.
- El renderizador resuelve `bloque.indice` mediante la exportación de Tabular2, sin mezclar corridas. Si hay más de un bloque y falta el selector, falla. `bloque.nombre` está previsto en el esquema pero se rechaza al dibujar: falta esa interfaz de Tabular2.

### Ejes y paneles

- `rango: [minimo, maximo]` tiene dos extremos estrictamente crecientes. Para invertir el eje se usa `invertido: true`, sin invertir ni reordenar los datos.
- En escala `log`, el rango explícito debe ser positivo; `base`, si se indica, debe ser positiva y distinta de 1. El renderizador rechaza cualquier valor no positivo de las columnas representadas, incluso fuera del rango visible; no lo descarta silenciosamente.
- En escala `temporal`, las coordenadas son segundos epoch. Si la tabla declara otra unidad temporal, Tabular2 la convierte a `s` antes de calcular las marcas; si no declara unidad, se asumen segundos por el contrato temporal. La unidad explícita del eje, si existe, debe ser `s`, y el rango se expresa en segundos. `zona` es `local` o `UTC`; por defecto se usa la zona de la máquina. Se colocan seis marcas con fecha/hora (una para rango constante); faltan ajuste por meses/años y densidad sofisticada de etiquetas.
- `unidad` expresa una unidad de presentación de GNU units. El renderizador pide la conversión a Tabular2 antes de dibujar y comprueba que la exportación tenga la unidad solicitada. La compatibilidad física y el cálculo los resuelve libunidades; no se cambia sólo el rótulo.
- Un panel ordena los gráficos según su lista, de izquierda a derecha y luego por filas. `columnas` es un entero positivo no mayor que la cantidad de gráficos; si se omite, disposición vertical de una columna. No se permite anidar paneles, con lo que no puede haber ciclos de paneles.
- Se emiten todos los gráficos individuales y los paneles. Por defecto se generan PNG y EPS, sin ventanas. `salida.formatos` cambia los formatos y `salida.ventanas: true` agrega X11; `-graf=4` o `-sinventana` lo deshabilitan. La interacción `-i`/`-graf=1` aún se rechaza en v2. Las otras opciones históricas no controlan este motor; no genera `.gra` ni `.hashplot`.
- Los terminales son `png`, `postscript eps`, `pdfcairo` y `svg`. Un terminal ausente o un error de Gnuplot produce fallo, no sustitución silenciosa. Puede quedar el directorio con el guion y salidas parciales para diagnóstico; no se anuncia éxito hasta verificar todos los archivos.
- Los textos y rutas se escapan; se rechazan backticks y controles. No se aceptan órdenes ni expresiones ejecutables del documento. Esto no convierte la ruta histórica v1 ni los programas externos en un sandbox.

## Ejemplo y validador

El ejemplo completo, dentro de un DAT, es [lineas-panel.dat](../corpus/modelo-v2/lineas-panel.dat): dos gráficos, una serie de puntos y dos de líneas, reunidos en un panel. Sus coordenadas usan tanto índices como nombres; la tabla está en el corpus y no está embebida en el DAT.

Interfaz Perl disponible:

```perl
use SimPlot::Modelo;
my $modelo = SimPlot::Modelo::validar($dato->{GLOBAL}{simplot});
```

Devuelve una copia independiente; no modifica la entrada ni completa valores implícitos. Ante error lanza una excepción que comienza con `Modelo Simplot:` e identifica el campo. No consulta archivos, no cambia directorios, no necesita slex/Tabular2/Gnuplot y no evalúa fórmulas. El llamador decide cómo informar el error.

```sh
prove -v tests/modelo.t
```

Las 38 comprobaciones estructurales incluyen copia independiente, tipos JSON estrictos, referencias ausentes, duplicados, columnas ambiguas, rangos inválidos, paneles anidados y rechazo de cálculos embebidos. `Dato::secciones` sigue siendo solo v1; la consola deriva v2 a `Render::dibujar`. `tests/render-v2.t` prueba el recorrido real, incluidas las firmas de los cuatro formatos, el DS directo, el DAT sin DS y la conservación del objeto en Siru.

## Compatibilidad y próximos entregables

| Paso | Estado / trabajo |
|---|---|
| Modelo y validación estructural | Implementados en `lib/SimPlot/Modelo.pm` |
| Conversión general v1 → modelo | Pendiente; solo se traduce el subconjunto DS enumerado, bajo selección explícita |
| Tablas y validación contextual | Implementadas vía Tabular2: columnas, bloques por índice, unidades, conversión de presentación y dominio de escalas; falta bloque por nombre |
| Backend tipado | Implementado en `lib/SimPlot/Render.pm`: líneas/puntos, ejes, paneles, PNG/EPS/PDF/SVG |
| slex → v2 | Implementado en `slex/d2datdinc/simplot_v2.inc`; Siru conserva el objeto sin cambiar sus ecuaciones |
| Activación | Operativa y probada en fuentes y DEB instalado en contenedor; Simplot -3 publicado como inestable. Falta publicar las dependencias mínimas slex 1.0-25 y Tabular 2.0-16; ver PAQUETES.md |

V1 sigue funcionando por la ruta existente, con sus límites de seguridad documentados. No se declara compatibilidad completa del traductor v2 con todo el corpus histórico. Las operaciones numéricas futuras se agregarán a Tabular2; su primer paso sigue siendo T0, exponer las seis operaciones existentes mediante una interfaz reutilizable.

Esta v2 forma parte del paquete Simplot 2017.0.2.R1017-3 publicado como inestable el 9 de octubre de 2026; no se promovió a estable ni se completó la publicación de sus dependencias mínimas. Barras de error, bandas, ejes secundarios y estilos requerirán campos tipados, validación y pruebas propios; hoy se rechazan como desconocidas. El plan completo está en [PLAN-FUNCIONAL.md](PLAN-FUNCIONAL.md) y el manual integrado en [manual/simplot.tex](manual/simplot.tex).
