我有一个个性化的考试课程,我需要在我的自定义枚举列表(问题)结束之前做一些不同的事情。
每个问题之后我都会添加一个新的空白页,并在顶部写一些文字(例如“(问题 X,续)”,然后在新的页面上开始下一个问题 - 因此问题 1 在第一页,第 2 页除了顶部的一些文字外是空白的,问题 2 在第三页。但对于最后一个问题,我不想为下一个问题添加额外的页面(没有下一个问题)。
有没有办法做到这一点而不手动添加\newpage
?也就是说,我可以在自定义枚举列表中对此进行编码,这样如果我更改问题的顺序,我就不必继续更改信息?
我已经在使用该enumitem
包,但找不到选项来检查当前项目是否是最后一项(即使编译多次)。
我现在拥有的(简化):
\documentclass{article}
\begin{document}
Questions:
\begin{enumerate}
\item \label{qa} This is a question.
\newpage
(Question \ref{qa}, cont'd)
\newpage
\item \label{qb} Another question.
\newpage
(Question \ref{qb}, cont'd)
\newpage
\item \label{qc} Final question. Note that there is only one "newpage" after it.
\newpage
(Question \ref{qc}, cont'd)
\end{enumerate}
\end{document}
我正在尝试创建一个具有这种行为的环境,但我没有看到解决方案。
我也想过也许我可以改变第一的项目(使得\newpage
在定义项目之前它不会得到),因为检查计数器是否为零可能会更容易。
此外,作为奖励,是否可以\item
根据预期的行为创建两种不同类型的 s(例如,如果对于某个问题我不想添加任何额外的页面)?
答案1
如果需要的话,这是一种允许更多操作的方法。
我将整个环境的内容在 处拆分,删除序列中的第一个项目(因为它将是空白的),然后在项目之间\question
添加序列。\newpage\item
\documentclass{article}
\usepackage{environ,xparse}
\ExplSyntaxOn
\NewEnviron{questions}
{
\seq_set_split:NnV \l_malu_questions_seq { \question } \BODY
\seq_pop_left:NN \l_malu_questions_seq \l_tmpa_tl % remove the initial blank
\begin{enumerate}
\item \seq_use:Nn \l_malu_questions_seq { \newpage\item }
\end{enumerate}
}
\cs_generate_variant:Nn \seq_set_split:Nnn { NnV }
\seq_new:N \l_malu_questions_seq
\ExplSyntaxOff
\begin{document}
Questions:
\begin{questions}
\question \label{qa} This is a question.
\newpage
(Question \ref{qa}, cont'd)
\question \label{qb} Another question.
\newpage
(Question \ref{qb}, cont'd)
\question \label{qc} Final question. Note that there is only one "newpage" after it.
\newpage
(Question \ref{qc}, cont'd)
\end{questions}
\end{document}
答案2
您可以自动添加\newpage
之前\item
但延迟第一的 \newpage
使用狡猾的诡计:
\documentclass{article}
\newenvironment{questions}
{\let\olditem\item
% Delay \newpage by one \question (https://tex.stackexchange.com/a/89187/5764)
\def\itemnewpage{\def\itemnewpage{\newpage}}%
\def\question{\itemnewpage\olditem}%
\begin{enumerate}
\let\item\question}
{\end{enumerate}}
\begin{document}
Questions:
\begin{questions}
\question \label{qa} This is a question.
\newpage
(Question \ref{qa}, cont'd)
\question \label{qb} Another question.
\newpage
(Question \ref{qb}, cont'd)
\question \label{qc} Final question.
\newpage
(Question \ref{qc}, cont'd)
\end{questions}
\end{document}
我为您的环境和问题定义了一些语义语言。这样它们的含义就变得有意义了。
如果您的 s 结构\question
始终相同(问题,后跟空白页,然后是措辞Question X (cont'd)
和空白页),那么也可以自动执行该过程。
答案3
通过使用一些布尔标志和检查,我们可以实现您的要求:
- 每道题后,添加一个新的空白页,并在顶部添加一些文字(例如(问题 X,继续)。
- 然后在新的一页上开始下一个问题。
- 根据预期的行为创建两种不同类型的
\item
s,例如,对于某个问题,我们不想添加任何额外的页面。
\documentclass{article}
\usepackage{xparse}
% First, optional argument, put [n] for no extra page needed
% Second, question text
\NewDocumentCommand\qitem{O{}m}{\iftoggle{qstarted}%
% Already a non first question, needs a newpage
{\newpage}
% First question, set flag, does not need a newpage
{\toggletrue{qstarted}}
\item\label{ql\arabic{enumi}}#2
% Check if the user wanted an extra page for this question
\ifstrequal{#1}{n}
% Did not want an extra page
{\relax}
% Wanted an extra page
{\newpage
(Question \ref{ql\arabic{enumi}}, cont'd)}}
\usepackage{etoolbox}
\newtoggle{qstarted}
\togglefalse{qstarted}
\begin{document}
Questions:
\begin{enumerate}
\qitem{This is a question.}
\qitem{Another question.}
\qitem[n]{This question will not have an extra page}
\qitem{Final question. Note that there is only one "newpage" after
it.}
\end{enumerate}
\end{document}
输出
该代码完全实现了您的要求。
怎么运行的?
标记qstarted
会跟踪我们是否已通过第一个问题。一旦开始第一个问题,此标记就会设置为 false。
[n]
我们为添加了可选参数\qitem
。如果发现设置了此参数,则不会生成额外的页面。