The ssqquote Package for L^{A}TEX 2ε

Copyright (C) 1994 by Ulrik Vieth

March 6, 1996

1 Introduction

This contributed package for L^{A}TEX 2ε provides the necessary font declarations needed to access the cmssq font family, i.e. Computer Modern Sans Serif Quotation Style, in terms of NFSS.^{1} It also provides a little example package file that shows how to define some appropriate font changing commands.

\ssqfamily Once you have installed the font definition files OT1cmssq.fd and T1cmssq.fd

\textssq provided here, you can use low-level NFSS commands to access the cmssq font family in your documents, even if you do not plan to use the example package ssqquote.sty. Apart from defining the font changing commands \ssqfamily and \textssq, that package file also provides an example application that uses the cmssq font family.

chapterquotes The chapterquotes environment provided as an example is based on ideas used in the \endchapter macro of the manmac format that was used by DEK in the TEX and manuals. Its purpose is to typeset a few nice quotations at the end of chapters using the cmssq font family in a smaller typesize than the regular text. While keeping the distinctive ragged-left formatting from the \endchapter macro, we have tried to make the chapterquotes environment more flexible, optionally allowing quotations to be placed at the top of the next page if there isn’t enough room left at the bottom of the current page.

2 The Docstrip modules

The following Docstrip modules are used in this package:

driver  produces the documentation driver
package produces the example package file
OT1cmssq produces the font definition file for the OT1 encoding
T1cmssq produces the font definition file for the T1 encoding

Except for the documentation driver every module intended for TEX should contain the following information for identification purposes.

1 ⟨∗package | OT1cmssq | T1cmssq⟩

 2 \def\filename{ssqquote.dtx}
 3 \def\filedate{1994/05/21}
 4 \def\fileversion{1.2}

5 ⟨/package | OT1cmssq | T1cmssq⟩

1Throughout this document, the term NFSS should be understood to refer to release 2 of NFSS, i.e. the release that’s part of L^{A}TEX 2ε and that’s intended to become part of L^{A}TEX3 in the future.

3 The font defintion files:

   OT1cmssq.fd and T1cmssq.fd

Following the tradition of the standard L^{A}TEX 2ε distribution, we begin by identifying the latest version of these files in the log file.

6 ⟨∗OT1cmssq | T1cmssq⟩

 7 \wlog{Fontdef\space file\space produced\space from\string:\space
 8 \string`ssqquote.dtx\string'\space \fileversion\space
 9 \string<\filedate\string>\space \string(Ulrik Vieth\string)}

10 ⟨/OT1cmssq | T1cmssq⟩

3.1 The font definition file for the OT1 encoding

First, we will consider the font definition file for the old encoding scheme OT1 of the original Computer Modern Fonts by DEK. We start by declaring the font family cmssq.

11 ⟨∗OT1cmssq⟩

12 \DeclareFontFamily{OT1}{cmssq}{}

The fonts cmssq and cmssqi are only available in 8-point design size. Therefore, we will make them available only in rather unusual sizes based on magsteps of 8 pt. However, in the typical application of typesetting quotations in this font family, you wouldn’t want to use large magsteps anyway, thus you needn’t really worry about that. If you simply select \footnotesize, an appropriate size for quotations will be substituted automatically within the margin of \fontsubfuzz allowed by NFSS.

Since the ‘i’ in cmssqi stands for ‘inclined’ rather than ‘italics’, we allocate it to \slshape and add a silent font substitution for \itshape. There are no other font shapes currently available in the cmssq family, and it is very unlikely that there will be any in the future.

13 \DeclareFontShape{OT1}{cmssq}{m}{n}{
14 <8> <8.76> <9.6> <11.52> <13.82> <16.59> <19.91> cmssq8
15 }{}
16 \DeclareFontShape{OT1}{cmssq}{m}{sl}{
17 <8> <8.76> <9.6> <11.52> <13.82> <16.59> <19.91> cmssqi8
18 }{}
19 \DeclareFontShape{OT1}{cmssq}{m}{it}{
20 <-> ssub * cmssq/m/sl
21 }{}

22 ⟨/OT1cmssq⟩

3.2 The font definition file for the T1 encoding

Next, here are the corresponding font shape declarations for the new encoding scheme T1 used in the DC fonts. For some unknown reason, Sans Serif Quotation Style was not supported in the original version 1.0 of the DC fonts. Support for this style was added only in version 1.1, which was completed in March 1992 but not released on CTAN before February 1994. However, the fonts dcssq and dcssqi are still commented out in the configuration file dcstdedt.tex, thus you will not have them if you simply installed the DC fonts using the standard setup, but you can create them if you like. In any case we will provide the font defintion file here.

23 ⟨∗T1cmssq⟩

24 \DeclareFontFamily{T1}{cmssq}{}

In the T1 encoding, we will use the same magsteps as in the OT1 encoding. Using the scaling mechanism built into the DC fonts, it would be possible to create different design sizes as well, but providing a different choice of sizes in the OT1 and T1 encodings would only cause confusion. Therefore, we prefer to live with an unusual range of sizes in both cases.

25 \DeclareFontShape{T1}{cmssq}{m}{n}{
26 <8> <8.76> <9.6> <11.52> <13.82> <16.59> <19.91> dcssq8
27 }{}
28 \DeclareFontShape{T1}{cmssq}{m}{sl}{
29 <8> <8.76> <9.6> <11.52> <13.82> <16.59> <19.91> dcssqi8
30 }{}
31 \DeclareFontShape{T1}{cmssq}{m}{it}{
32 <-> ssub * cmssq/m/sl
33 }{}

34 ⟨/T1cmssq⟩

4 The package file: ssqquote.sty

After having discussed the font definition files, we now turn to the example package that shows how to access the cmssq font family using low-level NFSS commands.

As usual, we begin by identifying the package and its current version.

35 ⟨∗package⟩

36 \ProvidesPackage{ssqquote}[\filedate\space\fileversion\space
37  Contributed LaTeX2e package]
38 \typeout{Package: `ssqquote'
39 \fileversion\space <\filedate> (Ulrik Vieth)}

