Creating your own Character Sheet Templates

PCGen searches for keywords found between the pipe characters. These tokens are always in all caps with no spaces between them and the pipes. PCGen will create a file with the name of the character's name followed by the extension of the template chosen. If the csheet.html template is chosen, and the character's name is Bob, then PCGen will generate Bob.html.
The character sheet templates must all have a name that starts with "csheet", and can be followed by any extension.
Various html templates come with PCGen and demonstrate most of the tokens available with PCGen.

A listing of the tokens follows:

Ability related
STATx where x = 0 (Strength), 1 (Dexterity), 2 (Constitution), 3 (Intelligence), 4 (Wisdom) or 5 (Charisma)
STATx.property where x is the 0-based index in the character's stat (as above) and property is one of:
NAME the short name of the stat
LONGNAME the long name of the stat
STAT the adjusted stat (same as STATx)
MOD the modifier for the stat
BASE the stat before adjustments
BASEMOD the modifier of the stat before adjustments
AC.type, AC.list, AC.type.list

where:
type := "BASE" | "FLAT" | "MISC" | "TOTAL" | "TOUCH"
list := a set of . separated tags from the folowing list:
include := "ABILITY" | "ARMOR" | "BASE" | "CLASS" | "DEFLECTION" | "DEX" | "DODGE" | "EQUIP" | "NATURAL" | "SHIELD" | "SIZE"
(to be used without the quotation marks; a vertical slash means 'or' in this notation)

adding "NO" to the beginning will turn it into an exclude.
"include"-s will add the appropriate modifier
"exclude"-s will subtract the appropriate modifier
(This means AC.EQUIP.NOEQUIP equals 0 whereas AC.SHIELD.SHIELD equals 2 times the shield bonus)

It is possible to concatenate "include"-s and "exclude"-s unlimited.

If you use unrecognized terminals, their value will amount to 0.
(This means AC.BLABLA equals 0 whereas AC.SHIELD.BLABLA equals AC.SHIELD)

Examples of valid tags: |AC.TOTAL| |AC.TOTAL.NOARMOR.NOSHIELD| |AC.NATURAL| |AC.BASE| |AC.TOTAL.NOBASE|

MAXDEX max dexterity bonus from all armor
ACCHECK sum for armorcheck penalty
SPELLFAIL sum for SPELLFAILURE
ARMORx.property where x is the 0-based index in the character's armor list and property is one of:
NAME
ACBONUS total bonus to AC including base and magical adjustments
ACCHECK Armor Check penalty for armor on relevant skills
BASEAC just the armor's non-magical armor adjustment
EDR Damage Resistance provided by the Armor
MAXDEX the armor's max dex adjustment to AC
MOVE Base movement allowed in this armor
SPELLFAIL percentage failure of arcane spells
SPROP special properties
TOTALAC same as ACBONUS
TYPE i.e. Light, Medium, Heavy, Shield, Extra
WT Weight
ARMOR.statusx.property
ARMOR.base.statusx.property
ARMOR.base.subtype.statusx.property
where x is the 0-based index in the character's list of equipment of the specified type and
base := "SUIT" | "SHIRT" | "SHIELD" | "ITEM" | type
type := anything that can occur in equipment type string
property := "ACBONUS" | "ACCHECK" | "BASEAC" | "EDR" | "MAXDEX" | "MOVE" | "NAME" | "SPELLFAIL" | "SPROP" | "TOTALAC" | "TYPE" | "WT"
status := "ALL" | "EQUIPPED" | "NOT_EQUIPPED"
subtype := anything that can occur in equipment type string
(to be used without the quotation marks; a vertical slash means 'or' in this notation)

