Beschriftete Eingabeparameter

Beschriftete Eingabeparameter

Ich erstelle eine Startseite für verschiedene Prüfungen und möchte sie noch etwas weiter automatisieren. Im Moment schreibe ich eine Menge Befehle in die Präambel (oder kopiere sie besser und füge sie ein), wie folgt:

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

Und in meinem Hauptdokument rufe ich es auf, indem ich schreibe

\FrontpageUiT

Ein Minimalbeispiel ist unten dargestellt. Ich möchte den Befehl ändern, sodass ich stattdessen die folgende Syntax verwenden kann

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

und rufe es auf, indem du schreibst

\FrontpageUiT

Im Hauptdokument. Ich habe einige sehr grundlegende Anforderungen an die Setup-Datei

  • Wenn eine Zeile nicht im Setup enthalten ist (oder auskommentiert ist), sollte diese Zeile in der gedruckten Tabelle nicht vorhanden sein. Sie sollte einfach ignoriert/gelöscht werden.
  • Wenn eine Zeile leer ist, sollte sie als leer eingefügt werden.

Ist es möglich, eine Funktion zu erstellen, die eine Setup-Datei mit benannten Eingaben hat?

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

Antwort1

Die traditionelle Schnittstelle hierfür wäre ein Befehl, \locationder einen Wert in speichert (und das Gleiche gilt für alle anderen Parameter). Der Satzbefehl sollte dann die gespeicherten Werte verwenden, falls sie vorhanden sind. (Dies ist die Schnittstelle, die von den Standardklassen für , , usw. \@locationverwendet wird .)\dateauthor

So können Sie vorgehen (für eine kleine Auswahl Ihrer Parameter):

\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}
  • Wenn Sie wirklich alle Parameter identisch setzen möchten, können Sie natürlich ein Makro hinzufügen, um sich die Tipparbeit zu sparen.
  • Wenn Ihnen die Sprachanpassung egal ist, können Sie die Parameternamen natürlich auch direkt eingeben, \FrontpageUiTanstatt für jeden ein Makro zu definieren.
  • Ich habe einige Verbesserungen an Ihrer Tabelle vorgenommen. Sehen Sie, ob sie Ihnen gefallen.

Wenn Sie eine Schlüssel-Wert-Schnittstelle bevorzugen, können Sie dies ganz einfach mit einem der verschiedenen Pakete erreichen, die diese Funktionalität bieten. Dies expl3würde wie folgt aussehen: Load xparse, ersetzen Sie den Teil, der die Befehle und Anfangswerte bereitstellt, durch

  \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

und stellen Sie die Tasten wie folgt ein:

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

(Natürlich könnte das Ganze auf eine Weise eingerichtet und benannt werden, die besser zu passt expl3, aber das ist die Idee.)

verwandte Informationen