自动生成带有可变字段的页面

自动生成带有可变字段的页面

我需要制作几十张相同的页面,但每页上必须有不同的人名。想象一下考试,每页的内容都相同,但我想在页面其他地方的页眉上打印学生的名字。

从我的编程角度来看,一个线索是在文档开头创建一个名称列表/系列(或编程术语中的数组),然后在文本中进一步调用它,例如,\student[i]其中i是一个整数(即当前页码)。但我不知道如何实现它,因为这是我第一次接触这个主题。

我当前的文档如下所示:

\begin{document}
\newcounter{i} 
\setcounter{i}{1} 
\whiledo{\value{i} < 50}{ 

Lorem ipsum ...
% The place where I need to put a variable string
Lorem ipsum ...

\newpage
\addtocounter{i}{1} 
}

\end{document}

这会产生 49 个相同的页面,但是,我不知道如何在变量中创建一系列名称,然后在每页上打印一系列不同的名称。

答案1

您可以将名称存储在逗号分隔的列表中,然后使用 LaTeX 内核命令对其进行迭代\@for

因此名称存储为:

\def\names{Jon Mac, Yiannis Laz, Filip, Mary}

并实现迭代,如下图所示。

\documentclass{article}
\usepackage{lipsum}
\begin{document}
\makeatletter
\def\names{Jon Mac, Yiannis Laz, Filip, Mary}
\@for\next:=\names\do{%
  \textbf{\next}\par\lipsum[1]\pagebreak
}
\makeatother
\end{document}

看一下https://tex.stackexchange.com/a/15338/963关于如何操作此类列表(包括字母数字排序)的更详细的解释。

答案2

一种解决方案,允许您以相当自然的方式指定学生名单,以及考试文本

\begin{exam}
<text>
\end{exam}

扩展\thestudent为当前学生的姓名。

\documentclass{article}
\usepackage{xparse,environ}
\ExplSyntaxOn
\NewDocumentCommand{\studentlist}{ m }
  {
   \seq_set_split:Nnn \l_exam_student_list_seq { ; } { #1 }
  }
\seq_new:N \l_exam_student_list_seq
\NewEnviron{exam}
  {
   \seq_map_inline:Nn \l_exam_student_list_seq
     {
      \cs_set:Npn \thestudent { ##1 }
      \BODY\newpage
     }
  }
\ExplSyntaxOff

\begin{document}

\studentlist{
  Copperfield, David;
  Doe, John;
  Liddell, Alice
}

\begin{exam}

This is the exam for \thestudent

\begin{enumerate}
\item Compute $1+1$
\item Tell if the formula $1+1=10$ is true or false
\end{enumerate}

\end{exam}

\end{document}

这将生成三个文本副本,每个副本都有不同的名称。

答案3

您也可以考虑使用该datatool包。

首先创建一个逗号分隔的变量(.csv)文件,如下所示

Number,Name,Subject,Date
PH001,Rajesh,Physics,12.02.2012
PH002,Mahesh,Physics,12.02.2012
PH003,Ganesh,Physics,12.02.2012

将此文件命名为namelist-1.csv (例如)。然后您的.tex文件将

\documentclass[12pt]{article}
\usepackage{microtype}
\usepackage{datatool}
\DTLloaddb{names}{namelist-1.csv}
%==================================================================
\begin{document}
%
\DTLforeach{names}{
\no=Number,  \name=Name,  \sub=Subject, \date=Date}{%
%
This is the exam for \textbf{\name \, (\no)} in \sub \, held on \date.
%
\begin{enumerate}
\item Compute \(1+1\)
\item Tell if the formula $1+1=10$ is true or false
\end{enumerate}
%
\pagebreak
}
%
%
\end{document} 

这将生成 3 页输出,与数据库文件中的三个名称相对应namelist-1.csv。在这里,您可以毫不费力地提及他们的登记号码、主题和日期。

答案4

基本思想是定义一个宏,将变化的部分作为参数。下面是一个简单的例子。我需要了解更多信息才能想出更接近您真正需要的东西。TeX 和 LaTeX 中的宏有点高级,我建议在 TeXbook 中阅读它们。每个宏最多可以有 9 个参数,这应该会给您足够的灵活性。练习表之外的典型应用是连续字母。宏定义声明为\long可以跨越多个段落,否则将是非法的(以帮助 TeX 捕获失控的宏扩展)。

\documentclass{article}

\long\def\exercise#1{%
Lorem ipsum ...
#1
Lorem ipsum ..
\newpage
}


\begin{document}
\exercise{Jane}
\exercise{James}
\exercise{Jim}
\end{document}

与基于列表的解决方案相比,其优点在于没有特殊字符(如逗号)来分隔列表元素,而名称等中必须避免使用特殊字符。缺点是需要多输入一些内容,但可以通过为宏选择一个较短的名称来减少输入量。

相关内容