LaTeX listings package – Haskell

30 03 2008

As may know, I am a LaTeX-fan-boy! To me LaTeX, is just the perfect way to get documents well structured and with a professional layout. More, with LaTeX you can write to someone in the other side of the planet mathematic formulas, or whatever because is a standard. It’s also fast, stable, flexible, free, etc.

Well, from the very beginning of my course I have to be able to write documents in LaTeX, so after I learn it, I start to do my LaTeX template document. To import code to my document I start to use verbatim package, but it really suck’s!
So, I found listings, great output! And even better, I could make my own style to one language. After reading the manual I did it for Haskell. I love the output.
You can see an example of that here(.pdf).

A simple definition of some colors to highlight our code:

\definecolor{gray_ulisses}{gray}{0.55}
\definecolor{castanho_ulisses}{rgb}{0.71,0.33,0.14}
\definecolor{preto_ulisses}{rgb}{0.41,0.20,0.04}
\definecolor{green_ulises}{rgb}{0.2,0.75,0}

And here it is, the thing that do things 🙂

\lstdefinelanguage{HaskellUlisses} {
	basicstyle=\ttfamily\tiny,
	sensitive=true,
	morecomment=[l][\color{gray_ulisses}\ttfamily\tiny]{--},
	morecomment=[s][\color{gray_ulisses}\ttfamily\tiny]{\{-}{-\}},
	morestring=[b]",
	stringstyle=\color{red},
	showstringspaces=false,
	numberstyle=\tiny,
	numberblanklines=true,
	showspaces=false,
	breaklines=true,
	showtabs=false,
	emph=
	{[1]
		FilePath,IOError,abs,acos,acosh,all,and,any,appendFile,approxRational,asTypeOf,asin,
		asinh,atan,atan2,atanh,basicIORun,break,catch,ceiling,chr,compare,concat,concatMap,
		const,cos,cosh,curry,cycle,decodeFloat,denominator,digitToInt,div,divMod,drop,
		dropWhile,either,elem,encodeFloat,enumFrom,enumFromThen,enumFromThenTo,enumFromTo,
		error,even,exp,exponent,fail,filter,flip,floatDigits,floatRadix,floatRange,floor,
		fmap,foldl,foldl1,foldr,foldr1,fromDouble,fromEnum,fromInt,fromInteger,fromIntegral,
		fromRational,fst,gcd,getChar,getContents,getLine,head,id,inRange,index,init,intToDigit,
		interact,ioError,isAlpha,isAlphaNum,isAscii,isControl,isDenormalized,isDigit,isHexDigit,
		isIEEE,isInfinite,isLower,isNaN,isNegativeZero,isOctDigit,isPrint,isSpace,isUpper,iterate,
		last,lcm,length,lex,lexDigits,lexLitChar,lines,log,logBase,lookup,map,mapM,mapM_,max,
		maxBound,maximum,maybe,min,minBound,minimum,mod,negate,not,notElem,null,numerator,odd,
		or,ord,otherwise,pi,pred,primExitWith,print,product,properFraction,putChar,putStr,putStrLn,quot,
		quotRem,range,rangeSize,read,readDec,readFile,readFloat,readHex,readIO,readInt,readList,readLitChar,
		readLn,readOct,readParen,readSigned,reads,readsPrec,realToFrac,recip,rem,repeat,replicate,return,
		reverse,round,scaleFloat,scanl,scanl1,scanr,scanr1,seq,sequence,sequence_,show,showChar,showInt,
		showList,showLitChar,showParen,showSigned,showString,shows,showsPrec,significand,signum,sin,
		sinh,snd,span,splitAt,sqrt,subtract,succ,sum,tail,take,takeWhile,tan,tanh,threadToIOResult,toEnum,
		toInt,toInteger,toLower,toRational,toUpper,truncate,uncurry,undefined,unlines,until,unwords,unzip,
		unzip3,userError,words,writeFile,zip,zip3,zipWith,zipWith3,listArray,doParse
	},
	emphstyle={[1]\color{blue}},
	emph=
	{[2]
		Bool,Char,Double,Either,Float,IO,Integer,Int,Maybe,Ordering,Rational,Ratio,ReadS,ShowS,String,
		Word8,InPacket
	},
	emphstyle={[2]\color{castanho_ulisses}},
	emph=
	{[3]
		case,class,data,deriving,do,else,if,import,in,infixl,infixr,instance,let,
		module,of,primitive,then,type,where
	},
	emphstyle={[3]\color{preto_ulisses}\textbf},
	emph=
	{[4]
		quot,rem,div,mod,elem,notElem,seq
	},
	emphstyle={[4]\color{castanho_ulisses}\textbf},
	emph=
	{[5]
		EQ,False,GT,Just,LT,Left,Nothing,Right,True,Show,Eq,Ord,Num
	},
	emphstyle={[5]\color{preto_ulisses}\textbf}
}

