% \iffalse meta-comment
%
% Copyright (C) 2004--2005 by Georg Michael Verweyen <Georg.Verweyen@rub.de>
% --------------------------------------------------
%
% This file may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either version 1.2
% 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.2 or later is part of all distributions of LaTeX
% version 1999/12/01 or later.
%
% \fi
%
% \iffalse
%<package>\NeedsTeXFormat{LaTeX2e}[1999/12/01]
%<package>\ProvidesPackage{stdpage}
%<package>   [2005/03/30 v0.6 stdpage.sty]
%
%<*driver>
\documentclass{ltxdoc}
\renewcommand{\familydefault}{\rmdefault}
\usepackage[T1]{fontenc}
\usepackage[ngerman]{babel}
\usepackage{hyperref,courier}
\usepackage[typewriter,chars=70,lines=35]{stdpage}

\hypersetup{%
    pdftitle={Das stdpage-Paket},%
    pdfauthor={\textcopyright\ Georg Michael Verweyen <Georg.Verweyen@rub.de>},%
    pdfsubject={Anleitung zur Erstellung einer Normseite / Manual to create a standard page},%
    pdfkeywords={Satzspiegel, Vorgaben, 30x60, LaTeX, \LaTeXe, Normseiten,%
        30 Zeilen, 60 Zeichen, standard page, requirements, 60 characters, 30 lines}%
}
 \CodelineIndex
 \RecordChanges
\begin{document}
  \DocInput{stdpage.dtx}
