Loop variable built-ins only exists since FreeMarker 2.3.23.
These built-ins you can only use with the loop variable of the
        list and
        items directives (and of the deprecated
        foreach directive). Some explanation of that
        follows (loopVar?index
        returns the 0-based index in the listable value we iterate
        through):
<#-- Note: x is a loop variable -->
<#list ['a', 'b', 'c'] as x>
  ${x?index}
</#list>    0 1 2
When the list directive doesn't specify the
        loop variable, these built-ins are used with the loop variable of the
        items directive:
<#list ['a', 'b', 'c']>
  <ul>
   <#items as x>
     <li>${x?index}</li>
   </#items>
  </ul>
</#list>    Loop variable built-ins only use the name of loop variable, so that they can identify the related ongoing iteration. They don't read the value of the loop variable. Hence, this is a parsing error:
<#list ['a', 'b', 'c'] as x>
  <#assign y = x>
  ${y?index} <#-- ERROR: y isn't a loop variable -->
</#list>    counter
This built-in is available since FreeMarker 2.3.23.
Returns the 1-based index where the iteration (which is identified by the loop variable name) currently stands.
<#list ['a', 'b', 'c'] as i>
  ${i?counter}: ${i}
</#list>    1: a 2: b 3: c
For the 0-based index, use the index
            built-in.
has_next
This built-in is available since FreeMarker 2.3.23.
Tells if the item where the iteration (which is identified by the loop variable name) currently stands is not the last item.
<#list ['a', 'b', 'c'] as i>${i?has_next?c} </#list>    true true false
For separating items with commas and such, use
            <#sep>separator</#sep>
            instead of <#if
            var?has_next>separator</#if>,
            as it's more readable. (Furthermore the
            </#sep> can be often omitted, like in
            <#list ... as
            var>...${var}...<#sep>separator</#list>)
If you need the inverse of this built-in, use
            var?is_last instead
            of !var?has_next,
            because it's more readable.
index
This built-in is available since FreeMarker 2.3.23.
Returns the 0-based index where the iteration (which is identified by the loop variable name) currently stands.
<#list ['a', 'b', 'c'] as i>
  ${i?index}: ${i}
</#list>    0: a 1: b 2: c
For the 1-based index, use the counter
            built-in.
is_even_item
This built-in is available since FreeMarker 2.3.23.
Tells if the item where the iteration (which is identified by the loop variable name) currently stands has an even 1-based index.
<#list ['a', 'b', 'c', 'd'] as i>${i?is_even_item?c} </#list>    false true false true
To make tables with alternating row colors and such, use
            var?item_parity
            or var?item_cycle(...)
            instead.
is_first
This built-in is available since FreeMarker 2.3.23.
Tells if the item where the iteration (which is identified by the loop variable name) currently stands is the first item.
<#list ['a', 'b', 'c'] as i>${i?is_first?c} </#list>    true false false
is_last
This built-in is available since FreeMarker 2.3.23.
Tells if the item where the iteration (which is identified by the loop variable name) currently stands is the last item.
<#list ['a', 'b', 'c'] as i>${i?is_last?c} </#list>    false false true
If you need the inverse of this built-in, use
            var?has_next instead
            of !var?is_last,
            because it's more readable.
For separating items with commas and such, use
            <#sep>separator</#sep>
            instead of <#if
            var?has_next>separator</#if>,
            as it's more readable. (Furthermore the
            </#sep> can be often omitted, like in
            <#list ... as
            var>...${var}...<#sep>separator</#list>)
is_odd_item
This built-in is available since FreeMarker 2.3.23.
Tells if the item where the iteration (which is identified by the loop variable name) currently stands has an odd 1-based index.
<#list ['a', 'b', 'c', 'd'] as i>${i?is_odd_item?c} </#list>    true false true false
To make tables with alternating row colors and such, use
            var?item_parity
            or var?item_cycle(...)
            instead.
item_cycle
This built-in is available since FreeMarker 2.3.23.
This is a more generic version of the item_parity
          built-in, where you can specify what value to use instead of
          "odd" and "even". It also
          allows more than 2 values that it will cycle through.
<#list ['a', 'b', 'c', 'd', 'e', 'f', 'g'] as i>
  <tr class="${i?item_cycle('row1', 'row2', 'row3')}">${i}</tr>
</#list>    <tr class="row1">a</tr> <tr class="row2">b</tr> <tr class="row3">c</tr> <tr class="row1">d</tr> <tr class="row2">e</tr> <tr class="row3">f</tr> <tr class="row1">g</tr>
Some details:
- 
              
The number of arguments must be at least 1, and has no upper limit.
 - 
              
The type of the arguments can be anything, they doesn't have to be strings.
 
Use the item_parity
            built-in instead if the values you need are
            "odd" and "even".
item_parity
This built-in is available since FreeMarker 2.3.23.
Returns "odd" or "even"
          string value, depending on the parity of the 1-based index where the
          iteration (which is identified by the loop variable name) currently
          stands. This is commonly used for alternating color for table
          rows:
<#list ['a', 'b', 'c', 'd'] as i>
  <tr class="${i?item_parity}Row">${i}</tr>
</#list>    <tr class="oddRow">a</tr> <tr class="evenRow">b</tr> <tr class="oddRow">c</tr> <tr class="evenRow">d</tr>
Use the item_parity_cap
            built-in for capitalized "Odd" and
            "Even". Use the item_cycle
            built-in to specify custom values, or more then two
            values.
item_parity_cap
This built-in is available since FreeMarker 2.3.23.
Returns "Odd" or "Even"
          string value (note the capitalization), depending on the parity of
          the 1-based index where the iteration (which is identified by the
          loop variable name) currently stands.
<#list ['a', 'b', 'c', 'd'] as i>
  <tr class="row${i?item_parity_cap}">${i}</tr>
</#list>    <tr class="rowOdd">a</tr> <tr class="rowEven">b</tr> <tr class="rowOdd">c</tr> <tr class="rowEven">d</tr>
Use the item_parity
            built-in for lower case "odd" and
            "even".
