% \iffalse meta-comment % % Copyright (C) 2011 by Raphaël Pinson % --------------------------------------------------------------------------- % This work may be distributed and/or modified under the % conditions of the LaTeX Project Public License, either version 1.3 % 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.3 or later is part of all distributions of LaTeX % version 2005/12/01 or later. % % This work has the LPPL maintenance status `maintained'. % % The Current Maintainer of this work is Raphaël Pinson. % % This work consists of the files nowidow.dtx and nowidow.ins % and the derived filebase nowidow.sty. % % \fi % % \iffalse %<*driver> \ProvidesFile{nowidow.dtx} % %\NeedsTeXFormat{LaTeX2e}[1999/12/01] %\ProvidesPackage{nowidow} %<*package> [2011/09/20 1.0 Easily prevent widows and orphans] % % %<*driver> \documentclass{ltxdoc} \usepackage{nowidow}[2011/09/14] \usepackage{epigraph} \EnableCrossrefs \CodelineIndex \RecordChanges \begin{document} \DocInput{nowidow.dtx} \PrintChanges \PrintIndex \end{document} % % \fi % % \CheckSum{55} % % \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{1.0}{2011/09/20}{Improve documentation} % \changes{0.4}{2011/09/14}{Add orphan management} % \changes{0.3}{2011/09/13}{Add setnowidow command and package options} % \changes{0.2}{2011/09/11}{Fix nowidow@X} % \changes{0.1}{2011/09/11}{Initial version} % % \DoNotIndex{\newcommand,\newenvironment} % % \providecommand*{\url}{\texttt} % \GetFileInfo{nowidow.dtx} % \title{The \textsf{nowidow} package} % \author{Rapha\"el Pinson \\ \url{raphink@gmail.com}} % \date{\fileversion~from \filedate} % % \maketitle % % \section{Introduction} % % \setlength{\epigraphwidth}{15em} % \renewcommand{\epigraphsize}{\footnotesize} % \epigraph{% % Religion that is pure and undefiled \\ % \hspace{2em} before God, the Father, is this: \\ % \hspace{2em} to visit orphans and widows \\ % \hspace{5em} in their affliction, \\ % \hspace{5em} and to keep oneself \\ % \hspace{5em} unstained from the world. % }{James~1:27 --- ESV} % % This package was based on the answer to a % question\footnote{\url{http://tex.stackexchange.com/questions/26272/expansion-issue-with-begingroup-and-foreach/26275\#26275}} % about expansion with |\begingroup| and |\foreach| asked on \url{http://tex.stackexchange.com}. % Thanks to Martin Scharrer\footnote{\url{http://tex.stackexchange.com/users/2975/martin-scharrer}} for his solution. % % Widows (single lines at the top of a page) and orphans % (single lines at the bottom of a page) happen frequently % and should be avoided. % % The |\widowpenalties| and |\clubpenalties| commands allow to prevent them, % but their syntax is a bit complex to use. % % The \textsf{nowidow} package provides |\nowidow| and |\noclub| commands % which are simpler to use in order to prevent widows and orphans. % % \section{Usage} % % To load the package, use: % % \begin{verbatim} % \usepackage[]{nowidow} % \end{verbatim} % % When no options are specified, the package will only provide macros % and not load any settings automatically. % The following sections describe the possible options for this package. % % \subsection{Options} % % \DescribeMacro{defaultlines=} % % The \texttt{defaultlines} option % sets the default minimal number of lines % to be kept after or before the page break. % % \DescribeMacro{all} % % The \texttt{all} option sets the widow and orphan penalties % for the whole document upon loading the package, for example: % % \begin{verbatim} % \usepackage[defaultlines=4,all]{nowidow} % \end{verbatim} % % \subsection{Commands} % % \DescribeMacro{\nowidow} % % To prevent widows in a paragraph, call |\nowidow| % immediatly at the end of the paragraph (without an empty line), % optionally followed by the minimal number of lines you % want after the page break: % % \begin{verbatim} % This paragraph overflows to the next page, % but I really don't want any widows in it. % \nowidow[3] % \end{verbatim} % % The minimal number of lines to be kept after % the page break defaults to 2 if not specified % or overridden by the \texttt{defaultlines} option. % % \DescribeMacro{\setnowidow} % % This macro is similar to |\nowidow| but sets % the widow penalty for the whole document % instead of the current paragraph only. % % This macro is used when the package is loaded % with the \texttt{all} option. % % \DescribeMacro{\noclub} % % This is similar to the |\nowidow| command % but prevents orphans at the end of a page: % % \begin{verbatim} % This paragraph overflows to the next page, % but I really don't want any orphans in it. % \noclub[3] % \end{verbatim} % % The minimal number of lines to be kept before % the page break defaults to 2 if not specified % or overridden by the \texttt{defaultlines} option. % % \DescribeMacro{\setnoclub} % % This macro is similar to |\noclub| but sets % the orphan penalty for the whole document % instead of the current paragraph only. % % This macro is used when the package is loaded % with the \texttt{all} option. % % \StopEventually{} % % \section{Implementation} % % \iffalse %<*package> % \fi % % \begin{macrocode} \ProvidesPackage{nowidow} % \end{macrocode} % % \begin{macro}{Options} % \begin{macrocode} \RequirePackage{kvoptions} \SetupKeyvalOptions{ family=nowidow, prefix=nowidow@, } \DeclareStringOption[2]{defaultlines} \DeclareBoolOption{all} \ProcessKeyvalOptions* % \end{macrocode} % \end{macro} % % \begin{macro}{\nowidow@X} % \begin{macrocode} \def\nowidow@X#1{% \ifnum#1<\nowidowmax 10000 \expandafter\nowidow@X\expandafter{% \the\numexpr(#1)+1\expandafter\relax\expandafter}% \fi } % \end{macrocode} % \end{macro} % % \begin{macro}{\setnowidow} % \begin{macrocode} \newcommand{\setnowidow}[1][\nowidow@defaultlines]{% \mathchardef\nowidowmax#1\relax \widowpenalties #1 \nowidow@X{1} 0\par } \ifnowidow@all \setnowidow \fi % \end{macrocode} % \end{macro} % % \begin{macro}{\nowidow} % \begin{macrocode} \newcommand{\nowidow}[1][\nowidow@defaultlines]{% \begingroup \setnowidow[#1] \endgroup } % \end{macrocode} % \end{macro} % % \begin{macro}{\setnoclub} % \begin{macrocode} \newcommand{\setnoclub}[1][\nowidow@defaultlines]{% \mathchardef\nowidowmax#1\relax \clubpenalties #1 \nowidow@X{1} 0\par } \ifnowidow@all \setnoclub \fi % \end{macrocode} % \end{macro} % % \begin{macro}{\noclub} % \begin{macrocode} \newcommand{\noclub}[1][\nowidow@defaultlines]{% \begingroup \setnoclub[#1] \endgroup } % \end{macrocode} % \end{macro} % % \iffalse % % \fi % % \Finale \endinput