Take the 2-minute tour ×
TeX - LaTeX Stack Exchange is a question and answer site for users of TeX, LaTeX, ConTeXt, and related typesetting systems. It's 100% free, no registration required.

Are there any commands containing "if", similar to \ifnum, preferably in LaTeX (rathar than TeX)? For example, is there anything like \ifstring? (I am not after \ifstring only, I want to know which options are available, if any).

share|improve this question
    
See also: LaTeX conditional expression –  Leo Liu Jul 13 '11 at 5:10

4 Answers 4

up vote 20 down vote accepted

The \if... commands are mostly TeX primitives (with \newif it's possible to define other conditionals).

There is something like \ifstring, but it uses \ifnum; the command \pdfstrcmp takes two strings as argument and compares it, returning -1 if the first precedes the second (in the lexicographic order based on ASCII codes), 0 if the strings are equal and 1 otherwise. The usual ways to exploit it are

\ifnum\pdfstrcmp{string1}{string2}=0
   <code if the strings are equal>
\else
   <code if the strings are different>
\fi

or

\ifcase\pdfstrcmp{string1}{string2}%
   <code if the strings are equal>
\or
   <code if string2 comes after string1>
\else
   <code if string1 comes before string2>
\fi

In XeTeX there's \strcmp that does the same; loading pdftexcmds one can use \pdf@strcmp with pdftex, xetex and luatex.

In the pseudocodes above "string1" and "string2" can be also macros, which will be expanded similarly to what happens with \edef and at the end (when no more expansions can be performed) the tokens are "detokenized" for the comparison (so \relax becomes a six character string followed by a space; for example \pdfstrcmp{\relax}{\string\relax\space} returns 0).

share|improve this answer
    
Thanks. egreg.. –  Regis da Silva Jul 13 '11 at 0:26
2  
@egreg: if I recall correctly, they don't have to expand to characters only: the result of their full expansion is converted to a string (I think, through the same code as \detokenize). –  Bruno Le Floch Jul 13 '11 at 0:43
1  
@Bruno: I'll correct my answer. –  egreg Jul 13 '11 at 7:21
    
Nitpick regarding the parenthetical remark in the first paragraph: \newif doesn't really make new conditionals. It merely provides a handy way to assign one of the existing conditionals \iffalse and \iftrue to a control sequence. –  Harald Hanche-Olsen Jul 13 '11 at 15:38
    
@Harald: it depends on the point of view. They are new for the programmer, they aren't for TeX, which sees only \iftrue or \iffalse. –  egreg Jul 13 '11 at 15:43

The etoolbox package has a lot conditional commands which goes beyond those TeX primitives. Have a look at the manual you will find they very usefull.

share|improve this answer
2  
In particular there is \ifstrequal{str1}{str2}{true}{false}, and many many others. The etoolbox is definitely a must for anyone trying to do any kind of “programatic” work in (La)TeX. –  Juan A. Navarro Jul 13 '11 at 8:03

An alternative is expl3. The basic language layer of LaTeX3 provides several conditionals. To handle strings you can use the function \str_if_eq:nnTF. Next to this conditional expl3 provides also a case function for strings named \prg_case_str:nnn.

\str_if_eq:nnTF has the following syntax:

\str_if_eq:nnTF { <test string 1> } { <test string 2> }
 { <True Code> }
 { <False Code> }

\prg_case_str:nnn has the following syntax:

\prg_case_str:nnn { <test string> }
 { 
   { string case 1 } { code case 1 }
   { string case 2 } { code case 2 }
   ...
   { string case n } { code case n }
 }
 { <else case> }

The complete manual

share|improve this answer

I have been using the xstring package for these kind of situations. See for example Using xstring to check .tex file name.

share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.