Parámetros de entrada etiquetados

Parámetros de entrada etiquetados

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 \locationque 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 \FrontpageUiTlugar 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 expl3esto 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).

información relacionada