La mejor manera de automatizar un diseño

La mejor manera de automatizar un diseño

Soy nuevo en las clases y me gustaría hacer una clase que automatice el diseño completo del documento. Esto incluye :

  • establecer un archivo pdf determinado como fondo,
  • hay un fondo diferente en la portada que en el resto del documento,
  • el ID del documento y el nombre del documento deben estar en la página de título y en el encabezado de las páginas siguientes.

Logré poner el fondo, no hay problema con eso. Pero después de horas de búsqueda no pude encontrar una manera de automatizar el llenado previo de texto recurrente como el ID y el asunto.

Aquí un ejemplo de trabajo minimalista de mi my_class.clsarchivo:

\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
}

Y en mi texexpediente,

\documentclass{my_class}


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

Entonces, en mi documento, el diseño básico ya está ahí (fondo, encabezados, etc.), sin embargo, puedes ver en el clsarchivo que hay cierta información que depende del documento:

  • document_ID(encabezados y portada)
  • document_name(encabezados y portada)
  • client(pagina del titulo)
  • project_name(pagina del titulo)
  • title_page_logo(pagina del titulo)
  • redactor(pagina del titulo)

(para nosotros es importante automatizar este tipo de cosas => todos los documentos tendrán exactamente el mismo diseño, y si no ingresa toda la información, habrá un error y el documento no se podrá compilar).

Busco algo como cuando llamas \author{...}y llamas \document_ID{ID 1235} , por ejemplo, pero no funciona a través de clases.

¿Hay alguna manera de hacer algo así? ¿O al menos en el archivo tex simplemente llamando a la clase usando: \documentclass[document_ID=ID 1235,...]{my_class}o algo así?

Leí mucho sobre \DeclareOptions, pero no estoy seguro de que sea adecuado para "entrada de cadenas" como aquí. (o simplemente no entendí cómo funciona).

¡Gracias por tu ayuda!

Respuesta1

Permítanme desarrollar un poco el comentario de John Kormylo. Lo siguiente debería hacer lo que espera y no inflar su documento principal. Sólo tendrá que definir algunos valores (ID del documento, nombre del documento, ...) al principio de su archivo principal e importar el .texarchivo que contiene el material genérico. No hay necesidad de clases sofisticadas o cosas similares. Resultado

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
}

información relacionada