变量在环境之外持续存在

变量在环境之外持续存在

我正在使用该ifthen包进行一些条件格式设置。我正在将状态存储在一些中booleans,但似乎存在词汇范围问题。特别是,当在环境中设置布尔值时,该值不会在环境之外持续存在。

以下是一个例子:

\documentclass{article}
\usepackage{ifthen}  % or xifthen
\newboolean{bool}
\setboolean{bool}{true}

\begin{document}
Start: \ifthenelse{\boolean{bool}}{T}{F}

\begin{itemize}
\item{item} \ifthenelse{\boolean{bool}}{T}{F}
\setboolean{bool}{false}
\item{item 2} \ifthenelse{\boolean{bool}}{T}{F}
\end{itemize}

End: \ifthenelse{\boolean{bool}}{T}{F}  \textit{(should be false)}
\end{document}

输出结果为:

   开始:T
   * 项目 T
   * 项目 F
   结束:T(应为假)

如何才能保存环境内部布尔值集的值,以便外部可以访问它?

答案1

该包ifthen(以及xifthen)不允许全局设置布尔值。您可以定义全局布尔值,通过添加类似

\makeatletter
\def\newglobalboolean#1{%
  \expandafter\@ifdefinable\csname if#1\endcsname{%
    \expandafter\let\csname if#1\endcsname\iffalse
    \expandafter\def\csname #1true\endcsname{%
      \global\expandafter\let\csname if#1\endcsname\iftrue
    }%
    \expandafter\def\csname #1false\endcsname{%
      \global\expandafter\let\csname if#1\endcsname\iffalse
    }%
}}
\makeatother

之后\newglobalboolean{foo},使用\setboolean{foo}{true}或操作\setboolean{foo}{false}将全局设置布尔值。例如:

\documentclass{article}
\usepackage{ifthen}  % or xifthen

\makeatletter
\def\newglobalboolean#1{%
  \expandafter\@ifdefinable\csname if#1\endcsname{%
    \expandafter\let\csname if#1\endcsname\iffalse
    \expandafter\def\csname #1true\endcsname{%
      \global\expandafter\let\csname if#1\endcsname\iftrue
    }%
    \expandafter\def\csname #1false\endcsname{%
      \global\expandafter\let\csname if#1\endcsname\iffalse
    }%
}}
\makeatother

\newglobalboolean{bool}
\setboolean{bool}{true}

\begin{document}
Start: \ifthenelse{\boolean{bool}}{T}{F}

\begin{itemize}
\item{item} \ifthenelse{\boolean{bool}}{T}{F}
\setboolean{bool}{false}
\item{item 2} \ifthenelse{\boolean{bool}}{T}{F}
\end{itemize}

End: \ifthenelse{\boolean{bool}}{T}{F}  \textit{(should be false)}
\end{document}

在此处输入图片描述

但是,该包etoolbox提供了更多功能。使用以下命令可获得相同的输出:

\documentclass{article}
\usepackage{etoolbox}

\newbool{foo}
\setbool{foo}{true}

\begin{document}
Start: \ifbool{foo}{T}{F}

\begin{itemize}
\item{item} \ifbool{foo}{T}{F}
\global\setbool{foo}{false}
\item{item 2} \ifbool{foo}{T}{F}
\end{itemize}

End: \ifbool{foo}{T}{F}  \textit{(should be false)}
\end{document}

请注意,你不能说\newbool{bool}

答案2

请评论该包\usepackage{ifthen}并输入以下给出的代码:

\def\boolean#1{#1}
\def\newboolean#1{\expandafter\newif\csname if#1\expandafter\endcsname\csname  #1false\endcsname}
\def\setboolean#1#2{\expandafter\global\csname #1#2\endcsname}
\def\ifthenelse#1#2#3{\csname if#1\endcsname#2\else#3\fi}

查看输出。

相关内容