我想创建同一份练习表的多个版本(教师、学生、解决方案、提示……)。因此,我尝试使用“versions”包。
由于我必须每周执行两次,所以我想尽量减少每次所需的工作量,因此我将要打印的所有内容放在“\shortcut”命令中,并在不同版本的设置中多次调用该命令。
这是我期望的工作:
\documentclass{article}
\usepackage{versions}
\newenvironment{envA}{}{}
\newenvironment{envB}{}{}
\newcommand{\shortcut}{
\begin{envA}TEXT\end{envA}
\begin{envB}OTHER TEXT\end{envB}
}
\begin{document}
\excludeversion{envB}
\shortcut
\includeversion{envB}
\excludeversion{envA}
\shortcut
\end{document}
非常令人沮丧的是,如果我直接在我想要出现的位置输入内容,它就会起作用并产生预期的结果:
\documentclass{article}
\usepackage{versions}
\newenvironment{envA}{}{}
\newenvironment{envB}{}{}
\begin{document}
\excludeversion{envB}
\begin{envA}TEXT\end{envA}
\begin{envB}OTHER TEXT\end{envB}
\excludeversion{envA}
\includeversion{envB}
\begin{envA}TEXT\end{envA}
\begin{envB}OTHER TEXT\end{envB}
\end{document}
有人可以帮忙吗?
答案1
我不知道您的设置为何失败,而且我也不太想调查原因。因此我设置了一个小的替代方案。它不使用环境,而是一个带有两个参数(\useV
)的宏,第一个参数是版本,第二个参数是如果包含该版本则应出现的文本。版本包括\includeV
并用排除\excludeV
。\includeV
和都\excludeV
接受应包括或排除的版本逗号分隔列表。版本名称可以包含除标记{
、}
和之外的任何内容#
。
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\tl_new:N \l_juliafatou_included_tl
\tl_set:Nn \l_juliafatou_included_tl { _ }
\NewDocumentCommand \includeV { m }
{
\clist_map_inline:nn { #1 }
{
\tl_if_in:NnF \l_juliafatou_included_tl { _##1_ }
{ \tl_put_right:Nn \l_juliafatou_included_tl { ##1_ } }
}
}
\NewDocumentCommand \excludeV { m }
{
\clist_map_inline:nn { #1 }
{
\tl_if_in:NnT \l_juliafatou_included_tl { _##1_ }
{ \tl_replace_once:Nnn \l_juliafatou_included_tl { _##1_ } { _ } }
}
}
\NewDocumentCommand \useV { m }
{
\tl_if_in:NnT \l_juliafatou_included_tl { _#1_ }
}
\ExplSyntaxOff
\newcommand*\shortcut
{%
\useV{A}{Text}%
\useV{B}{Other text}%
\useV{C}{Third text}%
}
\begin{document}
\includeV{A}
\excludeV{B,C}
\shortcut
\includeV{B,C}
\excludeV{A}
\shortcut
\end{document}
输出: