<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">% \CheckSum{1180}
% \iffalse
% ======================================================================
% pdfcprot.dtx 
% Copyright (C) 2001/2002 Carsten Schurig
%
% This file is a package to use character protruding of pdftex.
%
% This file can be redistributed and/or modified under the terms
% of the LaTeX Project Public License Version 1.2 or later distributed 
% together with this file. See LEGAL.TXT
% ======================================================================
%
% \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     \&amp;
%   Acute accent  \'     Left paren    \(     Right paren   \)
%   Asterisk      \*     Plus          \+     Comma         \,
%   Minus         \-     Point         \.     Solidus       \/
%   Colon         \:     Semicolon     \;     Less than     \&lt;
%   Equals        \=     Greater than  \&gt;     Question mark \?
%   Commercial at \@     Left bracket  \[     Backslash     \\
%   Right bracket \]     Circumflex    \^     Underscore    \_
%   Grave accent  \`     Left brace    \{     Vertical bar  \|
%   Right brace   \}     Tilde         \~}
%
%&lt;*dtx&gt; 
\ProvidesFile{pdfcprot.dtx}
%&lt;/dtx&gt;
%&lt;driver&gt; \ProvidesFile{pdfcprot.drv}
%&lt;*dtx&gt; 
%&lt;*driver&gt;
[2002/08/14 v1.6 pdfcprot
%&lt;/driver&gt;
%&lt;/dtx&gt;
%&lt;dtx&gt; documented source]
%&lt;*driver&gt;
 bundle]
\documentclass[10pt,a4paper]{ltxdoc}
%\usepackage[a4paper,BCOR20mm,DIV12]{typearea}
\usepackage[latin1]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{array,tabularx}
%\DisableCrossrefs
\EnableCrossrefs
\CodelineIndex
%\OnlyDescription
\RecordChanges
\MakeShortVerb{\|}
\setlength{\paperwidth}{597.50793pt}
\setlength{\textwidth}{405.45183pt}
\setlength{\evensidemargin}{17.83041pt}
\setlength{\oddsidemargin}{29.68571pt}
\setlength{\paperheight}{845.04694pt}
\setlength{\textheight}{634.0pt}
\setlength{\topmargin}{-34.84941pt}
\setlength{\headheight}{15.0pt}
\setlength{\headsep}{18.0pt}
\setlength{\topskip}{10.0pt}
\setlength{\footskip}{42.0pt}
\setlength{\baselineskip}{12.0pt}
\def\MacroFont{\ttfamily\footnotesize}
\makeatletter
\renewcommand\section{\@startsection {section}{1}{\z@}%
                                   {-3.5ex \@plus -1ex \@minus -.2ex}%
                                   {2.3ex \@plus.2ex}%
                                   {\normalfont\Large\bfseries\raggedright}}
\renewcommand\subsection{\@startsection{subsection}{2}{\z@}%
                                     {-3.25ex\@plus -1ex \@minus -.2ex}%
                                     {1.5ex \@plus .2ex}%
                                     {\normalfont\large\bfseries\raggedright}}
\renewcommand\subsubsection{\@startsection{subsubsection}{3}{\z@}%
                                     {-3.25ex\@plus -1ex \@minus -.2ex}%
                                     {1.5ex \@plus .2ex}%
                                     {\normalfont\normalsize\bfseries\raggedright}}

\newenvironment{Declaration}%
{\par\small\addvspace{1.5\baselineskip plus .5\baselineskip}%
  \vspace{-\baselineskip}%
  \noindent\hspace{-10mm}%
  \begin{tabular}{|l|}\hline\ignorespaces}%
  {\\\hline\end{tabular}\nobreak\par\nobreak
  \vspace{1.5\baselineskip}\vspace{-\baselineskip}%
  \noindent\ignorespacesafterend}
\newcommand{\Macro}[1]{\mbox{\texttt{\char`\\#1}}}
\newcommand{\Option}[1]{\mbox{\texttt{#1}}}
\newcommand{\PName}[1]{\mbox{\texttt{#1}}}
\newcommand{\PValue}[1]{\textit{#1}}
\newcommand{\Parameter}[1]{\texttt{\{}\PName{#1}\texttt{\}}}
\newcommand{\OParameter}[1]{\texttt{[}\PName{#1}\texttt{]}}

 \newcommand{\Value}[1]{\textit{#1}}
\def\SpecialOptionIndex#1{\@bsphack
  \index{#1\actualchar{\protect\ttfamily#1}
    (option)\encapchar usage}%
  \index{options:\levelchar{\protect\ttfamily#1}\encapchar usage}\@esphack}
\def\Describe@Macro#1#2{\endgroup
  \begin{Declaration}
    #2
  \end{Declaration}%
  \SpecialUsageIndex{#1}\@esphack\ignorespaces}
\def\DescribeOption{\leavevmode\@bsphack\begingroup\MakePrivateLetters\Describe@Option}
\def\Describe@Option#1#2{\endgroup
  \begin{Declaration}
    #2
  \end{Declaration}%
  \SpecialOptionIndex{#1}\@esphack\ignorespaces}
\@ifundefined{KOMAScript}{%
  \DeclareRobustCommand{\KOMAScript}{\textsf{K\kern.05em O\kern.05em%
      M\kern.05em A\kern.1em-\kern.1em Script}}}{}
\makeatother
\begin{document} 
 \DocInput{pdfcprot.dtx}
\end{document}
%&lt;/driver&gt;
% \fi
% \GetFileInfo{pdfcprot.dtx}
% \makeatletter
% \def\macro{\begingroup
%    \catcode`\\12
%    \MakePrivateLetters \m@cro@ 0}
% \def\environment{\begingroup
%    \catcode`\\12
%    \MakePrivateLetters \m@cro@ 1}
% \def\option{\begingroup
%    \catcode`\\12
%    \MakePrivateLetters \m@cro@ 2}
% \def\Key{\begingroup
%    \catcode`\\12
%    \MakePrivateLetters \m@cro@ 3}
% \def\Counter{\begingroup
%    \catcode`\\12
%    \MakePrivateLetters \m@cro@ 4}
% \long\def\m@cro@#1#2{\endgroup \topsep\MacroTopsep \trivlist
%   \edef\saved@macroname{\string#2}%
%   \ifcase #1%
%     \edef\saved@@macroname{\expandafter\@gobble\saved@macroname}
%   \or
%     \edef\saved@@macroname{\expandafter\@gobble\saved@macroname}
%   \or
%     \edef\saved@@macroname{\expandafter\@gobble\saved@macroname}
%   \else
%     \let\saved@@macroname\saved@macroname
%   \fi
%   \def\makelabel##1{\llap{##1}}%
%   \if@inlabel
%     \let\@tempa\@empty \count@\macro@cnt
%     \loop \ifnum\count@&gt;\z@
%       \edef\@tempa{\@tempa\hbox{\strut}}\advance\count@\m@ne \repeat
%     \edef\makelabel##1{\llap{\vtop to\baselineskip
%                                {\@tempa\hbox{##1}\vss}}}%
%     \advance \macro@cnt \@ne
%   \else  \macro@cnt\@ne  \fi
%   \edef\@tempa{\noexpand\item[%
%      \ifcase #1%
%        \noexpand\PrintMacroName
%      \or
%        \noexpand\PrintEnvName
%      \or
%        \noexpand\PrintOptionName
%      \or
%        \noexpand\PrintKeyName
%      \or
%        \noexpand\PrintCounterName
%      \fi
%      {\string#2}]}%
%   \@tempa
%   {\advance\c@CodelineNo\@ne
%    \ifcase #1%
%       \SpecialMainIndex{#2}\nobreak
%       \DoNotIndex{#2}%
%    \or
%       \SpecialMainEnvIndex{#2}\nobreak
%    \or
%       \SpecialMainOptionIndex{#2}\nobreak
%    \or
%       \SpecialMainKeyIndex{#2}\nobreak
%    \or
%       \SpecialMainCounterIndex{#2}\nobreak
%    \fi
%    }%
%   \ignorespaces}
% \let\endoption\endtrivlist
% \providecommand*{\PrintOptionName}[1]{\strut \MacroFont #1\ }
% \providecommand*{\PrintKeyName}[1]{\strut \MacroFont #1\ }
% \providecommand*{\PrintCounterName}[1]{\strut \MacroFont #1\ }
% \newcommand*{\ttbksp}{\texttt{\char`\\}}
% \newcommand*{\SpecialMainOptionIndex}[1]{\@bsphack
%   \special@index{#1\actualchar{\string\ttfamily\space#1}
%     (option)\encapchar main}%
%   \special@index{options:\levelchar{\string\ttfamily\space#1}\encapchar
%     main}\@esphack}
% \newcommand*{\SpecialMainKeyIndex}[1]{\@bsphack
%   \special@index{#1\actualchar{\string\ttfamily\space#1}
%     (key)\encapchar main}%
%   \special@index{keys:\levelchar{\string\ttfamily\space#1}\encapchar
%     main}\@esphack}
% \newcommand*{\SpecialMainCounterIndex}[1]{\@bsphack
%   \special@index{#1\actualchar{\string\ttfamily\space#1}
%     (counter)\encapchar main}%
%   \special@index{counter:\levelchar{\string\ttfamily\space#1}\encapchar
%     main}\@esphack}
% \DoNotIndex{\!, \', \(, \), \,, \-, \., \:, \;, \?, \`}
% \DoNotIndex{\@ifundefined, \@onlypreamble, \@tempb, \@tempcnta,
% \@tempcntb, \@tfor}
% \DoNotIndex{\A, \a, \addtocounter, \advance, \and, \AtBeginDocument}
% \DoNotIndex{\bfseries, \B, \b, \boolean}
% \DoNotIndex{\C, \c, \char, \csname, \CurrentOption}
% \DoNotIndex{\D, \d, \DeclareOption, \def, \define@key, \divide, \do}
% \DoNotIndex{\E, \e, \else, \endcsname, \endinput, \equal,
% \expandafter}
% \DoNotIndex{\F, \f, \fi, \font, \fontdimen, \fontencoding,
% \fontfamily, \fontshape, \fontseries, \footnotesize, \f@encoding,
% \f@shape, \f@series, \f@family}
% \DoNotIndex{\G, \g, \gdef, \global}
% \DoNotIndex{\H, \h, \hbox, \Huge, \huge}
% \DoNotIndex{\I, \i, \ifcase, \IfFileExists, \InputIfFileExists,
% \ifnum, \ifthenelse, \ifx, \input, \itshape}
% \DoNotIndex{\J, \j}
% \DoNotIndex{\K, \k, \KV@errx}
% \DoNotIndex{\L, \l, \LARGE, \Large, \large, \let, \loop, \lpcode}
% \DoNotIndex{\M, \m, \mdseries, \MessageBreak, \multiply}
% \DoNotIndex{\N, \n, \NeedsTeXFormat, \newcommand, \newcounter,
% \newboolean, \newif, \normalsize}
% \DoNotIndex{\O, \o, \or}
% \DoNotIndex{\P, \p, \PackageError, \PackageInfo, \PackageWarning,
% \pdfoutput, \pdftexrevision, \pdftexversion, \ProcessOptions,
% \protect,, \protected@edef, \protected@xdef, \pdfprotrudechars, \ProvidesPackage}
% \DoNotIndex{\Q, \q, \quotedblbase}
% \DoNotIndex{\R, \r, \relax, \renewcommand, \repeat, \RequirePackage,
% \rmfamily, \rpcode}
% \DoNotIndex{\S, \s, \scriptsize, \scshape, \selectfont, \setboolean,
% \setbox, \setcounter, \setkeys, \sffamily, \slshape, \small, \space,
% \stepcounter, \string}
% \DoNotIndex{\T, \t, \textquotedblleft, \tiny}
% \DoNotIndex{\U, \u, \undefined, \upshape, \usepackage}
% \DoNotIndex{\V, \v, \value}
% \DoNotIndex{\W, \w, \wd}
% \DoNotIndex{\X, \x, \Y, \y, \Z, \z, \z@}
% \makeatother
% \title{The |pdfcprot.sty| Package.\thanks{This file has version \fileversion{} dated
% \filedate.}}
% \author{Carsten Schurig\thanks{This package depends intensely on code originally from H\`{a}n Th\'{\^{e}} Th\`{a}n.}}
% \maketitle
% \abstract{This package was written to provide the ``normal''
% \LaTeXe{} user an easy way to use the special character protruding
% feature invented by |pdftex|. Further this package provides an easy
% interface to adjust the character protrusion for different fonts and
% choosing the right adjustment automatically depending on the font.}
% \tableofcontents{}
% \changes{1.0}{2001/10/26}{First submit able version. The package
% seems to work, but the documentation is  incomplete. This version
% was an internal one.}
% \changes{1.1}{2001/10/30}{Some of the code was changed while writing
% the documentation, because the first version had an annoyance: the
% files that contain the setup of the character protruding were loaded
% more than once because of the then used implementation. Now it's just loaded once, even
% if the font setting is used more (because it's the fallback).}
% \section{Introduction}
% As the abstract stated this package exists to provide a simple user
% interface to the character protruding feature of
% |pdftex|\footnote{You'll find |pdftex| on
% |CTAN:/sytems/pdftex|.}. This is a special way to do a margin
% kerning. By that it is possible to achieve a visual more ``smooth''
% margin. When not doing a margin kerning, the margins seems to be flattered a bit, especially at
% hyphens and punctuation. Character Protruding is a simple but nevertheless effective
% way to achieve a margin kerning.  For more information
% about margin kerning and especially character protruding see the
% thesis of H\`{a}n Th\'{\^{e}}
% Th\`{a}nh~\cite{hanthethanh:thesis}\footnote{It could be found on the
% web, but I don't remember where I got it.}.
%
% \subsection{A bit of History}
% Why did I write this package, so you can use it now? Well, it all
% started with my diploma thesis. I used \LaTeXe{} on a regular basis
% before that, but here I still had to increase my knowledge, esp. in
% typography. So I read somewhere in a book something about margin
% kerning (some book of Jan Tschichold). So I wanted to test, how
% it would look like.
%
% But my first questions in |de.comp.text.tex| where a bit
% unsuccessful. The only answers where, that it could be achieved with
% \TeX{}, but that it is not without problem. As an example the
% \LaTeX{}-Companion was mentioned, at least the German
% edition\cite{begleiter} was put with a kind of hanging
% punctuation. But in the preface Frank Mittelbach stated, that there
% doesn't exist a ready to use package for \LaTeXe{} and one would have
% to wait for \LaTeX3 very likely. And as you can easily see, only the
% hyphens and the punctuation signs were protruded. That was the
% situation of November 1994.
%
% But the situation seemed to be the same in 2000. I found
% \emph{nothing} really usable with \LaTeXe to put a longer text with
% (longe than some paragraphs). Then someone pointed out,
% that character protruding is a feature provided by the new
% |pdftex|. At first I was a bit sceptical because I didn't want to
% switch, needing the possibility to use |EPS| input (I heavily
% used |psfrag|). But soon it was pointed out, that |pdftex| supports
% |DVI| output and that in this mode |pdftex| has no limitations
% compared to \LaTeX. Shortly after getting this information I found
% |protcode.tex| provided by H\`{a}n Th\'{\^{e}} Th\`{a}nh.
%
% That I transfered to a packaged for my own use and as some people
% showed interests on |de.comp.text.tex| I posted it
% there\footnote{The first version was named |optrandausgleich.sty|
% and a second |pdftexfeats.sty|.}. But it was never what I expected
% by a package to submit it to |CTAN|. It lacked documentation and
% the support of setting the character protruding depending on the
% used font.
%
% First I wanted to write a package adjusting some of the additional
% features of |pdftex| (for instance the security features). But in
% discussions with Heiko Oberdiek he convinced me, that it is better
% to have some smaller packages instead of putting all into
% one. Additionally the resulting |pdfcprot| package grew more complex
% than expected at first. So the code is complex enough for me to
% maintain and Heiko does a really good job with |pdfsec.sty| (he
% supports more than |pdftex|).
%
% \subsection{Provided Features}
% This package provides a very simple interface to support a font
% dependent selection of the adjustment of the character
% protrusion. You can easily chose, which fonts will be protruded
% depending on high level \LaTeXe{} font selection not knowing which
% font actually will be used. Further on it is very simple to adjust
% the character protrusion for fonts not ``supported''  directly(only
% for Palatino character protrusion adjustment set (|CPA|) is provided and
% that will be used for \emph{all} fonts, not having a special |CPA|).
%
% Further on an option to switch the |pdftex| output to |DVI| and a
% command testing, whether you use |PDF| output or not are
% provided\footnote{That's originally from \KOMAScript.}
%
% \section{Using this package.}
%
% First you have to invoke it with a |\usepackage{pdfcprot.sty}| in
% the preamble of your document. Of course you have to use |pdftex| to
% get any effect, but the package just gives a warning if you don't.
%
% \subsection{Requirements}
%
% This package need just two package, which should be part of every
% \LaTeXe{} distribution not too old: |keyval.sty| (part of the
% |graphicx| bundle) and |ifthen.sty|). If they're not installed, get
% them from |CTAN|.
%
% \subsection{Character Protruding}
%
% For using the character protruding two user interfaces are
% implemented. If you just want to activate it for the most common
% used fonts, not thinking much about internals just use the
% \emph{simple} interface.
%
% When you don't like the preselection of the fonts being adjusted for
% character protruding, you may want to use the \emph{advanced} user
% interface. As the usage of many fonts for character protruding is
% very memory consuming, there may be some cases you want to choose
% non-ambiguous the fonts getting character protruding sparing any useless
% font.
%
% \subsubsection{The \emph{Simple} User Interface}
%
% For the ``normal'' \LaTeXe{} user, who just wants to activate the
% character protruding one option is provided. 
% \DescribeOption{activate}{\Option{activate [=none, normal]}}If you
% just want to activate character
% protruding for the most used fonts just say |activate| or
% |activate=normal| (these two forms are synonyms). For which fonts the
% character protrusion will be enabled is shown in
% table~\ref{tab:activate}. 
%
% By default character protruding won't be enabled, but if you want the
% options to reflect it say |activate=none|. 
%
% \begin{table}
% \centering%
% \begin{tabular}{l l l}\hline\hline
% family &amp; series &amp; shape\\\hline
% |\rmfamily| &amp; |\mdseries| &amp; |\upshape|\\
% &amp; &amp; |\itshape|\\
% &amp; |\bfseries| &amp; |\upshape|\\
% |\sffamily| &amp; |\mdseries| &amp; |\upshape|\\
% &amp; &amp; |\itshape| \\
% &amp; &amp; |\slshape| \\
% |\sffamily| &amp; |\bfseries| &amp; |\upshape|\\
% \hline\hline
% \end{tabular}\\[2mm]
% sizes for all fonts: |\footnotesize|, |\small|,
% |\normalsize| and |\large|
% \caption{Fonts for which character protrusion will be enabled
% using the package option
% \texttt{avtivate=normal}.}\label{tab:activate}
% \end{table}
%
% \emph{Some comments:} You may wonder why character protruding is
% activated for so many font types and not just for |\rmfamily||\mdseries||\upshape|
% and maybe |\sffamily| |\mdseries||\upshape| using |activate| or
% |activate=normal| as package option. That is done
% because I don't want to bother the ``normal'' \LaTeXe-user with more
% than passing the one option to the package but I still want to
% catch the fonts, most likely to be used in cases ``needing''
% character protrusion (this means justified text). As this may appear
% not only for the text type (but e.g. also for captions), though the
% two fonts mentioned above are not sufficient.
%
% \subsubsection{The \emph{Advanced} User Interface}

% In some cases it may be favourable to have a bit more control over the font
% selection for the character protruding. With the commands described
% in this section a very fine selection is possible.
%
% The first command to be mentioned has a high level syntax. For that
% it's possible to choose the font by high level \LaTeXe{} font
% selection commands but only \emph{one} font at a time is
% selectable. To setup the character protruding for more than one
% font, this command has to be called more than once.
% \newlength{\myT}\settowidth{\myT}{\texttt{textcomp}}
% \DescribeMacro{\setupcharprotruding}{\Macro{setupcharprotruding}\Parameter{family=\emph{fm}, series=\emph{sr}, shape=\emph{sh}, size=\emph{sz}[, textcomp=\emph{tc}]}}\begin{tabularx}{\linewidth}{@{}p{\myT} X@{}}
% |family| &amp; This tag specifies the family to be used. |rmfamily| and
% |sffamily| are valid values. Any other value will be supposed as a low level
% font name (see below). \emph{This tag is mandatory.}\\
% \end{tabularx}
% \begin{tabularx}{\linewidth}{@{}p{\myT} X@{}}
% |series| &amp; This tag is used to chose the font series. Valid values are
% |mdseries| and |bfseries|. Any other value will be supposed as a low level
% font name (see below). \emph{This tag is mandatory.}\\
% \end{tabularx}
% \begin{tabularx}{\linewidth}{@{}p{\myT} X@{}}
% |shape| &amp; The font shape is chosen using this tag. As for the other
% tags valid values are the high level \LaTeXe{} font selection
% commands without trailing backslash, as are: |upshape|, |itshape|,
% |slshape|, and |scshape|. Any other value will be supposed as a low level
% font name (see below). \emph{This tag is mandatory.}\\
% \end{tabularx}
% \begin{tabularx}{\linewidth}{@{}p{\myT} X@{}}
% |size| &amp; This tag is to select the wanted font sizes. Valid values
% are also the \LaTeXe{} high level font size selection commands
% without trailing backslash, that are: |Huge|, |huge|, |LARGE|,
% |Large|, |large|, |normalsize|, |small|, |footnotesize|,
% |scriptsize|, and |tiny|. \emph{This tag is mandatory.}\\
% \end{tabularx}
% \begin{tabularx}{\linewidth}{@{}p{\myT} X@{}}
% |textcomp| &amp; This is a boolean switch for choosing whether to
% activate character protruding for TS1 encoded fonts also or
% not. Values are |true| (|on|, |yes|, |1|), or |false| (|off|, |no|,
% |0|). \emph{This tag is optional. If this tag is not specified it
% defaults to \emph{|false|}.}\\
% \end{tabularx}
%
% \paragraph{The low level font selection.} The ``normal'' parameters
% for font selection are the high level \LaTeXe{} font selection
% commands without trailing backslash. Using any option other than
% that for the tags |family|, |series|, and |shape|, a low level font
% selection command will be suggested. By that it is possible
% to setup the character protruding for a font with a user defined font
% selection command but without struggling with internal commands of
% |pdfcprot.sty|.
%
% \newlength{\scpw}\settowidth{\scpw}{\ttfamily asetupcharprotrudinga}
% \begin{description}
% \item[Example 1:] The usage of
%
% \begin{quote} 
% |\usepackage[activate=none]{pdfcprot}|\\
% |\setupcharprotruding{family=rmfamily,series=elec,|\\ 
% \hspace*{\scpw}|shape=ui,size=normalsize,|\\
% \hspace*{\scpw}|textcomp=false}|\\
% |\activatecharprotruding|
% \end{quote}
%
% will result in a command to setup character protruding like:\\
% |\rmfamily\fontseries{elec}\selectfont|\\
% |\fontshape{ui}\selectfont\normalsize\CPROT@setprotcodes@font|
%
% This means for the font |\rmfamily| with font series |elec| and font
% shape |ui| character protruding will be adjusted.
% \end{description}
%
% \begin{description}
% \item[Example 2:] Using
%
% \begin{quote}
% |\usepackage[activate]{pdfcprot}|\\
% |\setupcharprotruding{family=rmfamily,series=bfseries,|\\ 
% \hspace*{\scpw}|shape=upshape,size=normalsize,|\\
% \hspace*{\scpw}|textcomp=false}|\\
% |\activatecharprotruding|
% \end{quote}
%
%  will lead to a command to setup character protruding like:\\
%  |{\CPROT@setprotcodes@font}|\\
% |{\rmfamily\bfseries\upshape\normalsize\CPROT@setprotcodes@font}|
% \end{description}
%
% A low level selection of the font size is not possible with
% |\setupcharprotruding|. For setting
% up the character protruding using other font size commands than the
% high level \LaTeXe{} ones, the usage of internal |pdfcprot| commands
% is needed.
%
% To setup more than two or three fonts with the command above
% described would be a bit long-winded. So there's another command
% provided with which it is possible to select more than one font at a
% time (with some limitations).
% \DescribeMacro{\setupcharprotrudingnumeral}{\Macro{setupcharprotrudingnumeral}\Parameter{family=\emph{fm}, series=\emph{sr}, shape=\emph{sh}, size=\emph{sz}[, textcomp=\emph{tc}]}}The
% principal meaning of the tags is the same as for
% |\setupcharprotruding|, especially |textcomp| is exactly the
% same. The only thing differing for |family|, |series|, |shape|, and
% |size| is the way the font has to be chosen.
%
% Here a scheme is used similar to the numeral interface of |chmod| on
% UNIX systems. That means every \LaTeXe{} high level font selection
% command got a number assigned. More than one fonts are choose able by
% adding the fitting numbers. The suitable values are
% shown in table~\ref{tab:scpnum}. If one parameter is zero, the actual
% command will have no effect,
%
% \newcommand{\nil}{\textrm{\emph{nil}}}
% \begin{table}\centering
% \begin{tabular}{@{}&gt;{\ttfamily}r &gt;{\ttfamily}l &gt;{\ttfamily}l
% &gt;{\ttfamily}l &gt;{\ttfamily}l@{}}\hline\hline
% \textrm{value} &amp; \textrm{family} &amp; \textrm{series} &amp; \textrm{shape}
% &amp; \textrm{size}\\\hline
% 0 &amp; none &amp; none &amp; none &amp; none\\
% 1 &amp; sffamily &amp; bfseries &amp; scshape &amp; tiny\\
% 2 &amp; rmfamily &amp; mdseries &amp; slshape &amp; scriptsize\\
% 4 &amp; \nil &amp; \nil &amp; itshape &amp; footnotesize\\
% 8 &amp; \nil &amp; \nil &amp; upshape &amp; small \\
% 16 &amp; \nil &amp; \nil &amp; \nil &amp; normalsize \\
% 32 &amp; \nil &amp; \nil &amp; \nil &amp; large \\
% 64 &amp; \nil &amp; \nil &amp; \nil &amp; Large \\
% 128 &amp; \nil &amp; \nil &amp; \nil &amp; LARGE \\
% 256 &amp; \nil &amp; \nil &amp; \nil &amp; huge \\
% 512 &amp; \nil &amp; \nil &amp; \nil &amp; Huge
% \\\hline\hline
% \end{tabular}
% \caption{The numbers to use with
% \texttt{\string\setupcharprotrudingnumeral}.}\label{tab:scpnum}
% \end{table}
%
% \settowidth{\scpw}{\ttfamily asetupcharprotrudingnumerala}
% \begin{description}
% \item[Example 1:] For |\rmfamily||\mdseries| the character
% protruding is to be adjusted for |\upshape| and |\itshape| for the
% sizes |\large|, |\normalsize| and |\footnotesize|. Further for the
% font |\rmfamily||\bfseries||\upshape| with the same font sizes
% character protruding is wanted. To achieve that, one would have to call:
% 
% \begin{quote}
% |\usepackage[activate=none]{pdfcprot}|\\
% |\setupcharprotrudingnumeral{family=2,series=2,shape=12,size=52}|\\
% |\setupcharprotrudingnumeral{family=2,series=1,shape=8,size=52|\\
% |\activatecharprotruding|
% \end{quote}
%
% Explanation: |family| and |series| are directly readable from
% table~\ref{tab:scpnum}, as is |shape| for the second call of
% |\setupcharprotrudingnumeral|. To get the value of |shape| for the
% first command, the values for |shape=upshape| and |shape=itshape| (8
% and 4) must be added. Similar it's for |size|, one has to add the values
% for |size=footnotesize| (4), |size=normalsize| (16), and
% |size=large| (32).
% \end{description}
%
% The setup of character protruding using
% |\setupcharprotrudingnumeral| is just possible for fonts accessed by
% high level \LaTeXe{} font selection commands.
%
% \paragraph{Remarks.} Both commands to select the fonts for which
% character protrusion will be adjusted are \emph{only} usable in the preamble
% of the document.
%
% The attentive reader may have noticed another command needed to
% activate the character protrusion when calling the package with the
% option |activate=none|. That is due to the fact, that the
% |\setupcharprotruding| commands just create a command to call at the
% start of the document to adjust the amount of the character
% protruding for a special font (on a character basis), but does not
% activate the using of character protruding itself.
% \DescribeMacro{\activatecharprotruding}{\Macro{activatecharprotruding}\OParameter{\emph{activate}}}Valid 
% values for \texttt{\emph{activate}} are |true| (|yes|, |on|, |1|),
% false (|no|, |off|, |0|), or |compatible| (|compatibility|). Calling
% |\activatecharprotruding| without any parameter means |true|. With
% |true| and |false| the character protruding is switched on and off
% respectively. Why the parameter |compatible|? As the character
% protrusion moves some character into the margins, the word spaces on a
% line may change. When using |activate=true|, |pdflatex| will take this
% additional space into account and by that the line breaks may
% change compared to the use of ``normal'' |latex|. If the line breaks
% are wanted as got by using |latex| but with a active character
% protruding, you'll have to call |\activatecharprotruding| with the
% parameter |compatible|.
%
% The activation of the character protruding is group specific. So it
% is possible to activate and deactivate the character protrusion for
% some parts of a text (but not the \emph{amount} of the character
% protrusion of a special font).
%
% The package output is very informative when looking at the |log| file,
% but the output to |stdout| is normally not. To change that, there's
% one option
% \DescribeOption{quiet}{\Option{quiet=\emph{qt}}} Possible values for
% this parameter are the booleans used in this package (|true|, |on|,
% |yes|, |1|, |false|, |off|, |no|, and |0|). When saying |quiet=no|
% many of the package info will be warnings instead. That is a good
% method to see, which font character protrusion adjustment actually
% will be used (and for which font).
%
% \subsection{The Character Protruding Adjustment -- Creating and
% Using a New One for a Specific Font}
%
% \emph{This section is a bit technical and a study of the source code
% may be very helpful (and is recommended).}\\
%
% To understand what the purpose of this section is, a description of
% the strategy of the package is needed. So what does the package do?
% The command |\setupcharprotruding| and its numerical equivalent will
% create a command with the fitting font selection commands and a
% command |\CPROT@setprotcodes@font|. The whole command will be called at the
% start of the document. Then the font selection takes place and
% |\CPROT@setprotcodes@font| looks, what font was requested
% actually\footnote{The used commands to determine which font is loaded
% (\texttt{\string\f@family}, \texttt{\string\f@series},
% \texttt{\string\f@shape}, \texttt{\string\f@encoding}) return the
% font requested to \TeX{} \emph{not} the font actually used, so it
% seems. That means for instance if you request a bold Palatino font
% with \texttt{\string\bfseries}, \TeX{} will try to load \texttt{ppl/bx/n} but will only
% find and use \texttt{ppl/b/n} (at least on my system). So as series the
% actual font will be \texttt{b} and not \texttt{bx} which will be reported by the
% use of \texttt{\string\f@series}. Though one could think it would be needed to
% adjust the character protruding in a \texttt{CPA} for
% \texttt{pplbn}, it will be looked for \texttt{pplbxn} instead.}. Then it
% looks if a command named |\f@family| |\f@series||\f@shape\f@encoding| is
% defined (the concatenate values of the commands). If it is, this command will be
% used to setup the character protruding, if not |pdfcrpot| will try
% to load a file named |fontname.cpa| containing this command. If that
% fails as well, a fallback font will be used (by default it will be
% |pplmn| with the appropriate font encoding).
%
% To define the command to set up the character protruding, an
% external file was chosen to get an easier maintenance. Defining it
% in the package would enlarge the package noticeably and the package
% would soon become overcrowded.
%
% So if a special character protruding setting for a
% font is wanted, copy the file |pplmnT1.cpa| (for T1 encoding) to the
% required fontname|.cpa| and change the definition of the command
% accordingly.
%
% \begin{description}
% \item[Example: ] A special character protruding setup for the bold version of Palatino in
% T1 encoding is wanted. As the \LaTeXe{} command
% |\bfseries| selects an bold expanded version (|bx|), the font name would be |pplbxnT1.cpa| and
% the command to define |\pplbxnT1|. That means to copy |pplmnT1.cpa|
% to |pplbxnT1.cpa| and change the definition of |\csname pplmnT1\endcsname|
% to |\csname pplbxnT1\endcsname| and further on to adjust the wanted
% |\rpcode| and |\lpcode| values.
% \end{description}
%
% For the meaning of the commands and values in the |CPA| see the documentation of the code
% below and H\`{a}n Th\'{\^{e}} Th\`{a}nh's
% thesis~\cite{hanthethanh:thesis}. There he writes:
% \begin{quote}
% ``\dots A set of common character protruding factors gave quite reasonable
% results in most cases. Non-typical type faces may require further
% adjustments, which can be done easily.''
% \end{quote}
% So for the most fonts the default values may be acceptable, even
% though they are adjusted for Palatino. By using the |CPA| files and
% defining an extra command per font it is very easy to add setups
% for ``non-typical'' type faces without bothering a ``normal''
% \LaTeXe{} user of choosing the right setup because it gets
% automatically selected.
%
% \subsection{Customising the Package}
%
% There's one command provided to customise the package.
% \DescribeMacro{\setfallbackfont}{\Macro{setfallbackfont}\Parameter{\textit{string}}}As
% described in the section before, this package will look for a
% character protrusion adjustment for a \emph{fallback} font, when not
% finding a |CPA| for the actual font. By default this is
% |pplmn|. That is changeable using |\setfallbackfont|, if a special
% |CPA| was created and suits better. The \emph{|string|} used in
% |\setfallbackfont| specifies the font \emph{without} the character
% encoding. That will be determined by the package.
%
% \subsubsection{System-wide customisation}
%
% For further customisation this package looks for a
% \DescribeOption{pdfcprot.cfg}{\Option{pdftex.cfg}}somewhere
% in your \TeX{} paths. If found it'll be included before any option is
% validated. So you can change some settings on a system-wide
% basis. This file is the best place to change some internal commands,
% if needed, for instance to change which fonts will be activated for
% character protruding when using the option |activate=normal| (by
% redefining |\CPROT@setupcharprotruding@normal|).
%
% \subsection{Other Commands and Options}
%
% Belonging not really to character protrusion this package provides
% two other commands and one additional option, that may be useful in
% dealing with |pdftex|.
%
% First there's is an option to get a |DVI| output using |pdftex|.
% \DescribeOption{DVIoutput}{\Option{DVIoutput}}This may be useful
% if one can't switch completely to |pdftex|, because in this mode all
% the additional features of |pdftex|\footnote{That's not completely
% true though. The supported type of images is in |DVI| mode the same
% as using |latex|.} (as character protruding) are
% available but besides there're no compatibility problems and it
% behaves the same as ``normal'' \LaTeX. So it is for instance possible to include
% |EPS| (and use |psfrag|!). Principally it is not needed to supply
% such an option, because by redefining |\pdfoutput| to |0| you'll get
% |DVI|. The only problem is, that some packages only look if
% |\pdfoutput| is defined to decide, if |PDF| output is
% wanted. So
% this option does an additional
% |\let\pdfoutput\undefined|\footnote{Most actual versions of package
% having had problems may treat it correctly by now. But who has all
% packages installed in most recent versions?}.
%
% Further on there are two \LaTeXe{}-commands to decide, if |pdftex|
% is used and if |PDF| as output is wanted.
% \DescribeMacro{\ifpdftex}{\Macro{ifpdftex}\Parameter{\emph{\texttt{true}}}\Parameter{\emph{\texttt{false}}}}and
% \DescribeMacro{\ifpdfoutput}{\Macro{ifpdfoutput}\Parameter{\emph{\texttt{true}}}\Parameter{\emph{\texttt{false}}}} The
% latter one was taken from the \KOMAScript{} package. So you can use
% the same |\ifpdfoutput| command with or without \KOMAScript. The
% meaning shouldn't change neither in \KOMAScript{} nor in this
% package and the actual definition is not cruel for using this
% command\footnote{If you want a \TeX{} \texttt{\bslash if} switch, look for \texttt{ifpdf.sty} on
% CTAN written by Heiko Oberdiek.}.
%
% The command |\ifpdftex| is very similar but leads to a decision
% depending on the usage of |pdftex| or not. This is useful for the
% activation of special features of |pdftex| not being special to the
% production of |PDF| itself (as character protruding is).
%
% \section{Bugs and Caveats}
%
% Hopefully there're no bugs left, but only features |;-&gt;|. But one
% thing: right now this package contains just character protruding
% settings for OT1 and T1 encoded fonts (and one character of TS1). Further there
% are some (small) problems (two).
%
% First, the creating of the code to do the adjustment of the character
% protruding at the |\begin{document}| is a bit time consuming. The
% more fonts you want to use with character protruding, the longer is the
% time needed. Also the needed memory by |pdftex| can not be
% neglected. Here it's also especially a problem when using many fonts
% (in companion with character expansion it's just increasing). But
% that's not a big problem, because the standard amount of memory for
% |pdftex| is for computer systems of today just a bit small
% adjusted (65535 bytes!). Though you may want to change (or set) the
% parameter |pdf_mem_size| in your |texmf.cnf|\footnote{That is a
% suggestion of myself. I don't know what the authors of |pdftex| say
% to that!.}.
%
% \section{Contributing}
%
% Almost any contribution is welcome. Really needed is the
% contribution of |CPA|'s for other encodings than T1 and OT1. But T1
% and OT1 |CPA|'s may not be perfect. The glyphs are complete for
% German (I hope so) but I don't know for other languages.
%
% Also |CPA| for fonts not looking good with the distributed
% ``default'' values would be nice, even if these fonts are not widely
% used.
%
% Any bug hunting is welcome. Also changes to improve the performance
% are likely to be included, if the performance increase is
% significant and the readability of the package is not distorted too
% much (a good readability was a main focus when writing this package;
% that's one reason why almost on all places where possible \LaTeXe{}
% commands are used.).
%
% If you have some changes, requests, ideas or any other things
% regarding this package feel free to mail me: |Carsten.Schurig@gmx.net|.
%
% \section{Acknowledgements}
%
% All of the people are already mentioned in the text above, but I
% have to emphasise some things.
%
% For these bundle I used many from \KOMAScript. Particularly the
% boring but needed thins around the package (|README.txt|,
% |INSTALL.txt| and the preambles in |pdcprot.ins|) were designed
% using files from \KOMAScript. In some parts I just changed
% \KOMAScript{} to |pdfcprot| (were appropriate). So I owe much to
% Markus Kohm (or the users of this package, because these files would
% be much shorter and maybe indistinct). As already stated there's
% some code taken from \KOMAScript.
%
% Further on some important role played Heiko Oberdiek (I don't think
% he guesses so). As stated in the History I first wanted to create a
% package for many (all) special |pdftex| features (character
% protruding, font expansion, |PDF| security options). But he
% convinced me to write a package just concerning character
% protruding -- luckily, because it's got to more code than I expected
% first.
%
% And last but not least the authors of |pdftex| have to be
% mentioned. Some code comes directly from them.
% 
% \nocite{*}
%\begin{thebibliography}{1}

%\bibitem{hanthethanh:thesis}
%H\`{a}n~Th\'{\^{e}} Th\`{a}nh.
%\newblock {\em Micro-typographic extensions to the {\TeX} typesetting system}.
%\newblock Dissertation, Masaryk University Brno: Faculty of Informatics,
%  October 2000.

%\bibitem{begleiter}
%Michel Goosens, Frank Mittelbach, and Alexander Samarin.
%\newblock {\em Der {\LaTeX}-Begleiter}.
%\newblock Addison-Wesley, 1st edition, 1994.

%\end{thebibliography}
% \StopEventually{}
% \appendix
% \section{The Code Itself}
% 
% First some remarks: the documentation may be inaccurate in some
% places, so look at the code and it'll be very likely the the
% documentation is incomplete.

% The main attention writing this code
% was turned on creating a good human readable code. So I decided to
% use as much \LaTeXe{} control sequences as possible and as less
% \TeX{} commands as needed. This may slow down the code, but I don't
% think that's really important.
%
% \subsection{The Package}
%
%    \begin{macrocode}
%&lt;*package&gt;
%    \end{macrocode}
%
% First the requirement of \LaTeXe{}\footnote{The version needed was
% taken from |ifthen.sty|, because this package does request it. But I
% don't know if |pdfcprot.sty| may require some newer version because
% of some construct being used. If someone finds something which
% requires a newer version of \LaTeXe{} please tell me.} and the
% declaration of the package.
%    \begin{macrocode}
\NeedsTeXFormat{LaTeX2e}[1994/12/01]
\ProvidesPackage{pdfcprot}[2002/02/27 v1.5 character protruding using pdflatex (cs)]
%    \end{macrocode}
% Then the required packages are loaded. Only |ifthen.sty| and
% |keyval.sty| are needed. These should be part of any decent
% \LaTeXe-distribution |;-&gt;|.
%    \begin{macrocode}
\RequirePackage{ifthen}
\RequirePackage{keyval}
%    \end{macrocode}
% These are the counters to determine for which font character
% protruding will be activate by using |\setupcharprotruding| and
% |\setupcharprotrudingnumeral|. The possible values are listed in
% table~\ref{tab:scpnum}. Further on |CPROT@family|, |CPROT@series|,
% and |CPROT@shape| can be |-1|, which is used for the low level font
% selection by |\setupcharprotruding|. The |...@temp| counters are
% needed when creating |\CPROT@setprotcodes@|.
%    \begin{macrocode}
\newcounter{CPROT@family}
\newcounter{CPROT@family@temp}
\newcounter{CPROT@series}
\newcounter{CPROT@series@temp}
\newcounter{CPROT@shape}
\newcounter{CPROT@shape@temp}
\newcounter{CPROT@size}
\newcounter{CPROT@size@temp}
%    \end{macrocode}
% For determining if the character protruding will be activated for the
% corresponding TS1 encoded font a boolean is used.
%    \begin{macrocode}
\newboolean{CPROT@textcomp}
%    \end{macrocode}
% \begin{option}{quiet}
% For providing the |quiet| option a (global) boolean is used. By
% default it is set to |true|, so there're little warnings (but it
% will be written as info to the logs).
%    \begin{macrocode}
\newboolean{CPROT@quiet}
\setboolean{CPROT@quiet}{true}
%    \end{macrocode}
% \end{option}
% A temporary counter (|\@tempcnta| could be used instead).
%    \begin{macrocode}
\newcounter{CPROT@temp@chars}
%    \end{macrocode}
% \begin{macro}{\CPROT@lowlevel@family}
% \begin{macro}{\CPROT@lowlevel@series}
% \begin{macro}{\CPROT@lowlevel@shape}
% Some ``vars'' are needed to store the low level names if some
% low level font was requested using |\setupcharprotruding|. (These are
% just temporary commands only used while creating the command to do
% the actual adjustment of the character protrusion.)
%    \begin{macrocode}
\newcommand*{\CPROT@lowlevel@family}{}
\newcommand*{\CPROT@lowlevel@series}{}
\newcommand*{\CPROT@lowlevel@shape}{}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \begin{macro}{\CPROT@resetall}
% This is to reset all the counters to zero, so that a new
% |\setupcharprotruding|\dots command won't activate something
% requested with a former command.
%    \begin{macrocode}
\newcommand*{\CPROT@resetall}{%
  \setcounter{CPROT@family}{0}%
  \setcounter{CPROT@series}{0}%
  \setcounter{CPROT@shape}{0}%
  \setcounter{CPROT@size}{0}%
  \setboolean{CPROT@textcomp}{false}%
}
%    \end{macrocode}
% \end{macro}
% \begin{macro}{\CPROT@setprotcodes@}
% \begin{macro}{\CPROT@setprotcodes@add}
% \begin{macro}{\CPROT@setprotcodes@temp}
% These are internal macros regarding the creation of the actual
% command, to adjust the character protruding for the fonts
% wanted. |\CPROT@setprotcodes@| actually will contain the command,
% whereas |\CPROT@setprotcodes@temp| is used to store part of this
% command temporary. |\CPROT@setprotcodes@add| is called by
% |\setupcharprotruding| and |\setupcharprotrudingnumeral|. 
%    \begin{macrocode}
\newcommand*{\CPROT@setprotcodes@}{}
\newcommand*{\CPROT@setprotcodes@add}{%
%    \end{macrocode}
% The counter |CPROT@family@temp| is set, which will be used
% internally to determine which fonts were requested.
%    \begin{macrocode}
  \setcounter{CPROT@family@temp}{\value{CPROT@family}}%
%    \end{macrocode}
% Here the actual evaluation will take place starting with the font
% family.
%    \begin{macrocode}
  \CPROT@aac@family%
}
\newcommand*{\CPROT@setprotcodes@temp}{}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \begin{macro}{\CPROT@packageinfo}
% \begin{macro}{\CPROT@packagewarning}
% \begin{macro}{\CPROT@packageerror}
% These are just substitutes for |\PackageInfo|, |\PackageWarning|,
% and |\PackageError|. It's just to spare some writing (esp. \{ snf \}
% are ``difficult'' to reach on a German keyboard) and it's simplier
% to customise if I would want to do something other than normal.
%    \begin{macrocode}
\newcommand{\CPROT@packageinfo}[1]{%
  \PackageInfo{pdfcprot}{#1}%
  }
\newcommand{\CPROT@packagewarning}[1]{%
  \PackageWarning{pdfcprot}{#1}%
  }
\newcommand{\CPROT@packageerror}[1]{%
  \PackageError{pdfcprot}{#1}%
  }
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \begin{macro}{\CPROT@packageinfo@or@warning}
% To support the Option |quiet| this command is used. It decides on
% the boolean |CPROT@quiet| wether to give out a message as warning or
% as info.
%    \begin{macrocode}
\newcommand{\CPROT@packageinfo@or@warning}[1]{%
  \ifthenelse{\boolean{CPROT@quiet}}{%
    \CPROT@packageinfo{#1}%
    }{%
    \CPROT@packagewarning{#1}%
    }%
  }%
%    \end{macrocode}
% \end{macro}
% \begin{Key}{family}
% \changes{1.2}{2001/10/31}{removed value \texttt{all}; if you want all, you
% should use the numeral interface}
%    \begin{macrocode}
\define@key{CPROT}{family}{%
  \ifthenelse{\equal{#1}{rmfamily}}{%
    \setcounter{CPROT@family}{2}% \rmfamily will be set
    }{%
    \ifthenelse{\equal{#1}{sffamily}}{%
      \setcounter{CPROT@family}{1}% \sffamily will be set
      }{% I assume a low level fontname is given
      \setcounter{CPROT@temp@chars}{0}%
      \expandafter\@tfor\expandafter\@tempb\expandafter:\expandafter=#1\do{%
        \stepcounter{CPROT@temp@chars}%
        }%
      \ifthenelse{\value{CPROT@temp@chars}&gt;4}{%
        \CPROT@packageinfo@or@warning{None of the keywords 'all',\MessageBreak
          'rmfamily' or 'sffamily' was found. I assume you gave a\MessageBreak
          low level font name but it is at least unusual that a\MessageBreak
          TeX-fontname has more than 4 characters. I assume you know\MessageBreak
          what you're doing and continue, but the selection of the\MessageBreak
          font may fail!%
          }%
        \CPROT@packageinfo{It seem's as you want to use a low level\MessageBreak
          command for font selection. -- You're for yourself.%
          }%
        }{}%
      \setcounter{CPROT@family}{-1}%
      \renewcommand*{\CPROT@lowlevel@family}{#1}%
      }%
    }%
  }
%    \end{macrocode}
% \end{Key}
% \begin{Key}{series}
% \changes{1.2}{2001/10/31}{removed value \texttt{all}; if you want all, you
% should use the numeral interface}
%    \begin{macrocode}
\define@key{CPROT}{series}{%
  \ifthenelse{\equal{#1}{mdseries}}{% medium series
    \setcounter{CPROT@series}{2}%
    }{%
    \ifthenelse{\equal{#1}{bfseries}}{% bold series
      \setcounter{CPROT@series}{1}%
      }{% here the low level interface is suspected
      \setcounter{CPROT@temp@chars}{0}%
      \expandafter\@tfor\expandafter\@tempb\expandafter:\expandafter=#1\do{%
        \stepcounter{CPROT@temp@chars}%
        }%
      \ifthenelse{\value{CPROT@temp@chars}&gt;4}{%
        \CPROT@packageinfo@or@warning{None of the keywords 'all',\MessageBreak
          'mdseries' or 'bfseries' was found. I assume you gave a\MessageBreak
          low level font name but a series identifier should consist\MessageBreak
          of 4 characters at maximum. I assume you know what you're\MessageBreak
          doing and continue, but the selection of the font will\MessageBreak
          very likely fail!%
          }%
        \CPROT@packageinfo{It seem's as you seem want to use a low level\MessageBreak
          command for font selection. -- You're for yourself.%
          }%
        }{}%
      \setcounter{CPROT@series}{-1}%
      \renewcommand*{\CPROT@lowlevel@series}{#1}%
      }%
    }%
  }%
%    \end{macrocode}
% \end{Key}
% \begin{Key}{shape}
% \changes{1.2}{2001/10/31}{removed value \texttt{all}; if you want all, you
% should use the numeral interface}
%    \begin{macrocode}
\define@key{CPROT}{shape}{%
  \ifthenelse{\equal{#1}{upshape}}{%
    \setcounter{CPROT@shape}{8}%
    }{%
    \ifthenelse{\equal{#1}{itshape}}{%
      \setcounter{CPROT@shape}{4}%
      }{%
      \ifthenelse{\equal{#1}{slshape}}{%
        \setcounter{CPROT@shape}{2}%
        }{%
        \ifthenelse{\equal{#1}{scshape}}{%
          \setcounter{CPROT@shape}{1}%
          }{% low lewel format
          \setcounter{CPROT@temp@chars}{0}%
          \expandafter\@tfor\expandafter\@tempb\expandafter:\expandafter=#1\do{%
            \stepcounter{CPROT@temp@chars}%
            }%
          \ifthenelse{\value{CPROT@temp@chars}&gt;2}{%
            \CPROT@packageinfo@or@warning{None of the keywords 'all',\MessageBreak
              'upshape', 'itshape', 'slshape' or 'scshape' was\MessageBreak
              found. I assume you gave a low level font name but it\MessageBreak
              is at least unusual that a shape identifier has more\MessageBreak
              than 2 characters. I assume you know what you're doing\MessageBreak
              and continue, but the selection of the font will very\MessageBreak
              likely fail!%
              }%
            \CPROT@packageinfo{It seem's as you seem want to use a low level\MessageBreak
              command for font selection. -- You're for yourself.%
              }%
            }{}%
          \setcounter{CPROT@shape}{-1}%
          \renewcommand{\CPROT@lowlevel@shape}{#1}%
          }%
        }%
      }%
    }%
  }
%    \end{macrocode}
% \end{Key}
% \begin{Key}{size}
% \changes{1.2}{2001/10/31}{removed value \texttt{all}; if you want all, you
% should use the numeral interface}
%    \begin{macrocode}
\define@key{CPROT}{size}{%
  \ifthenelse{\equal{#1}{Huge}}{%
    \setcounter{CPROT@size}{512}%
    }{%
    \ifthenelse{\equal{#1}{huge}}{%
      \setcounter{CPROT@size}{256}%
      }{%
      \ifthenelse{\equal{#1}{LARGE}}{%
        \setcounter{CPROT@size}{128}%
        }{%
        \ifthenelse{\equal{#1}{Large}}{%
          \setcounter{CPROT@size}{64}%
          }{%
          \ifthenelse{\equal{#1}{large}}{%
            \setcounter{CPROT@size}{32}%
            }{%
            \ifthenelse{\equal{#1}{normalsize}}{%
              \setcounter{CPROT@size}{16}%
              }{%
              \ifthenelse{\equal{#1}{small}}{%
                \setcounter{CPROT@size}{8}%
                }{%
                \ifthenelse{\equal{#1}{footnotesize}}{%
                  \setcounter{CPROT@size}{4}%
                  }{%
                  \ifthenelse{\equal{#1}{scriptsize}}{%
                    \setcounter{CPROT@size}{2}%
                    }{%
                    \ifthenelse{\equal{#1}{tiny}}{%
                      \setcounter{CPROT@size}{1}%
                      }{% low lewel format
                      \CPROT@packageerror{%
                        None of the keywords 'all', 'normal' or any LaTeX2e\MessageBreak
                        font name was found. \MessageBreak
                        \space For more information how to use\MessageBreak
                        \string\setupcharprotrudingnumeral see the
                        pdfcprot manual.%
                        }%
                      }{}%
                    }%
                  }%
                }%
              }%
            }%
          }%
        }%
      }%
    }%
  }
%    \end{macrocode}
% \end{Key}
%    \begin{macrocode}
\define@key{CPROT}{textcomp}{%
  \ifthenelse{\equal{#1}{true}\or\equal{#1}{on}\or\equal{#1}{1}\or\equal{#1}{yes}}{%
    \setboolean{CPROT@textcomp}{true}%
    }{%
    \ifthenelse{\equal{#1}{false}\or\equal{#1}{off}\or\equal{#1}{0}\or\equal{#1}{no}}{%
      \setboolean{CPROT@textcomp}{false}%
      }{%
      \CPROT@packageerror{%
        ``#1'' is no setting for ``textcomp''. Use\MessageBreak
        one of 'true', 'on', 'yes', '1', or 'false', 'off', \MessageBreak
        'no', '0' instead.\MessageBreak
        }%
      }%
    }%
  }
\define@key{CPROTnum}{family}{%
  \ifthenelse{#1&gt;0 \and #1&lt;4}{%
    \setcounter{CPROT@family}{#1}%
    }{%
    \ifthenelse{#1=0}{%
      \CPROT@packageinfo{%
        As you selected '0' (that means 'none') for\MessageBreak
        selection of the font family, no font will\MessageBreak
        be set up for char protruding.%
        }%
      }{%
      \CPROT@packageerror{%
        Your given value '#1' to family in \string\setupcharprotrudingnumeral\MessageBreak
        is not valid. Sensible values are between 1 and 3 (inclusive).\MessageBreak
        For further information see the pdfcprot manual.%
        }%
      }%
    }%
  }
\define@key{CPROTnum}{series}{%
  \ifthenelse{#1&gt;0 \and #1&lt;4}{%
    \setcounter{CPROT@series}{#1}%
    }{%
    \ifthenelse{#1=0}{%
      \CPROT@packageinfo{%
        As you selected '0' (that means 'none') for\MessageBreak
        selection of the font series, no font will\MessageBreak
        be set up for char protruding.%
        }%
      }{%
      \CPROT@packageerror{%
        Your given value '#1' to series in \string\setupcharprotrudingnumeral\MessageBreak
        is not valid. Sensible values are between 1 and 15 (inclusive).\MessageBreak
        For further information see the pdfcprot manual.%
        }%
      }%
    }%
  }
\define@key{CPROTnum}{shape}{%
  \ifthenelse{#1&gt;0 \and #1&lt;16}{%
    \setcounter{CPROT@shape}{#1}%
    }{%
    \ifthenelse{#1=0}{%
      \CPROT@packageinfo{%
        As you selected '0' (that means 'none') for\MessageBreak
        selection of the font shape, no font will\MessageBreak
        be set up for char protruding.%
        }%
      }{%
      \CPROT@packageerror{%
        Your given value '#1' to shape in \string\setupcharprotrudingnumeral\MessageBreak
        is not valid. Sensible values are between 1 and 15 (inclusive).\MessageBreak
        For further information see the pdfcprot manual.%
        }%
      }%
    }%
  }
\define@key{CPROTnum}{size}{%
  \ifthenelse{#1&gt;0 \and #1&lt;1024}{%
    \setcounter{CPROT@size}{#1}%
    }{%
    \ifthenelse{#1=0}{%
      \CPROT@packageinfo{%
        As you selected '0' (that means 'none') for\MessageBreak
        selection of the font size, no font will\MessageBreak
        be set up for char protruding.%
        }%
      }{%
      \CPROT@packageerror{%
        Your given value '#1' to size in \string\setupcharprotrudingnumeral\MessageBreak
        is not valid. Sensible values are between 1 and 1023 (inclusive).\MessageBreak
        For further information see the pdfcprot manual.%
        }%
      }%
    }%
  }
\define@key{CPROTnum}{textcomp}[true]{%
  \setkeys{CPROT}{textcomp=#1}%
  }
%    \end{macrocode}
% \begin{option}{activate}
% \changes{1.3}{2001/11/01}{option \texttt{texttype} added}
% \changes{1.5}{2002/02/27}{option \texttt{texttype} removed; didn't
% work and is IMHO not needed -- use the numerical interface if
% you don't want to activate char protruding for TS1 characters (and
% load the package \texttt{textcomp})}
% \changes{1.6}{2002/08/14}{removed last references to old option
% \texttt{texttype} in the documentation}
%    \begin{macrocode}
\define@key{CPROTpackage}{activate}[normal]{%
  \ifthenelse{\equal{#1}{normal}}{%
    \CPROT@setupcharprotruding@normal%
    \ifthenelse{\equal{\CPROT@setprotcodes@}{}}{%
      }{% just activate char prot when something was set
      \activatecharprotruding[true]%
      }%
    }{%
    \ifthenelse{\equal{#1}{none}}{%
      }{%
      \CPROT@packageerror{%
        Value of activate can be 'normal' or 'none'.\MessageBreak%
        \space For more low level setup use \string\setupcharprotruding\MessageBreak%
        and see the manual%
        }%
      }%
    }%
  }%
%    \end{macrocode}
% \end{option}
%    \begin{macrocode}
\define@key{CPROTpackage}{quiet}[true]{%
  \ifthenelse{\equal{#1}{true}\or\equal{#1}{on}\or\equal{#1}{yes}\or\equal{#1}{1}}{%
    \setboolean{CPROT@quiet}{true}%
    }{%
    \ifthenelse{\equal{#1}{false}\or\equal{#1}{off}\or\equal{#1}{no}\or\equal{#1}{0}}{%
      \setboolean{CPROT@quiet}{false}%
      }{%
      \CPROT@packageerror{%
        Value of quiet should be 'true' ('on', 'yes, '1') or\MessageBreak%
        'false' ('off', 'no', '0'). You didn't seem to use any\MessageBreak%
        of them.%
        }%
      }%
    }%
  }%
%    \end{macrocode}
% These are internal fuctions to evaluate the counters used to
% indicate which font variation are to get protruding.
% \changes{1.5}{2002/02/27}{added a some more protection for each font
% selection command (new \KOMAScript{} adds something to
% some of the font size selection commands)}
%    \begin{macrocode}
\newcommand{\CPROT@aac@family}{%
  \ifthenelse{\value{CPROT@family@temp}&gt;1}{%
    \setcounter{CPROT@series@temp}{\value{CPROT@series}}%
    \CPROT@aac@series{\protect\rmfamily}%
    \addtocounter{CPROT@family@temp}{-2}
    \CPROT@aac@family%
    }{%
    \ifthenelse{\value{CPROT@family@temp}&gt;0}{%
       \setcounter{CPROT@series@temp}{\value{CPROT@series}}%
      \CPROT@aac@series{\protect\sffamily}%
      \addtocounter{CPROT@family@temp}{-1}%
      \CPROT@aac@family%
      }{%
      \ifthenelse{\value{CPROT@family@temp}&lt;0}{%
        \protected@edef\CPROT@setprotcodes@temp{\fontfamily{\CPROT@lowlevel@family}\selectfont}%
         \setcounter{CPROT@series@temp}{\value{CPROT@series}}%
        \CPROT@aac@series{\CPROT@setprotcodes@temp}%
        }{}%
      }%
    }%
  }
\newcommand{\CPROT@aac@series}[1]{%
  \ifthenelse{\value{CPROT@series@temp}&gt;1}{%
    \protected@edef\CPROT@setprotcodes@temp{#1\protect\mdseries}%
    \setcounter{CPROT@shape@temp}{\value{CPROT@shape}}%
    \CPROT@aac@shape{\CPROT@setprotcodes@temp}%
    \addtocounter{CPROT@series@temp}{-2}%
    \CPROT@aac@series{#1}%
    }{%
    \ifthenelse{\value{CPROT@series@temp}&gt;0}{%
      \protected@edef\CPROT@setprotcodes@temp{#1\protect\bfseries}%
      \setcounter{CPROT@shape@temp}{\value{CPROT@shape}}%
      \CPROT@aac@shape{\CPROT@setprotcodes@temp}%
      \addtocounter{CPROT@series@temp}{-1}%
      \CPROT@aac@series{#1}%
      }{%
      \ifthenelse{\value{CPROT@series@temp}&lt;0}{%
        \protected@edef\CPROT@setprotcodes@temp{%
          #1\fontseries\expandafter{\CPROT@lowlevel@series}\selectfont}%
        \setcounter{CPROT@shape@temp}{\value{CPROT@shape}}%
        \CPROT@aac@shape{\CPROT@setprotcodes@temp}%
        }{}%
      }%
    }%
  }
\newcommand{\CPROT@aac@shape}[1]{%
  \ifthenelse{\value{CPROT@shape@temp}&gt;7}{%
    \protected@edef\CPROT@setprotcodes@temp{#1\protect\upshape}%
    \setcounter{CPROT@size@temp}{\value{CPROT@size}}%
    \CPROT@aac@size{\CPROT@setprotcodes@temp}%
    \addtocounter{CPROT@shape@temp}{-8}%
    \CPROT@aac@shape{#1}%
    }{%
    \ifthenelse{\value{CPROT@shape@temp}&gt;3}{%
      \protected@edef\CPROT@setprotcodes@temp{#1\protect\itshape}%
      \setcounter{CPROT@size@temp}{\value{CPROT@size}}%
      \CPROT@aac@size{\CPROT@setprotcodes@temp}%
      \addtocounter{CPROT@shape@temp}{-4}%
      \CPROT@aac@shape{#1}%
      }{%
      \ifthenelse{\value{CPROT@shape@temp}&gt;1}{%
        \protected@edef\CPROT@setprotcodes@temp{#1\protect\slshape}%
        \setcounter{CPROT@size@temp}{\value{CPROT@size}}%
        \CPROT@aac@size{\CPROT@setprotcodes@temp}%
        \addtocounter{CPROT@shape@temp}{-2}%
        \CPROT@aac@shape{#1}%
        }{%
        \ifthenelse{\value{CPROT@shape@temp}&gt;0}{%
          \protected@edef\CPROT@setprotcodes@temp{#1\protect\scshape}%
          \setcounter{CPROT@size@temp}{\value{CPROT@size}}%
          \CPROT@aac@size{\CPROT@setprotcodes@temp}%
          \addtocounter{CPROT@shape@temp}{-1}%
          \CPROT@aac@shape{#1}%
          }{%
          \ifthenelse{\value{CPROT@shape@temp}&lt;0}{%
            \protected@edef\CPROT@setprotcodes@temp{%
              #1\fontshape\expandafter{\CPROT@lowlevel@shape}\selectfont}%
            \setcounter{CPROT@size@temp}{\value{CPROT@size}}%
            \CPROT@aac@size{\CPROT@setprotcodes@temp}%
            }{}%
          }%
        }%
      }%
    }%
  }
\newcommand{\CPROT@aac@size}[1]{%
  \ifthenelse{\value{CPROT@size@temp}&gt;511}{%
    \protected@edef\CPROT@setprotcodes@temp{#1\protect\Huge}%
    \CPROT@aac@textcomp{\CPROT@setprotcodes@temp}%
    \addtocounter{CPROT@size@temp}{-512}%
    \CPROT@aac@size{#1}%
    }{%
    \ifthenelse{\value{CPROT@size@temp}&gt;255}{%
      \protected@edef\CPROT@setprotcodes@temp{#1\protect\huge}%
      \CPROT@aac@textcomp{\CPROT@setprotcodes@temp}%
      \addtocounter{CPROT@size@temp}{-256}%
      \CPROT@aac@size{#1}%
      }{%
      \ifthenelse{\value{CPROT@size@temp}&gt;127}{%
        \protected@edef\CPROT@setprotcodes@temp{#1\protect\LARGE}%
        \CPROT@aac@textcomp{\CPROT@setprotcodes@temp}%
        \addtocounter{CPROT@size@temp}{-128}%
        \CPROT@aac@size{#1}%
        }{%
        \ifthenelse{\value{CPROT@size@temp}&gt;63}{%
          \protected@edef\CPROT@setprotcodes@temp{#1\protect\Large}%
          \CPROT@aac@textcomp{\CPROT@setprotcodes@temp}%
          \addtocounter{CPROT@size@temp}{-64}%
          \CPROT@aac@size{#1}%
          }{%
          \ifthenelse{\value{CPROT@size@temp}&gt;31}{%
            \protected@edef\CPROT@setprotcodes@temp{#1\protect\large}%
            \CPROT@aac@textcomp{\CPROT@setprotcodes@temp}%
            \addtocounter{CPROT@size@temp}{-32}%
            \CPROT@aac@size{#1}%
            }{%
            \ifthenelse{\value{CPROT@size@temp}&gt;15}{%
              \protected@edef\CPROT@setprotcodes@temp{#1\protect\normalsize}%
              \CPROT@aac@textcomp{\CPROT@setprotcodes@temp}%
              \addtocounter{CPROT@size@temp}{-16}%
              \CPROT@aac@size{#1}%
              }{%
              \ifthenelse{\value{CPROT@size@temp}&gt;7}{%
                \protected@edef\CPROT@setprotcodes@temp{#1\protect\small}%
                \CPROT@aac@textcomp{\CPROT@setprotcodes@temp}%
                \addtocounter{CPROT@size@temp}{-8}%
                \CPROT@aac@size{#1}%
                }{%
                \ifthenelse{\value{CPROT@size@temp}&gt;3}{%
                  \protected@edef\CPROT@setprotcodes@temp{#1\protect\footnotesize}%
                  \CPROT@aac@textcomp{\CPROT@setprotcodes@temp}%
                  \addtocounter{CPROT@size@temp}{-4}%
                  \CPROT@aac@size{#1}%
                  }{%
                  \ifthenelse{\value{CPROT@size@temp}&gt;1}{%
                    \protected@edef\CPROT@setprotcodes@temp{#1\protect\scriptsize}%
                    \CPROT@aac@textcomp{\CPROT@setprotcodes@temp}%
                    \addtocounter{CPROT@size@temp}{-2}%
                    \CPROT@aac@size{#1}%
                    }{%
                    \ifthenelse{\value{CPROT@size@temp}&gt;0}{%
                      \protected@edef\CPROT@setprotcodes@temp{#1\protect\protect\tiny}%
                      \CPROT@aac@textcomp{\CPROT@setprotcodes@temp}%
                      }{}%
                    }%
                  }%
                }%
              }%
            }%
          }%
        }%
      }%
    }%
  }
\newcommand{\CPROT@aac@textcomp}[1]{%
  \ifthenelse{\boolean{CPROT@textcomp}}{%
    \@ifundefined{T@TS1}{%
      \CPROT@packageinfo@or@warning{%
        You've requested char protruding for TS1 encoding\MessageBreak
        but TS1 encoding doesn't seem to be loaded.\MessageBreak
        Maybe you forgot a '\string\usepackage{textcomp}'.%
        }%
      \setboolean{CPROT@textcomp}{false}%
      }{}%
    }{}%
  \ifthenelse{\boolean{CPROT@textcomp}}{%
    \protected@xdef\CPROT@setprotcodes@{%
      \CPROT@setprotcodes@{%
        #1\protect\CPROT@setprotcodes@font{%
          \fontencoding{TS1}\selectfont\protect\CPROT@setprotcodes@font%
          }%
        }%
      }%
    }{%
    \protected@xdef\CPROT@setprotcodes@{%
      \CPROT@setprotcodes@{%
        #1\protect\CPROT@setprotcodes@font%
        }%
      }%
    }%
  }
%    \end{macrocode}
% \changes{1.6}{2002/08/14}{\texttt{pdfcprot} will not activate the
% character protruding only iff a \texttt{pdftex} version larger 0.14f
% is detected; \emph{nobody} should use older versions for documents
% using character protruding, even 0.14f is
% \emph{really} old right now}
% \begin{macro}{\activatecharprotruding}
%    \begin{macrocode}
\newcommand*{\activatecharprotruding}[1][true]{%
  \ifpdftex{%
    \ifthenelse{\equal{#1}{true}\or\equal{#1}{on}\or\equal{#1}{1}\or\equal{#1}{yes}}{%
      \CPROT@good@pdftex@version{%
        \global\pdfprotrudechars=2%
       } 
      }{%
      \ifthenelse{\equal{#1}{compatibility}\or\equal{#1}{compatible}}{%
        \CPROT@good@pdftex@version{%
          \global\pdfprotrudechars=1%
          }%
        }{%
        \ifthenelse{\equal{#1}{false}\or\equal{#1}{off}\or\equal{#1}{0}\or\equal{#1}{no}}{%
          \global\pdfprotrudechars=0%
          }{%
          \CPROT@packageerror{%
            ``#1'' is no setting for \activatecharprotruding. Use\MessageBreak
            one of 'true', 'on', 'yes', '1', or 'false', 'off', \MessageBreak
            'no', '0', or 'compatible', 'compatibility' instead.%
            }%
          }{%
          \CPROT@packageinfo@or@warning{%
            You want to activate char protruding, but it does\MessageBreak
            look as your are NOT using pdftex. So I can't\MessageBreak
            activate it, as ``pdfcprot.sty'' only supports\MessageBreak
            pdftex.}%
          }%
        }%
      }%
    }{}%
  }
%    \end{macrocode}
% \end{macro}
%    \begin{macrocode}
\newcommand*{\setupcharprotruding}[1]{%
  \ifpdftex{%
    \CPROT@resetall{}%
    \@ifundefined{CPROT@save@KV@errx}{%
      \let\CPROT@save@KV@errx=\KV@errx%
      \renewcommand*{\KV@errx}[1]{%
        \CPROT@packageerror{option ##1 for \string\setupcharprotruding}{%
          You've tried to use the option ##1 with \string\setupcharprotruding.\MessageBreak
          But there is no option with that name.\MessageBreak
          See the manual of ``pdfcprot.sty'' for information 
          about the usage of \string\setupcharprotruding.%
          }%
        }%
      \setkeys{CPROT}{#1}%
      \let\KV@errx=\CPROT@save@KV@errx%
      \let\CPROT@save@KV@errx=\relax%
      }{%
      \setkeys{CPROT}{#1}%
      }%
    \CPROT@setprotcodes@add{}%
    }{%
    \CPROT@packageinfo@or@warning{%
      You want to setup char protruding, but it does\MessageBreak
      look as if you're NOT using pdftex. So I can't\MessageBreak
      setup it, as ``pdfcprot.sty'' only supports\MessageBreak
      pdftex.}%
    }%
  }
\@onlypreamble\setupcharprotruding%
\newcommand*{\setupcharprotrudingnumeral}[1]{%
  \ifpdftex{%
    \CPROT@resetall{}%
    \@ifundefined{CPROT@save@KV@errx}{%
      \let\CPROT@save@KV@errx=\KV@errx%
      \renewcommand*{\KV@errx}[1]{%
        \CPROT@packageerror{option ##1 for \string\setupcharprotrudingnumeral}{%
          You've tried to use the option ##1 with \string\setupcharprotrudingnumeral.\MessageBreak
          But there is no option with that name.\MessageBreak
          See the manual of ``pdfcprot.sty'' for information 
          about the usage of \string\setupcharprotrudingnumeral.%
          }%
        }%
      \setkeys{CPROTnum}{#1}%
      \let\KV@errx=\CPROT@save@KV@errx%
      \let\CPROT@save@KV@errx=\relax%
      }{%
      \setkeys{CPROTnum}{#1}%
      }%
    \CPROT@setprotcodes@add{}%
    }{%
    \CPROT@packageinfo@or@warning{%
      You want to setup char protruding, but it does\MessageBreak
      look as if you're NOT using pdftex. So I can't\MessageBreak
      setup it, as ``pdfcprot.sty'' only supports\MessageBreak
      pdftex.}%
    }%
  }
\@onlypreamble\setupcharprotrudingnumeral

\newcommand{\ifpdftex}[2]{%
  \ifx\pdftexversion\undefined#2\else#1\fi%
  }
%    \end{macrocode}
% \begin{macro}{\CPROT@good@pdftex@version}
% \changes{1.6}{2002/08/14}{added a macro to do something iff a
% ``good'' version of \texttt{pdftex} is used}
%    \begin{macrocode}
\newcommand{\CPROT@packageerror@bad@pdftex}{%
  \CPROT@packageerror{You used a pdftex version older than 0.14f.\MessageBreak
    pdfcprot does not support such old versions of pdftex. \MessageBreak
    Please install a new version of pdftex.}%
}
\newcommand{\CPROT@good@pdftex@version}[1]{%
  \ifnum\pdftexversion &lt; 14
    \CPROT@packageerror@bad@pdftex %
  \else
    \ifnum\pdftexversion = 14
      \ifnum \expandafter`\pdftexrevision &lt; `f
        \CPROT@packageerror@bad@pdftex %
      \else
        #1
      \fi
    \else
      #1
    \fi
  \fi
}
%    \end{macrocode}
% \end{macro}
% \begin{macro}{\ifpdfoutput}
% \changes{1.4a}{2001/11/13}{changed to new definition in
% \KOMAScript{} version 2.8q (2001/11/13)}
% This was taken from KOMA-Script and is provided for convenience.
%    \begin{macrocode}
\newcommand{\CPROT@ifpdfoutput}[2]{%
  \begingroup\@ifundefined{pdfoutput}{\endgroup #2}{\endgroup%
    \ifnum\pdfoutput&gt;0\relax #1\else #2\fi}}%
\@ifundefined{ifpdfoutput}{\let\ifpdfoutput\CPROT@ifpdfoutput}{%
  \CPROT@packageinfo{%
    \string\ifpdfoutput\space already defined.\MessageBreak
    That may happen when using KOMA-Script together\MessageBreak
    with ``pdfcprot.sty''. I have taken the definition\MessageBreak
    from Markus' KOMA-Script, so it should do the thing\MessageBreak
    you expect. For more see the manual.}%
  }
%    \end{macrocode}
% \end{macro}
%    \begin{macrocode}
\newcommand*{\CPROT@packageoptions}[1]{%
  \@ifundefined{CPROT@save@KV@errx}{%
    \let\CPROT@save@KV@errx=\KV@errx%
    \renewcommand*{\KV@errx}[1]{%
      \PackageError{pdfcprot}{unknown option ``#1''}{%
        You've tried to use the option ``#1''.\MessageBreak
        But there is no option with that name.\MessageBreak
        See the manual of ``pdfcprot.sty'' for information 
        about known options.%
        }%
      }%
    \setkeys{CPROTpackage}{#1}%
    \let\KV@errx=\CPROT@save@KV@errx%
    \let\CPROT@save@KV@errx=\relax%
    }{%
    \setkeys{CPROTpackage}{#1}%
    }%
  }
\DeclareOption{DVIoutput}{%
  \ifpdftex{%
    \pdfoutput=0%
    \let\pdfoutput\undefined%
    }{}%
  }
%    \end{macrocode}
% Define a standard command for undefined options. Actually this is
% just a redirection to a |\setkeys| command.
% \changes{1.5}{2002/02/27}{Just execute the options if \texttt{pdftex} is
% really used}
%    \begin{macrocode}
\DeclareOption*{%
  \ifpdftex{%
    \expandafter\CPROT@packageoptions\expandafter{\CurrentOption}%
    }{}%
  }%
%    \end{macrocode}
% \begin{macro}{\CPROI@fallbackfont}
% \begin{macro}{\setfallbackfont}
% \changes{1.5}{2001/11/16}{changed place of definition; now the
% ``configuration'' commands are all together}
% The internal command |\CPROT@fallbackfont| stores the font to be
% looked for, if no |CPA| is found for the actual font. By default
% it's Palatino. With |\setfallbackfont| it is possible to customise
% this, if required.
%    \begin{macrocode}
\newcommand*{\CPROT@fallbackfont}{pplmn}
\newcommand*{\setfallbackfont}[1]{\renewcommand*{\CPROT@fallbackfont}{#1}}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \begin{macro}{\CPROT@setupcharprotruding@normal}
% \changes{1.5}{2001/11/16}{changed place of definition; now the
% ``configuration'' commands are all together}
% When the package is loaded with option |activate| or
% |activate=normal| this command does the actual adjustment and by
% that defines which fonts will get character protruding with that options.
%    \begin{macrocode}
\newcommand*{\CPROT@setupcharprotruding@normal}{%
  \setupcharprotrudingnumeral{family=3,series=1,shape=8,size=60,textcomp=1}%
  \setupcharprotrudingnumeral{family=2,series=2,shape=12,size=60,textcomp=1}%
  \setupcharprotrudingnumeral{family=1,series=2,shape=14,size=60,textcomp=1}%
  }
%    \end{macrocode}
% \end{macro}
% \begin{option}{pdftex.cfg}
% \changes{1.4}{2001/11/07}{added loading of pdftex.cfg.}
%    \begin{macrocode}
\InputIfFileExists{pdfcprot.cfg}
           {\typeout{***************************************^^J%
                     * Local config file pdfcrpot.cfg used *^^J%
                     ***************************************}}
           {}
%    \end{macrocode}
% \end{option}
%    \begin{macrocode}
\ProcessOptions\relax
\newcommand*{\CPROT@actualfont}{%
  \f@family%
  \f@series%
  \f@shape%
  \f@encoding%
  }
\@onlypreamble\setfallbackfont%
\newcommand*{\CPROT@cpa@toload}{}
%    \end{macrocode}
% \begin{macro}{\CPROT@setprotcodes@font}
% This command you've seen before in the definition of
% |\CPROT@setprotcodes@|. There it was protected so it won't be expanded
% to early. That was important, to test for the correct font.
%    \begin{macrocode}
\newcommand*{\CPROT@setprotcodes@font}{%
  \renewcommand*{\CPROT@cpa@toload}{\CPROT@actualfont.cpa}%
  \IfFileExists{\CPROT@cpa@toload}{%
%    \end{macrocode}
% \changes{1.1}{2001/10/30}{Former version used a general command
% beeing redefined any time directly from the \texttt{CPA}. Now the \texttt{CPA}
% defines a new command we can test for, so it will be loaded just
% once.}
% Former version used a general command
% beeing redefined any time directly from the |CPA|. Now the |CPA|
% defines a new command we can test for, so it will be loaded just
% once. The same code is found in the part for the fallback
% font. Using this code some time will be spared (I hope).
%    \begin{macrocode}
    \expandafter\@ifundefined\expandafter{\CPROT@actualfont}{%
      \input{\CPROT@cpa@toload}
      }{}
%    \end{macrocode}
% As the fontencoding names contain numbers |\csname| and |\endcsname|
% must be used to call the actual command to setup character
% protruding. After that a adjustment may be needed.
%    \begin{macrocode}
    \csname\CPROT@actualfont\endcsname%
    \CPROT@adjustprotcodes{\font}%
    \CPROT@packageinfo{%
      File \CPROT@cpa@toload{} for the adjustment of\MessageBreak
      the char protruding used. It seems to be _fit_\MessageBreak
      to the font you requested.%
      }%
    }{%
    \CPROT@packageinfo@or@warning{%
      I didn't find \CPROT@cpa@toload.\MessageBreak%
      \space As a fallback I will try \CPROT@fallbackfont\f@encoding.cpa.%
      }%
    \renewcommand*{\CPROT@cpa@toload}{\CPROT@fallbackfont\f@encoding.cpa}%
    \IfFileExists{\CPROT@cpa@toload}{%
      \expandafter\@ifundefined\expandafter{\CPROT@fallbackfont\f@encoding}{%
        \input{\CPROT@cpa@toload}%
        }{}%
      \csname\CPROT@fallbackfont\f@encoding\endcsname%
      \CPROT@adjustprotcodes{\font}%
      \CPROT@packageinfo{%
        File \CPROT@cpa@toload{} used for the adjustment\MessageBreak
        of the char protruding. It seems that it isn't the one\MessageBreak
        you intended to use.%
        }%
      }{%
      \CPROT@packageinfo@or@warning{%
        Even the fallback font was not found. Maybe it's\MessageBreak
        not the right font encoding. Currently ``pdfcprot''\MessageBreak
        bundles only with cpa's for T1, OT1 and TS1 encoding.%
        }%
      }%
    }%
  }
%    \end{macrocode}
% \end{macro}
%    \begin{macrocode}
\newif\ifCPROT@adjustprotcodes@
\newcommand*{\CPROT@adjustprotcodes}[1]{%
  \CPROT@adjustprotcodes@false
  \ifnum\pdftexversion &gt; 14
    \CPROT@adjustprotcodes@true 
  \else
    \ifnum\pdftexversion = 14
      \ifnum \expandafter`\pdftexrevision &gt; `g
        \CPROT@adjustprotcodes@true
      \fi
    \fi
  \fi
  \ifCPROT@adjustprotcodes@
    \@tempcnta=0
    \loop
      \ifcase\lpcode#1\@tempcnta\else
        \CPROT@adjustprotcodes@@\lpcode{#1}\@tempcnta 
      \fi
      \ifcase\rpcode#1\@tempcnta\else  
        \CPROT@adjustprotcodes@@\rpcode{#1}\@tempcnta 
      \fi
      \advance\@tempcnta 1
    \ifnum\@tempcnta &lt; 256 \repeat
   \fi
  }
\def\CPROT@adjustprotcodes@@#1#2#3{%
  \setbox0=\hbox{\the#2\char#3}%
%  \setbox0=\hbox{%
%    \ifx#2\font\else#2\fi%
%    \char#3}%
  \@tempcntb=\wd0%
  \multiply\@tempcntb #1#2#3%
  \divide\@tempcntb \fontdimen6 #2%
  #1#2#3=\@tempcntb%
  }

\newcommand*{\CPROT@setprotcodes}{%
  \ifpdftex{%
    \ifthenelse{\equal{\CPROT@setprotcodes@}{}}{%
      }{%
      \CPROT@setprotcodes@%
      }%
    }{}%
  }

\AtBeginDocument{%
  \CPROT@setprotcodes\relax%
  }
%&lt;/package&gt;
%    \end{macrocode}
% \subsection{The Provided \texttt{.CPA} Files}
% \subsubsection{Palatino}
% \begin{macro}{\pplmnT1}
% \changes{1.1}{2001/30/10}{\texttt{\protect\string\string\pplmnT1} was added. Before a general
% setup code has been used and defined anytime new loading the
% \texttt{CPA}. In the \texttt{CPA}'s were only the
% \texttt{\protect\string\string\rpcode} and
% \texttt{\protect\string\string\lpcode} commands stated.}
%    \begin{macrocode}
%&lt;*pplmnT1&gt;
\expandafter\gdef\csname pplmnT1\endcsname{%
  \lpcode\font 16=500  % ``
  \rpcode\font 17=500  % ''
  \rpcode\font 21=300 % --
  \rpcode\font 22=200 % ---
  % german quotation marks
  \lpcode\font\quotedblbase=600
  \rpcode\font\textquotedblleft=500
  % set the protrusion of ",","-" and "." a bit smaller
  % than originally suggested by Han The Than
  \rpcode\font`\,=650
  \rpcode\font`\-=650
  \rpcode\font`\.=650
  % originial Setting from Han The Thans protcode.tex
  \rpcode\font`\!=200
  \rpcode\font`\;=500
  \rpcode\font`\:=500
  \rpcode\font`\?=200
  \lpcode\font`\`=700
  \rpcode\font`\'=700
  \rpcode\font`\)=50
  \rpcode\font`\A=\rpcode\font`\A
  \rpcode\font 196=50 % A umlaut
  \rpcode\font`\F=50
  \rpcode\font`\K=50
  \rpcode\font`\L=50
  \rpcode\font`\T=50
  \rpcode\font`\V=50
  \rpcode\font`\W=50
  \rpcode\font`\X=50
  \rpcode\font`\Y=50
  \rpcode\font`\k=50
  \rpcode\font`\r=50
  \rpcode\font`\t=50
  \rpcode\font`\v=50
  \rpcode\font`\w=50
  \rpcode\font`\x=50
  \rpcode\font`\y=50
  \lpcode\font`\(=50
  \lpcode\font`\A=50
  \lpcode\font 196=\lpcode\font`\A % A umlaut
  \lpcode\font`\J=50
  \lpcode\font`\T=50
  \lpcode\font`\V=50
  \lpcode\font`\W=50
  \lpcode\font`\X=50
  \lpcode\font`\Y=50
  \lpcode\font`\v=50
  \lpcode\font`\w=50
  \lpcode\font`\x=50
  \lpcode\font`\y=50
}%
%&lt;/pplmnT1&gt;
%    \end{macrocode}
% \end{macro}
%    \begin{macrocode}
%&lt;*pplmnTS1&gt;
\expandafter\gdef\csname pplmnTS1\endcsname{%
\rpcode\font 176=600 % \textdegree
}
%&lt;/pplmnTS1&gt;
%    \end{macrocode}
%    \begin{macrocode}
%&lt;*pplmnOT1&gt;
\expandafter\gdef\csname pplmnOT1\endcsname{%
    % just the original protcode.tex code
    \rpcode\font`\!=200
    \rpcode\font`\,=700
    \rpcode\font`\-=700
    \rpcode\font`\.=700
    \rpcode\font`\;=500
    \rpcode\font`\:=500
    \rpcode\font`\?=200
    \lpcode\font`\`=700
    \rpcode\font`\'=700
    \lpcode\font 92=500  % ``
    \rpcode\font 34=500  % ''
    \rpcode\font 123=300 % --
    \rpcode\font 124=200 % ---
    \rpcode\font`\)=50
    \rpcode\font`\A=50
    \rpcode\font`\F=50
    \rpcode\font`\K=50
    \rpcode\font`\L=50
    \rpcode\font`\T=50
    \rpcode\font`\V=50
    \rpcode\font`\W=50
    \rpcode\font`\X=50
    \rpcode\font`\Y=50
    \rpcode\font`\k=50
    \rpcode\font`\r=50
    \rpcode\font`\t=50
    \rpcode\font`\v=50
    \rpcode\font`\w=50
    \rpcode\font`\x=50
    \rpcode\font`\y=50
    \lpcode\font`\(=50
    \lpcode\font`\A=50
    \lpcode\font`\J=50
    \lpcode\font`\T=50
    \lpcode\font`\V=50
    \lpcode\font`\W=50
    \lpcode\font`\X=50
    \lpcode\font`\Y=50
    \lpcode\font`\v=50
    \lpcode\font`\w=50
    \lpcode\font`\x=50
    \lpcode\font`\y=50
}%
\endinput
%&lt;/pplmnOT1&gt;
%    \end{macrocode}
% \makeatletter \c@IndexColumns=2\makeatother
% \PrintIndex
% \PrintChanges
% \Finale
\endinput
%%% Local Variables: 
%%% mode: latex
%%% TeX-master: t
%%% End: % LocalWords:  pdftex kerning Carsten
</pre></body></html>