% \iffalse %<*(package|oml|oms|ot1|t1|u)> \def\unifileversion{v2.1} \def\unifiledate{2019/08/26} % % \fi % \iffalse %<*driver> \documentclass{ltxdoc} \usepackage{unidoc,latexsym} \OnlyDescription %For short description of font and package. % \AlsoImplementation %For full description of font and package. \title{The \universal{} Font\\ \normalsize{Version \unifileversion}} \author{Christian Holm\thanks{E--mail: \texttt{}}} \date{\unifiledate} \begin{document} \maketitle \begin{abstract} This is my implementation of Herbert Bayer's ``universal'' font in \MF{} for \TeX{} and \LaTeX{}. Extensive support for \LaTeX{} is supplied. This font is in no way intended to be a correct, not to mention a comlpete implementation of Herbert Bayer's original design. This document describes how to use the font with \LaTeX{}, and also the source code for the characters of the font. \end{abstract} \tableofcontents \DocInput{universa.dtx} \appendix \section{Solution to the \Lcs{bauhausforms} problem} \label{app:solu} \subsection{The Problem} This I owe to Joseph Collins \texttt{}. During the preperation of version~1.0 of this font, I was loosing sleep over what I chose to call `The \Lcs{bauhausforms} problem', after the problems the symbol \textuni{\bauforms} gave me. As can be seen from the symbol, the idea is to make a figure out of a circle, a square, and a triangle. From these three figures you can ofcourse make infinitly many figures, even though the sizes are limited. The particular combination of the three figures I was looking, first seemed simple\footnote{And after having seen Mr.\ Collins solution, it did again.}, but turned out to be difficult. What I wanted to do was (see also figure~\ref{fig:bauforms}): \begin{quote} Take a circle of some radius (e.g., 1). Inside this circle draw a isosceles triangle $\bigtriangleup ABC$, with all vertices on the circle, The singular vertice $A$ placed on the horizontal line traveling left from the center of the circle. Now draw a square $\Box PQRS$ inside of the circle, having two vertices on the circle, and two on the triangle. The wanted triangle and square are such that, the opposing side of the singular vertice $|BC|$ should divede the square into to equal oblongs, i.e., intersect $|PQ|$ midway between $P$ and $Q$. \end{quote} \begin{figure}[htbp] \centering \beginillu \setlength{\unitlength}{.05\textwidth} \begin{picture}(10,10) \thinlines \put(-1,5){\line(1,0){12}} \put(5,-1){\line(0,1){12}} \thicklines \put(5,5){\circle{10}} \put(0,5){\line(100,74){6.521}} \put(0,5){\line(100,-74){6.521}} \put(6.4330,0.2097){\line(0,1){9.5805}} \put(3.6873,7.7457){\line(1,0){5.4914}} \put(3.6873,2.2543){\line(1,0){5.4914}} \put(3.6873,2.2543){\line(0,1){5.4914}} \put(9.1787,2.2543){\line(0,1){5.4914}} \put(0,5){\mbox{$A$}} \put(6.4330,0.2097){\mbox{$B$}} \put(6.4330,5){\mbox{$B^\prime$}} \put(6.4330,9.7903){\mbox{$C$}} \put(3.6873,2.2543){\mbox{$P$}} \put(3.6873,5){\mbox{$P^\prime$}} \put(9.1787,2.2543){\mbox{$Q$}} \put(9.1787,5){\mbox{$Q^\prime$}} \put(9.1787,7.7457){\mbox{$R$}} \put(3.6873,7.7457){\mbox{$S$}} \put(5,5){\mbox{$O$}} \put(0,5){\arc{1}{0}{0.6401}} \put(0,4.5){\mbox{$\varphi$}} \end{picture} \illuother \begin{tabular}{% @{\vline\extracolsep{1em}\space}% p{.8\textwidth}% @{\space\vline}} \hline Since you are processing this document without the \textsf{eepic} package, you will not see the illustration otherwise here. To compensate, I will give you a short description on how to draw the figure yourself. Take out some paper, a pencil, compasses, and a ruler. Now draw a circle of some radius $r$, with its center in origo of a Cartisean coordinate system. In the next subsection, you will find the coordinates for points $A,B,C,O,P,Q,R,$ and $S$ expressed in terms of $x,y,$ and $h$. You will also find the correct values for $x,y,h$ in that section. Multiply those values with $r$, and plot the points above in the coordinate system. Draw the triangle $\bigtriangleup ABC$, and the square $\Box PQRS$, and --- voila, you have the illustration.\\ \hline \end{tabular} \endillu \caption{The \Lcs{bauforms} problem.}\label{fig:bauforms} \end{figure} This shouldn't be to difficult, should it. Well I didn't think so, but after many late evenings with pen, paper, ruler, compasses, and heavy use of trigonometric relations, I found out that the half $\varphi$ of the singular vertice should obey: \begin{eqnarray} 0 &=& \sin \left( \cos^{-1} \left( \frac{\cos2\varphi}{\sqrt{2}} \right) \right) - \frac{\cos2\varphi}{\sqrt{2}}\nonumber\\ & & - 2\sqrt{2} \frac{\cos\varphi^2\sin\varphi}{\cos\varphi+\sin\varphi} \nonumber \end{eqnarray} Now I dare you to find the exact solution to that. Using numerical methodes (Newton's method), was ofcourse no problem, and gave satesfactory resualt. If the expression on the right above is labelled $f$, $f^\prime$ is: \begin{eqnarray} f^\prime &=& \frac{\sin4\varphi}{2\sqrt{\frac{3-\cos4\varphi}{4}}} + \sqrt{2}\sin2\varphi\nonumber\\ & & - \frac{2\sqrt{2}\cos\varphi}{\cos\varphi+\sin\varphi^2} \left( \left( \cos\varphi+\sin\varphi \right) \left( \cos^2\varphi-2\sin^22\varphi \right)\right. \nonumber\\ & & - \quad \left.\left( \cos\varphi-\sin\varphi \right) \cos^2\varphi\sin\varphi \right) \nonumber \end{eqnarray} Using these expressions for $f$ and $f^\prime$ in a \textsf{Fortran} program, I reached resaults close to what Mr.\ Collins found. \subsection{Joseph Collins' Solution} In Mr.\ Collins notation, the points on figure~\ref{fig:bauforms} has the following coordinates: \begin{eqnarray*} A = (0,-1) & B^\prime = (x,0) & C = (x,y)\\ O = (0,0) & P^\prime = (x-h,0) & Q^\prime = (x+h,0)\\ R = (x+h,h) & S = (x-h,h) & \\ \end{eqnarray*} Below is what Mr.\ Collins wrote me --- thank you very much. On the unit circle \begin{equation}\label{eq:uc} x^2 + y^2 = 1 \end{equation} we have the vertices of a triangle at $(-1,0)$, $(x,y)$, and $(x,-y)$. A square has four vertices $(x \pm h, \pm h)$, where the two points $(x-h, \pm h)$ lie on the triangle (constraint A) and the two points $(x+h, \pm h)$ lie on the circle (constraint B). Thus, the vertical side of the triangle bisects the square. From constraint A, upon consideration of similar triangles, we have $$\frac{y}{1+x} = \frac{h}{1+x-h}, \quad \mbox{so that}\quad h = \frac{(1+x) y }{1+x+y}.$$ By (\ref{eq:uc}), this is \begin{equation} \label{eq:b1} h = \frac{(1+x)\sqrt{1-x^2}}{1+x+\sqrt{1-x^2}} . \end{equation} From constraint B, we get \begin{equation} \label{eq:b2} (x+h)^2 + h^2 = 1 . \end{equation} Any simultaneous solution of (\ref{eq:b1}) and (\ref{eq:b2}) is also a solution of \begin{equation}\label{eq:eqn} 8x^3 - 4x^2 - 3x + 1 = 0, \end{equation} the relevant solution being \begin{equation} \label{eq:sol} x = \frac16 + \sqrt{\frac{11}{18}} \sin \left[ \frac{\pi}{6} - \frac13 \arctan\left(\frac{3\sqrt{237}}{23}\right) \right]. \end{equation} Equation (\ref{eq:eqn}) and solution (\ref{eq:sol}) courtesy of Mathematica. We get $y$ and $h$ from (\ref{eq:uc}) and (\ref{eq:b1}), respectively. The angle at $(-1,0)$ is $\varphi = 2 \arctan\bigl(y/(1+x)\bigr)$. Approximate values are \begin{eqnarray*} x &\simeq& 0.2865914\\ y &\simeq& 0.9580529\\ h &\simeq& 0.5491394 \\ \varphi &\simeq& 1.280129 \ ( \simeq 73.346^o) \end{eqnarray*} \section{Copyrights --- GNU General Public Lisence} \label{app:ggpl} This \MF{} implementation of the ``universal'' font and the \LaTeX{} support package ``uni'' copyright \copyright{} 1998 Christian Holm. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but \textsc{without any warranty}; without even the implied warranty of \textsc{merchantability} or \textsc{fitness for a particular purpose}. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to \begin{quote} The Free Software Foundation, Inc.\\ 675 Mass Ave\\ Cambridge\\ MA 02139\\ USA \end{quote} See the file \texttt{copyright} in the distribution for the complete GNU General Public License. \section{Wishlist} Below is a list of things I would like to do with the font and package. If anyone has any suggestions, ready--made code, or new ideas, please let me know. If you would like to take on one or more of the tasks presented below, please do so, but send me a note so that I may coordinate with my own efforts, and perhaps have a constructive dicourse. I should however instruct you to read the \emph{complete} documentation of the package and font, since this may give some reasons why I have chosen a particular approach. \begin{itemize} \item Make the font an 8--bit encoded (256 characters) font, conforming somewhat to the \texttt{T1} encoding of the Cork fonts. \item Making a package (perhaps \textsf{mfdoc}), to make documentation of \MF{} sources, just like \textsf{doc} is fore \LaTeX{} sources. This is ofcourse a independent project, and I will proberly not work on it. \end{itemize} \clearpage \section{Font Charts} \label{app:charts} Below are some charts of the \universal{} font in different series and shapes (medium upright, slanted, small-caps, and strict, as well as bold upright, slanted, small caps, and strict), all in size \texttt{8pt}. \FontChart{fulmr8.mf}{medium, upright} \FontChart{fulmo8.mf}{medium, oblique} \FontChart{fulmc8.mf}{medium, small-caps} \FontChart{fulmst8.mf}{medium, strict} \FontChart{fulbr8.mf}{bold, upright} \FontChart{fulbo8.mf}{bold, oblique} \FontChart{fulbc8.mf}{bold, small-caps} \FontChart{fulbst8.mf}{bold, strict} \clearpage \end{document} % %<*copyright> GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 675 Mass Ave, Cambridge, MA 02139, USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) 19yy This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) 19yy name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. % %\fi % \def\fileversion{v2.1} % \def\filedate{2019/08/26} % \section{Introduction} % \changes{v1.0}{1997/17/24}{Creation of the \universal{} font} % % This package contains the \MF{} source and driver files for the % ``universal'' font, designed by Herbert Bayer, a teacher at the % Bauhaus school in Weimar\index{Bayer, Herbert}, plus a \LaTeX{} % package to utilize this font, along with a number of font definition % files, as required by the New Font Selection Scheme (\NFSS{}). % % \subsubsection*{About the Documantation} % % The full documentation of this font is rather large, more then 80 % pages actually. Most of it is the programs for the characters for % this font, so if you don't know the \MF{} language, or don't care % how the charcters are created, you should insert % \Lcs{OnlyDescription} into the preamble of \texttt{universa.dtx}. % % Notice, that \MF{} macros are \emph{not} indexed in this % documentation. This is because it would take a \emph{major} rewrite % of the \textsf{doc} package to do so, and I really didn't want to do % that. % % Some of the macros of \textsf{doc} \emph{has} been redefined, and if % you want to see which, or how I generally did the documentation, % please refer to appendix~\ref{app:unidoc}. % % If you in some way are unsatisfied with some of the characters of % the font, do please read the documentation of that character. There % may be some notes on why the character looks the way it does. Some % of the comments, however are a bit silly and should be skipped at % high speed (pretend there is a conditional that says \texttt{if not % silly ... fi}). % % \subsubsection*{This Version} % \changes{v2.0}{98/08/01}{Bug corrections, new font % shapes, better font programs, new/improved macros for \LaTeX{} % support, better conformation to \NFSS{}, using \textsf{fontname} % filenaming scheme, etc.} % % This new version of the \universal{} font, provides a number % of new features and improvements, both to the font itself and to the % \LaTeX{} support macros. Also, a number of corrections has been made % to the font programs. % % The reason why I jumped one whole version number from 1.0 to 2.0, is % that I have taken a whole new approach to the font programs and % shapes of the \universal{} font, plus I decided to put some % more effort into the \LaTeX{} support. % % \subsubsection*{Thanks and Other Stuff} % % To those of you who have had the (mixed) pleasure of using version % 1.0 of this font, one of the most notaticable changes are to the % symbol \textuni{\bauforms}. In the old documenation, I complained % that I couldn't find the exact solution to the problem this symbol % possed. I also encourged people to send me any solution they may % have had --- and guess what --- somebody did! Therefore I would like % to thanck Joseph Collins for providing me with the solution. If you % like Joseph Collins and I like Mathematical puzzles take a look in % Appendix~\ref{app:solu} to learn more about this problem and it's % solution. % % I also direct your attention to Appendix~\ref{app:ggpl} for the % copyright notice on the \universal{} package (it's the % \textsl{Gnu General Public Lisence} to those of you who know it). % % If you in any way have gotten tempted to design your own font, or to % implement some font into \MF{}, I feel obligated to bring you a % warning, taken from the \MF{}book by Donald E.\ Knuth: % \begin{quote} % \uni % \textsc{Warning:} Type design can be hazardous to your other % interests. Once you get hooked, you will develop intense feelings % about letterforms; the medium will intrude the message that you % read. And you will perpetually be thincking of improvements to the % fonts that you see everywhere, especially those of your own % design. % \end{quote} % % \section{The Font and it's History} % % \subsubsection*{Bauhaus} % The Bauhaus school in germany originally located at Dessau, was a % school for any kind of design, ranging from potery to furniture, % from painting to --- what was considered the prime form of design % --- architecture. Many famous designers came from, or taught at % Bauhaus, for example Mies van der Rhoe\index{Rhoe, Mies van der}, % Herbert Bayer\index{Bayer, Herbert}, Kandinsky\index{Kandinsky}, % Walter Gropius\index{Gropius, Walter} and Gerrit % Rietveld\index{Rietveld, Gerrit}. The style ``die stiil'' % \index{die stiil} was explored here, and painters like % Mondrian\index{Mondrian} made large contributions to what today is % known as % ``the Bauhaus style''\index{Bauhaus style=\textuni{Bauhaus style}}. % % The basic idea of the Bauhaus school, was to design items, which % along with it's aesthethic value, also had a high degree of % functionallity. Houses were meant to be suited for all kinds of % living, while still keeping the beauty that make people glad to see % thier house. Chairs should be comfortable for thier use, as well be % able to fit--in in a normal house. All this should be done at a % price that made it possible for everybody to own % designer--furniture, houses, etc. % % The political idea of Bauhaus, was that of a socialist one. Houses % are for the people --- they have to live in them, and that living % should be a good as possible. Therefore the Bauhaus school saw it % has its task to provide functional, beautiful everyday items that % anybody could affort. Paintings and tapestery shouldn't hang on % museums or art galleries, but in peoples homes, where they would % inrich thier everyday life. % % \subsubsection*{Herbert Bayer and the ``universal'' Font} % % At Bauhaus typography was also studied, not just how written text % should be typeset, and how printed characters should look like, but % also what the essence of writting is, in it's pratical and % design--wise sense. This led Herbert Bayer\index{Bayer, Herbert} to % formulate some principles of writting: % % \begin{quote} % {\uni experiment with simplified way of writing: % \begin{enumerate} % \item this way of writing is recommended by all typographic % designers as the future way of writing. % \item by writing in minuscules our writing looses nothing, % but is easier to read, considerably more economical. % \item why must you for one sound have two tokens, e.g.\ % A and a? why two alphabets for one word, why this double % set of signs, when the half is enough. % \end{enumerate} % \begin{flushright} % herbert bayer 1925 % \end{flushright}} % \end{quote} % % On this principles, Herbert Bayer designed a font, which should have % no majuscles (upper case letters), easy to print, and easy to read % since it didn't have any unusefull decoration, but communicated the % bare meaning of characters through the simplest forms needed to % reconigise a character. This font he called ``universal''. % % This font contained abolutly no majuscles, since Bayer believed them % to be superflous, as it is clear form the quote above. % % At the time Herbert Bayer formulated these principles and designed % the ``universal'' font, most printers used Gothic letters, which is % allmost overly decorated, so his font ofcourse made % contraversy. % % Later on, in the 1930'ies, the Bauhaus school drew the % attention of \emph{Gestapo}\footnote{Gehemligche Stats Polizi} of % Nazi\footnote{Nationalsocializmus} Germany. The school was finally % closed in 1936 by Gestapo, because they believed they were promoters % of Jewish and Communist culture and propaganda. % % In the aftermatch of the closing of the school, most of it's ideas % were shundend by other designers, and the Bauhaus way of thinking % died out. This is properly the reason why Herbert Bayers % ``universal'' font is so little known today. % % However, the ``universal'' font still stands as one of the most % compelling developments in font designing. It represents an approach % to designing where the functionallity is as vital as the expression, % and as such I believ it to be one of the most important fonts in the % world today. % % \section{This \MF{} Implementation} % % This implementation of Herbert Bayers ``universal'' font, is not % supposed to look \emph{exactly} like the original design. Ofcourse I % have tried to the best of my ability to mimic his design as far as I % could. However, it is not an easy matter to find a complete, not to % mention exact, sample or account of Bayers design. % % This implementation is bassed on the samples I \emph{could} find, % and other implementations of the ``universal'' font. Many of these % other implementations do differ from the original samples, and % include characters I couldn't find in any of the original. So % whenever I found disparities, I mainly leened on the original % samples and my understanding of the original design. % % \subsection{The \MF{} version versus the Original} % % As mentioned above, Bayer never did design any majuscles for this % font, but nonetheless, I have included them into this % implementation. This I did, because I think most people will have a % hard time writting in minuscles (lowercase letters) alone. Ofcorse, % if you agree with Bayer, you should simple not use them. % % There are also some other differences, mostly due to the fact, that % I never found a complete sample of the original font. The major % differences between the originalk font and this implementation is % summerized below: % % \begin{description} % \item[Majuscles:] Majuscles are present, even though they weren't % in the original design. % \item[Digigts:] These are based on other implementations, and my % general conception of the original design. % \item[Punctuations:] As above. % \item[Accents:] As above. % \item[Symbols:] As above. % \item[Bauhaus Symbols:] I have added some various symbols I have % found in connection with Bauhaus to the font. The reason is I % find them beautiful, and I had some space to fill. % \item[Numerous Shapes and Weights:] I don't think Bayer ever % design slanted characters, a bold face version of the font, and % he could never have design a small caps version of the % font. However, these are present in this implementation. I % included these features, because I believ them to be of general % utility, and it makes the font conform more to the Computer % Modern Roman font, and \NFSS{}. % \end{description} % % \subsection{Features of the font} % % Rather then using \texttt{cmbase.mf}\footnote{Computer Modern Roman % base file}, and then redefine some macros, I chose to make a new % base file myself, i.e., % \texttt{unibase.mf}\index{unibase.mf=\texttt{unibase.mf}}. This file % contains a number of macros\footnote{A better name for `base' would % be `library', and then the file would be \texttt{libuni.mf}, but to % conform to CM, I used `base'.} I have used in the character % programs. % % The macros of \texttt{unibase.mf} actually reflects my conception of % the font. There are three basic drawing macroes: % \begin{description} % \item[\texttt{unicir}] which draws a circle, % \item[\texttt{uniarc}] which draws a segment (arc) of a circle, and % \item[\texttt{unilne}] which draws a straight line. % \end{description} % I believe, that Bayer intended the font to be made of these two % basic shapes: the arc, and the line. Also, to keep things simple, % and therefore easy to print, all shapes should be of the same % thickness, i.e.,as if drawn with a pen of equal thickness. I have % made one diviation from this, however. All majuscles are drawn with % a thicker `pen', which makes the output nicer, I think. % % Incidently, this made the programs of the characters much simpler, % and shorter. % % \subsubsection{Series, Shapes, Sizes, and Special Characters} % % \Newestchanges{v2.0}{98/08/01}{Added `small caps' shape to the font.} % \changes{v2.0}{98/08/01}{Added non--standard `strict' shape to the % font.} % \changes{v2.0}{98/08/01}{Added `slanted' shape to the font.} % \changes{v2.0}{98/08/01}{Default series is changed to `medium' % to the font, `bold face' support included.} % % Below is a sample of each series/shape combination avaliable in this % implementation of the font, along with the \LaTeX{} commands that % drive them: % % \begin{description} % \item[\rm Medium upright (\Lcs{textuni}):] % \textuni{The dazed brown fox quickly gave 1234-567890 jumps!} % \item[\rm Medium slanted (\Lcs{textunisl}):] % \textunisl{The dazed brown fox quickly gave 1234-567890 jumps!} % \item[\rm Medium small caps (\Lcs{textunisc}):] % \textunisc{The dazed brown fox quickly gave 1234-567890 jumps!} % \item[\rm Medium strict (\Lcs{textunist}):] % \textunist{The dazed brown fox quickly gave 1234-567890 jumps!} % \item[\rm Bold face upright (\Lcs{textunibf}):] % \textunibf{The dazed brown fox quickly gave 1234-567890 jumps!} % \item[\rm Bold face slanted (\Lcs{textunibsl}):] % \textunibsl{The dazed brown fox quickly gave 1234-567890 jumps!} % \item[\rm Bold face small caps (\Lcs{textunibsc}):] % \textunibsc{The dazed brown fox quickly gave 1234-567890 jumps!} % \item[\rm Bold face strict (\Lcs{textunibst}):] % \textunibst{The dazed brown fox quickly gave 1234-567890 jumps!} % \end{description} % % Everyone of these shapes are avaliable in size 8, 9, 10, 12, 17 % \texttt{pt}, and \MF{} can ofcourse create others. % % \Newestchanges{v2.0}{98/08/01}{Some of the \textunibf{bauhaus} symbols % that where avaliable in v1.0, has been taken out.} % Also a number of non--standard characters are avaliable in the % font. Below is a table of these characters along with the \LaTeX{} % commands that drive them. % % Notice that \textunibf{``} and \textunibf{''} is present in the % table. This is because these characters are not directly defined, % but is supplied as \emph{ligatures}. This can be done, because they % are simple doubles of \textunibf{`} and \textunibf{'}. % % A quick look on the table will also reveal some characters that % generally isn't present in the standard \texttt{OT1} % encoding\footnote{The \texttt{OT1} encoding is the 7 bit encoding of % the Computer Modern fonts by Donald E.\ Knuth. 7 bit means it % contain 128 ($=2^7$) characters.}, but generally present in the % \texttt{T1} encoding\footnote{The \texttt{T1} encoding is an % encoding especially designed for the (western) European % languages. It was founded by the \TeX{} User's Group, on a seminar % in Cork, and is the basis of the \texttt{dc} fonts. \texttt{T1} is % an 8 bit encoding, which means it has 256 ($=2^8$) characters.}. I % have done this, both to provide an (almost) complete font for the % European languages, but also because I anticipate the \universal{} % font some time in the future will shift, or a least be avaliable, in % the \texttt{T1} encoding\footnote{\texttt{T1} is generally % considered \emph{the} encoding of the future, and in the long term, % it is most likely the encoding of \LaTeX3.}. % \begin{table}[htbp] % \centering % \begin{tabular}{% % @{\vline\extracolsep{1em}\space}ll% % @{\extracolsep{1em}}ll% % @{\space\vline\extracolsep{1em}}}\hline % \textuni{\bausquare}&\Lcs{bausquare}& % \textuni{\baucircle}&\Lcs{baucircle}\\ % \textuni{\bautriangle}&\Lcs{bautriangle}& % \textuni{\bauhead}&\Lcs{bauhead}\\ % \textuni{\bauforms}&\Lcs{bauforms}& % \textuni{\dh}&\Lcs{dh}\\ % \textuni{\dj}&\Lcs{dj}& % \textuni{\ng}&\Lcs{ng}\\ % \textuni{\th}&\Lcs{th}& % \textuni{\varQ}&\Lcs{varQ}\\ % \textuni{\DH}&\Lcs{DH}& % \textuni{\DJ}&\Lcs{DJ}\\ % \textuni{\NG}&\Lcs{NG}& % \textuni{\TH}&\Lcs{TH}\\ % \textuni{\textsection}&\Lcs{textsection} or \Lcs{S}& % \textuni{\textbraceleft}&\Lcs{textbraceleft} or \Lcs{\char"7B}\\ % \textuni{\textbraceright}&\Lcs{textbracerigth} or \Lcs{\char"7D}& % \textuni{\textbar}&\Lcs{textbar}\\ % \textuni{\guilsinglleft}&\Lcs{guilsinglleft}& % \textuni{\guilsinglright}&\Lcs{guilsinglright}\\ % \textuni{\guillemoleft}&\Lcs{guillemoleft}& % \textuni{\guillemoright}&\Lcs{guillemoright}\\ % \textuni{\quotesinglbase}&\Lcs{quotesinglbase}& % \textuni{\quotedblbase}&\Lcs{quotedblbase}\\ % \textuni{\textquotedblleft}&\Lcs{textquotedblleft}& % \textuni{\textquotedblright}&\Lcs{textquotedblright}\\ % \textuni{\textogonek}&\Lcs{textogonek}& % \textuni{\textunderscore}&\Lcs{textunderscore}\\ % \hline % \end{tabular} % \caption{Non--standard characters in the {universal} font} % \label{tab:characters} % \end{table} % Please note, that in the small caps shaped fonts, \Lcs{dh} does not % give {\small\textuni{\DH}}, but a \textunibsc{\dh}, that is a small % caps shaped version of \Lcs{varQ}. Also there is no command % \Lcs{varq} defined. % % In appendix~\ref{app:charts} is some charts showing the font in % different series and shapes. % % \subsubsection{File Names for the \MF{} files} % % \paragraph{Base File and Source Files} % The base file and the files containg the code for the characters of % the \universal{} font, all starts with \texttt{uni}, to reflect the % connection of the files. The next five possible letters reflects % what kind of code is contained within the file, e.g., the base file % ends in \texttt{base}, the file containing the code for the % minuscles (lower case letters) end in \texttt{lower}, and so forth. % % \paragraph{Font Driver Files} % The font driver filenames has been chosen to conform to the % \texttt{fontname} scheme, because this scheme is used by most % \TeX{}, \LaTeX{}, and \MF{} systems (anyway those that use % \texttt{kpathsea}, which is the most). % % The filename all contain the three characters \texttt{ful}, where % the \texttt{f} stands for \textit{public} and \texttt{ul} for % \textit{universal}. % % Next comes a letter which is one of \texttt{m} (\textit{medium}) or % \texttt{b} (\textit{bold}), which represents the series of the % font. % % Then comes one or two letters, which are \texttt{r} % (\textit{upright} or roman), \texttt{o} (\textit{slanted}, or % oblique), \texttt{c} (\textit{small caps}), or \texttt{st} % (\textit{strict}), which represent the shape of the font. % % Finally the filename ends with the designsize in points. % % Thus the complete syntax for the font driver file names is: % \begin{table}[htbp] % \centering % \begin{tabular}{rcl} % \meta{filename}&:=& % \meta{supplier}\meta{face}\meta{series}\meta{shape}\meta{size}\texttt{.mf}\\ % \meta{supplier}&:=&\texttt{f}\\ % \meta{face}&:=&\texttt{ul}\\ % \meta{series}&:=&\texttt{m \char"7C\ b}\\ % \meta{shape}&:=&\texttt{r \char"7C o \char"7C c \char"7C st}\\ % \meta{size}&:=&\texttt{\char"7C\ 8 \char"7C\ 9 \char"7C\ 10 % \char"7C\ 12 \char"7C\ 17} % \end{tabular} % \end{table} % The \texttt{fontname} scheme actually says to put \meta{encoding} % information after the \meta{shape}, but since this is \texttt{8r} % for \TeX{} Text, it would make filenames longer then 8 characters in % the cases of \meta{size} of 10, 12, and 17, so this information is % left out (which is permisable in \texttt{fontname}, but % unfortunate). % % This way of naming the font driver files will, if you use % \texttt{kpathsea}, put the \texttt{ful*.*pk} files in\newline % \indent\meta{pk--base--dir}\texttt{/public/universa/}\newline % and the \texttt{ful*.tfm} files in\newline % \indent\meta{tfm--base--dir}\texttt{/public/universa/}\newline % which I think is the intuitivly correct place to put them. This also % means, that the \texttt{*.mf} files provided with this package, % should be placed in\newline % \indent\meta{mf--source--base--dir}\texttt{/public/universa/}\newline % again very intuitive. % % Below is a table of the usual directory names under % \textsf{Unix}--like and \textsf{MSDOS}--like (including Windows95) % systems.\meta{mode} is \textsf{dvips}'s name for your printer. % \begin{table}[htbp] % \begin{tabular}{% % @{\vline\extracolsep{1em}\space}l% % @{\space\vline\extracolsep{1em}\space}l% % @{\space\vline\extracolsep{1em}\space}l% % @{\space\vline\extracolsep{1em}}} % \hline % Varibale&\textsf{Unix}--like systems&\textsf{MSDOS}--like systems\\ % \hline % \meta{tfm--base--dir}& % \texttt{/var/spool/texmf/pk/}\meta{mode}\texttt{/}& % \texttt{C:\Lcs{}FONTS\Lcs{}PK\Lcs{}}\meta{mode}\Lcs{}\\ % \meta{tfm--base--dir}& % \texttt{/var/spool/texmf/tfm/}& % \texttt{C:\Lcs{}FONTS\Lcs{}TFM\Lcs{}}\\ % \meta{tfm--base--dir}& % \texttt{/usr/local/lib/texmf/fonts/source/}& % \texttt{C:\Lcs{}TEX\Lcs{}MFINPUTS\Lcs{}}\\ % \hline % \end{tabular} % \caption{Common directory names.} % \end{table} % % \subsection{The \LaTeX\ and \NFSS\ Support} % % To use the \universal{} font with \LaTeXe{}\footnote{I have made % \emph{no} attempt to provide support for \LaTeX2.09, since this % format is obsolete, and those who \emph{do} use it, will proberly % never bother to look at CTAN for new fonts anyway.}, you should load % the package \textsf{uni} with the command % \begin{quote} % \Lcs{usepackage}\oarg{options}\marg{uni} % \end{quote} % in your preamble (i.e., after \Lcs{documentclass} and before % \Lcs{begin\{document\}}). \meta{options} can be any of the options % described below, but no other. % % \subsubsection{Options to \textsf{uni}} % % \marginpar{\raggedright\texttt{strict}} % \index{strict=\texttt{strict}\space(Option)} % \Newestchanges{v2.0}{98/08/01}{Added option \texttt{strict}.} % The \texttt{srict} option is intended to fassilitate typesetiing of % the \universal{} font in a \emph{strict} \textunibf{bauhaus} % fashion, that is \emph{only} in minuscules. % % In this font, only the series may be variated, that is, there is a % bold series strict shaped font of any size, and a medium series % strict shaped font of any size, in the \universal{} family. % % This option can be used in conjuntion with options \texttt{medium} % and \texttt{bold}. Please notice, that it doesn't make any sense to % ask for a small caps or slanted shaped font, while using this option. % % Notice that only \Lcs{textuni} and \Lcs{uni} is defined if option % \texttt{strict} was given to \textsf{uni} package. % % \marginpar{\raggedright\texttt{default}} % \index{default=\texttt{default}\space(Option)} % \Newestchanges{v2.0}{98/08/01}{Added option \texttt{default}.} % If you give the \texttt{default} option to the \textsf{uni} package, % the default font of the document will be \textunirm{universal}. % % If you also used the option \texttt{bold} the default font will be % the \universal{} font in \textbf{bold} series. Otherwise it will be % in medium series. % % With this option, \Lcs{textit}, \Lcs{it}, and \Lcs{itshape} shifts % to \textunisl{universal slanted} font, i.e., there is no % \textit{italic} font avaliable. % % \DescribeMacro{\textcmr} % \DescribeMacro{\cmr} % To make it possible to change back to Donald E.\ Knuth's Computer % Modern Roman font, even when the \texttt{default} option is given, % we define macros \Lcs{textcmr} and \Lcs{cmr}, which switches the % \Lcs{fontfamily} to \texttt{cmr} locally and gobally respecivly. % % You should use this option with some care, since the \universal{} % font isn't very suited for longer texts, but rather for short % letters, quotes, and other pieces of text where the graphical % apperance is important. % % \marginpar{\raggedright\texttt{medium}} % \index{medium=\texttt{medium}\space(Option)} % \Newestchanges{v2.0}{98/08/01}{Added option \texttt{medium}.} % When this option is given, command \Lcs{textuni} switches to % \textunirm{medium series universal font}, as do \Lcs{uni}. The other % font selection commands behave as always (see below). This is the % default option to \textsf{uni}, i.e., not normally needed. % % \marginpar{\raggedright\texttt{bold}} % \index{bold=\texttt{bold}\space(Option)} % \Newestchanges{v2.0}{98/08/01}{Added options \texttt{bold}.} % If this option is given, commands \Lcs{textuni} and \Lcs{uni} % switches to \textunibf{bold series universal font}. Other font % selection commands behave as always (see below). Notice that it % makes no sense to give both option \texttt{medium} and option % \texttt{bold} to the \textsf{uni} package. % % \subsubsection{Font Selection Commands} % % \DescribeMacro{\textuni}\DescribeMacro{\uni} % These two commands only change the current font family to % \texttt{uni} \emph{and nothing else}. That means, that if you say % for example % \begin{verbatim} % {\sl Hello \textuni{world}} % \end{verbatim} % you get \emph{both} `Hello' and `world' in slanted shape, and the % output would be % \begin{quote} % {\sl Hello \textuni{world}} % \end{quote} % To put it in another way: Font encoding, shape, size, and % baselineskip is preserved under \Lcs{textuni} and \Lcs{uni}, while % font family is not. % % \textbf{Execptions:} If you gave the \texttt{bold} option to the % \textsf{uni} package, then this command will always give you a bold % series font. If you gave the \texttt{strict} option, then this % command will always give you a strict shaped font. % % These commands can be used in conjuntion with \LaTeX{} commands % \Lcs{textbf}, \Lcs{textsl}, and even \Lcs{sc}, or \Lcs{rm} to give % different series and shapes. % % \DescribeMacro{\textunirm}\DescribeMacro{\unirm} % If you in the previous example intended to shift to % \textunirm{medium upright universal} font you could instead have % used \Lcs{textunirm}, since this command \emph{does not} preserve % font shape, i.e., the shape is always changed to upright, regardless % of the prevouis shape. So if you said % \begin{verbatim} % {\sl Hello \textunirm{world}} % \end{verbatim} % you would get % \begin{quote} % {\sl Hello \textunirm{world}} % \end{quote} % % \DescribeMacro{\textunisl}\DescribeMacro{\unisl} % \DescribeMacro{\textunisc}\DescribeMacro{\unisc} % \DescribeMacro{\textunist}\DescribeMacro{\unist} % \label{expl:cmds} % Actually \Lcs{textunirm} and \Lcs{unirm} isn't the only commands % that aggresively changes most of the font % parameters. \Lcs{textunisl}, \Lcs{textunisc}, and \Lcs{textunist}, % \emph{always} gives you \textunisl{medium slanted}, % \textunisc{medium small caps}, and \textunist{medium strict} % respecitivly no matter what the values of \Lcs{f@shape} was before. % % \DescribeMacro{\textunibf}\DescribeMacro{\unibf} % \DescribeMacro{\textunibsl}\DescribeMacro{\unibsl} % \DescribeMacro{\textunibsc}\DescribeMacro{\unibsc} % \DescribeMacro{\textunibst}\DescribeMacro{\unibst} % In the same category is \Lcs{textunibf}, \Lcs{textunibsl}, % \Lcs{textunibsc}, and \Lcs{textunist} which always changes the font % series to \textbf{bold}, along with change in shape (upright, % slanted, small caps, and strict in that order). % % All of the `aggresive' commands, \emph{do not} however change the % \emph{size} and \emph{baselineskip} of the font. This should be done % by using \LaTeX{} commands such as \Lcs{small}, \Lcs{Large}, % \Lcs{fontsize}\marg{size}\marg{lineskip}, % etc. % % Notice that the `aggresive' commands always changes to the % appropiate font series. That is, even if you gave the \texttt{bold} % option to \textsf{uni}, \Lcs{textunirm} will still give you % \textunirm{medium upright universal} font. This particular instance % illustrates the use of the aggresive commands quite well I think. % % To summerize: The `aggresive' commands \emph{doesn't} preserve % fammily, series and shapes, but \emph{does} preserve encoding, size, % and baslineskip. % % \textbf{Warning:} The font shifting commands \Lcs{textuni...} and % \Lcs{uni...} in this section is \emph{not} defined if you gave the % \texttt{strict} option to the \textsf{uni} package. % % \DescribeMacro{\unifamily} % \Newestchanges{v2.0}{98/08/01}{Defined \Lcs{unifamily} to % fasilitate easier and stronger font loading.} % One can also use the rather primitive command \Lcs{unifamily} in % conjunction with \Lcs{selectfont} as described in \ftnguide{}, to % change the font family to \universal{} if absolute control is % preferd. % % \Lcs{unifamily} is used by all the other font switching commands, so % if you redefine it, or \Lcs{unifamilydefault}, you could get strange % resault. % % \DescribeMacro{\unifamilydefault} % This command normally expands to \texttt{uni}, which is the `family' % name of the \universal{} package. If you redefine this command to be % something else, e.g., \texttt{cmr}, \Lcs{unifamily} will load % another font. % % \DescribeMacro{\uniseries} % \Newestchanges{v2.0}{98/08/01}{Defined \Lcs{uniseries} to % fasilitate easier and stronger font loading.} % If the \texttt{bold} option to \textsf{uni} is used this command % will select the default series of the \universal{} font, defined in % \Lcs{uniseriesdefault}, which ofcourse defaults to \texttt{b}, i.e., % bold series. if you redefine \Lcs{uniseriesdefault} to be % \texttt{m}, then \Lcs{uniseries} will select medium series % fonts. % % If \texttt{bold} option wasn't given, then this expands to nothing, % as do \Lcs{uniseriesdefault}. % % This command is used by \Lcs{textuni} and \Lcs{uni}. % % \DescribeMacro{\unishape} % \Newestchanges{v2.0}{98/08/01}{Defined \Lcs{unishape} to % fasilitate easier and stronger font loading.} % If the \texttt{strict} option to \textsf{uni} is used this command % will select the default shape of the \universal{} font, defined in % \Lcs{unishapedefault}, which ofcourse defaults to \texttt{st}, i.e., % strict shape. If you redefine \Lcs{unishapedefault} to be % \texttt{n}, then \Lcs{uniseries} will select upright shaped fonts. % % If \texttt{strict} option wasn't given, then this expands to nothing, % as do \Lcs{unishapedefault}. % % This command is used by \Lcs{textuni} and \Lcs{uni}. % % % \DescribeMacro{\stshape} % \Newestchanges{v2.0}{98/08/01}{Defined \Lcs{stshape} to make package % conform to \LaTeXe{} better.} % This command switches to \emph{strict} shape, i.e., all majuscules % will be typeset as minuscles. This makes it possible in a simple way % to typeset text in the way Herbert Bayer thought it should, as % evident from the citation above. % % This command uses the command \Lcs{stdefault}, which defaults to % \texttt{st}. If you redefine this to something alse, e.g., % \texttt{sl} you will get a \textsl{slanted} font. % % This command is used by \Lcs{textunist}, \Lcs{textunibst}, % \Lcs{unibst} and \Lcs{unist}, and is defined no matter waht options % you gave to the \textsf{uni} package. % % \textbf{Warning:} Since \emph{strict} is a non--standard shape, this % command should not be used outside the \universal{} font, since this % may give you unexpected resaults. % % \subsubsection{Special Character Commands} % % For the individual commands that makes various special characters, % please consult table~\ref{tab:characters} above. % % \subsubsection{Other Commands} % % \DescribeMacro{\k} % The macro \Lcs{k} used in the \universal{} font gives the accent % ogenek, that is a reversed cidelia accent. It takes one argument, % which shuold be a single letter, under which it puts the accent. For % example, you could say \Lcs{textuni\{}\Lcs{k\{a\}\}} and get % \textuni{\k{a}}. % % \DescribeMacro{\DeclareUniChar} % \Newestchanges{v2.0}{98/08/01}{Configuration of \textsf{uni} package % provided via the commands \Lcs{DeclareUniChar} and % \Lcs{DeclareUniCommand}.} % Now you can configure the special character commands of the font, % via the commands \Lcs{DeclareUniChar} and % \Lcs{DeclareUniCommand}. The commands defined via these commands % will only work in accordence with it's definition inside the % \universal{} font, and if defined elsewhere according to it's % definition there, else it will give an error message. % % \Lcs{DeclareUniChar} is used to define a command sequence % representing a single character in the \universal{} font, much like % \Lcs{DeclareTextSymbol}, or in \TeX{} \Lcs{chardef}, though the % control sequence will produce an error message outside the % \universal{} font, and properle unexpected resaults outside the % \texttt{OT1} encoding\footnote{This should not be a problem.}. % % \Lcs{DeclareUniCommand} is used to define control sequences inside % the \universal{} font, representing many characters or doing complex % manuvers on characters and stuff. The optional argument to % \Lcs{DeclareUniCommand} can be used to say how many arguments the % control sequence should have, just like \Lcs{newcommand}. However, % it is not possible to give a default first argument. % % The below defintion uses the \textsf{color} package to typeset a % square, circle, and triangle in different colours\footnote{Since the % documentation should be avaliable to all, I can not provide you with % the outcome of this example, since it needs the \textsf{color} % package wich may not be avaliable on all sites. I suggest you try % it out, or something similar, if you can.}. % \begin{verbatim} % \DeclareUniCommand{\mybauforms}{% % \lower.5ex\hbox{\color{blue}\bautriangle}% % \kern-.5em\raise.5ex\hbox{\color{read}\baucircle}% % \kern-.5em\lower.5ex\hbox{\color{yellow}\bausquare}} % \end{verbatim} % Yet another example, using arguments could be % \begin{verbatim} % \DeclareUniCommand{\mybaulogo}[1]{\bauhead\ {\Large #1}} % \end{verbatim} % so you could say \verb+\mybaulogo{Christian Holm}+ and get: % \begin{quote} % {\uni \bauhead {\Large Christian Holm}} % \end{quote} % and I bet you can come up with some even more useful and complex % commands. % % The syntax of \Lcs{DeclareUniChar} and \Lcs{DeclareUniCommand} is % \begin{quote} % \Lcs{DeclareUniChar}\marg{cmd}\marg{slot}\newline % \Lcs{DeclareUniCommand}\marg{cmd}\oarg{arg}\marg{definition} % \end{quote} % where \meta{cmd} is the user command defined, \meta{slot} is the % number of the character in the font, \meta{arg} is the number of % arguments and \meta{definition} is what \meta{cmd} does. % % \subsubsection{File Names for the \LaTeX{} files} % % All the \LaTeX{} files contain the three letters \texttt{uni}, to % reflect the connectedness of the files. The font definition files % all start with the letter code appropiate for the encodeing. % % To follow the scheme of the \MF{} files, it would be appropiate to % place all \LaTeX{} files in\newline % \indent\meta{tex--base--dir}\footnote{On \textsf{Unix}--like systems % \meta{tex--base--dir} is usually something like % \texttt{/usr/local/lib/texmf/}, and on \textsf{MSDOS}--like systems % something like \texttt{C:\Lcs{}TEX}\Lcs{} % .}\texttt{/tex/latex/universa/} % % \subsection{The Major differences between version 1.0 and 2.0} % % \paragraph{First of:} \emph{a lot} of bugs and errors has been % corrected. In version~1.0, I had made the (stupid) mistake of % calling the macro \textuni{mode\_setup} before I defined the % unsharped units. Ofcourse a quick look in the \MFbook{} showed be % just how stupid this is. This made the font very vunerable to mode % specifications, which ofcourse isn't the idea. % % \paragraph{Secondly:} I chose a completly new approach to the % character programs, which resaultet in \texttt{unibase.mf}. The idea % is to define a few macros, and then utilize those in the character % programs, so that these programs can be kept simple, efficient, and % intuitive. % % A quick look at \texttt{unibase.mf} will also reveal that I chose a % new way of adjusting the characters. This means that the macros % \texttt{bauhaus...} present in version~1.0 no longer is needed, and % since they only tended to ubscure things rather then simplify them, % I went back to the plain \MF{} macro \texttt{beginchar}, which is % much stronger. % % All in all, \texttt{unibase.mf} provides a much stronger and uniform % frame work for character design, then did the old % \texttt{universal.mf}. % % \paragraph{Thirdly:} The file names have been keept inside % \textsc{msdos} conventions, that is first name of maximum 8 % charcaters, and last name of maximum 3 characters. This does mean, % however, that some file names are not intutive, but I have tried to % make them as much as I could. % % Also, every file associated with this font, execpt the font % definition files (\texttt{*uni.fd}), and font driver files % (\texttt{ful*.mf}) begins with the three letters \texttt{uni}, to % emphasize the connection. % % \paragraph{Fouthly:} Some new font shapes are avaliable, as % explained above. I found out, during the design of the characters, % that new the base file \texttt{unibase.mf} kept showing new % potentiality, and the extension of the font to include more shapes % was very easy inside the frame of this base, so I thought ``What the % heck!'' % % \paragraph{Fifthly:} Some of the \textuni{bauhaus} symbols avaliable % in version~1.0, has been taken out, and some new, more general % characters have been added. Most of the absent symbols where not % really of general use, so I decided to take them out, since I was % never really satisfied with those anyway. This also made the font % contain exactly 128 characters, just like a normal Computer Modern % Roman font. % % \paragraph{Sixthly:} I improved the \LaTeX{} and \NFSS{} support % considerably. The changes are legion, but let me sum up the most % important here. % \begin{enumerate} % \item Stronger font selection commands. % \item Command names that should be more intuitive. % \item Preperations for \texttt{T1} encoding. % \item Conformation to \LaTeXe{} style, and therefore a better % chance to conform with the future \LaTeX3 format. % \item More and better options. % \end{enumerate} % % \StopEventually{\AtEndDocument{\PrintIndex\PrintChanges}} % %\iffalse %<*package> %\fi % \section{\LaTeX\ Support Files} % % \subsection{The style file --- \texttt{uni.sty}} % \file{uni.sty} % % In version~2.0, the commands in this file has been redefined using % the macros recommended in \ftnguide{} and \clsguide{}. This should % make the commands and macros more portable, and secure. Further, it % should make it upward--compatiable with future releases of other % packages and in the end \LaTeX3. % % \subsubsection{Intilalizing} % % First we need to identify the package, its version and release date, % etc. % % \begin{macrocode} \ProvidesPackage{uni}[\unifiledate\space\unifileversion\space universal package.] % \end{macrocode} % % \begin{macro}{\if@uni} % \begin{macro}{\@unifalse} % \begin{macro}{\@unitrue} % \begin{macro}{\if@strict} % \begin{macro}{\@strictfalse} % \begin{macro}{\@stricttrue} % \begin{macro}{\ifdef@ult} % \begin{macro}{\def@ultfalse} % \begin{macro}{\def@ulttrue} % \begin{macro}{\ifm@dium} % \begin{macro}{\m@diumfalse} % \begin{macro}{\m@diumtrue} % Then we setup some new \Lcs{if} commands, to help in different % sitations, depending on options passed to the package etc. % \begin{macrocode} \newif\if@uni\@unifalse \newif\ifstri@t\stri@tfalse \newif\ifdef@ult\def@ultfalse \newif\ifm@dium\m@diumfalse % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % % \subsubsection{Options} % % We define some options that can be passed to the package. % Option \texttt{strict} is intended to make it possible to do % \emph{strict} Herbert Bayer typesetting, that is only in % minuscles. Option \texttt{default} will make the \emph{default} font % \universal{} of the entire document, while option % \texttt{medium} and \texttt{bold} decides wether the default font % used by \Lcs{textuni} is normal or bold series. Finally option % \texttt{medium} is declared default. % \begin{macrocode} \DeclareOption{strict}{\stri@ttrue} \DeclareOption{default}{\def@ulttrue} \DeclareOption{medium}{\m@diumtrue} \DeclareOption{bold}{\m@diumfalse} \ExecuteOptions{medium} \ProcessOptions\relax % \end{macrocode} % % \subsubsection{Special Characters} % % \begin{macro}{\uni@init} % \begin{macro}{\DeclareUniChar} % \Newestchanges{v2.1}{2018/08/26}{Prevent expansion of as-of-yet not % defined arguments. Thanks to Scott Pakin.} % \changes{v2.0}{98/08/01}{Added for faster and more stable % loading of special charactes.} % \begin{macro}{\DeclareUniCommand} % \changes{v2.0}{98/08/01}{Added for faster and more stable % decleration of \universal{} commands.} % \begin{macro}{\Declare@Uni} % \begin{macro}{\DeclareUni@xarg} % \begin{macro}{\DeclareUni@narg} % \begin{macro}{\UniError} % To facilitate the special character positions of the \universal{} % font, we define the internal commands \Lcs{uni@init}, and the user % commands \Lcs{DeclareUniChar} and \Lcs{DeclareUniCommand}. % % \Lcs{DeclareUniChar} and \Lcs{DeclareUniCommand} is very much like % the \LaTeX{} commands \Lcs{DeclareTextSymbol} and % \Lcs{DeclareTextCommand}, execpt we have to take into account, that % the commands may very well be defined in \texttt{ot1enc.def} or the % like. Since some of the characters provided with this font, is % usually part of an 8 bit font, I can't just use the character % numbers straight of (this is a 7 bit font), and I have some very % non--standard characters as well. % % Though the two commands differ a bit, the main mechanism is the % same, so I will explain them together, and note the % differences\footnote{The syntax of the macroes are explanied on % page~\pageref{expl:cmds}.} . % \begin{enumerate} % \item When either of the commands is used, we first call the macro % \Lcs{Declare@uni}, which sets up 2 or 3 commands. % \item Inside \Lcs{Declare@Uni}, we define \Lcs{temp@a} to be % \Lcs{uni@}\meta{cmd-name}, where \meta{cmd-name} is \meta{cmd} % stripped of the escape character (\Lcs{}). % \item Then we check wether \Lcs{cmd} is defined. % \begin{itemize} % \item If \meta{cmd} \emph{isn't} defined, then we define % \Lcs{temp@c} to give \Lcs{uni@}\meta{cmd-name} (which isn't % defined yet) inside the \universal{} font, otherwise an error % message (\Lcs{UniError}). % \item If \meta{cmd} \emph{is} defined, we define \Lcs{temp@b} to % be \Lcs{no@uni@}\meta{cmd-name}, \Lcs{temp@c} to give % \Lcs{uni@}\meta{cmd-name} inside the \universal{} font, and % \Lcs{no@uni@}\meta{cmd-name} (which isn't defined yet) % elsewhere. Then we define \Lcs{no@uni@}\meta{cmd-name} to be % what \meta{cmd} currently is. % \end{itemize} % This finishes \Lcs{Declare@Uni} off. % \item The next step depends a bit on which of the macros that is % utiliezed. What is coomon is that \Lcs{uni@}\meta{cmd-name} (hold % in \Lcs{temp@a}) is defined to be the last argument of the command. % \begin{itemize} % \item In \Lcs{DeclareUniChar}, we define \Lcs{uni@}\meta{cmd-name} % via the \TeX{} command \Lcs{chardef} to be \meta{slot}, which % should be a number (decimal, octal, or hexal) between 0 and % 127. Using the \TeX{} primitive will make \LaTeX{} think of % \meta{cmd} as a single character. % \item If \Lcs{DeclareUniCommand} was given an optional argument, % we use the command \Lcs{DeclareUni@xarg} to define % \Lcs{uni@}\meta{cmd-name} --- which uses \Lcs{newcommand} with % \emph{one} optinal argument --- to be % \meta{definition}. Otherwise we use \Lcs{DeclareUni@narg} --- % which uses \Lcs{newcommand} with \emph{no} optinal arguments --- % to do the trick. % Using the \LaTeX{} complex \Lcs{newcommand}, makes \meta{cmd} a % strong command. % \end{itemize} % \item Finally we define \meta{cmd} to be \Lcs{temp@d}, which was the % conditional command defined in step 2. % \end{enumerate} % % Notice the use of \Lcs{aftergroup}. This means that \meta{cmd-name} % shouldn't be too long, i.e., $>300$ characters, which isn't a real % limitation, but now I said it. This macro, together with the group % in \Lcs{temp@c} is what made it possible to give arguments to % \meta{cmd} defined by \Lcs{DeclareUniCommand}. % % This way of doing things has a number of benefiets. 1) First of I % makes it very simple to redefine the behaviour of the \universal{} % speciffic character commands. All you have to do is to use % \Lcs{DeclareUniChar} or \Lcs{DeclareUniChar} in your preamble (and % \emph{only} there). 2) Since \TeX{} are faster at evaluating % \Lcs{if...}'s, switching to \universal{} commands should take a % minimum amount of time. 3) From a portability point of view, this % way of shifting meanings of commands such as \Lcs{textquotedblleft}, % according to context, doesn't screw up older documents where the % \textsf{uni} package is added to. % % There are some disadvantage. 1) Most noticably there is \emph{no} % conformation to \emph{any} existing encoding, which however is a % problem of the in the font, not the \textsf{uni} package. 2) % The heavy use of \Lcs{def}, \Lcs{edef}, and \Lcs{let}, is not % exactly \LaTeX3 policy, but is needed here. 3) The definition of the % commands may slow \TeX{} down a bit, but should be bearable. % \begin{macrocode} \newcommand{\uni@init}{\@unitrue} \DeclareRobustCommand{\Declare@Uni}[1]{% \edef\temp@{\expandafter\@gobble\string#1} \edef\temp@a{\csname uni@\temp@\endcsname} \@ifundefined{\temp@}{% \edef\temp@c{{% \noexpand\if@uni\noexpand\aftergroup\temp@a\noexpand% \else\noexpand\UniError{\noexpand#1}\noexpand\fi}}}{% \edef\temp@b{\csname no@uni@\temp@\endcsname} \edef\temp@c{{% \noexpand\if@uni\noexpand\aftergroup\temp@a\noexpand% \else\noexpand\aftergroup\temp@b\noexpand\fi}} \expandafter\let\temp@b#1}} \DeclareRobustCommand{\DeclareUniChar}[2]{% \Declare@Uni{#1} \expandafter\chardef\temp@a=#2 \let#1\temp@c} \def\DeclareUniCommand#1{% \@ifnextchar[{\DeclareUni@xarg#1}{\DeclareUni@narg#1}} \def\DeclareUni@xarg#1[#2]#3{% \Declare@Uni{#1} \expandafter\DeclareRobustCommand\temp@a[#2]{#3} \let#1\temp@c} \def\DeclareUni@narg#1#2{% \Declare@Uni{#1} \expandafter\DeclareRobustCommand\temp@a{#2} \let#1\temp@c} \@onlypreamble\DeclareUniChar\relax \@onlypreamble\DeclareUniCommand\relax \DeclareRobustCommand{\UniError}[1]{% \PackageError{uni}{% Command \string#1 not defined outside universal font.}{% Correct your source file, so that \string#1 doesn't appear^^J% ouside of universal font, then run LaTeX again.^^J% Prepare your self for some gastly output.}} % \expandafter\show\csname no@uni@\temp@\endcsname % \expandafter\show\csname uni@\temp@\endcsname % \expandafter\show\csname \temp@\endcsname % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % % \begin{macro}{\bausquare} % \Newestchanges{v2.0}{98/08/01}{\universal{} specific % characters declared by seperate macro.} % \begin{macro}{\baucircle} % \begin{macro}{\bautriangle} % \begin{macro}{\bauhead} % \begin{macro}{\bauforms} % \begin{macro}{\dh} % \begin{macro}{\ng} % \begin{macro}{\th} % \begin{macro}{\varQ} % \begin{macro}{\NG} % \begin{macro}{\TH} % \begin{macro}{\textogonek} % \begin{macro}{\textbraceleft} % \begin{macro}{\textbraceright} % \begin{macro}{\textsection} % \begin{macro}{\textbar} % \begin{macro}{\guilsinglleft} % \begin{macro}{\guilsinglright} % \begin{macro}{\textquotedblleft} % \begin{macro}{\textquotedblright} % \begin{macro}{\quotesinglbase} % \begin{macro}{\quotedblbase} % \begin{macro}{\guillemoleft} % \begin{macro}{\guillemoright} % \begin{macro}{\k} % \begin{macro}{\DH} % \begin{macro}{\DJ} % \begin{macro}{\dj} % \begin{macro}{\textunderscore} % This command takes care of commands for non--standard placement, and % symbols in the \universal{} font, while using standard \LaTeXe{} % encodings, such as \texttt{OT1}. % % For instance, the symbols \textunibf{\}}, \textunibf{\{} isn't % present in Computer Modern fonts, but is accesiable through the % command \Lcs{}\texttt{\{}, and \Lcs{}\texttt{\}} in the \universal{} % font. On the other hand \char"00{} isn't present in this font, but % is replaced by \textunibf{\char"00}. % % Some of the commands avaliable are well--known to the \texttt{T1} % encodeing, and are provided with the same commmand names as in that % encoding. % % The decleration of these commands use my (slick) macros % \Lcs{DcelareUniChar} and \Lcs{DcelareUniCommand} --- very neat I % think. % % \begin{macrocode} \DeclareUniChar{\bausquare}{"00} \DeclareUniChar{\baucircle}{"01} \DeclareUniChar{\bautriangle}{"02} \DeclareUniChar{\bauhead}{"03} \DeclareUniChar{\bauforms}{"04} \DeclareUniChar{\dh}{"05} \DeclareUniChar{\ng}{"06} \DeclareUniChar{\th}{"07} \DeclareUniChar{\varQ}{"08} \DeclareUniChar{\NG}{"09} \DeclareUniChar{\TH}{"0A} \DeclareUniChar{\textogonek}{"0B} \DeclareUniChar{\textbraceleft}{"0C} \DeclareUniChar{\textbraceright}{"0D} \DeclareUniChar{\textsection}{"0E} \DeclareUniChar{\textbar}{"0F} \DeclareUniChar{\guilsinglleft}{"22} \DeclareUniChar{\guilsinglright}{"5C} \DeclareUniChar{\quotesinglbase}{"2C} \DeclareUniCommand{\quotedblbase}{\char"2C\kern-.3em\char"2C} \DeclareUniCommand{\textquotedblleft}{``} \DeclareUniCommand{\textquotedblright}{''} \DeclareUniCommand{\guillemoleft}{\char"22\char"22} \DeclareUniCommand{\guillemoright}{\char"5C\char"5C} \DeclareUniCommand{\DH}{\raise.5ex\hbox{\char"2D}\kern-.5em D} \DeclareUniCommand{\DJ}{\raise.5ex\hbox{\char"2D}\kern-.5em D} \DeclareUniCommand{\dj}{\raise.75ex\hbox{\char"2D}\kern-1em d} \DeclareUniCommand{\textunderscore}{\lower.5ex\hbox{\char"7B}} \DeclareUniCommand{\k}[1]{% \leavevmode\setbox\z@\hbox{#1}\ifdim\ht\z@=1ex\accent11 #1% \else{\ooalign{\unhbox\z@\crcr\hidewidth\char11\hidewidth}}\fi} % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % % \subsubsection{Font Selection} % % \begin{macro}{\unifamily} % \Newestchanges{v2.0}{98/08/01}{Defined \Lcs{unifamily} to % fasilitate easier and stronger font loading.} % The real command. This switches to \universal{} font, and can % be used by authors in conjunction with \LaTeXe{} primitive % \Lcs{selectfont}. \Lcs{unifamily} is used below in \Lcs{textuni...}, % and \Lcs{uni...}. % % \begin{macro}{\unifamilydefault} % \changes{v2.0}{98/08/01}{Defined to make package conform to % \LaTeXe{} better.} % Here \Lcs{unifamilydefault} is by default defined to be % \texttt{uni}, but could ofcourse expand to something % different. However, the expnasion should be a font family (like % \texttt{cmr}) or the like. % % \begin{macrocode} \DeclareRobustCommand\unifamily{% \not@math@alphabet\unifamily\relax% \fontfamily\unifamilydefault\selectfont} \newcommand{\unifamilydefault}{uni} % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{\uniseries} % \Newestchanges{v2.0}{98/08/01}{Defined \Lcs{uniseries} to % fasilitate easier and stronger font loading.} % If the \texttt{bold} option is used with the \textsf{uni} package, % then this command switches to whatever series is defined via % \Lcs{uniseriesdefault} (default is \textbf{bold} series), otherwise % it does nothing. Since this command is used in \Lcs{textuni} and % \Lcs{uni}, this way will not allow anyother series if \texttt{bold} % option is given, expect \textbf{bold}. However, if \texttt{bold} % isn't given, then \emph{any} series is possible. % % \begin{macro}{\uniseriesdefault} % \changes{v2.0}{98/08/01}{Defined to make package conform to % \LaTeXe{} better.} % Here \Lcs{uniseriesdefault} is defined to be \texttt{b} % (\textbf{medium}) if the \texttt{bold} option \emph{was} given to % \textsf{uni} package. Otherwise it expans to nothing % (\Lcs{relax}). This macro is used by \Lcs{uniseries}. % \begin{macrocode} \ifm@dium \let\uniseries\relax \let\uniseriesdefault\relax \else \DeclareRobustCommand\uniseries{% \not@math@alphabet\uniseries\relax% \fontseries\uniseriesdefault\selectfont} \newcommand{\uniseriesdefault}{b} \fi % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{\unishape} % \Newestchanges{v2.0}{98/08/01}{Defined \Lcs{unishape} to % fasilitate easier and stronger font loading.} % If the \texttt{strict} option is used with the \textsf{uni} package, % then this command switches to whatever shape is defined via % \Lcs{unishapedefault} (default is \emph{strict} shape), otherwise % it does nothing. Since this command is used in \Lcs{textuni} and % \Lcs{uni}, this way will not allow anyother shape if \texttt{strict} % option is given, expect \emph{strict}. However, if \texttt{strict} % isn't given, then \emph{any} series is possible. % % \begin{macro}{\unishapedefault} % \changes{v2.0}{98/08/01}{Defined to make package conform to % \LaTeXe{} better.} % Here \Lcs{unishapedefault} is defined to be \texttt{st} % (\emph{strict}) if the \texttt{strict} option \emph{was} given to % \textsf{uni} package. Otherwise it expans to nothing % (\Lcs{relax}). This macro is used by \Lcs{unishape}. % \begin{macrocode} \ifstri@t \DeclareRobustCommand\unishape{% \not@math@alphabet\unishape\relax% \fontseries\unishapedefault\selectfont} \newcommand{\unishapedefault}{st} \else \let\unishape\relax \let\unishapedefault\relax \fi % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{\stshape} % \changes{v2.0}{98/08/01}{Defined \Lcs{stshape} to make package % conform to \LaTeXe{} better.} % This command selects the shape holded by \Lcs{stdefault} (defaults % to \texttt{st} --- strict) in any family or series. This is used by % commands \Lcs{textunist}, \Lcs{textunibst}, \Lcs{unist}, and % \Lcs{unibst}. % % \begin{macro}{\stdefault} % \changes{v2.0}{98/08/01}{Defined to make package conform to % \LaTeXe{} better.} % The shape selected by \Lcs{stshape}. % \begin{macrocode} \DeclareRobustCommand\stshape{% \not@math@alphabet\stshape\relax% \fontshape\stdefault\selectfont} \newcommand{\stdefault}{st} % \end{macrocode} % \end{macro} % \end{macro} % % \paragraph{Local Font Selection} % \begin{macro}{\textuni} % \Newestchanges{v2.0}{98/08/01}{\Lcs{textbayer} changed to % \Lcs{textuni}, and defined using \LaTeXe{} scheme.} % \begin{macro}{\textunirm} % \begin{macro}{\textunibf} % \begin{macro}{\textunisl} % \begin{macro}{\textunisc} % \begin{macro}{\textunibsl} % \begin{macro}{\textunibsc} % These are the macros that switches to \universal{} font, % locally, i.e., for a few words, in various series and shapes. The % names are pretty selfexplanetory, I think. These macros will % \emph{always} change the font series and shape accroding to it's % definiton, nothing more, and nothing less, exepct \Lcs{textuni}, % which only changes the cuurent family to \texttt{uni}. Notice it % simply uses the \Lcs{unifamily} command to do the trick. % % The second argument to \Lcs{DeclareTextFontCommand} should not % normally contain commands that typeset, or commands not relevant to % the selection of fonts, but to make up for the non--default % characeters and character placements, we \emph{do} include % \Lcs{uni@init} in the argument. % % Notice that only \Lcs{textuni} is defined if option \texttt{strict} % was given to \textsf{uni} package. % \begin{macrocode} \DeclareTextFontCommand{\textuni}{% \uni@init\unifamily\uniseries\unishape} \ifstri@t \else \DeclareTextFontCommand{\textunirm}{% \uni@init\unifamily\mdseries\upshape} \DeclareTextFontCommand{\textunibf}{% \uni@init\unifamily\bfseries\upshape} \DeclareTextFontCommand{\textunisl}{% \uni@init\unifamily\mdseries\slshape} \DeclareTextFontCommand{\textunisc}{% \uni@init\unifamily\mdseries\scshape} \DeclareTextFontCommand{\textunist}{% \uni@init\unifamily\mdseries\stshape} \DeclareTextFontCommand{\textunibsl}{% \uni@init\unifamily\bfseries\slshape} \DeclareTextFontCommand{\textunibsc}{% \uni@init\unifamily\bfseries\scshape} \DeclareTextFontCommand{\textunibst}{% \uni@init\unifamily\bfseries\stshape} \fi % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % % \paragraph{Global Font Selection} % \begin{macro}{\uni} % \Newestchanges{v2.0}{98/08/01}{\Lcs{bayer} changed to \Lcs{uni}} % \begin{macro}{\unibf} % \begin{macro}{\unibf} % \begin{macro}{\unisl} % \begin{macro}{\unisc} % \begin{macro}{\unibsl} % \begin{macro}{\unibsc} % These macros works as \Lcs{textuni...} above, execpt the take effect % from the point used, to the end of the current group. Again font % selection is \emph{exactly} as given in the command name, execpt for % \Lcs{uni} which only changes the family. % % Notice that only \Lcs{uni} is defined if option \texttt{strict} % was given to \textsf{uni} package. % \begin{macrocode} \DeclareOldFontCommand{\uni}{% \uni@init\unifamily\uniseries\unishape}{} \ifstri@t \else \DeclareOldFontCommand{\unirm}{% \uni@init\unifamily\mdseries\upshape}{} \DeclareOldFontCommand{\unibf}{% \uni@init\unifamily\bfseries\upshape}{} \DeclareOldFontCommand{\unisl}{% \uni@init\unifamily\mdseries\slshape}{} \DeclareOldFontCommand{\unisc}{% \uni@init\unifamily\mdseries\scshape}{} \DeclareOldFontCommand{\unist}{% \uni@init\unifamily\mdseries\stshape}{} \DeclareOldFontCommand{\unibsl}{% \uni@init\unifamily\bfseries\slshape}{} \DeclareOldFontCommand{\unibsc}{% \uni@init\unifamily\bfseries\scshape}{} \DeclareOldFontCommand{\unibst}{% \uni@init\unifamily\bfseries\stshape}{} \fi % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % % \paragraph{\texttt{default} Option Font} % % \begin{macro}{\ifdef@ult} % \begin{macro}{\def@ulttrue} % \begin{macro}{\def@ultfalse} % \begin{macro}{\ifm@dium} % \begin{macro}{\m@diumtrue} % \begin{macro}{\m@diumfalse} % Now if you gave the \texttt{default} option to the package, % \Lcs{ifdef@ult} evaluates to true, and so we setup the default font % to be \universal{}, in the medium or bold version, depending % on wether you gave the \texttt{medium} option or not. % \begin{macrocode} \ifdef@ult \renewcommand{\familydefault}{uni} \ifm@dium\renewcommand{\seriesdefault}{m} \else\renewcommand{\seriesdefault}{b}\fi \renewcommand{\itdefault}{sl} % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % % \begin{macro}{\cmrfamily} % \begin{macro}{\cmrdefault} % \begin{macro}{\textcmr} % \begin{macro}{\cmr} % We define \Lcs{cmrfamily} and \Lcs{cmrdefault} to change back to % Computer Modern Roman font, if so wanted. The macros \Lcs{textcmr} % and \Lcs{cmr} are the logical extensions of \Lcs{cmrfamily}. % \begin{macrocode} \DeclareRobustCommand\cmrfamily{% \not@math@alphabet\cmrfamily\relax% \fontencoding\cmrenc\fontfamily\cmrdefault\selectfont} \newcommand{\cmrdefault}{cmr} \newcommand{\cmrenc}{OT1} \DeclareTextFontCommand{\textcmr}{\cmrfamily} \DeclareOldFontCommand{\cmr}{\cmrfamily}{} \fi % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % \end{macro} %\iffalse % %\fi % \subsection{The Font Definition Files --- \texttt{*uni.fd}} % % These files is needed in the New Font Selection Scheme, used by % \LaTeXe{}, but really isn't nessecary for pure \TeX{} or \LaTeX2.09 % users, but since those are treathned races, I did put in the extra % effort and made the files. % % What they really do, is to speciffy what font driver file should be % loaded when the user swichtes font. Notice, alot of the font shapes % etc.\ avaliable in the Computer Modern Roman scheme isn't avaliable % in the \universal{} font, so we substitute with whatever is % closest, something from the \universal{} or Computer Modern % Roman scheme. % % The reason why the file names may look a bit wierd, is to make the % font conform to the standard set by \texttt{fontname} used by % \texttt{kpathsea} in most \TeX{}, \LaTeX{}, and \MF{} systems. % % \paragraph*{Math Encoding}\file{oml.fd} % First comes the the font definition file for \emph{math}, but since % no math characters is defined in the \universal{} font, we % substitute with the relevant fonts from Computer Modern Roman. %\iffalse %<*oml> %\fi % \begin{macrocode} \ProvidesFile{omluni.fd} [\unifiledate\space\unifileversion\space Non Standard LaTeX font definitions] \DeclareFontFamily{OML}{uni}{\skewchar\font127 } \DeclareFontShape{OML}{uni}{m}{n}{<-> ssub * cmm/m/it}{} \DeclareFontShape{OML}{uni}{m}{it}{<-> ssub * cmm/m/it}{} \DeclareFontShape{OML}{uni}{m}{sl}{<-> ssub * cmm/m/it}{} \DeclareFontShape{OML}{uni}{m}{sc}{<-> ssub * cmm/m/it}{} \DeclareFontShape{OML}{uni}{bx}{n}{<-> ssub * cmm/b/it}{} \DeclareFontShape{OML}{uni}{bx}{it}{<-> ssub * cmm/b/it}{} \DeclareFontShape{OML}{uni}{bx}{sl}{<-> ssub * cmm/b/it}{} \DeclareFontShape{OML}{uni}{bx}{sc}{<-> ssub * cmm/b/it}{} % \end{macrocode} %\iffalse % %\fi % % \paragraph*{Symbols Encoding}\file{omsuni.fd} % Next is the definitions for \emph{symbols} fonts, but as above, % there is no seperate symbol font defined for the \universal{} % font, so we substitute for default. %\iffalse %<*oms> %\fi % \begin{macrocode} \ProvidesFile{omsuni.fd} [\unifiledate\space\unifileversion\space Non Standard LaTeX font definitions] \DeclareFontFamily{OMS}{uni}{\skewchar\font48 } \DeclareFontShape{OMS}{uni}{m}{n}{<-> ssub * cmsy/m/n}{} \DeclareFontShape{OMS}{uni}{m}{it}{<-> ssub * cmsy/m/n}{} \DeclareFontShape{OMS}{uni}{m}{sl}{<-> ssub * cmsy/m/n}{} \DeclareFontShape{OMS}{uni}{m}{sc}{<-> ssub * cmsy/m/n}{} \DeclareFontShape{OMS}{uni}{bx}{n}{<-> ssub * cmsy/b/n}{} \DeclareFontShape{OMS}{uni}{bx}{it}{<-> ssub * cmsy/b/n}{} \DeclareFontShape{OMS}{uni}{bx}{sl}{<-> ssub * cmsy/b/n}{} \DeclareFontShape{OMS}{uni}{bx}{sc}{<-> ssub * cmsy/b/n}{} % \end{macrocode} %\iffalse % %\fi % % \paragraph*{Normal Encoding}\file{ot1uni.fd} % Now the definitions for the normal font. This \emph{is} ofcourse % defined, anything else would be ludicruis. It is very straight % forward most of the way. However, notice the substitutions at the % end of the file. % %\iffalse %<*ot1> %\fi % \begin{macrocode} \ProvidesFile{ot1uni.fd}% [\unifiledate\space\unifileversion\space Non Standard LaTeX font definitions] \DeclareFontFamily{OT1}{uni}{\hyphenchar\font45 } % \end{macrocode} % Next comes the specifications of what to load in \textunirm{normal % upright shape} % \begin{macrocode} \DeclareFontShape{OT1}{uni}{m}{n}{ <5><6><7><8>fulmr8 <9>fulmr9 <10><10.95>fulmr10 <12><14.4>fulmr12 <17.28><20.74><24.88>fulmr17 }{} % \end{macrocode} % Next comes the specifications of what to load in \textunisl{normal % slanted shape} % \begin{macrocode} \DeclareFontShape{OT1}{uni}{m}{sl}{ <5><6><7><8>fulmo8 <9>fulmo9 <10><10.95>fulmo10 <12><14.4>fulmo12 <17.28><20.74><24.88>fulmo17 }{} % \end{macrocode} % Now for \textunisc{small caps medium} definitions. % \begin{macrocode} \DeclareFontShape{OT1}{uni}{m}{sc}{ <5><6><7><8>fulmc8 <9>fulmc9 <10><10.95>fulmc10 <12><14.4>fulmc12 <17.28><20.74><24.88>fulmc17 }{} % \end{macrocode} % Now for \textunist{strict medium} definitions. % \begin{macrocode} \DeclareFontShape{OT1}{uni}{m}{st}{ <5><6><7><8>fulmst8 <9>fulmst9 <10><10.95>fulmst10 <12><14.4>fulmst12 <17.28><20.74><24.88>fulmst17 }{} % \end{macrocode} % Next comes the specifications of what to load in \textunibf{bold % face upright shape} % \begin{macrocode} \DeclareFontShape{OT1}{uni}{b}{n}{ <5><6><7><8>fulbr8 <9>fulbr9 <10><10.95>fulbr10 <12><14.4>fulbr12 <17.28><20.74><24.88>fulbr17 }{} % \end{macrocode} % Next comes the specifications of what to load in % \textunibsl{bold face slanted shape} % \begin{macrocode} \DeclareFontShape{OT1}{uni}{b}{sl}{ <5><6><7><8>fulbo8 <9>fulbo9 <10><10.95>fulbo10 <12><14.4>fulbo12 <17.28><20.74><24.88>fulbo17 }{} % \end{macrocode} % And \textunibsc{small caps bold face} definitions. % \begin{macrocode} \DeclareFontShape{OT1}{uni}{b}{sc}{ <5><6><7><8>fulbc8 <9>fulbc9 <10><10.95>fulbc10 <12><14.4>fulbc12 <17.28><20.74><24.88>fulbc17 }{} % \end{macrocode} % And \textunibst{strict bold face} definitions. % \begin{macrocode} \DeclareFontShape{OT1}{uni}{b}{st}{ <5><6><7><8>fulbst8 <9>fulbst9 <10><10.95>fulbst10 <12><14.4>fulbst12 <17.28><20.74><24.88>fulbst17 }{} % \end{macrocode} % % Now for the substitutions. This is straight forward, that % is, upright slanted is substituted by upright; bold face condensed, % and bold face extra is substituted by boldface; and italic by % slanted\footnote{As mentioned earlier, one of the characteristics % of this dont, is that it has no serifs, so it would be strange % to include italics in this font.}. % \begin{macrocode} \DeclareFontShape{OT1}{uni}{m}{it}{<->ssub*uni/m/sl}{} \DeclareFontShape{OT1}{uni}{m}{ui}{<->ssub*uni/m/n}{} \DeclareFontShape{OT1}{uni}{b}{it}{<->ssub*uni/b/sl}{} \DeclareFontShape{OT1}{uni}{bx}{n}{<->ssub*uni/b/n}{} \DeclareFontShape{OT1}{uni}{bx}{sl}{<->ssub*uni/b/sl}{} \DeclareFontShape{OT1}{uni}{bx}{sc}{<->ssub*uni/b/sc}{} \DeclareFontShape{OT1}{uni}{bx}{st}{<->ssub*uni/b/st}{} \DeclareFontShape{OT1}{uni}{bx}{it}{<->ssub*uni/b/sl}{} \DeclareFontShape{OT1}{uni}{bc}{ui}{<->ssub*uni/b/n}{} \DeclareFontShape{OT1}{uni}{sbc}{n}{<->ssub*uni/b/n}{} % \end{macrocode} %\iffalse % %\fi % % \paragraph*{T1 encoding}\file{t1uni.fd} % Since the T1 encoding relies on the font scheme of \texttt{exbase} % (EC fonts), and \texttt{dxbase} (DC fonts), by J\"org Knappen and % Nobert Schwartz, which is a whole new way of making fonts, that % requires some special messaures that I couldn't incorporate into the % \universal{} font without a whole lot of work, I chose not to % make support for the T1 scheme. Therefore this file issues a warning % and then exists the whole \LaTeX{} run. This may seem a bit drastic, % but it ensures that you don't get screwed up resuats. %\iffalse %<*t1> %\fi % \begin{macrocode} \ProvidesFile{t1uni.fd} [\unifiledate\space\unifileversion\space Non Standard LaTeX font definitions] \typeout{WARNING: universal font not avaliable in t1 definition.} \typeout{WARNING: exiting, correct your source.} \stop % \end{macrocode} %\iffalse % %\fi % % \paragraph*{U Encoding}\file{uuni.fd} % This is similar to the normal encoding above, execpt encoding is U. %\iffalse %<*u> %\fi % \begin{macrocode} \ProvidesFile{uuni.fd} [\unifiledate\space\unifileversion\space Non Standard LaTeX font definitions] \DeclareFontFamiliy{U}{uni}{\hyphenchar\font45} \DeclareFontShape{U}{uni}{m}{n}{ <5><6><7><8>fulmr8 <9>fulmr9 <10><10.95>fulmr10 <12><14.4>fulmr12 <17.28><20.74><24.88>fulmr17 }{} \DeclareFontShape{U}{uni}{m}{sl}{ <5><6><7><8>fulmo8 <9>fulmo9 <10><10.95>fulmo10 <12><14.4>fulmo12 <17.28><20.74><24.88>fulmo17 }{} \DeclareFontShape{U}{uni}{m}{sc}{ <5><6><7><8>fulmc8 <9>fulmc9 <10><10.95>fulmc10 <12><14.4>fulmc12 <17.28><20.74><24.88>fulmc17 }{} \DeclareFontShape{U}{uni}{m}{st}{ <5><6><7><8>fulmst8 <9>fulmst9 <10><10.95>fulmst10 <12><14.4>fulmst12 <17.28><20.74><24.88>fulmst17 }{} \DeclareFontShape{U}{uni}{b}{n}{ <5><6><7><8>fulbr8 <9>fulbr9 <10><10.95>fulbr10 <12><14.4>fulbf12 <17.28><20.74><24.88>fulbr17 }{} \DeclareFontShape{U}{uni}{b}{sl}{ <5><6><7><8>fulbo8 <9>fulbo9 <10><10.95>fulbo10 <12><14.4>fulbo12 <17.28><20.74><24.88>fulbo17 }{} \DeclareFontShape{U}{uni}{b}{sc}{ <5><6><7><8>fulbc8 <9>fulbc9 <10><10.95>fulbc10 <12><14.4>fulbc12 <17.28><20.74><24.88>fulbc17 }{} \DeclareFontShape{U}{uni}{b}{st}{ <5><6><7><8>fulbst8 <9>fulbst9 <10><10.95>fulbst10 <12><14.4>fulbst12 <17.28><20.74><24.88>fulbst17 }{} \DeclareFontShape{U}{uni}{m}{it}{<->ssub*uni/m/sl}{} \DeclareFontShape{U}{uni}{m}{ui}{<->ssub*uni/m/n}{} \DeclareFontShape{U}{uni}{b}{it}{<->ssub*uni/b/sl}{} \DeclareFontShape{U}{uni}{bx}{n}{<->ssub*uni/b/n}{} \DeclareFontShape{U}{uni}{bx}{sl}{<->ssub*uni/b/sl}{} \DeclareFontShape{U}{uni}{bx}{sc}{<->ssub*uni/b/sc}{} \DeclareFontShape{U}{uni}{bx}{st}{<->ssub*uni/b/st}{} \DeclareFontShape{U}{uni}{bx}{it}{<->ssub*uni/b/sl}{} \DeclareFontShape{U}{uni}{bc}{ui}{<->ssub*uni/b/n}{} \DeclareFontShape{U}{uni}{sbc}{n}{<->ssub*uni/b/n}{} % \end{macrocode} %\iffalse % %\fi %\iffalse %<*unibase> %\fi % % \section{The Font Macros and Programs} % % \subsection{Base file --- \texttt{unibase.mf}} % \file{unibase.mf} % \Newestchanges{v2.0}{98/08/01}{Base file \texttt{unibase.mf} swa the % light of day, providing many driver, font control, and drawing % macros.} % % This file defines all the macroes used in the source programs % for the font. I could have chosen to use \texttt{cmbase}, but % rather then defining a lot of variables that isn't used, I chose % to make a base file myself. Also, some af the drawing macros % presented here still needed to be defined. This file could be % made into a binary file, but I think that would be a bit to % much. % % First we define the variable \texttt{unibase}, to check later if % this file has been loaded. % \begin{macrocode} unibase := 1 ; string univer ; univer = "2.0" ; if proofing > 1 : message "Base file for font `universal', version " & univer ; fi % \end{macrocode} % Secondly, we define the variables \texttt{medium} and \texttt{bold} % to control the font serie to be produced. If \texttt{medium} is set % to \textsl{true} in the driver file, then a medium series % (\Lcs{mdseries}) font will be produced, while \texttt{bold} ofcourse % generates a boldface font. The medium serie may very well be % more suitiable for long texts then the default font. In $10pt$ % the default thickness of the pen is $\frac{5}{6}pt\approx 0.8pt$ % wide for the minuscles, and a bit wider for the majuscules. If % \texttt{medium} is \texttt{true} then it is $\frac{5}{9}pt\approx % 0.6pt$ wide. % % Booleans \texttt{slant} and \texttt{caps} is used to control the % shape of the font. If both is \textsl{false} a normal (upright) % shaped font (\Lcs{upshape}) font is generated. If \texttt{slant} or % \texttt{caps} is true, either a slanted (\Lcs{slshape}) or small % caps (\Lcs{scshape}) shaped font is generated. The values of these % booleans should be set in the driver file, \emph{before} any call to % \texttt{start\_font}. % \begin{macrocode} boolean medium , slant , bold , caps , strict ; medium := false ; slant := false ; bold := false ; caps := false ; strict := false ; % \end{macrocode} % And then the font is identified as \texttt{"universal"}. % \begin{macrocode} font_identifier:="universal"; % \end{macrocode} % % \subsubsection{Font macros} % % These macroes have to do with the general initialization and % production of the font. The macros needed later on is % \texttt{start\_font}, and \texttt{end\_font}. % % The general idea is, that as little as possible should be % defined in the driver file, so that the font will have a uniform % look in all series, shapes, and sizes. All that is needed in the % driver file is to define some of the above booleans to true, call % the macro \texttt{start\_font} giving it the size (in \texttt{pt\#}) % of the font as argument, include of source files, and call the macro % \texttt{end\_font}. % % \begin{fontmacro}{start\_font} % This is the macro for setting up the needed dimensions and % variables. First we take into acount the \textit{mode} used, by % calling \texttt{mode\_setup}, then we define the correct, % \textit{sharped} units, bassed on the argument to the macro, wich % should be the size of the font in \texttt{pt\#}. % \begin{macrocode} def start_font(expr size) = u# := size/18 ; mode_setup; x_h# := 8u# ; x_w# := 8u# ; m_w# := 11u# ; l_h# := 13u# ; p_d# := 5u# ; l_s# := 2u# ; r_s# := 2u# ; A_w# := 10u# ; M_w# := 14u# ; c_d# := 3u#/2 ; C_d# := 2u# ; % \end{macrocode} % We test to see, if any of the above booleans is set to % \textsl{true}, and if so, takes appropiate action. If % \texttt{medium} is set, the pens gets thinner, thereby producing % a lighter font. If \texttt{bold} the pens gets thicker, and so a % heavier font is produced. If \texttt{slant} is set, then the % inclination (\texttt{slantratio}) of the font is assigned. % % No other dimensions then the pen thickness should be differ among % the \emph{medium} and \emph{bold} font. However, two dimension % \texttt{c\_d} and \texttt{C\_d} is always set to the same value as % the pens would be in the current size, if the font to be made was % \emph{bold}. % % Also notice, that two different pens thicknesses is defined % \texttt{p\_t} and \texttt{P\_t}, so that the majuscules may come out % a bit thicker then the minuscles. Ofcourse this adds to the % complexity of the drawing macroes defined below, but in a very % straight forward way, so I dont't think it will be a problem. % % Then we set \texttt{currenttransform} to take into account the % varibale \texttt{slantratio}. % \begin{macrocode} if (medium and bold) : message "Font can't be both medium and bold, making medium font." ; medium := true ; fi; if medium : p_t# := 2u#/3 ; P_t# := u# ; P_T# := u# ; fi ; if bold : P_T# := 3u#/2 ; p_t# := 3u#/2 ; P_t# := 2u# ; fi ; a_h# := x_h#+p_t#/2 ; if (slant and (caps or strict)) : double_shape := 1 ; fi ; if (caps and (slant or strict)) : double_shape := 1 ; fi ; if (strict and (caps or slant)) : double_shape := 1 ; fi ; if known double_shape : message "Font cannot be two shapes, doing upright shape." ; slant := false ; caps := false ; strict := false ; fi ; if slant : slantratio := 1/6 ; else: slantratio := 0 ; fi ; currenttransform := identity slanted slantratio ; % \end{macrocode} % We need to set some paramteres for the Font Metric File % (\texttt{*.tfm}), so that \TeX{} knows how to typeset the characters % of the font. This is pretty straight, as desribed in the \MFbook{}. % \begin{macrocode} font_x_height 8u# ; font_quad 12u#+2u# ; font_normal_space 8u# ; font_normal_stretch 3u# ; font_normal_shrink 2u# ; font_extra_space 2u# ; font_coding_scheme:="TeX text" ; font_size 18u# ; % \end{macrocode} % Next we assigns some variables we need later on, defines the % \emph{un\/}sharped (mode dependent) units, declares some variables % for later use, and call the macro \texttt{do\_pens} to save the pens % needed by the font. % \begin{macrocode} spanish_shriek:=hex"3C" ; spanish_query:=hex"3E"; define_pixels(u,x_h,x_w,m_w,l_h,p_d,A_w,M_w,c_d,C_d,a_h); define_blacker_pixels(p_t,P_t,P_T); picture e_pic, a_pic ; do_pens ; % \end{macrocode} % The definitions of \texttt{extra\_beginchar} and % \texttt{extra\_endchar} is responsible for the extra stem width % of the font. Since this font is pretty uniform in width, we % can easily do this globally. I got the trick from \texttt{cmbase}, % where you instead use \texttt{adjust\_fit} after \texttt{beginchar}. % However, for the above reasons, and because it lessens the source % programs considerably, I chose to do it this way. % % The inclusion of the assignement % \begin{verbatim} % charcode := charcode + code_offset ; % \end{verbatim} % is for the small caps font, so that characters may be placed at % non--standard positions in the font. When we are not making a small % caps font, \texttt{code\_offset} should ofcourse be set to 0 (zero). % \begin{macrocode} extra_beginchar := extra_beginchar&"fit_font;" ; extra_endchar := extra_endchar& "end_fit_font;extra_proof_rules;charcode:=charcode+code_offset;" ; code_offset := 0 ; enddef; % \end{macrocode} % \end{fontmacro} % % \begin{fontmacro}{do\_pens} % This macro is used to set up the pens needed in this font. It is % called every time one of the dimensions \texttt{p\_t\#} or % \texttt{P\_t\#} is changed, since those are the \texttt{p/P}en % \texttt{t/T}hicknesses. % % Apart from saving a lot of time, as explained in the \MFbook{}, this % also garanties, that all pens are transformed correctly when the % font shape is \textsl{slanted}. % \begin{macrocode} def do_pens = clear_pen_memory ; pickup pencircle scaled P_T slanted slantratio ; UniPencir := savepen ; pickup pencircle scaled p_t slanted slantratio ; unipencir := savepen ; pickup pencircle scaled P_t slanted slantratio ; Unipencir := savepen ; pickup pensquare scaled P_T slanted slantratio ; UniPensqu := savepen ; pickup pensquare scaled p_t slanted slantratio ; unipensqu := savepen ; pickup pensquare scaled P_t slanted slantratio ; Unipensqu := savepen ; enddef ; % \end{macrocode} % \end{fontmacro} % % \begin{fontmacro}{fit\_font} % This is the macro that changes the width of the font. It is % derived from \texttt{cmbase}s \texttt{normal\_adjust\_fit}, though % used in a slightly different way here. As explained in the \MFbook, % this is a very nice macro, since it is essesially an add--on % feature. We still specify the width of character in % \texttt{beginchar}, and \texttt{w} is still this dimension. However, % extra space is added to the character at both the left and right, % so that characters don't get too close. % \begin{macrocode} def fit_font = l := -hround(l_s#*hppp) ; interim xoffset := -l ; charwd := charwd+l_s#+r_s# ; r := l+hround(charwd*hppp) ; w := r-hround(r_s#*hppp) ; italcorr charht*slantratio ; enddef; % \end{macrocode} % \end{fontmacro} % \begin{fontmacro}{end\_fit\_font} % Again, this is taken from \texttt{cmbase}, so that extra space is % added on the sides of the character. % \begin{macrocode} def end_fit_font = w := r+l ; enddef; % \end{macrocode} % \end{fontmacro} % % \begin{fontmacro}{extra\_proof\_rules} % When doing proofing, it is nice to have some extra rules on the % proofs, so that errors and mistakes are easiler seen. This macro % does just that. A verticatal rule is produced at the left and % right edge, and through the middle of the character. Horizontal % rules are produced at one quarter, half, and three quarters of the % character height. Also, if the charcter extence below the baseline, % a rule is produced at one half the depth. % \begin{macrocode} def extra_proof_rules = if proofing > 1 : for xa = l,r,w/2: proofrule((xa,-d), (xa,h)) ; endfor ; for ya = 0,h/4,h/2,3h/4,h: proofrule((l,ya), (r,ya)) ; endfor ; if d > 0 : proofrule((l,-d/2), (r,-d/2)) ; proofrule((l,-d), (r,-d)) ; fi fi enddef ; % \end{macrocode} % \end{fontmacro} % \begin{fontmacro}{end\_font} % \texttt{end\_font} is used at the end of the driver file, to set % ligatures, and end of the file. There is nothing fancy here. Do, % however, notice no `f' ligatures is defined, as in the Computer % Modern Roman. This is because they are not meant to be there, % because `ff' shouldn't come out as `\textunibf{f\kern-.25ex f}', % which looks bad, but rather as `\textunibf{ff}'. % % Also notice, that we haven't defined any characters \textunibf{``} % or \textunibf{''}, since we make these up of two \textunibf{`} or % \textunibf{'}. This gives us two more slots we can put other % characters into. % % Note, we preface the definition by \texttt{inner bye} so that we can % use this macro inside other macros (Kudo's to \TeX{}Live % developers). % % \begin{macrocode} inner bye; def end_font = ligtable "u" : "h" kern u# ; ligtable "f" : "f" kern 0 , "l" kern 0 , "i" kern 0 ; ligtable "o" : "l" kern u# ; ligtable "?" : "`" =: spanish_query ; ligtable "!" : "`" =: spanish_shriek ; ligtable "`" : "`" kern -l_s#-r_s#+p_t# ; ligtable "'" : "'" kern -l_s#-r_s#+p_t# , "?" kern 2u#, "!" kern 2u# ; ligtable "-" : "-" =: hex"7B" ; ligtable hex"7B" : "-" =: hex"7C" ; ligtable hex"22" : hex"22" kern -l_s#-r_s# ; ligtable hex"5C" : hex"5C" kern -l_s#-r_s# ; ligtable hex"20" : "l" kern -3c_d#*cosd(15)-p_t#*sind(15)-l_s#-r_s# , "L" kern -3c_d#*cosd(15)-p_t#*sind(15)-l_s#-r_s# ; bye enddef ; % \end{macrocode} % \end{fontmacro} % \begin{fontmacro}{do\_caps} % This next macro is for the \textunisc{small caps} version of the % font. Most of it is taken from \texttt{csc.mf} of the Computer % Modern Font, though not as many dimensions have been redefined in % this macro. The idea is to utilize this macro whenever you want to % make a small caps version of majuscles. This macro is used in both % \texttt{unilow.mf} and \texttt{unilig.mf}. % % The argument to \texttt{do\_caps} is the number the new characters % should be offset from it's original position in the font. % % The last \texttt{do\_pens} is needed, since the programs uses saved % pens, and we have just redefined the dimensions for the pens. % \begin{macrocode} def do_caps(expr offset) = sc_shrink := x_h#/l_h# ; P_t# := sc_shrink*P_t# ; l_h# := sc_shrink*l_h# ; A_w# := sc_shrink*A_w# ; M_w# := sc_shrink*M_w# ; C_d# := sc_shrink*C_d# ; code_offset := offset ; define_pixels(l_h,A_w,M_w,C_d) ; define_blacker_pixels(P_t) ; do_pens ; enddef ; % \end{macrocode} % \end{fontmacro} % \begin{fontmacro}{end\_do\_caps} % When ever we need to get back to the default setting of dimensions, % after the use of \texttt{do\_caps}, we call on this macro to do the % job. The idea is to multiply by \texttt{no\_shrink} which is the % reciprocal of \texttt{sc\_shrink}. % \begin{macrocode} def end_do_caps = no_shrink := 1/sc_shrink ; P_t# := no_shrink*P_t# ; l_h# := no_shrink*l_h# ; A_w# := no_shrink*A_w# ; M_w# := no_shrink*M_w# ; C_d# := no_shrink*C_d# ; code_offset := 0 ; define_pixels(l_h,A_w,M_w,C_d) ; define_blacker_pixels(P_t) ; do_pens ; enddef ; % \end{macrocode} % \end{fontmacro} % % \subsubsection{Control macroes} % % These macroes are designed to ease the control of individual % characters. % % \begin{fontmacro}{no\_adjust} % If a character is not supposed to have extra space on either side % you can say \texttt{no\_adjust} just before % \begin{quote} % \texttt{extra\_beginchar := extra\_beginchar\&"} % \meta{your begin char stuff}\texttt{";}\\ % \texttt{extra\_endchar := extra\_endchar\&"} % \meta{your stuff endchar stuff}\texttt{";}\\ % \texttt{beginchar(}\meta{usual arguments}\texttt{);} % \end{quote} % where the two string assigments are optional. % \begin{macrocode} def no_adjust= old_begin_adjust := extra_beginchar ; old_end_adjust := extra_endchar ; extra_beginchar := " " ; extra_endchar := "extra_proof_rules;charcode:=charcode+code_offset" ; enddef; % \end{macrocode} % \end{fontmacro} % % \begin{fontmacro}{restore\_adjust} % Use this command to restore automaticly adding extra space around % the characters. Must be used between a \texttt{endchar} and % \texttt{beginchar}. % \begin{macrocode} def restore_adjust= extra_beginchar := old_begin_adjust ; extra_endchar := old_end_adjust ; enddef; string old_begin_adjust, old_end_adjust ; % \end{macrocode} % \end{fontmacro} % % \subsubsection{Drawing macroes} % % I have made this macros for drawing, to ease up the writing of % source programs. They all simulate a pen of breadth \textit{thick} % always moving perpendecular to the current path. This is needed % in the \universal{} font, since all pen breadths are supposed % to be equal anywhere (at least within a paricular `group'), in any % direction. % % All of the macros heavely use \texttt{penpos}, so the use % is pretty reliant on the appropiate use of this macro. This % put some restrictions on the arguments, since \texttt{penpos} % deals with angles of all sorts. % % In the macroes, we use vectors with number $m$, as assigened in the % last argument of the macros. $m$ should be assigend so that the % vectors $m,m+1,\ldots,m+4$ does not conflict with already assigned % vectors, or vectors to be assigend in the current picture. % % Though it may seem a somewhat \textit{ad hoc} solution, it is the % best way I could think of. Ofcourse I could check to see what % vectors are defined, and then use some others, but that would % complicate the code unessecary, and since the idea is to hide the % actual vector operations in the macros, I descided to use the % course. % % (No labels are produced on the proofsheets by this macroes, % since they use very high numbers, which is rather destracting.) % % \begin{fontmacro}{unicir} % Draws a circle of outer radius \texttt{rad}, and centered at % \texttt{center}, which shoud be a pair. Notice, no effort is % made to keep the circle within the character, so the use of % this macro, should be governed with some caution. % % The second argument is the \emph{thickness} of the pen drawing the % segment. % % The last argument \texttt{m} is to insure the uniqueness of % all pairs. That is, if you need more then one circle in a letter, % then \texttt{m} should take different values for each circle, so that % $m_{i}-m_{i+1}>4$. Also \texttt{m} should not take any value % corrosponing to vectors already defined. This is most easily done if % \texttt{m} is asigned a large value, like say a multipla of 10, or % even 100. % \begin{macrocode} def unicir(expr rad, thick, center, m)= pickup pensquare scaled thick; top z[m] = (0,rad) + center ; penpos[m](thick,90) ; lft z[m+1] = (-rad,0) + center ; penpos[m+1](thick,180) ; bot z[m+2] = (0,-rad) + center ; penpos[m+2](thick,270) ; rt z[m+3] = (rad,0) + center ; penpos[m+3](thick,0) ; penstroke z[m]e{left}..z[m+1]e{down}.. z[m+2]e{right}..z[m+3]e{up}..cycle ; penlabels(range m thru m+3); enddef; % \end{macrocode} % \end{fontmacro} % % \begin{fontmacro}{uniarc} % Produce a segment of a circle, with radius \texttt{rad}, and % centered at \texttt{center}. % % The size of the segment is determind by the arguments % \texttt{ang\_a} and \texttt{ang\_b}, consider as angles from a % horizontal linesegment from \texttt{center} traveling right. That % means you should specify the angles in at counter--clockwise way, % and between -360 and 360. \texttt{ang\_b} \emph{must} be bigger then % \texttt{ang\_a}, otherwise the output is totally unpredictiable. % % The second argument is the \emph{thickness} of the pen drawing the % segment, Again the last argument \texttt{m} is to insure the % uniqueness of the vectors. The comments above on the argument also % applies here. % \begin{macrocode} def uniarc(expr rad, thick, center, ang_a, ang_b, m)= pickup pensquare scaled thick ; path arc.l, arc.r, arc.e ; n:=m ; ang_c := abs(ang_b-ang_a) ; % \end{macrocode} % First we check to see, if the user somehow requested an arc of more % then $360^\circ$. If so, we just call \texttt{unicir}, since this is % properly intended. If not, we go on to define relevant vectors. % \begin{macrocode} if ang_c >= 360 : unicir(rad,center,n) ; else: % \end{macrocode} % We acctualy define the vectors as if we started in the arc on the % positiv $x$--axis, considering \texttt{center} as origo, an then % latter on turn the arc the appropiate angle. Notice the heavy use of % \texttt{penpos} and \texttt{[ ]} to evaluate variable \texttt{m}. % \begin{macrocode} top z[n] = (0,rad) + center ; penpos[n](thick,90) ; arc.r := z[n]r{left} ; arc.l := z[n]l{left} ; % \end{macrocode} % The next \texttt{if...fi} loop ensures we don't define a % whole lot of useless vectors. The \MF{} primitiv path macro % \texttt{...} does a very good job at approching a segment of a % circle even if only two points are defined in an interval of % $90^\circ$, if we at the same time utilizes the direction mechanisme % of \MF{}. % \begin{macrocode} if ang_c > 90 : n := n+1 ; lft z[n] = (-rad,0) + center ; penpos[n](thick,180) ; arc.r := arc.r&z[n-1]r..z[n]r{down} ; arc.l := arc.l&z[n-1]l..z[n]l{down} ; if ang_c > 180 : n := n+1 ; bot z[n] = (0,-rad) + center ; penpos[n](thick,270) ; arc.r := arc.r&z[n-1]r..z[n]r{right} ; arc.l := arc.l&z[n-1]l..z[n]l{right} ; if ang_c > 270 : n := n+1 ; rt z[n] = (rad,0) + center ; penpos[n](thick,0) ; arc.r := arc.r&z[n-1]r..z[n]r{up} ; arc.l := arc.l&z[n-1]l..z[n]l{up} ; fi ; fi ; fi ; % \end{macrocode} % After the \texttt{if} loop, we define the final point, make the % complete path, and finishes off by drawing the arc, turned the % appropiate angle. % \begin{macrocode} n:=n+1 ; z[n] = z[m] rotatedabout(center,ang_c) ; penpos[n](thick,90+ang_c) ; arc.r := arc.r&z[n-1]r..z[n]r{dir(180+ang_c)} ; arc.l := arc.l&z[n-1]l..z[n]l{dir(180+ang_c)} ; arc.e := arc.l--reverse arc.r--cycle; fill (arc.e rotatedabout(center,-90+ang_a)); fi; penlabels(range m thru n); enddef; % \end{macrocode} % Notice the use of two paths, and reversal of one. This is % essentially what the \texttt{plain.mf} macro \texttt{penstroke} % does. However, that macro couldn't be used here, since we are % building a path on the fly, so every step is needed to be fully % known, and \texttt{penstroke} makes new variables to do the job. % % Also, we use the integer \texttt{n} for surfixes, since this % limits the creation of vectors, and eases the path building. % \end{fontmacro} % % \begin{fontmacro}{uniend} % This macro is somewhat similar to \texttt{uniarc} above, but has a % different use. Where \texttt{uniarc} is intended for arcs with a % radius bigger then the pen thickness, this macro is intended for % arcs with a radius of exactly same size as the pen thickness, hence % this macro produces a \emph{filled} segment of a circle with a % radius of the current pen thickness. % % This macro, like \texttt{uniarc}, takes 5 arguments: the radius of % the arc; the center of the arc, which should be of type % \texttt{pair}; the starting and ending angle; plus the first number % of the vectors needed to draw this figure. The considerations above % in \texttt{uniarc} conserning the angles also apply here. % % Notice once again the use of \texttt{if..fi} loops to define the % relevant vectors and paths. % \begin{macrocode} def uniend(expr rad, center, ang_a, ang_b, m)= path arc ; n:=m ; ang_c := abs(ang_b-ang_a) ; if ang_c >= 360 : Rad := 2*rad ; pickup pencircle scaled Rad ; z[n]=center ; drawdot z[n] ; else: z[n] = (0,rad) + center ; arc := center{up}--z[n]{left} ; if ang_c > 90 : n := n+1 ; z[n] = (-rad,0) + center ; arc := arc&z[n-1]..z[n]{down} ; if ang_c > 180 : n := n+1 ; z[n] = (0,-rad) + center ; arc := arc&z[n-1]..z[n]{right} ; if ang_c > 270 : n := n+1 ; z[n] = (rad,0) + center ; arc := arc&z[n-1]..z[n]{up} ; fi ; fi ; fi ; n := n+1 ; z[n] = z[m] rotatedabout(center,ang_c) ; arc := arc&z[n-1]..z[n]{dir(180+ang_c)}--cycle ; fill (arc rotatedabout(center,-90+ang_a)); fi; penlabels(range m thru n); enddef; % \end{macrocode} % Notice, once more we are building a path on the fly, so some caution % was used here. Again the \texttt{plain.mf} macro \texttt{penstroke} % doesn't do the job here. This is because only a part of a stroke is % actually wanted. You might think then, that the \texttt{plain.mf} % macro \texttt{cutoff} then would do the job, but in my experience % that macro has some serious flaws\footnote{A quick use of the Unix % command \texttt{grep} on most of the Computer Modern Fonts reveals % that \texttt{cutoff} is \emph{never} used, which I take to % indicate its weakness.}. % \end{fontmacro} % % \begin{fontmacro}{unilne} % This macro is intended for drawing non--vertical or horizontal % lines, since this is easily done with \texttt{draw}. It takes % six arguments, the thickness of the pen drawing the line, the % starting point of the line (\texttt{start}), the ending point of % line (\texttt{stop}), which should be higher and more to the right % then the starting point, and the cutoff--style % (\texttt{endcutstart, endcutstop}). % If \texttt{endcut}$x$ is positiv, then, the line is cut off % horizontally at the relevant point $x$. % % If \texttt{endcut}$x$ is negativ, then, the line is cut off % vertically at $x$. % % If it is zero, then the line is cut off perpendicular to the slant % of the line at $x$. % % Also, if \texttt{endcut}$x$ is zero, the starting point is the % point corrosponding to the lowest height and leftmost width, and the % ending point corrosponds to the heighest height and rightmost width % of the line. Again \texttt{m} insures unique vectors. % \begin{macrocode} def unilne(expr thick, start, stop, endcutstart, endcutstop, m)= pickup pensquare scaled thick; if endcutstart = endcutstop : if endcutstart = 0 : lft bot z[m] = start ; rt top z[m+1] = stop ; ang_c := angle(z[m+1]-z[m]) ; penpos[m](thick,-90+ang_c) ; penpos[m+1](thick,-90+ang_c) ; elseif endcutstart > 0 : lft z[m] = start ; rt z[m+1] = stop ; ang_c := angle(z[m+1]-z[m]) ; penpos[m](thick/sind(ang_c),0) ; penpos[m+1](thick/sind(ang_c),0) ; elseif endcutstart < 0: bot z[m] = start ; top z[m+1] = stop ; ang_c := angle(z[m+1]-z[m]) ; penpos[m](thick/cosd(ang_c),90) ; penpos[m+1](thick/cosd(ang_c),90) ; fi; penstroke z[m]e--z[m+1]e ; else : message "Different endcuts on unilne not implemented yet."; fi; n := m + 1 ; penlabels(range m thru n); enddef; % \end{macrocode} % \end{fontmacro} % %\iffalse % %\fi % %\iffalse %<*low> %\fi % \subsection{The Minuscles (lowercase letters) --- \texttt{unilow.mf}} % \file{unilow.mf} % % \Newestchanges{v2.0}{98/08/01}{All of \texttt{unilow.mf} is defined % within a conditional, to ease the generation of the small caps % shaped fonts.} % This whole file is loaded only conditionally to make the generation % of small caps font easier. % \begin{macrocode} if not caps : % \end{macrocode} % \begin{fontcode}{a} % The letter \textunibf{a} is interresting in the sense, that the bottom % part of the curve, is \emph{not} a segement of an arc. The exact % curvature of this part, is controversial; some font designers have % chosen to make it a segement of an arc, making all of the curve, a % circle; while others have chosen to make it a straight line. I % decided to take the middleroad, since it appeals more to me % aestheticly, even though it deviates from the principle of building % all characters from the two simple forms: the cirle and the line. % % The \textuni{a} is also saved in the picture variable % \texttt{a\_pic}, for use in \texttt{unilig.mf}. % \begin{macrocode} beginchar("a",x_w#,x_h#,0); "The letter a"; uniarc(w/2,p_t,(w/2,h/2),0,290,10); pickup unipensqu ; z1 = ((cosd(290)*(w-p_t)+w)/2,(sind(290)*(w-p_t)+w)/2); z2 = (w-p_t/2,2h/5) ; penpos1(p_t,-70); penpos2(p_t,-45); fill z1l{dir(20)}..z2l{dir(45)}-- z2r{dir(225)}..z1r{dir(200)}--cycle; top rt z3 = (w,.5h) ; bot rt z4 = (w,0) ; draw z3{down}--z4 ; penlabels(1,2,3,4); a_pic := currentpicture ; endchar; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{b} % There is not much to say about this letter, only that it is a % \textunibf{d} reflected through the vertical center axis. % \begin{macrocode} beginchar("b",x_w#,l_h#,0); "The letter b"; unicir(w/2,p_t,(w/2,w/2),10); pickup unipensqu ; lft bot z1 = (0,w/2) ; lft top z2 = (0,h) ; draw z1{up}--z2 ; penlabels(1,2); endchar; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{c} % This is a rather short program, but is interresting, since some care % has to be taken, when assigning the width. Since a \textunibf{c} is not % a full cirle, but only a segment opening towards the right, it would % look wrong, if the letter was as wide, as it is tall. % \begin{macrocode} beginchar("c",x_w#*(1+cosd(30))/2,x_h#,0); "The letter c"; uniarc(h/2,p_t,(h/2,h/2),30,330,10); endchar; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{d} % A flipped \textunibf{b} --- that's it! % \begin{macrocode} beginchar("d",x_w#,l_h#,0); "The letter d"; unicir(w/2,p_t,(w/2,w/2),10); pickup unipensqu ; rt bot z1 = (w,w/2) ; rt top z2 = (w,h) ; draw z1{up}--z2 ; penlabels(1,2); endchar; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{e} % Notice the middle bar. The arc can not go all the way down to the % bar, because then the \textunibf{e} would end in a arc, on the right % side. We want a flat end, so an extra dot has to be made. % % The \textuni{e} is also saved in the picture variable % \texttt{e\_pic}, for use in \texttt{unilig.mf}. % \begin{macrocode} beginchar("e",x_w#,x_h#,0); "The letter e"; uniarc(w/2,p_t,(w/2,h/2),0,330,10); temp := p_t/2 ; pickup pensquare xscaled p_t yscaled temp slanted slantratio ; top rt z1 = (w,h/2) ; drawdot z1 ; pickup unipensqu ; z2 = (p_t,h/2) ; z3 = (w-p_t,h/2) ; draw z2--z3 ; penlabels(1,2,3); e_pic := currentpicture ; endchar; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{f} % The horizontal placement of the bar is somewhat controversial. I % think it looks best if it is placed, so that the top of the bar, is % at the same height, as the top of an \textunibf{x}, that is $1ex$. % \begin{macrocode} beginchar("f",4p_t#,l_h#,0); "The letter f"; uniarc(3/4w,p_t,(3/4w,h-3/4w),90,180,10); pickup unipensqu ; top rt z1 = (w,h) ; drawdot z1 ; lft top z2 = (0,h-3/4w) ; bot lft z3 = (0,0) ; draw z2--z3 ; top lft z4 = (0,x_h) ; top rt z5 = (w,x_h) ; draw z4--z5 ; penlabels(1,2,3,4,5); endchar; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{g} % The \textunibf{g} is a very good measure of how low ascenders should % go. Some might want to add a square on top of the ascender, so that % the letter ended in flat to the right, but I found it displeacing, % and therefore left it out. % \begin{macrocode} beginchar("g",x_w#,x_h#,p_d#); "The letter g" ; uniarc(w/2,p_t,(w/2,h/2),30,360,10) ; pickup unipensqu ; top rt z1 = (w,h/2) ; bot rt z2 = (w,-d) ; draw z1--z2; penlabels(1,2); endchar; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{h} % It can be argued, that this letter is too wide. However, I decieded % to weight the concept of homongeious circles higher in this case. % \begin{macrocode} beginchar("h",x_w#,l_h#,0); "The letter h" ; uniarc(w/2,p_t,(w/2,w/2),0,180,10) ; pickup unipensqu ; top lft z1 = (0,h) ; bot lft z2 = (0,0) ; draw z1--z2 ; top rt z3 = (w,x_h-w/2) ; bot rt z4 = (w,0) ; draw z3--z4 ; penlabels(1,2,3,4) ; endchar; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{i} % Quite a simple letter, though it can be argued wether the dot should % be square, or as here circular. % \begin{macrocode} beginchar("i",p_t#,l_h#,0) ; "The letter i" ; pickup unipensqu ; top lft z1 = (0,x_h) ; bot lft z2 = (0,0) ; draw z1--z2 ; pickup unipencir ; top lft z3 = (0,h) ; drawdot z3 ; penlabels(1,2,3) ; endchar; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{j} % No left stem is added at the bottom, since it isn't needed! % \begin{macrocode} beginchar("j",p_t#,l_h#,p_d#); "The letter j" ; pickup unipensqu ; top lft z1 = (0,x_h) ; bot lft z2 = (0,-d) ; draw z1--z2 ; pickup unipencir ; top lft z3 = (0,h) ; drawdot z3 ; penlabels(1,2,3) ; endchar; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{k} % Again, this letter is narrower then most of the letters. This is % because, the to arcs isn't full halfarcs, but rather quarterarcs. % \begin{macrocode} beginchar("k",(x_h#+3p_t#)/2,x_h#,0) ; "The letter k" ; uniarc((h+p_t)/2,p_t,(p_t,h),270,360,10) ; uniarc((h+p_t)/2,p_t,(p_t,0),0,90,20) ; pickup unipensqu ; top lft z1 = (0,h) ; bot lft z2 = (0,0) ; draw z1--z2 ; penlabels(1,2); endchar; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{l} % What is a line, but a line! Well right now it is an `l'. You may % wonder why no stems are added, to destingish an `l' from a vertical % bar, as in math mode. Well, how often will you put a math vertical % bar next to an text `l'. % \begin{macrocode} beginchar("l",p_t#,l_h#,0) ; "The letter l" ; pickup unipensqu ; top lft z1 = (0,h) ; bot lft z2 = (0,0) ; draw z1--z2; penlabels(1,2); endchar; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{m} % This proved more tricky then I thought. Originally, I wanted the arc % of the \textunibf{n} to be as high as those of the \textunibf{m}. This % meant, that either the \textunibf{n} should be very narrow, or the % \textunibf{m} very wide; either way it wouldn't look good. So after a % few experiments, I decided for the current form. % \begin{macrocode} beginchar("m",m_w#,x_h#,0) ; "The letter m" ; temp := .25*(w+p_t); uniarc(temp,p_t,(temp,h-temp),0,180,10) ; uniarc(temp,p_t,(w-temp,h-temp),0,180,20) ; pickup unipensqu ; top lft z1 = (0,h-temp) ; bot lft z2 = (0,0) ; draw z1--z2 ; top z3 = (w/2,h-temp) ; bot z4 = (w/2,0) ; draw z3--z4 ; top rt z5 = (w,h-temp) ; bot rt z6 = (w,0) ; draw z5--z6 ; penlabels(1,2,3,4,5,6); endchar; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{n} % Tricky because of the \textunibf{m} (see above). % \begin{macrocode} beginchar("n",x_w#,x_h#,0); "The letter n" ; uniarc(w/2,p_t,(w/2,h-w/2),0,180,10) ; pickup unipensqu ; top lft z1 = (0,h-w/2) ; bot lft z2 = (0,0) ; draw z1--z2 ; top rt z3 = (w,h-w/2) ; bot rt z4 = (w,0) ; draw z3--z4 ; penlabels(1,2,3,4) ; endchar; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{o} % Well, this is just a circle, nothing fancy. Why not make it oval, % you say. I say, listen --- Herbert Bayer just turned in his grave! % \begin{macrocode} beginchar("o",x_w#,x_h#,0) ; "The letter o"; unicir(w/2,p_t,(w/2,h/2),10); endchar; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{p} % Try to flip the \textunibf{b} horizontally, and tell me what you get? % \begin{macrocode} beginchar("p",x_w#,x_h#,p_d#) ; "The letter p" ; unicir(w/2,p_t,(w/2,w/2),10); pickup unipensqu ; lft top z1 = (0,h/2) ; lft bot z2 = (0,-d) ; draw z1--z2 ; penlabels(1,2); endchar; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{q} % Why not try to destingish the \textunibf{q} more from the \textunibf{g}? % Well if you look at the two letters, I think, you will get the % answer. Also, my intuition of a \textunibf{q} is that of a reflected % \textunibf{p}, but that is just \emph{my} intuition! % \begin{macrocode} beginchar("q",x_w#,x_h#,p_d#) ; "The letter q" ; unicir(w/2,p_t,(w/2,w/2),10); pickup unipensqu ; rt top z1 = (w,h/2) ; rt bot z2 = (w,-d) ; draw z1--z2 ; penlabels(1,2); endchar; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{r} % Well that is really simplle, but illustrates a fine point --- why % use more strokes, when fewer is needed? % \begin{macrocode} beginchar("r",3p_t#,x_h#,0) ; "The letter r" ; uniarc(w,p_t,(w,h-w),90,180,10) ; pickup unipensqu ; top lft z1 = (0,h-w) ; bot lft z2 = (0,0) ; draw z1--z2; penlabels(1,2); endchar; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{s} % \Newestchanges{v2.0}{98/08/01}{Considerable simplifications.} % This is a `slow' letter, i.e.\ it takes \MF{} quite some time to % compute. The reason is simple --- a \emph{lot} of curves is drawn. % \begin{macrocode} beginchar("s",x_w#,x_h#,0) ; "The letter s" ; temp := (h+p_t)/4 ; uniarc(temp,p_t,(temp,temp),180,270,10) ; uniarc(temp,p_t,(w-temp,temp),270,450,20) ; uniarc(temp,p_t,(temp,h-temp),90,270,30) ; uniarc(temp,p_t,(w-temp,h-temp),0,90,40) ; pickup unipensqu ; bot lft z1 = (temp,0) ; bot rt z2 = (w-temp,0) ; draw z1--z2 ; lft z3 = (temp,h/2) ; rt z4 = (w-temp,h/2) ; draw z3--z4 ; top lft z5 = (temp,h) ; top rt z6 = (w-temp,h) ; draw z5--z6 ; penlabels(1,2,3,4,5,6) ; endchar; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{t} % As I argued before, the placement of the bar in the \textunibf{f} and % \textunibf{t} is controversial. % \begin{macrocode} beginchar("t",p_t#+2c_d#,l_h#,0); "The letter t" ; pickup unipensqu ; top z1 = (w/2,h) ; bot z2 = (w/2,0) ; draw z1--z2 ; top lft z3 = (0,x_h) ; top rt z4 = (w,x_h) ; draw z3--z4 ; penlabels(1,2,3,4); endchar; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{u} % Flip a letter here, and flip a letter there --- all in a days work % of a font designer! % \begin{macrocode} beginchar("u",x_w#,x_h#,0); "The letter u" ; uniarc(w/2,p_t,(w/2,w/2),180,360,10) ; pickup unipensqu ; top lft z1 = (0,h) ; bot lft z2 = (0,w/2) ; draw z1--z2 ; top rt z3 = (w,h) ; bot rt z4 = (w,w/2) ; draw z3--z4 ; penlabels(1,2,3,4) ; endchar; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{v} % The lines and the arc doesn't intersect in a flowing way, but the % error is so small it will not be seen in normal use. However, if % the font is maginified to, say $70pt$, it might be a problem. I % hope to get into this, some time in the future. For now, make do. % \begin{macrocode} beginchar("v",x_w#,x_h#,0); "The letter v" ; unilne(p_t,(0,h),(w/2,p_t),1,1,10); unilne(p_t,(w/2,p_t),(w,h),1,1,20); uniarc(p_t,p_t,(w/2,p_t),180,360,30); endchar; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{w} % Flippedy--flop. % \begin{macrocode} beginchar("w",m_w#,x_h#,0) ; "The letter w" ; temp := .25*(w+p_t); uniarc(temp,p_t,(temp,temp),180,360,10) ; uniarc(temp,p_t,(w-temp,temp),180,360,20) ; pickup unipensqu ; top lft z1 = (0,h) ; bot lft z2 = (0,temp) ; draw z1--z2 ; top z3 = (w/2,h) ; bot z4 = (w/2,temp) ; draw z3--z4 ; top rt z5 = (w,h) ; bot rt z6 = (w,temp) ; draw z5--z6 ; penlabels(1,2,3,4,5,6); endchar; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{x} % This is a bit tricky --- the two arces are each half the width wide, % but since they share middle part, they leave the width of the % strokes uncoverd. To remedy this problem, four dots are drawn. It % would be silly, if the \textunibf{x} wasn't as wide as it is tall, % namely \texttt{x\_w}. % \begin{macrocode} beginchar("x",x_w#,x_h#,0) ; "The letter x" ; uniarc(h/2,p_t,(p_t/2,h/2),270,90,10); uniarc(h/2,p_t,(w-p_t/2,h/2),90,270,20); temp := (w-h+p_t)/2 ; pickup pensquare xscaled temp yscaled p_t slanted slantratio ; lft top z1 = (0,h) ; drawdot z1 ; lft bot z2 = (0,0) ; drawdot z2 ; rt top z3 = (w,h) ; drawdot z3 ; rt bot z4 = (w,0) ; drawdot z4 ; penlabels(1,2,3,4); endchar; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{y} % Flip an reflect, or just turn, it's all the same, it will still be a % transformation of an \textunibf{h} % \begin{macrocode} beginchar("y",x_w#,x_h#,p_d#); "The letter y" ; uniarc(w/2,p_t,(w/2,w/2),180,360,10) ; pickup unipensqu ; top lft z1 = (0,h) ; bot lft z2 = (0,w/2); draw z1--z2 ; top rt z3 = (w,h) ; bot rt z4 = (w,-d) ; draw z3--z4 ; penlabels(1,2,3,4) ; endchar; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{z} % This is a bit tricky letter, since what I wanted was for middle line % to have an inclination such that its edges would be tangents to the % circle segments at the endpoints of the horizontal lines. I tried to % solve this problem analytically, but gave up. I also tried to use % some of \texttt{plain.mf}'s macros, but none of them gave me the % resulat I wanted. So I finally made the approximation seen below. % If you can come up with a good solution to this problem, please let % me know. % \begin{macrocode} beginchar("z",x_w#,x_h#,0) ; "The letter z" ; pickup unipensqu ; top lft z1 = (0,h) ; top rt z2 = (w-p_t,h) ; draw z1--z2 ; bot lft z3 = (p_t,0) ; bot rt z4 = (w,0) ; draw z3--z4 ; phi := angle((w,h-p_t)-(0,p_t)) ; % Uuuuupps !?!!!!!! z5 = (p_t,p_t) ; z6 = z5 + p_t*(-sind(phi),cosd(phi)) ; z7 = (w-p_t,h-p_t) ; z8 = z7 + p_t*(sind(phi),-cosd(phi)) ; uniend(p_t,z5,90+phi,270,10); uniend(p_t,z7,-90+phi,90,20); fill z5--z6--z7--z8--cycle ; penlabels(range 1 thru 8); endchar; % \end{macrocode} % \end{fontcode} % As explain in the begining of the section, this file is one big % \texttt{if...else...fi} loop to mak the generation of the small caps % font easier. % % The idea is, that if \texttt{caps} is % \texttt{true}, then the main part of this file shouldn't be used, % but rather \texttt{uniupp.mf} should be loaded again, but with % different diffintions of dimensions for uppercase letters, so that % they come out as small as lowercase letters, hence --- small % caps. % % This is done by the macro \texttt{do\_caps}, which we utilies % inside a group, so that the changes made by \texttt{do\_caps} will be % undone after the group, and hence not affect the rest of the font. % % \begin{macrocode} else : do_caps(ASCII"a" - ASCII"A") ; input uniupp ; end_do_caps ; fi ; % \end{macrocode} %\iffalse % %\fi %\iffalse %<*upp> %\fi % \subsection{The Majuscles (uppercase letters) --- \texttt{uniupp.mf}} % \file{uniupp.mf} % % As noted earlier, Herbert Bayer never did design any majuscles, % since he considered them useless. However, majuscles are avaliable % in the current implentation and are to be used at your lesuire. Of % course, if you agree with the Bauhaus school, and think uppercase % letters are useless, you shouldn't use them. Then, perhaps, you % should also refrain from using non--standard letters shuch as German % double s, Scandinavian ligatures, Spanish schriek, and perhaps even % accents of any kind. This may seem a little drastic, but the % train--of--tought should be clear: Why use letters and symbols that % are in the best case obsolete, and in the worst useless or without % significans? % % \Newestchanges{v2.0}{98/08/01}{All of \texttt{unilow.mf} is defined % within a conditional, to ease the generation of the strict shaped % fonts.} % % To facilitate a use of the \universal{} font conforming to Bayers' % original idea, that is without majusceles this file is loaded only % under the condition that \texttt{strict} is \emph{false}. % \begin{macrocode} if not strict : % \end{macrocode} % \begin{fontcode}{A} % It can be argued where the bar should be placed. I choose place it % the middle, since most of the majuscles tend to have a symmetry axis % long this line, so I thought it apropiate to follow this line of % thought. Ofcourse, I'm the only one to blane for this, since Herbert % Bayer \emph{never} designed any majuscles! (So flame me for % guessing). % \begin{macrocode} beginchar("A",A_w#,l_h#,0); "The letter A"; uniarc(w/2,P_t,(w/2,h-w/2),0,180,10); pickup Unipensqu ; top lft z1 = (0,h-w/2) ; bot lft z2 = (0,0) ; draw z1--z2 ; top rt z3 = (w,h-w/2) ; bot rt z4 = (w,0) ; draw z3--z4 ; lft z5 = (0,h/2) ; rt z6 = (w,h/2) ; draw z5--z6 ; penlabels(1,2,3,4,5,6); endchar; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{B} % This letter is somewhat tricky, since it is not clear wether the % arces should be placed directly on the left down stoke, or there % should be some distance filled with horizontal bars. I chose the % second solution, even though it isn't the most simple, and hence in % better agrement with the concept of this font design. However, the % first solution does make the letter very narrow compared with some % of the other letters. % \begin{macrocode} beginchar("B",A_w#,l_h#,0) ; "The letter B" ; rad := 1/4(h+P_t) ; uniarc(rad,P_t,(w-rad,h-rad),-90,90,10) ; uniarc(rad,P_t,(w-rad,rad),-90,90,20) ; uniend(P_t,(P_t,h-P_t),90,180,30) ; uniend(P_t,(P_t,P_t),180,270,40) ; pickup Unipensqu ; top lft z1 = (0,h-P_t) ; bot lft z2 = (0,P_t) ; draw z1--z2 ; top lft z3 = (P_t,h) ; top rt z4 = (w-rad,h) ; draw z3--z4 ; lft z5 = (P_t,h/2) ; rt z6 = (w-rad,1/2h) ; draw z5--z6 ; bot lft z7 = (P_t,0) ; bot rt z8 = (w-rad,0) ; draw z7--z8 ; penlabels(range 1 thru 8); endchar; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{C} % This is really simple, since it is just an enlargement of the % corresponding minuscule, so the is really nothing interresting % here. % \begin{macrocode} beginchar("C",l_h#*(1+cosd(30))/2,l_h#,0); "The letter C"; uniarc(h/2,P_t,(h/2,h/2),30,330,10); endchar; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{D} % As with the B, there are two ways to do this letter: One way would % be to make the arc a true half segment of a circle, the other would % be to compose it of two quarter segments, joined by a vertical % line. The second solution also entails, that two horizontal lines % should connect the two quarter circles with the left vertical % line. Again I chose the simple solution, which --- ofcourse --- % amounts to the first mentioned above. % \begin{macrocode} beginchar("D",A_w#,l_h#,0); "The letter D"; uniarc(1/2h,P_t,(w-1/2h,1/2h),-90,90,10); uniend(P_t,(P_t,h-P_t),90,180,20); uniend(P_t,(P_t,P_t),180,270,30); pickup Unipensqu ; top lft z1 = (0,h-P_t) ; bot lft z2 = (0,P_t) ; draw z1--z2 ; top lft z3 = (P_t,h) ; top rt z4 = (w-1/2h,h) ; draw z3--z4 ; bot lft z5 = (P_t,0) ; bot rt z6 = (w-1/2h,0) ; draw z5--z6 ; penlabels(1,2) ; endchar; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{E} % It can be argued, that the middle bar should be shorter then the top % and bottom bar, but since this only complicates things, I chose not % to do so. However, I am not going to be stuborn on this, and it may % well prove to be better aestethics, if the middle bar is shortend. % \begin{macrocode} beginchar("E",A_w#,l_h#,0); "The letter E" ; uniend(P_t,(P_t,h-P_t),90,180,10); uniend(P_t,(P_t,P_t),180,270,20); pickup Unipensqu ; lft top z1 = (P_t,h) ; rt top z2 = (w,h) ; draw z1--z2 ; lft z3 = (P_t,h/2) ; rt z4 = (w,h/2) ; draw z3--z4 ; lft bot z5 = (P_t,0) ; rt bot z6 = (w,0) ; draw z5--z6 ; lft top z7 = (0,h-P_t) ; lft bot z8 = (0,P_t) ; draw z7--z8 ; penlabels(range 1 thru 8) ; endchar; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{F} % Ofcourse, very similar to the \textunibf{E}. The consideration % concerning the middle bar of the \textunibf{E} will ofcourse reflect % on this letter. % \begin{macrocode} beginchar("F",A_w#,l_h#,0); "The letter F" ; uniend(P_t,(P_t,h-P_t),90,180,10); pickup Unipensqu ; lft top z1 = (P_t,h) ; rt top z2 = (w,h) ; draw z1--z2 ; lft z3 = (P_t,h/2) ; rt z4 = (w,h/2) ; draw z3--z4 ; lft top z5 = (0,h-P_t) ; lft bot z6 = (0,0) ; draw z5--z6 ; penlabels(range 1 thru 8); endchar; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{G} % This is very similar to the minuscle \textunibf{g}, the only difference % is the size, and that the down stroke doens't extend below the % baseline. % \begin{macrocode} beginchar("G",l_h#,l_h#,0); "The letter G" ; uniarc(w/2,P_t,(w/2,h/2),30,360,10) ; pickup Unipensqu ; top rt z1 = (w,h/2) ; bot rt z2 = (w,0) ; draw z1--z2; penlabels(1,2); endchar; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{H} % An awfull simple letter. There can be no doubt on how this should % look. % \begin{macrocode} beginchar("H",A_w#,l_h#,0); "The letter H" ; pickup Unipensqu ; top lft z1 = (0,h) ; bot lft z2 = (0,0) ; draw z1--z2 ; top rt z3 = (w,h) ; bot rt z4 = (w,0) ; draw z3--z4 ; lft z5 = (0,h/2) ; rt z6 = (w,h/2) ; draw z5--z6 ; penlabels(1,2,3,4,5,6); endchar; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{I} % It doesn't get any simpler! % \begin{macrocode} beginchar("I",P_t#,l_h#,0); "The letter I" ; pickup Unipensqu ; top lft z1 = (0,h) ; bot lft z2 = (0,0) ; draw z1--z2 ; penlabels(1,2); endchar; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{J} % \begin{macrocode} beginchar("J",P_t#+2C_d#,l_h#,0); "The letter J"; uniend(P_t,(w-P_t,P_t),270,360,10); pickup Unipensqu ; lft bot z1 = (0,0) ; rt bot z2 = (w-P_t,0) ; draw z1--z2 ; rt bot z3 = (w,P_t) ; rt top z4 = (w,h) ; draw z3--z4 ; penlabels(1,2,3,4); endchar; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{K} % Similar to \textunibf{k}. % \begin{macrocode} beginchar("K",(l_h#+3P_t#)/2,l_h#,0) ; "The letter K" ; uniarc((h+P_t)/2,P_t,(P_t,h),270,360,10) ; uniarc((h+P_t)/2,P_t,(P_t,0),0,90,20) ; pickup Unipensqu ; top lft z1 = (0,h) ; bot lft z2 = (0,0) ; draw z1--z2 ; penlabels(1,2); endchar; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{L} % This is just a reflected \textunibf{J}. % \begin{macrocode} beginchar("L",P_t#+2C_d#,l_h#,0) ; "The letter L" ; uniend(P_t,(P_t,P_t),180,270,10) ; pickup Unipensqu ; top lft z1 = (0,h) ; bot lft z2 = (0,P_t) ; draw z1--z2 ; bot lft z3 = (P_t,0) ; bot rt z4 = (w,0) ; draw z3--z4 ; penlabels(1,2,3,4) ; endchar; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{M} % The same kind of considerations as in \textunibf{m} went into this % letter. % \begin{macrocode} beginchar("M",M_w#,l_h#,0) ; "The letter M" ; temp := .25*(w+P_t); uniarc(temp,P_t,(temp,h-temp),0,180,10) ; uniarc(temp,P_t,(w-temp,h-temp),0,180,20) ; pickup Unipensqu ; top lft z1 = (0,h-temp) ; bot lft z2 = (0,0) ; draw z1--z2 ; top z3 = (w/2,h-temp) ; bot z4 = (w/2,0) ; draw z3--z4 ; top rt z5 = (w,h-temp) ; bot rt z6 = (w,0) ; draw z5--z6 ; penlabels(1,2,3,4,5,6); endchar; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{N} % Tricky because of the \textunibf{M} (see above). % \begin{macrocode} beginchar("N",A_w#,l_h#,0); "The letter N" ; uniarc(w/2,P_t,(w/2,h-w/2),0,180,10) ; pickup Unipensqu ; top lft z1 = (0,h-w/2) ; bot lft z2 = (0,0); draw z1--z2 ; top rt z3 = (w,h-w/2) ; bot rt z4 = (w,0) ; draw z3--z4 ; penlabels(1,2,3,4) ; endchar; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{O} % No, this is not going to be an oval, but a \emph{circle\/}! % \begin{macrocode} beginchar("O",l_h#,l_h#,0) ; "The letter O"; unicir(w/2,P_t,(w/2,h/2),10); endchar; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{P} % No surprises. % \begin{macrocode} beginchar("P",A_w#,l_h#,0) ; "The letter P"; unicir(w/2,P_t,(w/2,h-w/2),10) pickup Unipensqu ; lft top z1 = (0,h-w/2) ; lft bot z2 = (0,0) ; draw z1--z2 ; penlabels(1,2); endchar; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{Q} % There are to variants of this letter, one is an reflected % \textunibf{P}, and the other is a vaiant of an \textunibf{O}. The % default one, is the \textunibf{Q} variant. If you want to use the % other variant, you can acceses it directly with \Lcs{varQ}, or you % can pass the argument \texttt{varQ} to the \textsc{uni} package. % (Option \texttt{varQ} not implemented yet!) % \begin{macrocode} beginchar("Q",l_h#,l_h#,p_d#) ; "The letter Q"; unicir(w/2,P_t,(w/2,w/2),10); pickup Unipensqu ; top z1 = (w/2,3P_t) ; bot z2 = (w/2,-d) ; draw z1--z2 ; penlabels(1,2); endchar; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{R} % I'm not enterily happy with this letter, but quite frankly, I don't % know how else to make it. Please give me your suggestion. % \begin{macrocode} beginchar("R",A_w#,l_h#,0) ; "The letter R"; unicir(w/2,P_t,(w/2,h-w/2),10) ; rad := h-w+P_t ; uniarc(rad,P_t,(w-rad,0),0,90,20) ; pickup Unipensqu ; lft top z1 = (0,h-w/2) ; bot lft z2 = (0,0) ; draw z1--z2 ; temp := w/2-rad ; if temp>0 : pickup pensquare xscaled temp yscaled P_t ; lft top z3 = (1/2w,rad) ; drawdot z3 ; fi; penlabels(1,2,3) ; endchar; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{S} % Just like the minuscle \textunibf{s}, this is a `slow' letter, i.e., % it takes \MF{} quite some time to compute. % \begin{macrocode} beginchar("S",A_w#,l_h#,0) ; "The letter S" ; temp := (h+P_t)/4 ; uniarc(temp,P_t,(temp,temp),180,270,10) ; uniarc(temp,P_t,(w-temp,temp),270,450,20) ; uniarc(temp,P_t,(temp,h-temp),90,270,30) ; uniarc(temp,P_t,(w-temp,h-temp),0,90,40) ; pickup Unipensqu ; bot lft z1 = (temp,0) ; bot rt z2 = (w-temp,0) ; draw z1--z2 ; lft z3 = (temp,h/2) ; rt z4 = (w-temp,h/2) ; draw z3--z4 ; top lft z5 = (temp,h) ; top rt z6 = (w-temp,h) ; draw z5--z6 ; penlabels(1,2,3,4,5,6) ; endchar; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{T} % Again --- simple! % \begin{macrocode} beginchar("T",A_w#,l_h#,0); "The letter T" ; pickup Unipensqu ; top z1 = (w/2,h) ; bot z2 = (w/2,0) ; draw z1--z2 ; top lft z3 = (0,h) ; top rt z4 = (w,h) ; draw z3--z4 ; penlabels(1,2,3,4); endchar; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{U} % \emph{Font--jepody:} The character of the \universal{} font, that, % when reflected gives \textunibf{U}. % \begin{macrocode} beginchar("U",A_w#,l_h#,0); "The letter U" ; uniarc(w/2,P_t,(w/2,w/2),180,360,10) ; pickup Unipensqu ; top lft z1 = (0,h) ; bot lft z2 = (0,w/2) ; draw z1--z2 ; top rt z3 = (w,h) ; bot rt z4 = (w,w/2) ; draw z3--z4 ; penlabels(1,2,3,4) ; endchar; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{V} % See also the minuscle \textunibf{v}. % \begin{macrocode} beginchar("V",A_w#,l_h#,0); "The letter V" ; unilne(P_t,(0,h),(w/2,P_t),1,1,10); unilne(P_t,(w/2,P_t),(w,h),1,1,20); uniarc(P_t,P_t,(w/2,P_t),180,360,30); endchar; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{W} % Flippedy--flop. % \begin{macrocode} beginchar("W",M_w#,l_h#,0) ; "The letter W" ; temp := .25*(w+P_t); uniarc(temp,P_t,(temp,temp),180,360,10) ; uniarc(temp,P_t,(w-temp,temp),180,360,20) ; pickup Unipensqu ; top lft z1 = (0,h) ; bot lft z2 = (0,temp) ; draw z1--z2 ; top z3 = (w/2,h) ; bot z4 = (w/2,temp) ; draw z3--z4 ; top rt z5 = (w,h) ; bot rt z6 = (w,temp) ; draw z5--z6 ; penlabels(1,2,3,4,5,6); endchar; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{X} % This is a bit tricky --- see the minuscle \textunibf{x}. % \begin{macrocode} beginchar("X",l_h#,l_h#,0) ; "The letter X" ; uniarc(h/2,P_t,(P_t/2,h/2),270,90,10); uniarc(h/2,P_t,(w-P_t/2,h/2),90,270,20); temp := (h-w+P_t)/2 ; pickup pensquare xscaled temp yscaled P_t slanted slantratio ; lft top z1 = (0,h) ; draw z1 ; lft bot z2 = (0,0) ; draw z2 ; rt top z3 = (w,h) ; draw z3 ; rt bot z4 = (w,0) ; draw z4 ; penlabels(1,2,3,4); endchar; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{Y} % \Newestchanges{v2.0}{98/08/01}{Character \textunibf{Y} changed.} % This actually a bit different from \textunibf{y}, but it looks right. % \begin{macrocode} beginchar("Y",A_w#,l_h#,0); "The letter Y" ; uniarc(w/2,P_t,(w/2,h-P_t),180,360,10) ; pickup Unipensqu ; top lft z1 = (0,h) ; drawdot z1 ; top rt z2 = (w,h) ; drawdot z2 ; top z3 = (w/2,h-w/2) ; bot z4 = (w/2,0) ; draw z3--z4 ; penlabels(1,2,3,4) ; endchar; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{Z} % Again a tricky letter. For more onm this please refer to the % minuscle \textunibf{z}. % % Notice that the angle \texttt{phi} in this majuscle is not the % same as in the minuscles \textunibf{z}, since this letter doesn't fit % in a square, but is retangular. % \begin{macrocode} beginchar("Z",A_w#,l_h#,0) ; "The letter Z" ; pickup Unipensqu ; top lft z1 = (0,h) ; top rt z2 = (w-P_t,h) ; draw z1--z2 ; bot lft z3 = (P_t,0) ; bot rt z4 = (w,0) ; draw z3--z4 ; phi := angle((w,h-P_t)-(0,P_t)) ; z5 = (P_t,P_t) ; z6 = z5 + P_t*(-sind(phi),cosd(phi)) ; z7 = (w-P_t,h-P_t) ; z8 = z7 + P_t*(sind(phi),-cosd(phi)) ; uniend(P_t,z5,90+phi,270,10); uniend(P_t,z7,-90+phi,90,20); fill z5--z6--z7--z8--cycle ; penlabels(range 1 thru 8); endchar; % \end{macrocode} % \end{fontcode} % As explain in the begining of the section, this file is one big % \texttt{if...else...fi} loop to mak the generation of the strict % font easier. % % The idea is, that if \texttt{strict} is \texttt{true}, then the main % part of this file shouldn't be used, but rather \texttt{unilow.mf} % should be loaded again, but with this time the characters should be % placed where the majuscules should be. % % This is done by defining \texttt{code\_offset} to be the (negative) % difference the ASCII code for \texttt{A} and \texttt{a}. After we % have input \texttt{unilow.mf} once more, we reset % \texttt{code\_offset}. % \begin{macrocode} else : code_offset := ASCII"A" - ASCII"a" ; input unilow ; code_offset := 0 ; fi ; % \end{macrocode} %\iffalse % %\fi %\iffalse %<*dig> %\fi % \subsection{The Numbers --- (\texttt{unidig.mf})} % \file{unidig.mf} % % I couldn't find any design of numbers, I could directly ascribe to % Herbert Bayer. I, however, found some other examples, and from % these, and my general conception of the font, I designed the % numerals, as they are seen below. % % \begin{fontcode}{0} % Perhaps this should have been a circle, but to destingice the zero % from the majuscle {\uni O}, I chose to strecth it. % \begin{macrocode} beginchar("0",A_w#,l_h#,0) ; "The number 0" ; uniarc(w/2,p_t,(w/2,h-w/2),0,180,10) ; uniarc(w/2,p_t,(w/2,w/2),180,360,20) ; pickup unipensqu ; top lft z1 = (0,h-w/2) ; bot lft z2 = (0,w/2) ; draw z1--z2 ; top rt z3 = (w,h-w/2) ; bot rt z4 = (w,w/2) ; draw z3--z4 ; penlabels(1,2,3,4) ; endchar; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{1} % Here we use the dimension \texttt{c\_d}, since the stem should be % thee same lenght in the medium font as in the bold face one. % \begin{macrocode} beginchar("1",2c_d#,l_h#,0) ; "The number 1" ; uniend(p_t,(w-p_t,h-p_t),0,90,10) ; pickup unipensqu ; lft top z1 = (0,h) ; rt top z2 = (w-p_t,h) ; draw z1--z2 ; rt top z3 = (w,h-p_t) ; rt bot z4 = (w,0) ; draw z3--z4 ; penlabels(1,2,3,4) ; endchar; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{2} % Again, this is a bit tricky, for the same reason as the minuscle % {\uni z}. % \begin{macrocode} beginchar("2",A_w#,l_h#,0) ; "The number 2" ; uniarc(w/2,p_t,(w/2,h-w/2),0,180,10) ; phi := angle((w,h-w/2)-(0,p_t)) ; z1 = (w-p_t,h-w/2) ; z2 = z1 + p_t*(sind(phi),-cosd(phi)) ; z3 = (p_t,p_t) ; z4 = z3 + p_t*(-sind(phi),cosd(phi)) ; fill z1--z2--z3--z4--cycle ; uniend(p_t,z1,270+phi,360,20) ; uniend(p_t,z3,90+phi,270,30) ; pickup unipensqu ; bot lft z5 = (p_t,0) ; bot rt z6 = (w,0) ; draw z5--z6 ; penlabels(range 1 thru 6) ; endchar; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{3} % By first defining to paths similar to the two circle segments, it is % possible to calculate the intersectionpoint, and thereby the angle % \texttt{phi}, where the to segments meet, relative to one of the % centers. This angle is then used to define the \emph{real} path, and % the rightmost point of the middle bar. % \begin{macrocode} beginchar("3",A_w#,l_h#,0) ; "The number 3" ; path arc_a, arc_b ; arc_a = (w,h-w/2)..(w/2,h-w) ; arc_b = (w,w/2)..(w/2,w) ; z3 = arc_a intersectionpoint arc_b ; phi := angle(z3-(w/2,w/2)) ; uniarc(w/2,p_t,(w/2,h-w/2),-phi,180,10) ; uniarc(w/2,p_t,(w/2,w/2),-180,phi,20) ; pickup unipensqu ; rt z1 = (w/2*(1+cosd(phi)),h/2) ; lft z2 = (w/2,h/2) ; draw z1--z2 ; penlabels(1,2) ; endchar; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{4} % One could argue, that the top left stroke should be vertical, but I % chose to go for a $45^\circ$ slanted line, for aestethic reasons. % \begin{macrocode} beginchar("4",A_w#,l_h#,0) ; "The number 4" ; z1 = (w-p_t,h-p_t) ; z2 = z1 + p_t*(-1/sqrt(2),1/sqrt(2)) ; z3 = (p_t,h-w+p_t) ; z4 = z3 + p_t*(-1/sqrt(2),1/sqrt(2)) ; fill z1--z2--z4--z3--cycle ; uniend(p_t,z1,0,135,10) ; uniend(p_t,z3,135,270,20) ; pickup unipensqu ; top rt z5 = (w,h-p_t) ; bot rt z6 = (w,0) ; draw z5--z6 ; bot lft z7 = (p_t,h-w) ; bot rt z8 = (w,h-w) ; draw z7--z8 ; penlabels(range 1 thru 8) ; endchar; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{5} % This gave me some trouble. I originally wanted the arc to have a % diameter the width of the character, but that meant, that the to % horizontal lines of the font, came so close to each other, that it % didn't look good. So I played a little with \texttt{rad}, and % decided that the current value gave the nicest resault. % \begin{macrocode} beginchar("5",A_w#,l_h#,0) ; "The number 5" ; rad := 9w/20 ; uniarc(rad,p_t,(w-rad,rad),-150,90,10) ; uniend(p_t,(p_t,h-p_t),90,180,20) ; uniend(p_t,(p_t,2rad),180,270,30) ; pickup unipensqu ; top lft z1 = (p_t,2rad) ; top rt z2 = (w-rad,2rad) ; draw z1--z2 ; bot lft z3 = (0,2rad) ; top lft z4 = (0,h-p_t) ; draw z3--z4 ; top lft z5 = (p_t,h) ; top rt z6 = (w,h) ; draw z5--z6 ; penlabels(range 1 thru 6) ; endchar; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{6} % This was almost to easy --- a circle, an arc, and a line connecting % them. % \begin{macrocode} beginchar("6",A_w#,l_h#,0) ; "The number 6" ; unicir(w/2,p_t,(w/2,w/2),10) ; uniarc(w/2,p_t,(w/2,h-w/2),60,180,20) ; pickup unipensqu ; top lft z1 = (0,h-w/2) ; bot lft z2 = (0,w/2) ; draw z1--z2 ; penlabels(1,2) ; endchar; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{7} % Apperently, this character could have the same problems as the % \textuni{2}, but it didn't --- can you see why not? % \begin{macrocode} beginchar("7",A_w#,l_h#,0) ; "The number 7" ; z1 = (w-p_t,h-p_t) ; phi := angle(z1) ; uniend(p_t,z1,-90+phi,90,10) ; z2 = z1 + p_t*(cosd(90-phi),-sind(90-phi)) ; z3 = (p_t/cosd(90-phi),0) ; z4 = (0,0) ; fill z1--z2--z3--z4--cycle ; pickup unipensqu ; top lft z5 = (0,h) ; top rt z6 = (w-p_t,h) ; draw z5--z6 ; penlabels(range 1 thru 6) ; endchar; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{8} % Ha ha, to circles, one on top of the other. Some may prefer if the % bottom most circle had a slightly larger radius then the top most, % but I believe that to be in conflict with the general idea of % simplicity. % \begin{macrocode} beginchar("8",1/2*(l_h#+p_t#),l_h#,0) ; "The number 8" ; unicir(w/2,p_t,(w/2,w/2),10) ; unicir(w/2,p_t,(w/2,h-w/2),20) ; endchar; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{9} % See above under \textuni{6}. % \begin{macrocode} beginchar("9",A_w#,l_h#,0) ; "The number 9" ; unicir(w/2,p_t,(w/2,h-w/2),10) ; uniarc(w/2,p_t,(w/2,w/2),-150,0,20) ; pickup unipensqu ; top rt z1 = (w,h-w/2) ; bot rt z2 = (w,w/2) ; draw z1--z2 ; penlabels(1,2) ; endchar; % \end{macrocode} % \end{fontcode} %\iffalse % %\fi %\iffalse %<*spe> %\fi % \subsection{Specials --- \texttt{unispe.mf}} % \file{unispe.mf} % % For these characters, I couldn't find any original design, % so once again, I did some inter-- and extrapolation, plus I had some % print--outs of other implenations of Herbert Bayers universal % font. So once again, I am to blame for any aestethic judgements. % % \begin{fontcode}{\char"10} % At first I thought I didn't had to do this character, but then I % realized that you \emph{do} needed, since some words are spelled % with some sort of accent over the ``i'', other then a single dot, % e.g., \textunibf{na\"ive}. % \begin{macrocode} beginchar(hex"10",p_t#,x_h#,0) ; "The dotless letter i" ; pickup unipensqu ; bot lft z1 = (0,0) ; top lft z2 = (0,h) ; draw z1--z2; penlabels(1,2); endchar; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{\char"11} % Non single dot j's are not as frequent as those of i's, so for the % sake of completness, if nothing else, this letter is included. % \begin{macrocode} beginchar(hex"11",p_t#,x_h#,p_d#) ; "The dotless letter j" ; pickup unipensqu ; bot lft z1 = (0,-d) ; top lft z2 = (0,h) ; draw z1--z2 ; penlabels(1,2); endchar; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{\char"24} % I couldn't make up my mind wether this should just be a \textunibf{s}, % with a vertical bar through, or if I should make it differntly. In % the end, I chose to make it different, since I think it looks best % in the context of the font. % \begin{macrocode} beginchar("$",(l_h#-c_d#+p_t#)/2,l_h#,c_d#) ; "The dollar sign ($)" ; uniarc(w/2,p_t,(w/2,w/2),180,450,10) ; uniarc(w/2,p_t,(w/2,h-c_d-w/2),0,270,20) ; pickup unipensqu ; top z1 = (w/2,h) ; bot z2 = (w/2,-d) ; draw z1--z2 ; penlabels(1,2) ; endchar; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{\char"26} % You could argue back and forth on the shape of the ampersand, but I % decided to go for a simple design. % \begin{macrocode} beginchar("&",(l_h#+p_t#)/2+c_d#,l_h#,c_d#) ; "The ampersand (&)" ; rad := (w-c_d)/2 ; unicir(rad,p_t,(rad,h-rad),10) ; uniarc(rad,p_t,(rad,rad),0,270,20) ; pickup unipensqu ; lft bot z1 = (rad,0) ; rt bot z2 = (w,0) ; draw z1--z2 ; rt top z3 = (w-c_d,rad) ; rt bot z4 = (w-c_d,-d) ; draw z3--z4 ; penlabels(1,2,3,4) ; endchar; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{?} % I did have some considerations concerning this. Since I had kind of % decided to make avery junction ``smooth'', this also had to % be. However, that meant, that my original plan, to make this letter % as wide as an \textunibf{A}, didn't work, so I had to make it less % wide, which in the end does look better. % \begin{macrocode} beginchar("?",l_h#-5c_d#/2,l_h#,0) ; "The question mark (?)" ; temp := angle((P_T,-w/2)) - 0.01 ; uniarc(w/2,P_T,(w/2,h-w/2),temp,180,10) ; uniend(P_T,((w+P_T)/2,h-w),90,180,20) ; uniend(P_T,((w+P_T)/2,h-w+P_T),270,360+temp,30) ; pickup UniPensqu ; top z1 = (w/2,h-w) ; bot z2 = (w/2,2P_T) ; draw z1--z2 ; pickup UniPencir ; bot z3 = (w/2,0) ; drawdot z3 ; penlabels(1,2,3) ; endchar; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{\char"3E} % These Spanish special letters, are just rotations, so nothing % special is going on here. % \begin{macrocode} beginchar(spanish_query,l_h#-5c_d#/2,x_h#,p_d#) ; "The Spanish query" ; temp := angle((-P_T,w/2))-0.01 ; uniarc(w/2,P_T,(w/2,-d+w/2),temp,360,10) ; uniend(P_T,((w-P_T)/2,-d+w),270,360,20) ; uniend(P_T,((w-P_T)/2,-d+w-P_T),90,temp,30) ; pickup UniPensqu ; bot z1 = (w/2,-d+w) ; top z2 = (w/2,h-2P_T) ; draw z1--z2 ; pickup UniPencir ; top z3 = (w/2,h) ; drawdot z3 ; penlabels(1,2,3) ; endchar; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{\char"3C} % See above. % \begin{macrocode} beginchar(spanish_shriek,P_T#,x_h#,p_d#) ; "The Spanish shriek" ; pickup UniPencir ; top z1 = (w/2,h) ; drawdot z1 ; pickup UniPensqu ; top z2 = (w/2,h-2P_T) ; bot z3 = (w/2,-d) ; draw z2--z3 ; penlabels(1,2,3) ; endchar; % \end{macrocode} % \end{fontcode} %\iffalse % %\fi %\iffalse %<*pun> %\fi % \subsection{Punctuations --- \texttt{unipun.mf}} % \file{unipun.mf} % % This is the programs for general punctuation marks, ranging from % period to ast. % % \begin{fontcode}{\char"21} % Quite a simple character. Notice the use of \texttt{unipencir}. % \begin{macrocode} beginchar("!",P_T#,l_h#,0) ; "The exclamation mark (!)" ; pickup UniPensqu ; top lft z1 = (0,h) ; bot lft z2 = (0,2P_T) ; draw z1--z2 ; pickup UniPencir ; bot lft z3 = (0,0) ; drawdot z3 ; penlabels(1,2,3) ; endchar; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{(} % Here, and in the next character ()) we don't use pens, since we can % get a much better resault using the \MF{} path macro \texttt{...} . % \begin{macrocode} beginchar("(",x_w#/2,l_h#,p_d#) ; "The left paranthesis (()" ; z1 = (w,h) ; z2 = (p_t,(h-d)/2) ; z3 = (w,-d) ; z4 = (w-p_t,-d) ; z5 = (0,(h-d)/2) ; z6 = (w-p_t,h) ; fill z1..z2..z3--z4..z5..z6--cycle ; penlabels(range 1 thru 6) ; endchar; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{)} % \begin{macrocode} beginchar(")",x_w#/2,l_h#,p_d#) ; "The right paranthesis ())" ; z1 = (p_t,h) ; z2 = (w,(h-d)/2) ; z3 = (p_t,-d) ; z4 = (0,-d) ; z5 = (w-p_t,(h-d)/2) ; z6 = (0,h) ; fill z1..z2..z3--z4..z5..z6--cycle ; penlabels(range 1 thru 6) ; endchar; % \end{macrocode} % \end{fontcode} % % \begin{fontcode}{\#} % I never really got satisfied with this letter, but this is the best % I could do --- who ever uses a \# anyway! % \begin{macrocode} beginchar("#",x_w#,x_h#,0) ; "The hash mark (#)" ; unilne(p_t,(0,0),(w/2,h),1,1,10) ; unilne(p_t,(w/2,0),(w,h),1,1,20) ; pickup unipensqu ; top lft z1 = (0,(h-c_d)/2) ; top rt z2 = (w,(h-c_d)/2) ; bot lft z3 = (0,(h+c_d)/2) ; bot rt z4 = (w,(h+c_d)/2) ; draw z1--z2 ; draw z3--z4 ; penlabels(1,2,3,4) ; endchar; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{\%} % Among other characters, this one made me define a dimension called % \texttt{c\_d}, which is to be used for all kinds of curves. The idea % is that, some sizes curves should depend on the weight of the font, % and others not. Those that \emph{shouldn't} will use \texttt{c\_d}. % \begin{macrocode} beginchar("%",x_w#,l_h#,0) ; "The percent sign (%)" ; temp := 3c_d/2 ; unicir(temp,p_t,(temp,h-temp),10) ; unicir(temp,p_t,(w-temp,temp),20) ; unilne(p_t,(0,0),(w,h),1,1,30) ; endchar; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{'} % Agian we have a translated comma --- the apostrophe. % \begin{macrocode} beginchar("'",2P_T#,l_h#,0) ; "The apostrophe (')" ; uniend(w/2,(w/2,h-w/2),0,180,10) ; z1 = (0,h-w/2) ; z2 = (w,h-w/2) ; z3 = (0,h-3w/2) ; fill z1--z2--z3--cycle ; penlabels(1,2,3) ; endchar; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{*} % This isn't really complicated execpt for the value of \texttt{temp}, % which insures that the top of ast will be in the character. % \begin{macrocode} beginchar("*",x_w#,l_h#,0) ; "The ast (*)" ; path rect ; temp := h-(w*sind(60)-p_t*cosd(60))/2 ; pickup unipensqu ; lft z1 = (0,temp) ; rt z2 = (w,temp) ; draw z1--z2 ; rect = (bot lft z1)--(top lft z1)--(top rt z2)--(bot rt z2)--cycle ; fill rect rotatedabout((w/2,temp),60) ; fill rect rotatedabout((w/2,temp),120) ; penlabels(1,2) ; endchar; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{+} % Plus and minus, now that's easy. % \begin{macrocode} beginchar("+",x_w#,x_h#,0) ; "The plus sign (+)" ; pickup unipensqu ; lft z1 = (0,w/2) ; rt z2 = (w,w/2) ; draw z1--z2 ; bot z3 = (w/2,0) ; top z4 = (w/2,w) ; draw z3--z4 ; endchar; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{,} % Incedently, the apostrophs (both single and reversed), are % just translations and reflections of the comma. % % \textsl{Mathemathical problem:} Work out which algebraic group the % characters `\textunibf{,}', `\textunibf{'}', and `\textunibf{`}', % belongs to? % \begin{macrocode} beginchar(",",2P_T#,2P_T#,2P_T#) ; "The punctuation ," ; uniend(w/2,(w/2,0),0,180,10) ; z1 = (0,0) ; z2 = (w,0) ; z3 = (0,-d) ; fill z1--z2--z3--cycle ; penlabels(1,2,3) ; endchar; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{-} % Minus? --- isn't it the opposite of plus? % \begin{macrocode} beginchar("-",4x_w#/5,x_h#,0) ; "The hyphen (-)" ; pickup unipensqu ; lft z1 = (0,h/2) ; rt z2 = (w,h/2) ; draw z1--z2 ; penlabels(1,2); endchar; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{.} % Wow, a dot! % \begin{macrocode} beginchar(".",2P_T#,2P_T#,0) ; "The punctuation ." ; uniend(w/2,(w/2,h/2),0,360,10) ; % pickup UniPencir ; lft bot z1 = (0,0) ; drawdot z1 ; penlabels(1); endchar; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{/} % This is a nice utilization of \texttt{unilne}. % \begin{macrocode} beginchar("/",x_w#,l_h#,0) ; "The slash (/)" ; unilne(p_t,(0,0),(w,h),1,1,10) ; endchar; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{:} % Wauw, \emph{two} dots --- cool! % \begin{macrocode} beginchar(":",2P_T#,x_h#,0) ; "The punctuation :" ; uniend(w/2,(w/2,h-w/2),0,360,10) ; uniend(w/2,(w/2,w/2),0,360,20) ; endchar; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{;} % Again, this is straight forward. % \begin{macrocode} beginchar(";",2P_T#,x_h#,2P_T#) ; "The punctuation ;" ; uniend(w/2,(w/2,h-w/2),0,360,10) ; uniend(w/2,(w/2,0),0,180,20) ; z2 = (0,0) ; z3 = (w,0) ; z4 = (0,-d) ; fill z2--z3--z4--cycle ; penlabels(1,2,3,4) ; endchar; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{\char"3D} % These characters are rediculously simple. % \begin{macrocode} beginchar("=",x_w#,x_h#,0) ; "The equal sign (=)" ; pickup unipensqu ; top lft z1 = (0,(h-p_t)/2) ; top rt z2 = (w,(h-p_t)/2) ; bot lft z3 = (0,(h+p_t)/2) ; bot rt z4 = (w,(h+p_t)/2) ; draw z1--z2 ; draw z3--z4 ; penlabels(1,2,3,4) ; endchar; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{@} % Now this was a bit of a challenge. It is clear, that the left stroke % should be a straight line tarveling all the way to the baseline, but % how big should the small circle be. I decided to go for the largest % one, that didn't touch or intersected the outer arc more then one % place, i.e., at the far left. % \begin{macrocode} beginchar("@",l_h#,l_h#,0) ; "The at sign (@)" ; uniarc(w/2,p_t,(w/2,h/2),0,240,10) ; unicir(w/3,p_t,(2w/3,w/3),20) ; pickup unipensqu ; top rt z1 = (w,w/2) ; bot rt z2 = (w,0) ; draw z1--z2 ; penlabels(1,2) ; endchar; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{[} % Notice the soft corners. This is ofcourse accomplieshed with % \texttt{uniend}, which turned out to be a very nice macro. % \begin{macrocode} beginchar("[",3p_t#,l_h#,p_d#) ; "The left bracket ([)" ; uniend(p_t,(p_t,h-p_t),90,180,10) ; uniend(p_t,(p_t,-d+p_t),180,270,20) ; pickup unipensqu ; top lft z1 = (p_t,h) ; top rt z2 = (w,h) ; draw z1--z2 ; top lft z3 = (0,h-p_t) ; bot lft z4 = (0,-d+p_t) ; draw z3--z4 ; bot lft z5 = (p_t,-d) ; bot rt z6 = (w,-d) ; draw z5--z6 ; penlabels(range 1 thru 6) ; endchar; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{]} % Speaking of reflections. % \begin{macrocode} beginchar("]",3p_t#,l_h#,p_d#) ; "The right braket (])" ; uniend(p_t,(w-p_t,h-p_t),0,90,10) ; uniend(p_t,(w-p_t,-d+p_t),270,360,20) ; pickup unipensqu ; top lft z1 = (0,h) ; top rt z2 = (w-p_t,h) ; draw z1--z2 ; top rt z3 = (w,h-p_t) ; bot rt z4 = (w,-d+p_t) ; draw z3--z4 ; bot lft z5 = (0,-d) ; bot rt z6 = (w-p_t,-d) ; draw z5--z6 ; penlabels(range 1 thru 6) ; endchar; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{`} % Who is this `comma' character --- he keeps poping up the strangest % places. % \begin{macrocode} beginchar("`",2P_T#,l_h#,0) ; "The reversed apostroph (`)" ; uniend(w/2,(w/2,h-w),180,360,10) ; z1 = (0,h) ; z2 = (0,h-w) ; z3 = (w,h-w) ; fill z1--z2--z3--cycle ; penlabels(1,2,3) ; endchar; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{--} % Ah, a horizontal line --- how fascinating! % \begin{macrocode} beginchar(hex"7B",m_w#,x_h#,0) ; "The en-dash (--)" ; pickup unipensqu ; lft z1 = (0,h/2) ; rt z2 = (w,h/2) ; draw z1--z2 ; penlabels(1,2) ; endchar; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{---} % And another horizontal line --- and it's even longer then the % previous one. % \begin{macrocode} beginchar(hex"7C",M_w#,x_h#,0) ; "The em-dash (---)" ; pickup unipensqu ; lft z1 = (0,h/2) ; rt z2 = (w,h/2) ; draw z1--z2 ; penlabels(1,2) ; endchar; % \end{macrocode} % \end{fontcode} %\iffalse % %\fi %\iffalse %<*acc> %\fi % \subsection{Accents --- \texttt{uniacc.mf}} % \file{uniacc.mf} % \begin{fontcode}{\char"12} % Even though you use a reversed apostrophe in \LaTeX{} to get this % accent, the accent shouldn't look like a apostophe, that would be % far to clumsy. So instead we \emph{rotate} a comma and translate it % --- algebraic groups again! % \begin{macrocode} beginchar(hex"12",x_w#,l_h#,0) ; "The accent `" ; uniend(P_T/2,(w/2,a_h+P_T/2),90,270,10) ; z1 = (w/2,a_h+P_T) ; z2 = (w/2,a_h) ; z3 = (w/2+P_T,a_h) ; fill z1--z2--z3--cycle ; penlabels(1,2,3) ; endchar ; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{\char"13} % See above. % \begin{macrocode} beginchar(hex"13",x_w#,l_h#,0) ; "The accent '" ; uniend(P_T/2,(w/2,a_h+P_T/2),-90,90,10) ; z1 = (w/2,a_h+P_T) ; z2 = (w/2,a_h) ; z3 = (w/2-P_T,a_h) ; fill z1--z2--z3--cycle ; penlabels(1,2,3) ; endchar ; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{\char"14} % \begin{macrocode} beginchar(hex"14",x_w#,l_h#,0) ; "The accent hachek" ; z1 = (w/2,a_h+p_t) ; uniend(p_t,z1,225,315,10) ; z2 = z1 + p_t*(-1,-1)/sqrt(2) ; z3 = z1 + p_t*(-1,1) ; z4 = z3 + (-p_t*sqrt(2),0) ; path rombe ; rombe := z1--z2--z4--z3--cycle ; fill rombe ; fill rombe reflectedabout ((w/2,0),(w/2,h)) ; penlabels(1,2,3,4) ; endchar ; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{\char"15} % \begin{macrocode} beginchar(hex"15",x_w#,l_h#,0) ; "The accent breve" ; rad := 3p_t/2 ; uniarc(rad,p_t,(w/2,a_h+rad),180,360,10) ; endchar ; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{\char"16} % \begin{macrocode} beginchar(hex"16",x_w#,a_h#+p_t#,0) ; "The accent macron (bar)" ; pickup unipensqu ; bot lft z1 = (w/2-2p_t,a_h) ; bot rt z2 = (w/2+2p_t,a_h) ; draw z1--z2 ; penlabels(1,2) ; endchar ; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{\char"17} % \begin{macrocode} beginchar(hex"17",A_w#+4/3*(l_h#-x_h#)*slantratio,l_h#,0) ; "The accent circle" ; rad := P_T ; unicir(rad,p_t,(w/2,h-rad),10) ; endchar ; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{\char"18} % \begin{macrocode} beginchar(hex"18",x_w#,x_h#,2c_d#) ; "The accent cidelia" ; uniarc(d/2,2P_T/3,(w/2+d/4,-d/2),90,270,10) ; endchar ; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{\char"20} % \begin{macrocode} phi := 15 ; tmp# := 3c_d# ; define_pixels(tmp) ; beginchar(hex"20",tmp#*cosd(phi)+p_t#*sind(phi),l_h#,0) ; "The accent bar over l" ; z1 = (0,(h+p_t*cosd(phi)-tmp*sind(phi))/2) ; z2 = (p_t*sind(phi),(h-p_t*cosd(phi)-tmp*sind(phi))/2) ; z3 = (w,(h-p_t*cosd(phi)+tmp*sind(phi))/2) ; z4 = (w-p_t*sind(phi),(h+p_t*cosd(phi)+tmp*sind(phi))/2) ; fill z1--z2--z3--z4--cycle ; penlabels(1,2,3,4) ; endchar ; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{\char"5E} % \begin{macrocode} beginchar(hex"5E",x_w#,l_h#,0) ; "The accent hat" ; z1 = (w/2,a_h+p_t) ; uniend(p_t,z1,45,136,10) ; z2 = z1 + p_t*(-1,1)/sqrt(2) ; z3 = z1 + p_t*(-1,-1) ; z4 = z3 + (-p_t*sqrt(2),0) ; path rombe ; rombe := z1--z2--z4--z3--cycle ; fill rombe ; fill rombe reflectedabout ((w/2,0),(w/2,h)) ; penlabels(1,2,3,4) ; endchar ; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{\char"5F} % \begin{macrocode} beginchar(hex"5F",x_w#,l_h#,0) ; "The accent dot" ; pickup UniPencir ; bot z1 = (w/2,a_h) ; drawdot z1 ; penlabels(1) ; endchar ; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{\char"7D} % \begin{macrocode} beginchar(hex"7D",x_w#,l_h#,0) ; "The accent ''" ; rad := P_T/2 ; uniend(rad,(w/2-rad,a_h+rad),-90,90,10) ; uniend(rad,(w/2+P_T,a_h+rad),-90,90,20) ; z1 = (w/2-rad-P_T,a_h) ; z2 = (w/2-rad,a_h) ; z3 = (w/2-rad,a_h+P_T) ; fill z1--z2--z3--cycle ; z4 = (w/2,a_h) ; z5 = (w/2+P_T,a_h) ; z6 = (w/2+P_T,a_h+P_T) ; fill z4--z5--z6--cycle ; penlabels(range 1 thru 6) ; endchar ; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{\char"7E} % \begin{macrocode} beginchar(hex"7E",x_w#,l_h#,0) ; "The accent ~" ; rad := (w*sqrt(2)+p_t)/4 ; temp := (2w-p_t*sqrt(2))/8 ; uniarc(rad,p_t,(w/2+temp,a_h+rad),225,315,10) ; uniarc(rad,p_t,(w/2-temp,a_h+rad-2temp),45,135,20) ; endchar ; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{\char"7F} % \begin{macrocode} beginchar(hex"7F",x_w#,l_h#,0) ; "The accent umlout (double dot)" ; pickup UniPencir ; bot z1 = (w/2-P_T,a_h) ; bot z2 = (w/2+P_T,a_h) ; drawdot z1 ; drawdot z2 ; penlabels(1,2) ; endchar ; % \end{macrocode} % \end{fontcode} %\iffalse % %\fi %\iffalse %<*lig> %\fi % \subsection{Ligatures --- \texttt{unilig.mf}} % \file{unilig.mf} % % \begin{fontcode}{SS} % If we are making a small caps shaped font, then we need to make an % upper case version of the german double s (\ss), so we start of % testing if the \texttt{caps} flag is set. % \begin{macrocode} if caps: beginchar(hex"19",5/2x_w#,x_h#,0) ; "Ligature SS" ; temp := (h+p_t)/4 ; uniarc(temp,p_t,(temp,temp),180,270,10) ; uniarc(temp,p_t,(2w/5-temp,temp),270,450,20) ; uniarc(temp,p_t,(temp,h-temp),90,270,30) ; uniarc(temp,p_t,(2w/5-temp,h-temp),0,90,40) ; pickup unipensqu ; bot lft z1 = (temp,0) ; bot rt z2 = (2w/5-temp,0) ; lft z3 = (temp,h/2) ; rt z4 = (2w/5-temp,h/2) ; top lft z5 = (temp,h) ; top rt z6 = (2w/5-temp,h) ; draw z1--z2 ; draw z3--z4 ; draw z5--z6 ; penlabels(1,2,3,4,5,6) ; currentpicture := currentpicture + (currentpicture shifted (3/5w,0)) ; endchar ; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{\char"19} % If we are not making a small caps font, then the usual german double % s is made. % \begin{macrocode} else: beginchar(hex"19",(l_h#+3p_t#)/2,l_h#,p_t#) ; "Ligature ss" ; rad := (w-p_t)/2 ; uniarc(rad,p_t,(p_t+rad,h-rad),-90,180,10) ; uniarc(rad,p_t,(p_t+rad,rad),-90,90,20) ; pickup unipensqu ; top lft z1 = (p_t,h-rad) ; bot lft z2 = (p_t,-d) ; draw z1--z2 ; lft z3 = (0,h/2) ; rt z4 = (w-rad,h/2) ; draw z3--z4 ; penlabels(1,2,3,4) ; endchar ; fi ; % \end{macrocode} % \end{fontcode} % The next three characters should not be made in a small caps font, % so these are all put in side the conditinal % \begin{verbatim} % if not caps : % \end{verbatim} % However, we need to put small caps versions of these letters in the % position of these charcaters, so we use a little trick later on to % do this. % % And if we are making a \emph{strict} shaped font, then we need to % put these characters into two slots each, with three slots between % the to replicas of the character. In that case, we first evaluate % the code once, then if \texttt{strict} is false, we go on in the % code, otherwise, we evaluate the code once more, \emph{but} the % characters is put into new slots 3 slots later then before, since % \texttt{code\_offset} now is 3. Finally in the end we reset % \texttt{code\_offset}. % % This trick is used also in \texttt{uniext.mf} and % \texttt{unilow.mf}. % % \begin{fontcode}{\char"1A} % This is just a combination of an \textunibf{a} and \textunibf{e}, % which we earlier on saved in the picture variables \texttt{a\_pic} % and \texttt{e\_pic}. % \begin{macrocode} if not caps : for temp = 1,2 : if temp = 2 : code_offset := 3 ; fi ; beginchar(hex"1A",2x_w#-p_t#,x_h#,0) ; "Ligature ae" ; currentpicture := a_pic + ( e_pic shifted ((w-p_t)/2,0)) ; endchar ; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{\char"1B} % This is just a compinition of an \textunibf{o} and % \textunibf{e}. The \textunibf{e} we saved earlier on in the picture % variable \texttt{e\_pic}. The \textunibf{o} part is drawn anew. % \begin{macrocode} beginchar(hex"1B",2x_w#-p_t#,x_h#,0) ; "Ligature oe" ; unicir(h/2,p_t,(h/2,h/2),10) ; currentpicture := currentpicture + (e_pic shifted ((w-p_t)/2,0)) ; endchar ; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{\char"1C} % This is really a simple letter. It utilizes the to macros % \texttt{unicir} and \texttt{unilne} in a very nice way, I think. % \begin{macrocode} beginchar(hex"1C",x_w#,x_h#,0) ; "Ligature o/" ; unicir(w/2,p_t,(w/2,h/2),10) ; unilne(p_t,(0,0),(w,h),1,1,20) ; endchar ; exitif (not strict) ; if temp = 2 : code_offset := 0 ; fi ; endfor ; fi ; % \end{macrocode} % \end{fontcode} % Since we don't want any majusculues in the \emph{strict} shaped % font, the next three characteres is only generated if % \texttt{strict} is \texttt{false}. % % Since we have to make two version of the majuscules below in a small % caps font, we set up an \texttt{fot} loop. The trick is this: The % loop while always execute once, so the characters will always be % made in the original size. Now, if we are making a small caps font, % then the loop will execute once more, and we call the macro % \texttt{do\_font} (\texttt{temp = 2}), so that the new characters % will have the right dimensions. % \begin{macrocode} if not strict : for temp = 1,2 : if temp = 2 : do_caps(-3) ; fi ; % \end{macrocode} % \begin{fontcode}{\char"1D} % It wouln't make any sense to just do a combinition of \textunibf{A} % and \textunibf{E}, as were done in minuscules above, so we draw the % whole letter anew. % \begin{macrocode} beginchar(hex"1D",M_w#,l_h#,0) ; "Ligature AE" ; uniarc(w/2,P_t,(w/2,h-w/2),90,180,21) ; uniend(P_t,((w+P_t)/2,P_t),180,270,30) ; pickup Unipensqu ; top lft z1 = (w/2,h) ; top rt z2 = (w,h) ; top lft z3 = (0,h-w/2) ; bot lft z4 = (0,0) ; lft z5 = (0,h/2) ; rt z6 = (w,h/2) ; bot lft z7 = ((w+P_t)/2,0) ; bot rt z8 = (w,0) ; top z9 = (w/2,h) ; bot z10 = (w/2,P_t) ; draw z1--z2 ; draw z3--z4 ; draw z5--z6 ; draw z7--z8 ; draw z9--z10 ; penlabels(range 1 thru 10) ; endchar ; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{\char"1E} % Again, a simple combination of \textunibf{O} and \textunibf{E}, % wouldn't work. % \begin{macrocode} beginchar(hex"1E",M_w#,l_h#,0) ; "Ligature OE" ; uniarc(h/2,P_t,(h/2,h/2),90,270,10) ; pickup Unipensqu ; top lft z1 = (h/2,h) ; top rt z2 = (w,h) ; draw z1--z2 ; lft z3 = (h/2,h/2) ; rt z4 = (w,h/2) ; draw z3--z4 ; bot lft z5 = (h/2,0) ; bot rt z6 = (w,0) ; draw z5--z6 ; top z7 = (h/2,h) ; bot z8 = (h/2,0) ; draw z7--z8 ; penlabels(range 1 thru 8) ; endchar ; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{\char"1F} % What a said above the minuscule \textunibf{\o} also goes for this % letter, since this is nothing but an enlargement of that character. % \begin{macrocode} beginchar(hex"1F",l_h#,l_h#,0) ; "Liguture O/" ; unicir(w/2,P_t,(w/2,h/2),10) ; unilne(P_t,(0,0),(w,h),1,1,20) ; endchar ; % \end{macrocode} % \end{fontcode} % This is where it gets tricky. First we check to see if we are % maiking an small caps font, and if not so, we should exit the loop % right away, so that we don't screw up the minuscules we already have % made above. If, however, we are making a small caps font, we should, % after the second run, restore the dimensions to it's original state. % \begin{macrocode} exitif (not caps) ; if temp = 2 : end_do_caps ; fi ; endfor ; fi ; % \end{macrocode} %\iffalse % %\fi %\iffalse %<*ext> %\fi % \subsection{Extras --- \texttt{uniext.mf}} % \file{uniext.mf} % % Please notice I included \textunibf{\char"0B}, \textunibf{\char"0C}, % \textunibf{\char"0D}, and \textunibf{\char"0E}, which isn't % standard Computer Modern Roman policy. See more below. % % \Newestchanges{v2.0}{98/08/01}{Some of the \textunibf{bauhaus} symbols % that where avaliable in v1.0, has been taken out.} % The first part of this file is some symbols relevant to the % \textunibf{bauhaus} school. Please notice that some of the symbols % present in version~1.0 has been taken out\footnote{If you have used % version~1.0 of this font, and liked those characters and found them % useful, you should e--mail me \texttt{} and let me % know. If I get enough letters on this I will incorporate them again % in future releases.}, since the were seldomly used, and it made the % font contain exactly 128 characters. % % These characters should \emph{not} be slanted in a slanted shaped % font, hence we redefine \texttt{currenttrans} to \texttt{identity}, % just before the next character, and resets it after the last % character. Also notice that \textuni{\bauhead} and % \textuni{\bauforms} may take some time to generate. % \begin{macrocode} currenttransform := identity ; % \end{macrocode} % % \begin{fontcode}{\char"00} % The next three characters are really not the complicated or useful % by themselves, but if you combine them, maybe even with the % \textsf{color} package of \LaTeX{}, you can really add some % \textunibf{bauhaus} flavour to your document. % % The square, ofcourse is obvious. % \begin{macrocode} beginchar(hex"00",l_h#,l_h#,0) ; "The filled square symbol" ; z1 = (0,0) ; z2 = (w,0) ; z3 = (w,h) ; z4 = (0,h) ; fill z1--z2--z3--z4--cycle ; penlabels(1,2,3,4) ; endchar ; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{\char"01} % Also four vectors are defined, put translated a bit, and another % path macro --- it is amazing how much you can do with so little. % \begin{macrocode} beginchar(hex"01",l_h#,l_h#,0) ; "The filled circle symbol" ; z1 = (w,h/2) ; z2 = (w/2,h) ; z3 = (0,h/2) ; z4 = (w/2,0) ; fill z1..z2..z3..z4..cycle ; penlabels(1,2,3,4) ; endchar ; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{\char"02} % Maybe every side of this trangle should be of the same length, mut % then I had to make the triangle either lower, or wider then the % square and circle. I couldn't decide, so I went for equal character % dimensions --- so I believe in equality, sue me! % \begin{macrocode} beginchar(hex"02",l_h#,l_h#,0) ; "The filled triangle symbol" ; z1 = (0,0) ; z2 = (w,0) ; z3 = (w/2,h) ; fill z1--z2--z3--cycle ; penlabels(1,2,3) ; endchar ; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{\char"03} % This is a typical \textuni{bauhaus} symbol. I think it is very % beautiful. % % First we draw the surrounding circle. % \begin{macrocode} beginchar(hex"03",2l_h#,2l_h#,0) ; "The bauhaus-head symbol" ; unicir(w/2,2c_d/9,(w/2,w/2),40) ; % \end{macrocode} % Then we define some horizontal variables $a_{1\ldots6}$ and some % vertical variables $b_{1\ldots8}$. % \begin{macrocode} a1 := .702h ; a2 := .561h ; a3 := .491h ; a4 := .351h ; a5 := .272h ; a6 := .140h ; b1 := .202w ; b2 := .307w ; b3 := .412w ; b4 := .447w ; b5 := .465w ; b6 := .518w ; b7 := .588w ; b8 := .623w ; % \end{macrocode} % Then we define the vectors needed for the eye, and draw the eye. % \begin{macrocode} temp := c_d/6 ; pickup pensquare scaled temp ; top lft z1 = (b1,a1) ; top rt z2 = (b2,a1) ; draw z1--z2 ; bot rt z3 = (b4,a3) ; top rt z4 = (b4,a2) ; draw z3--z4 ; z5 = (b2,a1) ; z6 = (b4,a1) ; z7 = (b4,a2) ; z8 = (b2,a2) ; fill z5--z6--z7--z8--cycle ; % \end{macrocode} % Then we define the vectors needed for the nostril, and draw it. We % still use the pen used for the edges of the eye. % \begin{macrocode} lft bot z9 = (b4,a4) ; lft bot z10 = (b7,a4) ; draw z9--z10 ; % \end{macrocode} % Next up is the chin. Again the same pen. % \begin{macrocode} lft bot z11 = (b2,a6) ; rt bot z12 = (b6,a6) ; draw z11--z12 ; % \end{macrocode} % Now it's time for the lips. They need to be thicker then the chin % and edges of the eye, so we pickup a new pen. % \begin{macrocode} temp := 3c_d/5 ; pickup pensquare scaled temp ; lft top z13 = (b5,a5) ; rt top z14 = (b6,a5) ; draw z13--z14 ; % \end{macrocode} % It's time for the lower part of the face. Here we don't need to find % strange paths or the like, so we do it all with a \texttt{fill} % command. % \begin{macrocode} z15 = (b6,a4) ; z16 = (b7,a4) ; z17 = (b7,a6) ; z18 = (b6,a6) ; fill z15--z16--z17--z18--cycle ; % \end{macrocode} % Since it is not know where the forehead will end at the top, or % where the nect will end in the bottom, we define some temporay % paths, and make up the real ones from those. % % First we need to declare the paths. % \begin{macrocode} path noselft, nosert, necklft, neckrt ; path headcircle , parttop, partbot; % \end{macrocode} % Then we build five temporary paths, one for each side of the % forehead and neck, and one for the surronding circle. % \begin{macrocode} z19 = (b7,a4) ; z20 = (b7,h) ; noselft = z19--z20 ; z21 = (b8,h) ; z22 = (b8,a4) ; nosert = z21--z22 ; z23 = (b3,a6) ; z24 = (b3,0) ; necklft = z23--z24 ; z25 = (b6,0) ; z26 = (b6,a6) ; neckrt = z25--z26 ; z27 = (w/2,h) ; z28 = (w,h/2) ; z29 = (w/2,0) ; z30 = (0,h/2) ; headcircle := z27..z28..z29..z30..cycle ; % \end{macrocode} % Now we can determine the intersection points between our temporary % paths and the circle, and define the vectors we need. % % We also find the parts of the path \texttt{headcircle} that are % relevant for our to areas we need to fill. At last we can fill the % areas. % \begin{macrocode} z31 = noselft intersectiontimes headcircle ; z32 = nosert intersectiontimes headcircle ; parttop = subpath(y31,y32) of headcircle ; z33 = neckrt intersectiontimes headcircle ; z34 = necklft intersectiontimes headcircle ; partbot = subpath(y34,y33) of headcircle ; fill z19--parttop--z22--cycle ; fill z23--partbot--z26--cycle ; penlabels(range 1 thru 34) ; endchar ; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{\char"04} % \Newestchanges{v2.0}{98/08/01}{Joseph Collins came up with the % analytic solution --- thanks JC.} % This is an interresting character. In version~1.0, I posed it as an % mathemathical puzzle, and engourage people to work on it, and if % they came up with a solution, pass it on to me. Well, Joseph Collins % \index{Collins, Joseph} did just that, and for this I owe him many % thanks. For more details on the problem and its solution, take a % look in appendix~\ref{app:solu}. % % First we define some pen sizes we want to use, the variable % \texttt{phi} and draw the circle around the character. % \begin{macrocode} beginchar(hex"04",2l_h#,2l_h#,0) ; "The bauhaus-forms symbol" ; phi := 36.673 ; thn_pen := 2c_d/9 ; med_pen := 3c_d/9 ; thk_pen := 4c_d/9 ; unicir(w/2,thn_pen,(w/2,w/2),20) ; % \end{macrocode} % Then we define the three vertices of the triangle --- points $A,B,C$ % in the notation of appendix~\ref{app:solu} --- and draw the curved % ends there. % \begin{macrocode} z1 = (thn_pen+med_pen,h/2) ; z2 = (.6433w-med_pen,.9790h-med_pen) ; z3 = (.6433w-med_pen,.0210h+med_pen) ; uniend(med_pen,z1,phi+90,270-phi,30) ; uniend(med_pen,z2,0,phi+90,40) ; uniend(med_pen,z3,270-phi,360,50) ; % \end{macrocode} % After this, we calculate the rest of the points needed for the top % most edge of the triangle, line $|AC|$. Then we reflect it % horizontaly to get the bottom most line $|AB|$. % % Then we draw the vertical line $|BC|$ via a pen. % \begin{macrocode} z4 = z1 + med_pen*(-sind(phi),cosd(phi)) ; z5 = z2 + med_pen*(-sind(phi),cosd(phi)) ; path sl_line ; sl_line = z1--z4--z5--z2--cycle ; fill sl_line ; fill sl_line reflectedabout((0,h/2),(w,h/2)) ; pickup pensquare scaled med_pen ; lft bot z6 = z2 ; lft top z7 = z3 ; draw z6--z7 ; % \end{macrocode} % Now it's time for the four vertices $P,Q,R,S$ of the square. Again % we draw the cured ends at those four vertices. This time we use a % thicker pen. % \begin{macrocode} z8 = (.3687w+thk_pen,.2254h+thk_pen) ; z9 = (.9179w-thk_pen,.2254h+thk_pen) ; z10 = (.9179w-thk_pen,.7746h-thk_pen) ; z11 = (.3687w+thk_pen,.7746h-thk_pen) ; uniend(thk_pen,z8,180,270,60) ; uniend(thk_pen,z9,270,360,70) ; uniend(thk_pen,z10,0,90,80) ; uniend(thk_pen,z11,90,180,90) ; % \end{macrocode} % Finally we define the remaning needed vectors, and draw the edges % $|PQ|,|QR|,|RS|$ and $|SP|$ of the square. % \begin{macrocode} pickup pensquare scaled thk_pen ; lft top z12 = z8 ; rt top z13 = z9 ; draw z12--z13 ; lft bot z14 = z9 ; lft top z15 = z10 ; draw z14--z15 ; bot rt z16 = z10 ; bot lft z17 = z11 ; draw z16--z17 ; top rt z18 = z11 ; bot rt z19 = z8 ; draw z18--z19 ; penlabels(range 1 thru 19) ; endchar ; % \end{macrocode} % After these five characters we reset \texttt{currenttransform} to % include the slant specified by \texttt{slantratio}, so that the rest % of the font will come out as it slanted if such a font is begin made. % \begin{macrocode} currenttransform := identity slanted slantratio ; % \end{macrocode} % \end{fontcode} % % Next we provide 6 charecters not directly avaliable in the % \texttt{OT1} encoding, but avaliable in the \texttt{T1} encoding of % the Cork fonts. These are \textunibf{\NG}, \textunibf{\TH}, % \textunibf{\dh}, \textunibf{\ng}, and \textunibf{\th}, plus the % accent `ogoneck' (on an \textunibf{a} it looks like % \textunibf{\k{a}}). % % We do need to check again, wether we are making a small caps shaped % font, and if so, we should not generate the minuscles % \textunibf{\dh}, \textunibf{\ng}, and \textunibf{\th}. % % However, if we are making a \emph{strict} shaped font, then we need % to make the characters twice, and we employe the trick used in % \texttt{unilig.mf} again. % % \begin{fontcode}{\char"05} % I am not completly happy with this character, but it was the best I % could think of. Please let me know if you have any kinds of % suggestions. % \begin{macrocode} if not caps : for temp = 1,2 : if temp = 2 : code_offset := 3 ; fi ; beginchar(hex"05",x_w#,l_h#,0) ; "The letter eth" ; unicir(w/2,p_t,(w/2,w/2),10) ; uniarc(w/2,p_t,(w/2,h-w/2),0,120,20) ; pickup unipensqu ; top rt z1 = (w,h-w/2) ; bot rt z2 = (w,w/2) ; draw z1--z2 ; z3 = (w/2,h-w/2+p_t/sqrt(2)) ; z4 = (w/2+p_t/sqrt(2),h-w/2) ; z5 = (w,h-p_t/sqrt(2)) ; z6 = (w-p_t/sqrt(2),h) ; fill z3--z4--z5--z6--cycle ; penlabels(range 1 thru 6) ; endchar ; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{\char"06} % This is very much like \textunibf{n}, but has a longer rightmost % down stroke. % \begin{macrocode} beginchar(hex"06",x_w#,x_h#,p_d#) ; "The letter eng" ; uniarc(w/2,p_t,(w/2,h-w/2),0,180,10) ; pickup unipensqu ; top lft z1 = (0,h-w/2) ; bot lft z2 = (0,0) ; draw z1--z2 ; top rt z3 = (w,h-w/2) ; bot rt z4 = (w,-d) ; draw z3--z4 ; penlabels(1,2,3,4) ; endchar ; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{\char"07} % \begin{macrocode} beginchar(hex"07",x_w#,l_h#,p_d#) ; "The letter thorn" ; rad := (h+d)/4 ; uniarc(rad,p_t,(w-rad,rad),-90,90,10) ; pickup unipensqu ; top lft z1 = (0,h) ; bot lft z2 = (0,-d) ; draw z1--z2 ; top lft z3 = (p_t,2rad) ; top rt z4 = (w-rad,2rad) ; bot lft z5 = (p_t,0) ; bot rt z6 = (w-rad,0) ; draw z3--z4 ; draw z5--z6 ; penlabels(range 1 thru 6) ; endchar ; exitif (not strict) ; if temp = 2 : code_offset := 0 ; fi ; endfor ; fi ; % \end{macrocode} % \end{fontcode} % % Like in \texttt{unilig.mf} we now employe a trick to generate to % versions of the uppercase letters \textunibf{\NG} and % \textunibf{\TH}, that is \textunibsc{\ng} and \textunibsc{\th}. % % Since there us only two majuscules here, we might as well take % advantige of the extra slot, and make a small caps version of % \textunibf{\varQ}, so this is defined before \textunibf{\NG}, to % take the place of \textunibf{dh}. % \begin{macrocode} if not strict : for temp = 1,2 : if temp = 2 : do_caps(-3) ; fi ; % \end{macrocode} % \begin{fontcode}{\char"08} % This is the variant of \textunibf{Q} based an \textunibf{P}. This % one is \emph{non}--default, you can acces this letter with % \Lcs{varQ}\footnote{I am somewhat troubled with the majuscle `Q', % because I don't know if the default one should be `\textunibf{Q}' or % `\textunibf{\varQ}'. I will keep both characters in the font, but if % enough wnats to chage the default, I will consider this % ofcourse. Tell me \emph{your} opinon!}. % \begin{macrocode} beginchar(hex"08",A_w#,l_h#,0) ; "The variant letter Q"; unicir(w/2,P_t,(w/2,h-w/2),10) pickup Unipensqu ; rt top z1 = (w,h-w/2) ; rt bot z2 = (w,0) ; draw z1--z2 ; penlabels(1,2); endchar ; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{\char"09} % This is similar to \textunibf{N}, execpt the rightmost vertical % stroke ends in an arc. % \begin{macrocode} beginchar(hex"09",A_w#,l_h#,0) ; "The letter Eng" ; rad := 3C_d ; uniarc(w/2,P_t,(w/2,h-w/2),0,180,10) ; uniarc(rad,P_t,(w-rad,rad),-90,0,20) ; pickup Unipensqu ; top lft z1 = (0,h-w/2) ; bot lft z2 = (0,0); draw z1--z2 ; top rt z3 = (w,h-w/2) ; bot rt z4 = (w,rad) ; draw z3--z4 ; penlabels(1,2,3,4) ; endchar ; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{\char"0A} % \begin{macrocode} beginchar(hex"0A",A_w#,l_h#,0) ; "The letter Thorn" ; rad := h/4 ; uniarc(rad,P_t,(w-rad,h/2),-90,90,10) ; pickup Unipensqu ; top lft z1 = (0,h) ; bot lft z2 = (0,0) ; draw z1--z2 ; top lft z3 = (P_t,h/2+rad) ; top rt z4 = (w-rad,h/2+rad) ; bot lft z5 = (P_t,h/2-rad) ; bot rt z6 = (w-rad,h/2-rad) ; draw z3--z4 ; draw z5--z6 ; penlabels(range 1 thru 6) ; endchar ; exitif (not caps) ; if temp = 2 : end_do_caps ; fi ; endfor ; fi ; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{\char"0B} % This is actually a reversed cidelia accent. % \begin{macrocode} beginchar(hex"0B",x_w#,x_h#,2c_d#) ; "The accent ogoneck" ; uniarc(d/2,2P_T/3,(w/2-d/4,-d/2),-90,90,10) ; endchar ; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{\char"0C} % I chose to include the braces in the font, since you might needed % them, and the Computer Modern Roman braces, doesn't really go with % the rest of the font, so if you had to use those, it wouldn't look % very good. They are, however not in the standard position, since % that is already taken up. % \begin{macrocode} beginchar(hex"0C",3c_d#,l_h#,p_d#) ; "The left brace ({)" ; uniarc(2c_d,p_t,(3c_d,h-2c_d),90,180,10) ; uniarc(2c_d,p_t,(3c_d,-d+2c_d),180,270,20) ; pickup unipensqu ; top lft z1 = (c_d,h-2c_d) ; bot lft z2 = (c_d,-d+2c_d) ; draw z1--z2 ; lft z3 = (0,(h-d)/2) ; rt z4 = (c_d,(h-d)/2) ; draw z3--z4 ; penlabels(1,2,3,4) ; endchar ; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{\char"0D} % Discussion above. % \begin{macrocode} beginchar(hex"0D",3c_d#,l_h#,p_d#) ; "The right brace (})" ; uniarc(2c_d,p_t,(0,h-2c_d),0,90,10) ; uniarc(2c_d,p_t,(0,-d+2c_d),270,360,20) ; pickup unipensqu ; top rt z1 = (w-c_d,h-2c_d) ; bot rt z2 = (w-c_d,-d+2c_d) ; draw z1--z2 ; rt z3 = (w,(h-d)/2) ; lft z4 = (w-c_d,(h-d)/2) ; draw z3--z4 ; penlabels(1,2,3,4) ; endchar ; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{\char"0E} % The paragraph sign is usually in the \texttt{cmsy} family, avaliable % in \texttt{OT1} encoding only, but for the same reasons as the % braces above, I decided to include this charater in the font. % \begin{macrocode} beginchar(hex"0E",(l_h#+p_d#+2p_t#)/3,l_h#,p_d#) ; "The Paragraph sign" ; uniarc(w/2,p_t,(w/2,h-w/2),30,270,10) ; uniarc(w/2,p_t,(w/2,w/2-d),-150,90,20) ; unicir(w/2,p_t,(w/2,(h-d)/2),30) ; endchar ; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{\char"0F} % I guess there are no real surprises here --- it's just a bar! % \begin{macrocode} beginchar(hex"0F",p_t#,l_h#,p_d#) ; "The symbol bar (|)" ; pickup unipensqu ; lft top z1 = (0,h) ; lft bot z2 = (0,-d) ; draw z1--z2 ; penlabels(1,2); endchar ; % \end{macrocode} % \end{fontcode} % % The next two characters is included, since I think it would be a % good idea to use \universal{} characters for German % quotation, instead of some Computer Modern Roman character, which % would be totally out of place. % % If you use the \textsf{uni} package you can say % \begin{verbatim} % {\uni % \guillemoleft Hello World\guillemoright\newline % \guilsinglleft Hello World\guilsinglright} % \end{verbatim} % and get % \begin{quote} % {\uni % \guillemoleft Hello World\guillemoright\newline % \guilsinglleft Hello World\guilsinglright} % \end{quote} % % \begin{fontcode}{\char"22} % This is quote a simple character. Do notice the nice use of % \texttt{uniend}, to produce the soft turn. % \begin{macrocode} beginchar(hex"22",2x_w#/3,x_h#,0) ; "The single left guillomot" ; z1 = (p_t,h/2) ; z2 = (w,h) ; phi := angle(z2-z1) ; uniend(p_t,(z1),90+phi,270-phi,10) ; z3 = (w-p_t/sind(phi),h) ; z4 = z1 + p_t*(-sind(phi),cosd(phi)) ; path rombe ; rombe := z1--z2--z3--z4--cycle ; fill rombe ; fill rombe reflectedabout ((0,h/2),(w,h/2)) ; penlabels(1,2,3,4) ; endchar ; % \end{macrocode} % \end{fontcode} % \begin{fontcode}{\char"5C} % \begin{macrocode} beginchar(hex"5C",2x_w#/3,x_h#,0) ; "The single right guillomot"; z1 = (w-p_t,h/2) ; z2 = (0,h) ; phi := 180-angle(z2-z1) ; uniend(p_t,(z1),phi-90,90-phi,10) ; z3 = (p_t/sind(phi),h) ; z4 = z1 + p_t*(sind(phi),cosd(phi)) ; path rombe ; rombe := z1--z2--z3--z4--cycle ; fill rombe ; fill rombe reflectedabout ((0,h/2),(w,h/2)) ; penlabels(1,2,3,4) ; endchar ; % \end{macrocode} % \end{fontcode} %\iffalse % %\fi %\iffalse %<*font> %\fi % \section{Font driver files}\file{ful*.mf} % % This section describes the driver files % \texttt{uni}\meta{series}\meta{shape}\meta{size}\texttt{.mf}, where % \meta{series} is one of \texttt{r} (medium), or \texttt{bf} % (boldface), \meta{shape} one of upright (no letter), \texttt{sl} % (slanted), or \texttt{sc} (small caps), and \meta{size} is the % designsize in points, one of 8, 9, 10, 12, or 17. % % To make the source file shorter, I employed a little trick, % exploiting some of the features of the \textsf{docstrip} % program. That, on the other hand means that the line numbers you see % here, doesn't conform to the actual ones in the driver files. % % First we make sure the base file \texttt{unibase.mf} is loaded, but % not more then once in a run. This is needed since this file contains % all the macros and definitions for the font. % % \begin{macrocode} if unknown unibase : input unibase; fi; % \end{macrocode} % Next we define some \textsl{boolean} variables, determining the % shape of the font we are to create. This are straight forward, and % should be self explanetory. Any number of variables may be set to % \texttt{true}, execpt that it makes no sense to define both % \texttt{bold} and \texttt{medium} to \texttt{true}, so this will be % considered an error, and a medium font will be made. (See alse the % explanation of the \texttt{start\_font} macro in the % \texttt{unibase.mf} section.) % % \begin{verbatim} %<+medium>medium := true ; %<+bold>bold := true ; %<+slanted>slant := true ; %<+caps>caps := true ; %<+strict>strict := true ; %<+eight>start_font(8pt#) ; %<+nine>start_font(9pt#) ; %<+ten>start_font(10pt#) ; %<+twelve>start_font(12pt#) ; %<+seventeen>start_font(17pt#) ; %\end{verbatim} % % The next part of the files just inputs the nessecary source files, % and there is nothing special here. Finally we end the font with the % macro \texttt{end\_font}. % \begin{macrocode} input uniupp ; input unilow ; input unidig ; input unispe ; input unilig ; input unipun ; input uniacc ; input uniext ; end_font; % \end{macrocode} %\iffalse % %\fi %\iffalse %<*docpackage> %\fi % \section{Commands for the Documentation --- \texttt{unidoc.sty}} % \file{unidoc.sty}\label{app:unidoc} % % \textsc{Warning:} Most of the macros defined in this file uses % \TeX{} primitivs like \Lcs{def} and \Lcs{let}, contorary to the % recommendations in \clsguide{}. This means you shouldn't try to use % this package in conjunction with normal \LaTeXe{} documents, since % it will not nessecarily by portable, and may generate unwanted % resaults. This package is \emph{only} intended for the documentation % of the \universal{} package, \emph{and nothing else!} % % \subsection{Initializing} % % First we need to identify the package, its version and release % date, etc. % \begin{macrocode} \ProvidesPackage{unidoc} [\unifiledate\space\unifileversion\space universal documenation package.] % \end{macrocode} % % \begin{macro}{\ifeepic} % \begin{macro}{\eepictrue} % \begin{macro}{\eepicfalse} % % In case we can load the package \textsf{eepic}, we will set % \cs{eepictrue}, and make a plot of the shapes problem. % % \begin{macrocode} \newif\ifeepic\eepicfalse % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % % Then we load some pacakges needed. \textsf{doc} is ofcourse needed % to do all the actual typesetting of macros etc., while \textsf{uni} % is needed for the fonts\footnote{This means ofcourse, that you % needed to have all the \MF{} sources ready, or in other words, you % should have run \texttt{universa.ins} through \LaTeX{}.}, and % finally \textsf{mflogo} is needed for the \MF{} logo. % % \begin{macrocode} \DeclareOption*{\PassOptionsToPackage{\CurrentOption}{uni}} \ProcessOptions\relax \RequirePackage{doc} \RequirePackage{mflogo} \RequirePackage[colorlinks,% linkcolor=red,% anchorcolor=black,% citecolor=green,% filecolor=black,% menucolor=black,% urlcolor=blue,% hyperindex,% linktocpage,% pdfduplex=duplexFlipLongEdge,% a4paper,% bookmarks=true]{hyperref} \RequirePackage{uni} \IfFileExists{eepic.sty}{% \RequirePackage{eepic}\eepictrue}{% \PackageWarning{unidoc}{`eepic.sty' not found, so there will be no pictures - you are warned.}\eepicfalse} % \end{macrocode} % % \subsection{Macros for the Index} % % \begin{macro}{\file} % First we save the argument --- the current output filename --- in a % command, set the codeline counter to zero (since every starts at % line 1, obviously). Then we check to see if we are outputting files % at all. If we are, we write an index entry. % \begin{macrocode} \def\file#1{ \def\c@r{#1} \c@CodelineNo0 \if@filesw \immediate\write\@indexfile {\string\indexentry{#1=\string\texttt{#1}% \string\space(File)}% {\thepage}}\fi} % \end{macrocode} % \end{macro} % \begin{macro}{\main} % This command is used be \texttt{doc.sty}, to choose the font for the % codelines numbers in the index. It is set to \texttt{typewriter}. % \begin{macrocode} \def\main#1{\texttt{{\small\c@r}:\ #1}} % \end{macrocode} % \end{macro} % \begin{macro}{\src} % To make the index reflect, that more then one file is present, and % therefore more then one entry could have the same codeline number, % we put the file name before the codeline number in the index. The % name is gotten from the \Lcs{file} command. This ofcourse takes up % quite some space in the index, so later on we speciffy the index % to only have 2 columns. % \begin{macrocode} \def\src#1#2{\texttt{{\small#1}:\ #2}} % \end{macrocode} % \end{macro} % \begin{macro}{\fontcodeindex} % The next two commands are responsible for writting the index entries % of the above environments. They are similar to the \texttt{doc} % package command \Lcs{codeline@wrindex} but uses the filenames % defined by \Lcs{file} (via the \Lcs{src} command), and the % \Lcs{fontcodeindex} uses a font appropiat for the font descriped % (i.e., \Lcs{FontCodeFont}) % \begin{macrocode} \def\fontcodeindex#1{% \@bsphack\begingroup\let\_=\protect\_% \special@index{% \expandafter\string#1\actualchar% {\string\FontCodeFont\space#1}% \encapchar src{\c@r}}\endgroup\@esphack} % \end{macrocode} % \end{macro} % \begin{macro}{\fontmacroindex} % \begin{macrocode} \def\fontmacroindex#1{% \@bsphack\begingroup\let\_=\protect\_% \special@index{% \expandafter\string#1\actualchar% {\string\MacroFont\space#1}% \encapchar src{\c@r}}\endgroup\@esphack} % \end{macrocode} % \end{macro} % % \subsection{Descriptive Environments} % % The next counters are to do some more advanced stuff on the on line % numbers in the index. Instead of just writting the beginning line of % the fontcode, we writte the complete interval of the fontcode. See % also the command \Lcs{f@ntcodeindex} and \Lcs{f@ntmacroindex}. % \begin{macrocode} \newcount\startfontcodeline \newcount\startfontmacroline % \end{macrocode} % \begin{macro}{\fontcode} % \begin{macro}{\endfontcode} % \begin{macro}{\FontCodeFont} % \begin{macro}{\PrintFontName} % Next comes two environments for descriping the font programs, and % font macros. They are similar to the environment \texttt{macro} in % the \texttt{doc} package. However, some alterations is made, so that % the right font is used in the index. (See also the % \Lcs{fontcodeindex} macro below.) Also, notice the defintion of % \Lcs{saved@macroname} and \Lcs{PrintFontName}. This is done so that % control sequnces in the argument to \texttt{fontcode} environment, % which should expand to a single letter, comes out expanded, rather % then the actual control sequences, which isn't wanted here. % \begin{macrocode} \def\fontcode#1{ \def\saved@fontname{#1} \let\temp@MF\MacroFont\let\MacroFont\FontCodeFont \let\temp@PMN\PrintMacroName\let\PrintMacroName\PrintFontName \let\temp@SMI\SpecialMainIndex \let\SpecialMainIndex\fontcodeindex \macro{#1}} \def\endfontcode{ \endmacro \let\MacroFont\temp@MF \let\SpecialMainIndex\temp@SMI \let\PrintMacroName\temp@PMN} \let\FontCodeFont\unibf \def\PrintFontName#1{\strut\MacroFont\saved@fontname\ } % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % % \begin{macro}{\fontmacro} % \begin{macro}{\endfontmacro} % This is similar to \texttt{fontcode} environment, but is used to % descripe the macros of \texttt{unibase}. The reason why we employ to % environments, and not just one, is that the margin notes should come % out in \texttt{typewriter} font in this environment, while it % should be in \universal{} font above. % \begin{macrocode} \def\fontmacro#1{ \let\temp@under\_ \let\_\MacroUnderscore \let\temp@SMI\SpecialMainIndex \let\SpecialMainIndex\fontmacroindex \macro{#1}} \def\endfontmacro{% \endmacro\let\SpecialMainIndex\temp@SMI\let\_\temp@under} \def\MacroUnderscore{{\char"5F}} % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{\illubegin} % \begin{macro}{\illuother} % \begin{macro}{\endillu} % \begin{macrocode} \let\beginillu\ifeepic \let\illuother\else \let\endillu\fi % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % % \subsection{Useful Commands} % % \begin{macro}{\Newestchanges} % This macro is intended to be used like the \Lcs{changes} macro of % the \textsf{doc} package. However, it should only be used on the last % most change. But rather then just making an entry in the the % glossary, it will also print a line saying when this macro was last % changed. This is something like what is done in % \texttt{ltxguide.cls}, but a bit different, since in that class not % enough is being done glossary--wise, and too much is done % margin--wise. When making an update to a macro, the new % \Lcs{changes} should be made with \Lcs{Newestchanges}, and the old % \Lcs{Newestchanges} should be renamed to \Lcs{changes}. Notice that % \texttt{doc.sty} says \Lcs{def}\Lcs{saved@macroname}\texttt{\{\}}, % so we can't say % \begin{verbatim} % \ifx\saved@macroname\relax % \end{verbatim} % since \Lcs{relax} \emph{isn't} the same as an empty definition, but % \Lcs{@empty} is. In the case that \Lcs{saved@macroname} is defined % to something, then we put a bullet ($\bullet$) in the margin, and % attach a footnote to it, where the footnote text contains the proper % information. Ofcourse this could led to a lot of footnotes, but the % alternative is to redefine the \texttt{macro} environment, and I % really didn't have the stomach for that, Sorry. Notice the use of % \Lcs{@gobble}, that removes the leading `v' in the version number. % \begin{macrocode} \def\Newestchanges#1#2#3{ \ifx\saved@macroname\@empty% \marginpar{\small\raggedright{\sl Change on} #2, {\sl Version} \expandafter\@gobble#1} \else% \llap{$\bullet$\footnote{{\sl Change of } {\MacroFont\expandafter\string\saved@macroname} {\sl on} #2, {\sl Version }\expandafter\@gobble#1}} \fi \changes{#1}{#2}{#3}} % \end{macrocode} % \end{macro} % % \begin{macro}{\Lcs} % Finally we define a short hand for \Lcs{...}, to make the % documentaion easier. % \begin{macrocode} \def\Lcs#1{\texttt{\char"5C{}#1}} % \end{macrocode} % \end{macro} % % \subsubsection{The Font Charts} % % \begin{macro}{\FontChart} % This macro is for typesetting a table of the font. It is taken from % \texttt{testfont.tex}. % % First we define some counters to use in the table. \Lcs{n} is the % counts the number of letters and symbols typeset so far, while % \Lcs{m} is counting the number of typeset characters in current % line. \Lcs{p} is a penalty counter. The dimension \Lcs{dim} is used % for setting the characters appropiate. % % We also define a new \Lcs{if}, used to see if we should go on. % % \Lcs{oct} and \Lcs{hex} are used for typesetting numbers in % octadecimal and hexadecimal notation respectivily. % \begin{macrocode} \newcount\n\newcount\m\newcount\p\newdimen\dim \newif\ifskipping \def\oct#1{\hbox{\rm\'{}\kern-.2em\it#1\/\kern.05em}} \def\hex#1{\hbox{\rm\H{}\tt#1}} % \end{macrocode} % \begin{macro}{\setdigs} % This is used to set the counters \Lcs{n} and \Lcs{m} every time a % new (double) line is started. % \begin{macrocode} \def\setdigs#1"#2{\gdef\h{#2} \m=\n \divide\m by 64 \xdef\0{\the\m}% \multiply\m by-64 \advance\m by\n \divide\m by 8 \xdef\1{\the\m}} % \end{macrocode} % \end{macro} % \begin{macro}{\testrow} % This is used to see how we should typeset the current row. % \begin{macrocode} \def\testrow{\setbox0=\hbox{\penalty 1\def\\{\char"\h}% \\0\\1\\2\\3\\4\\5\\6\\7\\8\\9\\A\\B\\C\\D\\E\\F% \global\p=\lastpenalty}} % \end{macrocode} % \end{macro} % \begin{macro}{\oddline} % This is used to typeset topmost line of a double line. It basically % just putting a line and some saces into the chart. % \begin{macrocode} \def\oddline{ \cr\noalign{\nointerlineskip}\multispan{19}\hrulefill& \setbox0=\hbox{\lower 2.3pt\hbox{\hex{\h x}}}\smash{\box0}\cr \noalign{\nointerlineskip}} % \end{macrocode} % \end{macro} % \begin{macro}{\evenline} % This is used to typeset bottommost line of a double line. It % basically does the same as \Lcs{oddline}, but also checks to see if % we need to end the chart or go on. % \begin{macrocode} \def\evenline{ \loop\skippingfalse \ifnum\n<256 \m=\n \divide\m 16 \chardef\next=\m \expandafter\setdigs\meaning\next \testrow \ifnum\p=1 \skippingtrue \fi\fi \ifskipping \global\advance\n 16\repeat \ifnum\n=256 \let\next=\endchart\else\let\next=\morechart\fi \next} % \end{macrocode} % \end{macro} % % \begin{macro}{\morechart} % This macro is called every time we need to typeset a new double line % of the chart. % \begin{macrocode} \def\morechart{ \cr\noalign{\hrule\penalty5000} \chartline \oddline \m=\1 \advance\m 1 \xdef\1{\the\m} \chartline \evenline} % \end{macrocode} % \end{macro} % % \begin{macro}{\chartline} % \begin{macro}{\chartstrut} % \Lcs{chartline} is called every time we need to typeset a line of % the chart. Notice it uses the macro \Lcs{:} to do the % job. \Lcs{chartstrut} is used to get approiate spacing. % \begin{macrocode} \def\chartline{&\oct{\0\1x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&} \def\chartstrut{\lower4.5pt\vbox to14pt{}} % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{\:} % \begin{macro}{\reposition} % \begin{macro}{\centerlargechars} % These macros are used for typesetting the actual characters in the % chart. \Lcs{:} gives the appropiate space for a character and % encriments the \Lcs{n} counter, while \Lcs{reposition} places the % character nicely in the the chart. \Lcs{centerlargechars} does the % same for {\large large} characters. % \begin{macrocode} \def\:{\setbox0=\hbox{\char\n}% \ifdim\ht0>7.5pt\reposition \else\ifdim\dp0>2.5pt\reposition\fi\fi \box0\global\advance\n 1 } \def\reposition{ \setbox0=\vbox{\kern2pt\box0}\dim=\dp0 \advance\dim 2pt \dp0=\dim} \def\centerlargechars{ \def\reposition{\setbox0=\hbox{$\vcenter{\kern2pt\box0\kern2pt}$}}} % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % \begin{macro}{\chart} % \begin{macro}{\endchart} % These two macros is what starts and ends the chart. \Lcs{chart} sets % up the appropiate stuff, and writes the top most line in the % chart. \Lcs{endchart} is called by \Lcs{evenline} if no more % characters should be typeset, and then it finished everything off, % plus writes the last line of the chart. % \begin{macrocode} \def\chart{$$\global\n=0 \halign to\hsize\bgroup \chartstrut##\tabskip0pt plus10pt&&\hfil##\hfil&\vrule##\cr \lower6.5pt\null&&& \oct0&&\oct1&&\oct2&&\oct3&&\oct4&&\oct5&&\oct6&&\oct7&\evenline} \def\endchart{ \cr\noalign{\hrule} \raise11.5pt\null&&&\hex 8&&\hex 9&&\hex A&&\hex B& &\hex C&&\hex D&&\hex E&&\hex F&\cr \egroup$$\par} % \end{macrocode} % \end{macro} % \end{macro} % % Finally we get to the \emph{real} macro. This macro takes one % argument, the name of the \meta{font driver file}. We put the chart % inside a \texttt{figure} environment, so that we may refer to it % latter. This is done using the label \texttt{chart:}\meta{font driver % file}. The chart is encapsulated in a group, so that the definition % of \Lcs{chart@font} doesn't get in the way elsewhere in the document. % \begin{macrocode} \def\FontChart#1#2{ %% \marginpar{\small\raggedright Letters and symbols in \texttt{#1} %% font.} \begin{figure}[htbp] \begingroup \font\chart@font=#1 \chart@font \chart \endgroup \caption{Letters and symbols in \texttt{#1} --- #2} \label{fig:font:#1} \end{figure}} % \end{macrocode} % \end{macro} % % \subsection{Parameters and Miscillaneous Commands} % % This is used --- as explaind in \texttt{doc.dvi} --- to give a % different prologue to the index, more suitable to our needs. % \begin{macrocode} \IndexPrologue{% \section{Index}\markboth{Index}{Index} The Numbers written in \textit{italic} refer to the pages, where a macros usage is descriped, while those in \texttt{typewrite} refer to line numbers in the files, mentioned before, where the definition is, while \textsl{slanted} shows the places it is used. Normal letters refer to pages, wether it be descriptions or usage.} \GlossaryPrologue{% \section{Change History}\markboth{Change History}{Change History} Below is listed the changes made to the \universal{} font and the \LaTeX{} support package \textsf{uni}, from version~1.0 to 2.0.} % \end{macrocode} % Also we set the number of columns in the index to 2, since some % space is needed for the entries % \begin{macrocode} \setcounter{IndexColumns}{2} % \end{macrocode} % We don't want the index flutted with silly command sequences, so we % leave some of them out. % \begin{macrocode} \DoNotIndex{\@bsphack,\@empty,\@esphack,\@gobble,\@ifnextchar,% \@ifundefined,\@indexfile,\@onlypreamble,\iffalse,\_,\,\accent,% \aftergroup,\actualchar,\advance,\begin,\begingroup,\bgroup,% \box,\bullet,\changes,\char,\chardef,\CheckModules,\CodeLineIndex,% \cr,\crcr,\csname,\DeclareFontFamily,\DeclareFontShape,\DeclareMacro,% \dim,\divide,\dp,\DeclareOption,\def,\DoNotIndex,\edef,\egroup,\else,% \end,\endcsname,\EnableCrossrefs,\encapchar,\endgroup,\endmacro,% \expandafter,\fbox,\fi,\font,\footnote,\fontemcoding,\fontfamuliy,% \fontseries,\fontshape,\gdef,\global,\H,\h,\halign,\hbox,\hfil,% \hidewidth,\hrule,\hrulefill,\hsize,\ht,\hyphenchar,\if@filesw,% \ifdim,\IfFileExists,\ifnum,\ifskipping,\ifx,\immediate,\indexentry,% \it,\itdefault,\kern,\lastpenalty,\LaTeX,\LaTeXe,\leavevmode,\let,% \llap,\loop,\lower,\m,\macro,\MacroFont,\marginpar,\marginparwidth,% \markboth,\mdseries,\meaning,\multiply,\multispan,\n,\newcommand,% \newcount,\newdimen,\newif,\newline,\next,\noalign,\noexpand,% \nointerlineskip,\not@math@alphabet,\null,\ooalign,\p,\par,\penalty,% \ProcessOptions,\protect,\ProvidesFile,\ProvidesPackage,% \RecordChanges,\raggedright,\raise,\relax,\renewcommand,\repeat,% \RequirePackage,\rm,\saved@macroname,\scshape,\section,\selectfont,% \setcounter,\setbox,\show,\skippingfalse,\skippingture,\sl,\slshape,% \small,\smash,\space,\special@index,\SpecialMainIndex,\stop,\string,% \strut,\tabskip,\TeX,\TeXbook,\textit,\textsf,\textsl,\texttt,\the,% \thepage,\tt,\typeout,\unhbox,\universal,\upshape,\usefont,\vbox,% \vcenter,\vrule,\write,\xdef,\z@,\PackageError,\PackageWarning, \PassOptionsToPackage,\GlossaryPrologue,\',\0,\1,\bfseries, \centerlargechars,\DeclareRobustCommand,\DeclareTextFontCommand, \ExecuteOptions,\familydefault,\fontencoding,\fontfamily,\hex,\oct, \IndexPrologue,\oddline} % \end{macrocode} % And then we define the behaviour of the \textsf{doc} package, by % setting a number of flags (as explained in the documentation of the % \textsf{doc} package). We also set the margin paragraph widths to be % a bit smaller then usual. % \begin{macrocode} \EnableCrossrefs \CodelineIndex \RecordChanges \CheckModules \marginparwidth=54pt % \end{macrocode} % % \begin{macro}{\NFSS} % \begin{macro}{\ftnguide} % \begin{macro}{\clsguide} % \begin{macro}{\MFbook} % \begin{macro}{\universal} % % Some utility macros used in the documentation. % % \begin{macrocode} \newcommand{\NFSS}{\textsf{NFSS}} \newcommand{\ftnguide}{\textit{\LaTeXe{} Font Selection}} \newcommand{\clsguide}{ \textit{\LaTeXe{} for Class and Packages Writers}} \newcommand{\TeXbook}{\TeX\textsf{book}} \newcommand{\MFbook}{\MF\textsf{book}} \newcommand{\universal}{\textunibf{universal}} % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % %\iffalse % %\fi % \Finale % % \iffalse % Local Variables: % mode: docTeX % End: % \fi