% \iffalse meta-comment % % Copyright 2008 Marek Kubica, % % This work may be distributed and/or modified under the % conditions of the LaTeX Project Public License, either version 1.3c % of this license or (at your option) any later version. % The latest version of this license is in % http://www.latex-project.org/lppl.txt % and version 1.3c or later is part of all distributions of LaTeX % version 2008/05/04 or later. % % This work has the LPPL maintenance status `maintained'. % % The Current Maintainer of this work is Marek Kubica. % % This work consists of the files textments.dtx and texments.ins % and the derived file texments.sty. % % \fi % % \iffalse %<*driver> \ProvidesFile{texments.dtx} % %\NeedsTeXFormat{LaTeX2e} %\ProvidesPackage{texments} %<*package> [2008/12/27 0.2.0 The Pygments source code highligher integrated into LaTeX documents] %\RequirePackage{fancyvrb} %\RequirePackage{color} %\RequirePackage{ifthen} % % %<*driver> \documentclass{ltxdoc} \usepackage{texments}[2008/12/27] \usepackage{hyperref} \EnableCrossrefs \CodelineIndex \RecordChanges \hypersetup{ pdftitle={texments manual}, pdfsubject={Documentation of the texments LaTeX package}, pdfauthor={Marek Kubica}, pdfkeywords={pygments texments sourcecode highlight color}, } \begin{document} \DocInput{texments.dtx} \PrintChanges \PrintIndex \end{document} % % \fi % % \CheckSum{57} % % \CharacterTable % {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z % Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z % Digits \0\1\2\3\4\5\6\7\8\9 % Exclamation \! Double quote \" Hash (number) \# % Dollar \$ Percent \% Ampersand \& % Acute accent \' Left paren \( Right paren \) % Asterisk \* Plus \+ Comma \, % Minus \- Point \. Solidus \/ % Colon \: Semicolon \; Less than \< % Equals \= Greater than \> Question mark \? % Commercial at \@ Left bracket \[ Backslash \\ % Right bracket \] Circumflex \^ Underscore \_ % Grave accent \` Left brace \{ Vertical bar \| % Right brace \} Tilde \~} % % % \changes{v0.0.1}{2008/10/10}{Initial version} % \changes{v0.1.0}{2008/10/10}{Properly repackaged} % \changes{v0.2.0}{2008/12/23}{More documentation, commands, environments} % % \GetFileInfo{texments.dtx} % % \DoNotIndex{\newcommand,\newenvironment} % % % \title{The \textsf{texments} package\thanks{This document % corresponds to \textsf{texments}~\fileversion, dated \filedate.}} % \author{Marek Kubica \\ \texttt{marek@xivilization.net}} % % \maketitle % % ^^A define gobble to yank the first char out, which is a '%' % ^^A because of DocStrip % \fvset{gobble=1} % % \section{Introduction} % % \textsf{texments} is a package that is used to connect the not-yet % award winning source code colorizer library Pygments % (\url{http://pygments.org/}) with \LaTeX{} documents. That means that % it is neccessary to have Pygments installed and that the % \texttt{pygmentize} command is available. % % \section{Usage} % % This package does not provide many fancy features, it is just meant % as an easy bridge between the highlighter and LaTeX. It calls % internally the \texttt{pygmentize} command, so you need to start it % with \texttt{-shell-escape} activated. \texttt{-shell-escape} % allows the \LaTeX{} processor to call arbitary shell commands which % can be a security problem if compiling untrusted source, but % unfortunately this is unavoidable because \texttt{pygmentize} is % an external command. % % Using \textsf{texments} is simple: you only need to add % \texttt{\textbackslash{}usepackage\{texments\}} to your document % and can already use the \textsf{texments} commands described below. % % A typical compilation of a document that uses \textsf{texments} % looks like this: % % \texttt{\$ pdflatex -shell-escape yourdocument.tex} % % Pygments supports many languages, to see which languages your % version of Pygments supports, tell \texttt{pygmentize} to list % all supported languages use the command: % % \texttt{\$ pygmentize -L lexer} % % it will return a rather long list with the names of the supported % languages. Pygments is in constant development, so expact this list % to grow over time. % % Note that if you use the \textsf{texments} commands to highlight % text inside of \textsf{beamer} presentations, you need to mark % the frames with the code ``fragile'', like this: % % \texttt{\textbackslash{}begin\{frame\}[fragile] ... \textbackslash{}end\{frame\}} % % So in case you get strange errors, try setting the containers % ``fragile''. % % \DescribeMacro{\usestyle\marg{stylename}} % % This macro needs to be called at least once to set the style that % pygments should use to highlight all code. Internally it calls % \texttt{pygmentize} to get all the color-codes that the style uses. % Every language can be highlighted using every style so the style % choice is purely for aesthetical reasons. % % One quite useful style is the ``bw'' style which is, as the name % somehow implies, black and white and therefore useful for printing % documents that can only be black and white like books that should % be published (black and white is usually cheaper) or printing on % laser printers so that the printer does not have to guess which % shade of grey to use. % % To change the style, \texttt{usestyle} can be called more than once, % so that the following source codes get highlighted with a different % style. % % For this document, we'll use the \texttt{default} style only. % % \usestyle{default} % % \DescribeMacro{\pygment\marg{language}\marg{code}} % % For simple one-line snippets the \texttt{pygment} command can be % used. It will be rendered using the current selected style. % Note that it will be put inside of a \texttt{Verbatim} environment. % % An example for this is the following Python code which displays % the typical beginner program, with fancy coloring. % % \pygment{python}{print "Hello World"} % % This command won't be used very often, because most of the time % it is more useful to use the provided environment to directly % include bigger chunks of source code. % % \DescribeMacro{\includecode\oarg{language}\marg{filename}} % % Includes an external file that will be highlighted according to % the syntax rules of the language. It has an optional argument, % the language which can be set or not. If the argument is not set, % Pygments tries to guess the language by looking at the file % extension. The language specified can be, as always, any language % that Pygments supports. % % Let's try this with a new file, called ``\jobname.py'' that we'll % create. It will be a one-liner, and should print % ``Hello TeXmented world''. % % \immediate\begin{VerbatimOut}{\jobname.py} % print "Hello TeXmented world" % \end{VerbatimOut} % % First we specify the language explicitly, using % \texttt{\textbackslash{}includecode[python]{\jobname.py}}: % % \includecode[python]{\jobname.py} % % As you see this worked rather fine. Now, as the file has the proper % ``.py'' extension, we can also leave out the language and write % \texttt{\textbackslash{}includecode{\jobname.py}}: % % \includecode{\jobname.py} % % which again, renders the code correctly. % % \DescribeEnv{pygmented\marg{language}} % For longer snippets of code it is usually better to use the % \texttt{pygmented} environment. The parameter is the % language that the snippet is in, so it can be highlighted % properly. Everything inside the environment will be highlighted % according to the syntax of the selected language. % % The first and only parameter describes the language that the % snippet is in. It highlights the code to the specified rules. % % \begin{pygmented}{python} % class FancyColoredStuff(object): % def __init__(self, language): % self.language = language % % def highlight(self): % print "This is colorful code in %s" % self.language % % colorthing = FancyColoredStuff("Python") % colorthing.highlight() % \end{pygmented} % % Of course Python is not the only supported language, how about % something more exotic? Let's try some Scheme code: % % \begin{pygmented}{scheme} % (define frequencies % (foldl (lambda (word hash) % (let ((current-value (hash-ref hash word 0))) % (hash-set hash word (add1 current-value)))) % (make-immutable-hash '()) % ; feed in the separated words % (string-tokenize (port->string (current-input-port))))) % \end{pygmented} % % \StopEventually{} % % \section{Implementation} % % \begin{macro}{\usestyle} % This macro calls \texttt{pygmentize} with the appropriate style % name and gets the color definitions that will be used in all % subsequent code listings. % \begin{macrocode} \newcommand{\usestyle}[1]{ \immediate\write18{pygmentize -S #1 -f latex > \jobname.pyg} \input{\jobname.pyg} } % \end{macrocode} % \end{macro} % % \begin{macro}{\pygment} % This macro takes the code in the second argument and feeds it % to \texttt{pygmentize}, so that it outputs code highlighted % to the rules of the first argument. % \begin{macrocode} \newwrite\code \newcommand{\pygment}[2]{ \immediate\openout\code\jobname.pyg \immediate\write\code{#2} \immediate\closeout\code \immediate\write18{pygmentize -l #1 -f latex -o \jobname.out.pyg \jobname.pyg} \input{\jobname.out.pyg} } % \end{macrocode} % \end{macro} % % \begin{macro}{\includecode} % This macro has two parameters: language and file name. The language can be % omitted in which case it will be set to \texttt{auto} and causes % \texttt{pygmentize} to guess the language. The highlighted source is % being written in an external file and imported automatically into the main % document. % \begin{macrocode} \newcommand{\lexercommand}[1]{} \newcommand{\includecode}[2][auto]{ \ifthenelse{\equal{#1}{auto}} {\renewcommand{\lexercommand}[1]{}} {\renewcommand{\lexercommand}[1]{-l #1}} \immediate\write18{pygmentize \lexercommand{} -f latex -o #2.out.pyg #2} \input{#2.out.pyg} } % \end{macrocode} % \end{macro} % % \begin{environment}{pygmented} % An environment that highlights the code that is contained inside using % the currently selected style. It uses \texttt{VerbatimOut} from the % \textsf{fancyvrb} package to write the contents into a file, calls % \texttt{pygmentize} on it and imports the highlighted source. % \begin{macrocode} \newcommand{\proglang}[1]{} \newenvironment{pygmented}[1]% {\VerbatimEnvironment \renewcommand{\proglang}[1]{#1} \begin{VerbatimOut}{\jobname.pyg}}% {\end{VerbatimOut} \immediate\write18{pygmentize -l \proglang{} -f latex -o \jobname.out.pyg \jobname.pyg} \input{\jobname.out.pyg}} % \end{macrocode} % \end{environment} % % \Finale \endinput