我如何修改枚举的环境以将每个项目放入一个小页面中?

我如何修改枚举的环境以将每个项目放入一个小页面中?

我正在用 R 编写一个小型考试生成包,它获取问题列表,随机化问题顺序和答案,并创建一个 .pdf。我遇到的一个问题是问题和答案可能会被分页符分隔开,这显然不是理想的。我找到了一种手动解决方法,即将每个问题封装\item在一个 中minipage,但手动解决方案在这里不起作用。

是否可以修改环境enumerate或创建一个自定义命令,将每个命令放在\item一个中minipage,以防止问题分散到各个页面?这样,我就可以将代码包含在生成考试的 RMarkdown 文档的序言中。

本质上我想要

\documentclass{article}

\begin{document}

\begin{enumerate}
\item
  Which bear is best?

  A. Honey bear\\
  B. Grizzly bear\\
  C. Black bear\\
  D. Teddy bear\\
  E. Polar bear\\
\item
  How much snow per year is the preferable amount?

  A. 90 inches\\
  B. 120+ inches\\
  C. 30 inches\\
  D. 60 inches\\
\end{enumerate}
\end{document}

成为

\documentclass{article}

\begin{document}

\begin{enumerate}
\begin{minipage}{\linewidth}
\item
  Which bear is best?

  A. Honey bear\\
  B. Grizzly bear\\
  C. Black bear\\
  D. Teddy bear\\
  E. Polar bear\\
\end{minipage}
\begin{minipage}{\linewidth}
\item
  How much snow per year is the preferable amount?

  A. 90 inches\\
  B. 120+ inches\\
  C. 30 inches\\
  D. 60 inches\\
\end{minipage}
\end{enumerate}
\end{document}

在序言中添加一些内容。

答案1

这是一个基于 LuaLaTeX 的解决方案。它设置了一个名为 的 Lua 函数,add_minipage_wrappers充当某种预处理器:它扫描所有输入行,在遇到\begin{enumerate}指令时进入高速运转状态,将\item组封装在minipage环境中,并在遇到指令后恢复到近乎休眠的状态\end{enumerate}。Lua 函数不对包含在或列出环境\item中的指令进行操作。itemizedescription

唯一的输入要求如下:

  1. 指令\begin{enumerate}\end{enumerate}出现在行首
  2. 没有行同时包含\begin{enumerate}\item指令
  3. \item一行只能有一条指令
  4. enumerate环境不嵌套。

我相信这些输入要求不会太繁重。

如果 Lua 函数处于活动状态,则输出如下所示。要停用该函数,只需注释掉(或删除)以下行

\AtBeginDocument{\directlua{luatexbase.add_to_callback (
   "process_input_buffer" , add_minipage_wrappers , "addminipagewrappers" )}}

在此处输入图片描述

% !TEX TS-program = lualatex
\documentclass{article}
\pagestyle{empty}
\usepackage[margin=5mm,textheight=0.5cm,paperheight=4.5cm]{geometry}

\usepackage{luacode} %% for 'luacode*' environment
\begin{luacode*}
local in_enumerate = false -- define a couple of flags (Boolean variables)
local in_item = false
function add_minipage_wrappers ( s )
  if s:find ( "^\\begin{enumerate}" ) then
     in_enumerate = true -- switch 'in_enumerate' to "true"
  elseif s:find ( "^\\end{enumerate}" ) then
     s = s:gsub ( "\\end{enumerate}" , "\\end{minipage} \\end{enumerate}" )
     in_enumerate = false
     in_item = false
  elseif s:find ( "\\item" ) then
     if in_enumerate == true then  -- do nothing unless in an 'enumerate' env.
        if in_item == false then   -- first instance of '\item' in the list
           s = s:gsub ( "\\item" , "\\begin{minipage}{\\linewidth} \\item" )
           in_item = true          -- switch 'in_item' to "true"
        else                       -- 2nd or later instance of '\item' 
           s = s:gsub ( "\\item" , "\\end{minipage} \\begin{minipage}{\\linewidth} \\item" )
        end
     end  
  end
  return ( s )
end
\end{luacode*}
%% Assign the Lua function to LuaTeX's 'process_input_buffer' callback:
\AtBeginDocument{\directlua{luatexbase.add_to_callback (
   "process_input_buffer" , add_minipage_wrappers , "addminipagewrappers" )}}

\begin{document}
\begin{enumerate}
\item
  Which bear is best?

  A. Honey bear\\
  B. Grizzly bear\\
  C. Black bear\\
  D. Teddy bear\\
  E. Polar bear
