Coder Social home page Coder Social logo

finetex's People

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar

Forkers

varikvalefor

finetex's Issues

Use Data.Map instead of list of pairs

Это должно (незначительно) улучшить производительность, а также повысить возможности использования стандартных функций для Map. Также везде надо добавить проверки на повторное добавление элемента (=redeclaration) с выводом соответствующей ошибки

Consume empty lines after beginning of the environment

Такой код не работает:

@Proof

  # first of all
  # second

В то же время это необходимо, чтобы список начинался не сразу после слова "доказательство", а на следующей строчке

Options of command line

Кажется дефолтный запуск должен выглядеть примерно так:

  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

Automatic alignment of multi-line formulas

В align если & не расставлены ставить их перед началом следующей строки и в позиции над ней:

> a + b = c
>       = d + e
\begin{align*}
a + b &= c \\
      &= d + e
\end{align*}

Это делать, видимо, придётся на стороне Haskell, а в gentex-определение подсовывать магию какую-то. Т. е.

@Prefs
  > = @TexBeginEnd align* @Math @AlignMagic

пока не придумал лучшего способа оформить это в рамках простого языка.

Bad error messages with Unicode symbols

Без юникода всё работает:

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)

Запуск вне интерпретатора

Для этого нужно написать полноценный main, в котором принять в качестве аргументов командной строки адрес исходного файла и куда записать полученный .tex и вызвать уже готовую функцию ProcessFile.

Должно быть несложным упражнением. Для парсинга аргументов командной строки, возможно нужно использовать OptParse

Import definitions from other files

Файлы определений не должны ничего выводить, только определять команды/окружения. В них также явно надо указывать, что экспортировать

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

Checking various directories for `@Import` files

Сейчас импортируемые файлы ищутся лишь в текущей директории. Должен быть способ задать директорию для стандартных файлов. Пока, правда, это не очень актуально ибо этих стандартной библиотеки не существует

Reorganize space and newline consuming in parsers

Предлагаю передавать парсеру элементов окружения (в частности, абзацев) sc-парсер, чтобы тот автоматически проверял, что мы хотя бы за внешний отступ не вышли. В общем, надо ввести строгие правила: кто за что отвечает

Unicode charecters for Math symbols

Кроме поддержки собственно парсером (не уверен, насколько умеет MegaParsec обрабатывать Unicode) нужно ещё сделать/подобрать extension для VsCode для ввода этих самых символов.
Судя по всему, Agda-mode реализует что-то типа того, что нам нужно. Но там ещё куча всего про Агду и отделить, наверное, тяжело. Предлагаю пока собирать ссылки, где что-то подобное реализовано:

DefOtions definitions

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"

Make possible reserve command

@Define
  @MathCommands
    [!] = @Reserved

Let' see the formula `[!](p -> q) -> ([!]p -> [!]q)`

produce error message:

  ...
  [!] is reserved!

Add github-actions tests

  • Haskell code compilation
  • Running for all $f <- filenames from examples/ dirrectory (should be able in linux command line)
cabal new-run texgen -- examples/$f.ttex .github/outp/$f.tex

and checking result is equal to examples/$f.tex

  • Running latexpdf on output .tex file and checking if it compiles without errors

Псевдоокружение TeX

Встроить в парсер псевдоокружение TeX. Его содержимое должно выдаваться дословно, внутри (по отступам) парсер разбирать ничего не должен

Remove the indentation restriction on pref environment

Проблема в следующем:

@Theorem
  some theorem

> a + b = c

Если перед > a + b = c необходимо делать отступ (как сейчас), то формула попадает внутрь окружения @Theorem. На данный момент такое можно решить только хаком:

@Theorem
  Условие теоремы

%
  > a + b = c

но это выглядит не очень. Также из-за этого есть ограничение на отступ ровно в два пробела в окружениях -- иначе не получается распарсить

@Theorem
    > x = y
  Условие теоремы

Если же убрать ограничение на отступ, то его можно будет делать по своему усмотрению и всё будет работать

Environments and commands with arguments

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

Для передачи при использовании pref-line формы окружения предлагается передавать их через пробел перед собственно префиксом.

Также надо думать о том, каких типов могут быть переменные. Пока думаю над тремя: числа, строки и идентификаторы (слова без кавычек). Последние, например, нужны для создания метки, на которую потом можно будет ссылаться

Restrinctions on using environments and commands

@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)

Parser bugs

  • опять появились (#14) проблемы с пустыми строками

Creating types

дополнительные встроенные типы:
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

Separate parsing from further processing

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

Incorrect printing of non-ASCII charecters in error messages

В консоли (под Windows, PowerShell, Cmd и Git bush работают одинаково плохо) кириллица и Unicode-символы, присутствующие в исходном коде отображаются некорректно. При этом если перенаправить вывод в файл, всё работает корректно.

Возможно, это проблема настроек консоли. Но надо бы с этим разобраться и написать подсказки в README

Нашёл такое issue
https://gitlab.haskell.org/ghc/ghc/-/issues/15118

Refactor parsing for better error messages and code readability

Предлагаю сделать это до того, как реализовывать какие-либо другие возможности, так как это изменение кардинально поменяет весь Generator.hs.

Update generator parser

  • встроить проверку отступов в парсер
  • избавиться от комбинаторов In Environment и т. п.
  • перейти от takeWhileP к manyTill
  • оставить try только там, где надо, для улучшения сообщений об ошибках
  • обрабатывать данные сразу, как только распарсили для того, чтоб выводилось нужное место с ошибкой

Проверку отступов можно сделать через внутренний state парсера. А комбинаторы, особенно после этого, станут совсем не нужны. Они и сейчас используются только в парсинге определений, и то не совсем к месту.

Parsing bugs

  • Не парсятся пустые строки между импортами и определениями
  • Не парсится окружение, если до него был абзац (всё сливается в абзац, несмотря на @, надо поправить парсер абзаца)
  • Пустые строки дают ошибку неправильного отступа:
@Document
  @Proof
    ...

  ... % Error!!!

Change indentation rules

Все строчки в окружении/префиксе/на глобальном уровне должны иметь единый отступ, за исключением префиксов — для них отступ должен быть строго больше. Запретить префиксам быть первыми строчками в окружениях/префиксах и сразу после закрытия окружений — во всех этих случаях наилучшим решением, видимо, являются фиктивные комментарии (для этого надо сделать, чтоб комментарии парсились вместе с остальным кодом)

New syntax for definitions (without String litterals)

@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

Но здесь будут проблемы с пробелами/переносами строк. Но там и сейчас добавляются лишние пробелы.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.