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

Reply via email to