summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/thumby/thumby.sty
diff options
context:
space:
mode:
Diffstat (limited to 'macros/latex/contrib/thumby/thumby.sty')
-rw-r--r--macros/latex/contrib/thumby/thumby.sty320
1 files changed, 320 insertions, 0 deletions
diff --git a/macros/latex/contrib/thumby/thumby.sty b/macros/latex/contrib/thumby/thumby.sty
new file mode 100644
index 0000000000..418bc9eccb
--- /dev/null
+++ b/macros/latex/contrib/thumby/thumby.sty
@@ -0,0 +1,320 @@
+%% Thumby - LaTeX package for creating thumb indexes.
+%
+% Version: 0.1
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Requirements:
+%
+% - memoir document class
+%
+% - Packages:
+%
+% - PerlTeX
+% - tikz
+% - bophook
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Instructions:
+%
+% Put something like the following in your document (we'll call it "foo.tex"):
+%
+% \documentclass[twoside]{memoir}
+%
+% \usepackage{thumby}
+%
+% \thumbySides{two}
+% \thumbyTotalChapters{10}
+% \thumbyPageHeight{792}
+% \thumbyThumbWidth{42.5}
+% \thumbyForeground{white}
+% \thumbyBackground{black}
+% \thumbyNumberFormat{\Huge\textbf{$chapter_number}}
+%
+% \thumbySetup
+%
+% Then, run twice:
+%
+% perltex --latex=pdflatex foo.tex
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Please change the above to reflect your document and preferences.
+% In particular, you should change the \thumbyTotalChapters from 10 to the number
+% of chapters in your document, and the \thumbyPageHeight from 792 to the height
+% of your document (in points), and \thumbySides to reflect whether your document
+% uses one- or two-sided pages.
+%
+% Note: Units for page height, width, etc, are in points.
+%
+% Note: Only normal, numbered chapters will have a thumb index.
+% For example, the of contents and \frontmatter chapters will not have a thumb index.
+%
+% Note: When \thumbyNumberFormat contains the literal $chapter_number
+% Thumby will substitute the actual chapter number for this literal.
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Thumby - LaTeX package for creating thumb indexes.
+%
+% Copyright (C) 2010 Sergey Goldgaber
+%
+% This program is free software: you can redistribute it and/or modify
+% it under the terms of version 3 of the GNU General Public License
+% as published by the Free Software Foundation.
+%
+% This program is distributed in the hope that it will be useful,
+% but WITHOUT ANY WARRANTY; without even the implied warranty of
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+% GNU General Public License for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with this program. If not, see <http://www.gnu.org/licenses/>.
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{thumby}[2010/01/14 v0.1 Thumby]
+
+\typeout{}
+\typeout{***********************************************}
+\typeout{*********** Loading Thumby Package ************}
+\typeout{***********************************************}
+\typeout{}
+
+% We use the tikz library to draw and position the thumb indexes.
+\RequirePackage{tikz}
+
+% We use the perltex package to run perl within LaTeX.
+% This is used to do the calculations of the dimensions
+% of the thumb boxes and their locations, which are fed
+% to tikz.
+\RequirePackage{perltex}
+
+%% We use the bophook package to place a thumb box on each page.
+\RequirePackage{bophook}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Configuration commands.
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\perlnewcommand{\thumbyNumberFormat}[1]{
+ $thumby_number_format = $_[0] ;
+ # Slashes have to be doubled, as otherwise perl will interpret them as indicating
+ # that a special character follows.
+ $thumby_number_format =~ s{/}{//} ;
+ return "\\typeout{Thumby number format: $thumby_number_format}" ;
+}
+
+% Place a thumb index on each page.
+\perlnewcommand{\thumbySides}[1]{
+ $thumby_sides = $_[0] ;
+
+ if ( $thumby_sides eq "one" ) {
+ $output = <<END;
+ % Using command from the bophook package to place a thumb index on each page.
+ \\AtBeginPage{%
+ \\thumbyprintthumbright{\\thumbychapnum}
+ }
+END
+ } elsif ( $thumby_sides eq "two" ) {
+ $output = <<END;
+ % Using command from the bophook package to place a thumb index on each page.
+ \\AtBeginPage{%
+ % Odd pages should have the thumb index on the right,
+ % while even ones on the left.
+ \\checkoddpage
+ \\ifoddpage
+ \\thumbyprintthumbright{\\thumbychapnum}
+ \\else
+ \\thumbyprintthumbleft{\\thumbychapnum}
+ \\fi
+ }
+END
+ } else {
+ $output = <<END;
+ \\PackageError{thumby}{\\protect\\thumbySides \\space must be "one" or "two"}{}
+END
+ }
+ return $output ;
+}
+
+\perlnewcommand{\thumbyBackground}[1]{
+ $thumby_background = $_[0] ;
+ return "" ;
+}
+
+\perlnewcommand{\thumbyForeground}[1]{
+ $thumby_foreground = $_[0] ;
+ return "" ;
+}
+
+\perlnewcommand{\thumbyPageHeight}[1]{
+ $thumby_page_height = $_[0] ;
+
+ # Sanity checks
+ if ( $thumby_page_height =~ m{^\d+$} ) {
+ # An integer.
+ # Looks good. Doing nothing.
+ $output = "" ;
+ } elsif ( $thumby_page_height =~ m{^\d*\.\d+$} ) {
+ # A floating point number.
+ # Looks good. Doing nothing.
+ $output = "" ;
+ } else {
+ $output = "\\PackageError{thumby}{\\protect\\thumbyPageHeight \\space must a number.}{}" ;
+ }
+
+ return $output ;
+}
+
+\perlnewcommand{\thumbyThumbWidth}[1]{
+ $thumby_thumb_width = $_[0] ;
+
+ # Sanity checks
+ if ( $thumby_thumb_width =~ m{^\d+$} ) {
+ # An integer.
+ # Looks good. Doing nothing.
+ $output = "" ;
+ } elsif ( $thumby_thumb_width =~ m{^\d*\.\d+$} ) {
+ # A floating point number.
+ # Looks good. Doing nothing.
+ $output = "" ;
+ } else {
+ $output = "\\PackageError{thumby}{\\protect\\thumbyThumbWidth \\space must a number.}{}" ;
+ }
+
+ return $output ;
+}
+
+\perlnewcommand{\thumbySetup}{
+ $thumby_thumb_height = $thumby_page_height / $thumby_total_chapters ;
+ $half_thumb_width = $thumby_thumb_width / 2 ;
+ $output = <<END;
+\\typeout{}
+\\typeout{** Thumby setup **}
+\\typeout{Sides: $thumby_sides}
+\\typeout{Total chapters: $thumby_total_chapters}
+\\typeout{Page height: $thumby_page_height points}
+\\typeout{Thumb height: $thumby_thumb_height points}
+\\typeout{Thumb width: $thumby_thumb_width points}
+\\typeout{Foreground: $thumby_foreground}
+\\typeout{Background: $thumby_background}
+\\typeout{Chapter number format: $thumby_number_format}
+\\typeout{}
+END
+ return $output ;
+}
+
+\perlnewcommand{\thumbyTotalChapters}[1]{
+ $thumby_total_chapters = $_[0] ;
+ my $output = "" ;
+ if ( $thumby_total_chapters =~ m{^\d+$} ) {
+ if ( $thumby_total_chapters < 1 ) {
+ $output = <<END;
+ \\PackageError{thumby}{\\protect\\thumbyTotalChapters \\space must be greater than 0.}{}
+END
+ } else {
+ # Looks good. Doing nothing.
+ $output = "" ;
+ }
+ } else {
+ $output = <<END;
+ \\PackageError{thumby}{\\protect\\thumbyTotalChapters \\space must be an integer}{}
+END
+ }
+
+ return $output ;
+}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Miscellaneous commands
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Definition of \thumbychapnum, which returns the current chapter number,
+% but only for chapters, not for parts.
+\newcommand{\thumbychapnum}{}
+
+\renewcommand{\mempartinfo}[4]{%
+\renewcommand{\thumbychapnum}{}
+}
+
+\renewcommand{\memchapinfo}[4]{%
+\renewcommand{\thumbychapnum}{\thechapter}
+}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Thumb index printing commands.
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% This command will print a thumb box on the left or right of the page,
+% depending on the value of the second argument given to it.
+%
+% Some sanity checks are also run on the chapter number, to make sure it's valid.
+% NOTE, chapter numbers less than 1 are not printed.
+\perlnewcommand{\thumbyprintthumb}[2]{
+ $thumby_chapter_number = shift ;
+ $left_or_right = shift ;
+
+ # Run some sanity checks on $thumby_chapter_number
+ if ( $thumby_chapter_number eq "" ) {
+ # Doing nothing
+ return ""
+ } elsif ( not ( $thumby_chapter_number =~ m{^\d+$} ) ) {
+ # $thumby_chapter_number is not a number
+ return 'ERROR: chapternumber "' . $thumby_chapter_number . '" is not a number' ;
+ } elsif ( $thumby_chapter_number < 1 ) {
+ # Doing nothing
+ return "" ;
+ }
+
+ # Determine the position of the thumb index
+ if ( $left_or_right eq "left" ) {
+ $horizontal_thumb_position = $half_thumb_width ;
+ $origin = "north west" ;
+ } elsif ( $left_or_right eq "right" ) {
+ $horizontal_thumb_position = -$half_thumb_width ;
+ $origin = "north east" ;
+ }
+
+ $vertical_thumb_position = ( $thumby_chapter_number * $thumby_thumb_height ) - $thumby_thumb_height ;
+
+ $thumby_formatted_chapter_number = $thumby_number_format ;
+ $thumby_formatted_chapter_number =~ s{\$chapter_number}{$thumby_chapter_number} ;
+
+# Tikz code to draw the chapter number surrounded by a box:
+$output = <<END;
+\\pgfrememberpicturepositiononpagetrue
+\\begin{pgfpicture}
+\\pgfusepath{use as bounding box}
+\\pgftransformshift{\\pgfpointanchor{current page}{$origin}}
+\\pgftransformshift{\\pgfpoint{$horizontal_thumb_position}{-$vertical_thumb_position}}
+\\pgfset{minimum width=$thumby_thumb_width}
+\\pgfset{minimum height=$thumby_thumb_height}
+\\pgfsetfillcolor{$thumby_background}
+\\pgfnode{rectangle}{north}{}{thumb}{\\pgfusepath{fill}}
+\\pgfsetfillcolor{$thumby_foreground}
+\\pgfnode{rectangle}{north}{$thumby_formatted_chapter_number}{thumb}{\\pgfusepath{stroke}}
+\\end{pgfpicture}
+END
+ return $output ;
+}
+
+\perlnewcommand{\thumbyprintthumbleft}[1]{
+ $thumby_chapter_number = $_[0] ;
+ return latex_thumbyprintthumb( $thumby_chapter_number, "left" ) ;
+}
+
+\perlnewcommand{\thumbyprintthumbright}[1]{
+ $thumby_chapter_number = $_[0] ;
+ return latex_thumbyprintthumb( $thumby_chapter_number, "right" ) ;
+}
+
+\endinput