我正在使用该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}
查看输出。