Я новичок в классах и хотел бы создать класс, который автоматизирует полную компоновку документа. Это включает в себя:
- установка заданного файла PDF в качестве фона,
- на титульном листе фон отличается от фона в остальной части документа,
- идентификатор документа и название документа должны быть указаны на титульном листе и в заголовке следующих страниц.
Мне удалось поставить фон, с этим проблем нет. Но после нескольких часов поиска я не смог найти способ автоматизировать предварительное заполнение повторяющегося текста, такого как идентификатор и тема.
Вот минималистичный рабочий пример моего my_class.cls
файла:
\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
}
И в моем tex
досье,
\documentclass{my_class}
\begin{document}
Hello world!
\end{document}
Итак, в моем документе базовый макет уже есть (фон, заголовки и т. д.), однако в файле вы можете видеть, cls
что есть некоторая информация, которая зависит от документа:
document_ID
(заголовки и титульный лист)document_name
(заголовки и титульный лист)client
(титульная страница)project_name
(титульная страница)title_page_logo
(титульная страница)redactor
(титульная страница)
(для нас важно автоматизировать подобные вещи => все документы будут иметь одинаковую структуру, и если вы не введете всю информацию, возникнет ошибка и документ не сможет быть составлен).
Я ищу что-то вроде when you call \author{...}
, и call \document_ID{ID 1235}
например, но это не через классы, которые это работает.
Есть ли способ сделать что-то подобное? Или хотя бы в tex-файле просто вызвать класс, используя : \documentclass[document_ID=ID 1235,...]{my_class}
или что-то вроде этого?
Я много читал о \DeclareOptions
, но не уверен, что он подходит для «ввода строк», как здесь! (или я просто не понял, как он работает).
Спасибо за вашу помощь!
решение1
Позвольте мне немного пояснить комментарий Джона Кормило. Следующий код должен делать то, что вы ожидаете, и не раздувать ваш основной документ. Вам просто нужно будет определить некоторые значения (идентификатор документа, имя документа, ...) в начале вашего основного файла и импортировать файл, .tex
содержащий общие вещи. Нет необходимости в причудливых классах или подобных вещах.
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
}