\documentclass{article} \usepackage{multido,xcolor,xfp} \usepackage{enumitem,xkeyval} \makeatletter \define@cmdkey{QA}{question}[\relax]{} \define@cmdkey{QA}{answer}[\relax]{} \define@cmdkey{QA}{lines}[4]{}% Default of 4 lines \define@cmdkey{QA}{points}[1]{}% Default of 1 point \newif\ifprintanswers \long\def\MainFrage#1#2\EndMainFrage{% \setkeys{QA} {question,answer,lines,points,% Set default values #1}% Set user-specified values \begin{enumerate}[resume] \item \cmdKV@QA@question \par #2 \end{enumerate} } \NewDocumentCommand{\OffeneFrage}{ m }{% \setkeys{QA} {question,answer,lines,points,% Set default values #1}% Set user-specified values \ifx\cmdKV@QA@question\relax % No question was supplied; do nothing \else \begin{enumerate}[resume] \begin{samepage} \item \cmdKV@QA@question% Set question \unskip\hspace*{\fill}% \ifnum\cmdKV@QA@points>0 % Print points if > 0 ~\cmdKV@QA@points~P\par \fi \ifx\cmdKV@QA@answer\relax % No answer was supplied \multido{}{\cmdKV@QA@lines}{\item[]}% No answer provided; set lines \else % Answer was supplied \ifprintanswers \item[] {\color{red}\cmdKV@QA@answer}% Set answer \multido{}{\inteval{\cmdKV@QA@lines-1}}{\item[]}% Set additional gap \else \multido{}{\cmdKV@QA@lines}{\item[] \dotfill}% Set answer lines \fi \fi \end{samepage} \end{enumerate} \fi } \makeatother %\printanswerstrue \begin{document} \MainFrage{ question={Answer the following questions about animals.} } \OffeneFrage{ question={How many legs does a dog have?}, lines=2, points=5 } \OffeneFrage{ answer={A dog has four legs}, question={How many legs does a dog have?}, lines=2, points=5 } \OffeneFrage{ lines=3, question={How many legs does a cat have?}, } \EndMainFrage \end{document}