![如何在新命令和环境中控制条件语句](https://linux22.com/image/307741/%E5%A6%82%E4%BD%95%E5%9C%A8%E6%96%B0%E5%91%BD%E4%BB%A4%E5%92%8C%E7%8E%AF%E5%A2%83%E4%B8%AD%E6%8E%A7%E5%88%B6%E6%9D%A1%E4%BB%B6%E8%AF%AD%E5%8F%A5.png)
我正在编写一个相当复杂的课程来排版一本基于的书memoir
。
我的一个命令在前面的背面页面上绘制标题,在后面的正面和背面页面上绘制内容,然后需要在后面的正面页面上绘制内容。但是,后面的正面页面是由以 开头的环境创建的,\clearpage
因此其目录条目和页脚定义最终出现在正确的页面上。
该命令已经知道如何在背面使用
\strictpagecheck%
\checkoddpage\ifoddpage\hbox{}\newpage\fi
但我不知道如何添加以下内容。\clearpage.
我试图用条件语句来实现这一点,但它并没有按照我期望的方式工作。
我对 LaTeX(以及 TeX)宏的理解是,当我们定义一个newcommand
或一个时newenvironment
,LaTeX 在编译文档时会用宏的内容替换宏命令所在的位置。
因此从理论上来说,
\newcommand{foo}{\Huge}
\begin{document}
\foo test text
\end{document}
将被 LaTeX 解释为
\Huge test text
如果这是正确的,我应该能够添加条件开关,这些条件开关可以在使用该命令的任何地方切换,就好像它被直接解释一样。
条件是解决这个问题的错误方法吗,还是我使用了错误的方法?
下面是一个 MWE,展示了我使用条件来尝试在命令之后显示或隐藏页面上的黑框\complicated
,而不管是否以exampleenvironment
开头\clearpage
。
\documentclass{memoir}
\usepackage{tikz}
\newif\iftest
\testfalse
\newcommand{\drawbox}{%
\begin{tikz}[remember picture, overlay]
\node
[text width=1in,text height=1in,fill=black]
at (current page.center){};
\end{tikz}%
}
\newenvironment{exampleenvironment}{%
\clearpage%
\noindent\textsf{This is the test Environment}\par%
It needs to start with a clearpage, but has to accept the black box from the other environment.%
\iftest\drawbox\fi%
\testfalse%
\\\par%
}{%
\par\noindent\rule{\linewidth}{.4pt}%
}
\newcommand{\complicated}{%
\vfill%
\textbf{This command puts some content on the bottom of this page}%
\clearpage%
\textbf{And fills this page}%
\clearpage%
\textbf{And needs to draw a box on the next page}%
\clearpage%
\testtrue%
}
\begin{document}
\begin{exampleenvironment}
foo bar baz bat
\end{exampleenvironment}
\complicated
\begin{exampleenvironment}
This page should have a black box
\end{exampleenvironment}
% conditional "test" should now be false...
\begin{exampleenvironment}
This page should \emph{not} have a black box.
\end{exampleenvironment}
\end{document}
我的 MWE 输出了此文档,除了最后一页的黑框不应该存在之外,它是正确的。\testfalse
在 MWE 显示“% 条件“测试”现在应该为假...”的位置输入可以实现所需的行为,但我希望环境切换条件,而不是主 TeX 文件中的用户。
答案1
当你表演时\testtrue
,它确实
\let\iftest\iftrue
\testfalse
( )也是如此\let\iftest\iffalse
。由于它们都使用\let
,因此它们在本质上与宏定义/赋值非常相似。而且,宏定义是它们所在组的本地定义。因此,您的\testfalse
内部问题exampleenvironment
不会在 之后继续存在\end{exampleenvironment}
。
以下是您实施的简化版本:
\documentclass{article}
\newif\iftest
%\testfalse% default is false
\newenvironment{exampleenvironment}
{\testtrue}% \begin{exampleenvironment}
{}% \end{exampleenvironment}
\begin{document}
\verb|test| is \iftest true\else false\fi.
\begin{exampleenvironment}
Setting \verb|test| to true.
\end{exampleenvironment}
\verb|test| is \iftest true\else false\fi.
\end{document}
如果你希望此类定义在你的环境中存在,请考虑在其前面添加一个\global
定义,例如\global\testtrue
。当然,这会使全球的改变为条件,因此得以保留全部(嵌套)组。如果您希望它能够存活,则只有当前的组,您可以使用\aftergroup\testtrue
。请注意\aftergroup
只接受一个令牌。要将其扩展到多个令牌,请参阅\aftergroup
代币列表。