\item
  How much snow per year is the preferable amount?

  A. 90 inches\\
  B. 120+ inches\\
  C. 30 inches\\
  D. 60 inches
\end{enumerate}
\end{document}

答案2

您可以捕获\items 并使用提供的方法对其进行处理宏捕获直到行尾作为参数

在此处输入图片描述

\documentclass{article}

%\usepackage{xparse}% If LaTeX < 2020-10

\ExplSyntaxOn
\NewDocumentEnvironment{myenumerate}{ O{} +b }
 {
  % do the setup
  \keys_set:nn { haff/enumerate } { #1 }
  % split the contents at \item
  \seq_set_split:Nnn \l_haff_enumerate_input_seq { \item } { #2 }
  % remove the first (empty) item
  \seq_pop_left:NN \l_haff_enumerate_input_seq \l_tmpa_tl
  % issue the preamble
  \tl_use:N \l_haff_enumerate_pre_tl
  % adorn the items
  \seq_set_map:NNn
    \l_haff_enumerate_output_seq
    \l_haff_enumerate_input_seq
    { \exp_not:n { \__haff_enumerate_do:n { ##1 } } }
  % output the items, separated by the chosen separator
  \seq_use:NV \l_haff_enumerate_output_seq \l_haff_enumerate_sep_tl
  % issue the postamble
  \tl_use:N \l_haff_enumerate_post_tl
 }
 {}

\seq_new:N \l_haff_enumerate_input_seq
\seq_new:N \l_haff_enumerate_output_seq
\cs_generate_variant:Nn \seq_use:Nn { NV }

\keys_define:nn { haff/enumerate }
 {
  pre    .tl_set:N  = \l_haff_enumerate_pre_tl,
  post   .tl_set:N  = \l_haff_enumerate_post_tl,
  sep    .tl_set:N  = \l_haff_enumerate_sep_tl,
  action .code:n    = \cs_set_eq:NN \__haff_enumerate_do:n #1,
  action .initial:n = \use:n,
 }
\ExplSyntaxOff

\NewDocumentCommand{\minipageitem}{+m}{%
  \par\noindent
  \begin{minipage}{\linewidth}
    \setcounter{option}{0}%
    \item #1
  \end{minipage}
}
\NewDocumentEnvironment{minipageenumerate}{O{}}{%
  \begin{myenumerate}[
    action=\minipageitem,
    pre=\begin{enumerate},
    post=\end{enumerate}
  ]
}{%
  \end{myenumerate}
}

\newcounter{option}
\renewcommand{\theoption}{\Alph{option}}
\newcommand{\option}{%
  \par\noindent
  \refstepcounter{option}%
  \theoption.~\ignorespaces
}

\begin{document}

\begin{minipageenumerate}
  \item
    Which bear is best?

    \option Honey bear
    \option Grizzly bear
    \option Black bear
    \option Teddy bear
    \option Polar bear
    
  \item
    How much snow per year is the preferable amount?

    \option 90 inches
    \option 120+ inches
    \option 30 inches
    \option 60 inches
\end{minipageenumerate}

\end{document}

答案3

enumerate您可以使用包重新定义现有环境tasks。后者已将其项目放入框中,因此结果应该符合您的需求。

可能的主要缺点:enumerate不再可嵌套……

\documentclass{article}
\pagestyle{empty}
\usepackage[margin=5mm,paperheight=5cm]{geometry}

\usepackage{tasks}
\RenewTasksEnvironment[label=\arabic*.]{enumerate}[\item]

\begin{document}

\begin{enumerate}
\item
  Which bear is best?

  A. Honey bear\\
  B. Grizzly bear\\
  C. Black bear\\
  D. Teddy bear\\
  E. Polar bear
\item
  How much snow per year is the preferable amount?

  A. 90 inches\\
  B. 120+ inches\\
  C. 30 inches\\
  D. 60 inches
\end{enumerate}

\end{document}

在此处输入图片描述

答案4

你可以做类似的事情

\newcommand{\question}[1]{
  \begin{minipage}{\linewidth}
  \item
    {#1}
  \end{minipage}
}

完整的代码如下

\documentclass{article}

\begin{document}

\newcommand{\question}[1]{
  \begin{minipage}{\linewidth}
  \item
    {#1}
  \end{minipage}
}

\begin{enumerate}
  \question{Which bear is best?\\A. Honey bear\\B. Teddy bear\\C. Black bear\\D. Grizzly bear\\E. Polar bear\\}
\end{enumerate}

\end{document}

相关内容