Kurzes Word 2007 Tutorial
Immer wieder beobachte ich bei meinen Nicht-Informatiker-Bekannten und -Verwandten, wie umständlich sie mit Word umgehen. Word ist eigentlich eine sehr mächtige Software, die einem das Leben ziemlich leicht, aber auch ziemlich schwer machen kann. Wenn man alles mit der Hand formatiert, wie ich es oft bei besagten Mitmenschen beobachte macht man sich das leben nur unnötig kompliziert. Auch beim Pflegen von Inhaltsverzeichnissen oder Quellenangaben tun sich manche schwer, obwohl Word das alles selbst macht. Daher möchte ich nun, für meine Mitmenschen ohne IT Hintergrund ein kleines Tutorial geben, welches ein paar erweiterte Grundfunktionen von Word aufgreift und erklärt. Darunter sollen auch absolute Basics fallen, wie beispielsweise Tastenkombinationen.
- Einführung
- Formatieren
- Anlegen der Gliederung
- Nummerieren der Gliederung
- Inhaltsverzeichnis anlegen
- Seitennummer einfügen
- Kapitel in Kopfzeile anzeigen
- Pflegen von Quellenangaben
Einführung
Glossar
Ribbon Menü: Die dicke blaue Leiste oben in Word 2007
Cursor: Der blinkende Textzeiger
Absatz: Ein logischer Textblock. Für jeden Absatz gelten eigene Formatierungen,
also Schriftarten, Farben und Abstände.
Einzug: Der Abstand eines Absatzes zum linken Textrand.
[TASTE]: Gibt an, dass eine Tastenkombination auf der Computertastatur erfolgen
soll. Der Name TASTE wird durch den entsprechenden Namen ersetzt.
Navigation
Klickfolgen: Im Folgenden werden Klickfolgen wie folgt angezeigt:
Start -> Absatz -> [Zentriert]
Das bedeutet dass man die Registerkarte "Start" anwählt und im Feld "Absatz" den
Knopf "Zentriert" wählt. Wenn keine Beschriftungen vorhanden sind, kann man sich
anhand der Symbole herleiten, was gemeint ist. Wenn man mit der Maus über ein Symbol
fährt ohne zu klicken bekommt man angezeigt, wie der Knopf heisst und was er bedeutet.
Einige Tasten
[STRG]: Die Steuerungstaste, auf jeder Tastatur immer ganz Links unten. Steht auch
drauf ;)
[SHIFT]: Die "Großmach"- Taste links auf der Tastatur, direkt über der [STRG] Taste,
sieht aus wie ein Pfeil nach oben.
[CAPSLOCK]: Die Taste über der [SHIFT] Taste, sieht aus wie ein Pfeil nach unten.
[TAB]: Die "Tabulator" Taste. Diese befindet sich über der [CAPSLOCK] Taste und
zeigt zwei entgegengesetzte Pfeile.
[ENTER]: Auch [RETURN] ist die Taste für einen neuen Absatz auf dem "Schreibblock"
ganz rechts, die aussieht wie ein Pfeil nach unten und dann links. Sie ist neben
der Leertaste die größte Taste auf der Tastatur.
[BACKSPACE]: Die Taste über der [ENTER] Taste die man braucht um einen Buchstaben
zu löschen.
Einige Tastenkombinationen
Wichtig ist zu wissen, dass man die Tasten beim Schreiben kombinieren muss, da man
sonst die gesamte Formatierung verändert. Als Kombination bezeichnet man das Drücken
von zwei Tasten gleichzeitig. [SHIFT] + [ENTER] bedeutet, dass man die [SHIFT] Taste
drückt und dann gedrückt hält, und während die Taste gedrückt ist die [ENTER] Taste
gedrückt werden muss.
[ENTER]: Erzeugt einen neuen Absatz.
[SHIFT] + [ENTER]: Erzeugt einen Zeilenumbruch. Dadurch wird kein neuer Absatz begonnen,
das ist später wichtig beim Formatieren.
[STRG] + [ENTER]: Erzeugt einen Seitenumbruch. Alles was über dem Cursor ist bleibt
wo es ist, aber alles was darunter ist kommt auf die nächste Seite.
[TAB]: Erhöht den Einzug um eine Ebene.
[SHIFT] + [TAB]: Erniedrigt den Einzug um eine Ebene.
[STRG] + [TAB]: Rückt den Text mit einem Tabulatorzeichen ein. Ein Tabulatorzeichen
kann man sich vorstellen wie ein Paket aus vielen Leerzeichen.
Das ist praktisch, wenn man Text "verschieben" möchte. Statt ganz viele Leerzeichen
zu tippen kann man einige wenige Tabulatorzeichen verwenden.
Formatieren
Möchte man eine Überschrift im Text anzeigen, so sollte man nicht jedes mal den Text markieren und "Fett" machen, sondern man kann sich aus der Liste bei "Start > Formatvorlagen" eine Formatierung aussuchen. Diese gilt dann absatzübergreifend. Wählt man beispielsweise einen Text, der als Überschrift dienen soll, so klickt man auf den Absatz, und sucht in den Formatvorlagen die Vorlage "Überschrift 1". Für Unterüberschriften entsprechend "Überschrift 2" und so weiter.
Dadurch wird der Text automatisch nach Überschriften gegliedert. Dieser Teil ist wichtig!
Der Vorteil ist hierbei, dass man jeden Text zentral formatiert hat. Möchte man von allen Überschriften im Dokument die Farbe ändern braucht man nur auf die Formatvorlage mit der rechten Maustaste zu klicken und "Ändern" zu wählen.
Daraufhin erscheint das folgende Fenster. Hier kann man alle eigenschaften der Formatierung verändern. Wenn man dann auf OK klickt werden diese für alle Absätze im Text übernommen.
Dadurch braucht man nicht mehr für jede Überschrift die Farbe anpassen, sondern macht das nur einmal und alle entsprechend formatierten Überschriften passen sich automatisch an.
Anlegen der Gliederung
Beim Schreiben größerer Dokumente sollte man am Besten mit der Gliederung anfangen. Hierzu bietet Word einen eigenen Anzeigemodus. Diesen erreicht man wenn man oben im Ribbon Menü auf Ansicht > Gliederung klickt.Der Text verändert sich dann und es erscheint eine Liste von Punkten in einer Baumstruktur:
Durch doppelklicken auf die Kreise kann man die Dokumentstruktur expandieren oder kollabieren
Hier kann man nun alle Überschriften (die Gliederung) anlegen. Wenn man [ENTER] drückt wird eine neue Überschrift erstellt. Man kann diese dann mit [TAB] einrücken um Unterüberschriften zu erstellen.
Nummerieren der Gliederung
Hat man nun alle Überschriften zusammen, so möchte man unter Umständen, dass diese sinnvoll nummeriert werden. Dazu klickt man auf die erste Überschrift im Dokument. Dann wählt man "Start -> Absatz > Liste mit mehreren Ebenen" und wählt in der Sektion "Listen im aktuellen Dokument" ein Überschriftenformat.
Danach sollten vor allen Überschriften im Dokument entsprechende Nummern angezeigt werden.
Inhaltsverzeichnis anlegen
Nachdem nun alle Überschriften erstellt wurden und Text vorhanden ist, möchte man ein Inhaltsverzeichnis erstellen. Dazu klickt man in die erste Seite des Dokuments und wählt im Ribbon "Verweise > Inhaltsverzeichnis". Das Inhaltsverzeichnis enthält dann alle Überschriften und deren Seitenzahlen.
Wenn sich der Text ändert muss man mit der rechten Maustaste auf das Inhaltsverzeichnis klicken und dann "Felder aktualisieren" wählen. Dann kommt ein Dialog, wo man "Gesamtes Verzeichnis aktualisieren" wählen sollte.
Nach dem bearbeiten des Dokuments muss das Verzeichnis neu erstellt werden
Seitennummer einfügen
Nachdem alles gut gelaufen ist, sollte man Seitennummern einfügen. Dazu geht man auf "Einfügen > Seitenzahl". Dann kann man wählen, wo die Seitenzahl erscheinen soll.
Kapitel in Kopfzeile anzeigen
Um anzuzeigen in welchem Kapitel sich die aktuelle Seite befindet wendet man einen speziellen Trick an.
Man geht auf "Einfügen > Kopfzeile" und wält eine Position.
Dann befindet man sich im Kopf- und Fußzeilenmodus. Dieser ist ein spezieller Anzeigemodus, der über "Entwurf > Kopf und Fußzeile schließen" oder einen Doppelklick auf den Fließtext wieder verlassen werden kann.
Durch Doppelklick in die Kopf- oder Fußzeile landet man wieder in diesem Modus. Hier gehen wir in das Feld der Kopfzeile und wählen "Einfügen > Schnellbausteine > Feld". Daraufhin erscheint ein Dialogfenster.
In diesem wählt man aus der Liste links "StyleRef" und aus der Liste rechts "Überschrift 1". Danach mit OK bestätigen. Nun wird in der Kopfzeile immer der Inhalt der aktuellen Überschrift (der mit der Formatierung "Überschrift 1") angezeigt.
Die Feldfunktion "StyleRef" wird verwendet, um in der Kopfzeile das aktuelle Kapitel anzuzeigen
Pflegen von Quellenangaben
Um Quellenangaben zu pflegen kann man einen komfortablen Editor in Word verwenden. Diesen erreicht man über die Registerkarte "Verweise > Quellen verwalten"
Im Editor wählt man "Neu" und kann dann alle Angaben zur Qelle tätigen. Dann alles mit OK bestätigen.
Mit dem Quelleneditor können Quellenverzeichnisse komfortabel erstellt und gepflegt werden
Im Text kann man dann an der entsprechenden Stelle einfach "Verweise > Zitat einfügen" wählen, wodurch dann eine Textmarke gesetzt und am Ende des Dokuments automatisch ein Quellenverzeichnis erstellt wird.
Closures in C# verwenden
Aha, schon wieder was gelernt! Gerade bin ich über ein Problem gestolbert, dessen Lösung mir zunächst ein wenig schleierhaft war, was sich jedoch sehr elegant lösen ließ.
Ich habe eine Klasse, die eine Art Primary Key verwendet. Dieser Primary Key wird durch das Property "Id" abgebildet. Diese Id soll Objekte der Klasse in einer Menge eindeutig identifizieren. Normalerweise könnte man für soetwas Dictionaries verwenden, jedoch habe ich das Problem, dass ich die Liste mit der Klasse XmlSerializer als XML serialisieren möchte, die jedoch leider keine Dictionaries unterstützt. Der Workaround hierfür wäre das Implementieren des Interfaces IXmlSerializable in einer eigenen, von Dictionary<TKey, TValue> abeleiteten Klasse, jedoch ist das nicht erwünscht. Ist ausserdem ein anderes Problem.
Nehmen wir also folgende Klasse an:
public class Container : IEquatable<Container>
{
private string _id = string.Empty;
public string Id
{
get { return _id; }
set { _id = value; }
}
// Weitere Properties & Implementierungen
public bool Equals(Container other)
{
return (_id == other._id);
}
}
Die Klasse implementiert IEquatable*. Dieses Interface ist notwendig, um beispielsweise
das Vorhandensein eines Objektes in einer generischen Liste List<Container>
mit der Methode List<Container>.Contains(Container c) festzustellen. Dabei
ist übrigens darauf zu achten, dass die hierzu verwendete Contains Methode die komplette
Liste durchläuft und daher eine sehr teure Operation darstellt.
Nun möchte ich aber auch in der Lage sein, konkrete Objekte aus der Liste anhand
der Id herauszufiltern. Contains gibt ja nur true oder false zurück, also die Aussage, ob das Objekt mit der gleichen Id vorhanden ist. Dazu kann die Find Methode verwendet werden, die von List<T>
bereitgestellt wird. Diese akzeptiert einen generischen Delegaten, nämlich Predicate<T>,
dessen Signatur die folgende ist:
public delegate bool Predicate<T>(T obj)
Damit kann ich also eine Methode angeben, die eine benutzerdefinierte Funktion als
Vergleichsoperation auf alle Elemente der Liste anwendet. Die Implementierung in
List<T> sieht wie folgt aus:
public T Find(Predicate<T> match)
{
if (match == null)
{
ThrowHelper.ThrowArgumentNullException(ExceptionArgument.match);
}
for (int i = 0; i < this._size; i++)
{
if (match(this._items[i]))
{
return this._items[i];
}
}
return default(T);
}
Die Liste läuft über alle Elemente und führt den Delegaten aus. Die Operation im delegaten muss true oder false zurückliefern. Ist der Vergleich true, dann stoppt Find den durchlauf und gibt das aktuelle Element zurück.
Wie kann ich dem Delegaten, der ein Objekt vom gleichen Typ erwartet und true oder
false zurückgibt aber nun sagen, dass er die lediglich die Ids der Objekte vergleich
soll? Das geht am besten über eine anonyme Funktion:
public class ContainerCollection
{
private List<Container> containers = new List<Container>();
public ContainerCollection() { Fill(); }
private void Fill()
{
// Ein paar container hinzufügen:
Container c1 = new Container();
c1.Id = "ContainerOne";
containers.Add(c1);
// ...
}
public Container FindContainerById(string id)
{
Container container = null;
container = containers.Find(
delegate(Container c)
{
return (c.Id == id);
}
);
return container;
}
}
Gegegeben ist die ContainerCollection Klasse, die intern die Liste verwaltet. Die
Funktion FindContainerByIdverwendet eine anonyme Methode. Normalerweise besitzt
eine Methode ihren eigenen Methoden-Stack, der alle durch Eingabeparameter definierten
Werte beinhaltet, jedoch ist der hier definierte Delegat im Methodenkontext von
FindContainerById deklariert worden, und hat daher weiterhin Zugriff auf den "äußeren"
Methodenstack. Dadurch ist es möglich, die Id des aktuell iterierten Containers
c mit dem Eingabeparameter id zu vergleichen.
Diese künstliche Verlängerung der Lebensdauer wird auch als Closure bezeichnet.
Der Aufruf könnte so aussehen:
ContainerCollection c = new ContainerCollection();
Container container = c.FindContainerById("ContainerOne");
Programmierern von funktionalen Programmiersprachen dürfte dieses Konzept durchaus bekannt sein. In JavaScript geht vieles über Closures und erfordert ein ziemliches Umdenken. Ich halte es deswegen für sehr gewinnbringend, sich mal mit funktionalen Programmiersprachen auseinander zu setzten. Wieso nicht mal F# ausprobieren?
Die Methode FindContainerById geht übrigens noch kleiner zu schreiben, wenn man
einfach alle Umbrüche entfernt:
public Container FindContainerById(string id)
{
return containers.Find(delegate(Container c) {return c.Id == id;});
}
Schon wieder haben wir eine Zeile gespart und die Leserlichkeit verschlechtert Dafür hält uns unser Chef jetzt für genialer, weil wir Code schreiben, den er noch weniger versteht ;)
* Ich weiss, meine Nicht-Autoproperties sind sowas von 2005. Auch lässt sich darüber streiten, ob die Überladung von Equals zur Prüfung auf Wertegleichheit so sauber ist, jedoch gibt die MSDN Doku dazu an, dass das durchaus eine valide Implementierung ist. In so einem Fall muss man natürlich für eine genügende Dokumentation sorgen.
Bing zur Suche in Firefox verwenden
Wenn man in die Firefox Adressleiste eine fehlerhafte URL eingibt, so wird die Eingabe
als Suchanfrage behandelt.
Gibt man "mozilla.org" ein, so wird diese Eingabe zu http://mozilla.org konvertiert.
Gibt man jedoch "virtual c# keywords" ein, so ist dies keine URL und Firefox wird diese Eingabe automatisch an Google weiterleiten.
Ich verwende jedoch lieber Bing als Google, daher fragte ich mich, wie ich diese
Standardsuche umschalten kann. Dazu habe ich nur kurz die sehr gut strukturierte Config von Firefox durchgeblättert,
die über die Eingabe von about:config in Firefox erreichbar ist (sollte man kennen), nur für ungeübte hier
nochmal :). Bitte beachtet den Hinweis von Firefox, vorsichtig mit den verfügbaren Einstellungen
zu sein. Nur weil man etwas kann, heisst das nicht dass man es auch unbedingt tun sollte,
gemäß dieser Illustration:
Dann kann man bei Filter oben "keyword.URL" eingeben. Durch Doppelklick auf den
Eintrag kann er dann geändert werden, einfach
http://www.bing.com/search?q=
eintragen. Fortan werden alle fehlerhaften Urls statt bei Google bei Bing gesucht:
Klappt natürlich auch mit anderen Suchmaschinen.
Weitere details zum keyword.URL Parameter: http://kb.mozillazine.org/Keyword.URL
Code Snippet: Events einer Assembly auflisten
Das folgende Code Snippet kann angepasst werden, um die Events einer Assembly aufzulisten. Ich habe vor einer Weile mal ein die genannte hineingucken wollen um eine Liste zu generieren (daher auch die IO Teile im Snippet)
/// <summary>
/// Prints the events contained in the Assembly
/// System.Web.UI.WebControls into a file
/// </summary>
public static void PrintEvents()
{
Dictionary<string, List<string>> controlEvents
= new Dictionary<string, List<string>>();
Type[] types = Assembly.GetAssembly(typeof (WebControl)).GetTypes();
foreach (Type type in types)
foreach (EventInfo info in type.GetEvents())
if (!controlEvents.ContainsKey(info.Name))
{
List<string> eventNames = new List<string>();
eventNames.Add(type.Name);
controlEvents.Add(info.Name, eventNames);
}
else if (!controlEvents[info.Name].Contains(type.Name))
{
controlEvents[info.Name].Add(type.Name);
controlEvents[info.Name].Sort();
}
using (FileStream stream =
new FileStream(@"C:\ControlTypes.txt", FileMode.CreateNew))
using (StreamWriter writer = new StreamWriter(stream))
foreach (KeyValuePair<string, List<string>> item in controlEvents)
{
writer.WriteLine(item.Key);
foreach (string str in item.Value)
writer.WriteLine(string.Format(" {0}", str));
}
}
- 1