initial commit
This commit is contained in:
5
.gitignore
vendored
Normal file
5
.gitignore
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
*~
|
||||
.*.swp
|
||||
.*.swo
|
||||
build/*
|
||||
.lock-waf_linux_build
|
||||
36
README.md
Normal file
36
README.md
Normal 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
77
main.tex
Normal 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
75
private.lco
Normal 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
207
wscript
Normal 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'
|
||||
Reference in New Issue
Block a user