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, \location
der 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. \@location
verwendet wird .)\date
author
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,
\FrontpageUiT
anstatt 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 expl3
wü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.)