diff options
author | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
commit | e0c6872cf40896c7be36b11dcc744620f10adf1d (patch) | |
tree | 60335e10d2f4354b0674ec22d7b53f0f8abee672 /usergrps/uktug/baskervi/5_4/hhstyles.tex |
Initial commit
Diffstat (limited to 'usergrps/uktug/baskervi/5_4/hhstyles.tex')
-rw-r--r-- | usergrps/uktug/baskervi/5_4/hhstyles.tex | 736 |
1 files changed, 736 insertions, 0 deletions
diff --git a/usergrps/uktug/baskervi/5_4/hhstyles.tex b/usergrps/uktug/baskervi/5_4/hhstyles.tex new file mode 100644 index 0000000000..b966bc2e97 --- /dev/null +++ b/usergrps/uktug/baskervi/5_4/hhstyles.tex @@ -0,0 +1,736 @@ +%\usepackage{hhmuf,hhflxbox} % for presentation +%\usepackage{hhcount} % for presentation +%\usepackage{amssymb,epic,curves} % for illustrations +%\usepackage{verbatim} % for verbatim displaying of examples +%\usepackage{xspace} % for ease of typing + +\makeatletter + +% The following has been copied from my personal tools style file hhutils.sty +% (NB: This is _not_ the same file as the public style file hhutils0.sty!) + +\def\={\verb=} +\def\<#1>{\macroname{#1}} +\def\:{\linebreak[1]} + +% The following input definitions used for examples: + +% \input hhst11a.tex and hhst11b.tex are input where needed +% \input hhst12a.tex up to hhst12e.tex are input where needed +\input hhst22a.tex +% hhst22b.tex, hhst22c.tex and hhst22d.tex are input where they are needed +\input hhst22e.tex +% hhst23a.tex is input where needed +\input hhst24a.tex +% hhst24b.tex is input where needed +\input hhst32a.tex +\input hhst32b.tex +\input hhst32c.tex + +\def\dashbox(#1,#2)(#3,#4){ + \dashline{40}(#1,#2)(#1,#4)\dashline{40}(#1,#4)(#3,#4) + \dashline{40}(#1,#2)(#3,#2)\dashline{40}(#3,#2)(#3,#4)} +\def\hmeasure(#1,#2)(#3,#4){ + \put(#1,#2){\makebox(0,0)[l]{$\blacktriangleleft$}} + \put(#3,#4){\makebox(0,0)[r]{$\blacktriangleright$}} + \drawline(#1,#2)(#3,#4)} +\def\vmeasure(#1,#2)(#3,#4){ + \put(#1,#2){\makebox(0,0)[b]{$\blacktriangledown$}} + \put(#3,#4){\makebox(0,0)[t]{$\blacktriangle$}} + \drawline(#1,#2)(#3,#4)} + +\def\fancycolumn#1#2#3#4#5#6#7#8{% + \sbox#1{% + \sfrcalclength{#2}{#3}{#4}% + \def\\##1;##2;{\vrule height\@tempdimq width ##1pt\kern ##2pt}% + \\0.05;0.15;\\0.60;0.44;\\1.11;0.65;\\1.45;0.77;\\1.57;0.77;% + \\1.45;0.65;\\1.11;0.44;\\0.60;0.15;\\0.05;0;}% + \sfrsetoffsets{15pt}{#3}{#4}#5#6#7#8}% +\def\fancytympan#1#2#3#4#5#6#7#8{% + \sbox#1{% + \sfrcalclength{#2}{#3}{#4}% + \unitlength\@tempdimq + \vbox{\hsize\@tempdimq\offinterlineskip + \hbox{\begin{picture}(1,0.1) + \thicklines + \put(0,0){\line(1,0){1}} + \put(0,0){\line(5,1){0.5}} + \put(0.5,0.1){\line(5,-1){0.5}} + \thinlines + \put(0.5,0.05){\circle*{0.072}} + \end{picture}} + \hbox{\vrule width\@tempdimq height 2pt}}}% + \sfrsetoffsets{\ht#1}{#3}{#4}#5#6#7#8}% + +% THE FOLLOWING DEFINITION IS ALSO INCLUDED VERBATIM AS AN EXAMPLE! +\newenvironment{templeboxed}{% + \begin{sframed}% + [1]\fancycolumn[2]\fancytympan[1]\fancycolumn[-]\- + \begin{separboxed}{3pt} + \begin{broadboxed}{30pt} +}{% + \end{broadboxed}% + \end{separboxed}% + \end{sframed}% +} + +\makeatother + + + +\title[\hhmuf, \hhflxbox\ and \hhcount packages]{HH Gets Carried Away: the \hhmuf, \hhflxbox\ and \hhcount packages} +\author[Herman Haverkort]{Herman Haverkort\\\emph{Email}: \texttt{herman@fgbbs.iaf.nl}} +\begin{Article} + +\begin{abstract} +\end{abstract} + +In this article I present some of the features of three packages, +\hhmuf, \hhflbox\ and \hhcount, that I have written recently. However, +this presentation is far from complete. A more detailed manual and +the packages themselves can be obtained from the author at {\sc fgbbs} +(tel. +31 85 21 70 41) or CTAN +(\path|macros/latex/contrib/supported/hh|. \hhmuf\ offers `multinotes' +---special cheery footnotes to be used in special situations, +including so-called `forbidden environments'. \hhflxbox's provides +self-scaling frames: encircling macros are provided but you can define +whatever features you like by means of the macros provided. Finally +\hhcount is presented: macros to handle simple and composite counters +in a fancy way. \scheiding + +\section{Some Features of the \hhmuf Package} + +\subsection{Reusable Footnotes and Recycled Markers} + +Suppose you have to typeset some tables containing many entries which are +amplified by footnotes outside the table. Several entries, possibly but not +necessarily in the same table, refer to the same footnote. +If references to the same footnote appear in different tables on different +pages, the footnote text should be set on all pages involved, +while the footnote marker should be the same each time the footnote is +set. The first to avoid unnecessary turning over, the second to avoid +confusion. + +Typesetting such tables is not very easy in basic \LaTeX. A relatively easy +way to do the job is probably as follows:\begin{enumerate} +\item first get markers for all the footnotes and define macros to set + the footnote markers; +\item then define a macro \<tablenotes> which typesets the footnotes; +\item then typeset the tables, using the macros defined in the steps + mentioned above; +\end{enumerate} +Here is some example input: + +\verbatiminput{hhst11a.tex} +And the resulting output: + +\input hhst11a.tex + +This article is too short to demonstrate it, but when typesetting multiple +tables this way problems are likely to arise. If you typeset +another table on the same page, calling \<tablenotes> again will cause the +footnote texts to be typeset twice on the same page. If you typeset +another table on another page, {\em all} table footnote texts will be +typeset on that page, even if the table which is on that page does +not refer to all of them. + +The \hhmuf package solves these problems, although the solution of +the twice-on-the-same-page problem may be buggy in rare contexts. +If you use the \hhmuf package you can replace the previous listing by +the following: + +\verbatiminput{hhst11b.tex} +And get this result: + +\input hhst11b.tex + +You will note that \=\mufhire= {\it label\/}\=:{={\it footnote text\/}\=}= +is used to define footnotes. Its opponent is, of course, +\=\muffire= {\it label\/}\=:=, which undefines footnotes, while +\=\muf= {\it label\/}\=:{}= is used to set previously defined +footnotes. As shown in the example, \=\muf=\:\=:{={\it footnote text\/}\=}= +can be used to set incidental footnotes. \=\muf=\:\=:{={\it footnote text\/}\=}= +actually acts as an abbreviation for hiring, typesetting and firing +an incidental note. Thus it is well-suited for setting normal in-text +footnotes. + +\hhmuf does not use common footnote markers. Most common sets of +symbols have a well-defined order which makes them ill-suited for +\hhmuf since the \hhmuf macros do not respect that order. +While defining footnotes, markers are assigned in turn. Thus there is +no need to restart footnote numbering every chapter or every page, +because you never run out of markers, unless you hire a lot of them +without ever firing any. Restarting footnote numbering does +not make sense anyway because there is no such +thing as a {\em first} marker. + +The set of markers used by \hhmuf can be fully specified by the user, +either by selecting one of the predefined sets or by compiling a new one. +The predefined sets are the following: +\begin{center} +\begin{tabular}{|l|l|}\hline + set name & markers included\\ +\hline\hline + black & $\bullet$\,$\blacklozenge$\,$\blacktriangledown$\,$\clubsuit + $\,$\blacksquare$\,$\blacktriangle$\,$\blacktriangleleft$\,$\spadesuit$\\ +\hline + circlox & $\oslash$\,$\odot$\,$\boxtimes$\,$\oplus$\,$\square$\,$\circledast$\,$\boxminus + $\,$\otimes$\,$\circledcirc$\,$\boxdot$\,$\circleddash$\,$\boxplus$\\ +\hline + fuss & $\ast$\,$\diamondsuit$\,$\circledast$\,$\divideontimes$\,$\sharp + $\,$\star$\,$\clubsuit$\,$\aleph$\,$\infty$\,$\circlearrowleft$\\ +\hline + geometry & $\blacklozenge$\,$\square$\,$\blacktriangledown$\,$\vartriangle$\,$\blacksquare + $\,$\triangleleft$\,$\blacktriangle$\,$\lozenge$\,$\blacktriangleleft$\,$\triangledown$\\ +\hline + misc & $\spadesuit$\,$\triangle$\,$\ominus$\,$\clubsuit$\,$\times + $\,$\diamondsuit$\,$\otimes$\,$\wr$\,$\odot$\,$\vee + $\,$\oplus$\,$\infty$\,$\star$\,$\oslash$\,$+$\,$\triangleleft$\,$\top$\,$\bullet$\,$\nabla$\\ +\hline + music & $\sharp$\,$\flat$\,$\natural$\\ +\hline + strokes & $\top$\,$\times$\,$\curlyvee$\,$+$\,$\veebar$\,$\nshortparallel$\,$\barwedge$\,$\wr$\\ +\hline +\end{tabular} +\end{center} +For details see the documentation in the package file. + +\subsection{The Forbidden Environment Problem} + +Suppose I typed several pieces of text that have to be typeset all +in the same special way. For that purpose I (re)defined an environment +\envirname{specialtext}: + +\verbatiminput{hhst12a.tex} +\newenvironment{specialtext}{}{}\input hhst12a.tex +\input hhst12b.tex +Then I defined a package option in the package I used to typeset +my document. If I specified that option when loading the package, +then \envirname{specialtext} would be defined as follows: + +\verbatiminput{hhst12c.tex} +\input hhst12c.tex +Now problems arise. I typeset the same text again: +\input hhst12b.tex +The paragraph is shown framed all right, but something went wrong with +the footnote. With the new definition of \envirname{specialtext}, +the footnote suddenly appears in a `forbidden' environment and therefore it +actually disappears. Although the in-text marker is typeset, there is +no note at the foot of the page. + +While writing this article I discovered Kresten Krab Thorup's style +file {\tt ftn.sty}\rlap{,}\footnote{Available at {\sc ctan} as +{\tt macros/latex209/contrib/misc/ftn.sty}} +which attempts to solve this problem but does so +quite buggily. Footnotes disappear when forbidden environments are nested. +When multiple footnotes are type-set in forbidden environments, footnotes +are repeated and their numbering is wrong. A modified version of +{\tt ftn.sty} exists (by Zdenek Wagner), which solves the repetition problem +correctly, and suppresses incorrect numbers by omitting them: at least that +is what I got. I tried to contact Krab Thorup about making +{\tt ftn.sty} more robust, but have not so far succeeded. +Nevertheless Krab Thorup's style file contained some very useful ideas, +which I combined with my own ideas to construct a set of macros which +seem to be quite robust. I will now show you the result: how easy it is +to use \hhmuf's footnotes in forbidden environments. + +The kind of unpleasant surprises presented above is easy to prevent when +typesetting footnotes with \<muf> instead of \<footnote>, +as in: + +\verbatiminput{hhst12d.tex} +When using the first definition of \envirname{specialtext}, this +yields: +\input hhst12a.tex +\input hhst12d.tex +In the following example the second definition of \envirname{specialtext} +is used, but I added one line of code to `protect' the environment: + +\verbatiminput{hhst12e.tex} + +And here is the result: +\input hhst12e.tex +\input hhst12d.tex + +Without changing the text in my document, I could redefine +\envirname{specialtext} to use forbidden environments in such a way +that my footnotes did not disappear. \<mufoff> did the job. + +\subsection{Shortcomings: \envirname{minipage} Fans Beware!} +\hhmuf does not support \envirname{minipage}s yet. If \<muf> is used +in a \envirname{minipage} environment, the footnote will be placed +at the foot of the `master page' instead of under the \envirname{minipage}! + +\scheiding + +\section{The \hhflxbox Package} +\hhflxbox contains a number of boxing macros. The kernel consists of +\<iframe>, which boxes things and sets self-scaling frames around, and +\<sframe>, which sets more complex self-scaling and -stretching frames. +Besides \hhflxbox provides the encircling macros \<ringbox>, \<bellybox> +and \<outringbox> (which use \<iframe>), the macros \<sepbox> and +\<separbox>, which set empty space around boxes, and \<broadbox>, which +boxes its argument in a \<vbox> of which the width is the line width +minus some specified value. + +\subsection{\<sepbox> and \<separbox>} +For the introduction of \<sepbox> and \<separbox> it is convenient to +look at \<bellybox> first. \<bellybox> is one of the +\hhflxbox macros which can be used to encircle things, for example +\bellybox:{3}, which is set with: \=\bellybox=\:\=:{3}=. + +You probably notice that the circle around the digit is somewhat +tight. This problem can be solved by putting a \<separbox> around the +digit, as in \=\bellybox=\:\=:{\separbox=\:\={1pt}{3}}=, which +yields: \bellybox:{\separbox{1pt}{3}}. +Actually \=\separbox=\:\={={\it dimension\/}\=}{={\it stuff\/}\=}= puts +{\it dimension\/} wide empty space around {\it stuff\/} on all sides. + +A more general form is:\\ +\=\sepbox=\:\=(={\it leftspace\/}\=,={\it topspace\/}% +\=,={\it rightspace\/}\=,={\it bottomspace\/}\=){={\it stuff\/}\=}= +which adds empty spaces of the specified widths to the sides of the box +containing {\it stuff\/}. + +\subsection{\<iframe>: Isomorphous Frames} +\<iframe> is only a frame drawing {\em tool}: it does not draw frames +itself but it can take care of the proper positioning and scaling of frames +drawn by other macros. To explain the functioning of \<iframe> it is +probably best to give an example of the development of a framing macro +using \<iframe>. + +Suppose we want to set self-scaling frames which have the following shape: +\begin{center}\unitlength.01pt\sillyshape\end{center} +then we could imagine a box-shaped area in the frame which will contain +the frame's contents (the inner dashed box in the figure below). Also +we could imagine a box surrounding the frame (the outer dashed box in +the figure). +\begin{center}\unitlength.05pt\noindent + \hbox{% + \rlap{\sillyshape}% + \begin{picture}(2000,2000) + \thinlines + \dashbox(0,0)(2000,2000)\dashbox(134,500)(1866,1500) + \hmeasure(134,500)(0,500)\put(67,450){\makebox(0,0)[t]{$x$}} + \vmeasure(134,500)(134,0)\put(184,150){\makebox(0,0)[l]{$y$}} + \hmeasure(134,1250)(1866,1250)\put(1000,1300){\makebox(0,0)[b]{$w$}} + \vmeasure(584,500)(584,1500)\put(634,800){\makebox(0,0)[l]{$h=1000$}} + \end{picture}}% +\end{center} + +Since \<iframe> expects the inner box height to be $1000$ times the +\<unitlength>, all dimensions have to be chosen so that the inner box +height equals $1000$ indeed. Then \<iframe> can scale the frame by +setting the \<unitlength>. Furthermore \<iframe> expects the lower left +corner of the outer box to have coordinates $(0,0)$. Taking these +expectations in account we can design a macro which draws the frame: + +\verbatiminput{hhst22a.tex} + +\noindent (\<arc> is defined in the \packagename{curves} package by +I.~L.~Maclaine-Cross.) Now we can define a silly shape framing macro +by defining \<sillyframe> +as: \=\iframe=\:\=\sillyshape=\:\=(=$x$\=,=$y$\=){=$w$\=}{0pt}\ifrch=\:% +\=\ifrcv=\:\=:{#1}=. Actually we will set \=#1= in a +\=\sepbox=\:\=(0pt,2pt,0pt,2pt){#1}= to prevent the frame from touching +its contents. In the above example we have $x=134$, $y=500$ and $w=1732$, +so we write: + +\verbatiminput{hhst22b.tex} + +\input{hhst22b.tex} + +Note that I do not claim this kind of silly frame to be good-looking: +it is just an example. + +The dimension \=0pt= in the example above determines the minimal height +of the silly frame's inner box. Sometimes it is necessary to define it +because \LaTeX's picture environment suppresses small line segments. + +The macro \<ifrch> determines what should be done if the frame's +contents width/height ratio is too small. By specifying \<ifrch> +we instruct \<iframe> to center the contents. Instead of +\<ifrch> we could have specified \<ifrl> or \<ifrr> to +have the contents flush left or right. + +The macro \<ifrcv> determines what should be done if the frame's +contents height/width ratio is too small. \<ifrcv> yields +vertical centering, while \<ifrt> and \<ifrb> yield top and bottom +flushing. + +If we put frames around for example page numbers, then +the self-scaling properties of isomorphous frames may have an unpleasant +result: numbers of the same type, like +page number \sillyframe{\oldstylenums{21}} and +page number \sillyframe{\oldstylenums{25}}, might get differently sized +frames because of their different natural sizes. This can be solved by +redefining \<sillyframe> to specify a {\em unit name}, since all things +typeset with the same unit name get equally sized frames. The unit name, +for example \=pagenr=, should be placed between the vertical alignment +specification and the colon, like in: + +\verbatiminput{hhst22c.tex} +which yields (after compiling our document twice): + +\input hhst22c.tex + +However, this is not fully satisfactory yet: now the frames are equally +sized but the first frame is positioned higher than the second. +This is no bug, it is a feature. No really, it is! It is, however, a +sometimes unwanted feature. The solution is using \<lcenter> to center +the frames on their line, like in: + +\verbatiminput{hhst22d.tex} + +\noindent resulting in: + +\input hhst22d.tex + +\leavevmode\jarframe{As} a final example of isomorphous frames, consider +the following framing macro. +Note that the inner box height is $1000$ again, as expected +by \<iframe>. +\begin{center}\unitlength.05pt\noindent + \hbox{% + \rlap{\jarshape}% + \begin{picture}(1800,1500) + \thinlines + \dashbox(0,0)(1800,1500)\dashbox(300,180)(1500,1180) + \hmeasure(300,180)(0,180)\put(150,280){\makebox(0,0)[br]{$x=300$}} + \vmeasure(300,180)(300,0)\put(400,60){\makebox(0,0)[l]{$y=180$}} + \hmeasure(300,930)(1500,930)\put(1050,980){\makebox(0,0)[b]{$w=1200$}} + \vmeasure(550,180)(550,1180)\put(600,500){\makebox(0,0)[l]{$h=1000$}} + \end{picture}}% +\end{center} + +\verbatiminput{hhst22e.tex} + +\subsection{\<ringbox>, \<bellybox> and \<outringbox>: Encircling} + +\=\ringbox{={\it optional unit name\/}\=}:{={\it stuff\/}\=}= sets +a circle around {\it stuff\/}. The specification of a unit name is optional; +its use is explained above. + +\<outringbox> is very much like \<ringbox>, +but the following example demonstrates their difference: + +\verbatiminput{hhst23a.tex} +yields: + +\input hhst23a.tex + +If \<ringbox> is used, the circle contributes to the width, height and +depth of the result. If \<outringbox> is used, the circle does not +contribute any width, height or depth, so that the text is typeset as +if the circle were not present and the circle were added after typesetting +the text. + +The result of \<bellybox> is a circle which contributes a bit to the +dimensions of the encircled result but also sticks out a bit +(by 10 percent of its radius to be sort of exact). So \<bellybox> is +an intermediate form of \<ringbox> and \<outringbox>. + +\subsection{\<sframe>: Stretchable Frames} + +Putting \<sframe> to good use is a rather complex task. \<sframe> +assembles user-defined frame components which actually are macros which +set the values of a box and several dimension registers. Therefore I +decided to give only an example of what can be achieved in this article; +for explanation see the manual and demo files available at {\sc fgbbs}. + +If one has defined suitable macros \<fancycolumn> and \<fancytympan>, one +can define: + +\verbatiminput{hhst24a.tex} + +\noindent which should be read as: after 3pt wide empty space is set +around \=#1=, first add columns to the left and the right, second put +a tympan on top of the result, and never put anything at the foot. +Then typing this: + +\verbatiminput{hhst24b.tex} +will yield: + +\leavevmode\input hhst24b.tex + +\subsection{\<broadbox> for Setting Line Wide Frames} + +\noindent +\begin{templeboxed} +\<broadbox> can be useful to set frames that fill the line. Its use is best +explained through an example. Suppose we want to set a paragraph of text +in a line wide temple box. Then the lines will be filled by (from left to +right): a column, empty space added by \<separbox>, text, empty space and +a column. In other words: the whole line is available for setting text, +except for the space needed by the columns and the empty space set by +\<separbox>. The columns are 12pt each while \<separbox> adds 3pt wide empty +space to the left and the right: that makes a total of 30pt. So we write: +\=\templebox=\:\={\broadbox=\:\={30pt}{\broadbox= \=can= \=be= \ldots +\=\textit=\:\={dimension}.}}=, which yields a paragraph typeset like this. +So \=\broadbox=\:\={={\it dimension\/}\=}{={\it stuff\/}\=}= sets {\it stuff\/} +in a \<vbox> which has width line width minus \textit{dimension}. +\end{templeboxed} + +\subsection{Environment Versions} + +Some of the macros defined in \hhflxbox are available as \LaTeX\ +environments. For example: instead of \=\broadbox=\:\={30pt}{={\it +text to be boxed\/}\=}= one could also use \=\begin=\:\={broadboxed}{30pt}= +{\it text to be boxed\/}\=\end=\:\={broadboxed}=. Similarly one +could use the environments \envirname{sepboxed}, \envirname{separboxed} +and \envirname{sframed} instead of the macros \<sepbox>, \<separbox> +and \<sframe>. + +Actually I have to confess something: I lied to you about the +typesetting of the section about \<broadbox>. I did it with: + +\begin{verbatim} +\newenvironment{templeboxed}{% + \begin{sframed}% + [1]\fancycolumn [2]\fancytympan + [1]\fancycolumn [-]\- + \begin{separboxed}{3pt} + \begin{broadboxed}{30pt} +}{% + \end{broadboxed}% + \end{separboxed}% + \end{sframed}% +} + +\begin{templeboxed}% + \broadbox can be useful to set frames that + : : : : : + width line width minus dimension. +\end{templeboxed} +\end{verbatim} + +I hope you will forgive me my cheating. I mean, without using +these environments, typesetting verbatim stuff is so troublesome\ldots + +\scheiding + +\section{Some Features of the \hhcount Package} + +\subsection{Simple Number Formatting} + +Let us start by summarizing the simple +number formatting macros which are provided by \hhcount: +\begin{center} +\begin{tabular}{|l|c||c|}\hline + example input & \vbox{\hbox{corresp.\strut}% + \hbox{output\strut}} & + \vbox{\hbox{other example\strut}% + \hbox{output\strut}} \\ +\hline\hline + \=\fctabdigit{2}= & \fctabdigit{2} & \fctabdigit{29} \\ +\hline + \=\fcolddigit{2}= & \fcolddigit{2} & \fcolddigit{29} \\ +\hline + \=\fcloweralpha{2}= & \fcloweralpha{2} & \fcloweralpha{29} \\ +\hline + \=\fcbigalpha{2}= & \fcbigalpha{2} & \fcbigalpha{29} \\ +\hline + \=\fcsmallalpha{2}= & \fcsmallalpha{2} & \fcsmallalpha{29} \\ +\hline + \=\fclowerroman{2}= & \fclowerroman{2} & \fclowerroman{29} \\ +\hline + \=\fcbigroman{2}= & \fcbigroman{2} & \fcbigroman{29} \\ +\hline + \=\fcsmallroman{2}= & \fcsmallroman{2} & \fcsmallroman{29} \\ +\hline + \=\fcbigromanlined{2}= & \fcbigromanlined{2} & \fcbigromanlined{29} \\ +\hline + \=\fcsmallromanlined{2}= & \fcsmallromanlined{2} & \fcsmallromanlined{29} \\ +\hline + \=\fcbigdice{2}= & \fcbigdice{2} & \fcbigdice{29} \\ +\hline + \=\fcsmalldice{2}= & \fcsmalldice{2} & \fcsmalldice{29} \\ +\hline + \=\fcbigscore{2}= & \fcbigscore{2} & \fcbigscore{29} \\ +\hline + \=\fcsmallscore{2}= & \fcsmallscore{2} & \fcsmallscore{29} \\ +\hline + \=\fcfnsymbol{2}= & \fcfnsymbol{2} & \\ +\hline +\end{tabular} +\end{center} + +The next step in complexity are number formatting macros which give +context-dependent output. This is implemented by using the {\it context +switches} \=\if@fcoldstyle= and \=\if@fcsmall=, which are set by +context switching macros like \<fcinheading> and \<fcintext>. We say that +a context switching macro is active if it was the last one to affect +the context switches. +\begin{center} +\begin{tabular}{|l|c|c|}\hline + example input & \vbox{\hbox{output when\strut}% + \hbox{\<fcinheading>\strut}% + \hbox{is active\strut}} + & \vbox{\hbox{output when\strut}% + \hbox{\<fcintext>\strut}% + \hbox{is active\strut}} \\ +\hline\hline + \=\fcdigit{14}= & {\fcinheading\fcdigit{14}} & {\fcintext\fcdigit{14}} \\ +\hline + \=\fcalpha{14}= & {\fcinheading\fcalpha{14}} & {\fcintext\fcalpha{14}} \\ +\hline + \=\fcroman{14}= & {\fcinheading\fcroman{14}} & {\fcintext\fcroman{14}} \\ +\hline + \=\fcromanlined{14}= & {\fcinheading\fcromanlined{14}} + & {\fcintext\fcromanlined{14}} \\ +\hline + \=\fcdice{14}= & {\fcinheading\fcdice{14}} & {\fcintext\fcdice{14}} \\ +\hline + \=\fcscore{14}= & {\fcinheading\fcscore{14}} & {\fcintext\fcscore{14}} \\ +\hline +\end{tabular} +\end{center} + +By default \<fcinheading> is active; \<fcintext> is active when using +\<ref> or \<pageref> (those two macros are redefined by \hhcount). + +\subsection{How to Define Composite Counters} + +I will now try to give an impression of the way in which composite +counters can be defined using \hhcount. However, this is \emph{not} a manual. +After reading the following paragraphs you may be able to hack a +composite counter together yourself, by imitating what is done below +and experimenting with some small modifications of your own. If you +want to be taught how to use \hhcount efficiently and effectively, then +you should read the manual. + +Suppose we want to set up a three-level section numbering system for +some sub-document in another document, for example the rules of a club +embedded in some booklet about that club. +The section numbers should be composed from the values of three +\hbox{(sub-)}counters: {\tt ruleschapter}, +{\tt rulessection} and {\tt rulesparagraph}. Chapter numbers +should be represented by capital alphabetic characters; +elementary section and paragraph numbers by arabic digits. +What should be done? + +First we select a {\it series identifier} for our composite counter. +Series identifiers are natural numbers which are assigned to +composite counters. Each composite counter should be assigned a unique +identifier. Because identifiers {\tt 1} to {\tt 8} and {\tt 12} +are reserved for common purposes we select {\tt 9} for our rules section +numbers. + +Then we define a macro which expands to the series identifier: + +\verbatiminput{hhst32a.tex} + +Next we specify how the three sub-counters are to be combined: + +\verbatiminput{hhst32b.tex} + +And finally we define how the counter is to be formatted: + +\verbatiminput{hhst32c.tex} + +If you want to understand the definition above, read the manual. + +\subsection{The Result} + +Now the composite counter can be accessed by the macros +\<theruleschapter>, \<therulessection> and \<therulesparagraph>, +which give results like: ``\fancycounter9-1-0-0-!'', +``\fancycounter9-1-2-0-!'' and ``\fancycounter9-1-2-3-!''. +The macros \=\stepcounter=\:\={ruleschapter}=, +\=\stepcounter=\:\={rulessection}= and +\=\stepcounter=\:\={rulesparagraph}= can be used to step the counter. + +When \<fcinheading> is active, rules paragraph numbers will be set like +``{\fcinheading\fancycounter9-1-2-3-!}'', but when \<fcintext> is active, +the same number will be set like ``{\fcintext\fancycounter9-1-2-3-!}''. + +More complex distinctions in representation of counters are possible. +\hhcount provides a set of macros which can be used in the last argument +of \<setcounterformat>. Those macros enable definition of counters +which are set like ``A2.3'' in headings and like ``section {\sc a}\02., +par. \03.'' in text etc. For details see the manual. + +\subsection{\hhcount and \texttt{makeindex}} + +Composite section numbers like ``A2.3'' cannot be handled by the +{\tt makeindex} program. Besides, {\tt makeindex} has problems +with sorting alphabetic numbers since it cannot determine whether +or not they are roman numbers. \hhcount provides a way to get around +these problems. + +All composite numbers defined by \hhcount constructs +are internally represented by a sequence of natural numbers, separated +by hyphens and embedded in a macro call. A typical example is +\=\fancycounter= \=9-1-2-3-!=. The first number represents the +series identifier (\=9= in the example), while the following +numbers represent the values of the relevant sub-counters. + +\hhcount provides macros \<initfancycounters>, \<indextolabels> and +\<indextopages>. The first redefines the section and page numbering +systems to use \hhcount's composite counters. \<indextolabels> sort of +redefines \<index> to use the redefined section numbers and strip the +\<fancycounter> and the \=-!= off the composite counter representation. +\<indextopages> does the similar thing for page numbers. +In both cases the result is a sequence of natural numbers, +separated by hyphens, which can be handled perfectly well by +{\tt makeindex}. +By embodying the appropriate definitions in your index style +(\hbox{\tt .ist}) file {\tt makeindex} will undo the stripping after +sorting the page or section numbers, so that your index entries will +still be typeset as defined by means of \hhcount macros. Thus section +numbers like ``A2.3'' can be used for references in the index. +Inserting equation, table and figure numbers in the index is just as +easy. It is +even possible to have different kind of composite numbers in the +same index, for example page as well as section numbers, because +the series identifiers are not stripped off so that it remains possible +to determine the proper series and formatting of each composite number. +For details see the manual. + +\subsection{Bugs and Deficiencies} + +Class files tend to make the \TeX\ compiler show on your terminal +which chapter of your book or report is being processed. Error messages +often contain the page number. When using \hhcount +there is a chance that the chapter and page numbers shown on your +terminal look weird: you will be shown the internal representation +of your counter (\=\fancycounter= \=9-1-0-0-!= for example). This is +caused by an incorrect timing of macro expansion: in this case +\<fancycounter> is expanded too late (that is to say, not at all). + +Late expansion with \hhcount is typically a problem with +error and other messages: I would be highly surprised if someone +discovers something like \=\fancycounter= \=9-1-0-0-!= outside +verbatim environments in a typeset document. However, when compiling your +document you might run into early expansion, which causes severe errors. +With the latest version of \hhcount this problem does not seem to +emerge in `usual' contexts; however I am not sure. + +Front matter, appendix and back matter peculiarities (with respect +to page and section numbering) are not automatically supported +by \hhcount. Class +files are too different in that respect. If \hhcount is to be used +to handle the section and page numbering in documents containing +front matter and appendices, it would probably be best to incorporate +\hhcount in the class file, instead of loading it as an additional +package. + +\subsection{Gamesters Page Numbers} + +The following redefines the {\tt page} counter so that page numbers +will be set as dice (I designed this for a gamesters society): + +\begin{verbatim} +\def\fcpageseries{12} +\combinecounters\fcpageseries{\\{page}} +\setcounterformat\fcpageseries{#1}{% + \fcorfinally + \fcformat{#1}\fcdice + \fcordespair} +\end{verbatim} + +I could not resist giving you this as an final example. + +\end{Article} + + |