Маркированные входные параметры

Маркированные входные параметры

Я создаю главную страницу для различных экзаменов и хочу немного автоматизировать ее. В данный момент я пишу (или, скорее, копирую и вставляю) кучу команд в преабмле следующим образом:

\newcommand{\contact}{Lecturer name}
\newcommand{\date}{2019-07-12}
.
.
\settoggle{isVisit}{true}

И в моем основном документе я вызываю его, написав

\FrontpageUiT

Ниже показан минимальный пример. Я хочу изменить команду, чтобы вместо нее использовать следующий синтаксис

\FrontpageUiTsetup{
    contact = Lecturer name, 
    date = 2019-07-12,
    pages =,
%   visit = Yes,
    visitWhen = approximately 11
    .
    .
    .
}

и вызвать его, написав

\FrontpageUiT

В основном документе. У меня есть некоторые очень базовые потребности в файле настройки

  • Если строка не включена в настройку (или закомментирована). Эта строка не должна существовать в печатной таблице. Ее следует просто игнорировать/удалить.
  • Если строка пустая, ее следует включить как пустую.

Можно ли создать функцию, имеющую файл настройки с именованными входными данными?

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

решение1

Традиционным интерфейсом для этого было бы наличие команды \location, которая сохраняет некоторое значение в \@location(и то же самое для всех других параметров). Затем команда набора должна использовать сохраненные значения, если они существуют. (Это интерфейс, используемый стандартными классами для \date, author, и т. д.)

Вот как это можно сделать (для небольшого набора параметров):

\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}
  • Если вы действительно хотите, чтобы все параметры были набраны одинаково, вы, конечно, можете добавить макрос, чтобы сэкономить время на наборе текста.
  • Если вас не волнует языковая адаптируемость, вы, конечно, можете вводить имена параметров напрямую, \FrontpageUiTа не определять макрос для каждого из них.
  • Я внес некоторые улучшения в вашу таблицу. Посмотрите, понравится ли вам.

Если вы предпочитаете интерфейс ключ-значение, вы можете легко достичь этого, используя любой из различных пакетов, предоставляющих эту функциональность. С expl3этим это будет выглядеть так: Load xparse, замените часть, предоставляющую команды и начальные значения, на

  \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

и установите ключи как

\FrontpageUiTsetup{
  location = Room~101,
  contact  = Mr.~O'Brien,
}

(Конечно, все это можно было бы настроить и назвать более соответствующим образом expl3, но идея такова.)

Связанный контент