저는 다양한 시험을 위한 첫 페이지를 만들고 있으며 이를 좀 더 자동화하려고 합니다. 현재 나는 다음과 같이 사전 설명에 수많은 명령을 작성합니다(또는 복사 붙여넣기).
\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
이것이 아이디어입니다.)