Allgemein,  Programmieren

Automatisiert Text-Dokumente in Notizzettel umwandeln

Die Idee ist, alle Text-Dokumente in einem Ordner mit einem Python-Skript in ein LaTeX-Dokument umzuwandeln und somit als PDF drucken zu können. Aus jedem Text-Dokument wird ein Notizzettel, wobei die erste Zeile immer die Überschrift darstellt. Diese werden optimiert auf den Blättern platziert.

Entwicklungsumgebung

Wie so oft bietet sich auch hier Visual Studio Code an. Dafür werden die Erweiterungen LaTeX Workshop und Python. Optional, aber gerade bei Python immer sehr hilfreich ist indent-rainbow.

Zum Code …

Es handelt sich ja hier um einen kurzen Code mit nicht einmal 50 Zeilen insgesamt. Trotzdem kommt man gerade heutzutage direkt auf die Idee erstmal ChatGPT zu fragen, bevor man sich selbst die Mühe macht – auch wenn man weiß wie’s geht ;P. Leider war trotzdem der Code noch nicht voll funktionsfähig, aber ein guter Anfang der immerhin trotzdem Zeit gespart hat. Nun also zum Code …

Ausnahmsweise mal nicht so viele Imports:

import os
import sys

Abfrage nach dem Ordner, der durchsucht werden soll als Programmparameter und das Erstellen bzw. Öffnen der .tex-Datei:

# Ordnerpfad, in dem die Textdateien gespeichert sind
folder_path = sys.argv[1]
latex_file_name = "labeling-post-its.tex"
latex_file = open(os.path.join(folder_path, latex_file_name), 'w')

Nun das Setup des LaTeX-Dokuments. Hier muss darauf geachtet werden, dass manche Kombinationen extra excaped werden müssen (wie zum Beispiel \u oder \b), diese werden von VS Code aber auch markiert. Alternativ kann man vor den String ein r schreiben, dann wird der gesamte String als Raw eingelesen. Dann funktionieren allerdings auch die \n nicht mehr. Ich bevorzuge die Version diese paar Kombinationen einfach zu excapen, weil es übersichtlicher ist und Zeit spart. Dennoch hier beide Versionen:

# Setup latex_file
latex_file.write(r'\documentclass{labeling-post-its}' + '\n' + r'\usepackage{multicol}' + '\n' + r'\setmaincolor{0}{62}{84}' + '\n' + r'\begin{document}' + '\n' + r'\begin{multicols}{2}' + '\n' )
# Setup latex_file
latex_file.write('''
\documentclass{labeling-post-its}\n
\\usepackage{multicol}\n
\setmaincolor{0}{65}{144}\n
\\begin{document}\n
\\begin{multicols}{2}\n''' )

Die \documentclass{labeling-post-its} habe ich selbst geschrieben, dazu aber später mehr. Mit multicol werden mehrere Spalten nebeneinander auf einer Seite erzeugt, sodass die Notizzettel in Zweierreihen aufgemalt werden und viel Platz gespart werden kann.

Nun zum eigentlichen Teil, dem Durchsuchen der Ordner und der Umwandlung der .txt-Files. Es wird einfach mit einer for-Schleife über den gegebenen Ordner iteriert und jeder Dokumentname auf die Endung .txt überprüft. Wenn es sich um ein Text-Dokument handelt, wird die Datei geöffnet, die erste Zeile als header und der Rest als content eingelesen. Dann müssen Zeichen, die in einer .tex-Datei anders geschrieben werden ersetzt werden, damit es zu keinen Komplikationen kommt. Für jede Text-Datei wird nun eine Variable latex_code mit je einer framebox mit 8cm erstellt (diese erstellt den Rahmen um die Notizzettel), darin befindet sich eine parbox, die die Überschrift header und den Inhalt content enthält. Der LaTeX-Code wird zum Schluss in die .tex-Datei geschrieben.

# Durchsuchen Sie den Ordner nach Textdateien
for filename in os.listdir(folder_path):
    if filename.endswith('.txt'):
        # Öffnen und Lesen der Textdatei
        with open(os.path.join(folder_path, filename), 'r') as f:
            # Lesen der ersten Zeile als Überschrift
            header = f.readline().strip()
            # Lesen des Rests des Inhalts
            content = f.read()
        
        # Konvertieren des Textinhalts in LaTeX-Format
        latex_content = content.replace('&', '\&').replace('%', '\%').replace('$', '\$').replace('#', '\#').replace('\n', r'\\'+'\n')
        
        # Erstellen des LaTeX-Codes für einen Rahmen mit 8x8 cm Größe und der Überschrift
        latex_code = '\\framebox[8cm]{ \n\parbox[t][7.5cm]{7.5cm}{ \n\heading{' + header + '}\n'+ latex_content + '}}\n'
        
        # Schreiben des LaTeX-Codes in die Datei
        latex_file.write(latex_code + '\n')

