如何在新命令和环境中控制条件语句

如何在新命令和环境中控制条件语句

我正在编写一个相当复杂的课程来排版一本基于的书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代币列表

相关内容