#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, если он не знает, как их анализировать.