如何才能在特定模式下仅显示文本

如何才能在特定模式下仅显示文本

我正在写一本教科书,并选择在正文中输入练习。解决方案以 [解决方案] 模式输入。我想设置一些东西,以便我可以编译文本+练习或所有练习+解决方案。有没有办法只处理 a 之间的文本\startmode[solution]...\stopmode并忽略其余部分?

我希望能够编写练习列表(单独),或整本教科书(不带解决方案),或练习 + 解决方案列表。有没有办法做到这一点而不用\startnotmode[exercise, solution]...\stopnotmode到处添加?

我尝试定义一个before={\stopnotmode\startmode[exercise]}, after={\stopmode\startnotmode[exercise]},但没有成功(似乎在exercise模式下“after”被忽略了。这是一个 MWE

\defineenumeration[exercise][alternative=serried, ]
\enablemode[solution, exercise]

\starttext
\startchapter[title={Title not displayed in solutions}]
\dorecurse{3}{
    \startmode[solution] \subject{Solutions} \stopmode
    Text that is not displayed when 'solution' mode is enabled.
    \startexercise my exercise is always processed \stopexercise
    \startmode[solution] my solution \stopmode
}
\stopchapter
\stoptext

感谢 Wolfgang,我得到了类似下面的内容。

    \defineenumeration [exercise] [alternative=serried]
    \defineblock [solution]
    \defineblock [exercise]
    \defineblock [text]

    \enablemode [exercises]

    \startmode [solution]
        \hideblocks [text]
        \keepblocks [solution]
        \keepblocks [exercise]
    \stopmode

    \startmode [text]
        \keepblocks [text]
        \keepblocks [exercise]
        \hideblocks [solution]
    \stopmode

    \startmode [exercises]
        \hideblocks [text]
        \keepblocks [exercise]
        \hideblocks [solution]
    \stopmode

\starttext

\begintext
\startchapter [title={Title not displayed in solutions}]
\endtext
\beginsolution \chapter{Solutions} \endsolution
\startbuffer

    \begintext my supertext between exercises \endtext
    \beginexercise\startexercise my exercise  \stopexercise\endexercise
    \beginsolution my solution \endsolution
\stopbuffer

\dorecurse{3}{\getbuffer}

\begintext
\stopchapter
\endtext
\stoptext

这可行,但我需要更简单的语法,可以集成到我的定义中,因为最终产品将长约 300 到 400 页。感谢您的帮助。

答案1

您可以使用该block机制隐藏或显示文档中的某些文本块。为避免与其他环境块命令的名称冲突,其形式为\begin...\end...,默认配置是隐藏其内容。

在下面的例子中,我使用了您的solution模式来隐藏或显示我在文档开始处创建的两个块。

\defineenumeration [exercise] [alternative=serried]

\defineblock [solution]
\defineblock [exercise]

\enablemode [solution]

\startmode [solution]
    \keepblocks [solution]
    \hideblocks [exercise]
\stopmode

\startnotmode [solution]
    \keepblocks [exercise]
    \hideblocks [solution]
\stopnotmode

\starttext

\startchapter [title={Title not displayed in solutions}]

\startbuffer

    \beginsolution \subject{Solutions} \endsolution

    \beginexercise Text that is not displayed when 'solution' mode is enabled. \endexercise

    \startexercise my exercise is always processed \stopexercise

    \beginsolution my solution \endsolution

\stopbuffer

\dorecurse{3}{\getbuffer}

\stopchapter

\stoptext

启用该模式后,solution您可以从上面的示例中获得以下结果。

在此处输入图片描述

当您禁用该solution模式(可以通过注释该\enablemode行来完成)时,您将获得以下输出。

在此处输入图片描述

编辑

某些环境enumerations可以通过创建一个具有相同名称的命令来隐藏buffer,该命令会重新定义命令。然后环境的内容将被存储,但永远不会放回到文档中。

\defineenumeration [exercise] [alternative=serried]

\startnotmode [solution]
    \definebuffer [exercise]
\stopnotmode

\starttext

\subject{Solutions}

\startexercise my exercise is always processed \stopexercise

\stoptext

相关内容