diff options
author | Karl Berry <karl@freefriends.org> | 2017-03-16 21:43:23 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2017-03-16 21:43:23 +0000 |
commit | 963f87c9830b8a8617be166bc065fbfb21223f86 (patch) | |
tree | 82f2f0bc099c0f65a71d391c759b5df75a57d398 /Master/texmf-dist/tex/latex/studenthandouts | |
parent | 3ab47cf457a56372d1185ab7990bd2035d6f5754 (diff) |
studenthandouts (16mar17)
git-svn-id: svn://tug.org/texlive/trunk@43516 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/latex/studenthandouts')
-rw-r--r-- | Master/texmf-dist/tex/latex/studenthandouts/studenthandouts.sty | 426 |
1 files changed, 426 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/latex/studenthandouts/studenthandouts.sty b/Master/texmf-dist/tex/latex/studenthandouts/studenthandouts.sty new file mode 100644 index 00000000000..615cfd2a4ea --- /dev/null +++ b/Master/texmf-dist/tex/latex/studenthandouts/studenthandouts.sty @@ -0,0 +1,426 @@ +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{studenthandouts}[2017/03/15 Handouts Package] + +% +% THE STUDENT HANDOUTS PACKAGE: studenthandouts +% +% Author: James Fennell <jamespfennell@gmail.com> +% +% License: +% 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 2005/12/01 or later. +% + +% +% HOW THIS CODE IS ORGANIZED +% +% In order: +% +% - Required packages +% - The blanks/noblanks option processing +% - General Latex code required for the rest of the code +% +% - Then code appears in the order its functionality appears in the documentation. +% + + + +% +% REQUIRED PACKAGES +% + + +\RequirePackage{changepage} +\RequirePackage{ifthen} +\RequirePackage{fmtcount} +\RequirePackage{tocloft} +\RequirePackage{geometry} +\RequirePackage{fancyhdr} + + + +% +% THE BLANKS/NOBLANKS OPTION PROCESSING +% + + +% The blanks/noblanks switch is in @handoutsBlanksFlag +\newboolean{@handoutsBlanksFlag} + +\DeclareOption{blanks}{ + \setboolean{@handoutsBlanksFlag}{true} +} + +\DeclareOption{noblanks}{ + \setboolean{@handoutsBlanksFlag}{false} +} + +\ExecuteOptions{blanks} + +\ProcessOptions\relax + + + +% +% GENERAL LATEX CODE +% + +% These commands are used to define global variables. +% They are needed because a lot of the handout output commands are redefined in an if statement scope but need to be defined also outside of this scope. +\def\gnewcommand{\g@star@or@long\new@command} +\def\grenewcommand{\g@star@or@long\renew@command} +\def\g@star@or@long#1{% + \@ifstar{\let\l@ngrel@x\global#1}{\def\l@ngrel@x{\long\global}#1}} + + +%Checks if element #1 is the comma separated list of elements in #2 +%Kudos to Werner on Tex.SE for this modified version: http://tex.stackexchange.com/questions/353559/how-to-convert-macro-output-to-string +\newcommand\@ifmemberthenelse[2]{% + \begingroup + \edef\x{\endgroup\noexpand\in@{,#1,}{,#2,}}\x% + \ifin@ + \expandafter\@firstoftwo% + \else + \expandafter\@secondoftwo% + \fi +} + + + +% +% 1 BASIC IMPORT FUNCTIONALITY +% + + + +% Every handout must start with this command, which sets the handout title. If no handout title is required, write \sethandouttitle{} +\newcommand{\sethandouttitle}[1]{ + % Set the page style (for the headers and footers) + \pagestyle{studenthandout} + % Set the handout title + \grenewcommand{\thehandouttitle}{#1} + + % We want the handout's full title to appear in the table of contents. + % However becuase the way Latex handles TOCs we can't use the command \thehandoutfulltitle directly. + % So the following just manually adds the full title to the TOC. + \ifthenelse{\equal{#1}{}}{ + \addcontentsline{toc}{subsection}{{\theunitnumber.\thehandoutnumber}} + }{ + \addcontentsline{toc}{subsection}{{\theunitnumber.\thehandoutnumber}: \thehandouttitle} + } +} + + +% This command imports handout #1.#2 - that is, unit #1, handout #2 +\newcommand{\importhandout}[2]{ + + % Set the page layout and headers and footers to be that of the handouts + % For some reason it's better to do it at this point rather than when the handout is about to be imported. + \thehandoutsgeometry + \pagestyle{studenthandout} + + % Use the \@ifimporting then command to check if this handout is supposed to be imported. + % If it is, continue + % The \@ifimporting command is defined below, in section 2 + \@ifimportingthen{#1}{#2}{ + % Importing #1.#2! + + %Start new page + \clearpage + + + % The following determines whether or not to insert a blank page. + % First, if the handout that just concluded has an odd number of pages then a blank page should be put in. + % Actually do this if the blanks option is set. + \ifodd\value{@handoutsHandoutPageNumber} + \ifthenelse{\boolean{@handoutsBlanksFlag}}{ + \thispagestyle{empty} + \hspace{1cm} + \clearpage + }{} + \else + \fi + + + + % Set some of the current handout information + \grenewcommand{\@handoutsThisUnit}{#1} + \grenewcommand{\theunitnumber}{#1} + \grenewcommand{\thehandoutnumber}{#2} + \setcounter{@handoutsHandoutPageNumber}{0} + + % This next line checks if the unit has changed. + % If it has, a unit line will be added to the TOC + \ifthenelse{\equal{\@handoutsPrevUnit}{\@handoutsThisUnit}}{}{% + % Add the full unit title to the TOC + % Because of the way Latex handles TOCs, this is done manually rather than relying on the \thefullunittitle command + \ifcsname @handoutsUnitTitle@#1\endcsname% + \addcontentsline{toc}{section}{Unit #1: {\csname @handoutsUnitTitle@#1\endcsname}} + \else% + \addcontentsline{toc}{section}{Unit #1} + \fi% + + %Change some of the unit information + \grenewcommand{\theunittitle}{\csname @handoutsUnitTitle@#2\endcsname} + \grenewcommand{\@handoutsPrevUnit}{#1}% + } + % No actually import Handout #1.#2 + \input{\thehandoutsdirectory handout-#1-#2.tex} + } + + % At the conclusion of the handout restore the page layout and headers and footers + \restoregeometry + \pagestyle{empty} + +} + + + +% +% 2 HANDOUT IMPORT MANAGEMENT COMMANDS +% + + + + +% PRIVATE VARIABLES +% All of these are preceded by \@handouts. + +\newcommand{\@handoutsUnitsToImport}{all} +\newcommand{\@handoutsHandoutsToImport}{all} +\newcommand{\@handoutsPrevUnit}{} +\newcommand{\@handoutsThisUnit}{} + +\newboolean{@handoutsImportFlag} +\newcounter{@handoutsHandoutPageNumber} +\setcounter{@handoutsHandoutPageNumber}{0} +\newcounter{@handoutsPNAtLastHPNChange} +\setcounter{@handoutsPNAtLastHPNChange}{0} + + +\newcommand{\importall}{ + \importallunits + \importallhandouts +} + +\newcommand{\importnone}{ + \renewcommand{\@handoutsUnitsToImport}{} + \renewcommand{\@handoutsHandoutsToImport}{} +} + +\newcommand{\importonlyunits}[1]{ + \ifthenelse{\equal{\@handoutsHandoutsToImport}{}}{\renewcommand{\@handoutsHandoutsToImport}{all}}{} + \renewcommand{\@handoutsUnitsToImport}{#1} +} + +\newcommand{\importonlyhandouts}[1]{ + \ifthenelse{\equal{\@handoutsUnitsToImport}{}}{\renewcommand{\@handoutsUnitsToImport}{all}}{} + \renewcommand{\@handoutsHandoutsToImport}{#1} +} + +\newcommand{\importallunits}{ + \renewcommand{\@handoutsUnitsToImport}{all} +} + +\newcommand{\importallhandouts}{ + \renewcommand{\@handoutsHandoutsToImport}{all} +} + +\newcommand{\theunittitle} + + + + +%Given a handout unit #1 and handout number #2, uses the importing rules to determine if #1.#2 is should be imported and if so, runs #3 (via \@firstofone, not directly.) +\newcommand{\@ifimportingthen}[2]{ + + %Checks if the current unit is in the list of units to be imported. + %Note that if importing all units this will next line will return False, but this isn't a problem as the all condition is manually considered. + \@ifmemberthenelse{#1}{\@handoutsUnitsToImport}{\setboolean{@handoutsImportFlag}{true}}{\setboolean{@handoutsImportFlag}{false}} + + %Checks IF the current unit should be imported THEN continues ELSE stops + \ifthenelse + {% + \equal{\@handoutsUnitsToImport}{all}% IF importing all units + \or% OR + \boolean{@handoutsImportFlag}% IF importing the current unit + }{ + %The current unit should be imported. Now see if the current handout should be. + + %Checks if the current handout is in the list of handouts to be imported. + %Note that if importing all handouts the next line will return False, but this isn't a problem as the all condition is manually considered. + \@ifmemberthenelse{#1.#2}{\@handoutsHandoutsToImport}{\setboolean{@handoutsImportFlag}{true}}{\setboolean{@handoutsImportFlag}{false}} + + \ifthenelse + {% + \equal{\@handoutsHandoutsToImport}{all}% IF importing all handouts + \or% OR + \boolean{@handoutsImportFlag}% IF importing the current handout + }{ + %The current handout SHOULD be imported + }{ + %The current handout should not be imported. + \expandafter\@gobble% + } + }{ + %The current unit should not be imported. + \expandafter\@gobble% + }% +} + + + + + + +% +% 3.2.1 THE HANDOUTS SUBDIRECTORY +% + +%The directory in which the individual Latex files for each handout are stored +\newcommand{\thehandoutsdirectory}{handouts/} + + +% +% 4.1 TABLE OF CONTENTS STYLING +% + + +% This is the styling for the handouts table of contents. +% Styling done through the tocloft package. + +% Set the TOC page to have empty page style +\tocloftpagestyle{empty} + +% UNIT TOC ENTRIES +% Unit TOC entries in bold +\renewcommand{\cftsecfont}{\bfseries} +% This sets the bit that comes between the unit full title and the page number +\renewcommand{\cftsecleader}{\hspace{0.25cm}\textbullet\hspace{0.25cm}} +% Align the page numbers to the left, next to the unit full title +\renewcommand{\cftsecafterpnum}{\cftparfillskip} + +% HANDOUT TOC ENTRIES +% Handout TOC entries in italic +\renewcommand{\cftsubsecfont}{\it} +% This sets the bit that comes between the handout full title and the page number +\renewcommand{\cftsubsecleader}{\hspace{0.25cm}$\cdot$\hspace{0.25cm}} +% Align the page numbers to the left, next to the handout full title +\renewcommand{\cftsubsecafterpnum}{\cftparfillskip} + +% Align numbers on the left +\renewcommand{\cftpnumalign}{l} + + + +% +% 4.2 SETTING UNIT TITLES +% + +% This command saves the title #2 of unit #1. +% It works by saving the title in the command \@handoutsUnitTitle@X, where X is the title. +\newcommand{\setunittitle}[2]{ + \expandafter\def\csname @handoutsUnitTitle@#1\endcsname{#2} +} + + + + + +% +% 5.1 HANDOUT OUTPUT COMMANDS +% + +%The following \the_ commands are used to output information about the current handout being handled. These are primarily used to generate the handout header and footer. + +\newcommand{\thehandoutslabel}{Handout} %What `handouts' are referred to in the output. Alternative options include `student worksheets' and 'funsheets' +\newcommand{\theunitnumber}{} +\newcommand{\thehandoutnumber}{} +\newcommand{\thehandouttitle}{} +\newcommand{\thehandoutscredit}{} + +\newcommand{\thehandoutfulltitle}{% + \ifthenelse{\equal{\thehandouttitle}{}}{% + {{\theunitnumber.\thehandoutnumber}}% + }{% + {{\theunitnumber.\thehandoutnumber}: \thehandouttitle}% + }% +} + +\newcommand{\theunitfulltitle}{% + \ifthenelse{\equal{\theunittitle}{}}{% + {{\theunitnumber}}% + }{% + {{\theunitnumber}: \theunittitle}% + }% +} + +\newcommand{\thehandoutpage}{% + %If the page number has changed since the handout page number last change, change nothing. + %Otherwise, increment the handout page number + \ifthenelse{\equal{\value{page}}{\value{@handoutsPNAtLastHPNChange}}}{}{% + \stepcounter{@handoutsHandoutPageNumber}% + }% + \arabic{@handoutsHandoutPageNumber}% + \setcounter{@handoutsPNAtLastHPNChange}{\value{page}} +} + + +\newcommand{\@somehandoutinfo}[1]{ + \texttt{\@backslashchar#1}&\csname #1\endcsname{} \\ +} +\newcommand{\allhandoutinfo}{ + \begin{tabular}{rl} + \@somehandoutinfo{thehandoutnumber} + \@somehandoutinfo{thehandouttitle} + \@somehandoutinfo{thehandoutfulltitle} + \@somehandoutinfo{thehandoutpage} + \@somehandoutinfo{thepage} + \@somehandoutinfo{theunitnumber} + \@somehandoutinfo{theunittitle} + \@somehandoutinfo{theunitfulltitle} + \@somehandoutinfo{thehandoutslabel} + \@somehandoutinfo{thehandoutscredit} + \end{tabular} + +} + + + + + + + + +% +% 5 CODE RELATED TO THE STYLING +% + + + +% The command is executed when the package wants to change to the page layout of the handouts. +\newcommand{\thehandoutsgeometry}{ + \newgeometry{top=3cm,left=2cm,right=2cm,bottom=2.5cm} +} + + +% This defines the default styling of the handout's headers and footers. +\fancypagestyle{studenthandout}{% + \renewcommand{\headrulewidth}{0.5pt} + \renewcommand{\footrulewidth}{0.5pt} + \fancyhf{} + \fancyhead[L]{{\Large \textit{\thehandoutslabel{} \thehandoutfulltitle}}} + \fancyfoot[L]{\thehandoutscredit} + \fancyfoot[R]{Page \thehandoutpage} + \fancyhead[R]{} +} + + + + + + |