\end{document}
%</driver>
% \fi
%
% \CheckSum{207}
%
% \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{v0.1}{2004/06/17}{Initial version}
% \GetFileInfo{stdpage.sty}
% \changes{v0.2}{2004/06/21}{Neue Übergabe der Parameter mit xkeyval.sty}
% \changes{v0.3}{2004/06/17}{Wieder alles überarbeitet, das Paket xkeyval wird
%   nicht mehr gebraucht. Die Funktionalität ist unverändert.}
% \changes{v0.4}{2004/06/21}{Some English documentation added}
% \changes{v0.6}{2005/03/30}{Additional Features, bugs removed, lot's of changes}
%
% \title{Das \textsf{stdpage} Paket -- \emph{The \textsf{stdpage}
%   package}\thanks{%
%       Diese Anleitung geh\"{o}rt zu \textsf{stdpage}~\fileversion,
%       vom \filedate. \emph{This is the manual for \textsf{stdpage}~\fileversion,
%       dated \filedate.}
%   }%
% }%
% \author{Georg Michael Verweyen \\ \texttt{Georg.Verweyen@rub.de}}
% \maketitle
%
% \abstract{%
%   Dieses Paket bietet eine einfache Möglichkeit Normseiten zu
%   erstellen, das sind in Deutschland Seiten mit 30 Zeilen \`{a} 60 Zeichen.
%
%   \emph{%
%       This package provides an easy method to prepare a page with a fixed
%       number of lines per page and a number of characters per line not to be exeeded.
%       Worldwide there are different standards for so called ">standard"< pages.
%       \textsf{stdpage.sty} lets you adjust the page settings. There is further English
%       instruction following (in italics).
%   }%
% }%
%
%
% \section{Normseiten -- \emph{Standard pages}}
%
% Normseiten nennt man im Verlag Seiten, die in einer nicht-proportionalen
% Schrift gesetzt sind, bei einer Zeilenl\"{a}nge von maximal 60~Zeichen und
% 30~Zeilen pro Seite. Daraus ergeben sich meist ca.\ 1\,400 Zeichen
% inklusive Leerschritte pro Seite, denn nicht jede Zeile wird voll, evtl.\
% gibt es Leerzeilen, halbleere Seiten vor einem neuen Kapitel etc.\footnote{%
%     Manche Verlage rechnen einfach mit 1\,800 Zeichen f\"{u}r eine Normseite --
%     absurd!
% } Die Zeichenzahl kann erheblich schwanken, stark strukturierte Texte, mit
% Dialogen etc. nehmen relativ viel Raum ein, bei wenig Zeichen pro Seite.
%
% \"{U}bersetzer etwa werden pro Normseite bezahlt, auch f\"{u}r Korrekturlesen,
% oder Schriftsatz gibt es Vertr\"{a}ge, die sich auf Normseiten beziehen.
%
% \emph{%
%   Standard pages are typeset in a nonproportional font. The lines take a
%   limited number of characters, for instance 60. Also the number of lines
%   is fixed, for instance 30 (Those are the standard settings in quite a number
%   countries). This does \emph{not} mean, such a page has 1\,800
%   characters, as lines don't necessarily get filled, also pages might not
%   get filled at the end of a chapter. Usually a standard page (30x60) has
%   about 1400 characters.
% }%
%
%   \section*{Changes}
%
%   Neu in Version 0.5 sind die Möglichkeiten, den Durchschuss zu
%   erhöhen, die Silbentrennung abzustellen und Leerzeilen zwischen
%   den Absätzen einzufügen.
%
% {\em Since v0.5 you can spread the lines, stop hyphenation
%   optionally and add an empty line at the beginning of a paragraph.
%
% Für den echten Freund der guten (?) alten Schreibmaschine gibt es
% jetzt (v0.6) eine Option, die so ziemlich alles, was mir spontan
% eingefallen ist auf einfache Schriftgrö{\ss}e herunterbrät,
% |typewriter|. Vom Part bis zur Fu{\ss}note: alles |normalsize|. Die
% Überschriften werden je nach Gewichtung durch Leerzeilen abgesetzt.
% Man sollte |courier.sty| benutzen, dann stehen für Überschriften
% wenigsten fette Schnitte zur Verfügung, damit an die Überschriften
% wiederfindet.
%
% {\em
%  For the real typewriter addicted there is a new (v0.6) option:
%  |typewriter|. This option will turn any fontsize I could imagine used
%  in a heading or footnote, or whatever into normalsize. Headings are
%  separated from the rest of the text by blank lines. You should
%  consider using |courier.sty| with this options, which gives bold
%  headings
% }
%
% \section{Anwendung -- \emph{Usage}}
%
% F\"{u}r die Basiseinstellungen (Normseiten im Sinne des Vd\"{U}) reicht es, die
% Zeile |\usepackage{stdpage}| vor dem |\begin{document}| einzuf\"{u}gen --
% eigentlich sollte dann alles von alleine gehen.
%
% Silbentrennung sollte man meines Erachtens verwenden, trotz der nicht"=proportionaler
% Fonts. Wer mag kann aber |hyphen=false| wählen. Ob man den Rausatz
% dann zum Blocksatz streckt ist letztlich eine Geschmacksfrage.  Wer
% Blocksatz w\"{u}nscht, kann |just| (Blocksatz = justified) als optionales Argument \"{u}bergeben - die Kombination
% |[just=true, hyphen=false]| ist nicht m\"oglich. Wenn schon Blocksatz dann auch Sibentrennung!
% Ma{\ss}geblich
% ist in meinen Augen das Ergebnis des Rausatzes, da dieser die Situation auf der
% guten alten Schreibmaschine am besten nachahmt, schlie{\ss}lich stammt auch die Idee
% der Normseite aus dieser \"{A}ra. Bei aktiviertem Blocksatz kann der Umbruch durch
% Stauchung und oder Dehnung der Wortzwischenr\"{a}ume etwas anders ausfallen als beim
% Rausatz (dieses Problem sollte ab v0.6 behoben sein).
%
% {\em If you are preparing a German ``Normseite'' of 30 lines and 60 characters
%   per line you just put |\usepackage{stdpage}| before the
%   |\begin{document}| line -- and everything should be fine. The standard
%   behaviour of the package is to make the text ragged, you can change this
%   to justified text by adding |just| to the options list.
%
%   Linenumbers can be added with |linenumbers|. Paragraph indention can be
%   suppressed with |noindent|. You should think about adding |parskip| to the
%   list of options then, as your paragraphs might get lost otherwise.
%
%   If you want to create a standard page for, let's say the administration of
%   the European union, you need a page of 30x50 without paragraph indention,
%   you type in\\ |\usepackage[chars=50, lines=30, noindent]{stdpage}|.
% }%
%
% \changes{v0.2}{2004/06/21}{Neue Option: linenumbers}
% Eine weitere Option ist |linenumbers|: wird die Option gew\"{a}hlt, erscheinen
% automatisch auf dem Innenrand Zeilennummern - nur f\"{u}r den Fall, dass der
% Lektor/""Verlagsleiter/""Autor \dots\ nicht so gut z\"{a}hlen kann. Mit
% |linenumbers| besser einmal zuviel {\TeX}en als zuwenig, die Nummern rutschen
% schonmal\dots
%
% Wer keinen Absatzeinzug w\"{u}nscht (zum Beispiel weil er das in Kombination mit Rausatz
% kategorisch ablehnt), kann |noindent| w\"{a}hlen. Er sollte dann vielleicht |parskip=true|
% setzen, damit die Absätze erkennbar bleiben.
%
% \changes{v0.2}{2004/06/21}{Neue Optionen: chars/lines}
% Falls es (im Ausland?) andere Standards f\"{u}r Normseiten gibt, kann man
% andere Werte im optionalen Parameter |lines| bzw.\ |chars| angeben.
% Beispiel: |\usepackage[just,noindent,chars=50]{stdpage}| Mit diesen
% Angaben entsteht eine Ausgabe die den Ma\ss gaben f\"{u}r
% \"{U}bersetzungen der Europ\"{a}ischen Union entspricht (30 Zeilen mit je
% 50 Zeichen).
%
% \changes{v0.2}{2004/06/21}{Neue Optionen: hyphen, baselinestretch}
%   Unklar ist in vielen Vertr\"agen, ob bei Normseiten Silbentrennung
%   stattfinden soll oder nicht. Die Option |hyphen=false| stellt die
%   Silbentrennung ab (geht nur, wenn kein Blocksatz aktiviert wurde).
%   Die Verlagswelt scheint über die Anwendung der
%   Trennung gespalten. Wird die Trennung abgeschaltet, steigt die Zahl
%   der Normseiten um etwa 1,5\,\%.
%
%   Einige Lektoren wollen auch gleich im Normseiten-Ausdruck redigieren
%   und brauchen anderthalbfache Zeilenhöhe. Das verdirbt dann jeden
%   Rest von \"asthetischem Anspruch, aber nun ja -- wenn es der Verlag
%   so will: |baselineskip| kann jetzt auch als Option von |stdpage|
%   angegeben werden. Für das, was Word gemeinhin anderthalbzeilig
%   nennt, sollte man |baselinestretch=1.2| setzen (was allerdings auch
%   die Standardeinstellung ist, wenn nur |baselinestretch| gefordert wird.
%
% {\em
%   In contracts it is often not clear if hyphenation should be used or
%   not. The option |hyphen=false| sets off hyphenation, wich will
%   increase the number of standard pages about 1.5\,\%. This will not
%   work with the option |just| (justification needs hyphenation!).
%
%   Sometimes publishers want to do correction or annotations between
%   the lines and need more space. You can change the standard
%   \LaTeX-factor |baselinestretch| in the options of |stdpage|.
%   |baselinestretch=1.25| will have about the same effect as one and a
%   half linespacing in let's say WORD. By the way: |baselinestretch| will be
%   set to 1.25 by default when you use |baselinestretch| as an option.
%
%    I didn't translate the comment on the implementation (which is rather
%    simple). If you are interested in an English hint, just contact me,
%    I'll do my very best \dots
% }
%
% \section{Neu -- \emph{New}}
% \StopEventually{\PrintChanges\PrintIndex}
%
% \section{Implementierung}
%
%    \begin{macrocode}
 \RequirePackage{typearea%
                ,ragged2e%
                ,ifthen%
                ,keyval%
                ,lineno%
 }%
 \RequirePackage[htt]{hyphenat}%
 \RequirePackage[rigidchapters]{titlesec}%
%    \end{macrocode}
% Typewriter wir zur Standardfamilie erkl\"{a}rt und Absatzeinzug auch bei RaggedRight
% als Standard gesetzt.
%    \begin{macrocode}
\renewcommand{\familydefault}{\ttdefault}%
\renewcommand{\RaggedRightParindent}{\parindent}%
%    \end{macrocode}
% Ein paar neue L\"{a}ngen und Befehle:
%    \begin{macrocode}
 \newlength{\St@ndardLinewidth}%
 \newlength{\St@ndardTextwidth}%
 \newlength{\CharsX}%
 \newlength{\CharsI}%
 \newboolean{st@ndardjust}%
 \setboolean{st@ndardjust}{false}%
 \newboolean{st@ndardnoindent}%
 \setboolean{st@ndardnoindent}{false}%
 \newboolean{st@ndardnumbers}%
 \setboolean{st@ndardnumbers}{false}%
 \newboolean{st@ndardhyphen}%
 \setboolean{st@ndardhyphen}{true}%
 \newboolean{st@ndardparskip}%
 \setboolean{st@ndardparskip}{false}%
 \newboolean{st@ndardtypewriter}%
 \setboolean{st@ndardtypewriter}{false}%
 \newcommand*{\zeichenzahl}{60}%
 \newcommand*{\zeilenzahl}{30}%
%    \end{macrocode}
% \subsection{Optionen}
% Hier werden jetzt die optionalen Argumente des
% |\usepackage{stdpage}|-Befehls definiert. |#1| bezieht sich jeweils auf
% den Eintrag nach dem Gleichheitszeichen, in eckigen Klammern der
% Defaultwert, der angenommen wird, falls kein Gleichheitszeichen und kein
% Wert folgt. Ob man also |just=true| eingibt oder einfach |just| ist
% egal.
%    \begin{macrocode}
\define@key{stdpage}{block}[true]{%Aus Kompatibilitätsgründen (zu v. 0.4) auf deutsch
  \setboolean{st@ndardjust}{#1}%
}%
\define@key{stdpage}{just}[true]{%
  \setboolean{st@ndardjust}{#1}%
}%
\define@key{stdpage}{noindent}[true]{%
  \setboolean{st@ndardnoindent}{#1}%
}%
\define@key{stdpage}{linenumbers}[true]{%
  \setboolean{st@ndardnumbers}{#1}%
}%
\define@key{stdpage}{hyphen}[true]{%
  \setboolean{st@ndardhyphen}{#1}%
}%
\define@key{stdpage}{parskip}[true]{%
  \setboolean{st@ndardparskip}{#1}%
}%
\define@key{stdpage}{chars}[60]{%
  \renewcommand{\zeichenzahl}{#1}%
}%
\define@key{stdpage}{lines}[30]{%
  \renewcommand{\zeilenzahl}{#1}%
}%
\define@key{stdpage}{baselinestretch}[1.25]{%
  \renewcommand{\baselinestretch}{#1}%
}%
\define@key{stdpage}{typewriter}[true]{%
  \setboolean{st@ndardtypewriter}{#1}%
}%    \end{macrocode}
% Die folgenden Zeilen habe ich auch nicht verstanden, sie tun aber ihre
% Arbeit wie erhofft, indem sie das Makro |\ProcessOptionsWithKV| anstelle
% von |\ProcessOptions| bereitstellen, das dann am Ende zum Einsatz kommt.
%    \begin{macrocode}
\def\ProcessOptionsWithKV#1{%
  \let\@tempc\relax%
  \let\stdpage@tempa\@empty%
  \@for\CurrentOption:=\@classoptionslist\do{%
    \@ifundefined{KV@#1@\CurrentOption}%
    {}%
    {\edef\stdpage@tempa{\stdpage@tempa,\CurrentOption,}}%
  }%
  \edef\stdpage@tempa{%
    \noexpand\setkeys{#1}{%
      \stdpage@tempa\@ptionlist{\@currname.\@currext}%
    }%
  }%
  \stdpage@tempa%
}%
%    \end{macrocode}
% Jetzt kommt die etwas umst\"{a}ndliche Berechnung der L\"{a}ngen, aber
% sicher ist sicher \dots
%    \begin{macrocode}
\AtBeginDocument{
     \settowidth{\CharsX}{1234567890}%
     \setlength{\CharsI}{.1\CharsX}%
     \setlength{\St@ndardLinewidth}{\zeichenzahl\CharsI}%
     \setlength{\St@ndardTextwidth}{0pt}%\topskip}%
     \addtolength{\St@ndardTextwidth}{\zeilenzahl\baselineskip}%
%    \end{macrocode}
% Wenn |parskip| gew\"{a}hlt wird, f\"{u}gt stdpage einen Durchschuss
% zwischen den Absätzen ein. Nix dehnbar - einfach Schreibmaschine.
%    \begin{macrocode}
    \ifthenelse{\boolean{st@ndardparskip}}%
    {\setlength{\parskip}{\baselineskip}}{}
%    \end{macrocode}
% Dann werden die Werte an das |typearea|-Paket \"{u}bergeben. Dabei
% m\"{u}ssen etwa 2,4\,\% abgezogen werden, falls die Blockoption
% gew\"{a}hlt wurde, ansonsten sorgt die Stauchung der Wortzwischenr\"{a}ume
% f\"{u}r entsprechend weniger Seiten (und das soll ja nicht!). Durch die neuen
% fontdimen-Werte bei just=true entfällt dieses Gefrickel.
%    \begin{macrocode}
%%%      \ifthenelse{\boolean{st@ndardjust}}%
%%%          {%
               \areaset[current]{.976\St@ndardLinewidth}{\St@ndardTextwidth}%
%%%          }%
%%%          {%
%%%               \areaset[current]{\St@ndardLinewidth}{\St@ndardTextwidth}%
%%%          }%
%    \end{macrocode}
% Auch zu Beginn werden, falls Blocksatz gew\"{u}nscht
% wurde, die Interwordspaces flexibel gesetzt, sonst wird auf
% Rausatz oder (wenn hyphen=false) Flattersatz gestellt
%    \begin{macrocode}
     \ifthenelse{\boolean{st@ndardjust}}%
     {%
        \spaceskip=1\CharsI plus 1.5pt minus 0pt
     }%
     {%
        \spaceskip=1\CharsI plus 0pt minus 0pt
        \ifthenelse{\boolean{st@ndardhyphen}}%
        {%
            \setlength{\RaggedRightRightskip}{0em minus .75em}
            \RaggedRight%
        }%
        {%
            \raggedright%
        }%
      }%
     \ifthenelse{\boolean{st@ndardnoindent}}%
        {\setlength{\parindent}{0mm}}{}%
     \ifthenelse{\boolean{st@ndardnumbers}}{%
        \modulolinenumbers[5]%
        \linenumbers%
        \pagewiselinenumbers%
     }{}%
%    \end{macrocode}
%   Die neue (v. 0.6) Option typewriter brät alle Überschriften auf fette Schreibmaschine runter
%    \begin{macrocode}
     \ifthenelse{\boolean{st@ndardtypewriter}}%
     {%
         \let\sectfont\normalfont
         \renewcommand{\footnotesize}{\normalsize}
         \titleformat{\part}{\normalfont\normalsize\bfseries}{\thepart}{1em}{}
         \titleformat{\chapter}{\normalfont\normalsize\bfseries}{\thechapter}{1em}{}
         \titleformat{\section}{\normalfont\normalsize\bfseries}{\thesection}{1em}{}
         \titleformat{\subsection}{\normalfont\normalsize\bfseries}{\thesubsection}{1em}{}
         \titleformat{\subsubsection}{\normalfont\normalsize\bfseries}{\thesubsubsection}{1em}{}
         \titleformat{\paragraph}{\normalfont\normalsize\bfseries}{\theparagraph}{1em}{}
         \titlespacing*{\part}{0pt}{5\baselineskip}{3\baselineskip}
         \titlespacing*{\chapter}{0pt}{4\baselineskip}{3\baselineskip}
         \titlespacing*{\section}{0pt}{3\baselineskip}{2\baselineskip}
         \titlespacing*{\subsection}{0pt}{2\baselineskip}{1\baselineskip}
         \titlespacing*{\subsubsection}{0pt}{1\baselineskip}{0pt}
         \titlespacing*{\paragraph}{0pt}{1\baselineskip}{0pt}
     }{}%
%    \end{macrocode}
% |emergencystretch| sollte mindestens 2em sein, sonst hat man entschieden
% zu viele Box-Warnungen. Frenchspacing sollte aktiviert
% sein, vergrö{\ss}erter Leerraum passt nicht so recht zu Fix-Fonts.
%    \begin{macrocode}
 \frenchspacing
 \emergencystretch=2em%
}%
%    \end{macrocode}
% Hier endet das Argument von |\AtBeginDocument|
%    \begin{macrocode}
\ProcessOptionsWithKV{stdpage}
\AtEndOfPackage{%
  \let\@unprocessedoptions\relax
}
%    \end{macrocode}
%
% \Finale
\endinput%
