8

with a group of teachers friends we are compiling the national and international tests applied in my country from 1980. These are "multiple choice" tests, with most of the tests already written using the enumerate package or the enumitem package. A total of 50 tests each with 60 or 80 questions.

In order to be able to save the keys to each question, without having to make any more modifications to the files, I have created an environment mchoice and two commands \keych and \keytest using \label...\reffor save keys of each question using xparse,pgffor,refcount, enumitem, hyperref and tcolorbox package.

As I will often use \label (about 4000 times) I would like to know if TeX (latex or pdflatex) can process it, that is, it will not give me a memory error.

I tried searching for a "perl hash style" to save the keys to each question, (whitout label ref) something similar to what I proposed in https://tex.stackexchange.com/a/215628/7832 (save value in list) but I did not get it to work.

Grateful in advance

% file mchoice.tex
% arara: latex: {draft: yes}
% arara: latex
% arara: dvips
% arara: ps2pdf
% arara: clean: { files:[mchoice.aux, mchoice.log, mchoice.out,mchoice.dvi,mchoice.ps] }
\documentclass{article}
\usepackage{enumitem}
\usepackage{multicol}
\usepackage{pgffor}
\usepackage[colorlinks]{hyperref}
\usepackage{refcount}
\usepackage{tcolorbox}
\tcbuselibrary{many}

