#!/bin/bash set -e # Bricht bei Fehlern sofort ab # spell:ignore tlmgr texhash texliveonfly beamer biblatex ieee booktabs bigdelim ccicons circuitikz # spell:ignore Ghostscript biber cleveref concmath csquotes currfile enumitem everypage extdash # spell:ignore filehook fmtcount fontawesome fontaxes fontmfizz fontspec fontsrecommended ghostscript # spell:ignore gitea imakeidx infraonly isbn koma latexmk ltablex luatexbase marginnote mathtools # spell:ignore microtype ncctools newpx newtx newunicodechar nextpage parskip pdfcol pdflscape pdfpages # spell:ignore pgfplots pict setspace sidecap siunitx stix subfigure tcolorbox tikzfill titlesec # spell:ignore trimspaces unicode upquote vmargin wrapfig xcharter xltabular xpatch xstring xecjk # spell:ignore ctan niranjan netcologne multirow texlive noconfirm pacman tlnet tlpdb tlpkg TLMGR=$(which tlmgr) TEXHASH=$(which texhash) echo "=== Starte optimierte LaTeX-Konfiguration ===" # ============================================================================== # AUTOMATISCHE SERVER-FALLBACK LOGIK # ============================================================================== # Liste von zuverlässigen Spiegelservern (Der zweite ist der automatische CTAN-Verteiler) DOMAINS=( "at.ctan.niranjan.co" "mirror.ctan.org" "tu-chemnitz.de" "netcologne.de" "mirror.netcologne.de/tex-archive" ) # Das ist der exakte Pfad, den TeX Live zwingend benötigt PATH_SUFFIX="/systems/texlive/tlnet" UPDATE_SUCCESS=false ACTIVE_SERVER="" echo "Aktualisiere tlmgr und alle installierten Pakete..." for DOMAIN in "${DOMAINS[@]}"; do # Hier bauen wir das Protokoll und den Pflichtpfad fehlerfrei zusammen SERVER="https://${DOMAIN}${PATH_SUFFIX}" # Sonderfall für den Haupt-CTAN-Server, da dieser manchmal kein https erzwingt if [[ "$DOMAIN" == "mirror.ctan.org" ]]; then SERVER="http://${DOMAIN}${PATH_SUFFIX}" fi echo "Versuche Verbindung zu Spiegelserver: $SERVER" # Sende eine schnelle Anfrage an die MD5-Datenbank des Servers. # --connect-timeout 3: Bricht nach 3 Sekunden ab, falls der Server nicht reagiert. # --max-time 5: Der gesamte Check darf maximal 5 Sekunden dauern. if curl --output /dev/null --silent --head --fail --connect-timeout 3 --max-time 5 "${SERVER}/tlpkg/texlive.tlpdb.md5"; then echo "--> Server online. Starte TeX Live Update über $SERVER..." # Da wir wissen, dass der Server da ist, führen wir das eigentliche Update aus if $TLMGR update --repository "$SERVER" --self --all; then echo "--> Update erfolgreich durchgeführt!" UPDATE_SUCCESS=true ACTIVE_SERVER="$SERVER" break fi else echo "⚠️ Warnung: Server reagiert nicht schnell genug (Timeout) oder ist offline. Versuche nächsten..." fi done if [ "$UPDATE_SUCCESS" = false ]; then echo "❌ ERROR: Alle TeX Live Spiegelserver sind offline oder es gibt keine Internetverbindung." >&2 exit 1 fi # ============================================================================== # 2. Nur deinstallieren, falls überhaupt vorhanden # Nutzen den ermittelten ACTIVE_SERVER, um erneute Verbindungsfehler zu vermeiden if $TLMGR info --repository "$ACTIVE_SERVER" texliveonfly | grep -q "installed: Yes"; then echo "Deinstalliere veraltetes texliveonfly..." $TLMGR remove --repository "$ACTIVE_SERVER" texliveonfly fi # 3. ALLE Pakete gebündelt in EINEM Rutsch installieren (only scheme-minimal installed) # Hinweis: scheme-basic beinhaltet bereits scheme-infraonly sowie scheme-minimal echo "Installiere alle benötigten LaTeX-Pakete parallel/gebündelt..." $TLMGR install --repository "$ACTIVE_SERVER" \ background \ beamer \ biblatex \ biblatex-ieee \ booktabs \ cancel \ caption \ ccicons \ circuitikz \ cleveref \ cm-unicode \ collection-fontsrecommended \ concmath-otf \ contour \ csquotes \ currfile \ datetime \ datetime2 \ datetime2-english \ datetime2-german \ ean \ ean13isbn \ enumitem \ epigraph \ everypage \ filehook \ fmtcount \ fontawesome5 \ fontaxes \ fontmfizz \ fontspec \ imakeidx \ koma-script \ latexmk \ lastpage \ lineno \ listings \ ltablex \ luatexbase \ luatexja \ marginnote \ mathtools \ microtype \ minted \ multirow \ ncctools \ newpx \ newtx \ newunicodechar \ nextpage \ ocr-b \ parskip \ pdfcol \ pdflscape \ pdfpages \ pgf \ pgfplots \ physics \ pict2e \ ragged2e \ scheme-basic \ setspace \ sidecap \ siunitx \ steinmetz \ stix2-otf \ subfigure \ tcolorbox \ tikzfill \ titlesec \ translations \ trimspaces \ unicode-math \ upquote \ vmargin \ wrapfig \ xcharter \ xltabular \ xpatch \ xstring echo "Deinstalliere unerwünschte LaTeX-Pakete..." # 'ae' und 't1enc' wurden entfernt, da sie geschützte Systempakete sind. # Liste der Pakete, die deinstalliert werden sollen (einfach mit Leerzeichen trennen) PACKETS=("truncate") for packet in "${PACKETS[@]}"; do if tlmgr info "$packet" --only-installed >/dev/null 2>&1; then echo "Lösche Paket: $packet..." tlmgr remove "$packet" || true else echo "Paket '$packet' ist nicht installiert oder wurde bereits gelöscht." fi done # 4. Datenbank-Refresh (tlmgr install macht das oft automatisch, sicherheitshalber am Ende einmal) echo "Aktualisiere LaTeX-Dateidatenbank..." $TEXHASH # 5. System-Abhängigkeiten prüfen und installieren (Biber & Ghostscript) echo "Überprüfe Linux-Systemkomponenten..." # Liste der zu installierenden Apt-Pakete SYSTEM_PACKAGES="" INSTALLED_PACKAGES="" if ! command -v biber >/dev/null 2>&1; then echo " -> biber fehlt und wird vorgemerkt." SYSTEM_PACKAGES="$SYSTEM_PACKAGES biber" else echo " -> biber ist bereits installiert ($(biber --version | head -n 1))." INSTALLED_PACKAGES="$INSTALLED_PACKAGES biber" fi if ! command -v gs >/dev/null 2>&1; then echo " -> ghostscript (gs) fehlt und wird vorgemerkt." SYSTEM_PACKAGES="$SYSTEM_PACKAGES ghostscript" else echo " -> ghostscript (gs) ist bereits installiert ($(gs --version | head -n 1))." INSTALLED_PACKAGES="$INSTALLED_PACKAGES ghostscript" fi # Paket-Installation basierend auf dem verfügbaren Paketmanager if [ -n "$SYSTEM_PACKAGES" ]; then if command -v apt-get >/dev/null 2>&1; then echo "Debian/Ubuntu-System erkannt. Installiere:$SYSTEM_PACKAGES..." sudo apt-get update && sudo apt-get install -y $SYSTEM_PACKAGES elif command -v pacman >/dev/null 2>&1; then echo "Arch Linux erkannt. Installiere:$SYSTEM_PACKAGES..." # Arch nutzt andere Paketnamen für ghostscript (ghostscript) und biber (biber) sudo pacman -Sy --noconfirm $SYSTEM_PACKAGES else echo "⚠️ Unbekanntes System (kein apt oder pacman gefunden)." echo "Bitte installiere die folgenden Pakete manuell: $SYSTEM_PACKAGES" fi else # Formatierung: Entfernt führende Leerzeichen und ersetzt verbleibende durch Kommata CLEAN_LIST=$(echo $INSTALLED_PACKAGES | sed 's/ /, /g') echo " -> Alle notwendigen Systemkomponenten ($CLEAN_LIST) sind bereits installiert!" fi echo "" echo "=== Speicherplatz-Optimierung ===" read -p "Möchtest du alle alten tlmgr-Paktebackups unwiderruflich löschen? (j/N): " response if [[ "$response" =~ ^[jJ][aA]?$ || "$response" = "j" ]]; then echo "Lösche alte Backups..." $TLMGR backup --clean=0 --all else echo "Backups wurden beibehalten." fi echo "=== Fertig! ===" echo "Reminder: Please update pull/push the ~/gitea/scripts : scripts.git repository!"