Pandoc — поддержка пользовательской среды ввода latex

#latex #pandoc #latex-environment

#Латекс #pandoc

Вопрос:

Я использую единый унифицированный документ LaTeX для создания наборов проблем и решений:

    item What is one plus one?
      begin{soln}
         The answer is "two".
      end{soln}
  

В LaTeX я определяю эту среду с помощью (упрощенного):

 NewEnviron{soln}
  {
    ifsolutionsexpandafter
    BODY
    fi
  }
  

То есть, если solutionsfalse был определен в LaTeX, он печатает:

    1. What is one plus one?
  

и если solutionstrue был определен, он печатает:

 1. What is one plus one?
    ** The answer is two ** 
  

Я пытаюсь воспроизвести это в pandoc для генерации HTML или MD файлов из входных данных latex, но я уперся в стену. Я думаю, Pandoc не поддерживает какие-либо /if /else /fi инструкции в LaTeX. Pandoc не поддерживает comment среду, с которой также можно было бы работать excludecomment{soln} . Итак, я не могу создать файл shim.tex, который копировал бы «игнорировать данные в среде soln».

Я полагаю, следующим способом было бы сделать что-то в luatex, с чем pandoc может взаимодействовать, или определить пользовательскую среду для pandoc с фильтром? Но документация для этих систем чрезвычайно тяжеловесна — простого способа нет.

Кто-нибудь может предложить решение этой проблемы?

В идеале я хочу запускать две разные команды оболочки. Команда A должна опускать все содержимое в среде soln. Команда B, в идеале, должна сделать весь обычный текст синим и отображать все содержимое в soln среде черным цветом.

(P.S. xcolor Пакет также, похоже, не поддерживается в родном pandoc, хотя есть фильтр, который у меня не работает.)

Редактировать

Следуя комментариям @tarleb и @mb21, я думаю, мне нужно попытаться разобраться, как работают фильтры. Опять же, документация здесь ужасна — она хочет, чтобы вы знали все, прежде чем сможете что-либо сделать.

Я попробовал это:

 return {
  {
    RawBlock = function(elem)
      print(elem.text)
      if starts_with('\begin{soln}', elem.text) then        
        return pandoc.RawBlock(elem.format,"SOLN")
      else
        return elem
      end
    end,
  }
}
  

и запустил ее с

 pandoc --lua-filter ifdef.lua --mathjax -s hw01.tex -s -o hw01.html
  

Но в стандартном выводе из инструкции print ничего нет, и мой документ не изменился, поэтому необработанные блоки, по-видимому, не обрабатываются фильтром lua, если не передан -f latex raw_tex флаг. Но передача этих флагов означает, что pandoc фактически не обрабатывает include команды в latex, поэтому мой фильтр не увидит вложенные документы.

По-видимому, ответ «Нет, pandoc не может поддерживать новую среду latex», поскольку это потребовало бы модификации анализатора. Хотя -f latex raw_tex можно отключить большие части анализатора, это просто означает, что документ в значительной степени не проанализирован, чего я не хочу.

Пожалуйста, скажите мне, если я ошибаюсь.

Комментарии:

1. если вы хотите делать подобные вещи, ваша работа будет намного проще, если вы будете использовать в качестве формата ввода уценку на основе pandoc с ее родными div элементами и т.д. Затем вы можете манипулировать элементами с помощью фильтров .

2. Это приятно, но входные данные уже записаны с обширным списком макросов и форматированием, специфичным для latex. Весь смысл в том, чтобы преобразовать существующий исходный код в другой формат, а не начинать с другого формата. Почему фильтры не работают в средах latex?

3. фильтры действительно работают при конвертации из других форматов. взгляните на pandoc -t native , чтобы увидеть, как выглядит ваш документ, когда он попадает на стадию фильтрации..

4. Спасибо, @mb21, но этого недостаточно для начала работы. Эта команда показывает, что pandoc вообще не анализирует мою soln среду, так что это не приближает меня к решению.

5. Попробуйте с помощью pandoc -f latex raw_tex заставить pandoc передавать все команды в виде raw TeX, если он не знает, как их анализировать.