这有点儿太老套了。我最终想创建一个可以自行重新排列的考试模板。但是,我想要很大的灵活性,而现有的随机考试包似乎不起作用。
我被困在一件我无法真正弄清楚的事情上。我想定义两个命令,\before
并\after
交换它们后面的所有内容的位置。所以,像这样:
Hi there!
\begin{switcher}
\before Blah blah
Paragraphs make things hard. \lipsum \foo
\begin{itemize}\item A\item B\item etc.\end{itemize}
\after This should hopefully come first.
As well as this!
\end{switcher}
This is normal!
应该给出与以下完全相同的结果:
Hi there!
This should hopefully come first.
As well as this!
Blah blah
Paragraphs make things hard. \lipsum \foo
\begin{itemize}\item A\item B\item etc.\end{itemize}
This is normal!
理想情况下,我希望能够灵活地重新排列列表之类的场景。但是,如果我知道如何做这个基本示例,我很确定我可以自己弄清楚。我只是不知道从哪里开始。
答案1
欢迎来到 TeX.SE!您可以使用包获取环境的内容(标记)environ
。然后,内容可用作宏的替换文本。通过调用您在宏扩展中使用分隔参数定义的\BODY
宏(此处称为)来解决难题。\@myswitch
\BODY
xparse
请注意,如果您愿意,也可以使用包中的命令来完成此操作expl3
。
\documentclass{article}
\usepackage{environ}
\usepackage{lipsum}
\makeatletter
% I only added the \par to match the output requested in the question.
\long\def\@myswitch#1\before#2\after#3\@nil{#1#3\par #2}
\NewEnviron{switcher}{%
\expandafter\@myswitch\BODY\@nil
}
\makeatother
\newcommand*\foo{Bleh!}
\begin{document}
Hi there!
\begin{switcher}
\before Blah blah
Paragraphs make things hard. \lipsum[1-2] \foo
\begin{itemize}\item A\item B\item etc.\end{itemize}
\after This should hopefully come first.
As well as this!
\end{switcher}
This is normal!
\end{document}
expl3
可处理任意数量部件的版本的路线图
如果您想处理任意数量的部分并对其进行随机排序,我的建议是使用expl3
和xparse
:
+b
使用带有参数说明符xparse
的命令来获取环境主体\NewDocumentEnvironment
;用于
\seq_set_split:Nnn
将所有部分(由您选择的通用分隔符分隔)存储到序列变量中;分隔符可以是标记列表,而不必是单个标记;用于
\seq_shuffle:N
随机打乱上一步中填充的序列;使用
\seq_use:Nn
(或类似的函数,如\seq_use:Nnnn
)将混洗部分输出至文档流。