测试“如果未定义”布尔值

测试“如果未定义”布尔值

我如何测试未定义的布尔值?

我希望有

\usepackage{xr-hyper}
\usepackage{hyperref}

\providebool{is_single_book}
\booltrue{is_single_book}

在我的main.tex和每个章节的 TeX 文件中。

if not defined is_single_book
  \externaldocument{volume1}[http://mybook.com/volume1.pdf]
fi

所以当我编译整本书的时候,\externaldocument{volume1}[http://mybook.com/volume1.pdf]并没有执行。

如果其他东西更简单或者不需要额外的包,它就不必是布尔值。

答案1

虽然您可以通过使用来检查布尔值是否被定义\ifcsundef{if...}(参见 moewe 的评论),但看起来您实际上想要一个布尔值,如果您在章节 tex 文件中,则它始终为 false。

这可以通过使用来实现\providebool,它将 bool 定义为 false,当且仅当尚未定义:

使用

\newbool{is_single_book}
\booltrue{is_single_book}

在你的主文件中

\providebool{is_single_book}
\ifbool{is_single_book}{}{%
  \externaldocument{volume1}[http://mybook.com/volume1.pdf]%
}

在您的章节文件中。

更好的方法是使用切换按钮。它们几乎相同,但可以避免名称冲突并提供略微更好的性能:

要使用它们,插入

\newtoggle{is_single_book}
\toggletrue{is_single_book}

在你的主文件中

\providetoggle{is_single_book}
\iftoggle{is_single_book}{}{%
  \externaldocument{volume1}[http://mybook.com/volume1.pdf]%
}

在章节中。

答案2

\providebool\booltrue我感觉你正在使用etoolbox

etoolbox布尔值只是 TeX 的薄包装\newif

这意味着\newbool{<name>}定义\if<name>,因此您可以通过检查是否定义来检查布尔值是否\if<name>定义。

\documentclass[british]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{babel}
\usepackage{etoolbox}

\newcommand*{\ifboolundef}[1]{\ifcsundef{if#1}}

\newcommand*{\sabooleantest}[1]{%
  bool \ttfamily{#1} is
  \ifboolundef{#1}
    {undefined}
    {\ifbool{#1}
       {true}
       {false}}}

\begin{document}
\sabooleantest{flobbel}

\newbool{globbel}
\boolfalse{globbel}
\sabooleantest{globbel}

\newbool{hobbel}
\booltrue{hobbel}
\sabooleantest{hobbel}
\end{document}

boolflobbel未定义

boolglobbel为 false

boolhobbel为真

问题是你是否真的需要归结为三值逻辑的东西。二值布尔值还不够吗?

如果要避免布尔值未定义时出现问题,您可以只检查宏是否未定义或已定义。这也有两种状态,但与布尔值不同,如果未定义则不会出现错误。

\newcommand*{\mybool}{}
\ifundef{\mybool}
  {not defined}
  {defined}

您还可以定义“允许切换”,如果不存在则为 false

\documentclass[british]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{babel}
\usepackage{etoolbox}

\newcommand*{\permissivetoggletrue}[1]{\csletcs{sa@ptogl@#1}{@empty}}
\newcommand*{\permissivetogglefalse}[1]{\csundef{sa@ptogl@#1}}
\newcommand*{\ifpermissivetoggle}[1]{\ifcsdef{sa@ptogl@#1}}

\begin{document}
flobbel
\ifpermissivetoggle{flobbel}
  {true}
  {false}

\permissivetoggletrue{globbel}
globbel
\ifpermissivetoggle{globbel}
  {true}
  {false}
\end{document}

etoolbox如果你喜欢这些东西,也可以不做

\makeatletter
\newcommand*{\permissivetoggletrue}[1]{%
  \expandafter\let\csname sa@ptogl@#1\endcsname\@empty}
\newcommand*{\permissivetogglefalse}[1]{%
  \expandafter\let\csname sa@ptogl@#1\endcsname\@sa@undef}% this assumes \@sa@undef is undefined
\newcommand*{\ifpermissivetoggle}[1]{%
  \ifcsname sa@ptogl@#1\endcsname
    \expandafter\@firstoftwo
  \else
    \expandafter\@secondoftwo
  \fi}
\makeatother

答案3

如果其他东西更简单或者不需要额外的包,它不一定是布尔值。

我认为\ifdefined\def提供您正在寻找的内容。您不需要额外的包或任何定义。

在主文档中,写入

\def\isSingleBook{}

或者,或者,\newcommand{\isSingleBook}{}或者\providecommand{\isSingleBook}{}

然后你可以检查:

\ifdefined\isSingleBook
  %% you're in the book
\else
  %% you're not in the book
\fi

相关内容