% Set key for multicols in enumitem
\SetEnumitemKey{columns}{before=\begin{multicols}{#1},after=\end{multicols}}%

% Custom label for save choice key
\makeatletter
\newcommand{\customlabel}[2]{%
   \protected@write \@auxout {}{\string \newlabel {#1}{{#2}{\thepage}{#2}{#1}{}} }%
   \hypertarget{#1}{}%
}
\makeatother

% Create a environment mchoice, scope enumerate and \keych
\NewDocumentEnvironment{mchoice}{m}{%
\label{#1}
% values for multicols 
\setlength{\multicolsep}{5.0pt plus 2.0pt minus 1.5pt}
% values for enumitem
\setenumerate{parsep=3.5pt,partopsep=3.5pt,topsep=3.5pt,labelsep=5pt, leftmargin=*, itemsep=0pt,widest=80}%
\setenumerate[1]{labelsep=5pt,itemsep=1pt,label=\arabic*.}
\setenumerate[2]{leftmargin=16pt,nosep,itemsep=0pt,label=\Alph*)}
% Command to save key choice
\NewDocumentCommand\keych{o}{%
\IfNoValueTF{##1}%
    {\customlabel{#1:\arabic{enumi}}{\Alph{enumii}}}%
    {\customlabel{#1:\arabic{enumi}}{##1}}}% close \keych
}%
{%
\customlabel{max:#1}{\arabic{enumi}}
}% close mchoice

% Create a command to all key for test
% #1 : pass to tcolorbox
% #2 : name
% #3 : ref
% #4 : columns
\newcounter{last}
\DeclareTotalTColorBox{\keytest}{ O{} m m O{4}}
{ size=small,top=-1mm, left=0mm,width=\columnwidth,%
  adjusted title=center,halign title=center,title filled,fontupper=\small,%
  fonttitle=\small\sffamily,adjusted title={#2},center title,#1}
  {% 
  \begin{enumerate}[columns=#4,leftmargin=15pt,labelsep=3pt,font=\small,nosep,widest=25]%
  \small
  \setlength{\columnsep}{0pt} 
   \setcounterref{last}{max:#3}
   \foreach \x in {1,...,\value{last}} {
    \item \ref{#3:\x}
    }
  \end{enumerate}
}%

\begin{document}
\section{National Prov}

\begin{mchoice}{paa-1985-a}
\begin{center}
\textbf{PAA 1985 (A)}
\end{center}
\begin{enumerate}
\item First type of questions
    \begin{enumerate}% 
        \item value 
        \item value 
        \item value
        \item correct \keych
        \item value 
    \end{enumerate}
\item Second type of questions
        \begin{enumerate}[leftmargin=3pc,label=\Roman*.]
            \item $2\alpha+2\delta=90^{\circ}$
            \item $\alpha=\delta$ 
            \item $\angle EDF=45^{\circ}$
        \end{enumerate}
\begin{enumerate}[columns=2]% 
        \item I only 
        \item II only \keych
        \item I and II only
        \item I and III only 
        \item I, II, and III
\end{enumerate}
\item Third type of questions
        \begin{enumerate}[leftmargin=3pc,label=(\arabic*)]
            \item $2\alpha+2\delta=90^{\circ}$
            \item $\angle EDF=45^{\circ}$
        \end{enumerate}
    \begin{enumerate}[columns=2]%  
        \item Altenativa A 
        \item Altenativa B \keych
        \item Altenativa C
        \item Altenativa D
        \item Altenativa E 
    \end{enumerate}
\item Fourth type of questions (these need manual tuning for alternatives, 
      usually carrying pictures or tables)
\begin{center}
\noindent
\hspace*{0.75cm}\includegraphics[scale=0.15]{example-image-b}
\end{center}

\begin{minipage}{0.2\textwidth}
\centering
\includegraphics[scale=0.15]{example-image-a}\newline A)
\end{minipage}
\begin{minipage}{0.2\textwidth}
\centering
\includegraphics[scale=0.15]{example-image-a}\newline B)
\end{minipage}
\begin{minipage}{0.2\textwidth}
\centering
\includegraphics[scale=0.15]{example-image-a}\newline C)
\end{minipage}
\begin{minipage}{0.2\textwidth}
\centering
\includegraphics[scale=0.15]{example-image-a}\newline D) \keych[D]
\end{minipage}
\begin{minipage}{0.2\textwidth}
\centering
\includegraphics[scale=0.15]{example-image-a}\newline E)
\end{minipage}
\item Fifth type of questions, a problem with numerical response \keych[\$2]

\end{enumerate}
\end{mchoice}


\begin{mchoice}{paa-1985-b}
\begin{center}
\textbf{PAA 1985 (B)}
\end{center}
\begin{enumerate}
\item First type of questions
    \begin{enumerate}% 
        \item value 
        \item correct \keych
        \item value 
        \item value
        \item value 
    \end{enumerate}
\item Second type of questions
        \begin{enumerate}[leftmargin=3pc,label=\Roman*.]
            \item $2\alpha+2\delta=90^{\circ}$
            \item $\alpha=\delta$ 
            \item $\angle EDF=45^{\circ}$
        \end{enumerate}
\begin{enumerate}[columns=2]% 
        \item I only 
        \item II only 
        \item I and II only
        \item I and III only \keych
        \item I, II, and III
\end{enumerate}
\item Third type of questions
        \begin{enumerate}[leftmargin=3pc,label=(\arabic*)]
            \item $2\alpha+2\delta=90^{\circ}$
            \item $\angle EDF=45^{\circ}$
        \end{enumerate}
    \begin{enumerate}[columns=2]%  
        \item Altenativa A 
        \item Altenativa B 
        \item Altenativa C
        \item Altenativa D \keych
        \item Altenativa E 
    \end{enumerate}
\item Fourth type of questions (these need manual tuning for alternatives, 
      usually carrying pictures or tables)
\begin{center}
\noindent
\hspace*{0.75cm}\includegraphics[scale=0.15]{example-image-b}
\end{center}

\begin{minipage}{0.2\textwidth}
\centering
\includegraphics[scale=0.15]{example-image-a}\newline A)
\end{minipage}
\begin{minipage}{0.2\textwidth}
\centering
\includegraphics[scale=0.15]{example-image-a}\newline B)
\end{minipage}
\begin{minipage}{0.2\textwidth}
\centering
\includegraphics[scale=0.15]{example-image-a}\newline C)
\end{minipage}
\begin{minipage}{0.2\textwidth} \centering
\includegraphics[scale=0.15]{example-image-a}\newline D) 
\end{minipage}
\begin{minipage}{0.2\textwidth}
\centering
\includegraphics[scale=0.15]{example-image-a}\newline E) \keych[E]
\end{minipage}
\item Fifth type of questions, a problem with numerical response \keych[\$3]

\end{enumerate}
\end{mchoice}

\section{Answer key}
\begin{multicols}{2}
\setlength{\columnsep}{0pt} 
\keytest{PAA 1985 (form A)}{paa-1985-a}[5]
\keytest{PAA 1985 (form B)}{paa-1985-b}[5]
\end{multicols}
\end{document} 

Some screen Model Test Continue

  • Interesting question – Moriambar Apr 9 '17 at 16:28
  • 3
    Every \label will create a (csname-)command, so too much \label's can overflow the string pool but imho 4000 shouldn't be a problem. See e.g. tex.stackexchange.com/questions/316999/… – Ulrike Fischer Apr 9 '17 at 16:41
  • I see, I've read about the increase in hash size in the book "The Latex Companion". I think I do not really need to use the label ref system for what I want, could it be done using a kind of array like in the solution you put in the question tex.stackexchange.com/a/215628/7832 ? – Pablo González L Apr 9 '17 at 16:55
  • @ChristianHupfer: I think 65536, i.e. 2^16 labels should be safe ... That number is the one that interested me .... – Pablo González L Apr 9 '17 at 16:57
  • @PabloGonzálezL: Forget my comment – user31729 Apr 9 '17 at 17:04
4

Look at the end of the .log file, where it says "Here is how much of TeX's memory you used:..."

4,000 labels should be no problem at all with a reasonably modern TeX implementation, unless you use insanely long labels. In fact 40,000 labels in a document would probably work fine. (FWIW, I vaguely remember running out of memory at about 60,000 once, a few years ago).

There is usually some way to increase the memory allocation if you need to. The way to do that depends on what version of TeX you have installed, so you need to read the documentation.

  • Many thanks for the clarification, I use TexLive 2016, in a machine with fedora 25 (x64) ... should not be a problem according to your answer. I assume that the more \label, the compilation process will take longer ... I will try to save the keys in an array to skip the problem and not abuse the label. – Pablo González L Apr 9 '17 at 17:55
  • @PabloGonzálezL tex does not have arrays. – David Carlisle Apr 9 '17 at 18:11
1

the number of labels is probably not an issue these days but as you do not need forward references there is no need to write all that data to a file to be read back, you can just save the data in commands without writing to the aux file.

% file mchoice.tex
% arara: latex: {draft: yes}
% arara: latex
% arara: dvips
% arara: ps2pdf
% arara: clean: { files:[mchoice.aux, mchoice.log, mchoice.out,mchoice.dvi,mchoice.ps] }
\documentclass{article}
\usepackage{enumitem}
\usepackage{multicol}
\usepackage{pgffor}
\usepackage[colorlinks]{hyperref}
\usepackage{refcount}
\usepackage{tcolorbox}
\tcbuselibrary{many}

% Set key for multicols in enumitem
\SetEnumitemKey{columns}{before=\begin{multicols}{#1},after=\end{multicols}}%

% Custom label for save choice key
\makeatletter
\newcommand{\customlabel}[2]{%
   \expandafter\xdef\csname#1\endcsname{#2}%
   \hypertarget{#1}{}%
}
\makeatother

% Create a environment mchoice, scope enumerate and \keych
\NewDocumentEnvironment{mchoice}{m}{%
\label{#1}
% values for multicols 
\setlength{\multicolsep}{5.0pt plus 2.0pt minus 1.5pt}
% values for enumitem
\setenumerate{parsep=3.5pt,partopsep=3.5pt,topsep=3.5pt,labelsep=5pt, leftmargin=*, itemsep=0pt,widest=80}%
\setenumerate[1]{labelsep=5pt,itemsep=1pt,label=\arabic*.}
\setenumerate[2]{leftmargin=16pt,nosep,itemsep=0pt,label=\Alph*)}
% Command to save key choice
\NewDocumentCommand\keych{o}{%
\IfNoValueTF{##1}%
    {\customlabel{#1:\arabic{enumi}}{\Alph{enumii}}}%
    {\customlabel{#1:\arabic{enumi}}{\string##1}}}% close \keych
}%
{%
\customlabel{max:#1}{\arabic{enumi}}%
}% close mchoice

% Create a command to all key for test
% #1 : pass to tcolorbox
% #2 : name
% #3 : ref
% #4 : columns
\newcounter{last}
\DeclareTotalTColorBox{\keytest}{ O{} m m O{4}}
{ size=small,top=-1mm, left=0mm,width=\columnwidth,%
  adjusted title=center,halign title=center,title filled,fontupper=\small,%
  fonttitle=\small\sffamily,adjusted title={#2},center title,#1}
  {% 
  \begin{enumerate}[columns=#4,leftmargin=15pt,labelsep=3pt,font=\small,nosep,widest=25]%
  \small
  \setlength{\columnsep}{0pt}%
   \edef\tmp{\noexpand\foreach \noexpand\x in {1,...,\csname max:#3\endcsname}}%
   \tmp{%
    \item \hyperlink{#3:\x}{\csname#3:\x\endcsname}%
    }
  \end{enumerate}%
}%

\begin{document}
\section{National Prov}

\begin{mchoice}{paa-1985-a}
\begin{center}
\textbf{PAA 1985 (A)}
\end{center}
\begin{enumerate}
\item First type of questions
    \begin{enumerate}% 
        \item value 
        \item value 
        \item value
        \item correct \keych
        \item value 
    \end{enumerate}
\item Second type of questions
        \begin{enumerate}[leftmargin=3pc,label=\Roman*.]
            \item $2\alpha+2\delta=90^{\circ}$
            \item $\alpha=\delta$ 
            \item $\angle EDF=45^{\circ}$
        \end{enumerate}
\begin{enumerate}[columns=2]% 
        \item I only 
        \item II only \keych
        \item I and II only
        \item I and III only 
        \item I, II, and III
\end{enumerate}
\item Third type of questions
        \begin{enumerate}[leftmargin=3pc,label=(\arabic*)]
            \item $2\alpha+2\delta=90^{\circ}$
            \item $\angle EDF=45^{\circ}$
        \end{enumerate}
    \begin{enumerate}[columns=2]%  
        \item Altenativa A 
        \item Altenativa B \keych
        \item Altenativa C
        \item Altenativa D
        \item Altenativa E 
    \end{enumerate}
\item Fourth type of questions (these need manual tuning for alternatives, 
      usually carrying pictures or tables)
\begin{center}
\noindent
\hspace*{0.75cm}\includegraphics[scale=0.15]{example-image-b}
\end{center}

\begin{minipage}{0.2\textwidth}
\centering
\includegraphics[scale=0.15]{example-image-a}\newline A)
\end{minipage}
\begin{minipage}{0.2\textwidth}
\centering
\includegraphics[scale=0.15]{example-image-a}\newline B)
\end{minipage}
\begin{minipage}{0.2\textwidth}
\centering
\includegraphics[scale=0.15]{example-image-a}\newline C)
\end{minipage}
\begin{minipage}{0.2\textwidth}
\centering
\includegraphics[scale=0.15]{example-image-a}\newline D) \keych[D]
\end{minipage}
\begin{minipage}{0.2\textwidth}
\centering
\includegraphics[scale=0.15]{example-image-a}\newline E)
\end{minipage}
\item Fifth type of questions, a problem with numerical response \keych[\$2]

\end{enumerate}
\end{mchoice}


\begin{mchoice}{paa-1985-b}
\begin{center}
\textbf{PAA 1985 (B)}
\end{center}
\begin{enumerate}
\item First type of questions
    \begin{enumerate}% 
        \item value 
        \item correct \keych
        \item value 
        \item value
        \item value 
    \end{enumerate}
\item Second type of questions
        \begin{enumerate}[leftmargin=3pc,label=\Roman*.]
            \item $2\alpha+2\delta=90^{\circ}$
            \item $\alpha=\delta$ 
            \item $\angle EDF=45^{\circ}$
        \end{enumerate}
\begin{enumerate}[columns=2]% 
        \item I only 
        \item II only 
        \item I and II only
        \item I and III only \keych
        \item I, II, and III
\end{enumerate}
\item Third type of questions
        \begin{enumerate}[leftmargin=3pc,label=(\arabic*)]
            \item $2\alpha+2\delta=90^{\circ}$
            \item $\angle EDF=45^{\circ}$
        \end{enumerate}
    \begin{enumerate}[columns=2]%  
        \item Altenativa A 
        \item Altenativa B 
        \item Altenativa C
        \item Altenativa D \keych
        \item Altenativa E 
    \end{enumerate}
\item Fourth type of questions (these need manual tuning for alternatives, 
      usually carrying pictures or tables)
\begin{center}
\noindent
\hspace*{0.75cm}\includegraphics[scale=0.15]{example-image-b}
\end{center}

\begin{minipage}{0.2\textwidth}
\centering
\includegraphics[scale=0.15]{example-image-a}\newline A)
\end{minipage}
\begin{minipage}{0.2\textwidth}
\centering
\includegraphics[scale=0.15]{example-image-a}\newline B)
\end{minipage}
\begin{minipage}{0.2\textwidth}
\centering
\includegraphics[scale=0.15]{example-image-a}\newline C)
\end{minipage}
\begin{minipage}{0.2\textwidth} \centering
\includegraphics[scale=0.15]{example-image-a}\newline D) 
\end{minipage}
\begin{minipage}{0.2\textwidth}
\centering
\includegraphics[scale=0.15]{example-image-a}\newline E) \keych[E]
\end{minipage}
\item Fifth type of questions, a problem with numerical response \keych[\$3]

\end{enumerate}
\end{mchoice}

\section{Answer key}
\begin{multicols}{2}
\setlength{\columnsep}{0pt} 
\keytest{PAA 1985 (form A)}{paa-1985-a}[5]
\keytest{PAA 1985 (form B)}{paa-1985-b}[5]
\end{multicols}
\end{document} 
  • I'll leave this here for reference but this answer posted also to a followup question i saw after posting this. – David Carlisle Apr 9 '17 at 23:37

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.