expl3可处理任意数量部件的版本的路线图

expl3可处理任意数量部件的版本的路线图

这有点儿太老套了。我最终想创建一个可以自行重新排列的考试模板。但是,我想要很大的灵活性,而现有的随机考试包似乎不起作用。

我被困在一件我无法真正弄清楚的事情上。我想定义两个命令,\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可处理任意数量部件的版本的路线图

如果您想处理任意数量的部分并对其进行随机排序,我的建议是使用expl3xparse

  • +b使用带有参数说明符xparse的命令来获取环境主体\NewDocumentEnvironment

  • 用于\seq_set_split:Nnn将所有部分(由您选择的通用分隔符分隔)存储到序列变量中;分隔符可以是标记列表,而不必是单个标记;

  • 用于\seq_shuffle:N随机打乱上一步中填充的序列;

  • 使用\seq_use:Nn(或类似的函数,如\seq_use:Nnnn)将混洗部分输出至文档流。

相关内容