initial commit

This commit is contained in:
2022-03-22 21:02:28 +01:00
commit 5663331384
5 changed files with 400 additions and 0 deletions

5
.gitignore vendored Normal file
View File

@@ -0,0 +1,5 @@
*~
.*.swp
.*.swo
build/*
.lock-waf_linux_build

36
README.md Normal file
View File

@@ -0,0 +1,36 @@
# Beispiel für einen Brief in LaTeX
Dieses Repository enthält ein Beispiel für einen Brief in LaTeX.
Um das Beispiel zu bauen, öffnest Du zunächst die Konsole.
Dann wechselst Du in ein Verzeichnis, in dem Du Deine Briefe
speichern möchtest, z.B. ```LatexÜbungen``` (nach jedem Befehl immer die Eingabetaste drücken!)
```bash
cd ~/LatexÜbungen
```
Danach kannst Du das Git-Repository auf Deinen Rechner herunterladen (der Fachmann sagt: Das
Repository "klonen"):
```bash
git clone https://git.orca-central.de/Examples/BeispielBriefInLaTeX.git
```
In dem Verzeichnis, in dem Du gerade bist, gibt es nun ein Unterverzeichnis namens
```BeispielBriefInLaTeX```. Da wechseln wir jetzt hinein:
```bash
cd BeispielBriefInLaTeX
```
Hier angekommen, kannst Du nun das Dokument mit dem Befehl ```pdflatex main.tex``` erstellen:
```bash
pdflatex main.tex
```
Im Anschluss befinden sich eine Menge neue Dateien in dem Verzeichnis. Eine davon heißt
```main.tex``` und enthält den Beispielbrief.

77
main.tex Normal file
View File

@@ -0,0 +1,77 @@
% Dies ist ein Beispielbrief.
% Sofern Du eine funktionierende private.lco Datei hast,
% muss hier nichts als der Inhalt Deines Briefes stehen.
% Die Präambel
% Die Dokumentklasse scrlttr2 ist extra für deutschsprachige Briefes
% gedacht. Sie orientiert sich am Layout des Normbriefes nach DIN 5008.
\documentclass{scrlttr2}
% Mit diesem Befehl wird die Datei private.lco geladen. Sie ist für alle Briefe
% gleich und kann immer wieder zu einem Brief hinzukopiert werden.
\LoadLetterOption{private}
% Hier ist die Präambel zu Ende, und der Inhalt des Dokuments beginnnt.
% In LaTex wird das immer mit einem \begin{document} eingeleitet.
% Der letzte Befehl in einem Dokument ist entsprechend \end{document}.
\begin{document}
% Die Variable 'subject' setzt den Betreff eines Briefes.
% Wird sie weggelassen hat der Brief keine Betreffzeile.
\setkomavar{subject}{Beispielbrief in \LaTeX}
% Als nächstes eröffnen wir den Inhalt des Briefes. In scrlttr2 passiert das,
% indem wir unseren Brief in eine 'letter'-Umgebung einefassen.
% Eine Umgebung in LaTeX ist ein Bereich, der eine betimmte Bedeutung hat.
% eine 'itemize'-Umgebung z.B. enthält eine unsortierte Liste, die 'letter'-Umgebung
% den Inhalt eines Briefes. Eine Umgebung fängt immer mit \begin{NameDerUmgebung} an,
% und endet mit \end{NameDerUmgebung}.
% Manche Befehle stehen nur innerhalb einer bestimmten Umgebung
% zur Verfügung. So würde der Befehl \opening, der die Anredeformel enthält, außerhalb eines
% Briefes nicht viel Sinn ergeben. Deswegen gibt es diesen Befehl nur innerhalb der 'letter'-
% Umgebung.
%
% Die Umgebung 'letter' kennt noch einen Parameter: Den Inhalt des Umschlagfensters.
% Normalerweise steht dort die Anschrift des Empfängers drin. Im Prinzip kann hier aber
% beliebier LaTeX code stehen. Der Befehl '\\' erzwingt einen Zeilenumbruch. Das ist wichtig,
% Da Zeilenumbrüche im Quelltext in der Regel von LaTeX ignoriert werden! Um die korrekte
% Zeilenformatierung kümmert sich LaTeX ja selber. Wenn du einen Umbruch erzwigen willst,
% musst Du LaTeX das daher explizit mitteilen.
\begin{letter}{
Example Maker GmbH \\
z.Hdn. Herrn Hampelmann \\
Beispielhof. 240 \\
10112 Königs-Musterhausen
}
% Der \opening-Befehl enthält die Anredeformel
\opening{Sehr geehrter Herr Hampelmann,}
% Das ist der Text unseres Briefes. Beachte, dass LaTeX den Zeilenumbruch nach der ersten
% Zeile ignoriert. Wir können mit solchen Umbrüchen den Quelltext lesbarer halten, ohne
% das dies Einfluß auf das Erscheinungsbild unseres Briefes hätte.
vielen Dank für Ihr Schreiben vom 14.03.2022.
Leider kann ich nicht erkennen, wie die von Ihnen gelieferten Beispiele unser Produkt verbessern
können.
% Um einen Absatz in LaTeX zu erzeugen, muss zwischen den Absätzen eine leere Zeile sein.
% Will man innerhalb eines Absatzes einen Zeilenumbruch erzwingen, nutzt man den oben schon
% gezeigten \\-Befehl.
Anstatt Ihre Beispiele mit Microsft Word zu schreiben, sollten Sie lieber \LaTeX verwenden. Dann
sind die Dokumente besser lesbar, und Ihre Beispiele lassen sich problemlos in nicht-Microsoft
Produkten verwenden.
% Die \closing-Anweisung ist das Gegenteil von \opening. Sie enthält die Grußformel am Ende des
% Briefes
\closing{mit freundlichen Grüßen}
% Ein Postscriptum, das nach der Grußformel mit P.S. an den Text angehängt wird.
\ps{Wenn Sie weiter so einen nutzlosen Schrott verkaufen, werde ich Sie verklagen.}
% mit \end{letter} beenden wir unseren Brief und schließen die Umgebung.
\end{letter}
% und endet das Dokument. Danach soll kein weiterer Code mehr folgen.
\end{document}

75
private.lco Normal file
View File

@@ -0,0 +1,75 @@
% Die Dokumentenklasse scrlttr2 kommt mit einer Reihe von sehr schönen Hilfsfunktionen.
% Eine davon ist die lco-Datei:
% Um einen Brief zu erstellen, benötigen wir ja immer wiederkehrende Elemente.
% Zum Beispiel ist ja die Absenderadresse immer die gleiche. Damit man diese Daten nicht jedes
% mal neu eintippen muss, kann man sie in der lco-Datei ablegen. Wenn Du einen neuen Brief
% schreiben möchtest, kannst Du diese Datei einfach in Deinen Projektordner kopieren.
% Sie wird dann im Hauptdokument in der Präambel der Befehl \LoadLetterOption{private} angegben
% (die Dateiendung .lco kannst Du in dem Befehl weglassen).
% Dieser Befehl lädt dann alle Anweisungen aus der lco-Datei nach.
% Die Datei kann im Prinzip irgendwo auf der Festplatte liegen, ich habe es mir aber zur
% Angewohnheit gemacht, sie immer zu kopieren, wenn ich einen neuen Brief erstelle, weil dann
% alle Dateien in meinem Git-Repository eingecheckt sind.
% Du musst diese Datei nicht verstehen, um einen Brief schreiben zu können. Nur der letzte Teil,
% wo die Absenderadresse festgelegt wird.
% Als erstes kennzeichnen wir, dass es sich um eine lco-Datei handelt, und zu welchem
% Absender sie gehört (man kann mehrere Absender definieren).
% Der Befehl \ProvidesFile akzeptiert mehrere Parameter. In den
% geschweiften Klammern steht der Name der internen Klasse (private.lco). Dazu
% musst Du Dir nur merken, dass der immer gleich mit dem Namen der lco-Datei sein sollte.
% In den eckigen Klammern werden der Klasse 3 Parameter übergeben, dass Erstellungsdatum,
% der Typ (immer 'lco' und der Name des Absenders. Der Name steht in Klammern, damit
% LaTeX weiß, dass 'Max Mustermann' nur ein Parameter ist und zusammen gehört, obwohl da ein
% Leerzeichen drin steht.
\ProvidesFile{private.lco}[2022/03/22 lco (Max Mustermann)]
% Die folgenden Befehle, werden in die Präambel eingefügt. Im wesenlichen handelt es sich dabei
% um LaTeX-Pakete, die geladen werden sollen. Was diese Pakete tun, steht jeweils in dem Kommentar
% am Ende der Zeile.
\usepackage{cmap} % Sorgt dafür, dass pdf-Dateien durchsuchbar und kopierbar werden.
\usepackage[ngerman]{babel} % Stellt die Sprache des Textes auf deutsch. Damit kannst Du z.B
% Umlaute einfach eintippen, und LaTeX kennt die
% Silbentrennungsregeln. "ngerman" steht dabei für die neuen
% Rechtschreibregeln, "german" für die alten.
\usepackage[utf8]{inputenc} % Die Textdatei, in der wir schreiben ist eine Unicode-Datei.
\usepackage[T1]{fontenc} % Die PDF-Datei benutzt den Latin-1-Zeichensatz, der deutsche
% Umlaute enthält, und auch auf Computern funktioniert, die kein
% Unicode anzeigen können.
\usepackage{lmodern} % Verwendet die serifenlose Computer-Modern-Schrift statt Roman.
\usepackage{microtype} % Under Dokument soll in echtem Blocksatz gesetzt werden.
\usepackage{graphicx} % Wir wollen bei Bedarf Bilder einbinden können.
\usepackage{xcolor} % Erlaubt den Druck in Farbe.
\usepackage{pdfpages} % Einbinden von PDF Seiten aus einem PDF Dokument.
\usepackage{fixltx2e} % Verbessert einige Kernkompetenzen von LaTeX2e
\usepackage{ellipsis} % Korrigiert den Weißraum um Auslassungspunkte
% Hier werden ein paar Variablen gesetzt, damit die Absenderadresse und diverse Daten
% angezeigt werden.
\KOMAoptions{%
foldmarks=true, % Druckt die Faltmarkierungen für das Falten des Briefes.
backaddress=true, % Druckt die Absenderadresse in einer Zeile im Ausgabefenster
fromphone, % Druckt die Telefonnummer im Kopf
fromemail, % Druckt die E-Mail Adresse im Kopf
enlargefirstpage=true, % verkleinert den unteren Rand auf der erstens Seite.
% Stelle die Option auf 'false', wenn Du Briefpapier mit einem
% vorgedruckten Fußbereich benutzt.
paper=A4, % Das Papierformat ist DIN A4
fontsize=12pt, % Setzt die Schriftgröße für de Brieftext auf 12pt.
fromalign=left, % Die Absendersadresse im Briefkopf ist auf der linken Seite.
draft=false % Der Brief ist kein Testausdruck.
}
% Im letzten Abschnitt werden die Variablen gesetzt, die die tatsächlichen Absenderdaten enthalten.
\setkomavar{fromname}{Max Mustermann} % Der Name des Absenders
\setkomavar{fromaddress}{Musterstraße 11\\ % Die Absenderadresse. Das \\ fügt zwischen Staße und
21000 Musterhausen } % Ort einen Zeilenumbruch ein.
\setkomavar{fromphone}{0421 555222} % Die Telefonnummer des Absenders.
\setkomavar{fromemail}{max@mustermann.de} % die E-Mailadresse des Absenders.
\renewcommand*{\raggedsignature}{\raggedright} % Die Briefsignatur nicht im Blocksatz setzen.
\setkomavar{place}{Musterhausen} % Der Ort (wird bei Datumangaben benutzt: Bremen,
% den 22.03.2022)
%\@addtoplength[-1]{toaddrvpos}{20mm} % Optionale Abstände vor und nach den Adressen
%\@addtoplength[-1]{refvpos}{20mm}

207
wscript Normal file
View File

@@ -0,0 +1,207 @@
#!/usr/bin/env python
# encoding: utf-8
# Created On: Tue 28 Aug 2012 11:44:05 CEST
# Last Modified: Sun 08 Apr 2018 10:46:32 pm CEST
# MAKEFILE for compiling LaTeX Files
VERSION='1.1.0'
APPNAME='MAKEFILE FOR LaTeX'
top='.'
out='build'
chapterpath='./chapters'
# query the options that are possible outputs
def options(ctx):
ctx.add_option('--form',action='store',default='pdflatex',help='Specify the output format. Allowed values are: pdflatex, latex, htlatex, odt, epub, handlatex')
ctx.add_option('--cover',action='store',default='images/cover.png',help='Specify an image as cover for ePubs.\nOnly works with --form=epub')
ctx.add_option('--infile',action='store',help='Specify the tex file to use as input file.\nIf not given, all files in the top level directory will be compiled.')
ctx.add_option('--css',action='store',default='css/epub.css',help='Specifiy a style sheet to design an ebook')
ctx.add_option('--spellckpath',action='store',help='Specify the path in which to look for the content files for spellcheck.\nDefault is ./chapters',default=chapterpath);
# configure script
def configure(ctx):
# local functions to configure the selected element
def find_tex_files(path):
import os
ret = []
for name in os.listdir(path):
if os.path.isfile(os.path.join(path,name)):
if (name.endswith('.tex')) or (name.endswith('.ltx')):
ret.append(name)
return ret
def conf_tex(ctx):
ctx.load('tex')
def conf_htlatex(ctx):
ctx.find_program('mk4ht',var='TEX')
ctx.env.TEXINPUT = ctx.path.abspath() + '//'
def conf_epub(ctx):
ctx.find_program('pandoc',var='EPUB')
ctx.env.TEXINPUT = ctx.path.abspath() + '//'
def conf_odt(ctx):
ctx.find_program('pandoc',var='ODT')
ctx.env.TEXINPUT = ctx.path.abspath() + '//'
def conf_handlatex(ctx):
ctx.find_program('handlatex',var='TEX')
ctx.env.TEXINPUT = ctx.path.abspath() + '//'
# define a structure to assign the functions to the parameters
conf_output = {'pdflatex' : conf_tex,
'latex' : conf_tex,
'htlatex' : conf_htlatex,
'odt' : conf_odt,
'epub' : conf_epub,
'handlatex' : conf_handlatex
}
# set the selected mode
if ctx.options.form:
ctx.env.FORM = ctx.options.form
conf_output[ctx.env.FORM](ctx)
else:
ctx.fatal('Output format is not set!')
# set a cover image
if ctx.options.cover:
ctx.env.COVER = ctx.options.cover
else:
ctx.env.COVER = ''
# set the css style
if ctx.options.css:
ctx.env.CSS = ctx.options.css
else:
ctx.env.CSS = ''
# find the aspell program
ctx.find_program('aspell',var='ASPELL')
# set a default path to look for spellck sources
if ctx.options.spellckpath:
ctx.env.SPELLCK = ctx.options.spellckpath
# Set a list of all files to use
if ctx.options.infile:
sf = []
sf.append(ctx.options.infile)
ctx.env.SOURCEFILES = sf
else:
ctx.env.SOURCEFILES = find_tex_files(top)
def build(ctx):
import os.path
# metadata parameters
def build_metadata(fileName,cover):
ret = ''
if os.path.isfile(fileName):
ret += '--css="' + fileName + '"'
if os.path.isfile(cover):
ret += ' --epub-cover="' + cover + '"'
return ret
# local functions to control the build process
def build_tex(ctx):
import os
for f in ctx.env.SOURCEFILES:
ctx(features = 'tex',
type = ctx.env.FORM,
source = f,
prompt = 0
)
if ctx.cmd == 'install':
outExt = '.dvi'
if ctx.env.FORM == 'pdflatex':
outExt = '.pdf'
fileName, fileExt = os.path.splitext(f)
ctx.install_files('${PREFIX}',fileName + outExt)
def build_htlatex(ctx):
for f in ctx.env.SOURCEFILES:
ctx(rule='TEXINPUTS=${TEXINPUT}: ${TEX} ${FORM} ${SRC} >/dev/null',source=f)
if ctx.cmd == 'install':
fileName, fileExt = os.path.splitext(f)
ctx.install_files('${PREFIX}',fileName + '.html')
def build_epub(ctx):
import os
for f in ctx.env.SOURCEFILES:
if os.path.isfile(ctx.env.COVER) :
ctx.env.META = build_metadata(ctx.path.find_resource(ctx.env.CSS).abspath(),ctx.path.find_resource(ctx.env.COVER).abspath())
else:
ctx.env.META = build_metadata(ctx.path.find_resource(ctx.env.CSS).abspath(),'')
fileName, fileExt = os.path.splitext(f)
ctx(rule='TEXINPUTS=${TEXINPUT}: ${EPUB} ${META} -t epub ${SRC} -o ${TGT} >/dev/null',source=f, target=fileName + '.epub')
if ctx.cmd == 'install':
ctx.install_files('${PREFIX}',fileName + '.epub')
def build_odt(ctx):
import os
for f in ctx.env.SOURCEFILES:
fileName, fileExt = os.path.splitext(f)
ctx(rule='TEXINPUTS=${TEXINPUT}: ${ODT} -t odt ${SRC} -o ${TGT} >/dev/null',source=f,
target=fileName + '.odt')
if ctx.cmd == 'install':
ctx.install_files('${PREFIX}',fileName + '.odt')
def build_handlatex(ctx):
import os
for f in ctx.env.SOURCEFILES:
ctx(rule='TEXINPUTS=${TEXINPUT}: ${TEX} ${SRC} >/dev/null && rm -f ../*.h*',source=f)
if ctx.cmd == 'install':
fileName, fileExt = os.path.splitext(f)
ctx.install_files('${PREFIX}',fileName + outExt)
# define a structure to assign the functions to the parameters
build_output = {'pdflatex' : build_tex,
'latex' : build_tex,
'htlatex' : build_htlatex,
'odt' : build_odt,
'epub' : build_epub,
'handlatex' : build_handlatex
}
# call the configured build method
build_output[ctx.env.FORM](ctx)
# Custom command to spellcheck all
def spellck(ctx):
# Search for all possible TEX files
def find_tex_files(path):
import os
ret = []
for root, dirs, files in os.walk(path):
for name in files:
if (name.endswith('.tex')) or (name.endswith('.ltx')):
ret.append(os.path.join(root,name))
return ret
# Set a list of input files to use
if ctx.options.infile:
sf = []
sf.append(ctx.options.infile)
ctx.env.SOURCEFILES = sf
else :
ctx.env.SOURCEFILES = find_tex_files(ctx.env.SPELLCK)
# run aspell
from os import system
for f in ctx.env.SOURCEFILES :
system(ctx.env.ASPELL[0] + ' -c ' + f)
system('rm ' + f + '.' +'bak')
# Class declarartion to bind the build context to the spellck command
from waflib.Build import BuildContext
class spck(BuildContext):
cmd='spellck'
fun='spellck'