Hallo,
ich möchte gerne ein Dokument in Sütterlin erstellen.
Leider bekomme ich es nicht hin, die Schrift zentral einzustellen.
im Kopf steht bei mir:
\newfont{\suet}{suet14}
\newfont{\schwell}{schwell}
damit kann ich dann auch im Dokument Abschnitte entsprechend darstellen, aber das ist ja nicht das Ziel. (Das Paket suettlin.sty konnte ich bisher nicht finden um es zu nutzen. Aber das beantwortet bestimmt auch nicht die Frage)
Das Gleiche möchte ich auch mit yfrak aus dem oldgerman-Pakage machen.
Gruß
Alex
nixversteh
10-06-2012, 19:09
Hallo alex,
willkommen im Forum,
versuche mal diesen Code
\documentclass{article}
\newfont{\suet}{suet14}
\DeclareTextFontCommand{\textsuet}{\suet}
\begin{document}
\suet{ABCDEFGHIJKLMNOPQRSTUVWXYZ}
\suet{abcdefghijklmnopqrstuvwxyz}\\
\textsuet{hallo}
Hallo Welt
\end{document}
Viel Erfolg.
Gruß
Martin
PS.: Version 2:
\documentclass{article}
\usepackage{suetterl}
\begin{document}
\textsuetterlin{ABCDEFGHIJKLMNOPQRSTUVWXYZ}
\begin{itemize}
\item \textsuetterlin{hallo}
\end{itemize}
\begin{itemize}
\item \textsuetterlin{hallo}
\end{itemize}
\end{document}
Hallo
danke für Deine schnelle Antwort.
Dein Beispiel klappt auf jeden Fall schon mal. Nur in meinem Doument passiert garnichts. Hier nochmal der gesamte Kopf - vielleicht habe ich mir ja da was selber verbaut:
\usepackage{amsmath,amsfonts,amssymb}
% für Aktzente http://de.wikibooks.org/wiki/LaTeX-Kompendium:_Sonderzeichen
\usepackage[T1]{fontenc}
% Verknüpfungen
\usepackage{hyperref}
% Zum durchstreichen von Text oder Formeln
\usepackage{cancel}
% Nutzung von \captionof{}{}
\usepackage{caption}
% Um Erinnerungen und Hinweise für die Bearbeitung nutzen zu können (\missingfigure{} \todo{})
\usepackage[colorinlistoftodos,
textsize=scriptzise,
shadow,
german]
{todonotes}
% Code einfügen
\usepackage{listings}
% ein paar Einstellungen
\lstset{language=C,
numbers=left,
tabsize=4}
% für Rahmen
\usepackage{framed}
% für Tabellen im Mathemodus
\usepackage{array,booktabs}
\newcolumntype{C}{>{$}c<{$}}
\newcolumntype{L}{>{$}l<{$}}
\newcolumntype{R}{>{$}r<{$}}
% Einstellung des Formelzählers
\numberwithin{equation}{section}
% Definieren der Ansicht von Section
\renewcommand{\thesection}{\arabic{section}}
\renewcommand{\thesubsection}{\alph{subsection})}
\usepackage{tikz}
\usepackage{moreverb}
\author{Frank}
\title{Objektorientierte Programmierung mit C}
\DeclareTextFontCommand{\textsuet}{\suet}
\begin{document}
Was auffält ist, dass wenn ich \suet{} gleich hinter das begin{document} setze ist der Text in Sütterlin. Allerdings gehen dann die Absätze verloren, sodass die Überschrift im Text steht und selber allerdings noch in der alten Schrift dargestellt wird.
nixversteh
10-06-2012, 19:37
Hallo alex,
sorry, da fehlen so einige Codeschnippsel ... stelle bitte dein Dokument komplett ein.
Gruß
Martin
\documentclass[11pt,a4paper,onecolumn,titlepage]{article}
\setlength{\hoffset}{-1in}
\setlength{\evensidemargin}{2cm}
\setlength{\oddsidemargin}{2cm}
\setlength{\textwidth}{17cm}
\usepackage[utf8x]{inputenc}
\usepackage[ngerman]{babel}
\usepackage{ucs}
%
% Schrift
\usepackage{oldgerm}
\newfont{\suet}{suet14}
\newfont{\schwell}{schwell}
\newcommand{\gfl}{\textquotedblleft}
\newcommand{\gfr}{\textquotedblright}
%
\usepackage{amsmath,amsfonts,amssymb}
% für Aktzente http://de.wikibooks.org/wiki/LaTeX-Kompendium:_Sonderzeichen
\usepackage[T1]{fontenc}
% Verknüpfungen
\usepackage{hyperref}
% Zum durchstreichen von Text oder Formeln
\usepackage{cancel}
% Nutzung von \captionof{}{}
\usepackage{caption}
% Um Erinnerungen und Hinweise für die Bearbeitung nutzen zu können (\missingfigure{} \todo{})
\usepackage[colorinlistoftodos,
textsize=scriptzise,
shadow,
german]
{todonotes}
% Code einfügen
\usepackage{listings}
% ein paar Einstellungen
\lstset{language=C,
numbers=left,
tabsize=4}
% für Rahmen
\usepackage{framed}
% für Tabellen im Mathemodus
\usepackage{array,booktabs}
\newcolumntype{C}{>{$}c<{$}}
\newcolumntype{L}{>{$}l<{$}}
\newcolumntype{R}{>{$}r<{$}}
% Einstellung des Formelzählers
\numberwithin{equation}{section}
% Definieren der Ansicht von Section
\renewcommand{\thesection}{\arabic{section}}
\renewcommand{\thesubsection}{\alph{subsection})}
\usepackage{tikz}
\usepackage{moreverb}
\author{Frank}
\title{Objektorientierte Programmierung mit C}
\DeclareTextFontCommand{\textsuet}{\suet}
\begin{document}
%
\suet{}
\maketitle
%
\section*{zur Person Dipl.-Ing. Frank Listing}
%
*Dipl.-Ing. Frank Listing ist seit 2002 Trainer und Projektcoach bei der MicroConsult GmbH mit dem Schwerpunkt Microsoft-Plattformen, objektorientierte Programmierung und Testen von Embedded Systemen und u.a. fachlich für das Thema .NET verantwortlich.
%
\section*{Objektorientierte Programmierung mit C}
%
Obwohl C keine objektorientierte Sprache ist, ist die objektorientierte Programmierung mit ihr möglich. Dieser Artikel beschäftigt sich mit der Umsetzung von UML-Elementen aus dem Klassendiagramm in C-Code. Es wird gezeigt, was möglich ist und wo die Umsetzung mit der Programmiersprache C an ihre Grenzen stößt.\\[12pt]
%
Die UML (Unified Modeling Language) hat sich mittlerweile auch im Embedded-Bereich als eine akzeptierte Notation etabliert. Sie wird in immer mehr Projekten eingesetzt, um den Aufbau und das Verhalten der Programme zu beschreiben.\\[12pt]
%
Dabei gibt es verschiedene Bereiche in der UML, die mehr oder weniger nah am Code sind. Wo ein Paketdiagramm noch die Architektur beschreibt und weitgehend unabhängig von der später verwendeten Programmiersprache ist, muss bei der Erstellung von Klassendiagrammen schon an die spätere Implementierung gedacht werden, da nicht jedes in der UML unterstützte Merkmal auch in jeder Programmiersprache verfügbar ist.\\[12pt]
%
Die bei der Embedded-Programmierung zurzeit am häufigsten verwendete Programmiersprache C ist nicht objektorientiert. Dies dient in vielen Projekten als Ausrede, um nicht über neue Methoden der Programmierung nachdenken zu müssen. Dabei findet objektorientierte Entwicklung im Kopf des Entwicklers statt. Sie lässt sich mit jeder Programmiersprache umsetzen.\\
%
Bei einer nicht objektorientierten Programmiersprache muss mit zusätzlichen Regeln und Techniken ein Umfeld geschaffen werden, das diese Art der Programmierung ermöglicht.
%
\section*{UML-Klassen in C umsetzen}
%
%\begin{floatingfigure}{10}
\begin{center}
\includegraphics[scale=0.7]{27.jpg}
%\end{floatingfigure}
\captionof{figure}{Eine Klasse in UML dargestellt. Die Klassen enthalten Attribute (Daten, z.B. Attribut geschwindigkeit vom Typ integer) sowie Operationen (Funktionen, z.B. fahre():void).}
\end{center}
%
Eines der wichtigsten Elemente in der UML ist die Klasse. Sie steht im Mittelpunkt der objektorientierten Programmierung. Das Klassendiagramm der UML stellt die im Projekt verwendeten Klassen mit ihren Attributen (entspricht den Daten) und Operationen (entspricht den Funktionen) und andererseits die Beziehungen zwischen den Klassen dar.\\[12pt]
%
In der Programmiersprache C gibt es kein Syntaxelement für die Klasse. Allerdings gibt es die Struktur als Mittel, komplexe Daten strukturiert abzulegen. Im einfachsten Fall wird eine Struktur mit einem zugeordneten Satz von Funktionen definiert. Per Programmiervorschrift wird festgelegt, dass auf die Struktur nur über die speziellen Funktionen zugegriffen werden darf.
%
\begin{center}
\begin{framed}
\begin{lstlisting}
typedef struct
{
int anzahlRaeder;
char* hupTon;
int geschwindigkeit;
}Auto;
void Auto_init(Auto *this, int anzahlRaeder, char* hupTon);
void Auto_fahre(Auto *this);
void Auto_hupe(Auto *this, int anzahl);
\end{lstlisting}
\end{framed}
\captionof{lstlisting}{eine Klasse in C} \label{Listing 1-1}
\end{center}
%
%
\section*{Zuordnung von Funktionen und Struktur}
%
Die Zuordnung von Funktion und Struktur erfolgt über den ersten Parameter der Funktion – das ist immer ein Zeiger auf die Instanz der Struktur, die gerade bearbeitet wird. Dieser Parameter entspricht dem this-Pointer in C++.
%
\begin{center}
\begin{framed}
\begin{lstlisting}
// Objekt auf dem Stack
Auto a;
Auto_init(&a, 4, "tut");
Auto_fahre(&a);
Auto_hupe(&a, 3);
\end{lstlisting}
\end{framed}
\captionof{lstlisting}{Objekterzeugung auf dem Stack} \label{Listing 1-2}
\end{center}
%
\begin{center}
\begin{framed}
\begin{lstlisting}
// Objekt auf dem Heap
Auto *pa= (Auto*)malloc(sizeof(Auto));
Auto_init(pa, 3, "maep");
Auto_fahre(pa);
Auto_hupe(pa, 2);
free(pa);
\end{lstlisting}
\end{framed}
\captionof{lstlisting}{Objekterzeugung auf dem Heap} \label{Listing 1-3}
\end{center}
%
Das Problem dieser einfachen Lösung ist, dass gegen Vorschriften auch gern mal verstoßen wird und damit das objektorientierte Gebäude zum Einsturz gebracht wird. Auf dieses Dilemma wird später noch näher eingegangen.
Beziehungen zwischen den Klassen implementieren
\begin{center}
\includegraphics[scale=0.7]{28.jpg}
\captionof{figure}{UML-Diagramm einer gerichteten Assoziation. Das Objekt namens Garage steht in Beziehung zum Objekt Auto. Solche Beziehungen werden in C durch Zeiger umgesetzt.}
\label{Bild 2}
\end{center}
%
Nach den Klassen geht es an die Darstellung der Beziehungen zwischen ihnen. Im Klassendiagramm werden Assoziation, Aggregation und Vererbung verwendet. Die Assoziation ist eine einfache Beziehung zwischen zwei gleichrangigen Klassen (Abbildung \ref{Bild 2}).\\[12pt]
%
Die Umsetzung im C-Code ist einfach: Eine Klasse enthält einen Zeiger auf die andere Klasse. Bei der gerichteten Assoziation (siehe Abbildung) hat nur eine von beiden Klassen einen Zeiger auf die andere, und bei einer bidirektionalen Assoziation haben beide Klassen einen Zeiger auf die jeweilige andere Klasse.
%
\begin{center}
\begin{framed}
\begin{lstlisting}
typedef struct
{
Auto* pAuto;
}Garage;
void Garage_init(Garage *this);
void Garage_init2(Garage *this, Auto *pAuto);
void Garage_einparken(Garage *this, Auto *pAuto);
void Garage_ausparken(Garage *this);
\end{lstlisting}
\end{framed}
\captionof{lstlisting}{die Klasse Garage enthält einen Zeiger auf die Klasse Auto} \label{Listing 2-1}
\end{center}
%
Da die einzelnen Objekte erst einmal nichts voneinander wissen, muss im Programmcode noch eine Verbindung zwischen ihnen hergestellt werden:
%
\begin{center}
\begin{framed}
\begin{lstlisting}
Auto a;
Garage g;
Auto_init(&a, 4, "tut");
Garage_init(&g);
Garage_einparken(&g, &a);
\end{lstlisting}
\end{framed}
\captionof{lstlisting}{In der Funktion Garage$\underline{~\;}$einparken() wird die Assoziation initialisiert.}
\label{Listing 2-2}
\end{center}
%
%
\section*{Umsetzung von Aggregation in C}
%
\begin{center}
\includegraphics[scale=0.7]{29.jpg}
\captionof{figure}{Die Aggregation der UML ist eine „besteht aus“-Beziehung. Das Auto besteht (unter anderem) aus einem Motor. Eine Aggregation kann in C realisiert werden, indem das einzubettende Objekt als Member in die Struktur des äußeren Objektes aufgenommen wird.}
\label{Bild 3}
\end{center}
%
Die Aggregation ist eine „besteht aus“-Beziehung, hier wird ein Objekt in ein anderes eingebettet (Abbildung \ref{Bild 3}). Eine Aggregation kann realisiert werden, indem das einzubettende Objekt als Member in die Struktur des äußeren Objektes aufgenommen wird.
%
\begin{center}
\begin{framed}
\begin{lstlisting}
typedef struct
{
int anzahlRaeder;
char* hupTon;
int geschwindigkeit;
Motor motor;
}Auto;
\end{lstlisting}
\end{framed}
\captionof{lstlisting}{die Klasse Auto aggregiert ein Objekt der Klasse Motor}
\label{Listing 3}
\end{center}
%
Genau genommen ist diese Beziehung sogar eine Komposition, die strengere Form der Aggregation, da das eingebettete Objekt mit dem äußeren Objekt zerstört wird.
%
\begin{center}
\includegraphics[scale=0.7]{30.jpg}
\captionof{figure}{UML-Diagramm für die Vererbung. Die Basisklasse Auto vererbt ihre Daten und Funktionen an die abgeleitete Klasse Autokran weiter, die wiederum erweitert werden kann (z.B. um das Attribut tragKraft vom Typ integer). In der Programmiersprache C kann tatsächlich auch eine Vererbung realisiert werden.}
\label{Bild 4}
\end{center}
%
Bei der Vererbung werden Daten und Funktionen einer Basisklasse in einer abgeleiteten Klasse wiederverwendet und erweitert (Abbildung \ref{Bild 4}). In der Programmiersprache C kann tatsächlich auch eine Vererbung realisiert werden. Da der ANSI-Standard die Anordnung der Daten im Speicher regelt, kann durch Aggregation der Basisklasse als erstes Element in der Struktur der abgeleiteten Klasse eine Vererbung erreicht werden.
%
\begin{center}
\begin{framed}
\begin{lstlisting}
typedef struct
{
int anzahlRaeder;
char* hupTon;
int geschwindigkeit;
Motor motor;
}Auto;
void Auto_init(Auto *this, int anzahlRaeder, char* hupTon);
void Auto_fahre(Auto *this);
void Auto_hupe(Auto *this, int anzahl);
void Auto_setGeschwindigkeit(Auto *this, int geschwindigkeit);
int Auto_getGeschwindigkeit(Auto *this);
\end{lstlisting}
\end{framed}
\captionof{lstlisting}{eine Basisklasse}
\label{Listing 4-1}
\end{center}
%
%
\begin{center}
\begin{framed}
\begin{lstlisting}
typedef struct
{
Auto;
int tragKraft;
}Autokran;
void Autokran_init(Autokran *this, int tragKraft);
void Autokran_init2(Autokran *this, int tragKraft,
int anzahlRaeder, char* hupTon);
void Autokran_hebe(Autokran *this, int gewicht);
\end{lstlisting}
\end{framed}
\captionof{lstlisting}{eine abgeleitete Klasse}
\label{Listing 4-2}
\end{center}
%
\begin{center}
\begin{framed}
\begin{lstlisting}
void test(void)
{
Autokran kran;
Autokran_init(&kran, 50);
Auto_setGeschwindigkeit((Auto*)&kran, 20);
Auto_hupe((Auto*)&kran, 3);
Auto_setGeschwindigkeit((Auto*)&kran, 0);
Autokran_hebe(&kran, 20);
Autokran_hebe(&kran, 60);
}
\end{lstlisting}
\end{framed}
\captionof{lstlisting}{die abgeleitete Klasse kann die Funktionen der Basisklasse benutzen}
\label{Listing 4-3}
\end{center}
%
Durch das Einfügen der Basisklassendaten als erstes Element in die Struktur werden diese auch als erstes in den Speicher gelegt. Wird dann eine Funktion der Basisklasse aufgerufen, findet diese die ihr bekannten Daten.
%
\begin{center}
\begin{framed}
\begin{lstlisting}
\end{lstlisting}
\end{framed}
\captionof{lstlisting}{eine abgeleitete Klasse}
\label{Listing 4-4}
\end{center}
%
%
\section*{Daten vor unberechtigter Manipulation schützen}
%
Bisher wurde die Datenstruktur der Klasse öffentlich im Header abgelegt, und es wurde davon ausgegangen, dass sich jeder Entwickler brav an die Vorschriften hält und auf die Struktur nie direkt, sondern nur über die zugeordneten Funktionen zugreift. Die Realität kennt aber nicht nur brave Entwickler. Sei es Unwissenheit oder Bequemlichkeit, es wird nicht lange dauern, bis jemand direkt auf die Daten zugreift. Die nächste Fehlersuche wird dann zur Odyssee.
\begin{center}
\includegraphics[scale=0.7]{31.jpg}
%\end{floatingfigure}
\captionof{figure}{ }
\label{Bild 5}
\end{center}
Objektorientierte Programmiersprachen wie C++ bieten zum Schutz der Klassenelemente spezielle Schlüsselwörter an, und der Compiler prüft, ob der Zugriff berechtigt ist. Das gibt es in C leider nicht. Allerdings kann mit kleinen Änderungen am bisherigen Code trotzdem ein Schutz von internen Daten und Funktionen erreicht werden. Es können nicht alle bekannten Schutzstufen umgesetzt werden, aber zwischen öffentlichen (public) und privaten (private) Klassenelementen kann unterschieden werden. Voraussetzung dafür ist, dass die der Klasse zugrundeliegende Struktur nicht mehr veröffentlicht wird (Abbildung \ref{Bild 5}).
%
\begin{center}
\includegraphics[scale=0.5]{32.jpg}
%\end{floatingfigure}
\captionof{figure}{Das Programm sieht nur noch die öffentlichen Funktionen.}
\label{Bild 6}
\end{center}
%
Die Struktur der Klasse wird nicht mehr öffentlich bekanntgegeben. Es werden lediglich Funktionen zum Erzeugen eines Objekts und zum Arbeiten mit dem Objekt veröffentlicht. Die Struktur der Klasse und die Implementierung der Funktionen werden nur als Bibliothek (Lib) verteilt und sind damit für den Benutzer der Klasse nicht mehr sichtbar. Neben dem Vorteil, dass nicht mehr auf private Elemente zugegriffen werden kann, ist es jetzt sogar möglich, das Objekt, ähnlich einem Konstruktor im C++, bei der Erzeugung zu initialisieren.\\[12pt]
%
Abschließend kann gesagt werden, dass in der Programmiersprache C deutlich mehr objektorientierte Elemente aus der UML umgesetzt werden können, als auf den ersten Blick ersichtlich ist. Sogar Schutzmechanismen für private Daten sind möglich. Damit können auch C-Programme übersichtlicher und sicherer gestaltet werden.
%
\end{document}
Das Dokument habe ich mir einfach so gegriffen, um zu sehen, wie man das hinbekommt. Bevor ich mir die Mühe mit dem eigentlichen Dokument mache.
Mit <code>\newfont</code> sollte man bei LaTeX überhaupt nicht arbeiten und schon gar nicht, um die Dokumentschrift umzuschalten. Das führt bei Verwendung von Standard-Schriftbefehlen – und sei es ein implizites \normalfont in einem LaTeX-Befehel – zwangsläufig zu Problemen. Stattdessen definiert man neue Schriftfamilien und verwendet diese. Näheres dazu ist im fntguide erklärt. Teilaspekte sind im fontinstallationguide noch besser erklärt. Heutzutage braucht man sich aber nicht zwingend damit herum zu schlagen, sondern kann mit lualatex oder xelatex Fonts u. U. auch einfacher einbinden.
Im Fall von suet14 und schwell muss man sich die ganze Arbeit auch nicht selbst machen, da es erfreulicherweise das Paket suetterl (ftp://ftp.tu-chemnitz.de/pub/tex/macros/latex/contrib/fundus/) gibt. Damit sollte etwas wie:
\documentclass[ngerman]{article}
\usepackage[T1]{fontenc}
\usepackage{suetterl,babel,blindtext}
\renewcommand{\familydefault}{suetterl}
\renewcommand\s{\symbol{28}}% oder am Anfang einmal \suetterlin
\begin{document}
\blinddocument
\section{Kursiv}
\itshape Und zum Schluss noch kursiv.
\end{document}
Mehr oder weniger funktionieren. Weniger deshalb, weil es keine Definitionen für fett etc. in suetterl.sty gibt. Außerdem funktionieren die Überschriften in meinem Beispiel nicht richtig. Das müsste sich mal jemand ansehen, der mehr Ahnung hat.
u_fischer
11-06-2012, 10:07
Außerdem funktionieren die Überschriften in meinem Beispiel nicht richtig.
\section benutzt intern die Einheit "ex" für die Abstände vor und nach der Überschrift und auch um zu entscheiden, ob eine abgesetzte oder "run-in" Überschrift gewünscht ist.
suet14 setzt aber ex nicht. Sein Wert ist 0 und entsprechend erhält man eine run-in Überschrift. Korrigieren kann man das z.B. so (ex ist dann = 1/2em):
\DeclareFontShape{T1}{suetterl}{m}{n}{<->s*[0.8]suet14}{\fontdimen5\font=0.5\fontdimen6\font}
(nach dem Paket suetterlin einfügen).
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.