OnionGrief / Chipollino

преобразования регулярных выражений и конечных автоматов
Other
20 stars 4 forks source link

Рендер длинных таблиц и формул #227

Closed TonitaN closed 1 year ago

TonitaN commented 1 year ago

Та же тема, что у автоматных меток и диаграмм. Сейчас пока что это тот минимум рендера, который нужен, чтобы потом всё собрать в +- адекватные логи.

(Но сначала шаблон для логгера...)

TonitaN commented 1 year ago

Для логгирования Ардена нужен ещё рендер системы уравнений, если по-хорошему. Но пока подождём самого Ардена, тем более это почти даром получится из рендера формул и таблиц, если не слишком накосячить.

TonitaN commented 1 year ago

Наверное, это имеет смысл делать в рендеринге следующим. А ещё нулевым пунктом объяснить, какие фишки встраивания объектов средствами теха используются в рендерерах, чтобы это не выглядело как не пойми откуда взявшийся код.

TonitaN commented 1 year ago

Средства форматирования tex-исходников : логи тайпчекера

  1. Дерево вычислений: библиотека dirtree (проверьте, что подключена). Настраиваемые параметры: setlength, DTsetlength (не думаю, что у кого-нибудь будет время сейчас в них ковыряться). Начинается так: \dirtree{% (обязательно с процентом, т.е. пустым комментарием в первой строчке - не надо пытаться понять КЗ-синтаксис латеха). Кончается просто фигурной скобкой. Синтаксис дерева: [точка][номер]_[заголовок] [точка]. Здесь _ -- пробел. Номера должны быть упорядочены по возрастанию относительно первого вхождения, т.е. вот так нельзя:

    \dirtree{%
    .2 IlieYu N
    .1 Arden.IlieYu N
    }

    Плюс-минус номера вложенности соответствуют индексу вложенности в тайпчекере (но порядок вывода чуть-чуть изменён). Лучше погрузить \dirtree внутрь широкой министраницы, иначе в некоторых случаях дерево пытается строиться по ширине (магию авторазмещения в латехе тоже не надо пытаться понимать, её можно только принять).

  2. Макрос каждого простого типа имеет имя \[имя в интерпретаторе]TYPE. Пары (т.е. типы многоместных функций и предикатов) загоняются в макрос \pair{[аргумент1]}{[аргумент2]}. Значок имеет тип: \TypeIs. Регулярка в аргументе загоняется в макрос \regexparg (создаёт фигурные скобки чуть большего размера вокруг регулярки); макрос \regexpstr при этом тоже нужно применять. Имена переменных загоняются в макрос \var. Иконки имеют необязательный аргумент масштаб, поэтому в стандартном масштабе вызываются так: \[имя иконки]{}.

  3. В математическом режиме пробелы игнорируются. Поэтому перед открывающей круглой скобкой (началом функциональной последовательности) лучше поставить вынужденный пробел \;.

TonitaN commented 1 year ago

Средства форматирования tex-исходников: рендер автоматов

  1. Масштабирование по странице:

    \adjustbox{max width=\textwidth, min width=0.3\textwidth, max height=0.75\textheight}{
    ...
    }

    Параметры достаточно самодокументированы. Положим, у нас есть совсем маленький автомат, который получил комментарий (в первой строчке в файле R_inputX.tex): Width percent 34 ; Height percent 14. Это означает, что его естественный масштаб занимает такой процент от желаемого размещения на странице. Можно передавать эти аргументы в adjustbox, чтобы гарантировать, что диаграмма не займёт больше места, чем рассчитанное на неё. Например, так:

    \adjustbox{max width=0.34\textwidth, min width=0.3\textwidth, max height=0.14\textheight}{
    ...
    }

    Ну или дать "чуть больше воздуха", добавив, например, 1% .

  2. Длинные метки загоняются в array. Для этого они разбиваются максимум на 5 строк по разделителю и все, кроме одной строки, вытаскиваются из исходника dot перед вызовом dot2tex (иначе от их длины посчитается размер узла, и будут огромные пустые состояния автомата). После вызова dot2tex метки-плейсхолдеры заменяются на таблицы, сохранённые в aux- файлах.

  3. Метки Linearize делаются полупрозрачными через настройку \pgfsetfillopacity{0.6}, которое затем возвращается в норму посредством \pgfsetfillopacity{1}. Метки Annote остаются без прозрачности. Предполагается, что каждая метка --- это последовательность цифр, которая предварена отметкой о её типе (линеаризация или детерминизация). Отметки типов в принципе можно менять через смену рефальских константных функций IndicesAlphabet, LinearizeSym, AnnoteSym. Если символ войдёт в коллизию с уже используемым другим (кроме запятой, коллизия с которой предусмотрена с учётом того, что цифры предполагаются встречающимися только в индексах), то работать разметка может неверно.

TonitaN commented 1 year ago

Посмотрела происходящее в ветке у Дани+Васи. По трудоёмкости это где-то 1-2 человеко-ночи рефала до полностью готовой версии по этим шаблончикам (с учётом размещения). То есть я сейчас ориентируюсь на следующий план. Беру за базу готовый tex-исходник как есть (но регулярки без разметки, чтобы было проще их анализировать), рендерю его рефалом повторно (чтобы подсчитать, как и что размещать на слайдах), и сохраняю в новый tex-исходник. Кастомизация, т.е. объекты для размещения, будет рефалом распознаваться по комментарию %template_нечто. Всё, что перечисляется через запятую, буду считать пока что множествами.

Считаем, что делаем прототип. Если что, это потом успеется переделать не на рефале.

TonitaN commented 1 year ago

Расчётные размеры свободного места на слайде в иксах (с учётом заголовка):

По вертикали лучше округлить вниз - с учётом нижних индексов, разных размеров скобок и прочей мишуры.

TonitaN commented 1 year ago

Разделители, после которых режется формула для переноса:

Если нормального разделителя в области видимости не нашлось, режем как попало (ну это уж что-то совсем патологическое с 100500 звёздочек, скобок или разметок подряд). Множество разделителей и их не-follow символов можно настроить кастомно через соответствующую константную функцию.

Separators {
 = (','(NotBefore <Numbers>))
   (')'(NotBefore ')*'))
   ('|'(NotBefore ))
   ('}'(NotBefore ))
   ('*'(NotBefore '*)'));
}

Пока что считается, что длина разделителя строго один символ. Надо будет - не проблема поменять, с рефал-стилем-то.

TonitaN commented 1 year ago

Принимаем оптимистичную гипотезу, что теорию рендерить и разбивать на подстроки не надо. Проблема в том, что высоту теории в юникоде (длину текста) не очень понятно как рассчитывать автоматически из-за плохой совместимости кодировок, но попробуем пока так. Достаточно сложно устроенную теорию (таблицы, вычурные формулы и диаграммы) не надо смешивать с практикой на одном фрейме, иначе разметку её высоты придётся делать вручную (и причём кому-нибудь другому). Если %begin_theory появляется между фреймами, то всё попадающее в область действия этого мета-тега не рендерится (считается, что %end_theory в этом случае тоже будет между фреймами, а если нет, всё аварийно упадёт).

TonitaN commented 1 year ago

Всё, что не помечено как теория, считается преамбулой к соответствующему объекту, помещаемому в шаблончик. Т.е. переносится на следующий слайд или внутрь министраницы вместе с этим объектом, чтобы не было так:

Автомат до преобразования:
[разрыв страницы, новый фрейм]
Собственно автомат
TonitaN commented 1 year ago

Пока размещаю на министраницах только по одному объекту. В принципе надо столько, сколько влезет по высоте. Но не на пре-альфа.

(спустя 500 строк рефала скоро уже тестирование и дебаг...)

TonitaN commented 1 year ago

Ну вот так выглядит авторазбиение, если появляются очень длинные формулы (на один и тот же автомат и таблицу не в тему лучше не обращать внимания, это тестовое).

Версия с заголовками слайдов

Пойду залью промежуточный результат в рабский репозиторий.

TonitaN commented 1 year ago

Это уже почти эстетично:

rendered_report.pdf

TonitaN commented 1 year ago

Иногда есть баги с переполнениями, потому что переизобретаем мини-мини-латех. Но ради скорости работы рендеринга чего не сделать... (потом доладим)

rendered_report.pdf

mathhyyn commented 1 year ago

автоматы пока не должны переноситься на новый слайд? image

что-то у нас пропущено...

UPD: поняла

TonitaN commented 1 year ago

Иногда переполнения бывают, в основном не с автоматами, а из-за того что неточно подсчитывается длина строк. Сейчас борюсь с ними и с длинными ячейками в таблицах.