handyfloss

Because FLOSS is handy, isn’t it?

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

6 Responses to “LaTeX programming: how to implement conditionals”

  1. 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.

  2. 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.

  3. Jan K. said

    Thanks for the post. Appretiate it.

  4. 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.

  5. 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

  6. bangKai said

    watever!!!

Leave a Reply

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <pre> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>