LaTeX programming: how to implement conditionals
Posted by isilanes on August 29, 2007
Blog moved to: handyfloss.net
Entry available at: http://handyfloss.net/2007.08/latex-programming-how-to-implement-conditionals/
I have recently come across a problem while creating a LaTeX style (for making A0-size posters). Maybe it could be avoided or solved more elegantly, but I wanted to solve it with conditionals.
Basically, what I wanted to do was define a command (actually, an environment) that accepted one argument, and make it return different output, depending on the argument:
if (argument equals something) then
do something
else
do somethingelse
end if
It gave me some headaches to get it, but I also learned some interesting things on the way. There are at least two ways of playing with conditionals: defining boolean variables or directly using logical comparisons.
Defining logical valiables
We can define a logical variable logvar as follows:
\newif\iflogvar
By default, it is set to false. We can set it to true by:
\logvartrue
and back to false by:
\logvarfalse
The variable can be used in a conditional as follows:
\iflogvar
aaaa
\else
bbbb
\fi
You can think of the above code as a single object, the output value of which will be “aaaa” if logvar is true, and “bbbb” if false. Basically, the following code will, thus, output “Today is great“:
Today
\newif\ifismonday
\ismondayfalse
\ifismonday
sucks!
\else
is \textbf{great}
\fi
Direct logic comparison
The example I provide works for numbers, but check this page for more info. Recall that LaTeX works with integers (counters) and text strings. As far as I know, floating point operations are impossible in LaTeX (nothing is actually impossible in LaTeX, just veeery difficult).
For example, defining the following command in the preamble:
\newcommand{\isitthree}[1]
{
\ifnum#1=3
number #1 is 3
\else
number #1 is not 3
\fi
}
allows us to call it in the document, so the following outputs “We know that number 33 is not 3″:
We know that \isitthree{33}
Nesting
Obviously the conditionals can be nested (put one inside another), when more than one condition needs to be tested. For example:
Today
\newif\ifismonday
\newif\ifistuesday
\ismondayfalse
\istuesdaytrue
\ifismonday
sucks!
\else
\ifistuesday
almost sucks.
\else
is \textbf{great}
\fi
\fi
Sam said
An excellent post! Thanks for the information on doing conditionals – it’s a handy way to only hand in part of my draft thesis to my supervisor.
Jens Kristian Jensen said
Great. This is just what I needed for some documentation for our software base. We have a compile time configuration system which can spit out configuration variables in a different formats. I considered using the C preprocessor to modify the .tex files, but now I can just make an output module for the configuration system which spits out .tex files with the variables and do the inclusion/exclusion in text directly. Thanks.
Jan K. said
Thanks for the post. Appretiate it.
jb said
This is exactly what I needed to know to set up a template for student recommendation letters that can quickly switch between printing onto hardcopy letterhead and a fully PDF letter with letterhead and signature included.
christopherolah said
As you said, floating points are difficult to handle in LaTeX. Thankfully, there are packages that make it easy: fltpoint – The package provides simple floating point operations can be found a long with other packages useful for LaTeX programing in the CTAN calculating section
bangKai said
watever!!!
Tony said
This post has been bestowed the honor of being bookmarked.
Excellent and extremely useful information.
Soab said
Um,
you know the ifthen package, dont you?
isilanes said
Thanks, Soab, for your sarcastic yet useful comment.
Sruthi N.Paul said
Thanks Isilanes.
it helped me a lot in my programing.
imipak said
I would not personally recommend your method for complex tasks, although it IS certainly great for simpler conditionals. (First rule of programming: never use a more complex function than you need – you risk adding in side-effects and bugs). For the examples you give, and that kind of level of work, what you’re using is ideal.
For more complex tasks, you need something with a bit more oomph. However, the previous commenter was not only sarcastic in their reference to ifthen, but they were also rather foolish. Ifthen is considered obsolete, it doesn’t play well with other packages (exactly the kind of side-effects I was meaning), it’s not good with null arguments and it’s not maintained. xifthen is the package of choice if you need ifthen-like capabilities, although many robust if/then/else packages now exist.
If you’re wanting something with far more power still, the Lua scripting language is now available in some forms of LaTeX. (If you’re using TeXLive or a similar distro, you’ll have a LaTeX compiler that supports it.) I am not fond of Lua, but it does give you an enormous level of additional control over documents.
In other words, your choices are limited by how long you want to search.
msn hotmail said
We absolutely love your blog and find most of
your post’s to be exactly I’m looking for.
Do you offer guest writers to write content to suit your needs?
I wouldn’t mind publishing a post or elaborating on a number of the subjects you write related to here. Again, awesome web log!
www.seoorganics.net/ said
Pretty nice post. I just stumbled upon your blog and
wished to say that I have really enjoyed browsing your blog posts.
After all I’ll be subscribing to your feed and I hope you write again soon!