lev135 / finetex Goto Github PK
View Code? Open in Web Editor NEWFineTeX is a simple lang for math document preparation translatated into LaTeX
License: The Unlicense
FineTeX is a simple lang for math document preparation translatated into LaTeX
License: The Unlicense
Это должно (незначительно) улучшить производительность, а также повысить возможности использования стандартных функций для Map. Также везде надо добавить проверки на повторное добавление элемента (=redeclaration) с выводом соответствующей ошибки
Такой код не работает:
@Proof
# first of all
# second
В то же время это необходимо, чтобы список начинался не сразу после слова "доказательство", а на следующей строчке
Кажется дефолтный запуск должен выглядеть примерно так:
texgen ./examples/example.ttex // for processFile "./examples/example.ttex" "./examples/example.tex"
Предполагаемые опции:
-o output
-w --width page width
--noPretty disable pretty-printing (all lines will be splitted as in input file
-t --tabSize indentation step size
В align если & не расставлены ставить их перед началом следующей строки и в позиции над ней:
> a + b = c
> = d + e
\begin{align*}
a + b &= c \\
&= d + e
\end{align*}
Это делать, видимо, придётся на стороне Haskell, а в gentex-определение подсовывать магию какую-то. Т. е.
@Prefs
> = @TexBeginEnd align* @Math @AlignMagic
пока не придумал лучшего способа оформить это в рамках простого языка.
Без юникода всё работает:
Simple nclosed formula: `a + b = c
tmp.ttex:1:36:
|
1 | Simple nclosed formula: `a + b = c
| ^
unexpected newline
expecting '`'
Однако, если есть Юникод:
Unicode unclosed formula: `a + b ≡ c
вывод не сильно информативный
tmp.ttex:1:38:
|
1 | Unicode unclosed formula: `a + b texgen.exe: <stdout>: commitBuffer: invalid argument (invalid character)
Та же проблема с неопредленённым префиксом:
tmp.ttex:1:38:
tmp.ttex:1:3:
|
1 | > a + b = c
| ^
Unexpected prefix: >
tmp.ttex:1:3:
|
1 | > a + b texgen.exe: <stdout>: commitBuffer: invalid argument (invalid character)
Код
@Section "section-name
...
должен выдавать понятное сообщение expected ", found <newline>
Для этого нужно написать полноценный main, в котором принять в качестве аргументов командной строки адрес исходного файла и куда записать полученный .tex и вызвать уже готовую функцию ProcessFile.
Должно быть несложным упражнением. Для парсинга аргументов командной строки, возможно нужно использовать OptParse
Файлы определений не должны ничего выводить, только определять команды/окружения. В них также явно надо указывать, что экспортировать
При импорте предполагается явно указывать, что именно импортировать. Для быстрого импорта целого набора команд использовать экспорт-наборы
Сейчас импортируемые файлы ищутся лишь в текущей директории. Должен быть способ задать директорию для стандартных файлов. Пока, правда, это не очень актуально ибо этих стандартной библиотеки не существует
Предлагаю передавать парсеру элементов окружения (в частности, абзацев) sc-парсер, чтобы тот автоматически проверял, что мы хотя бы за внешний отступ не вышли. В общем, надо ввести строгие правила: кто за что отвечает
Кроме поддержки собственно парсером (не уверен, насколько умеет MegaParsec обрабатывать Unicode) нужно ещё сделать/подобрать extension для VsCode для ввода этих самых символов.
Судя по всему, Agda-mode реализует что-то типа того, что нам нужно. Но там ещё куча всего про Агду и отделить, наверное, тяжело. Предлагаю пока собирать ссылки, где что-то подобное реализовано:
The great changes are comming!
with #11
@Define
@DefOptions
TexBeginEnd (name : String) = @Begin \begin{$name} @End \end{$name}
@Environments
Document = @TexBeginEnd "document"
otherwise syntax will be to verbose:
@Define
@DefOptions
TexBeginEnd (name : String) = "@Begin \"\\\\\\\\begin{$name}\" @End \"\\\\\\\\end{$name}\""
@Environments
Document = @TexBeginEnd "document"
@Define
@MathCommands
[!] = @Reserved
Let' see the formula `[!](p -> q) -> ([!]p -> [!]q)`
produce error message:
...
[!] is reserved!
cabal new-run texgen -- examples/$f.ttex .github/outp/$f.tex
and checking result is equal to examples/$f.tex
latexpdf
on output .tex
file and checking if it compiles without errorsВстроить в парсер псевдоокружение TeX. Его содержимое должно выдаваться дословно, внутри (по отступам) парсер разбирать ничего не должен
Проблема в следующем:
@Theorem
some theorem
> a + b = c
Если перед > a + b = c
необходимо делать отступ (как сейчас), то формула попадает внутрь окружения @Theorem
. На данный момент такое можно решить только хаком:
@Theorem
Условие теоремы
%
> a + b = c
но это выглядит не очень. Также из-за этого есть ограничение на отступ ровно в два пробела в окружениях -- иначе не получается распарсить
@Theorem
> x = y
Условие теоремы
Если же убрать ограничение на отступ, то его можно будет делать по своему усмотрению и всё будет работать
Для этого нужно разработать несколько синтаксических конструкций, позволяющих их передавать при вызове и синтаксис работы с переменными.
Для передачи при использовании pref-line формы окружения предлагается передавать их через пробел перед собственно префиксом.
Также надо думать о том, каких типов могут быть переменные. Пока думаю над тремя: числа, строки и идентификаторы (слова без кавычек). Последние, например, нужны для создания метки, на которую потом можно будет ссылаться
@Define
@Environments
Equation = @TeX "equation" @InnerMath % only math-environments and commands can be used in it
TeX = "" "" @InnerVerb % inner code should be transferred verbatim in .tex file
@Commands
Sqrt = "\sqrt" @InMath
After that #3 can be solved as in example (@TeX
environment)
дополнительные встроенные типы:
real
-- вещественное число
int
-- целое число
также
'a' "abc"
суммы (через |
)
произведения (через пробел)
диапазоны символов 'a' .. 'z'
как сокращение для суммы
@Define
@Types
letter = 'a' .. 'z'
abc = "a" | "b" | "c"
abcd = abc | "d"
len-unit = "px" | "cm" | "mm"
len = real len-unit
Всё-таки надо это сделать будет, видимо, в ближайшее время, так как обрабатывать что-либо более-менее сложное в парсере непосредственно проблематично. Но для того, чтоб это сделать надо чтобы распарсить можно было не вникая в то, какие именно окружения присутствуют. Пока это так, но есть идея запретить в математике парсинг префиксов и тогда это станет уже не так. Надо всё-таки, видимо, каким-то образом научиться гарантировано отличать префиксы от не-префиксов. Но как это сделать, не добавляя каких-то лишних символов?
В консоли (под Windows, PowerShell, Cmd и Git bush работают одинаково плохо) кириллица и Unicode-символы, присутствующие в исходном коде отображаются некорректно. При этом если перенаправить вывод в файл, всё работает корректно.
Возможно, это проблема настроек консоли. Но надо бы с этим разобраться и написать подсказки в README
Нашёл такое issue
https://gitlab.haskell.org/ghc/ghc/-/issues/15118
Предлагаю сделать это до того, как реализовывать какие-либо другие возможности, так как это изменение кардинально поменяет весь Generator.hs
.
Проверку отступов можно сделать через внутренний state парсера. А комбинаторы, особенно после этого, станут совсем не нужны. Они и сейчас используются только в парсинге определений, и то не совсем к месту.
https://hackage.haskell.org/package/pretty
Заодно получится вывод с нужной шириной строки
@
, надо поправить парсер абзаца)@Document
@Proof
...
... % Error!!!
Все строчки в окружении/префиксе/на глобальном уровне должны иметь единый отступ, за исключением префиксов — для них отступ должен быть строго больше. Запретить префиксам быть первыми строчками в окружениях/префиксах и сразу после закрытия окружений — во всех этих случаях наилучшим решением, видимо, являются фиктивные комментарии (для этого надо сделать, чтоб комментарии парсились вместе с остальным кодом)
154:1:
|
154 | <empty line>
| ^
incorrect indentation (got 1, should be equal to 3)
@Definitions
@Environments
section (name : Line) = @Begin \section{$name}
@Prefs
- = @TeXBeginEnd itemize @Pref \item
# = @TeXBeginEnd enumerate @Pref \item
@MathCommands
!= = \not
@Document
@Section some section name
Pargargraph in section
Но здесь будут проблемы с пробелами/переносами строк. Но там и сейчас добавляются лишние пробелы.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.