Препроцессор 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