Der beste Weg, ein Layout zu automatisieren

Der beste Weg, ein Layout zu automatisieren

Ich bin neu im Bereich Klassen und möchte eine Klasse erstellen, die das komplette Layout des Dokuments automatisiert. Dazu gehören:

  • Festlegen einer bestimmten PDF-Datei als Hintergrund,
  • Das Titelblatt hat einen anderen Hintergrund als der Rest des Dokuments.
  • Die Dokument-ID und der Dokumentname sollten auf der Titelseite und in der Kopfzeile der folgenden Seiten stehen.

Ich habe es geschafft, den Hintergrund einzufügen, damit war es kein Problem. Aber nach stundenlanger Suche konnte ich keinen Weg finden, das Vorfüllen wiederkehrender Texte wie der ID und des Betreffs zu automatisieren.

Hier ein minimalistisches Arbeitsbeispiel meiner my_class.clsDatei:

\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{my_class}[2023/03/10 A document class for my compagny documents]
\LoadClass[a4paper, 12pt]{article}

\usepackage{fancyhdr}


\RequirePackage{palatino}
\RequirePackage{mathpazo}

\RequirePackage[T1]{fontenc}
\RequirePackage[french]{babel}

\RequirePackage[left=2.5cm, right=2.5cm, top=2.4cm, bottom=2.5cm]{geometry}

% The background
\RequirePackage[pages=1]{background}
\backgroundsetup{scale = 1.01, angle = 0, opacity = 1,
  contents = {
            \ifnum\thepage = 1 \includegraphics[width = \paperwidth, height = \paperheight, keepaspectratio]{bg_title.pdf}
            \else \includegraphics[width = \paperwidth, height = \paperheight, keepaspectratio]{bg_all.pdf}
            \fi}}
            
\pagestyle{fancy}
\renewcommand\headrulewidth{0pt}
\fancyhf{} 
\fancyfootoffset[R]{-0.35cm}
\fancyfoot[R]{\color{white}\vspace{-0.05cm}\textbf{\thepage}}
\fancyheadoffset[R]{-0.30cm}
\fancyhead[R]{document_name \hspace{0.5cm}\textbf{\color{white}document_ID}}

% Title page
\AtBeginDocument{
\thispagestyle{empty}
\begin{center}
       \vspace*{0.15\textheight}
       \textbf{\huge document_ID -- client}
       
       \vspace{0.8cm}
       \textbf{\huge project_name}   
       
       \vspace{0.8cm}
       \includegraphics[width=0.4\textwidth]{title_page_logo}
       \vspace{0.8cm}
       
       \textbf{\huge document_name}
       \vfill
       
       This document is confidential
       
       \vspace{0.8cm}
       
       Date de la dernière mise à jour du document : \today \\
       Rédacteur(s) du document : redactor
            
\end{center}
\newpage
\tableofcontents
\newpage
}

Und in meiner texAkte,

\documentclass{my_class}


\begin{document}
Hello world!
\end{document}

In meinem Dokument ist das grundlegende Layout bereits vorhanden (Hintergrund, Überschriften usw.). Sie können in der clsDatei jedoch sehen, dass es einige Informationen gibt, die vom Dokument abhängen:

  • document_ID(Kopfzeilen und Titelseite)
  • document_name(Kopfzeilen und Titelseite)
  • client(Titelblatt)
  • project_name(Titelblatt)
  • title_page_logo(Titelblatt)
  • redactor(Titelblatt)

(für uns ist es wichtig, solche Dinge zu automatisieren => alle Dokumente haben genau das gleiche Layout, und wenn Sie nicht alle Informationen eingeben, tritt ein Fehler auf und das Dokument kann nicht kompiliert werden).

Ich suche beispielsweise nach etwas wie „wenn Sie anrufen“ \author{...}und „anrufen“ \document_ID{ID 1235} , aber es funktioniert nicht über Klassen.

Gibt es eine Möglichkeit, so etwas zu tun? Oder zumindest in der Tex-Datei die Klasse einfach mit: \documentclass[document_ID=ID 1235,...]{my_class}oder so ähnlich aufzurufen?

Ich habe viel darüber gelesen \DeclareOptions, bin mir aber nicht sicher, ob es für „String-Eingabe“ wie hier geeignet ist! (oder ich habe einfach nicht verstanden, wie es funktioniert).

Vielen Dank für Ihre Hilfe!

Antwort1

Lassen Sie mich etwas näher auf John Kormylos Kommentar eingehen. Das Folgende sollte das tun, was Sie erwarten, und Ihr Hauptdokument nicht aufblähen. Sie müssen nur einige Werte (Dokument-ID, Dokumentname, ...) am Anfang Ihrer Hauptdatei definieren und die .texDatei mit den allgemeinen Dingen importieren. Sie brauchen keine ausgefallenen Klassen oder ähnliches. Ergebnis

main.tex

\documentclass[a4paper]{article}

% Fill in these information. Just do it!
\newcommand{\myDocID}{ID~0123456789}
\newcommand{\myDocName}{Important Document}
\newcommand{\myClient}{Claire Client}
\newcommand{\myProjName}{Important Project}
\newcommand{\myTitleLogo}{example-image-duck}
\newcommand{\myEditor}{Ph.\,D.~Eddy Editor}

% Additional packages.
\usepackage{lipsum} % Just to have some blindtext.

% Input generic setup stuff.
\input{genericSetup.tex}

% Start of document.
\begin{document}
    \lipsum
\end{document}

genericSetup.tex

% Necessary packages. If you need to load any package with certain options, e.g. `\usepackage[draft]{graphicx}`, make sure you have this line *before* `\input`ting this code.
\usepackage{graphicx}
\usepackage{fancyhdr}
\usepackage{eso-pic}

% Apply `fancyhdr` stuff.
\pagestyle{fancy}
\renewcommand\headrulewidth{0pt}
\fancyhf{} 
\fancyfootoffset[R]{-0.35cm}
\fancyfoot[R]{\color{white}\vspace{-0.05cm}\textbf{\thepage}}
\fancyheadoffset[R]{-0.30cm}
\fancyhead[R]{\myDocName \hspace{0.5cm}\textbf{\color{white}\myDocID{}}}

% Define behavior at start of the document.
\AtBeginDocument{
    % Create titlepage.
    \begin{titlepage}
        \centering
        \ClearShipoutPicture
        \AddToShipoutPictureBG*{\includegraphics[width=\paperwidth,height=\paperheight]{example-image-a}}% replace with a fixed titlepage background image
        \vspace*{0.15\textheight}
           \textbf{\huge \myDocID{} -- \myClient}
           
           \vspace{0.8cm}
           \textbf{\huge \myProjName}
           
           \vspace{0.8cm}
           \includegraphics[width=0.4\textwidth]{\myTitleLogo}
           \vspace{0.8cm}
           
           \textbf{\huge \myDocName}
           \vfill
           
           This document is confidential.
           
           \vspace{0.8cm}
           
           Date de la dernière mise à jour du document : \today \\
           Rédacteur(s) du document: \myEditor
    \end{titlepage}
    
    % Define background for non-titlepage pages *after* printing the titlepage.
    \AddToShipoutPictureBG{\includegraphics[width=\paperwidth,height=\paperheight]{example-image-b}}% replace with a fixed titlepage background image
}

verwandte Informationen