我知道这个问题与根据布尔值隐藏自定义环境内容
但我想避免使用该environ
软件包,否则,在我看来,这将是最好的选择,并且很简单来实现我想要的。
我正在使用该xifthen
包来轻松管理我的布尔值,我知道我可以使用 TeX 私有项,即,但是当我想在不使用和的\newif\if<name>
情况下创建布尔值作为参数时,它会变得有点复杂,我不完全理解。\csname
expandafter
我想要隐藏一些内容,基于布尔值,并在其他环境中改变它的格式。
我首先尝试过:
\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 文件一样,不需要\makeatletter
and \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
没有完全通用的方法来做到这一点。
本质上有三种方法。
更改 catcodes 使得和
\
不是{}
特殊的,然后创建一个带有参数的宏,\end{full}
该参数由有效的字符串分隔,但具有与内容中允许的内容和环境可能出现的位置相同的限制。您可以创建一个由 分隔的参数,
#1\end#2
检查#2
是否是full
,如果是则停止,如果不是则递归调用自身,直到找到正确环境的结尾。这就是environ
软件包提供的功能,或者tabularx
和align
类似的 AMS 环境也提供相同的功能。这也许最接近您想要的,但设置它的细节有点棘手,使用软件包中的现有版本似乎是个好主意。或者您可以使用标准 latex
lrbox
环境来保存框的内容,然后在最后的代码中使用\ifthenelse
或不使用框。这也许是最简单和最强大的方法,但您必须决定是否要使用 justlrbox
在这种情况下只允许使用水平(LR
)模式材料,因此不显示列表或方程式,或者如果您要lrbox
一起使用minipage
在这种情况下您必须决定框的宽度,您可以制作它\textwidth
但您不能在列表环境或线宽减小的其他地方使用该环境。(也许\linewidth
是更好的默认宽度)。此外,您还必须决定是否要简单地使用框,\usebox
这很容易但不允许分页,或者您是否要取消对内容的装箱,这是一个更高级的主题,它允许分页但并不总是容易获得正确的间距。