我如何测试未定义的布尔值?
我希望有
\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}
bool
flobbel
未定义bool
globbel
为 falsebool
hobbel
为真
问题是你是否真的需要归结为三值逻辑的东西。二值布尔值还不够吗?
如果要避免布尔值未定义时出现问题,您可以只检查宏是否未定义或已定义。这也有两种状态,但与布尔值不同,如果未定义则不会出现错误。
\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