Zu guter Letzt muss noch das Ende der LaTeX-Datei geschrieben werden:

latex_file.write(''' 
\end{multicols}
\end{document}''')

Der gesamte Python-Code

import os
import sys

# Ordnerpfad, in dem die Textdateien gespeichert sind
folder_path = sys.argv[1]
latex_file_name = "labeling-post-its.tex"
latex_file = open(os.path.join(folder_path, latex_file_name), 'w')

# Setup latex_file
latex_file.write('''
\documentclass{labeling-post-its}\n
\\usepackage{multicol}\n
\setmaincolor{0}{65}{144}\n
\\begin{document}\n
\\begin{multicols}{2}\n''' )

# Durchsuchen Sie den Ordner nach Textdateien
for filename in os.listdir(folder_path):
    if filename.endswith('.txt'):
        # Öffnen und Lesen der Textdatei
        with open(os.path.join(folder_path, filename), 'r') as f:
            # Lesen der ersten Zeile als Überschrift
            header = f.readline().strip()
            # Lesen des Rests des Inhalts
            content = f.read()
        
        # Konvertieren des Textinhalts in LaTeX-Format
        latex_content = content.replace('&', '\&').replace('%', '\%').replace('$', '\$').replace('#', '\#').replace('\n', r'\\'+'\n')
        
        # Erstellen des LaTeX-Codes für einen Rahmen mit 8x8 cm Größe und der Überschrift
        latex_code = '\\framebox[8cm]{ \n\parbox[t][7.5cm]{7.5cm}{ \n\heading{' + header + '}\n'+ latex_content + '}}\n'
        
        # Schreiben des LaTeX-Codes in die Datei
        latex_file.write(latex_code + '\n')

latex_file.write(''' 
\end{multicols}
\end{document}''')

.tex und .cls

Das LaTeX-Dokument, das mit dem Python-Code erstellt wurde ist an sich komplett funktionsfähig. Allerdings habe ich wie bereits erwähnt eine eigene Klasse labeling-post-its geschrieben. Diese befindet sich in einer .cls-Datei, die sich im Zielordner befinden muss. Wie das Zusammenspiel von .tex und .cls funktioniert und was genau eigentlich dahintersteckt erkläre ich in meinem Beitrag “Bewerbung schreiben – LaTeX Template für Lebenslauf und Bewerbungsschreiben erstellen“.

Meine Klasse stylt setzt eine andere Schriftart ein und stylt die Überschriften. Daher kommen die Befehle \setmaincolor für die Farbe der Überschriften und \heading für Überschriften an sich. Die Klasse sieht folgendermaßen aus:

\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{labeling-post-its}[2023/03/09 Custom image labeling post it class for the Observatory Höfingen by ramona.gloetter.de]

\LoadClass{article}

%-----------------------------------------------------------------
%	SETTING GEOMETRY AND FONT
%-----------------------------------------------------------------

\usepackage[a4paper]{geometry}

\geometry {
    top = 2cm,
    bottom = 2cm,
    left = 2cm,
    right = 2cm,
    %showframe
}

\pagestyle{empty}

\usepackage{courierten}
\renewcommand*\familydefault{\ttdefault}
\usepackage[T1]{fontenc}

%-----------------------------------------------------------------
% COLOR DEFINITIONS
%-----------------------------------------------------------------

\usepackage{transparent}
\usepackage{color}
\usepackage{xhfill} 

\definecolor{maincolor}{RGB}{0, 0, 0}

\newcommand{\setmaincolor}[3]{
    \definecolor{maincolor}{RGB}{#1, #2, #3}
}

%-----------------------------------------------------------------
%	CUSTOMIZE \section
%-----------------------------------------------------------------

\RequirePackage{titlesec}
\usepackage{xcolor}

%\bfseries, \itshape: make the heading bold or italic;
%\scshape:small capitals;
%\small, \normalsize, \large, \Large, \LARGE, \huge, \Huge: set the font size;
%\rmfamily, \sffamily, \ttfamily: set the font type to serifed, sans serifed or typewriter respectively.

\titleformat{\section} 
    {\huge\scshape\centering}
    {}{0em}
    {}
    [\titlerule]

%-----------------------------------------------------------------
%	STLYE: HEADING
%-----------------------------------------------------------------

\newcommand{\heading}[1]{
    \textcolor{maincolor}{
        \section{#1}
    }
    \vspace*{1em}
}

Mit dieser Klasse kann das .tex-Dokument kompiliert werden und erstellt ein fertiges PDF mit Notizzetteln, das ungefähr so aussieht:

21390cookie-checkAutomatisiert Text-Dokumente in Notizzettel umwandeln

Leave a Reply

Your email address will not be published. Required fields are marked *