4.1 Accessing the cmssq font family in NFSS

\ssqfamily First, we define the declarative font changing command \ssqfamily. This is accomplished using the low-level NFSS commands \fontencoding and \fontfamily followed by \selectfont. We assume that \encodingdefault is set to either OT1 or T1. Otherwise, you’ll probably get an NFSS error message.

40 \def\ssqfamily{%
41 \fontencoding{\encodingdefault}\fontfamily{cmssq}\selectfont}

\textssq Next, we define a font changing command with one argument. Since it is very unlikely that the cmssq font will be used in math mode, we do not attempt to make a robust version, instead the \textssq macro defined here simply selects \ssqfamily within a group. However, we will protect it, so that it can be used within moving arguments without problems.

42 \def\textssq{\protect\ptextssq}
43 \def\ptextssq#1{{\ssqfamily #1}}

4.2 An example application: The chapterquotes environment

As an example application, we will define a chapterquotes environment that is based on ideas used in the \endchapter macro of the manmac format that was used in the TEX and manuals. We have tried to make it more L^{A}TEXlike and we have added some switches and parameters to customize its behaviour. The purpose of this environment is to typeset a few nice quotations at the end of chapters using the cmssq font family.

\ifbottomquotes We begin by defining a \newif that controls whether quotations should always be placed at the bottom or if they are allowed to appear at the top of the next page in case there isn’t enough room at the bottom of the current page. By default,

\ifbottomquotes is set to false.
44 \newif\ifbottomquotes \bottomquotesfalse

\prechapterquotes Next, we allocate a \newskip that controls the minimum amount of space that should be left over on the current page when the chapterquotes environment is called. More precisely, \prechapterquotes is the amount of stretchable glue inserted in an attempt to eject the current page before starting to typeset the

quotations. The default value of \prechapterquotes is 10\baselineskip in

\footnotesize. If you have longer quotations, you may wish to enlarge this parameter.^{2}

45 \newskip\prechapterquotes
46 {\footnotesize \global\prechapterquotes=10\baselineskip\relax}

chapterquotes Now, we are ready to discuss the chapterquotes environment itself. We begin by leaving horizontal mode if we are not already in vertical mode at the time when

