基于布尔的环境

基于布尔的环境

我知道这个问题与根据布尔值隐藏自定义环境内容

但我想避免使用该environ软件包,否则,在我看来,这将是最好的选择,并且很简单来实现我想要的。

我正在使用该xifthen包来轻松管理我的布尔值,我知道我可以使用 TeX 私有项,即,但是当我想在不使用和的\newif\if<name>情况下创建布尔值作为参数时,它会变得有点复杂,我不完全理解。\csnameexpandafter

我想要隐藏一些内容,基于布尔值,并在其他环境中改变它的格式。

我首先尝试过:

\newboolean{full}
% ...
% a little later
% ...
\newenvironment{full}{%
    \ifthenelse{\boolean{full}}{%
}{%
    }{}
}

这当然没有用,所以我尝试了:

\newboolean{full}
% ...
% a little later
% ...
\newenvironment{full}{%
    \ifthenelse{\boolean{full}}\begingroup
}{%
    \endgroup{}
}

希望这个方法有用,但出现了Incomplete \iffalse错误

然后我尝试了一种基于 TeX 的方法:

\newboolean{full}
% ...
% a little later
% ...
\def\full{\iffull\begingroup}
\def\endfull{\fi\endgroup}

导致同样的错误。有人能帮我一下吗?我在网上搜索了大约小时或者说没有任何进展。

我再次强调,我想避免使用其他软件包,我想在这里使用纯 TeX/LaTeX 命令。

谢谢。


编辑

我已经使用@MarcoDaniel 一段时间了,但决定尝试一下更多属于我自己的,使用更多的 LaTeX 而不是 TeX 代码。

使它稍微复杂一些,使其更通用,以便我可以让多个环境以类似的方式工作,DRY 编程等。

但这是不是工作,我想知道人们是否能看到我的错误。

现在使用的代码(完全可用):

\newenvironment{full}{%
    \ifthenelse{\boolean{full}}%
     {\let\full@i\relax\let\endfull@i\relax}%
    {\def\full@i{\setbox\z@\vbox\bgroup}%
      \def\endfull@i{\egroup}}%
    \full@i%
}{%
  \endfull@i%
}

我的代码(但失败了)去上班:

\newcommand{\BooleanHideEnvironment}[1]{%
    \newenvironment{#1}{%
        \ifthenelse{\boolean{#1}}{%
            \newenvironment{#1@body}{}{}
        }{%
            \newsavebox{#1@bin}
            \newenvironment{#1@body}{\savebox{#1@bin}\begingroup}{\endgroup}
        }
        \begin{#1@body}
    }{\end{#1@body}}
}

\BooleanHideEnvironment{full}
\BooleanHideEnvironment{brief}
\BooleanHideEnvironment{refs}

还有什么想法是我错的吗?

需要注意的是,所有布尔值都已定义,并且位于 *.cls 文件中,并且与 *.sty 文件一样,不需要\makeatletterand \makeatother

答案1

这里有一个建议:

\documentclass{scrartcl}
\usepackage{kantlipsum}
\usepackage{xifthen}
\newboolean{full}

\makeatletter
\newenvironment{full}{%
    \ifthenelse{\boolean{full}}%
     {\let\full@i\relax\let\endfull@i\relax}%
    {\def\full@i{\setbox\z@\vbox\bgroup}%
      \def\endfull@i{\egroup}}%
    \full@i%
}{%
  \endfull@i%
}
\makeatother
\begin{document}
\kant[1]
\begin{full}
\kant[2]
\end{full}

Follow text
\end{document}

怎么运行的:

在环境内部full将定义第二个环境full@i,该环境取决于布尔值full

如果布尔值 full 为true,则环境的内部定义full@i是。如果布尔值 false ,则完整的内容将保存在不会打印的relax框中。\z@

答案2

没有完全通用的方法来做到这一点。

本质上有三种方法。

  1. 更改 catcodes 使得和\不是{}特殊的,然后创建一个带有参数的宏,\end{full}该参数由有效的字符串分隔,但具有与内容中允许的内容和环境可能出现的位置相同的限制。

  2. 您可以创建一个由 分隔的参数,#1\end#2检查#2是否是full,如果是则停止,如果不是则递归调用自身,直到找到正确环境的结尾。这就是environ软件包提供的功能,或者tabularxalign类似的 AMS 环境也提供相同的功能。这也许最接近您想要的,但设置它的细节有点棘手,使用软件包中的现有版本似乎是个好主意。

  3. 或者您可以使用标准 latexlrbox环境来保存框的内容,然后在最后的代码中使用\ifthenelse或不使用框。这也许是最简单和最强大的方法,但您必须决定是否要使用 justlrbox在这种情况下只允许使用水平(LR)模式材料,因此不显示列表或方程式,或者如果您要lrbox一起使用minipage在这种情况下您必须决定框的宽度,您可以制作它\textwidth但您不能在列表环境或线宽减小的其他地方使用该环境。(也许\linewidth是更好的默认宽度)。此外,您还必须决定是否要简单地使用框,\usebox这很容易但不允许分页,或者您是否要取消对内容的装箱,这是一个更高级的主题,它允许分页但并不总是容易获得正确的间距。

相关内容