重复并列举文档的一部分

重复并列举文档的一部分

我有 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}重复该操作;宏对所有组中的所有人重复该操作。arggrp\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 表中,您可以简单地更改学生人数。由于多列环境,奇数学生人数会出现问题。

相关内容