我有 4 组试题。我想从 1 到一定人数逐一列举。由于学生人数超过 4,我必须重复这些试题。如果我有 40 名学生,那么我会写 (其中 i 是重复次数)
for (i in 1 to 10)
{
Print(Group(4*i -3)))
Print(Group(4*i -2 ))
Print(Group(4*i -1))
Print(Group(4*i))
}
如何在 LaTeX 中做到这一点?最后,我可以重复(CTRL-C、CTRL-V)下面的代码 10 次,更改连续的数字。如果您能弄清楚如何在每一页上获得相同的视觉效果,即第一页中的项目被隔开,而我不想这样,我将不胜感激。
\documentclass[a4paper,11pt]{article}
\usepackage[cm]{fullpage}
\usepackage [utf8]{inputenc}
\usepackage{lscape}
\usepackage{multicol}
\pagestyle{empty}
\begin{document}
\begin{landscape}
\begin{multicols}{2}[\columnsep 1.5cm]
\begin{center}
\textsc{Group $4i-3$}
\end{center}
\begin{enumerate}
\item Task A
\item Task B
\item Task C
\item Task D
\end{enumerate}
\columnbreak
\begin{center}
\textsc{Group $4i-2$}
\end{center}
\begin{enumerate}
\item Task E
\item Task F
\item Task G
\item Task H
\end{enumerate}
\pagebreak
\begin{center}
\textsc{Group $4i-1$}
\end{center}
\begin{enumerate}
\item Task I
\item Task J
\item Task K
\item Task L
\end{enumerate}
\begin{center}
\textsc{Group $4*i$}
\end{center}
\begin{enumerate}
\item Task M
\item Task N
\item Task O
\item Task P
\end{enumerate}
\end{multicols}
\end{landscape}
\end{document}
答案1
您需要类似以下的内容,其中各个小组问题保存在名为的文件中\jobname1.tex
。
\documentclass{article}
\usepackage{forloop}
\usepackage{intcalc}
\begin{document}
\newcounter{stno}
\newcounter{groupno}
\forloop{stno}{1}{\value{stno} < 41}
{
\setcounter{groupno}{\intcalcMod{\arabic{stno}}{4}}
\stepcounter{groupno}
Student Number: \arabic{stno}, Set: \arabic{groupno}
\input {\jobname\arabic{groupno}.tex}
\clearpage
}
\end{document}
答案2
\forloop
可以使用同名包中的命令轻松地生成组,并进行组编号。
我相信任务 A...等等稍后必须用其他文本替换,但这对我来说是遥不可及的,因为我不知道这些任务可能是什么。
各个小组问题应该放在单独的文件中,并包含在循环中,或许可以随机化。
\documentclass[a4paper,11pt]{article}
\usepackage[cm]{fullpage}
\usepackage [utf8]{inputenc}
\usepackage{lscape}
\usepackage{multicol}
\usepackage{etoolbox}
\usepackage{calc}%
\usepackage{forloop}
\usepackage{enumerate}
\pagestyle{empty}
\newcounter{taskcounter}
\newcounter{tempcounter}
\newrobustcmd{\taskcommand}{%
\refstepcounter{taskcounter}%
Task \Alph{taskcounter}%
}%
\newrobustcmd{\PrintGroup}[1]{%
\begin{center}
\setcounter{tempcounter}{4*\number\value{#1}}
\addtocounter{tempcounter}{-\number\value{groupcounter}}
\textsc{Group \number\value{tempcounter}}
\end{center}
\begin{enumerate}
\item \taskcommand
\item \taskcommand
\item \taskcommand
\item \taskcommand
\end{enumerate}
\addtocounter{groupcounter}{-1}%
}%
\newcounter{myloopcounter}
\newcounter{groupcounter}
\newcounter{maxpersons}
\setcounter{maxpersons}{11}
\begin{document}
\begin{landscape}
\begin{multicols}{2}[\columnsep 1.5cm]
\forloop{myloopcounter}{1}{\number\value{myloopcounter} < \number\value{maxpersons}}{%
\setcounter{groupcounter}{3}%
\setcounter{taskcounter}{0}%
\PrintGroup{myloopcounter}
\PrintGroup{myloopcounter}
\PrintGroup{myloopcounter}
\PrintGroup{myloopcounter}
\columnbreak%
}%
\end{multicols}
\end{landscape}
\end{document}
答案3
这是另一种解决方案(更常见)。
\documentclass[a4paper,12pt]{article}
\usepackage[english]{babel}
\makeatletter
\tracingmacros=1
\newcount\@grp
\newcount\@g
\newcount\@pp
\def\GrpNum{\number\@g}
\def\PersNum{\number\@pp}
\def\@p@#1{\csname @persIn\romannumeral#1\endcsname}
\def\PersInGrp#1{\global\advance\@grp by 1%
\edef\@p@@{\csname @persIn\romannumeral\@grp\endcsname}
\expandafter\newcount\@p@@%
\expandafter\global\@p@@#1\relax
}
\def\GrpHas#1{\edef\@tmp@rg{\@p@{#1}}\number\@tmp@rg\relax}
\long\def\r@peatGrp#1{\ifnum\@grp>\@g\relax\global\advance\@g
by1\relax#1\r@peatGrp{#1}\fi}
\long\def\forAllG#1{\global\@g0\relax\r@peatGrp{#1}}
\long\def\r@peatPinG#1#2{\ifnum\@p@{#1}>\@pp\relax\global\advance\@pp
by1\relax#2\r@peatPinG{#1}{#2}\fi}
\long\def\forAllPinG#1#2{\global\@pp0\relax\global\@g#1\relax\r@peatPinG{#1}{#2}}
\long\def\forAll#1{\forAllG{\global\@pp0\relax\r@peatPinG{\GrpNum}{#1}}}
\makeatother
\begin{document}
\PersInGrp{2}\PersInGrp{3}\PersInGrp{4}\PersInGrp{5}
1: \GrpHas{1}; 2: \GrpHas{2}; 3: \GrpHas{3}; 4: \GrpHas{4}.
\forAllG{\GrpNum: hello, }
\forAllPinG{2}{\GrpNum: people --- \PersNum;}
\forAll{\textbf{Group: \GrpNum, Person: \PersNum}\par\input{b.tex}\par}
\end{document}
宏用人\PersInGrp{arg}
初始化下一组arg
;宏\GrpHas{arg}
显示组中有多少人arg
;宏对所有初始化的组\forAllG{arg}
重复该操作arg
;宏对组中的所有人\forAllPinG{grp}{arg}
重复该操作;宏对所有组中的所有人重复该操作。arg
grp
\forAll{arg}
arg
要访问组中的人数和组内人数,请使用宏PersNum
和\GrpNum
内部arg
。
答案4
这是使用 lualatex 的另一种解决方案:
\documentclass[a4paper,11pt]{article}
\usepackage{luacode}
\usepackage[cm]{fullpage}
\usepackage [utf8]{luainputenc}
\usepackage{lscape}
\usepackage{multicol}
\pagestyle{empty}
\usepackage{enumitem}
\begin{document}
\begin{luacode}
s = 9 -- Number of Students
task = {
"Content of task A.", --A
"Content of task B.", --B
"Content of task C.", --C
"Content of task D.", --D
"Content of task E.", --E
"Content of task F.", --F
"Content of task G.", --G
"Content of task H.", --H
"Content of task I.", --I
"Content of task J.", --J
"Content of task K.", --K
"Content of task L.", --L
"Content of task M.", --M
"Content of task N.", --N
"Content of task O.", --O
"Content of task P.", --P
}
function item(n,p)
if n == 1 then
tex.print('\\begin{multicols}{2}[\\columnsep 1.5cm]')
end
z = (math.floor(n/4)) % 4 + 1
tex.print('\\begin{center}')
tex.print('\\textsc{Group '.. z ..'}')
tex.print('\\end{center}')
tex.print('\\begin{enumerate}')
for i=n,n+3,1 do
t = (i-1) % 16 + 1
tex.print('\\item ' .. task[t])
end
tex.print('\\end{enumerate}')
if math.floor(n/4)+1 <= p-2 then
if (math.floor(n/4)+1) % 2 == 1 then
print('\\columnbreak')
else
tex.print('\\end{multicols}')
tex.print('\\pagebreak')
tex.print('\\begin{multicols}{2}[\\columnsep 1.5cm]')
end
elseif math.floor(n/4)+1 == p-1 and p % 2 == 1 then
tex.print('\\end{multicols}')
tex.print('\\pagebreak')
tex.print('\\begin{multicols}{2}[\\columnsep 1.5cm]')
elseif math.floor(n/4)+1 == p-1 and p % 2 < 1 then
tex.print('\\columnbreak')
elseif math.floor(n/4)+1 == p then
tex.print('\\end{multicols}')
end
end
function group(y)
for x=1,y*4,4 do
item(x,y)
end
end
tex.print('\\begin{landscape}')
group(s)
tex.print('\\end{landscape}')
\end{luacode}
\end{document}
任务保存在 lua 表中,您可以简单地更改学生人数。由于多列环境,奇数学生人数会出现问题。