For example ARMOR.ITEM.MITHRAL.EQUIPPEDx.NAME will produce the name of the xth equipped mithral item, which is neither suit, shirt, nor shield, but bestows a bonus to AC.
Weapon and Attack related  
INITIATIVEMOD is your adjustment to initiative - including dexterity mod and +4 if you have the Improved Initiative feat
INITIATIVEMISC is your adjustment to initiative - EXCLUDING dexterity mod
eg. this will contain +4 if you have the improved initiative feat
ATTACK.MELEE
ATTACK.RANGED
ATTACK.UNARMED
base attack bonus + race modifier + feats + equipment
ATTACK.MELEE.TOTAL
ATTACK.RANGED.TOTAL
ATTACK.UNARMED.TOTAL
as ATTACK.MELEE, but includes Str, size, etc modifiers
as ATTACK.RANGED, but includes Dex, size, etc modifier
as ATTACK.UNARMED, but includes Str, size, etc Bonus
ATTACK.MELEE.BASE
ATTACK.RANGED.BASE
ATTACK.UNARMED.BASE
just the base attack value with no modifiers.
ATTACK.MELEE.SIZE
ATTACK.RANGED.SIZE
ATTACK.UNARMED.SIZE
bonus/penalty to attack based on size
DAMAGE.UNARMED unarmed damage value (includes Str?)
WEAPONx.type where x is the 0-based index on the character's weapon list. type is one of:
NAME (which matches the entry from the WEAPONPROF.LST file)
LONGNAME (a more descriptive name)
ATTACKS (the number of attacks)
BASEDAMAGE (weapon's unadjusted damage)
CATEGORY (weapons category, such as Martial, Melee, etc)
CRIT (critical range of weapon)
DAMAGE (the amount of damage the weapon does)
FEAT (bonus to hit based on feats)
HAND (Hand that weapon is currently equipped in, else none)
HIT (weapon's modified bonus to hit from character's total to hit bonus)
MAGICDAMAGE (weapon's magical bonus to damage)
MAGICHIT (weapon's magical bonus to hit)
MULT (multiplier of critical)
RANGE (range of weapon in feet)
REACH (reach of weapon in feet)
TEMPLATE (Bonus tohit from templates)
TYPE (type of damage the weapon does)
TOTALHITy (the weapon's adjusted to hit bonuses for all attacks, or for attack #y if y is a specified - so TOTALHIT would list all attacks, TOTALHIT0 would display just the first attacks' full bonus)
SIZE (size of the weapon)
SPROP (special properties of weapon)
WT (Weight of weapon in lbs)
WEAPONP.type, WEAPONO.type or WEAPONH.type same as WEAPONx.type where WEAPONP is the primary weapon (marked as Primary in the Hand selection), WEAPONO is the Off-Hand, and WEAPONH is the Unarmed Strike weapon (in order to have this option available you must have chosen at least 1 of the Unarmed Strike item in the Items tab)
WEAPONPROFS is a comma delimited list of weapon proficiencies.
General Information and Equipment  
RACE, VISION, NAME, PLAYERNAME, AGE, HEIGHT, HEIGHT.FOOTPART, HEIGHT.INCHPART, WEIGHT, WEIGHT.NOUNIT, GENDER, GENDER.SHORT, GENDER.LONG, HANDED, MOVEMENT, HP, CR, HITDICE, DR, FACE, REACH, SR, ALIGNMENT and ALIGNMENT.SHORT are also available and print out the corresponding value. GENDER and GENDER.SHORT print out only the initial leter (M for Male, F for Female), whereas GENDER.LONG prints out the full word.
MOVEx, MOVEx.NAME, MOVEx.RATE MOVEx (where x is a number from 0 to (number of movement types)-1) prints out the name and movement rate in feet of the specified movement rate. MOVEx.NAME and .RATE are similar, but instead print out merely the name, or rate, respectively.
CLASSx, CLASSABBx, CLASSx.LEVEL display the xth class' name, abbreviated name, and level respectively.
CLASSLIST displays a comma delimited list of all your classes
FAVOREDLIST displays a comma delimited list of all your favored classes
SIZE, SIZELONG outputs your size (based on your race). SIZELONG functions the same, but outputs the full name of your size (ie. Medium instead of M)
EXP.CURRENT, EXP.NEXT, EXP.FACTOR, EXP.PENALTY outputs your current experience points, the experience points required for you to gain the next level, and the factor by which you multiply recieved experience (due to multiclassing).
TOTALLEVELS outputs an integer of your total levels
DOMAINx, DOMAINx.POWER, DEITY display the xth domain's name, it granted POWER, or the character's DEITY.
WEIGHT.LIGHT, WEIGHT.MEDIUM and WEIGHT.HEAVY display the max weight for that load category for the character.
BIO, DESC, COLOR.EYE, COLOR.SKIN, COLOR.HAIR, LENGTH.HAIR, PERSONALITY1, PERSONALITY2 SPEECHTENDENCY, INTERESTS, PHOBIAS, RESIDENCE, LOCATION and CATCHPHRASE These are all entered on the Trait tab
TYPE The type of critter you're dealing with. Default is Humanoid. Other examples are things like Vermin, Animal, Fey, Giant, Outsider, and so on.
%REGION, REGION This will output the character's region as defined by their region template. |%REGION|statement|%| will only output if the region is not 'None' and will output whatever is inside the statement, such as (|%REGION| From |REGION|. |%|). REGION will output the region-name or 'None' if the character lacks one.
LANGUAGES and LANGUAGESx LANGUAGES is a comma delimited list of known languages, and LANGUAGESx is a way to list the x-th (0 based index) language in the list.
POOL.CURRENT, POOL.COST POOL.CURRENT is remaining the remaining stat pool. POOL.COST is the original cost of creating the character if it was done in Purchase Mode.
MISC.FUNDS, MISC.COMPANIONS, MISC.MAGIC, GOLD, TOTAL.VALUE These all refer to the free-form entries in the Misc tab and are printed exactly as they appear in those text fields. GOLD will output the amount of gold displayed in the Items tab. TOTAL.VALUE will print out the total value of all your equipment, in gold pieces.
EQx.type where x is the equipment number and type is one of:
CARRIED (the total number carried)
CHARGES (the number of charges remaining)
CHARGESUSED (the number of charges used)
CONTENTS (the contents of a container and weight of the contents or nothing if not a container)
COST (for the cost in gold of the item)
EQUIPPED (Y = yes, N = No)
LOCATION (Blank if not carried, else "Equipped" if equipped, the name of its container if inside a container, or "Carried" if just carried)
LONGNAME (for the longer version of the item name)
MAXCHARGES (starting number of charges)
NAME (for the short version of the item name)
QTY (the number of the item owned)
SIZE (size of the item--1 letter)
SIZELONG (size of the item)
SPROP (special properties of the item)
TOTALWT (WT * QTY in lbs)
TYPE
TYPEn
WT (weight in lbs. of the item)
Depending on the type of EQ, you can also use all the tokens from the ARMOR and WEAPONS tokens (ACMOD, MAXDEX, DAMAGE, etc).

EQTYPE.y.x.type where x is the equipment number, y is a item subtype or "Container" and type is any of the options listed for EQx.type above.

EQ.NOT.subtype.ADD.subtype.IS.subtype.x.type
EQTYPE.y.NOT.subtype.ADD.subtype.IS.subtype.x.type
where x is the equipment number, and y is a subtype as explained for EQTYPE, and type is any of the options listed for EQx.type. The subtype field can be any equipment subtype.
Any number of NOT.Type, ADD.Type, and IS.Type combinations can be used. NOT removes items containing that subtype from the returned list of equipment, ADD adds items with that subtype, and IS discards all equipment without that subtype.
EQTYPE and all options can also be used in a COUNT[] statement

EQCONTAINERSx.type EQCONTIANERWx.type where x is the equipment number, and type is the same as for EQx.type above.
Outputs the equipment in a preformatted list format, identing the LONGNAME of the contents of a container with a couple of tabs (for EQCONTAINERS), or a few non-breaking spaces (EQCONTAINERW).
TOTAL.WEIGHT, TOTAL.LOAD, TOTAL.CAPACITY for the total weight (in pounds) of equipment the character is carrying, the kind of LOAD (Light, Medium, Heavy or Overload), or Carrying Capacity (in pounds) of the character.
Features and Skills  
FEATALLLIST, FEATALLx or FEATALLx.DESC where FEATALLLIST will list all your feats (comma delimited) or FEATALLx will print the name of the Feat at position x in the character's list of Feats (e.g. FEATALL0 is the first Feat) and FEATALLx.DESC will print the description of that Feat.
FEATAUTOLIST, FEATAUTOx or FEATAUTOx.DESC where FEATAUTOLIST will list all your automatic feats (comma delimited) or FEATAUTOx will print the name of the Feat at position x in the character's list of Feats (e.g. FEATAUTO0 is the first Feat) and FEATAUTOx.DESC will print the description of that Feat.
FEATLIST, FEATx or FEATx.DESC where FEATLIST will list your feats (comma delimited, excluding virtual feats and automatic feats) or FEATx will print the name of the Feat at position x in the character's list of Feats (e.g. FEAT0 is the first Feat) and FEATx.DESC will print the description of that Feat.
VFEATLIST, VFEATx or VFEATx.DESC where VFEATLIST will list all your virtual feats (comma delimited), or VFEATx will print the name of the Feat at position x in the character's list of Virtual Feats (e.g. VFEAT0 is the first Virtual Feat) and VFEATx.DESC will print the description of that Feat.
SKILLx, SKILLx.RANK, SKILLx.MOD, SKILLx.TOTAL, SKILLx.ABMOD, SKILLx.MISC, SKILLx.ABILITY, SKILLx.UNTRAINED, SKILLx.EXCLUSIVE print the value of the Skill at position x in the character's skill list. Possible values are:
NAME
ABILITY (key ability for this skill
ABMOD (modifier from key ability)
EXCLUSIVE
MOD (total modifiers from abilities, equipment, etc)
MISC (equals TOTAL - RANK - ABMOD)
RANK (number of skill ranks)
TOTAL
UNTRAINED
SKILLSUBSETx.subname, SKILLSUBSETx.subname.RANK, etc. print the value of the Skill at position x in a subset of character's skill list. The subset is generated by comparing subname to the begining of the skill name, if they match (case insensitive) the skill is in the subset. It is the same as the SKILLx entry otherwise
SKILLTYPEx.subtype, SKILLTYPEx.subtype.RANK, etc. print the value of the Skill at position x in a subset of character's skill list. The subset is generated by comparing subtype to the Type of the skill (as defined by the TYPE tag in the Skill.lst file), if the type contains (case insensitive) the subtype the skill is in the subset. It is the same as the SKILLx entry otherwise
SKILLLISTMODS displays a list of all skills with a non zero adjustment
SKILL.Name_of_skill.RANK, SKILL.Name_of_skill.MOD, SKILL.Name_of_skill.TOTAL enables to display RANK, MOD or TOTAL for a specific skill, i.e. SKILL.Alchemy.TOTAL would display the total bonus on your Alchemy skill check
TEMPLATELIST, TEMPLATEx.NAME, TEMPLATEx.STRMOD, TEMPLATEx.DEXMOD, TEMPLATEx.CONMOD, TEMPLATEx.INTMOD, TEMPLATEx.WISMOD, TEMPLATEx.CHAMOD where TEMPLATELIST will list your templates (comma delimited) or TEMPLATEx.NAME will print the name of the Template at position x in the character's list of Feats (e.g. TEMPLATE0.NAME is the first Template) and TEMPLATEx.xxx will print the xxx of that Template.
Saves and Hit Points  
REFLEX, FORTITUDE and WILL (each can be alone or with .TOTAL, .BASE, .RACE or .MAGIC) the unmodified tokens (REFLEX, WILL and FORTITUDE) give the character's full bonus except from stat to the check
.TOTAL (e.g. FORTITUDE.TOTAL) gives everything including the stat bonus to the check
.BASE gives only the class-based adjustment
.FEATS gives bonuses from feats
.RACE gives any racial adjustments
.MAGIC gives all magical bonuses
.MISC gives class, domain, luck, magical, racial, etc
HP displays characters max. hitpoints
Spell related  
SPELLLIST
Where SPELLLIST is followed by one of the following (ie: SPELLLISTBOOKx.y)
BOOKx.y gives a comma delimited list of spells known to spellcaster class number x for level y (if any).
CASTx.y indicates how many spells you can cast for spellcaster class number x for level y.
CLASSx indicates spellcast classname where x is a 0 index array
CLASSx.LEVEL indicates spellcast effective casting level ,including bonus levels from other classes, where x is a 0 index array
DCx.y indicates your DC casting that level of spell for the indicated class (x = class num, y = level of spell).
DCSTATx.y indicates the STAT used to figure out DC of spell
TYPEx indicates the type (ie. Arcane or Divine) of spell class x
KNOWNx.y indicates how many spells you can know for spellcaster class number x for level y. For Clerics with domains, this does not include domain spells
SPELLPOINTS For Deadlands, give the number of Spellpoints the character has.
SPELLMEMv.x.y.z.LABEL v is the classnumber of the spell you wish to display
x is the book number of the spell
y is the level of the spell;
z is the number of the spell in known spells list
LABEL is one of:
NAME
BONUSSPELL
COMPONENTS
CASTINGTIME
DESCRIPTION
DESCRIPTOR
DURATION
EFFECT
EFFECTTYPE
FULLSCHOOL
RANGE
SAVEINFO
SCHOOL
SOURCE
SOURCEPAGE
SOURCESHORT
SUBSCHOOL
SR
TIMES
If x (the book number) is -1, then you really want to list spells from the Default spellbook. This is added for an easy way to list the details of all a character's known spells.
Specials  
TEMP print the name of the character's xth SpecialAbility.
SPECIALLIST is a comma delimited list of special abilities
RACE.ABILITYLIST a comma delimited list of racial special abilities.
PROHIBITEDLIST is a comma delimited list of prohibitions (e.g. a Specialist Wizard must choose some prohibited schools. The selected school will be displayed in this list)
Star Wars  
DEFENSE, DEFENSE.CTOTAL and DEFENSE.CLASSx total defense for the character, the total of the class components, or just the class component for class #x.
WOUNDPOINTS displays your wound points
REPUTATION The reputation of the character
FORCEPOINTS The total Force Points for the character
DSIDEPOINTS The total Darkside Points for the character
Loose Ends...  
EXPORT.DATE Displays the date of export.
EXPORT.TIME Displays the time of export.
EXPORT.VERSION Displays the version of PCGen used to export the character.
%GAMEMODE:x Everything before the closing |%| will only print if PCGen is currently in Game Mode 'x'. Where 'x' is any valid Game Mode.
BONUSLIST.type.subtype.bonusValueSeparator.bonusDelimiter Displays the list of bonuses by type and value associated with the tags involved with BONUS:type|subtype. e.g. BONUSLIST.COMBAT.AC (bonusValueSeparator defaults to a space " " and bonusDelimiter defaults to a comma-space ", " if they're not defined) might produce something like "Enchantment 3, Dodge 2, Armor 4" if the character had BONUS:COMBAT|AC|3|TYPE=Enchantment BONUS:COMBAT|AC|2|TYPE=Dodge BONUS:COMBAT|AC|4|TYPE=Armor
|IIF(expr)|
True Statements
|ELSE|
False Statements
|ENDIF|
expr is the expression you want to evaluate
The first statements will be evaluated if it is true, the second statements will be evaluated if it is false. |ELSE| and the second set of statements are optional. Nested IIFs are supported.
IIF (and OIF) currently only support these expr's:
  • HASFEAT:
    ie: |IIF(HASFEAT:Combat Casting)|
  • HASVAR:
    ie: |IIF(HASVAR:Sneak Attack)|
  • HASEQUIP:
    ie: |IIF(HASEQUIP:Boots of Speed)|
  • SPELLCASTER:
    ie: |IIF(SPELLCASTER:Wizard)|
    or: |IIF(SPELLCASTER:Arcane)|
  • EVEN:
    ie: |IIF(EVEN:2)|
  • SKILLx.UNTRAINED
    ie: |IIF(SKILL0.UNTRAINED)|
OIF(expr,truepart,falsepart) expr         Expression you want to evaluate.
truepart    Value returned if expr is True.
falsepart   Value returned if expr is False.

e.g. |OIF(HASFEAT:Armor Proficiency (Light),YES,NO)|
VAR.VariableName Displays the value of a defined variable. You can also append .INTVAL as an optional argument, which displays the result with no decimal points (as an integer), default is with one decimal place of precision. Also .MINVAL should be included if instead of the default maximum of multiple defines, you want the minimum.

eg. |VAR.Turn Undead.MINVAL.INTVAL|

%filter where where filter is one of:
ARMORx
ARMOR.ITEMx
ARMOR.SHIELDx
BIO
CATCHPHRASE
DESC
DOMAINx
GAMEMODE:
INTERESTS
LOCATION
MISC.COMPANIONS
MISC.FUNDS
MISC.MAGIC
PERSONALITYx
PHOBIAS
PROHIBITEDLIST
REGION
RESIDENCE
SPEECHTENDENCY
SPELLLISTBOOKx
SUBREGION
WEAPONx
where x is the number of appropriate items the character must have or the filter will filter out all output until the next filter is reached or the filter is ended via the |%| token.
For example, |%WEAPON3| means the filter will stop all output (until this filter is ended or the next filter started) unless the character has at least 3 weapons.
filter can also be a comma delimited list of Classname=level pairs (where Classname is a valid Class name and level is the minimum level of the class for the filter).
Classname could also be SPELLLISTCLASSx=level where x is the xth spellcasting class of the character.
filter can also be in the form VAR.name.label.value where name is the name of a defined variable, label is one of EQ (equals), NEQ (not equals), LT (less than) LTEQ, (less than equal to), GT (greater than), GTEQ (greater than equal to), and value is some value to which the named variable is compared. Only 1 filter is active at a time (they can't be nested).

COUNT[]
COUNT[] can be used in any of the FOR loops in place of max. For instance, you could create a FOR loop like this:
|FOR,%num,0,COUNT[SKILLS],1,1|
Statements
|ENDFOR|

Here are the current arguments possible to COUNT[]:

  • CLASSES
  • CONTAINERS
  • DOMAINS
  • EQTYPE
    ie: EQTYPE.WEAPON, EQTYPE.ACITEM, EQTYPE.type
    or: EQTYPE.Wand.ADD.Staff.ADD.Rod
  • EQUIPMENT
  • FEATS
  • FEATTYPE=type1.type2.typen
  • LANGUAGES
  • SA
  • SKILLS
  • SPELLBOOKS
  • SPELLCLASSES
  • SPELLSKNOWN
  • SPELLSINBOOK
  • SPELLTIMES%class.%book.%level.%spell
  • STATS

Some of the arguments must also have additional qualifiers attached. For instance SPELLSINBOOK must be of the form:
COUNT[SPELLSINBOOK0.0.0]
An example:
|FOR,%spell,0,COUNT[SPELLSINBOOK%class.%book.%level],1,1|

|FOR,%var,min,max,step,exists|
Statements
|ENDFOR|
where %var is a variable you name and anywhere it appears in the statements it will be replaced by the current loop value. Min is the minimum index (e.g. 0) and max is the maximum index (exclusive). Step is how much the loop varialbe increases by each time through. The loop will break when no more items are found before the natural end of the loop (max) if exists is 1. If exists is 2 and the charactersheet is currently within a filter, PCGen will not print anything else until the end of the filter |%| is reached or another filter is begun. Nested for loops are supported.

|FOR.min,max,perLine,phrase,startLine,endLine,exists| where min is the minimum index (e.g. 0) and max is the maximum index (exclusive) and perLine is how many phrases will be repeated before the endLine is printed.
The phrase is the code that is parsed for tokens (use \'s instead of |'s, and the % within the tokens will be replaced with the actual value of the index).
The startLine will be printed at the beginning of the for loop and after the endLine. The endLine will be printed every perLine times through the loop.
You may use the special keywords COMMA or NONE for either startLine or endLine (COMMA prints out a comma and NONE prints out nothing)
The loop will break when no more items are found before the natural end of the loop (max) if exists is 1. If exists is 2 and the charactersheet is currently within a filter, PCGen will not print anything else until the end of the filter |%| is reached or another filter is begun.
This style of for loops does not support nesting. If you need nested FOR loops, use the |FOR| |ENDFOR| loop detailed above.
Note:FOR. loop on party sheets (psheet*.*) can only loop on character numbers, so \\%.NAME\\ is valid. If you have a FOR. loop involving the characters within the party for-loop, you must enclose the character for-loop in \\. This is an example that will produce a list of all the party member's skills:
<table> |FOR.0,10,1,[td]\\%.FOR.0,100,1,\SKILL%\,(,),2\\,<tr>,</tr>,1| </table>
|DFOR.min,maxDown,stepNexLine, totalMax, stepInLine, phrase, startLine, endLine, exists| where This is very similar to the FOR loop, except this allows for stepping across the table (in the same line) independent of stepping down. The initial value is min, the values going down are found by adding stepNextLine to min once for each line. To find the value within the same line, this starting value (min for the first line, min + stepNextLine for the next, etc.) has stepInLine added to it, this is done as may times until totalMax is passed. Likewise, stepNextLine is added to min each line until maxDown is passed. An example that would produce a 2 column row table of all skills is the following:

|DFOR.0,(COUNT[SKILLS]+1)/2,1,COUNT[SKILLS], (COUNT[SKILLS]+1)/2,<td>\SKILL%\</td> <td>\SKILL%.TOTAL\</td><td>\SKILL%.RANK\</td> <td>\SKILL%.ABILITY\</td><td>\SKILL%.MOD\,<tr align="center">,</tr>,0|

Note that exists (the ending 0 in the DFOR. loop) should always be 0. The same logic that handles the FOR loop handles the DFOR loop, so the exists flag can be set (though it can be left out).

CSHEETTAG2.x Sets the tag used by embedded DFOR/FOR loops to the character x. Use this when exporting RTF as \ is a control character and causes much confusion.

This code is equivalent to the example above:

|CSHEETTAG2.~|
|DFOR.0,(COUNT[SKILLS]+1)/2,1,COUNT[SKILLS], (COUNT[SKILLS]+1)/2,<td>~SKILL%~</td> <td>~SKILL%.TOTAL~</td><td>~SKILL%.RANK~</td> <td>~SKILL%.ABILITY~</td><td>~SKILL%.MOD~,<tr align="center">,</tr>,0|

PAPERINFO Sets up the paper size for PDF documents
DIR file output path
DIR.PCGEN
DIR.TEMPLATES
DIR.PCG
DIR.HTML
DIR.TEMP
EQSET Support Usefull for outputing Equipment Sets
|EQSET.START|
|EQSET.END|
For Equipment Sets to get output to csheets (or eqsheets) the desired information must be wrapped in |EQSET.START| |EQSET.END| tokens.
ie:
|EQSET.START|
  |EQSET.NAME|
  |FOR,%num,0,10,1,1|
  |ARMOR%num.NAME|
  |ENDFOR|
|EQSET.END|
The above code would loop once for each Equipment Set created on the Equipping tab
EQSET.NAME Outputs the name of the currently looping Equipment Set
Only usefull within a |EQSET.START| |EQSET.END| loop

Note: On the yahoogroups page for PCGen more and more users have been adding their own customized character sheets. Check 'em out!