我们和一群老师朋友正在编纂我国自 1980 年以来实施的国内和国际考试。这些考试都是“多项选择题”考试,大多数考试已经使用该enumerate
软件包或enumitem
软件包编写完成。总共 50 份考试,每份有 60 或 80 个问题。
为了能够保存每个问题的密钥,而无需对文件进行任何修改,我创建了一个环境和两个mchoice
命令\keych
,并\keytest
使用、、、和包来\label...\ref
保存每个问题的密钥。xparse
pgffor
refcount
enumitem
hyperref
tcolorbox
由于我经常使用\label
(大约 4000 次),我想知道 TeX(latex 或 pdflatex)是否可以处理它,也就是说,它不会给我内存错误。
我尝试搜索“perl hash 样式”来保存每个问题的键(没有标签引用),类似于我在https://tex.stackexchange.com/a/215628/7832(在列表中保存值)但我没有让它工作。
提前感谢
% 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}
答案1
查看文件末尾.log
,其中显示“这是您使用的 TeX 内存量:...”
对于相当现代的 TeX 实现来说,4,000 个标签应该完全没有问题,除非您使用非常长的标签。事实上,文档中有 40,000 个标签可能就没问题了。(FWIW,我依稀记得几年前有一次在大约 60,000 个标签时内存耗尽)。
通常,如果需要,可以通过某种方式增加内存分配。具体方法取决于您安装的 TeX 版本,因此您需要阅读文档。
答案2
标签的数量现在可能不是问题,但由于您不需要前向引用,因此无需将所有数据写入文件以供读回,您只需将数据保存在命令中而无需写入辅助文件。
% 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}