Estoy creando una página de inicio para varios exámenes y busco automatizarla un poco más. En este momento escribo (o más bien copio y pego) un montón de comandos en el preámbulo de la siguiente manera:
\newcommand{\contact}{Lecturer name}
\newcommand{\date}{2019-07-12}
.
.
\settoggle{isVisit}{true}
Y en mi documento principal lo invoco escribiendo
\FrontpageUiT
A continuación se muestra un ejemplo mínimo. Quiero cambiar el comando para poder usar la siguiente sintaxis
\FrontpageUiTsetup{
contact = Lecturer name,
date = 2019-07-12,
pages =,
% visit = Yes,
visitWhen = approximately 11
.
.
.
}
e invocarlo escribiendo
\FrontpageUiT
En el documento principal. Tengo algunas necesidades muy básicas para el archivo de instalación.
- Si una línea no está incluida en la configuración (o comentada). Esa línea no debería existir en la tabla impresa. Simplemente debería ignorarse/eliminarse.
- Si una línea está en blanco, debe incluirse como en blanco.
¿Es posible crear una función que tenga un archivo de configuración, con entradas con nombre?
\documentclass{article}
\usepackage{etoolbox}
\usepackage{lastpage,hyperref}
\newtoggle{isVisit} \settoggle{isVisit}{true}
\newtoggle{showVisit} \settoggle{showVisit}{true}
\usepackage[utf8]{inputenc}
\newcommand{\courseCode}{MAT~--~2200}
\newcommand{\courseNameEnglish}{Differential Equations}
% Default time is 09:00 - 13:00 | Uncomment and change the line below \visif neccecary
% \newcommand{\examtime}{15:00--19:00}
\newcommand{\location}{Technical Studies 1}
\newcommand{\permittedAids}{Calculator}
\newcommand{\paper}{squares}
\newcommand{\pages}{} % Sets the total number of pages manually. Uncomment if neccecary
\newcommand{\contact}{John Doe}
\newcommand{\mobile}{}
\settoggle{isVisit}{false} % Uncomment this line if examinator / person in charge is visiting
\newcommand{\visitWhen}{ca. 11:00}
\settoggle{showVisit}{true} %Uncomment if unknown when visit
% \newcommand{\ExerciseNumber}{1}
\newcommand{\PublishedDate}{2018--09--25}% YEAR {dddd} MONTH {01 - 12} DAY {01 - 31}
% \Deadline{2018}{11}{27}% Has to be set, not visible if exam
\newcommand{\nonEmptyExist}[3]{%
\ifdef{#1}{%
\ifdefempty{#1}{#2}{#3}%%
}{%
#2%
}%
}
\newcommand{\FrontpageUiT}{%
\begin{tabular}{|p{0.2\textwidth}|p{0.728\textwidth}|}
\hline
Exam: & \courseCode, \courseNameEnglish\\ \hline
Date: & \PublishedDate \\ \hline
Time: & \nonEmptyExist{\examtime}{09:00 -- 13:00}{\examtime} \\ \hline
Location: & \location \\ \hline
Permitted aids & \permittedAids \\
\hline
Type of paper & \paper \\ \hline
Total pages & \bfseries\nonEmptyExist{\pages}{\pageref*{LastPage}}{\pages} \\ \hline
Contact & John Doe \\
Mobile & \mobile \\ \hline
\iftoggle{showVisit}{%
\multicolumn{2}{|l|}{Does lecturer visit \iftoggle{isVisit}{YES}{NO}}
\iftoggle{isVisit}{\\ \multicolumn{2}{|l|}{If yes: \visitWhen}}{} \\ \hline}{}%
\end{tabular}
}
\begin{document}
\FrontpageUiT
\end{document}
Respuesta1
La interfaz tradicional para esto sería tener un comando \location
que almacene algún valor \@location
(y lo mismo para todos los demás parámetros). El comando de composición debería entonces utilizar los valores almacenados, si existen. (Esta es la interfaz utilizada por las clases estándar para \date
, author
, etc.)
Así es como puedes hacer esto (para una pequeña selección de tus parámetros):
\documentclass{article}
\usepackage{booktabs}
\makeatletter
% Provide commands.
\newcommand*\new@document@parameter[1]{%
% Check if names are taken.
\expandafter\newcommand\csname #1\endcsname{}%
\expandafter\newcommand\csname @#1\endcsname{}%
% Set up the parameter
\expandafter\edef\csname #1\endcsname##1{%
\gdef\expandafter\noexpand\csname @#1\endcsname{##1}%
}%
\expandafter\let\csname @#1\endcsname\@empty
}
\new@document@parameter{examtime}
\new@document@parameter{location}
\new@document@parameter{permittedaids}
\new@document@parameter{contact}
% Provide initial values.
\examtime{09:00\,--\,13:00}
% Provide names.
\newcommand*\examtimename{Time}
\newcommand*\locationname{Location}
\newcommand*\permittedaidsname{Permitted aids}
\newcommand*\contactname{Contact}
% The typesetting command.
\newcommand\FrontpageUiT{%
\noindent
\begin{tabular}{p{0.2\textwidth} p{\dimexpr 0.8\textwidth - 4\tabcolsep}}\toprule
\ifx\@examtime\@empty\else
\examtimename & \@examtime \\%
\fi
\ifx\@location\@empty\else
\locationname & \@location \\%
\fi
\ifx\@permittedaids\@empty\else
\permittedaidsname & \@permittedaids \\%
\fi
\ifx\@contact\@empty\else
\contactname & \@contact \\%
\fi
\bottomrule
\end{tabular}%
}
\makeatother
\location{Room~101}
\contact{Mr.~O'Brien}
\begin{document}
\FrontpageUiT
\end{document}
- Si realmente desea componer todos los parámetros de manera idéntica, puede, por supuesto, agregar una macro para ahorrar algo de escritura.
- Si no le importa la adaptabilidad del idioma, puede, por supuesto, escribir los nombres de los parámetros directamente en
\FrontpageUiT
lugar de definir una macro para cada uno. - Hice algunas mejoras en tu mesa. Mira si te gustan.
Si prefiere una interfaz clave-valor, puede lograrla fácilmente utilizando cualquiera de los diversos paquetes que brindan esa funcionalidad. Con expl3
esto quedaría así: Cargar xparse
, reemplazar la parte que proporciona los comandos y valores iniciales con
\ExplSyntaxOn
% Provide keys.
\keys_define:nn { babylonia }
{
examtime .tl_set:N = \@examtime,
examtime .initial:n = {09:00\,--\,13:00},
location .tl_set:N = \@location,
permittedaids .tl_set:N = \@permittedaids,
contact .tl_set:N = \@contact,
}
% Provide key setting command.
\NewDocumentCommand\FrontpageUiTsetup{ m }{
\keys_set:nn { babylonia } { #1 }
}
\ExplSyntaxOff
y configurar las teclas como
\FrontpageUiTsetup{
location = Room~101,
contact = Mr.~O'Brien,
}
(Por supuesto, todo podría configurarse y nombrarse de una manera más consistente con expl3
, pero esta es la idea).