From 5663331384256aed0faf8162ec25d05a8388edeb Mon Sep 17 00:00:00 2001 From: Jali Date: Tue, 22 Mar 2022 21:02:28 +0100 Subject: [PATCH] initial commit --- .gitignore | 5 ++ README.md | 36 +++++++++ main.tex | 77 +++++++++++++++++++ private.lco | 75 +++++++++++++++++++ wscript | 207 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 400 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 main.tex create mode 100644 private.lco create mode 100644 wscript diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e99aa8f --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +*~ +.*.swp +.*.swo +build/* +.lock-waf_linux_build diff --git a/README.md b/README.md new file mode 100644 index 0000000..2045ba1 --- /dev/null +++ b/README.md @@ -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. + diff --git a/main.tex b/main.tex new file mode 100644 index 0000000..b2a2b43 --- /dev/null +++ b/main.tex @@ -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} + diff --git a/private.lco b/private.lco new file mode 100644 index 0000000..2b3c593 --- /dev/null +++ b/private.lco @@ -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} diff --git a/wscript b/wscript new file mode 100644 index 0000000..d4bdfe3 --- /dev/null +++ b/wscript @@ -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'