Поддерживает ли какая-либо грамотная среда программирования результаты на лету?

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

Есть ли грамотная среда программирования, которая позволяет мне писать отчеты в простом формате (желательно markdown / latex и haskell), а затем конвертировать в какой-либо выходной формат (желательно pdf), содержащий результаты вычислений, выполненных в исходном файле?

Я знаю, что Haskell поддерживает грамотное программирование, но не думаю, что вывод (и, возможно, целые изображения) можно захватить.


person fho    schedule 30.01.2013    source источник


Ответы (5)


Препроцессор lhs2TeX поддерживает оценку выражений Haskell через GHCi. Вот минимальный пример:

\documentclass{article}

%include polycode.fmt
%options ghci

\begin{document}

Running

> fmap (+1) [1..10]

yields \eval{fmap (+1) [1..10]}.

\end{document}

Это приведет к выходу, который содержит список [2,3,4,5,6,7,8,9,10,11] в том месте, где команда \eval находится во входных данных.

Вы можете ссылаться на определения из текущего файла. То есть функция \eval работает, загружая текущий файл в ghci и затем оценивая выражение в этом контексте.

Также есть \perform, который делает то же самое, что и \eval, но вывод будет рассматриваться не как часть кода Haskell, а как часть кода LaTeX. Таким образом, вы можете писать функции Haskell, которые генерируют части вашего выходного документа.

При этом есть много вещей, которые можно улучшить в этой функции в lhs2TeX, и реализация - это настоящий взлом.

РЕДАКТИРОВАТЬ: Исходя из комментариев, цель состоит в том, чтобы включить изображения, созданные с помощью диаграммы библиотека. Вот документ, подтверждающий концепцию, в котором показано, как этого добиться:

\documentclass{article}

\usepackage{graphicx}

%include polycode.fmt
%options ghci

%if style == newcode
(Stuff here will not be typeset by LaTeX, but seen by Haskell.)

> import Data.Accessor
> import Graphics.Rendering.Chart
>
> renderAndInclude :: Renderable a -> FilePath -> IO ()
> renderAndInclude r filename = do
>   renderableToPDFFile r 200 200 filename
>   putStrLn $ "\\includegraphics{" ++ filename ++ "}"

%endif

%format ^= = "\mathbin{{}^\wedge\!\!=}"

\begin{document}

The image description

> image :: Renderable ()
> image  =  toRenderable
>        $  layout1_title  ^=  "Test"
>        $  layout1_plots  ^=  [ Left (toPlot plot) ]
>        $  defaultLayout1
>   where
>     plot   =  plot_lines_values ^= [[ (x, sin x) | x <- [0, 0.01 .. 10 :: Double] ]]
>            $  defaultPlotLines

yields the following output:

\perform{renderAndInclude image "image.pdf"}.

\end{document}

Центральная вспомогательная функция, которую вы должны написать, - это что-то вроде renderAndInclude выше, которая выполняет фактический рендеринг, записывает результат в файл и создает команду LaTeX \includegraphics, которая считывает файл обратно.

person kosmikus    schedule 30.01.2013
comment
Приятно :) Теперь не хватает только возможности создавать и добавлять изображения на лету. - person fho; 31.01.2013
comment
@Florian. Если у вас есть код Haskell, который может создавать изображение, это можно сделать с помощью \perform. - person kosmikus; 31.01.2013
comment
Ах ... так что, если я найду способ вывести что-то совместимое с латексом из диаграмм, я буду готов . Ура! - person fho; 31.01.2013
comment
@ Флориан Да. Я отредактировал ответ, чтобы включить дополнительную информацию о том, как вы могли этого добиться. - person kosmikus; 31.01.2013
comment
Приятно :) Честно говоря, я надеялся на способ встроить изображение в полученный файл Latex. Таким образом не будет беспорядка в файлах. Но это придирки :) - person fho; 31.01.2013
comment
@Florian Невозможно напрямую встраивать изображения в файлы LaTeX, за исключением случаев, когда вы производите вывод для TikZ или аналогичных пакетов LaTeX. Я не думаю, что Chart может это сделать. - person kosmikus; 31.01.2013
comment
Это не мешает мне попробовать ... может быть, я потрачу выходные, чтобы попробовать свои силы в латексном бэкэнде :) - person fho; 31.01.2013

Если вам не обязательно иметь Haskell, вы можете получить остальное с помощью Sweave и R. Вы в основном пишете документ LaTeX со встроенным кодом R. Вы можете включить в окончательный PDF-файл код, результат (включая графики) или и то, и другое. Knitr - это более позднее расширение (или упрощение?) Sweave.

person Tyler    schedule 30.01.2013
comment
Я работал с R раньше и не могу сказать, что он мне нравится. Но тогда я не знал, что он поддерживает такой вывод. - person fho; 30.01.2013
comment
@Florian, возможно, это может изменить ваше впечатление о R: glimmer.rstudio.com/yihui/knitr Он жив в том смысле, что за ним будет запущен сеанс R, если вы откроете его в своем браузере. - person Yihui Xie; 03.02.2013

Если вы хотите использовать диаграммы вместо диаграмм, тогда diagrams-builder, как описано в это сообщение в блоге - ваш друг. Работает как с уценкой, так и с LaTeX.

person Joachim Breitner    schedule 31.01.2013

Вы можете попробовать http://code.google.com/p/nano-lp/, он поддерживает Markdown / Multimarkdown и другие облегченные разметки (но также и OpenOffice), а также легко объединить несколько файлов в один. С помощью OpenOffice вы можете, например, экспортировать полученный файл в PDF. Также поддерживается Asciidoc и TeX / LaTeX, поэтому вы можете использовать их и для создания PDF.

person RandomB    schedule 14.02.2013

Извините за (очень) опоздание на вечеринку. Ответ приходит только в качестве ссылки для будущих посетителей на этот вопрос.

Org-mode действительно обеспечивает хорошую грамотную среду программирования. Хотя сама по себе вселенная, стоит заглянуть в нее! Дополнительную информацию о том, как он обрабатывает код, можно найти по этим ссылкам:

Также имеется поддержка Haskell, иначе этот комментарий был бы излишним. Хотя формат не является Markdown, в Org-mode есть очень простой способ разметки.

person Whil    schedule 26.08.2013
comment
К сожалению, для этого требуется Emacs :) (а я парень Vi) - person fho; 11.09.2013
comment
В самом деле, для ви-парня мое предложение не самое лучшее: P (Если вы не хотите пойти на Зло!) - person Whil; 28.09.2013
comment
Неа ... Я продолжаю достигать границ полезности с vrapper ... и я могу просто взять так много ;) - person fho; 03.10.2013