% \iffalse %% %% File: nccrules.dtx Copyright (C) 2005 by Alexander I. Rozhenko %% %\NeedsTeXFormat{LaTeX2e} %\ProvidesPackage{nccrules} % [2005/05/13 v1.0 More rules (NCC)] % % \changes{v1.0}{2005/05/13}{This version was uploaded to CTAN} % %<*driver> \let\makeindex\relax \documentclass{ltxdoc} \usepackage{nccrules} \newfootnoterule{starred}{\mboxfill[1.5\width][s]{$*$}} \newfootnoterule{dotted}{\mboxfill[2\width][s]{.}} \newfootnotedashrule{double}{}{.4 1 .4} \newfootnotedashrule{dashed}{3 3}{.4} \newfootnotedashrule{dotdashed}{4 2 1 2 4 -4}{.6} \newfootnotedashrule{ddotdashed}{6 2 1 2 1 2 6 -6}{.6} \GetFileInfo{nccrules.sty} \begin{document} \title{The \textsf{nccrules} package\thanks{This file has version number \fileversion, last revised \filedate.}} \author{Alexander I. Rozhenko\\rozhenko@oapmg.sscc.ru} \date{\filedate} \maketitle \DocInput{nccrules.dtx} \end{document} % % \fi % This package implements % |\dashrule| and |\dashrulefill| commands, % that simplify composing of dashed % lines and dashed multilines. Two kinds of footnote rule generation % commands are also introduced: |\newfootnoterule| creates a footnote % rule with an arbitrary contents and |\newfootnotedashrule| creates % a footnote rule based on dash rule. % % \tableofcontents % % \section{User Interface} % % \subsection{Dash Rules} % % \DescribeMacro\dashrule % The command % \begin{quote} % |\dashrule|\oarg{raise}\marg{h-pattern}\marg{v-pattern} % \end{quote} % prepares a dash rule. Its syntax is quite similar to the |\rule| command % except that \meta{h-pattern} and \meta{v-pattern} can contain a list of % sizes delimited with spaces. List sizes are interpreted as follows: % size, space, size, space, etc. In other words, every odd size is a % size of rule part and every even size is a space between neighbour parts. % If the last size in the list is even % (means a space), its space value is divided by two and % is added before the first rule part and after the last rule part. % Units in sizes can be omitted. In this case, pt-units are supposed. % Examples: % \begin{center} % \begin{tabular}{@{}l@{\qquad\qquad}l@{}} % x\dashrule[.5ex]{10mm}{1pt}x & % |x\dashrule[.5ex]{10mm}{1pt}x| \\ % x\dashrule{5mm 3 3 3 5mm}{.4}x & % |x\dashrule{5mm 3 3 3 5mm}{.4}x| \\ % x\dashrule{1}{3 2 3}x& % |x\dashrule{1}{3 2 3}x|\\ % x\dashrule{2 2}{2 2}x & % |x\dashrule{2 2}{2 2}x|\\ % x\dashrule{5 3 1 3 5 10}{1 1 0.4 1 1}x & % |x\dashrule{5 3 1 3 5 10}{1 1 0.4 1 1}x| % \end{tabular} % \end{center} % % \DescribeMacro\dashrulefill % The command % \begin{quote} % |\dashrulefill|\oarg{raise}\oarg{leader-type}\marg{h-pattern}\marg{v-pattern} % \end{quote} % fills a free space with a dash rule. The rule is composed from the 1st, % 3rd, and 4th arguments of the command and is repeated as more times as % necessary to fill a free horizontal space. The rest of space after filling is % stored depending on \meta{leader-type} used. Default leader type % is ``aligned leaders'': every rule is aligned to the multiple of its width % counted from the left boundary of filled box. Other cases are: |c| means % centered leaders (all extra spaces are collected at both ends of fill % area), |x| means distributed leaders (extra spaces are uniformly % distributed between every dash rule), and |s| means stretched leaders % (the space in h-pattern going after the last rule size is considered as % stretchable space and rules are stretched to the whole width of the % fill area). % % Example: % \begin{flushleft} % |\noindent x\dashrulefill{2 2}{2}\mbox{}\\|\\ % |xxxxx\dashrulefill[.4ex]{2 2}{2}\mbox{}\\|\\ % |\mbox{}\dashrulefill[.4ex]{4 4}{2}\mbox{}\\|\\ % |\mbox{}\dashrulefill[.4ex][c]{4 4}{2}\mbox{}\\|\\ % |\mbox{}\dashrulefill[.4ex][x]{4 4}{2}\mbox{}\\|\\ % |\mbox{}\dashrulefill[.4ex][s]{4 4}{2}\mbox{}\\|\\ % |\mbox{}\dashrulefill[.4ex][s]{4 2 1 2 4 -4}{1}\mbox{}\\[1ex]|\\ % |\mbox{}\dashrulefill[0mm][c]{2 3}{2 3 2 3 2}\mbox{}\\|\\ % |\mbox{}\dashrulefill{5 3 1 3 5}{1 1 0.4 1 1}\mbox{}\\|\\ % |\mbox{}\dashrulefill[0mm][c]{5 3 1 3 5}{1 1 0.4 1 1}\mbox{}\\[-2ex]|\\ % |\mbox{}\hrulefill| % \end{flushleft} % % It produces the following: % % \noindent x\dashrulefill{2 2}{2}\mbox{}\\ % xxxxx\dashrulefill[.4ex]{2 2}{2}\mbox{}\\ % \mbox{}\dashrulefill[.4ex]{4 4}{2}\mbox{}\\ % \mbox{}\dashrulefill[.4ex][c]{4 4}{2}\mbox{}\\ % \mbox{}\dashrulefill[.4ex][x]{4 4}{2}\mbox{}\\ % \mbox{}\dashrulefill[.4ex][s]{4 4}{2}\mbox{}\\ % \mbox{}\dashrulefill[.4ex][s]{4 2 1 2 4 -4}{1}\mbox{}\\[1ex] % \mbox{}\dashrulefill[0mm][c]{2 3}{2 3 2 3 2}\mbox{}\\ % \mbox{}\dashrulefill{5 3 1 3 5}{1 1 0.4 1 1}\mbox{}\\ % \mbox{}\dashrulefill[0mm][c]{5 3 1 3 5}{1 1 0.4 1 1}\mbox{}\\[-2ex] % \mbox{}\hrulefill % % \subsection{Custom Footnote Rules} % % In |manyfoot| package, you can separate footnote levels % with custom footnote rules. In this package we provide two ways for % creation such rules. All footnote rules should follow the following % contract: they must be prepared as |\hrule| or |\hbox|; the total height % of rule or box must be compensated with kerns. Usually a negative % kern is inserted before a footnote rule and a nonnegative kern is % inserted after the rule. The sum of both kerns and of total height of % rule must be equal to zero. We follow this contract in footnote rules % created with this package. % % In |manyfoot| package, every footnote rule must have a name % |\|\meta{prefix}|footnoterule|. So, we need to specify the prefix only % when a new footnote rule is constructed. Next that we need to specify is % a rule width. If width is omitted, the default width of |0.4\columnwidth| % is used. The footnote rule generation commands described below % are used in the preamble only. % % \DescribeMacro\newfootnoterule % The command % \begin{quote} % |\newfootnoterule|\marg{prefix}\oarg{width}\marg{rule code} % \end{quote} % produces a custom user-defined rule. % The \meta{rule code} must be stretchable to the given width. % The |\mboxfill| command from the |mboxfill| package is useful in it. % Examples: % \begin{quote} % |\newfootnoterule{starred}{\mboxfill[1.5\width][s]{$*$}}|\\ % |\newfootnoterule{dotted}{\mboxfill[2\width][s]{.}}| % \end{quote} % The |\starredfootnoterule| and |\dottedfootnoterule| commands % are created here. They produce the following rules: % % \vspace{3mm} % \starredfootnoterule % \dottedfootnoterule % % \DescribeMacro\newfootnotedashrule % The command % \begin{quote} % |\newfootnotedashrule|\marg{prefix}\oarg{width}\marg{h-pattern}\marg{v-pattern} % \end{quote} % produces a dash footnote rule. The special case, when \meta{h-pattern} % is empty means the solid rule. Examples: % \begin{quote} % |\newfootnotedashrule{double}{}{.4 1 .4}|\\ % |\newfootnotedashrule{dashed}{3 3}{.4}|\\ % |\newfootnotedashrule{dotdashed}{4 2 1 2 4 -4}{.6}|\\ % |\newfootnotedashrule{ddotdashed}{6 2 1 2 1 2 6 -6}{.6}| % \end{quote} % The following rules are created here: % |\doublefootnoterule|, |\dashedfootnoterule|, % |\dotdashedfootnoterule|, and |\ddotdashedfootnoterule|. % They produce the following rules: % % \vspace{2mm}% % \doublefootnoterule % \dashedfootnoterule % \dotdashedfootnoterule % \ddotdashedfootnoterule % % \StopEventually{} % % \section{The Implementation} % % The |mboxfill| package is required here: % \begin{macrocode} %<*package> \RequirePackage{mboxfill} % \end{macrocode} % % \begin{macro}{\dashrule} % |\dashrule|\oarg{raise}\marg{h-pattern}\marg{v-pattern} % \begin{macrocode} \newcommand\dashrule{} \DeclareRobustCommand*\dashrule[3][\z@]{% \setbox\@tempboxa\vbox{}% \NCC@composedash{\NCC@vdash{#2}}{#3}% \setlength\@tempdima{#1}\leavevmode \raise\@tempdima\hbox{% \vbox to\@tempdimc{\vss\unvbox\@tempboxa\vss}}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\dashrulefill} % |\dashrulefill|\oarg{raise}\oarg{leader-type}\marg{h-pattern}\marg{v-pattern}\\ % This command is a composition of the |\mboxfill| and % |\dashrule| commands. A trick is applied here: % we decrease dash rule width on the value of last space % in it and then apply |\mboxfill|. % \begin{macrocode} \newcommand*\dashrulefill[1][\z@]{% \@ifnextchar[{\NCC@dashfill{#1}}{\NCC@dashfill{#1}[]}% } \def\NCC@dashfill#1[#2]#3#4{% \NCC@composedash{}{#3}% \advance\@tempdimb-\@tempdimc \setbox\@tempboxa\hb@xt@-\@tempdimb {\hss\dashrule[#1]{#3}{#4}\hss}% \mboxfill[\@tempdimc][#2]{\box\@tempboxa}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\NCC@composedash} % |\NCC@composedash|\marg{action}\marg{pattern} parses the pattern % and calls the action when a rule size is parsed. At this point, % the |\@tempdima| contains a size parsed and |\@tempdimb| contains % the previous space. In |\@tempdimc|, the whole rule size is calculated. % \begin{macrocode} \def\NCC@composedash#1#2{% \@tempdimb\z@ % Last space \@tempdimc\z@ % Accumulator \@tempswatrue % True value means producing an entry \NCC@parsedash#2 ! !\@nil{% \advance\@tempdimc\@tempdima \if@tempswa #1\@tempswafalse \else \@tempdimb\@tempdima \@tempswatrue \fi }% } % \end{macrocode} % \end{macro} % % \begin{macro}{\NCC@parsedash} % Pattern parser: % \begin{macrocode} \def\NCC@parsedash#1 #2\@nil#3{% \if/#1/\else % Empty arg. ignored \ifx#1!\else % Exclamation mark ends the list \@defaultunits\@tempdima#1pt\relax\@nnil #3\NCC@parsedash#2\@nil{#3}% \fi \fi } % \end{macrocode} % \end{macro} % % \begin{macro}{\NCC@vdash} % |\NCC@vdash|\marg{h-pattern} is % applied when a vertical dash is composed. % |\@tempdimb| contains the required skip, % |\@tempdima| contains the rule height. % \begin{macrocode} \def\NCC@vdash#1{% \setbox\@tempboxa\vbox{% \unvbox\@tempboxa \vskip\@tempdimb \setbox\@tempboxa\hbox{}% \@tempskipa\@tempdima % Save rule height in \@tempskipa \NCC@composedash{\NCC@hdash}{#1}% \hb@xt@\@tempdimc{\hss\unhbox\@tempboxa\hss}% }% } % \end{macrocode} % \end{macro} % % \begin{macro}{\NCC@hdash} % This action is applied when a horizontal dash is composed. % |\@tempdimb| contains the required skip, % |\@tempdima| contains the rule width, % |\@tempskipa| contains the rule height. % \begin{macrocode} \def\NCC@hdash{% \setbox\@tempboxa\hbox{% \unhbox\@tempboxa \kern\@tempdimb \vrule \@width\@tempdima \@height\@tempskipa }% } % \end{macrocode} % \end{macro} % % \begin{macro}{\NCC@fnoterule} % |\NCC@fnoterule|\marg{width}\marg{rule code}\\ % This is the footnote rule producing command. % As usual, two kerns must be inserted surround the rule: a negative % kern before the rule and a nonnegative kern after the rule. % The sum of kern values and of the total rule height must % vanish. Kerns are calculated in such a way to vertically center % the rule relative to 2.8pt distance top to the current position. % If the total height of rule is greater than 5.6pt, the rule is moved % up on the total rule height (the kern after the rule is zero in this case). % \begin{macrocode} \def\NCC@fnoterule#1#2{% \setlength\@tempdima{#1}% \setbox\@tempboxa\hb@xt@\@tempdima{#2}% \@tempdima\ht\@tempboxa \advance\@tempdima\dp\@tempboxa \@tempdimb 2.8\p@ \@tempdimc .5\@tempdima \ifdim\@tempdimc>\@tempdimb \@tempdimb\@tempdimc \fi \advance\@tempdimb\@tempdimc \kern-\@tempdimb \box\@tempboxa \advance\@tempdimb -\@tempdima \kern\@tempdimb } % \end{macrocode} % \end{macro} % % \begin{macro}{\NCC@fnotedashrule} % |\NCC@fnotedashrule|\marg{width}\marg{h-pattern}\marg{v-pattern}\\ % Produces the rule based on |\dashrulefill|. A special case of empty % \meta{h-pattern} means the solid (maybe multi-line) rule. % \begin{macrocode} \def\NCC@fnotedashrule#1#2#3{% \NCC@fnoterule{#1}{\def\@tempa{#2}% \ifx\@tempa\@empty \@tempskipb\@tempdima \dashrule{\@tempskipb}{#3}% \else \dashrulefill[\z@][s]{#2}{#3}% \fi }% } % \end{macrocode} % \end{macro} % % \begin{macro}{\NCC@fnotecreate} % |\NCC@fnotecreate|\marg{prefix}\marg{body}\\ % Creates a footnote rule whose name is composed from the % given \meta{prefix} and |footnoterule|. For example if the prefix % is |dashed|, the |\dashedfootnoterule| command will be created. % \begin{macrocode} \def\NCC@fnotecreate#1{% \edef\@tempa{\noexpand\newcommand*% \expandafter\noexpand\csname #1footnoterule\endcsname}% \@tempa } \@onlypreamble\NCC@fnotecreate % \end{macrocode} % \end{macro} % % \begin{macro}{\NCC@fnoteprepare} % |\NCC@fnoteprepare|\marg{driver}\marg{prefix}\oarg{width}\\ % Prepares a footnote rule command. The \meta{driver} is a command % that will be called for collecting rule code (it gets more arguments % from the input). When a driver prepares the code, it calls the % |\NCC@fnotecreate| command. If \meta{width} is omitted, the standard % width of |0.4\columnwidth| is used. % \begin{macrocode} \def\NCC@fnoteprepare#1#2{% \@ifnextchar[{#1{#2}}{#1{#2}[.4\columnwidth]}% } \@onlypreamble\NCC@fnoteprepare % \end{macrocode} % \end{macro} % % Footnote rule creation driver has the following syntax: % \begin{quote} % |\|\meta{driver}\marg{prefix}\oarg{width}\meta{more arguments} % \end{quote} % % \begin{macro}{\newfootnoterule} % |\newfootnoterule|\marg{prefix}\oarg{width}\marg{rule code} % \begin{macrocode} \newcommand\newfootnoterule{\NCC@fnoteprepare\NCC@fnotedriver} \def\NCC@fnotedriver#1[#2]#3{% \NCC@fnotecreate{#1}{\NCC@fnoterule{#2}{#3}}% } \@onlypreamble\newfootnoterule \@onlypreamble\NCC@fnotedriver % \end{macrocode} % \end{macro} % % \begin{macro}{\newfootnotedashrule} % |\newfootnotedashrule|\marg{prefix}\oarg{width}\marg{h-pattern}\marg{v-pattern} % \begin{macrocode} \newcommand\newfootnotedashrule{\NCC@fnoteprepare\NCC@fnotedashdriver} \def\NCC@fnotedashdriver#1[#2]#3#4{% \NCC@fnotecreate{#1}{\NCC@fnotedashrule{#2}{#3}{#4}}% } \@onlypreamble\newfootnotedashrule \@onlypreamble\NCC@fnotedashdriver % % \end{macrocode} % \end{macro} \endinput