Results in this (temporary image): http://lucs.net:8888/sidebar.png
A few notes: - Requires additional LaTeX package 'calc'. - Has some UTF-8 characters in the perl code. - Introduced a main() sub (personal preference -- it bothers me to have floating top level code). - I hope the produced patch is correctly formatted in this email (new to git and its patches). Comments appreciated. Thanks. --- bin/book-to-latex | 130 +++++++++++++++++++++++++++++++++++++++++++++++----- 1 files changed, 117 insertions(+), 13 deletions(-) diff --git a/bin/book-to-latex b/bin/book-to-latex index a909a46..70dabfb 100644 --- a/bin/book-to-latex +++ b/bin/book-to-latex @@ -2,7 +2,48 @@ use strict; use Pod::PseudoPod::LaTeX 1.101050; -print <<'HEADER'; +# -------------------------------------------------------------------- +package Perl6BookLaTeX; + +use base 'Pod::PseudoPod::LaTeX'; + +sub start_sidebar { + my ( $self, $flags ) = @_; + $self->{scratch} .= << 'EOT'; +\begin{figure}[!h] +\footnotesize +\sidebartop +EOT + if ( $flags->{title} ) { + my $title = $self->encode_text( $flags->{title} ); + $self->{scratch} .= << "EOT"; +\\begin{center} +\\vspace{-\\baselineskip} +\\vspace{-\\baselineskip} +\\normalsize{\\bfseries{$title}} +\\end{center} +EOT + } + $self->{scratch} .= "\\vspace{-5pt}%\n"; +} + +# -------------------------------------------------------------------- +sub end_sidebar { + my $self = shift; + $self->{scratch} .= << 'EOT'; +\sidebarbottom +\end{figure} +EOT +} + +# -------------------------------------------------------------------- +package main; + +main(); + +# -------------------------------------------------------------------- +sub main { + print << 'HEADER'; \documentclass[11pt,a4paper,oneside]{report} \usepackage{graphics,graphicx} \usepackage{colortbl} @@ -12,29 +53,92 @@ print <<'HEADER'; \usepackage[utf8]{inputenc} \usepackage{makeidx} \usepackage[colorlinks=true,pagebackref]{hyperref} +\usepackage{calc} \makeindex \title{Using Perl~6} \author{Jonathan S. Duff, Moritz Lenz, Carl Mäsak, Patrick R. Michaud, Jonathan Worthington} - -\begin{document} +HEADER -\maketitle + # Sidebar Info. Units are points. + my %SI = ( + rule_indent => 40, + text_indent => 50, + vert_thick => 1, + big_thick => 1.5, + gap_thick => 1, + sml_thick => 0.6, + tub_thick => 2, + ); + $SI{vert_height} = + $SI{big_thick} + $SI{gap_thick} + $SI{sml_thick} + $SI{tub_thick}; + $SI{rule_padding} = ($SI{rule_indent} + $SI{vert_thick}) * 2; + $SI{top_big_elev} = $SI{gap_thick} + $SI{sml_thick} + $SI{tub_thick}; + $SI{top_sml_elev} = $SI{tub_thick}; + $SI{bot_sml_elev} = $SI{big_thick} + $SI{gap_thick}; -\tableofcontents -HEADER + print subst_tokens(\%SI, << 'EOT'); +\newcommand{\sidebartop}{% + \nointerlineskip\vspace{\baselineskip}% + \hskip «rule_indent»pt% + \rule[0pt]{«vert_thick»pt}{«vert_height»pt}% + \rule[«top_big_elev»pt]{\linewidth-«rule_padding»pt}{«big_thick»pt}% + \rule[0pt]{«vert_thick»pt}{«vert_height»pt}% + \par% + \vspace{-\baselineskip}% + \hskip «rule_indent»pt% + \hskip «vert_thick»pt% + \rule[«top_sml_elev»pt]{\linewidth-«rule_padding»pt}{«sml_thick»pt}% + \par% + \vspace{\baselineskip}% + \begingroup% + \leftskip «text_indent»pt% + \rightskip\leftskip% +} +EOT -for (@ARGV) { - my $parser = Pod::PseudoPod::LaTeX->new(); - $parser->codes_in_verbatim(1); - $parser->output_fh( *STDOUT ); - $parser->parse_file( $_ ); + print subst_tokens(\%SI, << 'EOT'); +\newcommand{\sidebarbottom}{% + \endgroup% + \nointerlineskip\vspace{\baselineskip}% + \hskip «rule_indent»pt% + \rule[0pt]{«vert_thick»pt}{«vert_height»pt}% + \rule[0pt]{\linewidth-«rule_padding»pt}{«big_thick»pt}% + \rule[0pt]{«vert_thick»pt}{«vert_height»pt}% + \par% + \vspace{-\baselineskip}% + \hskip «rule_indent»pt% + \hskip «vert_thick»pt% + \rule[«bot_sml_elev»pt]{\linewidth-«rule_padding»pt}{«sml_thick»pt}% + \par% + \vspace{\baselineskip}% } +EOT -print <<'FOOTER'; + print << 'START_DOC'; +\begin{document} +\maketitle +\tableofcontents +START_DOC -\printindex + for (@ARGV) { + my $parser = Perl6BookLaTeX->new(); + $parser->codes_in_verbatim(1); + $parser->output_fh( *STDOUT ); + $parser->parse_file( $_ ); + } + print << 'FOOTER'; +\printindex \end{document} FOOTER +} + +# -------------------------------------------------------------------- +sub subst_tokens { + my ($tokens_ref, $text) = @_; + $text =~ s/«([^»]*)»/$tokens_ref->{$1}/g; + return $text; +} + -- 1.6.5