检查当前项是否是枚举列表中的最后一项

检查当前项是否是枚举列表中的最后一项

我有一个个性化的考试课程,我需要在我的自定义枚举列表(问题)结束之前做一些不同的事情。

每个问题之后我都会添加一个新的空白页,并在顶部写一些文字(例如“(问题 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

通过使用一些布尔标志和检查,我们可以实现您的要求:

  1. 每道题后,添加一个新的空白页,并在顶部添加一些文字(例如(问题 X,继续)
  2. 然后在新的一页上开始下一个问题。
  3. 根据预期的行为创建两种不同类型的\items,例如,对于某个问题,我们不想添加任何额外的页面。

\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。如果发现设置了此参数,则不会生成额外的页面。

相关内容