Closed TonitaN closed 1 year ago
Постпроцессинг latex
пока идёт лесом, т.к. в связи с Antimirov
и MergeBisim
всё равно нужны длинные метки и разбивка, и оно стоило того, чтобы его сделать.
Можно с чистой совестью включать какую-нибудь подобную картинку в тезисы.
Большая часть времени убита на взаимодействие всего этого дела с latex
и dot2tex
(ох уж эти относительные зависимости в питоне :( ). Попытка обойтись без препроцессинга, только одной постобработкой, дала крайне печальные результаты. Поэтому пока только в режиме Preprocess -> dot2tex -> Postprocess
нормально получилось.
Скрипты ниже. В них есть похожие куски в синтаксическом разборе, т.к. существует гомоморфизм tikz
в dot
(увы, не наоборот, иначе бы было всё совсем просто), и по идее нужно сделать разбор по параметризованной грамматике. Но дедлайн 6 утра через час, и вообще лнь.
[Долой из EDIT-ов старые версии]
HeaderColor
должен быть установлен в преамбуле. У меня так:
\definecolor{HeaderColor}{rgb}{0.85,.86,0.95}
Остальная преамбула (включая прочие цвета) подойдёт, например, из слайдов про бисимуляцию (а вообще нужно всё-таки сделать расширяемую преамбулу).
Скрипт запуска под виндой:
set arg=%1
refgo Preprocess+MathMode %arg%".dot" 2>error_refal
dot2tex -ftikz -tmath "Mod_"%arg%".dot" > %arg%".tex" 2>error_dot2tex
refgo Postprocess+MathMode %arg%".tex" 2>error_refal
После него остаются промежуточные метаданные, но добавить их стирание не проблема (кстати, стирать перед новым запуском их нужно обязательно, т.к. на их наличие смотрит постпроцессор), а дебажить было сильно проще.
EDIT: Откорректирована яркость цветов в стилях и ещё пара косметических изменений (про ловушку). +исправлена документация
Как показали эксперименты, расчёт министраниц и переносов лучше делать от разницы по горизонтали и вертикали положений узлов, а не от их числа. Потому что бывают очень сплющенные автоматы, а бывают растянутые (например, однозначные Глушковские). Но это пока улетает в TODO, в тезисы всё равно картинки вставляются не так.
Да! Эксперименты показали, что препроцессинг рулит по скорости. --autosize
в dot2tex
работает оооооооооочень долго, а рефал даёт пренебрежимо малую задержку (несоизмеримо быстрее, чем даже базовый dot2tex
). В целом скорость приемлемая и не бесящая даже для автоматов из 50 состояний.
На светлое будущее
tikz
сделать нижний слой и прорисовать пути к ним жирным прозрачным карандашом, см стр.31 здесь)nw:ne
в графвизе лагает, в tikz работает лучше)tikz
(с длинными метками это работать не будет, с короткими - возможно будет)Не в шапке, чтобы не пугать себя объёмом TODO.
При автозуме вариант корректного размещения на слайде логично писать в комментарии к Latex - исходнику с диаграммой либо ещё как-то дополнительно (не сразу в include). Т.к. если диаграмму можно вписать в министраницу, то ещё нужно проверить, а впишется ли в министраницу соседняя с ней, а если переносить на сдедующий слайд, то это нужно делать вместе с поясняющим текстом. По комментариям + шаблону уже возможно построить окончательный вариант размещения.
Читаем pagedata
--- сколько процентов от ширины и высоты фрейма сжирается по умолчанию (например, 50 ; 80
). В итоговом исходнике первой строкой --- комментарий, в котором указано, можно ли пользоваться дефолтным размещением автомата по горизонтали и по вертикали, и какой процент от рассчитанного размещения (дефолтного или сброшенного) приблизительно будет занимать диаграмма. Чтобы этот процент можно было использовать как входные данные для соседней с ней диаграммы.
Т.к. часто диаграммы очень растянутые, и две нормально помещаются на одном фрейме, но друг под другом и с большим уменьшением. Если они компактные, то адекватное размещение подразумевает министраницу. Если одна компактная, а другая длинная - вот в этом случае получается фигня, но она так или иначе получится.
Какая-то случайная последовательность автоматов с очень длинными и очень широкими и с небольшими:
R = {(a|b)(ba|aab|bc)*(ab|cb)(ca|aab|bca)*(a|)} !!
A4 = MergeBisim.Antimirov R !!
A5 = Minimize.Determinize.RemEps.Thompson R !!
R2 = {a|ba|aa*} !!
A6 = Reverse.Reverse.Antimirov R2 !!
A7 = Minimize.Determinize.Glushkov R2 !!
Результат на pagedata
: 48; 75
DummyTest4875.pdf
Результат на pagedata
: 48; 50
DummyTest4850.pdf
Результат на pagedata
: 60; 50
DummyTest6050.pdf
Результат на pagedata
: 80; 85
DummyTest8085.pdf
Многие автоматы повторяются, потому что тупо взяты из старого логгера все подряд.
Первый параметр pagedata
--- предельно допустимая ширина для вписывания в министраницу. Если он больше 49, то он нагло игнорируется, т.к. две такие параллельные министраницы наверняка не вместятся и поедут. Второй параметр pagedata
--- сколько места на слайде в высоту максимум должна занимать диаграмма, если она не переносится на новую страницу.
Итоговый векторный тайпсет кажется приемлемым, кроме очень больших в высоту диаграмм, в которых ничего не разобрать даже при максимальном выделении им места на слайде. В случае таких диаграмм спасёт только переход в текстовую форму, который обычно не нужен. Поэтому нормально, если чрезмерно высокая степень переполнения будет вызывать предупреждение, что масштаб нечитаемый. Логгер для логгера )
Для (не)рабской силы. Расшифровка pagedata
с точки зрения логов (соответствующие проценты желательно оставить в метаданных - комментарии сразу после \begin{frame}{имя}
в шаблонах):
pagedata
(или оба сразу) делаем чуть меньше 50 А больше чем две диаграммы на слайде вряд ли будут нужны, тем более в кратких логах.
Про хранящиеся в кэше автоматы: по идее, достаточно сохранить имя tex
-исходника (после альфа-преобразования и стирания разметки) в логгере языка (???). И дальше при обращении к кэшу просто \input{cached_diagram_name}
.
В архиве нет Preprocess
Уже теперь должно быть)
На всякий случай напомню:
dot2tex
, который качается pip
, лагает! Нужно брать исходники из репозитория тутAux_input{i}.data
и L_input{i}.tex
, а также Meta_input{i}.data
нужно удалять перед новыми запусками, т.к. на их наличие смотрит Postprocess
.От рефал-юникода зависеть вроде как не должно, все образцы читают только ASCII. Кое-где это нехорошо (в шапке таблицы-легенды), но нет у меня юникод-рефала :'-(
Если кто-то вдруг потестить захочет, то воть тык. Проверили, на данной версии отрабатывает корректно.
Эдгару привет ) Лабу сдать всё равно придётся.
И ещё немного прекрасного от студентов иу9 по теме дня:
Кстати говоря, (не)раб согласен и уже приступил. (Рефал мы ему уже поставили) Завтра консультация в 14 в 309ю? а то 1я группа не в курсе)))
EDIT: да.
В 14 в 330.
EDIT: Скромно так всё спряталось в EDIT-ы.
Кстати говоря, (не)раб согласен и уже приступил. (Рефал мы ему уже поставили) Завтра консультация в 14 в 309ю? а то 1я группа не в курсе)))
EDIT: да.
Тогда зону обновлений рефал-рендера логично переместить в нерабский репозиторий, т.к. там будет более актуально согласование с рендерингом (эх, кто бы ещё ревьюил рефал-код? @xtoter , не хотите попробовать?). Но шаблон для тайпчекера у меня первый приоритет, когда закончу с лабами и РК (и его тоже с рефалом придётся согласовать из-за таблиц, поэтому пока что на плантацию не переезжаю).
Если подразумеваются коммиты, то не возражаем. а если только issue, то лучше остаться в этом репозитории, чтобы все оставалось в одном месте. я максимум могу только тестить как работает..... (второй репозиторий(fork) был создан, чтобы не давать лишних прав не участникам проекта)
Если оперативно что-то фиксить и согласовывать, то удобнее коммитами, т.к. всё время сидеть в EDITах - это конечно наше всё, но рефал github не считает нормальными файлами, и аттачить его приходится через стиль девятки (ака .pdf.doc.pdf
). Но пока рано об этом, решим, когда перейдём непосредственно к генерации.
К тому же issue
вроде перемещаются, так что можно будет по необходимости сделать рефал-~бэд~-трип.
EDIT: Увы, бэд трип отменяется, можно переместить рефал-топики только в другой репозиторий Андрея ))
Я тут почитала wiki и поняла, что если пока остаётся рефал, то нужен скрипт, который бы взял на себя часть технических моментов. Для эстетов можно сделать в докере вместе со сборкой основной части проекта ))) А именно, что нам нужно:
tex
-исходник, а его автоматическая трансляция в pdf - уже приятное дополнение.Если никому не будет охота, постараюсь скрипт или докерфайл хотя бы для внутреннего пользования сделать ближе к релизу. Но обещать не могу, есть и другие задачи (
Ой, я бы взял🙃
Ок, берите, будет +2 балла ))
Только рефал, видимо, правильнее конкретно для установки под линукс брать для архитектуры x64, - тот, с которым вы работали на практике. В версии 2008 года поддерживается только архитектура x32, насколько я понимаю.
Ну тут неясен вопрос что по лицензиям, правам и вообще, ибо 2008 года открыто публиковался (может взять любой желающий), а вот х64 я конечно вижу где взять (и вообще много его версий в одном месте вижу, хоть и видеть не должен), но все-таки прав на него у меня нету, и насколько хорошо его указывать в проекте и вообще куда-то выкладывать вопрос открытый(не знаю как там принято в сообществе). (Возможно стоит взять вариант Маздайщика, ибо там все красиво на гите, но не пробывал его запускать)
Есть такая проблема (( Если x32 будет неадекватен, придётся пока взять 5-лямбда (и всё-таки надеюсь, мы с вами дождёмся официального юникод-рефала x64 в ближайшем будущем ^_^ т.к. чистый пятый намного компактнее).
Ошибка при вставке таблицы:
(В моём репозитории: ветка refal)
UPD: Исправлено)
В заголовке tex есть две следующие строки?
\PassOptionsToPackage{table}{xcolor}
...
\definecolor{HeaderColor}{rgb}{0.85,.86,0.95} % или любой другой RGB
Для xcolor
должен быть либо подключён xcolor
, либо так:
\usepackage{graphicx}
\usepackage{color}
(пакет graphicx
подгружает xcolor
, и если он подключён, то при подключении xcolor
непосредственно может быть ошибка, поэтому я в преамбуле использую хак с передачей дополнительного параметра table
)
Ошибка при вставке таблицы:
(В моём репозитории: ветка refal)
А где там эта ветка? 👀 Мне не видно.
добавил
Предлагаю всю математическую разметку делать с помощью рефала пока что:
Конечно, можно и двумя способами: что-то рефалом, что-то внутри модуля логгера. Если рефал потом будет что-то разрезать для масштабирования, что нам стоит дополнить его ещё одним уровнем рефал-стиля? Элементарно!
добавить раскраску узлов по группам из метаданных и порождение необходимых цветов с помощью xcolor
как должны эти метаданные выглядеть и где должны находиться?
Они в dot-файле, после описания узла или стрелки, выглядят как комментарии: /*'group'[ID]*/
. [ID] любое слово непустое, может быть общим у узлов и стрелок. По каждому id порождается свой цвет. Перед group и после открывающего значка комментария может стоять ещё что-нибудь, но пока что оно не учитывается.
хм, тогда автоматы будут доставаться не из кэша N = MergeBisim.Glushkov {a*a}
(в MergeBisim автомат "до" будет отличаться от выходного после Glushkov из-за раскрашенных состояний)
Да, по идее в кеш не надо класть раскрашенные. А вроде пока нигде ничего не раскрашивается?
Да, по идее в кеш не надо класть раскрашенные. А вроде пока нигде ничего не раскрашивается?
Нет((
Если думать, как это сделать в AutomatonToImage
, возможно, ему стоит передавать множества выделенных в группы состояний отдельным параметром. Если этот параметр пуст, то ничего не раскрашивается и всё делается как раньше. Это сильно проще, чем рефакторить структуру автомата, чтобы она хранила ещё метаданные. В принципе, стрелки тоже раскрашиваются рендерером, но их множества передавать будет уже не так удобно.
Поддерживаю. Лучше сделать для AutomatonToImage
свой условный to_txt с параметрами, чем каждый раз создавать раскрашенные копии автоматов только для отображения.
Ну в общем да.
Кэш + наложение цветов =) (спасибо вектору)
Конвертер из исходного
dot
в промежуточное представлениеdot
)dot2tex
(она захардкожена :( - если не найдётся решения лучше, придётся перезаписывать в постпроцессинге)Постпроцессинг
tikz
xcolor
(максимум 17 разных стилей, надо будет добавить предупреждение, что больше нет, да и не очень понятно, как большее количество различить на глаз)dot2tex
, иначе без режимаautosize
получится фигня, а этот режим использует пакет превью и работает меееедленно)Постпроцессинг
latex
latex
-код (это уже более общая задача, которую пусть решает кто-нибудь другой 🦧).Прототипы рендера в одном архиве:
добавлена настраиваемая поддержка разметки Annote и Linearize и перегрузка запятой