Closed TonitaN closed 1 year ago
Для логгирования Ардена нужен ещё рендер системы уравнений, если по-хорошему. Но пока подождём самого Ардена, тем более это почти даром получится из рендера формул и таблиц, если не слишком накосячить.
Наверное, это имеет смысл делать в рендеринге следующим. А ещё нулевым пунктом объяснить, какие фишки встраивания объектов средствами теха используются в рендерерах, чтобы это не выглядело как не пойми откуда взявшийся код.
tex
-исходников : логи тайпчекераДерево вычислений: библиотека dirtree
(проверьте, что подключена). Настраиваемые параметры: setlength
, DTsetlength
(не думаю, что у кого-нибудь будет время сейчас в них ковыряться). Начинается так: \dirtree{%
(обязательно с процентом, т.е. пустым комментарием в первой строчке - не надо пытаться понять КЗ-синтаксис латеха). Кончается просто фигурной скобкой. Синтаксис дерева: [точка][номер]_[заголовок] [точка]
. Здесь _
-- пробел. Номера должны быть упорядочены по возрастанию относительно первого вхождения, т.е. вот так нельзя:
\dirtree{%
.2 IlieYu N
.1 Arden.IlieYu N
}
Плюс-минус номера вложенности соответствуют индексу вложенности в тайпчекере (но порядок вывода чуть-чуть изменён). Лучше погрузить \dirtree
внутрь широкой министраницы, иначе в некоторых случаях дерево пытается строиться по ширине (магию авторазмещения в латехе тоже не надо пытаться понимать, её можно только принять).
Макрос каждого простого типа имеет имя \[имя в интерпретаторе]TYPE
. Пары (т.е. типы многоместных функций и предикатов) загоняются в макрос \pair{[аргумент1]}{[аргумент2]}
. Значок имеет тип
: \TypeIs
. Регулярка в аргументе загоняется в макрос \regexparg
(создаёт фигурные скобки чуть большего размера вокруг регулярки); макрос \regexpstr
при этом тоже нужно применять. Имена переменных загоняются в макрос \var
. Иконки имеют необязательный аргумент масштаб, поэтому в стандартном масштабе вызываются так: \[имя иконки]{}
.
В математическом режиме пробелы игнорируются. Поэтому перед открывающей круглой скобкой (началом функциональной последовательности) лучше поставить вынужденный пробел \;
.
tex
-исходников: рендер автоматовМасштабирование по странице:
\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% .
Длинные метки загоняются в array
. Для этого они разбиваются максимум на 5 строк по разделителю и все, кроме одной строки, вытаскиваются из исходника dot
перед вызовом dot2tex
(иначе от их длины посчитается размер узла, и будут огромные пустые состояния автомата). После вызова dot2tex
метки-плейсхолдеры заменяются на таблицы, сохранённые в aux
- файлах.
Метки Linearize
делаются полупрозрачными через настройку \pgfsetfillopacity{0.6}
, которое затем возвращается в норму посредством \pgfsetfillopacity{1}
. Метки Annote
остаются без прозрачности. Предполагается, что каждая метка --- это последовательность цифр, которая предварена отметкой о её типе (линеаризация или детерминизация). Отметки типов в принципе можно менять через смену рефальских константных функций IndicesAlphabet
, LinearizeSym
, AnnoteSym
. Если символ войдёт в коллизию с уже используемым другим (кроме запятой, коллизия с которой предусмотрена с учётом того, что цифры предполагаются встречающимися только в индексах), то работать разметка может неверно.
Посмотрела происходящее в ветке у Дани+Васи. По трудоёмкости это где-то 1-2 человеко-ночи рефала до полностью готовой версии по этим шаблончикам (с учётом размещения). То есть я сейчас ориентируюсь на следующий план. Беру за базу готовый tex-исходник как есть (но регулярки без разметки, чтобы было проще их анализировать), рендерю его рефалом повторно (чтобы подсчитать, как и что размещать на слайдах), и сохраняю в новый tex-исходник. Кастомизация, т.е. объекты для размещения, будет рефалом распознаваться по комментарию %template_нечто
. Всё, что перечисляется через запятую, буду считать пока что множествами.
Считаем, что делаем прототип. Если что, это потом успеется переделать не на рефале.
Расчётные размеры свободного места на слайде в иксах (с учётом заголовка):
normalsize
: 70*41small
: 76*46footnotesize
: 85*51scriptsize
: 95*58По вертикали лучше округлить вниз - с учётом нижних индексов, разных размеров скобок и прочей мишуры.
Разделители, после которых режется формула для переноса:
Если нормального разделителя в области видимости не нашлось, режем как попало (ну это уж что-то совсем патологическое с 100500 звёздочек, скобок или разметок подряд). Множество разделителей и их не-follow символов можно настроить кастомно через соответствующую константную функцию.
Separators {
= (','(NotBefore <Numbers>))
(')'(NotBefore ')*'))
('|'(NotBefore ))
('}'(NotBefore ))
('*'(NotBefore '*)'));
}
Пока что считается, что длина разделителя строго один символ. Надо будет - не проблема поменять, с рефал-стилем-то.
Принимаем оптимистичную гипотезу, что теорию рендерить и разбивать на подстроки не надо. Проблема в том, что высоту теории в юникоде (длину текста) не очень понятно как рассчитывать автоматически из-за плохой совместимости кодировок, но попробуем пока так. Достаточно сложно устроенную теорию (таблицы, вычурные формулы и диаграммы) не надо смешивать с практикой на одном фрейме, иначе разметку её высоты придётся делать вручную (и причём кому-нибудь другому). Если %begin_theory появляется между фреймами, то всё попадающее в область действия этого мета-тега не рендерится (считается, что %end_theory в этом случае тоже будет между фреймами, а если нет, всё аварийно упадёт).
Всё, что не помечено как теория, считается преамбулой к соответствующему объекту, помещаемому в шаблончик. Т.е. переносится на следующий слайд или внутрь министраницы вместе с этим объектом, чтобы не было так:
Автомат до преобразования:
[разрыв страницы, новый фрейм]
Собственно автомат
Пока размещаю на министраницах только по одному объекту. В принципе надо столько, сколько влезет по высоте. Но не на пре-альфа.
(спустя 500 строк рефала скоро уже тестирование и дебаг...)
Ну вот так выглядит авторазбиение, если появляются очень длинные формулы (на один и тот же автомат и таблицу не в тему лучше не обращать внимания, это тестовое).
Пойду залью промежуточный результат в рабский репозиторий.
Это уже почти эстетично:
Иногда есть баги с переполнениями, потому что переизобретаем мини-мини-латех. Но ради скорости работы рендеринга чего не сделать... (потом доладим)
автоматы пока не должны переноситься на новый слайд?
что-то у нас пропущено...
UPD: поняла
Иногда переполнения бывают, в основном не с автоматами, а из-за того что неточно подсчитывается длина строк. Сейчас борюсь с ними и с длинными ячейками в таблицах.
Та же тема, что у автоматных меток и диаграмм. Сейчас пока что это тот минимум рендера, который нужен, чтобы потом всё собрать в +- адекватные логи.
preview
, оно тормозит)(Но сначала шаблон для логгера...)