And now, to use it, we define a new environment:

\lstnewenvironment{code}
{\textbf{Haskell Code} \hspace{1cm} \hrulefill \lstset{language=HaskellUlisses}}
{\hrulesmallskip}

Now to write Haskell code in our LaTeX document with great output, just write:

\begin{code}
    module Main(main) where

    main :: IO()
    main = putStrLn $ "LaTeX listings is cool!"
\end{code}

Because I’m not so good at web design I use this blog layout (that I like), but some of the code may not be seen, if you want to see an example of a LaTeX source go here (.lhs).





Workshop introducao ao LaTeX@UMinho

10 11 2007

Correu altamente a workshop de LaTeX organizada pelo CAOS. Mais um sucesso de toda a equipa que trabalha no CAOS. Foi um dia cheio de partilha de conhecimento. Eu mais o Nuno ficamos incrédulos com o grupo heterogéneo de participantes que tínhamos; dois professores do Departamento de Estudos Germanísticos, um aluno de doutoramento, alunos de Opetometria e Ciências da Visão, vários alunos de Física e ainda, como seria de esperar, alunos de LEI. Rapidamente me apercebi que tinha um desafio nas mãos, ensinar uma linguagem a pessoas que nunca na vida tinham/irão ver código.

LaTeX WorkShop - CAOS

LaTeX WorkShop - CAOS

Decidi que quem tinha de se aperceber do potencial do LaTeX eram eles mesmos, por isso omiti, propositadamente, alguns pormenores que posteriormente eles se iam apercebendo e vendo a real filosofia do LaTeX.

A workshop foi evoluindo naturalmente, todos ficaram entusiasmados com a história do LaTeX e o verdadeiro desafio aproximava-se; fazer documentos! Rapidamente chegamos aos exercícios e o entusiasmo foi geral. Rapidamente se instalou o MiKTeX para Windows e mais algumas aplicações para MAC, enquanto isto os Linux user’s esperavam impacientemente (lolz).

Os exercícios correram todos muito bem, toda a gente conseguiu fazer os exercícios propostos e alguns até já começavam a explorar com o que já tinham aprendido até à altura. Foi muito bom!

Às 19:00 estava terminado, olhamos um para o outro e parecia que tínhamos sido agredidos violentamente por um batalhão das GOE em pleno Departamento de informática.

Estávamos cansados, mas confesso que adorei dar esta workshop e o Nuno Veloso idem.

Código da apresentação e exercícios, tar.gz com tudo.

Reacções do Nuno Veloso relativamente ao evento.





Wordkshop introducao ao LaTeX

2 11 2007

Ainda me lembro da primeira vez que vi LaTeX,acabado de entrar na universidade. De inicio pouco percebia do assunto, limitava-me a usar os templates que os professores disponibilizavam e assim fazia os relatórios para os trabalhos. Uma vez não tive tempo para usar um destes templates e aldrabei um documento, tinha sido escrito no Word e fi-lo a se parecer, no máximo dos meus conhecimentos do word, com um template TeX. A brincadeira não correu bem e, na entrega do trabalho, o professor João Saraiva, olhando para o relatório, disse-me: “ó pá nós somos programadores, gostamos de fazer isto”.

Levei aquela frase muito a sério e aprendi LaTeX na semana seguinte, a partir daí até hoje fazer documentos em LaTeX é como uma diversão para mim.

Já lá vão 3 anos e acho que devo partilhar estes conhecimentos que aprendi em LaTeX com quem está na situação que eu estava antes de saber o que era um begin{section}.

Na próxima quarta-feira terei o prazer de dar uma WorkShop sobre LaTeX, mais o meu colega e amigo Nuno Veloso no Departamento de Informática da UMinho.

Na verdade é mais produtivo fazer documentos em LaTeX do que num sistema WYSIWYG. O tempo que se gasta em formatação de um texto, andar a mexer em caixas de texto para inserir notas debaixo de uma imagem, ir verificar o numero/nome da secção se a quiser enunciar, entre muitas outras coisas são para mim, uma autêntica dor de cabeça.

Uso LaTeX porque não me tenho que preocupar com esse tipo de coisas e tenho a certeza que o documento gerado irá sempre ter uma apresentação profissional.

Para apresentações uso LaTeX Beamer que é uma class do LaTeX. Com Beamer é estupidamente fácil fazer uma apresentação profissional. Depois farei sobre isto.

Se tiverem curiosidade podem ver alguns dos relatórios que já fiz em LaTeX, dentro de cada relatório está o respectivo *.tex e *.pdf.