Literate Haskell: ссылки и индексирование - PullRequest
15 голосов
/ 18 июля 2011

Поддерживает ли Literate Haskell индексирование имен функций, классов типов и ссылок на переменные? Есть ли фильтр, который я могу запустить в Literate Haskell source, который сделает это и даст мне либо хорошее руководство в формате PDF, либо HTML-документ с гиперссылкой.

Это действительно приятные особенности noweb и CWEB , которые, я думаю, будут способствовать широкому распространению Literate Haskell.

В качестве примера рассмотрим программу подсчета слов , написанную на CWEB. Блок кода на первой странице в пункте # 4 помечен тем, где используется этот код. LHS не поддерживает чанки, но я хотел бы знать, где используется код:

  1. Комментарий, описывающий func.

    func = id

    Используется в: (X.Y.Z.f, A.B.C.g, раздел 1.5)

    func2 = indefined

    Используется в: (A.B.C.x, раздел 2.1)

И, кроме того, индекс, который объединяет все имена и переменные функций, на которые они ссылаются в документе, а также на другие функции и т. Д.

1 Ответ

1 голос
/ 19 июля 2011

В Latex есть некоторые возможности, ниже используется пакет листинги вместе с makeindex для создания списка всех функций.Кроме того, \ label используется для создания перекрестных ссылок между различными разделами:

\documentclass[a4paper,11pt,reqno,twoside,pdflatex,makeidx]{amsart}

\usepackage[a4paper]{geometry}

\usepackage{listings}
\lstloadlanguages{Haskell}

\lstset{
    flexiblecolumns=false,
    basewidth={0.5em,0.45em},
    basicstyle=\ttfamily,
    language=haskell,
    % numbers=left, % optional numbering of code lines
    firstnumber=last,
    numberstyle=\tiny,
    stepnumber=2,  
    numbersep=5pt,
    index={fac,fac2}
}

\lstnewenvironment{code}{}{}

\usepackage{hyperref}

\title{The factorial function}
\author{Federico Squartini}
\date{}


\makeindex

\begin{document}
\maketitle
\section{Factorial function}
\label{code:fac1}
The factorial function can be defined as:

\begin{code}

fac 0 = 1
fac n = n * fac (n-1)

\end{code}

\section{Factorial function in constant space}
The code for the factorial defined section~\ref{code:fac1} uses $o(n)$ stack
space. The following function uses constant space:

\begin{code}

fac2 n = go 1 1
    where
      go !acc i| i <= n = go (acc*i) (i+1)
               | otherwise = acc

\end{code}

\printindex
\end{document}

Компилировать с:

pdflatex example.tex

makeindex example.idx

pdflatex example.tex

pdflatex example.tex

В результате pdf будет здесь .Это отлично подходит для создания PDF-файлов.Для других видов выходных данных (например, html) вы должны использовать latex вместе с pandoc .

Другой вариант - использовать синтаксис уценки pandoc, смешанный со специальными латексными командами (\ label и makeindex),Это должно упростить задачу, а также снизить уровень синтаксического шума в исходных файлах.

...