chapterquotes is called.
47 \newenvironment{chapterquotes}{%
48 \ifvmode \else \unskip\par \fi

Next, we try to eject the current page by inserting an amount of stretchable glue controlled by \prechapterquotes, followed by the negative penalty \@secpenalty, followed by negative stretchable glue to compensate the positive stretchable glue in case the negative penalty fails to eject the page. If a page break occurs, the last glue will disappear at the top of the page.

49 \vskip\z@\@plus+\prechapterquotes
50 \penalty\@secpenalty
51 \vskip\z@\@plus-\prechapterquotes

After these preliminaries we come to the central part of the chapterquotes environment. If quotations are allowed only at the bottom of the page, we insert an empty hbox to prevent glue from disappearing at the top, followed by \vfill.

We disallow floats at the bottom by setting \@botnum to zero. In case quotations are allowed at the top as well, we also set \@topnum to zero because we do not know where the quotations will end up. If this causes problems with floats that are left over at the end of the chapter, inserting a \clearpage before the chapterquotes environment might help.

2By the way, the name of the \prechapterquotes parameter was inspired by the \premulticols parameter in Frank Mittelbach’s multicol package.

52 \ifbottomquotes \null \fi \vfill
53 \global\@botnum\z@
54 \ifbottomquotes \else \global\@topnum\z@ \fi

Now, we start a group to keep changes local. We switch to \footnotesize and select the cmssq font family using the declarative font changing command

\ssqfamily.
55 \begingroup
56  \footnotesize \ssqfamily
   We redefine \bigskipskipamount, \medskipamount and \smallskipamount

using multiples of \baselineskip in \footnotesize. We will use these paramters for the spacing in between multiple quotations.

57  \bigskipamount=1.0\baselineskip
58  \medskipamount=0.5\baselineskip
59  \smallskipamount=0.25\baselineskip

Within the group started above, we set \interlinepenalty to 10000 to disallow page breaks between quotations. Next, we set up various parameters for ragged-left typesetting.

60  \interlinepenalty\@M
61  \parindent\z@ \parskip\z@ \parfillskip\z@
62  \leftskip\z@\@plus\linewidth \rightskip\z@

We redefine \par in order to insert the italics correction automatically at the end of lines and activate \obeylines, which means that \par is added automatically at the end of every input line. In L^{A}TEX, we can use \@@par to refer to the original meaning of \par. Alternatively, we could use \endgraf here instead.

63  \def\par{\ifhmode\/\@@par\fi} \obeylines

\nextquote Individual quotations should start with \nextquote. This will insert a \bigskip and switch to \slshape using the cmssq family selected earlier at the beginning of the environment. Users might regard \nextquote as a special case of \item that is only available within the chapterquotes environment. However, technically speaking, \item is quite different from \nextquote and much more complicated.

64  \def\nextquote{\bigskip\slshape}

\author \title The source of a quotation can be formatted using the macros \author and \title. The \author macro expects two arguments which will be typeset in upright shape. The first one is meant to be the name of the author or the work that is quoted, while the second one (enclosed in parantheses) is meant to be the date of the quotation. Within the arguments of the \author macro, the \title macro can be used to typeset the title of the quoted work in slanted shape. We use \textsl here, i.e. the font switching macro with one argument, because this will automatically insert the italics correction if necessary.

65  \def\author##1(##2){\medskip\upshape\noindent
66  --- \ignorespaces ##1 \unskip\thinspace (##2)\par}
67  \def\title##1{\textsl{##1}}

At the end of the chapterquotes environment, there is not much left to do. We simply close the group started at the beginning of the environment to restore the paragraphing parameters. In case quotations are placed at the top of the page, we insert \vfil to avoid an underfull page. If quotations are placed at the bottom, the \vfill at the top is infinitely larger than the \vfil at the bottom, thus the last \vfil won’t have any effect. The very last thing to do is to call a

\pagebreak.
68 }{%
69 \endgroup
70 \vfil \pagebreak}

71 ⟨/package⟩

5 The documentation driver file

We have our own document class to format the L^{A}TEX 2ε documentation. We also use the mflogo package that defines the logo in terms of a NFSS font family and the ssqquote package to typeset some example quotations at the end of this file.

72 ⟨∗driver⟩

73 \documentclass{ltxdoc}
74 \usepackage{mflogo}
75 \usepackage{ssqquote}

We do not need an index.

76 \DisableCrossrefs

We do want the full details.

77 \begin{document}
78 \DocInput{ssqquote.dtx}
79 % \PrintIndex
80 % \PrintChanges
81 \end{document}

82 ⟨/driver⟩

6 An example of the chapterquotes environment

Finally, here’s an example of the chapterquotes environment and how it was specified. Note that line breaks in the input file are obeyed, thus when long input lines have to be broken across lines, the end of the line has to be commented out. If a quotation consists of multiple paragraphs, \smallskip can be used to insert space in between them. As explained earlier, \medskip is inserted by the \author macro and \bigskip is inserted by \nextquote.

83 ⟨∗example⟩

84 \begin{chapterquotes}
85 \nextquote
86 I've finally learned what `backwards compatibility' means:
87 It means we've got to keep all our old mistakes.

88

89 \author RAINER SCH\"OPF, \title{\LaTeXe{} Announcement} (TUG `1993)

90

91 \nextquote
92 \emph{Compatibility:} \LaTeXe{} will, as far as possible,
93 adhere to the following principles:
94 \smallskip
95 1. Unmodified version 2.09 document files will produce

96  the same output with \LaTeXe{} as with version 2.09.
97 \smallskip
98 2. All new features will conform to the conventions
99  of version 2.09 \dots

100

101 \author \LaTeX3 PROJECT, %
102  \title{\LaTeXe{} -- A new version of \LaTeX{}} (TTN~2;4, 1993)
103 \end{chapterquotes}

104 ⟨/example⟩

I’ve finally learned what ‘backwards compatibility’ means: It means we’ve got to keep all our old mistakes.

— RAINER SCHÖPF, LATEX 2ε Announcement (TUG ‘1993)

Compatibility: LATEX 2ε will, as far as possible,

adhere to the following principles:

1. Unmodified version 2.09 document files will produce the same output with LATEX 2ε as with version 2.09.

2. All new features will conform to the conventions of version 2.09 …

— LATEX3 PROJECT, LATEX 2ε – A new version of LATEX (TTN 2;4, 1993)

I didn’t change anything! An aggrieved cry often heard

as bugs manifest during a regression test … This is also heard from applications programmers trying to blame an obvious applications problem on an unrelated systems software change … Usually, their statement is found to be false.

Upon close questioning, they will admit some major restructuring of the program

that shouldn’t have broken anything, in their opinion, but which hosed the code completely.

— THE NEW HACKER’S DICTIONARY (1993)