At time of writing the other TeX based answers on this page are flawed in that they hide a conditional \ifx
inside a macro but still use \else
/\fi
at the "top" level. This will mean that things break unexpectedly when used inside other conditionals.
The LaTeX3 programming language expl3 contains a module for doing stuff with token registers:
\usepackage{expl3}
...
\ExplSyntaxOn
\toks_if_empty:NTF \mytoks {true} {false}
\ExplSyntaxOff
It essentially does internally what the other answers here are suggesting, but it uses expansion to grab its arguments so the branching is robust (and you don't have \fi
lying around to get in your way).
Update:
So what does this approach do that is superior to other methods? Consider the style of solution first offered in answer to this question:
\def\IfEmpty#1{%
\edef\1{\the#1}
\ifx\1\empty
}
...
\IfEmpty\foo T\else F\fi
This doesn't behave nicely when nested, because TeX scans ahead when discarding unfollowed branches of a conditional. Consider
\ifx\bar\baz
\IfEmpty\foo T\else F\fi % <- uh oh
\else
E
\fi
If \bar
= \baz
, then the second branch is discarded and the first branch is executed. So far so good. If \bar
≠ \baz
, then the first branch is discarded by reading ahead until the first unmatched \else
— and this is the one in the line labelled "uh oh" above. So you could collapse the expansion of the above snippet in this case to:
\iffalse\else F\fi % <- uh oh
\else
E
\fi
and hence the cause of the ‘Extra \else
’ error message in this case.
So this form for conditionals doesn't work so well. Next try. You can also write this style of code like this:
\def\IfEmpty#1#2#3{%
\edef\1{\the#1}
\ifx\1\empty
#2%
\else
#3%
\fi
}
This avoids the problems of nesting as in the previous trial solution, but it's prone to another problem: #2
and #3
have trailing material behind them, namely \else
and \fi
. This is a problem if you want to write something like
\def\processfoo#1{...something with #1...}
\IfEmpty\foo{\error}{\processfoo} {arg}
because the #1
passed to \processfoo
will be \fi
instead of the desired {arg}
. The conditional in this case is better written as
\def\IfEmpty#1#2#3{%
\edef\1{\the#1}
\ifx\1\empty
\expandafter\@firstoftwo
\else
\expandafter\@secondoftwo
\fi
{#2}{#3}
}
so overcome this problem. This is how expl3 conditionals work, and it's why we're writing TF
at the end of all their names to indicate "true" and "false" branches. (Or just T
or just F
if you only want one of them.)
Incidentally, there are expandable tests for checking for emptiness, which is why I suggest using the expl3 approach for this test. Expandability is not always required, of course, but code that is fully expandable tends to be more reliable and it's always nice to have for cases such as
\typeout{ \toks_if_empty:NT \foo {Warning:~\string\foo\space is~ empty} }
Use the xstring
package:
\documentclass{article}
\usepackage{xstring,xifthen}
\begin{document}
\def\mystring{XYZ}
\StrLen{\mystring}[\mystringlen]
\def\mythresh{1}
\ifthenelse{\mystringlen > \mythresh}{TRUE}{FALSE}
\def\mythresh{3}
\ifthenelse{\mystringlen > \mythresh}{TRUE}{FALSE}
\end{document}
\StrLen{<stuff>}[<name>]
stores the length of <stuff>
in the control sequence <name>
.
The use of xifthen
is not really necessary. See How to form “if … or … then” conditionals in TeX? and the related Why is the ifthen
package obsolete? for alternatives.
stringstrings
provides similar functionality:
\documentclass{article}
\usepackage{stringstrings}
\begin{document}
\def\mystring{XYZ}
\stringlength[q]{\mystring}% Result is stored in \theresult
\def\mythresh{1}
\ifnum\theresult>\mythresh TRUE \else FALSE\fi
\def\mythresh{3}
\ifnum\theresult>\mythresh TRUE \else FALSE\fi
\end{document}
Best Answer
The
xtring
package provides such command: