From e3baf8c5ec430e5f09f00384ebdfa35242fd3316 Mon Sep 17 00:00:00 2001
From: dimitri <dimitri@afe2bf4a-e733-0410-8a33-86f594647bc7>
Date: Mon, 3 Jul 2000 17:43:17 +0000
Subject: Release-1.1.5

---
 INSTALL                        |   8 +-
 README                         |   4 +-
 VERSION                        |   2 +-
 addon/configgen/config_templ.l |  52 ++-
 addon/configgen/configgen.cpp  |  38 +-
 configure                      |   2 +
 doc/config.doc                 | 146 +++++--
 doc/language.doc               |  12 +-
 packages/rpm/doxygen.spec      |   2 +-
 src/classdef.cpp               |  11 +-
 src/code.l                     | 101 ++++-
 src/config.h                   |   4 +-
 src/config.l                   | 113 ++++-
 src/definition.cpp             |   2 +-
 src/dot.cpp                    |   3 +-
 src/doxygen.cpp                |  82 +++-
 src/doxygen.h                  |   1 +
 src/doxytag.l                  |   6 +-
 src/htmlgen.cpp                |   6 +-
 src/index.cpp                  |   7 +-
 src/language.cpp               |   5 +
 src/latexgen.cpp               |  52 ++-
 src/memberdef.cpp              |   3 +-
 src/pre.l                      |   7 +-
 src/rtfgen.cpp                 | 601 +++++++++++++++++---------
 src/scanner.l                  |  24 +-
 src/suffixtree.cpp             |   4 +-
 src/suffixtree.h               |   5 -
 src/translator.h               |  49 +--
 src/translator_cz.h            | 940 ++++++++++++++++++++++++++++-------------
 src/translator_de.h            |  22 +-
 src/translator_es.h            |  30 +-
 src/translator_fi.h            |   2 +
 src/translator_fr.h            |   2 +
 src/translator_hr.h            |   2 +
 src/translator_it.h            |  30 +-
 src/translator_jp.h            |  29 +-
 src/translator_nl.h            |   2 +
 src/translator_ru.h            |   2 +
 src/translator_se.h            |   2 +
 src/util.cpp                   |  31 +-
 41 files changed, 1689 insertions(+), 757 deletions(-)

diff --git a/INSTALL b/INSTALL
index 7b57165..6e6d7dd 100644
--- a/INSTALL
+++ b/INSTALL
@@ -1,4 +1,4 @@
-DOXYGEN Version 1.1.4-20000625
+DOXYGEN Version 1.1.5
 
 CONTENTS
 --------
@@ -15,8 +15,8 @@ INSTALLATION INSTRUCTIONS FOR UNIX:
 
 1.  Unpack the archive, unless you already have:
    
-     gunzip doxygen-1.1.4-20000625.src.tar.gz    # uncompress the archive
-     tar xf doxygen-1.1.4-20000625.src.tar       # unpack it
+     gunzip doxygen-1.1.5.src.tar.gz    # uncompress the archive
+     tar xf doxygen-1.1.5.src.tar       # unpack it
 
 2.  Run the configure script:
  
@@ -255,4 +255,4 @@ The latest version of doxygen can be obtained at
 
 Enjoy,
 
-Dimitri van Heesch (25 June 2000)
+Dimitri van Heesch (02 July 2000)
diff --git a/README b/README
index 7d7c361..f008894 100644
--- a/README
+++ b/README
@@ -1,4 +1,4 @@
-DOXYGEN Version 1.1.4-20000625
+DOXYGEN Version 1.1.5
 
 Please read INSTALL for compilation instructions.
 
@@ -7,4 +7,4 @@ The latest version of doxygen can be obtained at
 
 Enjoy,
 
-Dimitri van Heesch (25 June 2000)
+Dimitri van Heesch (02 July 2000)
diff --git a/VERSION b/VERSION
index 34515fa..e25d8d9 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-1.1.4-20000625
+1.1.5
diff --git a/addon/configgen/config_templ.l b/addon/configgen/config_templ.l
index 6e84ea4..e3c6b03 100644
--- a/addon/configgen/config_templ.l
+++ b/addon/configgen/config_templ.l
@@ -82,8 +82,6 @@ static bool    *    b=0;
 static QStrList *   l=0;
 static int          lastState;
 static QCString     elemStr;
-//static QCString     tabSizeString;
-//static QCString     colsInAlphaIndexString;
 #CONFIG Static
 
 /* -----------------------------------------------------------------
@@ -313,6 +311,56 @@ void configStrToVal()
     }
     Config::colsInAlphaIndex=cols;
   }
+  
+  if (maxDotGraphWidthString.isEmpty())
+  {
+    Config::maxDotGraphWidth=1024;
+  }
+  else
+  {
+    bool ok;
+    int width =maxDotGraphWidthString.toInt(&ok);
+    if (!ok)
+    {
+      warn_cont("Warning: argument of MAX_DOT_GRAPH_WIDTH is not a valid number in the range [1..20]!\n"
+	   "Using the default of 1024 pixels!\n");
+      width=1024;
+    }
+    else if (width<250) // clip to lower bound
+    {
+      width=250;
+    }
+    else if (width>30000) // clip to upper bound
+    {
+      width=30000;
+    }
+    Config::maxDotGraphWidth=width;
+  }
+
+  if (maxDotGraphHeightString.isEmpty())
+  {
+    Config::maxDotGraphHeight=1024;
+  }
+  else
+  {
+    bool ok;
+    int height =maxDotGraphHeightString.toInt(&ok);
+    if (!ok)
+    {
+      warn_cont("Warning: argument of MAX_DOT_GRAPH_WIDTH is not a valid number in the range [1..20]!\n"
+	   "Using the default of 1024 pixels!\n");
+      height=1024;
+    }
+    else if (height<250) // clip to lower bound
+    {
+      height=250;
+    }
+    else if (height>30000) // clip to upper bound
+    {
+      height=30000;
+    }
+    Config::maxDotGraphHeight=height;
+  }
 }
 
 static void substEnvVarsInString(QCString &s)
diff --git a/addon/configgen/configgen.cpp b/addon/configgen/configgen.cpp
index c1f139a..003ee1b 100644
--- a/addon/configgen/configgen.cpp
+++ b/addon/configgen/configgen.cpp
@@ -1338,6 +1338,16 @@ void init()
                     "Note: wordpad (write) and others do not support links. \n"
                  );
   addDependency("rtfHyperFlag","generateRTF");
+  ConfigString::add("rtfStylesheetFile",
+                    "RTF_STYLESHEET_FILE",
+                    "",
+                    "file to load stylesheet definitions from",
+                    "Load stylesheet definitions from file. Syntax is similar to doxygen's \n"
+                    "config file, i.e. a series of assigments. You only have to provide \n"
+                    "replacements, missing definitions are set to their default value. \n",
+                    ConfigString::File
+                   );
+  addDependency("rtfStylesheetFile","generateRTF");                  
   //-----------------------------------------------------------------------------------------------
   ConfigInfo::add(  "Man","configuration options related to the man page output");
   //-----------------------------------------------------------------------------------------------
@@ -1383,9 +1393,19 @@ void init()
                     "expand macros in the source.",
                     "If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro \n"
                     "names in the source code. If set to NO (the default) only conditional \n"
-                    "compilation will be performed. \n"
+                    "compilation will be performed. Macro expansion can be done in a controlled \n"
+                    "way by setting EXPAND_ONLY_PREDEF to YES. \n"
                  );
   addDependency("macroExpansionFlag","preprocessingFlag");
+  ConfigBool::add(  "onlyPredefinedFlag",
+                    "EXPAND_ONLY_PREDEF",
+                    "FALSE",
+                    "expand only predefined macros",
+                    "If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES \n"
+                    "then the macro expansion is limited to the macros specified with the \n"
+                    "PREDEFINED and EXPAND_AS_PREDEFINED tags. \n"
+                 );
+  addDependency("onlyPredefinedFlag","preprocessingFlag");
   ConfigBool::add(  "searchIncludeFlag",
                     "SEARCH_INCLUDES",
                     "TRUE",
@@ -1415,15 +1435,15 @@ void init()
                     "omitted =1 is assumed. \n"
                  );
   addDependency("predefined","preprocessingFlag");
-  ConfigBool::add(  "onlyPredefinedFlag",
-                    "EXPAND_ONLY_PREDEF",
-                    "FALSE",
-                    "expand only predefined macros",
-                    "If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES \n"
-                    "then the macro expansion is limited to the macros specified with the \n"
-                    "PREDEFINED tag. \n"
+  ConfigList::add(  "expandAsDefinedList",
+                    "EXPAND_AS_DEFINED",
+                    "",
+                    "list of defines to expand",
+                    "If the MACRO_EXPANSION and EXPAND_PREDEF_ONLY tags are set to YES then \n"
+                    "this tag can be used to specify a list of macro names that should be expanded. \n"
+                    "The macro definition that is found in the sources will be used. \n"
+                    "Use the PREDEFINED tag if you want to use a different macro definition. \n" 
                  );
-  addDependency("onlyPredefinedFlag","preprocessingFlag");
   //-----------------------------------------------------------------------------------------------
   ConfigInfo::add(  "External","Configuration::addtions related to external references   ");
   //-----------------------------------------------------------------------------------------------
diff --git a/configure b/configure
index 5309027..ecb6398 100755
--- a/configure
+++ b/configure
@@ -353,6 +353,8 @@ if test "$f_shared" = NO; then
   cat >> .tmakeconfig <<EOF
     TMAKE_LFLAGS = -non_shared
 EOF
+  elif test "$f_platform" = "solaris-cc"; then
+    TMAKE_LFLAGS = -Bstatic
   else
   cat >> .tmakeconfig <<EOF
     TMAKE_LFLAGS = -static
diff --git a/doc/config.doc b/doc/config.doc
index 55774fb..99cf664 100644
--- a/doc/config.doc
+++ b/doc/config.doc
@@ -131,6 +131,7 @@ followed by the descriptions of the tags grouped by category.
 <li> \refitem cfg_repeat_brief REPEAT_BRIEF
 <li> \refitem cfg_rtf_hyperlinks RTF_HYPERLINKS
 <li> \refitem cfg_rtf_output RTF_OUTPUT
+<li> \refitem cfg_rtf_stylesheet_file RTF_STYLESHEET_FILE
 <li> \refitem cfg_search_includes SEARCH_INCLUDES
 <li> \refitem cfg_searchengine SEARCHENGINE
 <li> \refitem cfg_show_include_files SHOW_INCLUDE_FILES
@@ -194,7 +195,7 @@ followed by the descriptions of the tags grouped by category.
  \addindex DISABLE_INDEX
  If you want full control over the layout of the generated HTML pages it
  might be necessary to disable the index and replace it with your own.
- The DISABLE_INDEX tag can be used to turn on/off the condensed index at
+ The \c DISABLE_INDEX tag can be used to turn on/off the condensed index at
  top of each page. A value of NO (the default) enables the index and the
  value YES disables it.
 
@@ -311,7 +312,7 @@ followed by the descriptions of the tags grouped by category.
 \anchor cfg_strip_code_comments
 <dt>\c STRIP_CODE_COMMENTS <dd>
  \addindex STRIP_CODE_COMMENTS
- Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct
+ Setting the \c STRIP_CODE_COMMENTS tag to \c YES (the default) will instruct
  doxygen to hide any special comment blocks from generated source code
  fragments. Normal C and C++ comments will always remain visible.
 
@@ -327,9 +328,9 @@ followed by the descriptions of the tags grouped by category.
 \anchor cfg_hide_scope_names
 <dt>\c HIDE_SCOPE_NAMES <dd>
  \addindex HIDE_SCOPE_NAMES
- If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen 
+ If the \c HIDE_SCOPE_NAMES tag is set to \c NO (the default) then Doxygen 
  will show members with their full class and namespace scopes in the
- documentation. If set to YES the scope will be hidden. 
+ documentation. If set to \c YES the scope will be hidden. 
 
 \anchor cfg_verbatim_headers
 <dt>\c VERBATIM_HEADERS <dd>
@@ -370,9 +371,9 @@ followed by the descriptions of the tags grouped by category.
 \anchor cfg_sort_member_docs
 <dt>\c SORT_MEMBER_DOCS <dd>
  \addindex SORT_MEMBER_DOCS
- If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen
+ If the \c SORT_MEMBER_DOCS tag is set to \c YES (the default) then doxygen
  will sort the (detailed) documentation of file and class members
- alphabetically by member name. If set to NO the members will appear in
+ alphabetically by member name. If set to \c NO the members will appear in
  declaration order.
 
 \anchor cfg_tab_size
@@ -413,8 +414,8 @@ followed by the descriptions of the tags grouped by category.
 \anchor cfg_warn_if_undocumented
 <dt>\c WARN_IF_UNDOCUMENTED <dd>
  \addindex WARN_IF_UNDOCUMENTED
- If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings
- for undocumented members. If EXTRACT_ALL is set to YES then this flag will
+ If \c WARN_IF_UNDOCUMENTED is set to \c YES, then doxygen will generate warnings
+ for undocumented members. If \c EXTRACT_ALL is set to \c YES then this flag will
  automatically be disabled.
 
 \anchor cfg_warn_format
@@ -467,7 +468,7 @@ followed by the descriptions of the tags grouped by category.
 \anchor cfg_exclude_patterns
 <dt>\c EXCLUDE_PATTERNS <dd>
  \addindex EXCLUDE_PATTERNS
- If the value of the INPUT tag contains directories, you can use the
+ If the value of the \c INPUT tag contains directories, you can use the
  \c EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
  certain files from those directories.
 
@@ -575,8 +576,8 @@ followed by the descriptions of the tags grouped by category.
  <code>\$projectnumber</code>. 
  Doxygen will replace them by respectively 
  the title of the page, the current date and time, only the current date,
- the version number of doxygen, the project name (see PROJECT_NAME), or the
- project number (see PROJECT_NUMBER).
+ the version number of doxygen, the project name (see \c PROJECT_NAME), or the
+ project number (see \c PROJECT_NUMBER).
    
 \anchor cfg_html_footer
 <dt>\c HTML_FOOTER <dd>
@@ -596,8 +597,8 @@ followed by the descriptions of the tags grouped by category.
  <code>\$projectnumber</code>. 
  Doxygen will replace them by respectively 
  the title of the page, the current date and time, only the current date,
- the version number of doxygen, the project name (see PROJECT_NAME), or the
- project number (see PROJECT_NUMBER).
+ the version number of doxygen, the project name (see \c PROJECT_NAME), or the
+ project number (see \c PROJECT_NUMBER).
    
 
 \anchor cfg_html_stylesheet
@@ -638,10 +639,10 @@ FONT.charliteral   { color: #008080 }
  \addindex HTML_ALIGN_MEMBERS
  If the \c HTML_ALIGN_MEMBERS tag is set to \c YES, the members of classes,
  files or namespaces will be aligned in HTML using tables. If set to
- NO a bullet list will be used. 
+ \c NO a bullet list will be used. 
 
  <b>Note:</b>
- Setting this tag to NO will become obsolete in the future, since I only
+ Setting this tag to \c NO will become obsolete in the future, since I only
  intent to support and test the aligned representation.
 
 \anchor cfg_generate_htmlhelp
@@ -695,7 +696,7 @@ FONT.charliteral   { color: #008080 }
 \anchor cfg_paper_type
 <dt>\c PAPER_TYPE <dd>
  \addindex PAPER_TYPE
- The PAPER_TYPE tag can be used to set the paper type that is used
+ The \c PAPER_TYPE tag can be used to set the paper type that is used
  by the printer. Possible values are: 
  <ul>
  <li><code>a4</code> (210 x 297 mm).
@@ -758,8 +759,8 @@ EXTRA_PACKAGES = times
  <code>\$projectnumber</code>. 
  Doxygen will replace them by respectively 
  the title of the page, the current date and time, only the current date,
- the version number of doxygen, the project name (see PROJECT_NAME), or the
- project number (see PROJECT_NUMBER).
+ the version number of doxygen, the project name (see \c PROJECT_NAME), or the
+ project number (see \c PROJECT_NUMBER).
    
 \anchor cfg_pdf_hyperlinks
 <dt>\c PDF_HYPERLINKS <dd>
@@ -796,7 +797,7 @@ EXTRA_PACKAGES = times
 <dt>\c RTF_OUTPUT <dd>
  \addindex RTF_OUTPUT
  The \c RTF_OUTPUT tag is used to specify where the RTF docs will be put.
- If a relative path is entered the value of OUTPUT_DIRECTORY will be
+ If a relative path is entered the value of \c OUTPUT_DIRECTORY will be
  put in front of it. If left blank \c rtf will be used as the default path.
  
 \anchor cfg_compact_rtf
@@ -818,6 +819,90 @@ EXTRA_PACKAGES = times
  \par note:
    wordpad (write) and others do not support links.
 
+\anchor cfg_rtf_stylesheet_file RTF_STYLESHEET_FILE
+<dt>\c RTF_STYLESHEET_FILE <dd>
+ \addindex RTF_STYLESHEET_FILE
+ Load stylesheet definitions from file. Syntax is similar to doxygen's
+ config file, i.e. a series of assigments. You only have to provide
+ replacements, missing definitions are set to their default value.
+
+\htmlonly
+Here are the default settings:
+<font size=2><pre>Reset         = \\pard\\plain 
+Heading1      = \\s1\\sb240\\sa60\\keepn\\widctlpar\\adjustright \\b\\f1\\fs36\\kerning36\\cgrid 
+Heading2      = \\s2\\sb240\\sa60\\keepn\\widctlpar\\adjustright \\b\\f1\\fs28\\kerning28\\cgrid 
+Heading3      = \\s3\\sb240\\sa60\\keepn\\widctlpar\\adjustright \\b\\f1\\cgrid 
+Heading4      = \\s4\\sb240\\sa60\\keepn\\widctlpar\\adjustright \\b\\f1\\fs20\\cgrid 
+Title         = \\s15\\qc\\sb240\\sa60\\widctlpar\\outlinelevel0\\adjustright \\b\\f1\\fs32\\kerning28\\cgrid 
+SubTitle      = \\s16\\qc\\sa60\\widctlpar\\outlinelevel1\\adjustright \\f1\\cgrid 
+BodyText      = \\s17\\sa60\\sb30\\widctlpar\\qj \\fs22\\cgrid 
+DenseText     = \\s18\\widctlpar\\fs22\\cgrid 
+Header        = \\s28\\widctlpar\\tqc\\tx4320\\tqr\\tx8640\\adjustright \\fs20\\cgrid 
+Footer        = \\s29\\widctlpar\\tqc\\tx4320\\tqr\\tx8640\\qr\\adjustright \\fs20\\cgrid 
+GroupHeader   = \\s30\\li360\\sa60\\sb120\\keepn\\widctlpar\\adjustright \\b\\f1\\fs20\\cgrid 
+CodeExample0  = \\s40\\li0\\widctlpar\\adjustright \\shading1000\\cbpat8 \\f2\\fs16\\cgrid 
+CodeExample1  = \\s41\\li360\\widctlpar\\adjustright \\shading1000\\cbpat8 \\f2\\fs16\\cgrid 
+CodeExample2  = \\s42\\li720\\widctlpar\\adjustright \\shading1000\\cbpat8 \\f2\\fs16\\cgrid 
+CodeExample3  = \\s43\\li1080\\widctlpar\\adjustright \\shading1000\\cbpat8 \\f2\\fs16\\cgrid 
+CodeExample4  = \\s44\\li1440\\widctlpar\\adjustright \\shading1000\\cbpat8 \\f2\\fs16\\cgrid 
+CodeExample5  = \\s45\\li1800\\widctlpar\\adjustright \\shading1000\\cbpat8 \\f2\\fs16\\cgrid 
+CodeExample6  = \\s46\\li2160\\widctlpar\\adjustright \\shading1000\\cbpat8 \\f2\\fs16\\cgrid 
+CodeExample7  = \\s47\\li2520\\widctlpar\\adjustright \\shading1000\\cbpat8 \\f2\\fs16\\cgrid 
+CodeExample8  = \\s48\\li2880\\widctlpar\\adjustright \\shading1000\\cbpat8 \\f2\\fs16\\cgrid 
+CodeExample9  = \\s49\\li3240\\widctlpar\\adjustright \\shading1000\\cbpat8 \\f2\\fs16\\cgrid 
+ListContinue0 = \\s50\\li0\\sa60\\sb30\\qj\\widctlpar\\qj\\adjustright \\fs20\\cgrid 
+ListContinue1 = \\s51\\li360\\sa60\\sb30\\qj\\widctlpar\\qj\\adjustright \\fs20\\cgrid 
+ListContinue2 = \\s52\\li720\\sa60\\sb30\\qj\\widctlpar\\qj\\adjustright \\fs20\\cgrid 
+ListContinue3 = \\s53\\li1080\\sa60\\sb30\\qj\\widctlpar\\qj\\adjustright \\fs20\\cgrid 
+ListContinue4 = \\s54\\li1440\\sa60\\sb30\\qj\\widctlpar\\qj\\adjustright \\fs20\\cgrid 
+ListContinue5 = \\s55\\li1800\\sa60\\sb30\\qj\\widctlpar\\qj\\adjustright \\fs20\\cgrid 
+ListContinue6 = \\s56\\li2160\\sa60\\sb30\\qj\\widctlpar\\qj\\adjustright \\fs20\\cgrid 
+ListContinue7 = \\s57\\li2520\\sa60\\sb30\\qj\\widctlpar\\qj\\adjustright \\fs20\\cgrid 
+ListContinue8 = \\s58\\li2880\\sa60\\sb30\\qj\\widctlpar\\qj\\adjustright \\fs20\\cgrid 
+ListContinue9 = \\s59\\li3240\\sa60\\sb30\\qj\\widctlpar\\qj\\adjustright \\fs20\\cgrid 
+DescContinue0 = \\s60\\li0\\widctlpar\\ql\\adjustright \\fs20\\cgrid 
+DescContinue1 = \\s61\\li360\\widctlpar\\ql\\adjustright \\fs20\\cgrid 
+DescContinue2 = \\s62\\li720\\widctlpar\\ql\\adjustright \\fs20\\cgrid 
+DescContinue3 = \\s63\\li1080\\widctlpar\\ql\\adjustright \\fs20\\cgrid 
+DescContinue4 = \\s64\\li1440\\widctlpar\\ql\\adjustright \\fs20\\cgrid 
+DescContinue5 = \\s65\\li1800\\widctlpar\\ql\\adjustright \\fs20\\cgrid 
+DescContinue6 = \\s66\\li2160\\widctlpar\\ql\\adjustright \\fs20\\cgrid 
+DescContinue7 = \\s67\\li2520\\widctlpar\\ql\\adjustright \\fs20\\cgrid 
+DescContinue8 = \\s68\\li2880\\widctlpar\\ql\\adjustright \\fs20\\cgrid 
+DescContinue9 = \\s69\\li3240\\widctlpar\\ql\\adjustright \\fs20\\cgrid 
+LatexTOC0     = \\s70\\li0\\sa30\\sb30\\widctlpar\\tqr\\tldot\\tx8640\\adjustright \\fs20\\cgrid 
+LatexTOC1     = \\s71\\li360\\sa27\\sb27\\widctlpar\\tqr\\tldot\\tx8640\\adjustright \\fs20\\cgrid 
+LatexTOC2     = \\s72\\li720\\sa24\\sb24\\widctlpar\\tqr\\tldot\\tx8640\\adjustright \\fs20\\cgrid 
+LatexTOC3     = \\s73\\li1080\\sa21\\sb21\\widctlpar\\tqr\\tldot\\tx8640\\adjustright \\fs20\\cgrid 
+LatexTOC4     = \\s74\\li1440\\sa18\\sb18\\widctlpar\\tqr\\tldot\\tx8640\\adjustright \\fs20\\cgrid 
+LatexTOC5     = \\s75\\li1800\\sa15\\sb15\\widctlpar\\tqr\\tldot\\tx8640\\adjustright \\fs20\\cgrid 
+LatexTOC6     = \\s76\\li2160\\sa12\\sb12\\widctlpar\\tqr\\tldot\\tx8640\\adjustright \\fs20\\cgrid 
+LatexTOC7     = \\s77\\li2520\\sa9\\sb9\\widctlpar\\tqr\\tldot\\tx8640\\adjustright \\fs20\\cgrid 
+LatexTOC8     = \\s78\\li2880\\sa6\\sb6\\widctlpar\\tqr\\tldot\\tx8640\\adjustright \\fs20\\cgrid 
+LatexTOC9     = \\s79\\li3240\\sa3\\sb3\\widctlpar\\tqr\\tldot\\tx8640\\adjustright \\fs20\\cgrid 
+ListBullet0   = \\s80\\fi-360\\li360\\widctlpar\\jclisttab\\tx360{\\*\\pn \\pnlvlbody\\ilvl0\\ls1\\pnrnot0\\pndec }\\ls1\\adjustright \\fs20\\cgrid 
+ListBullet1   = \\s81\\fi-360\\li720\\widctlpar\\jclisttab\\tx720{\\*\\pn \\pnlvlbody\\ilvl0\\ls2\\pnrnot0\\pndec }\\ls2\\adjustright \\fs20\\cgrid 
+ListBullet2   = \\s82\\fi-360\\li1080\\widctlpar\\jclisttab\\tx1080{\\*\\pn \\pnlvlbody\\ilvl0\\ls3\\pnrnot0\\pndec }\\ls3\\adjustright \\fs20\\cgrid 
+ListBullet3   = \\s83\\fi-360\\li1440\\widctlpar\\jclisttab\\tx1440{\\*\\pn \\pnlvlbody\\ilvl0\\ls4\\pnrnot0\\pndec }\\ls4\\adjustright \\fs20\\cgrid 
+ListBullet4   = \\s84\\fi-360\\li1800\\widctlpar\\jclisttab\\tx1800{\\*\\pn \\pnlvlbody\\ilvl0\\ls5\\pnrnot0\\pndec }\\ls5\\adjustright \\fs20\\cgrid 
+ListBullet5   = \\s85\\fi-360\\li2160\\widctlpar\\jclisttab\\tx2160{\\*\\pn \\pnlvlbody\\ilvl0\\ls6\\pnrnot0\\pndec }\\ls6\\adjustright \\fs20\\cgrid 
+ListBullet6   = \\s86\\fi-360\\li2520\\widctlpar\\jclisttab\\tx2520{\\*\\pn \\pnlvlbody\\ilvl0\\ls7\\pnrnot0\\pndec }\\ls7\\adjustright \\fs20\\cgrid 
+ListBullet7   = \\s87\\fi-360\\li2880\\widctlpar\\jclisttab\\tx2880{\\*\\pn \\pnlvlbody\\ilvl0\\ls8\\pnrnot0\\pndec }\\ls8\\adjustright \\fs20\\cgrid 
+ListBullet8   = \\s88\\fi-360\\li3240\\widctlpar\\jclisttab\\tx3240{\\*\\pn \\pnlvlbody\\ilvl0\\ls9\\pnrnot0\\pndec }\\ls9\\adjustright \\fs20\\cgrid 
+ListBullet9   = \\s89\\fi-360\\li3600\\widctlpar\\jclisttab\\tx3600{\\*\\pn \\pnlvlbody\\ilvl0\\ls10\\pnrnot0\\pndec }\\ls10\\adjustright \\fs20\\cgrid 
+ListEnum0     = \\s90\\fi-360\\li360\\widctlpar\\fs20\\cgrid 
+ListEnum1     = \\s91\\fi-360\\li720\\widctlpar\\fs20\\cgrid 
+ListEnum2     = \\s92\\fi-360\\li1080\\widctlpar\\fs20\\cgrid 
+ListEnum3     = \\s93\\fi-360\\li1440\\widctlpar\\fs20\\cgrid 
+ListEnum4     = \\s94\\fi-360\\li1800\\widctlpar\\fs20\\cgrid 
+ListEnum4     = \\s95\\fi-360\\li2160\\widctlpar\\fs20\\cgrid 
+ListEnum5     = \\s96\\fi-360\\li2520\\widctlpar\\fs20\\cgrid 
+ListEnum6     = \\s97\\fi-360\\li2880\\widctlpar\\fs20\\cgrid 
+ListEnum7     = \\s98\\fi-360\\li3240\\widctlpar\\fs20\\cgrid 
+ListEnum8     = \\s99\\fi-360\\li3600\\widctlpar\\fs20\\cgrid 
+</pre></font>
+\endhtmlonly
+
 </dl>
 
 \subsection man_output Man page related options
@@ -860,7 +945,15 @@ EXTRA_PACKAGES = times
  \addindex MACRO_EXPANSION
  If the \c MACRO_EXPANSION tag is set to \c YES Doxygen will expand all macro
  names in the source code. If set to \c NO (the default) only conditional 
- compilation will be performed.
+ compilation will be performed. Macro expansion can be done in a controlled
+ way by setting \c EXPAND_ONLY_PREDEF to \c YES.
+
+\anchor cfg_expand_only_predef
+<dt>\c EXPAND_ONLY_PREDEF <dd>
+ \addindex EXPAND_ONLY_PREDEF
+ If the \c EXPAND_ONLY_PREDEF and \c MACRO_EXPANSION tags are both set to YES
+ then the macro expansion is limited to the macros specified with the
+ \c PREDEFINED and \c EXPAND_AS_PREDEFINED tags.
 
 \anchor cfg_search_includes
 <dt>\c SEARCH_INCLUDES <dd>
@@ -884,12 +977,13 @@ EXTRA_PACKAGES = times
  <code>name</code> or <code>name=definition</code> (no spaces). 
  If the definition and the = are omitted =1 is assumed.
 
-\anchor cfg_expand_only_predef
-<dt>\c EXPAND_ONLY_PREDEF <dd>
- \addindex EXPAND_ONLY_PREDEF
- If the \c EXPAND_ONLY_PREDEF and \c MACRO_EXPANSION tags are both set to YES
- then the macro expansion is limited to the macros specified with the
- \c PREDEFINED tag.
+\anchor cfg_expand_as_defined
+<dt>\c EXPAND_AS_DEFINED <dd>
+ \addindex EXPAND_AS_DEFINED
+ If the \c MACRO_EXPANSION and \c EXPAND_PREDEF_ONLY tags are set to \c YES then
+ this tag can be used to specify a list of macro names that should be expanded.
+ The macro definition that is found in the sources will be used.
+ Use the \c PREDEFINED tag if you want to use a different macro definition.
 
 </dl>
 \subsection config_extref External reference options
diff --git a/doc/language.doc b/doc/language.doc
index cdb3d1f..c3e04ca 100644
--- a/doc/language.doc
+++ b/doc/language.doc
@@ -59,7 +59,7 @@ Here is a list of the languages and their current maintainers:
       </TD>
       <TD>
         <a href="mailto:bordeux@NOSPAM.lig.di.epfl.ch">
-                          bordeux@NOSPAM.lig.di.epfl.ch</a>
+                        bordeux@NOSPAM.lig.di.epfl.ch</a>
       </TD>
   </TR>
   <TR BGCOLOR="#ffffff">
@@ -72,9 +72,9 @@ Here is a list of the languages and their current maintainers:
       </TD>
       <TD>
         <a href="mailto:sahag96@NOSPAM.nts.mh.se">
-	          sahag96@NOSPAM.nts.mh.se</a><br>
+	                sahag96@NOSPAM.nts.mh.se</a><br>
         <a href="mailto:xet@NOSPAM.hem.passagen.se">
-		  xet@NOSPAM.hem.passagen.se</a>
+		        xet@NOSPAM.hem.passagen.se</a>
       </TD>
   </TR>
   <TR BGCOLOR="#ffffff">
@@ -82,9 +82,12 @@ Here is a list of the languages and their current maintainers:
         Czech
       </TD>   
       <TD>
+        Petr Prikryl<BR>
         Vlastimil Havran
       </TD>
       <TD>
+        <a href="mailto:prikrylp@NOSPAM.skil.cz">
+                        prikrylp@NOSPAM.skil.cz</a>
         <a href="mailto:havran@NOSPAM.fel.cvut.cz">
                         havran@NOSPAM.fel.cvut.cz</a>
       </TD>
@@ -206,7 +209,8 @@ Here is a list of the languages and their current maintainers:
   Swedish & Samuel H\"agglund & {\tt sahag96@nts.mh.se} \\
           & XeT Erixon      & {\tt xet@hem.passagen.se} \\
   \hline
-  Czech   & Vlastimil Havran & {\tt havran@fel.cvut.cz} \\
+  Czech   & Petr Prikryl     & {\tt prikrylp@skil.cz}   \\
+          & Vlastimil Havran & {\tt havran@fel.cvut.cz} \\
   \hline
   Romanian & Ionutz Borcoman & {\tt borco@borco-ei.eng.hokudai.ac.jp} \\
   \hline
diff --git a/packages/rpm/doxygen.spec b/packages/rpm/doxygen.spec
index 4909686..eeb5dfc 100644
--- a/packages/rpm/doxygen.spec
+++ b/packages/rpm/doxygen.spec
@@ -1,5 +1,5 @@
 Name: doxygen
-Version: 1.1.4-20000625
+Version: 1.1.5
 Summary: documentation system for C, C++ and IDL
 Release: 1
 Source0: doxygen-%{version}.src.tar.gz
diff --git a/src/classdef.cpp b/src/classdef.cpp
index daacfba..558d33b 100644
--- a/src/classdef.cpp
+++ b/src/classdef.cpp
@@ -1605,8 +1605,14 @@ void ClassDef::determineImplUsageRelation()
               int brCount=1;
               while (te<typeLen && brCount!=0)
               {
-                if (type.at(te)=='<') brCount++;
-                if (type.at(te)=='>') brCount--;
+                if (type.at(te)=='<') 
+                {
+                  if (te<typeLen-1 && type.at(te+1)=='<') te++; else brCount++;
+                }
+                if (type.at(te)=='>') 
+                {
+                  if (te<typeLen-1 && type.at(te+1)=='>') te++; else brCount--;
+                }
                 te++;
               }
             }
@@ -1614,6 +1620,7 @@ void ClassDef::determineImplUsageRelation()
             if (te>ts) templSpec = type.mid(ts,te-ts);
             ClassDef *cd=getResolvedClass(name()+"::"+type.mid(i,l));
             if (cd==0) cd=getResolvedClass(type.mid(i,l)); // TODO: also try inbetween scopes!
+            //printf("Search for class %s result=%p\n",type.mid(i,l).data(),cd);
             if (cd) // class exists 
             {
               found=TRUE;
diff --git a/src/code.l b/src/code.l
index a057a23..79ddac7 100644
--- a/src/code.l
+++ b/src/code.l
@@ -118,6 +118,7 @@ static const char *  g_currentFontClass;
 static bool          g_searchingForBody;
 static bool          g_insideBody;
 static int           g_bodyCurlyCount;
+static ClassDef *    g_classVar;
 
 /*! start a new line of code, inserting a line number if g_sourceFileDef
  * is TRUE. If a definition starts at the current line, then the line
@@ -341,6 +342,34 @@ static void generateClassLink(OutputList &ol,char *clName,int *clNameLen=0)
   }
 }
 
+static ClassDef *stripClassName(const char *s)
+{
+  QCString tmp=s;
+  if (tmp.isEmpty()) return 0;
+  static const QRegExp re("[a-z_A-Z][a-z_A-Z0-9:]*");
+  int p=0,i,l;
+  while ((i=re.match(tmp,p,&l))!=-1)
+  {
+    ClassDef *cd=0;
+    QCString clName = tmp.mid(i,l);
+    //printf("g_classScope=`%s' clName=`%s'\n",g_classScope.data(),clName.data());
+    if (!g_classScope.isEmpty())
+    {
+      cd=getResolvedClass(g_classScope+"::"+clName);
+    }
+    if (cd==0)
+    {
+      cd=getResolvedClass(clName);
+    }
+    if (cd) 
+    {
+      return cd;
+    }
+    p=i+l;
+  }
+  return 0;
+}
+
 static bool getLink(const char *className,
                     const char *memberName,OutputList &result,
 		    const char *text=0)
@@ -375,10 +404,11 @@ static bool getLink(const char *className,
       }
     }
     Definition *d=0;
-    if (cd) d=cd; else if (cd) d=nd; else if (fd) d=fd; else d=gd;
+    if (cd) d=cd; else if (nd) d=nd; else if (fd) d=fd; else d=gd;
 
     if (d && d->isLinkable())
     {
+      g_classVar = stripClassName(md->typeString());
       if (g_currentDefinition && g_currentMemberDef &&
 	  md!=g_currentMemberDef && g_insideBody)
       {
@@ -393,32 +423,47 @@ static bool getLink(const char *className,
   return FALSE;
 }
 
-static ClassDef *stripClassName(const char *s)
+static bool generateClassMemberLink(OutputList &ol,ClassDef *mcd,const char *memName)
 {
-  QCString tmp=s;
-  if (tmp.isEmpty()) return 0;
-  static const QRegExp re("[a-z_A-Z][a-z_A-Z0-9:]*");
-  int p=0,i,l;
-  while ((i=re.match(tmp,p,&l))!=-1)
+  //printf("generateClassMemberLink(%s,%s)\n",mcd->name().data(),memName);
+  MemberName *mmn=memberNameDict[memName];
+  if (mmn)
   {
-    ClassDef *cd=0;
-    QCString clName = tmp.mid(i,l);
-    //printf("g_classScope=`%s' clName=`%s'\n",g_classScope.data(),clName.data());
-    if (!g_classScope.isEmpty())
-    {
-      cd=getResolvedClass(g_classScope+"::"+clName);
-    }
-    if (cd==0)
+    MemberNameIterator mmni(*mmn);
+    MemberDef *mmd,*xmd=0;
+    ClassDef *xcd=0;
+    const int maxInheritanceDepth = 100000;
+    int mdist=maxInheritanceDepth;
+    for (;(mmd=mmni.current());++mmni)
     {
-      cd=getResolvedClass(clName);
+      int m=minClassDistance(mcd,mmd->memberClass());
+      if (m<mdist && mmd->memberClass()->isLinkable())
+      {
+	mdist=m;
+	xcd=mmd->memberClass();
+	xmd=mmd;
+      }
     }
-    if (cd) 
+    if (mdist!=maxInheritanceDepth)
     {
-      return cd;
+      // extract class definition of the return type in order to resolve
+      // a->b()->c() like call chains
+      g_classVar = stripClassName(xmd->typeString());
+
+      // add usage reference
+      if (g_currentDefinition && g_currentMemberDef &&
+	  xmd!=g_currentMemberDef && g_insideBody)
+      {
+	xmd->addSourceReference(g_currentMemberDef);
+      }
+
+      // write the actual link
+      writeMultiLineCodeLink(ol,xcd->getReference(),
+	  xcd->getOutputFileBase(),xmd->anchor(),memName);
+      return TRUE;
     }
-    p=i+l;
   }
-  return 0;
+  return FALSE;
 }
 
 static void generateMemberLink(OutputList &ol,const char *varName,
@@ -493,6 +538,8 @@ static void generateMemberLink(OutputList &ol,const char *varName,
 	    ClassDef *mcd=stripClassName(vmd->typeString());
 	    if (mcd && mcd->isLinkable())
 	    {
+	      if (generateClassMemberLink(ol,mcd,memName)) return;
+#if 0
 	      //printf("Found class `%s'\n",mcd->name().data());
 	      MemberName *mmn=memberNameDict[memName];
 	      if (mmn)
@@ -524,6 +571,7 @@ static void generateMemberLink(OutputList &ol,const char *varName,
 		  return;
 		}
 	      }
+#endif
 	    }
 	  }
 	}
@@ -925,9 +973,21 @@ TYPEKW  ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned"
 					}
 <MemberCall>{SCOPENAME}/{B}*"(" 	{
   					  if (!g_name.isEmpty())
+					  {
 					    generateMemberLink(*g_code,g_name,yytext);
+					  }
+					  else if (g_classVar)
+					  {
+					    if (!generateClassMemberLink(*g_code,g_classVar,yytext))
+					    {
+					      g_code->codify(yytext);
+					    }
+					    g_classVar=0;
+					  }
 					  else
+					  {
   					    g_code->codify(yytext);
+					  }
   					  g_name.resize(0);g_type.resize(0);
 					  g_bracketCount=0;
 					  BEGIN(FuncCall);
@@ -1350,6 +1410,7 @@ void parseCode(OutputList &ol,const char *className,const QCString &s,
   g_bodyCurlyCount    = 0;
   g_bracketCount  = 0;
   g_sharpCount    = 0;
+  g_classVar      = 0;
   g_classScope    = className;
   g_exampleBlock  = exBlock; 
   g_exampleName   = exName;
diff --git a/src/config.h b/src/config.h
index 9330012..9665dbb 100644
--- a/src/config.h
+++ b/src/config.h
@@ -96,15 +96,17 @@ struct Config
   static QCString rtfOutputDir; // the directory to put the RTF files
   static bool     compactRTFFlag; // generate more compact RTF
   static bool     rtfHyperFlag; // generate hyper links in RTF
+  static QCString rtfStylesheetFile; // file to load stylesheet definitions from
   static bool     generateMan; // generate Man pages
   static QCString manOutputDir; // the directory to put the man pages
   static QCString manExtension; // extension the man page files
   static bool     preprocessingFlag; // enable preprocessing
   static bool     macroExpansionFlag; // expand macros in the source.
+  static bool     onlyPredefinedFlag; // expand only predefined macros
   static bool     searchIncludeFlag; // search for included files
   static QStrList includePath; // list of include paths
   static QStrList predefined; // list of predefined macro names.
-  static bool     onlyPredefinedFlag; // expand only predefined macros
+  static QStrList expandAsDefinedList; // list of defines to expand
   static QStrList tagFileList; // list of tag files
   static QCString genTagFile; // the tag file to generate
   static bool     allExtFlag; // include all external classes flag
diff --git a/src/config.l b/src/config.l
index 780e9ce..57064e7 100644
--- a/src/config.l
+++ b/src/config.l
@@ -131,15 +131,17 @@ bool     Config::generateRTF = TRUE;
 QCString Config::rtfOutputDir = "rtf";
 bool     Config::compactRTFFlag = FALSE;
 bool     Config::rtfHyperFlag = FALSE;
+QCString Config::rtfStylesheetFile;
 bool     Config::generateMan = TRUE;
 QCString Config::manOutputDir = "man";
 QCString Config::manExtension = ".3";
 bool     Config::preprocessingFlag = TRUE;
 bool     Config::macroExpansionFlag = FALSE;
+bool     Config::onlyPredefinedFlag = FALSE;
 bool     Config::searchIncludeFlag = TRUE;
 QStrList Config::includePath;
 QStrList Config::predefined;
-bool     Config::onlyPredefinedFlag = FALSE;
+QStrList Config::expandAsDefinedList;
 QStrList Config::tagFileList;
 QCString Config::genTagFile;
 bool     Config::allExtFlag = FALSE;
@@ -175,8 +177,6 @@ static bool    *    b=0;
 static QStrList *   l=0;
 static int          lastState;
 static QCString     elemStr;
-//static QCString     tabSizeString;
-//static QCString     colsInAlphaIndexString;
 static QCString     tabSizeString;
 static QCString     colsInAlphaIndexString;
 static QCString     maxDotGraphWidthString;
@@ -279,15 +279,17 @@ static int yyread(char *buf,int max_size)
 <Start>"RTF_OUTPUT"[ \t]*"="            { BEGIN(GetString); s=&Config::rtfOutputDir; s->resize(0); }
 <Start>"COMPACT_RTF"[ \t]*"="           { BEGIN(GetBool); b=&Config::compactRTFFlag; }
 <Start>"RTF_HYPERLINKS"[ \t]*"="        { BEGIN(GetBool); b=&Config::rtfHyperFlag; }
+<Start>"RTF_STYLESHEET_FILE"[ \t]*"="   { BEGIN(GetString); s=&Config::rtfStylesheetFile; s->resize(0); }
 <Start>"GENERATE_MAN"[ \t]*"="          { BEGIN(GetBool); b=&Config::generateMan; }
 <Start>"MAN_OUTPUT"[ \t]*"="            { BEGIN(GetString); s=&Config::manOutputDir; s->resize(0); }
 <Start>"MAN_EXTENSION"[ \t]*"="         { BEGIN(GetString); s=&Config::manExtension; s->resize(0); }
 <Start>"ENABLE_PREPROCESSING"[ \t]*"="  { BEGIN(GetBool); b=&Config::preprocessingFlag; }
 <Start>"MACRO_EXPANSION"[ \t]*"="       { BEGIN(GetBool); b=&Config::macroExpansionFlag; }
+<Start>"EXPAND_ONLY_PREDEF"[ \t]*"="    { BEGIN(GetBool); b=&Config::onlyPredefinedFlag; }
 <Start>"SEARCH_INCLUDES"[ \t]*"="       { BEGIN(GetBool); b=&Config::searchIncludeFlag; }
 <Start>"INCLUDE_PATH"[ \t]*"="          { BEGIN(GetStrList); l=&Config::includePath; l->clear(); elemStr=""; }
 <Start>"PREDEFINED"[ \t]*"="            { BEGIN(GetStrList); l=&Config::predefined; l->clear(); elemStr=""; }
-<Start>"EXPAND_ONLY_PREDEF"[ \t]*"="    { BEGIN(GetBool); b=&Config::onlyPredefinedFlag; }
+<Start>"EXPAND_AS_DEFINED"[ \t]*"="     { BEGIN(GetStrList); l=&Config::expandAsDefinedList; l->clear(); elemStr=""; }
 <Start>"TAGFILES"[ \t]*"="              { BEGIN(GetStrList); l=&Config::tagFileList; l->clear(); elemStr=""; }
 <Start>"GENERATE_TAGFILE"[ \t]*"="      { BEGIN(GetString); s=&Config::genTagFile; s->resize(0); }
 <Start>"ALLEXTERNALS"[ \t]*"="          { BEGIN(GetBool); b=&Config::allExtFlag; }
@@ -546,6 +548,7 @@ void dumpConfig()
   printf("rtfOutputDir=`%s'\n",Config::rtfOutputDir.data());
   printf("compactRTFFlag=`%d'\n",Config::compactRTFFlag);
   printf("rtfHyperFlag=`%d'\n",Config::rtfHyperFlag);
+  printf("rtfStylesheetFile=`%s'\n",Config::rtfStylesheetFile.data());
   printf("# configuration options related to the man page output\n");
   printf("generateMan=`%d'\n",Config::generateMan);
   printf("manOutputDir=`%s'\n",Config::manOutputDir.data());
@@ -553,6 +556,7 @@ void dumpConfig()
   printf("# Configuration options related to the preprocessor   \n");
   printf("preprocessingFlag=`%d'\n",Config::preprocessingFlag);
   printf("macroExpansionFlag=`%d'\n",Config::macroExpansionFlag);
+  printf("onlyPredefinedFlag=`%d'\n",Config::onlyPredefinedFlag);
   printf("searchIncludeFlag=`%d'\n",Config::searchIncludeFlag);
   {
     char *is=Config::includePath.first();
@@ -570,7 +574,14 @@ void dumpConfig()
       is=Config::predefined.next();
     }
   }
-  printf("onlyPredefinedFlag=`%d'\n",Config::onlyPredefinedFlag);
+  {
+    char *is=Config::expandAsDefinedList.first();
+    while (is)
+    {
+      printf("expandAsDefinedList=`%s'\n",is);
+      is=Config::expandAsDefinedList.next();
+    }
+  }
   printf("# Configuration::addtions related to external references   \n");
   {
     char *is=Config::tagFileList.first();
@@ -677,15 +688,17 @@ void Config::init()
   Config::rtfOutputDir = "rtf";
   Config::compactRTFFlag = FALSE;
   Config::rtfHyperFlag = FALSE;
+  Config::rtfStylesheetFile.resize(0);
   Config::generateMan = TRUE;
   Config::manOutputDir = "man";
   Config::manExtension = ".3";
   Config::preprocessingFlag = TRUE;
   Config::macroExpansionFlag = FALSE;
+  Config::onlyPredefinedFlag = FALSE;
   Config::searchIncludeFlag = TRUE;
   Config::includePath.clear();
   Config::predefined.clear();
-  Config::onlyPredefinedFlag = FALSE;
+  Config::expandAsDefinedList.clear();
   Config::tagFileList.clear();
   Config::genTagFile.resize(0);
   Config::allExtFlag = FALSE;
@@ -1556,6 +1569,17 @@ void writeTemplateConfig(QFile *f,bool sl)
   if (!sl)
   {
     t << "\n";
+    t << "# Load stylesheet definitions from file. Syntax is similar to doxygen's \n";
+    t << "# config file, i.e. a series of assigments. You only have to provide \n";
+    t << "# replacements, missing definitions are set to their default value. \n";
+    t << "\n";
+  }
+  t << "RTF_STYLESHEET_FILE   = ";
+  writeStringValue(t,Config::rtfStylesheetFile);
+  t << "\n";
+  if (!sl)
+  {
+    t << "\n";
   }
   t << "#---------------------------------------------------------------------------\n";
   t << "# configuration options related to the man page output\n";
@@ -1614,7 +1638,8 @@ void writeTemplateConfig(QFile *f,bool sl)
     t << "\n";
     t << "# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro \n";
     t << "# names in the source code. If set to NO (the default) only conditional \n";
-    t << "# compilation will be performed. \n";
+    t << "# compilation will be performed. Macro expansion can be done in a controlled \n";
+    t << "# way by setting EXPAND_ONLY_PREDEF to YES. \n";
     t << "\n";
   }
   t << "MACRO_EXPANSION       = ";
@@ -1623,6 +1648,17 @@ void writeTemplateConfig(QFile *f,bool sl)
   if (!sl)
   {
     t << "\n";
+    t << "# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES \n";
+    t << "# then the macro expansion is limited to the macros specified with the \n";
+    t << "# PREDEFINED and EXPAND_AS_PREDEFINED tags. \n";
+    t << "\n";
+  }
+  t << "EXPAND_ONLY_PREDEF    = ";
+  writeBoolValue(t,Config::onlyPredefinedFlag);
+  t << "\n";
+  if (!sl)
+  {
+    t << "\n";
     t << "# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files \n";
     t << "# in the INCLUDE_PATH (see below) will be search if a #include is found. \n";
     t << "\n";
@@ -1657,13 +1693,14 @@ void writeTemplateConfig(QFile *f,bool sl)
   if (!sl)
   {
     t << "\n";
-    t << "# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES \n";
-    t << "# then the macro expansion is limited to the macros specified with the \n";
-    t << "# PREDEFINED tag. \n";
+    t << "# If the MACRO_EXPANSION and EXPAND_PREDEF_ONLY tags are set to YES then \n";
+    t << "# this tag can be used to specify a list of macro names that should be expanded. \n";
+    t << "# The macro definition that is found in the sources will be used. \n";
+    t << "# Use the PREDEFINED tag if you want to use a different macro definition. \n";
     t << "\n";
   }
-  t << "EXPAND_ONLY_PREDEF    = ";
-  writeBoolValue(t,Config::onlyPredefinedFlag);
+  t << "EXPAND_AS_DEFINED     = ";
+  writeStringList(t,Config::expandAsDefinedList);
   t << "\n";
   if (!sl)
   {
@@ -1942,6 +1979,56 @@ void configStrToVal()
     }
     Config::colsInAlphaIndex=cols;
   }
+  
+  if (maxDotGraphWidthString.isEmpty())
+  {
+    Config::maxDotGraphWidth=1024;
+  }
+  else
+  {
+    bool ok;
+    int width =maxDotGraphWidthString.toInt(&ok);
+    if (!ok)
+    {
+      warn_cont("Warning: argument of MAX_DOT_GRAPH_WIDTH is not a valid number in the range [1..20]!\n"
+	   "Using the default of 1024 pixels!\n");
+      width=1024;
+    }
+    else if (width<250) // clip to lower bound
+    {
+      width=250;
+    }
+    else if (width>30000) // clip to upper bound
+    {
+      width=30000;
+    }
+    Config::maxDotGraphWidth=width;
+  }
+
+  if (maxDotGraphHeightString.isEmpty())
+  {
+    Config::maxDotGraphHeight=1024;
+  }
+  else
+  {
+    bool ok;
+    int height =maxDotGraphHeightString.toInt(&ok);
+    if (!ok)
+    {
+      warn_cont("Warning: argument of MAX_DOT_GRAPH_WIDTH is not a valid number in the range [1..20]!\n"
+	   "Using the default of 1024 pixels!\n");
+      height=1024;
+    }
+    else if (height<250) // clip to lower bound
+    {
+      height=250;
+    }
+    else if (height>30000) // clip to upper bound
+    {
+      height=30000;
+    }
+    Config::maxDotGraphHeight=height;
+  }
 }
 
 static void substEnvVarsInString(QCString &s)
@@ -2073,10 +2160,12 @@ void substituteEnvironmentVars()
   substEnvVarsInStrList( Config::extraPackageList );
   substEnvVarsInString( Config::latexHeaderFile );
   substEnvVarsInString( Config::rtfOutputDir );
+  substEnvVarsInString( Config::rtfStylesheetFile );
   substEnvVarsInString( Config::manOutputDir );
   substEnvVarsInString( Config::manExtension );
   substEnvVarsInStrList( Config::includePath );
   substEnvVarsInStrList( Config::predefined );
+  substEnvVarsInStrList( Config::expandAsDefinedList );
   substEnvVarsInStrList( Config::tagFileList );
   substEnvVarsInString( Config::genTagFile );
   substEnvVarsInString( Config::perlPath );
diff --git a/src/definition.cpp b/src/definition.cpp
index 629a45a..1d663ab 100644
--- a/src/definition.cpp
+++ b/src/definition.cpp
@@ -143,7 +143,7 @@ static bool readCodeFragment(const char *fileName,
     {
       // skip until the opening bracket or lonely : is found
       bool found=FALSE;
-      char cn;
+      char cn=0;
       while (lineNr<=endLine && !f.atEnd() && !found)
       {
         while ((c=f.getch())!='{' && c!=':' && c!=-1) if (c=='\n') lineNr++; 
diff --git a/src/dot.cpp b/src/dot.cpp
index a85e9bd..207aa38 100644
--- a/src/dot.cpp
+++ b/src/dot.cpp
@@ -996,7 +996,8 @@ static void findMaximalDotGraph(DotNode *root,
     readBoundingBoxDot(baseName+"_tmp.dot",&width,&height);
     width  = width *96/72; // 96 pixels/inch, 72 points/inch
     height = height*96/72; // 96 pixels/inch, 72 points/inch
-    //printf("Found bounding box (%d,%d)\n",width,height);
+    //printf("Found bounding box (%d,%d) max (%d,%d)\n",width,height,
+    //    Config::maxDotGraphWidth,Config::maxDotGraphHeight);
     
     lastFit=(width<Config::maxDotGraphWidth && height<Config::maxDotGraphHeight);
     if (lastFit) // image is small enough
diff --git a/src/doxygen.cpp b/src/doxygen.cpp
index 39e5f8a..31e012b 100644
--- a/src/doxygen.cpp
+++ b/src/doxygen.cpp
@@ -81,10 +81,6 @@ MemberNameDict functionNameDict(10007); // all functions
 StringDict     substituteDict(1009);    // class name substitutes
 SectionDict    sectionDict(257);        // all page sections
 StringDict     excludeNameDict(1009);   // sections
-//FileNameDict   inputNameDict(1009);     // sections
-//FileNameDict   includeNameDict(1009);   // include names
-//FileNameDict   exampleNameDict(1009);   // examples
-//FileNameDict   imageNameDict(257);      // images
 FileNameDict   *inputNameDict;          // sections
 FileNameDict   *includeNameDict;        // include names
 FileNameDict   *exampleNameDict;        // examples
@@ -96,6 +92,7 @@ FormulaDict    formulaNameDict(1009);   // the label name of all formulas
 StringDict     tagDestinationDict(257); // all tag locations
                                         // a member group
 QDict<void>    compoundKeywordDict(7);  // keywords recognised as compounds
+QDict<void>    expandAsDefinedDict(257); // all macros that should be expanded
 OutputList     *outputList = 0;         // list of output generating objects
 
 PageInfo       *mainPage = 0;
@@ -906,6 +903,15 @@ static MemberDef *addVariableToClass(
       root->protection,
       fromAnnScope
               );
+
+  // class friends may be templatized
+  //QCString name=n;
+  //int i;
+  //if (root->type.left(7)=="friend " && (i=name.find('<'))!=-1)
+  //{
+  //  name=name.left(i); 
+  //} 
+  
   // add template names, if the class is a non-specialized template
   //if (scope.find('<')==-1 && cd->templateArguments())
   //{
@@ -1332,7 +1338,7 @@ static void buildMemberList(Entry *root)
       
       ClassDef *cd=0;
       // check if this function's parent is a class
-      QRegExp re("([a-zA-Z0-9: ]*[ *]*[ ]*");
+      QRegExp re("([a-z_A-Z0-9: ]*[ *]*[ ]*");
       //printf("root->parent=`%s' cd=%p root->type.find(re,0)=%d\n",
       //    root->parent->name.data(),getClass(root->parent->name),
       //    root->type.find(re,0));
@@ -1896,7 +1902,7 @@ static bool findBaseClassRelation(Entry *root,ClassDef *cd,
             templSpec=baseClassName.mid(i,e-i);
             baseClassName=baseClassName.left(i)+baseClassName.right(baseClassName.length()-e);
             baseClass=getResolvedClass(baseClassName);
-            //printf("baseClass=%p baseClass=%s templSpec=%s\n",
+            //printf("baseClass=%p -> baseClass=%s templSpec=%s\n",
             //      baseClass,baseClassName.data(),templSpec.data());
           }
         }
@@ -2823,10 +2829,10 @@ static void findMember(Entry *root,QCString funcDecl,QCString related,bool overl
   { 
     Debug::print(Debug::FindMembers,0,
                  "1. funcName=`%s'\n",funcName.data());
-    //if (!funcTempList.isEmpty()) // try with member specialization
-    //{
-    //  mn=memberNameDict[funcName+funcTempList];
-    //}
+    if (!funcTempList.isEmpty()) // try with member specialization
+    {
+      mn=memberNameDict[funcName+funcTempList];
+    }
     if (mn==0) // try without specialization
     {
       mn=memberNameDict[funcName];
@@ -2978,15 +2984,39 @@ static void findMember(Entry *root,QCString funcDecl,QCString related,bool overl
                "Warning: no matching class member found for \n  %s",
                fullFuncDecl.data()
               );   
+          int candidates=0;
           if (mn->count()>0)
           {
+            md=mn->first();
+            while (md)
+            {
+              ClassDef *cd=md->memberClass();
+              if (cd!=0 && cd->name()==className) candidates++;
+              md=mn->next();
+            }
+          }
+          if (candidates>0)
+          {
             warn_cont("Possible candidates:\n");
             md=mn->first();
             while (md)
             {
               ClassDef *cd=md->memberClass();
-              if (!cd || cd->name()==className)
-                warn_cont("  %s\n",md->declaration());
+              if (cd!=0 && cd->name()==className)
+              {
+                warn_cont("  %s",md->declaration());
+#if 0
+                if (cd->name().at(0)!='@')
+                {
+                  warn_cont(" in class %s",cd->name().data());
+                }
+                if (!md->getDefFileName().isEmpty() && md->getDefLine()!=-1)
+                {
+                  warn_cont(" defined at line %d of file %s",md->getDefLine(),md->getDefFileName().data());
+                }
+#endif
+                warn_cont("\n");
+              }
               md=mn->next();
             }
           }
@@ -3207,7 +3237,7 @@ static void findMember(Entry *root,QCString funcDecl,QCString related,bool overl
 static void findMemberDocumentation(Entry *root)
 {
   int i=-1,l;
-  QRegExp re("([a-zA-Z0-9: ]*\\*+[ \\*]*");
+  QRegExp re("([a-z_A-Z0-9: ]*\\*+[ \\*]*");
   Debug::print(Debug::FindMembers,0,
          "root->type=`%s' root->inside=`%s' root->name=`%s' root->args=`%s' section=%x root->memSpec=%d root->mGrpId=%d\n",
           root->type.data(),root->inside.data(),root->name.data(),root->args.data(),root->section,root->memSpec,root->mGrpId
@@ -4374,6 +4404,12 @@ static void generateGroupDocs()
   {
     //printf("group %s #members=%d\n",gd->name().data(),gd->countMembers());
     if (gd->countMembers()>0) gd->writeDocumentation(*outputList);
+    else
+    {
+      warn(gd->getDefFileName(),gd->getDefLine(),
+           "Warning: group %s does not have any (documented) members.",
+            gd->name().data());
+    }
   }
 }
 
@@ -4540,7 +4576,8 @@ static void generateSearchIndex()
     if (f.open(IO_WriteOnly))
     {
       QTextStream t(&f);
-      t << Config::docURL << endl << Config::cgiURL << "/" << Config::cgiName << endl;
+      t << Config::docURL << endl << Config::cgiURL 
+        << "/" << Config::cgiName << endl;
       f.close();
     }
     else
@@ -5276,9 +5313,21 @@ int main(int argc,char **argv)
                                    &inputFiles,0);
     s=Config::inputSources.next();
   }
-  //msg("Input size %d bytes\n",inputSize);
+  
+  // add predefined macro name to a dictionary
+  s=Config::expandAsDefinedList.first();
+  while (s)
+  {
+    if (expandAsDefinedDict[s]==0)
+    {
+      expandAsDefinedDict.insert(s,(void *)666);
+    }
+    s=Config::expandAsDefinedList.next();
+  }
   
   BufStr input(inputSize+1); // Add one byte extra for \0 termination
+
+  // read and preprocess all input files
   readFiles(input);
 
   if (input.isEmpty())
@@ -5288,9 +5337,10 @@ int main(int argc,char **argv)
   }
   else
   {
-    msg("Read %d bytes\n",input.length());
+    msg("Read %d bytes\n",input.curPos());
   }
 
+
   /**************************************************************************
    *             Handle Tag Files                                           *
    **************************************************************************/
diff --git a/src/doxygen.h b/src/doxygen.h
index 87c4592..f48896c 100644
--- a/src/doxygen.h
+++ b/src/doxygen.h
@@ -126,6 +126,7 @@ extern PageInfo *mainPage;
 extern StringDict tagDestinationDict; 
 extern QIntDict<QCString> memberHeaderDict; // dictionary of the member groups heading
 extern QIntDict<QCString> memberDocDict;    // dictionary of the member groups heading
+extern QDict<void> expandAsDefinedDict;
 
 extern int annotatedClasses;
 extern int hierarchyClasses;
diff --git a/src/doxytag.l b/src/doxytag.l
index 76772a7..001b756 100644
--- a/src/doxytag.l
+++ b/src/doxytag.l
@@ -203,7 +203,7 @@ QCString unhtmlify(const char *str)
 <Start>^"<h1 align=center>"	   { // Qt variant
   				     BEGIN( ReadClassName );
 			           }
-<Start>^"<h1>"	   		   { // Doxygen variant
+<Start>^("<hr>")?"<h1>"	  	   { // Doxygen variant
   				     BEGIN( ReadClassName );
 			           }
 <Start>^"Inherits "		   {
@@ -223,7 +223,7 @@ QCString unhtmlify(const char *str)
   				     BEGIN( SkipHTMLTag ); 
 				   }
 <Start>"&"[a-zA-Z]+";"
-<Start>[a-z_A-Z][a-z_A-Z0-9]*	   {
+<Start,SkipPreformated>[a-z_A-Z][a-z_A-Z0-9]*	   {
   				     //printf("tag: %s#%s ref: %s word: `%s'\n",
 				     // docBaseLink.data(),docAnchor.data(),
 				     // docRefName.data(),yytext);
@@ -235,7 +235,7 @@ QCString unhtmlify(const char *str)
 <SkipPreformated>"</pre>"	   {
   				     BEGIN( Start );
   				   }
-<SkipPreformated>[^\<]+		   
+<SkipPreformated>[^\<\n]+		   
 <CheckConstructor>[a-z_A-Z0-9~:]+  {
   				     QCString s=yytext;
 				     if (s.find("::")!=-1)
diff --git a/src/htmlgen.cpp b/src/htmlgen.cpp
index 977e011..52abbff 100644
--- a/src/htmlgen.cpp
+++ b/src/htmlgen.cpp
@@ -80,7 +80,8 @@ void HtmlGenerator::startFile(const char *name,const char *title,bool external)
          "<title>" << title << "</title>\n";
     t << "<link ";
     if (external) 
-      t << "doxygen=\"_doc:\" href=\"/";
+      t << "doxygen=\"_doc:" << Config::docURL 
+        << "\" href=\"" << Config::docURL << "/";
     else
       t << "href=\"";
     if (Config::htmlStyleSheet.isEmpty())
@@ -147,7 +148,8 @@ void HtmlGenerator::writeFooter(int part,bool external)
         t << endl << "<img ";
         if (external)
         {
-          t << "doxygen=\"_doc:\" src=\"/";
+          t << "doxygen=\"_doc:" << Config::docURL 
+            << "\" src=\"" << Config::docURL << "/";
         }
         else
         {
diff --git a/src/index.cpp b/src/index.cpp
index 06ab9ac..aabdcdc 100644
--- a/src/index.cpp
+++ b/src/index.cpp
@@ -547,7 +547,7 @@ int countNamespaces()
   NamespaceDef *nd;
   for (;(nd=nli.current());++nli)
   {
-    if (nd->isLinkableInProject()) count++;
+    if (nd->isLinkableInProject() && nd->countMembers()>0) count++;
   }
   return count;
 }
@@ -583,7 +583,7 @@ void writeNamespaceIndex(OutputList &ol)
   NamespaceDef *nd=namespaceList.first();
   while (nd)
   {
-    if (nd->isLinkableInProject())
+    if (nd->isLinkableInProject() && nd->countMembers()>0)
     {
       ol.writeStartAnnoItem("namespace",nd->getOutputFileBase(),0,nd->name());
       ol.docify(" (");
@@ -1456,7 +1456,6 @@ int countGroups()
   for (;(gd=gli.current());++gli)
   {
     if (gd->countMembers()>0) count++;
-    gd=groupList.next();
   }
   return count;
 }
@@ -1513,7 +1512,6 @@ void writeGroupIndex(OutputList &ol)
     htmlHelp->incContentsDepth();
   }
   parseText(ol,theTranslator->trModulesDescription());
-  //ol.newParagraph();
   ol.endTextBlock();
   writeGroupList(ol);
   if (hasHtmlHelp)
@@ -1521,7 +1519,6 @@ void writeGroupIndex(OutputList &ol)
     htmlHelp->decContentsDepth();
   }
   endFile(ol);
-  //ol.enable(OutputGenerator::Man);
   ol.popGeneratorState();
 }
 
diff --git a/src/language.cpp b/src/language.cpp
index 31e0e6e..27b6c7c 100644
--- a/src/language.cpp
+++ b/src/language.cpp
@@ -15,6 +15,7 @@
  *
  */
 
+#include "message.h"
 #include "language.h"
 #if !defined(ENGLISH_ONLY)
 #include "translator_nl.h"
@@ -51,6 +52,10 @@ bool setTranslator(const char *langName)
   }
   else if (L_EQUAL("czech"))
   {
+#ifndef _WIN32
+    err("Warning: The Czech translation uses the windows code page 1250 encoding.\n"
+        "Please convert translator_cz.h to ISO Latin-2 to use it under UNIX.\n");
+#endif
     theTranslator=new TranslatorCzech;
   }
   else if (L_EQUAL("french"))
diff --git a/src/latexgen.cpp b/src/latexgen.cpp
index 192e6d4..f3d8110 100644
--- a/src/latexgen.cpp
+++ b/src/latexgen.cpp
@@ -216,17 +216,37 @@ void LatexGenerator::startIndexSection(IndexSections is)
               << "            linkcolor=blue" << endl
               << "           ]{hyperref}" << endl;
           }
-          if (!theTranslator->latexBabelPackage().isEmpty())
+          // Try to get the command for switching on the language
+          // support
+          QCString sLanguageSupportCommand(
+              theTranslator->latexLanguageSupportCommand());
+
+          if (!sLanguageSupportCommand.isEmpty())
+          {
+            // The command is not empty. The language does
+            // not want to use the babel package. Use this
+            // command instead.
+            t << sLanguageSupportCommand;
+          }
+          else
           {
-            if (theTranslator->latexBabelPackage()=="russian")
+            if (!theTranslator->latexBabelPackage().isEmpty())
             {
+              // The result of the LatexLanguageSupportCommand()
+              // is empty, which means that the language prefers
+              // the babel package, or no package is needed at all.
+              if (theTranslator->latexBabelPackage()=="russian")
+              {
+                // The russian babel package also needs an encoding.
+                // Assume the encoding matched the platform.
 #if defined(_WIN32)
-              t << "\\usepackage[cp1251]{inputenc}\n";
+                t << "\\usepackage[cp1251]{inputenc}\n";
 #else
-              t << "\\usepackage[koi8-r]{inputenc}\n";
+                t << "\\usepackage[koi8-r]{inputenc}\n";
 #endif
+              }
+              t << "\\usepackage[" << theTranslator->latexBabelPackage() << "]{babel}\n";
             }
-            t << "\\usepackage[" << theTranslator->latexBabelPackage() << "]{babel}\n";
           }
 
           const char *s=Config::extraPackageList.first();
@@ -425,7 +445,7 @@ void LatexGenerator::endIndexSection(IndexSections is)
         bool found=FALSE;
         while (gd && !found)
         {
-          if (gd->isLinkableInProject() || gd->countMembers()>0)
+          if (gd->countMembers()>0)
           {
             t << "}\n\\input{" << gd->getOutputFileBase() << "}\n";
             found=TRUE;
@@ -434,7 +454,7 @@ void LatexGenerator::endIndexSection(IndexSections is)
         }
         while (gd)
         {
-          if (gd->isLinkableInProject() || gd->countMembers()>0)
+          if (gd->countMembers()>0)
           {
             if (Config::compactLatexFlag) t << "\\input"; else t << "\\include";
             t << "{" << gd->getOutputFileBase() << "}\n";
@@ -602,14 +622,14 @@ void LatexGenerator::writeStyleInfo(int part)
       break;
     case 2:
       {
-        t << " Dimitri van Heesch (c) 1997-2000}]{}\n";
+        t << " Dimitri van Heesch \\copyright{} 1997-2000}]{}\n";
         //QCString dtString=dateToString(FALSE);
         t << "\\lfoot[]{\\fancyplain{}{\\bfseries\\scriptsize ";
       }
       break;
     case 4:
       {
-        t << " Dimitri van Heesch (c) 1997-2000}}\n";
+        t << " Dimitri van Heesch \\copyright{} 1997-2000}}\n";
         t << "\\cfoot{}\n";
         t << "\\newenvironment{CompactList}\n";
         t << "{\\begin{list}{}{\n";
@@ -812,7 +832,7 @@ void LatexGenerator::startPageRef()
 
 void LatexGenerator::endPageRef(const char *clname, const char *anchor)
 {
-  t << "~\\pageref{";
+  t << "\\,\\pageref{";
   if (clname) t << clname; 
   if (anchor) t << "_" << anchor;
   t << "})}";
@@ -998,7 +1018,8 @@ void LatexGenerator::writeSectionRef(const char *,const char *lab,
   {
     if (strcmp(lab,text)!=0) // lab!=text
     {
-      t << "{\\bf " << text << " (\\ref " << lab << ")}}";
+      // todo: don't hardcode p. here!
+      t << "{\\bf " << text << "} (p.\\,\\pageref{" << lab << "})";
     }
     else
     {
@@ -1022,7 +1043,7 @@ void LatexGenerator::writeSectionRefAnchor(const char *,const char *lab,
   startBold();
   docify(title);
   endBold();
-  t << " (p.~\\pageref{" << lab << "})" << endl;
+  t << " (p.\\,\\pageref{" << lab << "})" << endl;
 }
 
 //void LatexGenerator::docify(const char *str)
@@ -1033,9 +1054,10 @@ void LatexGenerator::writeSectionRefAnchor(const char *,const char *lab,
 //void LatexGenerator::docifyStatic(QTextStream &t,const char *str)
 void LatexGenerator::docify(const char *str)
 {
-  static bool isJapanese = theTranslator->latexBabelPackage()=="a4j";
-  static bool isRussian  = theTranslator->latexBabelPackage()=="russian";
-  static bool isGerman   = theTranslator->latexBabelPackage()=="german";
+  static bool isCzech    = theTranslator->idLanguage()=="czech";
+  static bool isJapanese = theTranslator->idLanguage()=="japanese";
+  static bool isRussian  = theTranslator->idLanguage()=="russian";
+  static bool isGerman   = theTranslator->idLanguage()=="german";
   if (str)
   {
     const unsigned char *p=(const unsigned char *)str;
diff --git a/src/memberdef.cpp b/src/memberdef.cpp
index f08a858..2980a73 100644
--- a/src/memberdef.cpp
+++ b/src/memberdef.cpp
@@ -445,8 +445,9 @@ void MemberDef::setMemberDefTemplateArguments(ArgumentList *tal)
 void MemberDef::writeLink(OutputList &ol,ClassDef *cd,NamespaceDef *nd,
                       FileDef *fd,GroupDef *gd)
 {
-  Definition *d;
+  Definition *d=0;
   if (cd) d=cd; else if (nd) d=nd; else if (fd) d=fd; else if (gd) d=gd;
+  if (d==0) return;
   ol.writeObjectLink(d->getReference(),d->getOutputFileBase(),anchor(),name());
 }
 
diff --git a/src/pre.l b/src/pre.l
index 11efd91..66eebfb 100644
--- a/src/pre.l
+++ b/src/pre.l
@@ -758,6 +758,10 @@ Define *newDefine()
   def->fileName = g_yyFileName; 
   def->lineNr = g_yyLineNr;
   def->varArgs = g_defVarArgs;
+  if (!def->name.isEmpty() && expandAsDefinedDict[def->name])
+  {
+    def->isPredefined=TRUE;
+  }
   return def;
 }
 
@@ -1505,7 +1509,8 @@ BN	[ \t\r\n]
 					  {
 					    addDefine();
 					  }
-					  if (/*!Config::onlyPredefinedFlag &&*/ (def=g_fileDefineDict->find(g_defName))==0)
+					  def=g_fileDefineDict->find(g_defName);
+					  if (def==0) // new define
 					  {
 					    g_fileDefineDict->insert(g_defName,newDefine());
 					  }
diff --git a/src/rtfgen.cpp b/src/rtfgen.cpp
index 9ac69cf..c249539 100644
--- a/src/rtfgen.cpp
+++ b/src/rtfgen.cpp
@@ -4,6 +4,8 @@
  *
  * Copyright (C) 1997-2000 by Parker Waechter & Dimitri van Heesch.
  *
+ * Style sheet additions by Alexander Bartolich
+ *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
  * granted. No representations are made about the suitability of this software 
@@ -19,7 +21,7 @@
 
 #include "qtbc.h"
 #include <qdir.h>
-#include <qstack.h>
+#include <qregexp.h>
 
 #include "rtfgen.h"
 #include "config.h"
@@ -112,6 +114,277 @@ OutputGenerator *RTFGenerator::copy()
   return result;
 }
 
+static const struct
+{
+  const char *name;
+  const char *value;
+} Rtf_Style_Default[] =
+{
+  { "Reset",
+    "\\pard\\plain "
+  },
+  { "Heading1",
+    "\\s1\\sb240\\sa60\\keepn\\widctlpar\\adjustright \\b\\f1\\fs36\\kerning36\\cgrid "
+  },
+  { "Heading2",
+    "\\s2\\sb240\\sa60\\keepn\\widctlpar\\adjustright \\b\\f1\\fs28\\kerning28\\cgrid "
+  },
+  { "Heading3",
+    "\\s3\\sb240\\sa60\\keepn\\widctlpar\\adjustright \\b\\f1\\cgrid "
+  },
+  { "Heading4",
+    "\\s4\\sb240\\sa60\\keepn\\widctlpar\\adjustright \\b\\f1\\fs20\\cgrid "
+  },
+  { "Title",
+    "\\s15\\qc\\sb240\\sa60\\widctlpar\\outlinelevel0\\adjustright \\b\\f1\\fs32\\kerning28\\cgrid "
+  },
+  { "SubTitle",
+    "\\s16\\qc\\sa60\\widctlpar\\outlinelevel1\\adjustright \\f1\\cgrid "
+  },
+  { "BodyText",
+    "\\s17\\sa60\\sb30\\widctlpar\\qj \\fs22\\cgrid "
+  },
+  { "DenseText",
+    "\\s18\\widctlpar\\fs22\\cgrid "
+  },
+  { "Header",
+    "\\s28\\widctlpar\\tqc\\tx4320\\tqr\\tx8640\\adjustright \\fs20\\cgrid "
+  },
+  { "Footer",
+    "\\s29\\widctlpar\\tqc\\tx4320\\tqr\\tx8640\\qr\\adjustright \\fs20\\cgrid "
+  },
+  { "GroupHeader",
+    "\\s30\\li360\\sa60\\sb120\\keepn\\widctlpar\\adjustright \\b\\f1\\fs20\\cgrid "
+  },
+  { "CodeExample0",  
+    "\\s40\\li0\\widctlpar\\adjustright \\shading1000\\cbpat8 \\f2\\fs16\\cgrid "
+  },
+  { "CodeExample1",  
+    "\\s41\\li360\\widctlpar\\adjustright \\shading1000\\cbpat8 \\f2\\fs16\\cgrid "
+  },
+  { "CodeExample2",    
+    "\\s42\\li720\\widctlpar\\adjustright \\shading1000\\cbpat8 \\f2\\fs16\\cgrid "
+  },
+  { "CodeExample3",  
+    "\\s43\\li1080\\widctlpar\\adjustright \\shading1000\\cbpat8 \\f2\\fs16\\cgrid "
+  },
+  { "CodeExample4",  
+    "\\s44\\li1440\\widctlpar\\adjustright \\shading1000\\cbpat8 \\f2\\fs16\\cgrid "
+  },
+  { "CodeExample5",    
+    "\\s45\\li1800\\widctlpar\\adjustright \\shading1000\\cbpat8 \\f2\\fs16\\cgrid "
+  },
+  { "CodeExample6",     
+    "\\s46\\li2160\\widctlpar\\adjustright \\shading1000\\cbpat8 \\f2\\fs16\\cgrid "
+  },
+  { "CodeExample7",    
+    "\\s47\\li2520\\widctlpar\\adjustright \\shading1000\\cbpat8 \\f2\\fs16\\cgrid "
+  },
+  { "CodeExample8",    
+    "\\s48\\li2880\\widctlpar\\adjustright \\shading1000\\cbpat8 \\f2\\fs16\\cgrid "
+  },
+  { "CodeExample9",
+    "\\s49\\li3240\\widctlpar\\adjustright \\shading1000\\cbpat8 \\f2\\fs16\\cgrid "
+  },
+  { "ListContinue0",
+    "\\s50\\li0\\sa60\\sb30\\qj\\widctlpar\\qj\\adjustright \\fs20\\cgrid "
+  },
+  { "ListContinue1",  
+    "\\s51\\li360\\sa60\\sb30\\qj\\widctlpar\\qj\\adjustright \\fs20\\cgrid "
+  },
+  { "ListContinue2",  
+    "\\s52\\li720\\sa60\\sb30\\qj\\widctlpar\\qj\\adjustright \\fs20\\cgrid "
+  },
+  { "ListContinue3",  
+    "\\s53\\li1080\\sa60\\sb30\\qj\\widctlpar\\qj\\adjustright \\fs20\\cgrid "
+  },
+  { "ListContinue4",  
+    "\\s54\\li1440\\sa60\\sb30\\qj\\widctlpar\\qj\\adjustright \\fs20\\cgrid "
+  },
+  { "ListContinue5",  
+    "\\s55\\li1800\\sa60\\sb30\\qj\\widctlpar\\qj\\adjustright \\fs20\\cgrid "
+  },
+  { "ListContinue6",  
+    "\\s56\\li2160\\sa60\\sb30\\qj\\widctlpar\\qj\\adjustright \\fs20\\cgrid "
+  },
+  { "ListContinue7",  
+    "\\s57\\li2520\\sa60\\sb30\\qj\\widctlpar\\qj\\adjustright \\fs20\\cgrid "
+  },
+  { "ListContinue8",  
+    "\\s58\\li2880\\sa60\\sb30\\qj\\widctlpar\\qj\\adjustright \\fs20\\cgrid "
+  },
+  { "ListContinue9",  
+    "\\s59\\li3240\\sa60\\sb30\\qj\\widctlpar\\qj\\adjustright \\fs20\\cgrid "
+  },
+  { "DescContinue0",
+    "\\s60\\li0\\widctlpar\\ql\\adjustright \\fs20\\cgrid "
+  },
+  { "DescContinue1",  
+    "\\s61\\li360\\widctlpar\\ql\\adjustright \\fs20\\cgrid "
+  },
+  { "DescContinue2",
+    "\\s62\\li720\\widctlpar\\ql\\adjustright \\fs20\\cgrid "
+  },
+  { "DescContinue3",
+    "\\s63\\li1080\\widctlpar\\ql\\adjustright \\fs20\\cgrid "
+  },
+  { "DescContinue4",
+    "\\s64\\li1440\\widctlpar\\ql\\adjustright \\fs20\\cgrid "
+  },
+  { "DescContinue5",
+    "\\s65\\li1800\\widctlpar\\ql\\adjustright \\fs20\\cgrid "
+  },
+  { "DescContinue6",
+    "\\s66\\li2160\\widctlpar\\ql\\adjustright \\fs20\\cgrid "
+  },
+  { "DescContinue7",
+    "\\s67\\li2520\\widctlpar\\ql\\adjustright \\fs20\\cgrid "
+  },
+  { "DescContinue8",
+    "\\s68\\li2880\\widctlpar\\ql\\adjustright \\fs20\\cgrid "
+  },
+  { "DescContinue9",
+    "\\s69\\li3240\\widctlpar\\ql\\adjustright \\fs20\\cgrid "
+  },
+  { "LatexTOC0",
+    "\\s70\\li0\\sa30\\sb30\\widctlpar\\tqr\\tldot\\tx8640\\adjustright \\fs20\\cgrid "
+  },
+  { "LatexTOC1",
+    "\\s71\\li360\\sa27\\sb27\\widctlpar\\tqr\\tldot\\tx8640\\adjustright \\fs20\\cgrid "
+  },
+  { "LatexTOC2",
+    "\\s72\\li720\\sa24\\sb24\\widctlpar\\tqr\\tldot\\tx8640\\adjustright \\fs20\\cgrid "
+  },
+  { "LatexTOC3",
+    "\\s73\\li1080\\sa21\\sb21\\widctlpar\\tqr\\tldot\\tx8640\\adjustright \\fs20\\cgrid "
+  },
+  { "LatexTOC4",
+    "\\s74\\li1440\\sa18\\sb18\\widctlpar\\tqr\\tldot\\tx8640\\adjustright \\fs20\\cgrid "
+  },
+  { "LatexTOC5",
+    "\\s75\\li1800\\sa15\\sb15\\widctlpar\\tqr\\tldot\\tx8640\\adjustright \\fs20\\cgrid "
+  },
+  { "LatexTOC6",
+    "\\s76\\li2160\\sa12\\sb12\\widctlpar\\tqr\\tldot\\tx8640\\adjustright \\fs20\\cgrid "
+  },
+  { "LatexTOC7",
+    "\\s77\\li2520\\sa9\\sb9\\widctlpar\\tqr\\tldot\\tx8640\\adjustright \\fs20\\cgrid "
+  },
+  { "LatexTOC8",
+    "\\s78\\li2880\\sa6\\sb6\\widctlpar\\tqr\\tldot\\tx8640\\adjustright \\fs20\\cgrid "
+  },
+  { "LatexTOC9",
+    "\\s79\\li3240\\sa3\\sb3\\widctlpar\\tqr\\tldot\\tx8640\\adjustright \\fs20\\cgrid "
+  },
+  { "ListBullet0",
+    "\\s80\\fi-360\\li360\\widctlpar\\jclisttab\\tx360{\\*\\pn \\pnlvlbody\\ilvl0\\ls1\\pnrnot0\\pndec }\\ls1\\adjustright \\fs20\\cgrid "
+  },
+  { "ListBullet1",    
+    "\\s81\\fi-360\\li720\\widctlpar\\jclisttab\\tx720{\\*\\pn \\pnlvlbody\\ilvl0\\ls2\\pnrnot0\\pndec }\\ls2\\adjustright \\fs20\\cgrid "
+  },
+  { "ListBullet2",
+    "\\s82\\fi-360\\li1080\\widctlpar\\jclisttab\\tx1080{\\*\\pn \\pnlvlbody\\ilvl0\\ls3\\pnrnot0\\pndec }\\ls3\\adjustright \\fs20\\cgrid "
+  },
+  { "ListBullet3",
+    "\\s83\\fi-360\\li1440\\widctlpar\\jclisttab\\tx1440{\\*\\pn \\pnlvlbody\\ilvl0\\ls4\\pnrnot0\\pndec }\\ls4\\adjustright \\fs20\\cgrid "
+  },
+  { "ListBullet4",
+    "\\s84\\fi-360\\li1800\\widctlpar\\jclisttab\\tx1800{\\*\\pn \\pnlvlbody\\ilvl0\\ls5\\pnrnot0\\pndec }\\ls5\\adjustright \\fs20\\cgrid "
+  },
+  { "ListBullet5",
+    "\\s85\\fi-360\\li2160\\widctlpar\\jclisttab\\tx2160{\\*\\pn \\pnlvlbody\\ilvl0\\ls6\\pnrnot0\\pndec }\\ls6\\adjustright \\fs20\\cgrid "
+  },
+  { "ListBullet6",
+    "\\s86\\fi-360\\li2520\\widctlpar\\jclisttab\\tx2520{\\*\\pn \\pnlvlbody\\ilvl0\\ls7\\pnrnot0\\pndec }\\ls7\\adjustright \\fs20\\cgrid "
+  },
+  { "ListBullet7",
+    "\\s87\\fi-360\\li2880\\widctlpar\\jclisttab\\tx2880{\\*\\pn \\pnlvlbody\\ilvl0\\ls8\\pnrnot0\\pndec }\\ls8\\adjustright \\fs20\\cgrid "
+  },
+  { "ListBullet8",
+    "\\s88\\fi-360\\li3240\\widctlpar\\jclisttab\\tx3240{\\*\\pn \\pnlvlbody\\ilvl0\\ls9\\pnrnot0\\pndec }\\ls9\\adjustright \\fs20\\cgrid "
+  },
+  { "ListBullet9",
+    "\\s89\\fi-360\\li3600\\widctlpar\\jclisttab\\tx3600{\\*\\pn \\pnlvlbody\\ilvl0\\ls10\\pnrnot0\\pndec }\\ls10\\adjustright \\fs20\\cgrid "
+  },
+  { "ListEnum0",
+    "\\s90\\fi-360\\li360\\widctlpar\\fs20\\cgrid "
+  },
+  { "ListEnum1",
+    "\\s91\\fi-360\\li720\\widctlpar\\fs20\\cgrid "
+  },
+  { "ListEnum2",
+    "\\s92\\fi-360\\li1080\\widctlpar\\fs20\\cgrid "
+  },
+  { "ListEnum3",
+    "\\s93\\fi-360\\li1440\\widctlpar\\fs20\\cgrid "
+  },
+  { "ListEnum4",
+    "\\s94\\fi-360\\li1800\\widctlpar\\fs20\\cgrid "
+  },
+  { "ListEnum4",
+    "\\s95\\fi-360\\li2160\\widctlpar\\fs20\\cgrid "
+  },
+  { "ListEnum5",
+    "\\s96\\fi-360\\li2520\\widctlpar\\fs20\\cgrid "
+  },
+  { "ListEnum6",
+    "\\s97\\fi-360\\li2880\\widctlpar\\fs20\\cgrid "
+  },
+  { "ListEnum7",
+    "\\s98\\fi-360\\li3240\\widctlpar\\fs20\\cgrid "
+  },
+  { "ListEnum8",
+    "\\s99\\fi-360\\li3600\\widctlpar\\fs20\\cgrid "
+  },
+  { 0,
+    0 
+  }
+};
+
+static QDict<char> Rtf_Style(257);
+
+static void loadStylesheet(const char *name)
+{
+  QFile file(name);
+  if (!file.open(IO_ReadOnly))
+  {
+    err("Can't open RTF style sheet file %s. Using defaults.\n",name);
+    return;
+  }
+  msg("Loading RTF style sheet %s...\n",name);
+
+  static const QRegExp separator("[ \t]*=[ \t]*");
+  uint lineNr=1;
+  QTextStream t(&file);
+  while (!t.eof())
+  {
+    QCString s(4096); // string buffer of max line length
+    s = t.readLine().stripWhiteSpace();
+    if (s.length()==0 || s.at(0)=='#') continue; // skip blanks & comments
+    int sepLength;
+    int sepStart = separator.match(s,0,&sepLength);
+    if (sepStart<=0) // no valid assignment statement
+    {
+      warn(name,lineNr,"Assignment of style sheet name expected!\n"); 
+      continue;
+    }
+    QCString key=s.left(sepStart);
+    if (Rtf_Style[key]==0) // not a valid style sheet name
+    {
+      warn(name,lineNr,"Invalid style sheet name %s ignored.\n",key.data());
+      continue;
+    }
+    s+=" "; // add command separator
+    Rtf_Style.remove(key); // remove old key
+    int l = strlen(s.data()+sepStart+sepLength);
+    char *value = new char[l+1];
+    strcpy(value,s.data()+sepStart+sepLength);
+    Rtf_Style.insert(key,value); // insert new key 
+    lineNr++;
+  }
+}
+
+
 void RTFGenerator::init()
 {
   QCString dir=Config::rtfOutputDir;
@@ -121,98 +394,31 @@ void RTFGenerator::init()
     err("Could not create output directory %s\n",dir.data());
     exit(1);
   }
+  
+  Rtf_Style.setAutoDelete(TRUE);
+  int i=0;
+  while (Rtf_Style_Default[i].name!=0)
+  {
+    int l = strlen(Rtf_Style_Default[i].value);
+    char *value = new char[l+1];
+    strcpy(value,Rtf_Style_Default[i].value);
+    Rtf_Style.insert(Rtf_Style_Default[i].name,value);
+    i++;
+  }
+
+  if (!Config::rtfStylesheetFile.isEmpty())
+  {
+    loadStylesheet(Config::rtfStylesheetFile);
+  }
 }
 
-const char *Rtf_Style_Reset     = "\\pard\\plain ";
-const char *Rtf_Style_Heading1  = "\\s1\\sb240\\sa60\\keepn\\widctlpar\\adjustright \\b\\f1\\fs36\\kerning36\\cgrid ";
-const char *Rtf_Style_Heading2  = "\\s2\\sb240\\sa60\\keepn\\widctlpar\\adjustright \\b\\f1\\fs28\\kerning28\\cgrid ";
-const char *Rtf_Style_Heading3  = "\\s3\\sb240\\sa60\\keepn\\widctlpar\\adjustright \\b\\f1\\cgrid ";
-const char *Rtf_Style_Heading4  = "\\s4\\sb240\\sa60\\keepn\\widctlpar\\adjustright \\b\\f1\\fs20\\cgrid ";
-const char *Rtf_Style_Title     = "\\s15\\qc\\sb240\\sa60\\widctlpar\\outlinelevel0\\adjustright \\b\\f1\\fs32\\kerning28\\cgrid ";
-const char *Rtf_Style_SubTitle  = "\\s16\\qc\\sa60\\widctlpar\\outlinelevel1\\adjustright \\f1\\cgrid ";
-const char *Rtf_Style_BodyText  = "\\s17\\sa60\\sb30\\widctlpar\\qj \\fs22\\cgrid ";
-const char *Rtf_Style_DenseText = "\\s18\\widctlpar\\fs22\\cgrid ";
-const char *Rtf_Style_Header    = "\\s28\\widctlpar\\tqc\\tx4320\\tqr\\tx8640\\adjustright \\fs20\\cgrid ";
-const char *Rtf_Style_Footer    = "\\s29\\widctlpar\\tqc\\tx4320\\tqr\\tx8640\\qr\\adjustright \\fs20\\cgrid ";
-const char *Rtf_Style_GroupHeader = "\\s30\\li360\\sa60\\sb120\\keepn\\widctlpar\\adjustright \\b\\f1\\fs20\\cgrid ";
-const char *Rtf_Style_CodeExample[]  = 
-{
-  "\\s40\\li0\\widctlpar\\adjustright \\shading1000\\cbpat8 \\f2\\fs16\\cgrid ",
-  "\\s41\\li360\\widctlpar\\adjustright \\shading1000\\cbpat8 \\f2\\fs16\\cgrid ",
-  "\\s42\\li720\\widctlpar\\adjustright \\shading1000\\cbpat8 \\f2\\fs16\\cgrid ",
-  "\\s43\\li1080\\widctlpar\\adjustright \\shading1000\\cbpat8 \\f2\\fs16\\cgrid ",
-  "\\s44\\li1440\\widctlpar\\adjustright \\shading1000\\cbpat8 \\f2\\fs16\\cgrid ",
-  "\\s45\\li1800\\widctlpar\\adjustright \\shading1000\\cbpat8 \\f2\\fs16\\cgrid ",
-  "\\s46\\li2160\\widctlpar\\adjustright \\shading1000\\cbpat8 \\f2\\fs16\\cgrid ",
-  "\\s47\\li2520\\widctlpar\\adjustright \\shading1000\\cbpat8 \\f2\\fs16\\cgrid ",
-  "\\s48\\li2880\\widctlpar\\adjustright \\shading1000\\cbpat8 \\f2\\fs16\\cgrid ",
-  "\\s49\\li3240\\widctlpar\\adjustright \\shading1000\\cbpat8 \\f2\\fs16\\cgrid "
-};
-const char *Rtf_Style_ListContinue[] = 
-{
-  "\\s50\\li0\\sa60\\sb30\\qj\\widctlpar\\qj\\adjustright \\fs20\\cgrid ",
-  "\\s51\\li360\\sa60\\sb30\\qj\\widctlpar\\qj\\adjustright \\fs20\\cgrid ",
-  "\\s52\\li720\\sa60\\sb30\\qj\\widctlpar\\qj\\adjustright \\fs20\\cgrid ",
-  "\\s53\\li1080\\sa60\\sb30\\qj\\widctlpar\\qj\\adjustright \\fs20\\cgrid ",
-  "\\s54\\li1440\\sa60\\sb30\\qj\\widctlpar\\qj\\adjustright \\fs20\\cgrid ",
-  "\\s55\\li1800\\sa60\\sb30\\qj\\widctlpar\\qj\\adjustright \\fs20\\cgrid ",
-  "\\s56\\li2160\\sa60\\sb30\\qj\\widctlpar\\qj\\adjustright \\fs20\\cgrid ",
-  "\\s57\\li2520\\sa60\\sb30\\qj\\widctlpar\\qj\\adjustright \\fs20\\cgrid ",
-  "\\s58\\li2880\\sa60\\sb30\\qj\\widctlpar\\qj\\adjustright \\fs20\\cgrid ",
-  "\\s59\\li3240\\sa60\\sb30\\qj\\widctlpar\\qj\\adjustright \\fs20\\cgrid "
-};
-const char *Rtf_Style_DescContinue[] = 
-{
-  "\\s60\\li0\\widctlpar\\qj\\adjustright \\fs20\\cgrid ",
-  "\\s61\\li360\\widctlpar\\qj\\adjustright \\fs20\\cgrid ",
-  "\\s62\\li720\\widctlpar\\qj\\adjustright \\fs20\\cgrid ",
-  "\\s63\\li1080\\widctlpar\\qj\\adjustright \\fs20\\cgrid ",
-  "\\s64\\li1440\\widctlpar\\qj\\adjustright \\fs20\\cgrid ",
-  "\\s65\\li1800\\widctlpar\\qj\\adjustright \\fs20\\cgrid ",
-  "\\s66\\li2160\\widctlpar\\qj\\adjustright \\fs20\\cgrid ",
-  "\\s67\\li2520\\widctlpar\\qj\\adjustright \\fs20\\cgrid ",
-  "\\s68\\li2880\\widctlpar\\qj\\adjustright \\fs20\\cgrid ",
-  "\\s69\\li3240\\widctlpar\\qj\\adjustright \\fs20\\cgrid "
-};
-const char *Rtf_Style_LatexTOC[] = 
-{
-  "\\s70\\li0\\sa30\\sb30\\widctlpar\\tqr\\tldot\\tx8640\\adjustright \\fs20\\cgrid ",
-  "\\s71\\li360\\sa27\\sb27\\widctlpar\\tqr\\tldot\\tx8640\\adjustright \\fs20\\cgrid ",
-  "\\s72\\li720\\sa24\\sb24\\widctlpar\\tqr\\tldot\\tx8640\\adjustright \\fs20\\cgrid ",
-  "\\s73\\li1080\\sa21\\sb21\\widctlpar\\tqr\\tldot\\tx8640\\adjustright \\fs20\\cgrid ",
-  "\\s74\\li1440\\sa18\\sb18\\widctlpar\\tqr\\tldot\\tx8640\\adjustright \\fs20\\cgrid ",
-  "\\s75\\li1800\\sa15\\sb15\\widctlpar\\tqr\\tldot\\tx8640\\adjustright \\fs20\\cgrid ",
-  "\\s76\\li2160\\sa12\\sb12\\widctlpar\\tqr\\tldot\\tx8640\\adjustright \\fs20\\cgrid ",
-  "\\s77\\li2520\\sa9\\sb9\\widctlpar\\tqr\\tldot\\tx8640\\adjustright \\fs20\\cgrid ",
-  "\\s78\\li2880\\sa6\\sb6\\widctlpar\\tqr\\tldot\\tx8640\\adjustright \\fs20\\cgrid ",
-  "\\s79\\li3240\\sa3\\sb3\\widctlpar\\tqr\\tldot\\tx8640\\adjustright \\fs20\\cgrid "
-};
-const char *Rtf_Style_ListBullet[] = 
-{
-  "\\s80\\fi-360\\li360\\widctlpar\\jclisttab\\tx360{\\*\\pn \\pnlvlbody\\ilvl0\\ls1\\pnrnot0\\pndec }\\ls1\\adjustright \\fs20\\cgrid ",
-  "\\s81\\fi-360\\li720\\widctlpar\\jclisttab\\tx720{\\*\\pn \\pnlvlbody\\ilvl0\\ls2\\pnrnot0\\pndec }\\ls2\\adjustright \\fs20\\cgrid ",
-  "\\s82\\fi-360\\li1080\\widctlpar\\jclisttab\\tx1080{\\*\\pn \\pnlvlbody\\ilvl0\\ls3\\pnrnot0\\pndec }\\ls3\\adjustright \\fs20\\cgrid ",
-  "\\s83\\fi-360\\li1440\\widctlpar\\jclisttab\\tx1440{\\*\\pn \\pnlvlbody\\ilvl0\\ls4\\pnrnot0\\pndec }\\ls4\\adjustright \\fs20\\cgrid ",
-  "\\s84\\fi-360\\li1800\\widctlpar\\jclisttab\\tx1800{\\*\\pn \\pnlvlbody\\ilvl0\\ls5\\pnrnot0\\pndec }\\ls5\\adjustright \\fs20\\cgrid ",
-  "\\s85\\fi-360\\li2160\\widctlpar\\jclisttab\\tx2160{\\*\\pn \\pnlvlbody\\ilvl0\\ls6\\pnrnot0\\pndec }\\ls6\\adjustright \\fs20\\cgrid ",
-  "\\s86\\fi-360\\li2520\\widctlpar\\jclisttab\\tx2520{\\*\\pn \\pnlvlbody\\ilvl0\\ls7\\pnrnot0\\pndec }\\ls7\\adjustright \\fs20\\cgrid ",
-  "\\s87\\fi-360\\li2880\\widctlpar\\jclisttab\\tx2880{\\*\\pn \\pnlvlbody\\ilvl0\\ls8\\pnrnot0\\pndec }\\ls8\\adjustright \\fs20\\cgrid ",
-  "\\s88\\fi-360\\li3240\\widctlpar\\jclisttab\\tx3240{\\*\\pn \\pnlvlbody\\ilvl0\\ls9\\pnrnot0\\pndec }\\ls9\\adjustright \\fs20\\cgrid ",
-  "\\s89\\fi-360\\li3600\\widctlpar\\jclisttab\\tx3600{\\*\\pn \\pnlvlbody\\ilvl0\\ls10\\pnrnot0\\pndec }\\ls10\\adjustright \\fs20\\cgrid "
-};
-const char *Rtf_Style_ListEnum[] = 
-{
-  "\\s90\\fi-360\\li360\\widctlpar\\fs20\\cgrid ",
-  "\\s91\\fi-360\\li720\\widctlpar\\fs20\\cgrid ",
-  "\\s92\\fi-360\\li1080\\widctlpar\\fs20\\cgrid ",
-  "\\s93\\fi-360\\li1440\\widctlpar\\fs20\\cgrid ",
-  "\\s94\\fi-360\\li1800\\widctlpar\\fs20\\cgrid ",
-  "\\s95\\fi-360\\li2160\\widctlpar\\fs20\\cgrid ",
-  "\\s96\\fi-360\\li2520\\widctlpar\\fs20\\cgrid ",
-  "\\s97\\fi-360\\li2880\\widctlpar\\fs20\\cgrid ",
-  "\\s98\\fi-360\\li3240\\widctlpar\\fs20\\cgrid ",
-  "\\s99\\fi-360\\li3600\\widctlpar\\fs20\\cgrid "
-};
+
+static QCString makeIndexName(const char *s,int i)
+{
+  QCString result=s;
+  result+=(char)(i+'0');
+  return result;
+}
 
 void RTFGenerator::beginRTFDocument()
 {
@@ -251,47 +457,53 @@ void RTFGenerator::beginRTFDocument()
   t <<"{\\comment Begining style list}\n";
   t <<"{\\stylesheet\n";
   t <<"{\\widctlpar\\adjustright \\fs20\\cgrid \\snext0 Normal;}\n";
-  t <<"{" << Rtf_Style_Heading1 <<"\\sbasedon0 \\snext0 heading 1;}\n";
-  t <<"{" << Rtf_Style_Heading2 <<"\\sbasedon0 \\snext0 heading 2;}\n";
-  t <<"{" << Rtf_Style_Heading3 <<"\\sbasedon0 \\snext0 heading 3;}\n";
-  t <<"{" << Rtf_Style_Heading4 <<"\\sbasedon0 \\snext0 heading 4;}\n";
+  t <<"{" << Rtf_Style["Heading1"] <<"\\sbasedon0 \\snext0 heading 1;}\n";
+  t <<"{" << Rtf_Style["Heading2"] <<"\\sbasedon0 \\snext0 heading 2;}\n";
+  t <<"{" << Rtf_Style["Heading3"] <<"\\sbasedon0 \\snext0 heading 3;}\n";
+  t <<"{" << Rtf_Style["Heading4"] <<"\\sbasedon0 \\snext0 heading 4;}\n";
   t <<"{\\*\\cs10 \\additive Default Paragraph Font;}\n";
-  t <<"{" << Rtf_Style_Title << "\\sbasedon0 \\snext15 Title;}\n";
-  t <<"{" << Rtf_Style_SubTitle << "\\sbasedon0 \\snext16 Subtitle;}\n";
-  t <<"{" << Rtf_Style_BodyText << "\\sbasedon0 \\snext17 BodyText;}\n";
-  t <<"{" << Rtf_Style_DenseText << "\\sbasedon0 \\snext18 DenseText;}\n";
-  t <<"{" << Rtf_Style_Header << "\\sbasedon0 \\snext28 header;}\n";
-  t <<"{" << Rtf_Style_Footer << "\\sbasedon0 \\snext29 footer;}\n";
-  t <<"{" << Rtf_Style_GroupHeader << "\\sbasedon0 \\snext30 GroupHeader}\n";
+  t <<"{" << Rtf_Style["Title"] << "\\sbasedon0 \\snext15 Title;}\n";
+  t <<"{" << Rtf_Style["SubTitle"] << "\\sbasedon0 \\snext16 Subtitle;}\n";
+  t <<"{" << Rtf_Style["BodyText"] << "\\sbasedon0 \\snext17 BodyText;}\n";
+  t <<"{" << Rtf_Style["DenseText"] << "\\sbasedon0 \\snext18 DenseText;}\n";
+  t <<"{" << Rtf_Style["Header"] << "\\sbasedon0 \\snext28 header;}\n";
+  t <<"{" << Rtf_Style["Footer"] << "\\sbasedon0 \\snext29 footer;}\n";
+  t <<"{" << Rtf_Style["GroupHeader"] << "\\sbasedon0 \\snext30 GroupHeader}\n";
 
   for (i=0;i<indentLevels;i++)
   {
-    t <<"{" << Rtf_Style_CodeExample[i] <<"\\sbasedon0 \\snext4" 
+    QCString n=makeIndexName("CodeExample",i);
+    t <<"{" << Rtf_Style[n] <<"\\sbasedon0 \\snext4" 
       << (QMIN(i+1,indentLevels-1)) << " Code Example " << i << ";}\n";
   }
   for (i=0;i<indentLevels;i++)
   {
-    t <<"{" << Rtf_Style_ListContinue[i] << "\\sbasedon0 \\snext5" 
+    QCString n=makeIndexName("ListContinue",i);
+    t <<"{" << Rtf_Style[n] << "\\sbasedon0 \\snext5" 
       << (QMIN(i+1,indentLevels-1)) << " List Continue " << i << ";}\n";
   }
   for (i=0;i<indentLevels;i++)
   {
-    t <<"{" << Rtf_Style_DescContinue[i] << "\\sbasedon0 \\snext6" 
+    QCString n=makeIndexName("DescContinue",i);
+    t <<"{" << Rtf_Style[n] << "\\sbasedon0 \\snext6" 
       << (QMIN(i+1,indentLevels-1)) << " DescContinue " << i << ";}\n";
   }
   for (i=0;i<indentLevels;i++)
   {
-    t <<"{" << Rtf_Style_LatexTOC[i] << "\\sbasedon50 \\snext7" 
+    QCString n=makeIndexName("LatexTOC",i);
+    t <<"{" << Rtf_Style[n] << "\\sbasedon50 \\snext7" 
       << (QMIN(i+1,indentLevels-1)) << " LatexTOC " << i << ";}\n";
   }
   for (i=0;i<indentLevels;i++)
   {
-    t <<"{" << Rtf_Style_ListBullet[i] << "\\sbasedon0 \\snext8" 
+    QCString n=makeIndexName("ListBullet",i);
+    t <<"{" << Rtf_Style[n] << "\\sbasedon0 \\snext8" 
       << (QMIN(i+1,indentLevels-1)) << " \\sautoupd List Bullet " << i << ";}\n";
   }
   for (i=0;i<indentLevels;i++)
   {
-    t <<"{" << Rtf_Style_ListEnum[i] << "\\sbasedon0 \\snext9" 
+    QCString n=makeIndexName("ListEnum",i);
+    t <<"{" << Rtf_Style[n] << "\\sbasedon0 \\snext9" 
       << (QMIN(i+1,indentLevels-1)) << " \\sautoupd List Enum " << i << ";}\n";
   }
   t <<"}" << endl;
@@ -301,7 +513,7 @@ void RTFGenerator::beginRTFDocument()
 
 void RTFGenerator::beginRTFChapter()
 {
-  t <<"\n{\\comment Begin Chapter}\n" << Rtf_Style_Reset;
+  t <<"\n{\\comment Begin Chapter}\n" << Rtf_Style["Reset"];
 
   // if we are compact, no extra page breaks...
   if (Config::compactRTFFlag)
@@ -314,12 +526,12 @@ void RTFGenerator::beginRTFChapter()
     t <<"\\sect\\sbkpage\n";
   //t <<"\\sect\\sectd\\sbkpage\n";
 
-  t << Rtf_Style_Heading1 << "\n";
+  t << Rtf_Style["Heading1"] << "\n";
 }
 
 void RTFGenerator::beginRTFSection()
 {
-  t <<"\n{\\comment Begin Section}\n" << Rtf_Style_Reset;
+  t <<"\n{\\comment Begin Section}\n" << Rtf_Style["Reset"];
 
   // if we are compact, no extra page breaks...
   if (Config::compactRTFFlag)
@@ -332,7 +544,7 @@ void RTFGenerator::beginRTFSection()
     t <<"\\sect\\sbkpage\n";
   //t <<"\\sect\\sectd\\sbkpage\n";
 
-  t << Rtf_Style_Heading2 << "\n";
+  t << Rtf_Style["Heading2"] << "\n";
 }
 
 void RTFGenerator::startFile(const char *name,const char *, bool )
@@ -509,14 +721,14 @@ void RTFGenerator::endIndexSection(IndexSections is)
           "}{\\comment end of infoblock}\n";
 
         // setup for this section
-        t << Rtf_Style_Reset <<"\n";
+        t << Rtf_Style["Reset"] <<"\n";
         t <<"\\sectd\\pgnlcrm\n";
-        t <<"{\\footer "<<Rtf_Style_Footer << "{\\chpgn}}\n";
+        t <<"{\\footer "<<Rtf_Style["Footer"] << "{\\chpgn}}\n";
         // the title entry
         t << "{\\comment begin title page}\n";
-        t << Rtf_Style_Reset << Rtf_Style_Title << endl; // set to title style
+        t << Rtf_Style["Reset"] << Rtf_Style["Title"] << endl; // set to title style
         t << "{\\field\\fldedit {\\*\\fldinst TITLE \\\\*MERGEFORMAT}{\\fldrslt TITLE}}\\par" << endl;
-        t << Rtf_Style_Reset << Rtf_Style_SubTitle << endl; // set to subtitle style
+        t << Rtf_Style["Reset"] << Rtf_Style["SubTitle"] << endl; // set to subtitle style
         t << "{\\field\\fldedit {\\*\\fldinst AUTHOR \\\\*MERGEFORMAT}{\\fldrslt AUTHOR}}\\par" << endl;
         t << "{\\field\\fldedit {\\*\\fldinst CREATEDATE \\\\*MERGEFORMAT}"
           "{\\fldrslt CREATEDATE}}\\par"<<endl;
@@ -524,44 +736,44 @@ void RTFGenerator::endIndexSection(IndexSections is)
 
         // table of contents section
         t << "{\\comment Table of contents}\n";
-        t << Rtf_Style_Reset << endl;
+        t << Rtf_Style["Reset"] << endl;
         t << "{\\field\\fldedit {\\*\\fldinst TOC \\\\f \\\\*MERGEFORMAT}{\\fldrslt Table of contents}}\\par\n";
-        t << Rtf_Style_Reset << endl;
+        t << Rtf_Style["Reset"] << endl;
 
       }
       break;
     case isMainPage:
-      t << "\\par " << Rtf_Style_Reset  << endl;
+      t << "\\par " << Rtf_Style["Reset"] << endl;
       t << "{\\tc \\v " << theTranslator->trMainPage() << "}"<< endl;
       t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"index.rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
       break;
     case isModuleIndex:
-      t << "\\par " << Rtf_Style_Reset  << endl;
+      t << "\\par " << Rtf_Style["Reset"] << endl;
       t << "{\\tc \\v " << theTranslator->trModuleIndex() << "}"<< endl;
       t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"modules.rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
       break;
     case isNamespaceIndex:
-      t << "\\par " << Rtf_Style_Reset  << endl;
+      t << "\\par " << Rtf_Style["Reset"] << endl;
       t << "{\\tc \\v " << theTranslator->trNamespaceIndex() << "}"<< endl;
       t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"namespaces.rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
       break;
     case isClassHierarchyIndex:
-      t << "\\par " << Rtf_Style_Reset  << endl;
+      t << "\\par " << Rtf_Style["Reset"] << endl;
       t << "{\\tc \\v " << theTranslator->trHierarchicalIndex() << "}"<< endl;
       t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"hierarchy.rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
       break;
     case isCompoundIndex:
-      t << "\\par " << Rtf_Style_Reset  << endl;
+      t << "\\par " << Rtf_Style["Reset"] << endl;
       t << "{\\tc \\v " << theTranslator->trCompoundIndex() << "}"<< endl;
       t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"annotated.rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
       break;
     case isFileIndex:
-      t << "\\par " << Rtf_Style_Reset  << endl;
+      t << "\\par " << Rtf_Style["Reset"] << endl;
       t << "{\\tc \\v " << theTranslator->trFileIndex() << "}"<< endl;
       t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"files.rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
       break;
     case isPageIndex:
-      t << "\\par " << Rtf_Style_Reset  << endl;
+      t << "\\par " << Rtf_Style["Reset"] << endl;
       t << "{\\tc \\v " << theTranslator->trPageIndex() << "}"<< endl;
       t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"pages.rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
       break;
@@ -572,9 +784,9 @@ void RTFGenerator::endIndexSection(IndexSections is)
         t << "{\\tc \\v " << theTranslator->trModuleDocumentation() << "}"<< endl;
         while (gd && !found)
         {
-          if (gd->isLinkableInProject() || gd->countMembers()>0)
+          if (gd->countMembers()>0)
           {
-            t << "\\par " << Rtf_Style_Reset  << endl;
+            t << "\\par " << Rtf_Style["Reset"] << endl;
             t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"";
             t << gd->getOutputFileBase();
             t << ".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
@@ -585,9 +797,9 @@ void RTFGenerator::endIndexSection(IndexSections is)
         }
         while (gd)
         {
-          if (gd->isLinkableInProject() || gd->countMembers()>0)
+          if (gd->countMembers()>0)
           {
-            t << "\\par " << Rtf_Style_Reset  << endl;
+            t << "\\par " << Rtf_Style["Reset"] << endl;
             beginRTFSection();
             t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"";
             t << gd->getOutputFileBase();
@@ -605,7 +817,7 @@ void RTFGenerator::endIndexSection(IndexSections is)
         {
           if (nd->isLinkableInProject() || nd->countMembers()>0)
           {
-            t << "\\par " << Rtf_Style_Reset  << endl;
+            t << "\\par " << Rtf_Style["Reset"] << endl;
             t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"";
             t << nd->getOutputFileBase();
             t << ".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
@@ -617,7 +829,7 @@ void RTFGenerator::endIndexSection(IndexSections is)
         {
           if (nd->isLinkableInProject() || nd->countMembers()>0)
           {
-            t << "\\par " << Rtf_Style_Reset  << endl;
+            t << "\\par " << Rtf_Style["Reset"] << endl;
             beginRTFSection();
             t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"";
             t << nd->getOutputFileBase();
@@ -637,7 +849,7 @@ void RTFGenerator::endIndexSection(IndexSections is)
         {
           if (cd->isLinkableInProject())
           {
-            t << "\\par " << Rtf_Style_Reset  << endl;
+            t << "\\par " << Rtf_Style["Reset"] << endl;
             t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"";
             t << cd->getOutputFileBase();
             t << ".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
@@ -649,7 +861,7 @@ void RTFGenerator::endIndexSection(IndexSections is)
         {
           if (cd->isLinkableInProject())
           {
-            t << "\\par " << Rtf_Style_Reset  << endl;
+            t << "\\par " << Rtf_Style["Reset"] << endl;
             beginRTFSection();
             t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"";
             t << cd->getOutputFileBase();
@@ -674,7 +886,7 @@ void RTFGenerator::endIndexSection(IndexSections is)
             {
               if (isFirst)
               {
-                t << "\\par " << Rtf_Style_Reset  << endl;
+                t << "\\par " << Rtf_Style["Reset"] << endl;
                 t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"";
                 t << fd->getOutputFileBase();
                 t << ".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
@@ -682,7 +894,7 @@ void RTFGenerator::endIndexSection(IndexSections is)
               }
               else
               {
-                t << "\\par " << Rtf_Style_Reset  << endl;
+                t << "\\par " << Rtf_Style["Reset"] << endl;
                 beginRTFSection();
                 t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"";
                 t << fd->getOutputFileBase();
@@ -702,7 +914,7 @@ void RTFGenerator::endIndexSection(IndexSections is)
         t << "{\\tc \\v " << theTranslator->trExampleDocumentation() << "}"<< endl;
         if (pi)
         {
-          t << "\\par " << Rtf_Style_Reset  << endl;
+          t << "\\par " << Rtf_Style["Reset"] << endl;
           t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"";
           t << convertSlashes(pi->name,TRUE);
           t << "-example.rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
@@ -710,7 +922,7 @@ void RTFGenerator::endIndexSection(IndexSections is)
         }
         while (pi)
         {
-          t << "\\par " << Rtf_Style_Reset  << endl;
+          t << "\\par " << Rtf_Style["Reset"] << endl;
           beginRTFSection();
           t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"";
           t << convertSlashes(pi->name,TRUE);
@@ -730,7 +942,7 @@ void RTFGenerator::endIndexSection(IndexSections is)
             pageName=pi->name.copy();
           else
             pageName=pi->name.lower();
-          t << "\\par " << Rtf_Style_Reset  << endl;
+          t << "\\par " << Rtf_Style["Reset"] << endl;
           t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"";
           t << pageName;
           t << ".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
@@ -743,7 +955,7 @@ void RTFGenerator::endIndexSection(IndexSections is)
             pageName=pi->name.copy();
           else
             pageName=pi->name.lower();
-          //t << "\\par " << Rtf_Style_Reset  << endl;
+          //t << "\\par " << Rtf_Style["Reset"] << endl;
           //beginRTFSection();
           t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"";
           t << pageName;
@@ -754,9 +966,9 @@ void RTFGenerator::endIndexSection(IndexSections is)
       break;
     case isEndIndex:
       beginRTFChapter();				  
-      t << Rtf_Style_Heading1;
+      t << Rtf_Style["Heading1"];
       t << "Index\\par "<< endl;
-      t << Rtf_Style_Reset<< endl;
+      t << Rtf_Style["Reset"] << endl;
       t << "{\\tc \\v Index}" << endl;
       t << "{\\field\\fldedit {\\*\\fldinst INDEX \\\\c2 \\\\*MERGEFORMAT}{\\fldrslt INDEX}}\n";
 
@@ -772,8 +984,8 @@ void RTFGenerator::lastIndexPage()
   t <<"\\sect \\sectd \\sbknone \\pgndec\n";
 
   // set footer
-  t <<"{\\footer "<< Rtf_Style_Footer << "{\\chpgn}}\n";
-  //t << Rtf_Style_Heading1 << "\n";
+  t <<"{\\footer "<< Rtf_Style["Footer"] << "{\\chpgn}}\n";
+  //t << Rtf_Style["Heading1"] << "\n";
 
 }
 
@@ -798,7 +1010,7 @@ void RTFGenerator::startIndexList()
   t << "{\\comment (startIndexList)}" << endl;
   t << "{" << endl;
   incrementIndentLevel();
-  t << Rtf_Style_Reset << Rtf_LCList_DepthStyle() << endl;
+  t << Rtf_Style["Reset"] << Rtf_LCList_DepthStyle() << endl;
   newParagraph();
   m_omitParagraph=TRUE;
 }
@@ -819,7 +1031,7 @@ void RTFGenerator::startItemList()
   t << "{";
   incrementIndentLevel();
   listItemInfo[m_listLevel].isEnum = FALSE;
-  //t << Rtf_Style_Reset << Rtf_BList_DepthStyle();
+  //t << Rtf_Style["Reset"] << Rtf_BList_DepthStyle();
 }
 
 /*! end bullet list */
@@ -830,7 +1042,7 @@ void RTFGenerator::endItemList()
   t << "}";
   decrementIndentLevel();
   m_omitParagraph=TRUE;
-  //t << Rtf_Style_Reset << styleStack.top() << endl;
+  //t << Rtf_Style["Reset"] << styleStack.top() << endl;
   //printf("RTFGenerator::endItemList() `%s'\n",styleStack.top());
   //newParagraph();
 }
@@ -843,7 +1055,7 @@ void RTFGenerator::startEnumList()  // starts an enumeration list
   incrementIndentLevel();
   listItemInfo[m_listLevel].isEnum = TRUE;
   listItemInfo[m_listLevel].number = 1;
-  //t << Rtf_Style_Reset << Rtf_EList_DepthStyle() << endl;
+  //t << Rtf_Style["Reset"] << Rtf_EList_DepthStyle() << endl;
   //newParagraph();
   //m_omitParagraph=TRUE;
 
@@ -864,7 +1076,7 @@ void RTFGenerator::writeListItem()
 {
   t << "{\\comment (writeListItem)}" << endl;
   newParagraph();
-  t << Rtf_Style_Reset;
+  t << Rtf_Style["Reset"];
   if (listItemInfo[m_listLevel].isEnum)
   {
     t << Rtf_EList_DepthStyle() << endl;
@@ -980,14 +1192,14 @@ void RTFGenerator::writeEndAnnoItem(const char *name)
 void RTFGenerator::startSubsection() 
 { 
   //beginRTFSubSection();
-  t <<"\n{\\comment Begin SubSection}\n" << Rtf_Style_Reset;
-  t << Rtf_Style_Heading3 << "\n";
+  t <<"\n{\\comment Begin SubSection}\n" << Rtf_Style["Reset"];
+  t << Rtf_Style["Heading3"] << "\n";
 }
 
 void RTFGenerator::endSubsection() 
 {
   newParagraph();
-  t << Rtf_Style_Reset << endl;
+  t << Rtf_Style["Reset"] << endl;
 }
 
 void RTFGenerator::startSubsubsection() 
@@ -995,7 +1207,7 @@ void RTFGenerator::startSubsubsection()
   //beginRTFSubSubSection();
   t << "\n{\\comment Begin SubSubSection}\n";
   t << "{" << endl;
-  t << Rtf_Style_Reset << Rtf_Style_Heading4 << "\n";
+  t << Rtf_Style["Reset"] << Rtf_Style["Heading4"] << "\n";
 }
 
 void RTFGenerator::endSubsubsection() 
@@ -1135,13 +1347,13 @@ void RTFGenerator::startTitleHead(const char *)
   t <<"{\\comment startTitleHead}" << endl;
 
   //	beginRTFSection();
-  t << Rtf_Style_Reset << Rtf_Style_Heading2 << endl;
+  t << Rtf_Style["Reset"] << Rtf_Style["Heading2"] << endl;
 }
 
 void RTFGenerator::endTitleHead(const char *fileName,const char *name)
 {
   t <<"{\\comment endTitleHead}" << endl;
-  t << "\\par " << Rtf_Style_Reset << endl;
+  t << "\\par " << Rtf_Style["Reset"] << endl;
   if (name)
   {
     // make table of contents entry
@@ -1177,8 +1389,8 @@ void RTFGenerator::startGroupHeader()
 {
   t <<"{\\comment startGroupHeader}" << endl;
   newParagraph();
-  t << Rtf_Style_Reset;
-  t << Rtf_Style_Heading3; 
+  t << Rtf_Style["Reset"];
+  t << Rtf_Style["Heading3"]; 
   t << endl;
 }
 
@@ -1186,7 +1398,7 @@ void RTFGenerator::endGroupHeader()
 {
   t <<"{\\comment endGroupHeader}" << endl;
   newParagraph();
-  t << Rtf_Style_Reset << endl;
+  t << Rtf_Style["Reset"] << endl;
 }
 
 void RTFGenerator::startMemberDoc(const char *clname,
@@ -1200,11 +1412,10 @@ void RTFGenerator::startMemberDoc(const char *clname,
     addToIndex(memname,clname);
     addToIndex(clname,memname);
   }
-  //t << Rtf_Style_Reset << Rtf_Style_ListBullet1;
-  t << Rtf_Style_Reset << Rtf_Style_Heading4;
+  t << Rtf_Style["Reset"] << Rtf_Style["Heading4"];
   //styleStack.push(Rtf_Style_Heading4);
   t << "{" << endl;
-  //printf("RTFGenerator::startMemberDoc() `%s'\n",Rtf_Style_Heading4);
+  //printf("RTFGenerator::startMemberDoc() `%s'\n",Rtf_Style["Heading4"]);
   startBold();
   t << endl;
 }
@@ -1215,7 +1426,7 @@ void RTFGenerator::endMemberDoc()
   t << "}" << endl;
   //const char *style = styleStack.pop();
   //printf("RTFGenerator::endMemberDoc() `%s'\n",style);
-  //ASSERT(style==Rtf_Style_Heading4);
+  //ASSERT(style==Rtf_Style["Heading4"]);
   endBold();
   newParagraph();
 }
@@ -1295,7 +1506,7 @@ void RTFGenerator::startIndent()
   incrementIndentLevel();
   t << "{\\comment (startIndent) }" << endl;
   t << "{" << endl;
-  t << Rtf_Style_Reset << Rtf_CList_DepthStyle() << endl;
+  t << Rtf_Style["Reset"] << Rtf_CList_DepthStyle() << endl;
   //styleStack.push(style);
 }
 
@@ -1311,7 +1522,7 @@ void RTFGenerator::startDescription()
 { 
   t << "{\\comment (startDescription)}"    << endl; 
   t << "{" << endl;
-  t << Rtf_Style_Reset << Rtf_CList_DepthStyle();
+  t << Rtf_Style["Reset"] << Rtf_CList_DepthStyle();
 }
 
 void RTFGenerator::endDescription()   
@@ -1340,7 +1551,7 @@ void RTFGenerator::startMemberDescription()
   t << "{\\comment (startMemberDescription)}"    << endl;
   t << "{" << endl;
   incrementIndentLevel();
-  t << Rtf_Style_Reset << Rtf_CList_DepthStyle();
+  t << Rtf_Style["Reset"] << Rtf_CList_DepthStyle();
   startEmphasis();
 }
 
@@ -1364,16 +1575,16 @@ void RTFGenerator::endDescTitle()
 { 
   t << "{\\comment (endDescTitle) }"    << endl; 
   newParagraph();
-  //t << Rtf_Style_Reset << styleStack.top();
+  //t << Rtf_Style["Reset"] << styleStack.top();
   incrementIndentLevel();
-  t << Rtf_Style_Reset << Rtf_DList_DepthStyle();
+  t << Rtf_Style["Reset"] << Rtf_DList_DepthStyle();
 }
 
 void RTFGenerator::writeDescItem()
 {
   t << "{\\comment (writeDescItem) }"    << endl;
   //	incrementIndentLevel();
-  //t << Rtf_Style_Reset << Rtf_CList_DepthStyle(); 
+  //t << Rtf_Style["Reset"] << Rtf_CList_DepthStyle(); 
 }
 
 void RTFGenerator::endDescList()       
@@ -1383,18 +1594,18 @@ void RTFGenerator::endDescList()
   t << "}";
   decrementIndentLevel();
   m_omitParagraph = TRUE;
-  //t << Rtf_Style_Reset << styleStack.top() << endl;
+  //t << Rtf_Style["Reset"] << styleStack.top() << endl;
 }
 
 void RTFGenerator::writeSection(const char *lab,const char *title,bool sub)
 {
   t << "{\\comment (writeSection)}"    << endl; 
   t << "{";
-  t<< Rtf_Style_Reset;
+  t<< Rtf_Style["Reset"];
   if (sub)
   {
     // set style
-    t << Rtf_Style_Heading3; 
+    t << Rtf_Style["Heading3"]; 
     // make table of contents entry
     t << "{\\tc\\tcl3 \\v ";
     docify(title);
@@ -1403,7 +1614,7 @@ void RTFGenerator::writeSection(const char *lab,const char *title,bool sub)
   else
   {
     // set style
-    t << Rtf_Style_Heading2; 
+    t << Rtf_Style["Heading2"]; 
     // make table of contents entry
     t << "{\\tc\\tcl2 \\v ";
     docify(title);
@@ -1530,7 +1741,7 @@ void RTFGenerator::endClassDiagram(ClassDiagram &d,
 
   // display the file
   t << "{" << endl;
-  t << Rtf_Style_Reset << endl;
+  t << Rtf_Style["Reset"] << endl;
   t << "\\par\\pard \\qc {\\field\\flddirty {\\*\\fldinst INCLUDEPICTURE ";
   t << fileName << ".gif";
   t << " \\\\*MERGEFORMAT}{\\fldrslt IMAGE}}\\par" << endl;
@@ -1545,7 +1756,7 @@ void RTFGenerator::writeFormula(const char *,const char *text)
 void RTFGenerator::startMemberItem(int) 
 { 
   t <<"{\\comment startMemberItem }" << endl;
-  t << Rtf_Style_Reset << Rtf_BList_DepthStyle() << endl; // set style to apropriate depth
+  t << Rtf_Style["Reset"] << Rtf_BList_DepthStyle() << endl; // set style to apropriate depth
 }
 
 void RTFGenerator::endMemberItem(bool) 
@@ -1575,7 +1786,7 @@ void RTFGenerator::startCodeFragment()
 { 
   t << "{" << endl;
   newParagraph();
-  t << Rtf_Style_Reset << Rtf_Code_DepthStyle();
+  t << Rtf_Style["Reset"] << Rtf_Code_DepthStyle();
   //styleStack.push(Rtf_Style_CodeExample);
 }
 
@@ -1584,7 +1795,7 @@ void RTFGenerator::endCodeFragment()
   newParagraph();
   //styleStack.pop();
   //printf("RTFGenerator::endCodeFrament() top=%s\n",styleStack.top());
-  //t << Rtf_Style_Reset << styleStack.top() << endl; 
+  //t << Rtf_Style["Reset"] << styleStack.top() << endl; 
   t << "}" << endl;
   m_omitParagraph = TRUE;
 }
@@ -1633,7 +1844,7 @@ void RTFGenerator::startDescTable()
   t << "{\\comment (startDescTable) }"    << endl; 
   t << "{" << endl;
   //incrementIndentLevel();
-  //t << Rtf_Style_Reset << Rtf_CList_DepthStyle();
+  //t << Rtf_Style["Reset"] << Rtf_CList_DepthStyle();
 }
 
 void RTFGenerator::endDescTable()    
@@ -1641,7 +1852,7 @@ void RTFGenerator::endDescTable()
   //decrementIndentLevel();
   t << "{\\comment (endDescTable)}"      << endl; 
   t << "}" << endl;
-  //t << Rtf_Style_Reset << styleStack.top();
+  //t << Rtf_Style["Reset"] << styleStack.top();
 }
 
 void RTFGenerator::startDescTableTitle()
@@ -1694,49 +1905,55 @@ void RTFGenerator::decrementIndentLevel()
 // a style for list formatted with "list continue" style
 const char * RTFGenerator::Rtf_CList_DepthStyle()
 {
-  return Rtf_Style_ListContinue[m_listLevel];
+  QCString n=makeIndexName("ListContinue",m_listLevel);
+  return Rtf_Style[n];
 }
 
 // a style for list formatted as a "latext style" table of contents
 const char * RTFGenerator::Rtf_LCList_DepthStyle()
 {
-  return Rtf_Style_LatexTOC[m_listLevel];
+  QCString n=makeIndexName("LatexTOC",m_listLevel);
+  return Rtf_Style[n];
 }
 
 // a style for list formatted as a "bullet" style 
 const char * RTFGenerator::Rtf_BList_DepthStyle()
 {
-  return Rtf_Style_ListBullet[m_listLevel];
+  QCString n=makeIndexName("ListBullet",m_listLevel);
+  return Rtf_Style[n];
 }
 
 // a style for list formatted as a "enumeration" style 
 const char * RTFGenerator::Rtf_EList_DepthStyle()
 {
-  return Rtf_Style_ListEnum[m_listLevel];
+  QCString n=makeIndexName("ListEnum",m_listLevel);
+  return Rtf_Style[n];
 }
 
 const char * RTFGenerator::Rtf_DList_DepthStyle()
 {
-  return Rtf_Style_DescContinue[m_listLevel];
+  QCString n=makeIndexName("DescContinue",m_listLevel);
+  return Rtf_Style[n];
 }
 
 const char * RTFGenerator::Rtf_Code_DepthStyle()
 {
-  return Rtf_Style_CodeExample[m_listLevel];
+  QCString n=makeIndexName("CodeExample",m_listLevel);
+  return Rtf_Style[n];
 }
 
 void RTFGenerator::startTextBlock(bool dense)
 {
   t << "{\\comment Start TextBlock}" << endl;
   t << "{" << endl;
-  t << Rtf_Style_Reset;
+  t << Rtf_Style["Reset"];
   if (dense) // no spacing between "paragraphs"
   {
-    t << Rtf_Style_DenseText;
+    t << Rtf_Style["DenseText"];
   }
   else // some spacing
   {
-    t << Rtf_Style_BodyText;
+    t << Rtf_Style["BodyText"];
   }
 }
 
@@ -1757,7 +1974,7 @@ void RTFGenerator::newParagraph()
 void RTFGenerator::startMemberSubtitle()
 {
   t << "{" << endl;
-  t << Rtf_Style_Reset << Rtf_CList_DepthStyle() << endl;
+  t << Rtf_Style["Reset"] << Rtf_CList_DepthStyle() << endl;
 }
 
 void RTFGenerator::endMemberSubtitle()
@@ -1953,7 +2170,7 @@ void RTFGenerator::endDotGraph(DotClassGraph &g)
 
   // display the file
   t << "{" << endl;
-  t << Rtf_Style_Reset << endl;
+  t << Rtf_Style["Reset"] << endl;
   t << "\\par\\pard \\qc {\\field\\flddirty {\\*\\fldinst INCLUDEPICTURE ";
   t << g.diskName() << ".gif";
   t << " \\\\*MERGEFORMAT}{\\fldrslt IMAGE}}\\par" << endl;
@@ -1977,7 +2194,7 @@ void RTFGenerator::endInclDepGraph(DotInclDepGraph &g)
 
   // display the file
   t << "{" << endl;
-  t << Rtf_Style_Reset << endl;
+  t << Rtf_Style["Reset"] << endl;
   t << "\\par\\pard \\qc {\\field\\flddirty {\\*\\fldinst INCLUDEPICTURE ";
   t << g.diskName() << ".gif";
   t << " \\\\*MERGEFORMAT}{\\fldrslt IMAGE}}\\par" << endl;
@@ -2037,14 +2254,14 @@ void RTFGenerator::startMemberGroupHeader(bool hasHeader)
   t << "{\\comment startMemberGroupHeader}" << endl;
   t << "{" << endl;
   if (hasHeader) incrementIndentLevel();
-  t << Rtf_Style_Reset << Rtf_Style_GroupHeader;
+  t << Rtf_Style["Reset"] << Rtf_Style["GroupHeader"];
 }
 
 void RTFGenerator::endMemberGroupHeader()
 {
   t << "{\\comment endMemberGroupHeader}" << endl;
   newParagraph();
-  t << Rtf_Style_Reset << Rtf_CList_DepthStyle();
+  t << Rtf_Style["Reset"] << Rtf_CList_DepthStyle();
 }
 
 void RTFGenerator::startMemberGroupDocs()
@@ -2063,7 +2280,7 @@ void RTFGenerator::endMemberGroupDocs()
 void RTFGenerator::startMemberGroup()
 {
   t << "{\\comment startMemberGroup}" << endl;
-  t << Rtf_Style_Reset << Rtf_BList_DepthStyle() << endl;
+  t << Rtf_Style["Reset"] << Rtf_BList_DepthStyle() << endl;
 }
 
 void RTFGenerator::endMemberGroup(bool hasHeader)
diff --git a/src/scanner.l b/src/scanner.l
index 7b098f8..5c97241 100644
--- a/src/scanner.l
+++ b/src/scanner.l
@@ -1758,12 +1758,11 @@ DOCPARAM  ([a-z_A-Z0-9:\<\>\=\.\-]+)|("\"".*"\"")
 					    {
 					      //outDoc->writeSectionRefAnchor(sec->fileName,sec->label,text);
 					      outDoc->writeObjectLink(0,sec->fileName,sec->label,text);
-					      //printf("Writing page ref `%s'\n",sec->label.data());
 					      writePageRef(*outDoc,sec->label,0);
 					    }
 					    else
 					    {
-					      //printf("  ref sec=%p sec->fileName=%s\n",sec,sec->fileName.data());
+					      //printf("  ref sec=%p sec->fileName=%s text=%s\n",sec,sec->fileName.data(),text.data());
 					      outDoc->writeSectionRef(sec->fileName,sec->label,text);
 					    }
 					  }
@@ -3246,7 +3245,7 @@ DOCPARAM  ([a-z_A-Z0-9:\<\>\=\.\-]+)|("\"".*"\"")
 <MemberSpec>([*&]*{BN}*)*{ID}("["[a-z_A-Z0-9]*"]")* { // the [] part could be improved.
   					  lineCount();
   					  int i=0,l=yyleng,j;
-					  while (i<l && (!isalpha(yytext[i]))) i++;
+					  while (i<l && (!isId(yytext[i]))) i++;
 					  msName = yytext; 
 					  msName = msName.right(msName.length()-i);
 					  j=msName.find("[");
@@ -3300,7 +3299,14 @@ DOCPARAM  ([a-z_A-Z0-9:\<\>\=\.\-]+)|("\"".*"\"")
 					    //    current->parent->section & Entry::COMPOUND_MASK)
 					    //  varEntry->type+=current->parent->name+"::";
 					    if (isTypedef)
+					    {
 					      varEntry->type.prepend("typedef ");
+					      //printf("current->name = %s %s\n",current->name.data(),msName.data());
+					      if (!current->name.isEmpty() && current->name.at(0)!='@')
+					      {
+						typedefDict.insert(msName,new QCString(current->name));
+					      }
+					    }
 					    varEntry->type+=current->name+msType;
 					    varEntry->fileName = yyFileName;
 					    varEntry->startLine = yyLineNr;
@@ -4671,12 +4677,12 @@ DOCPARAM  ([a-z_A-Z0-9:\<\>\=\.\-]+)|("\"".*"\"")
 <Doc,JavaDoc,LineDoc,ExampleDoc,ClassDocBrief,PageDoc,ClassDoc>("\\\\"|"@@")"f"[$\[\]] {
 							  current->doc += &yytext[1]; 
 							}
-<Doc,JavaDoc,LineDoc,ExampleDoc,ClassDocBrief,PageDoc,ClassDoc,AfterDoc>{CMD}"f$"	{ 
+<Doc,JavaDoc,LineDoc,ExampleDoc,ClassDocBrief,PageDoc,ClassDoc,AfterDoc,AfterDocLine,AfterDocBrief>{CMD}"f$"	{ 
   							  lastFormulaContext = YY_START;
   							  formulaText="$"; 
 							  BEGIN(ReadFormulaShort); 
 							}
-<Doc,JavaDoc,LineDoc,ExampleDoc,ClassDocBrief,PageDoc,ClassDoc,AfterDoc>{CMD}"f["	{ 
+<Doc,JavaDoc,LineDoc,ExampleDoc,ClassDocBrief,PageDoc,ClassDoc,AfterDoc,AfterDocLine,AfterDocBrief>{CMD}"f["	{ 
   							  lastFormulaContext = YY_START;
   							  formulaText="\\["; 
 							  BEGIN(ReadFormulaLong); 
@@ -4685,7 +4691,9 @@ DOCPARAM  ([a-z_A-Z0-9:\<\>\=\.\-]+)|("\"".*"\"")
   							  formulaText+="$";
 							  if (lastFormulaContext==ClassDocBrief || 
 							      lastFormulaContext==LineDoc || 
-							      lastFormulaContext==JavaDoc
+							      lastFormulaContext==JavaDoc || 
+							      lastFormulaContext==AfterDocBrief ||
+							      lastFormulaContext==AfterDocLine
 							     )
 							    current->brief += addFormula();
 							  else
@@ -4696,7 +4704,9 @@ DOCPARAM  ([a-z_A-Z0-9:\<\>\=\.\-]+)|("\"".*"\"")
 							  formulaText+="\\]";
 							  if (lastFormulaContext==ClassDocBrief ||
 							      lastFormulaContext==LineDoc ||
-							      lastFormulaContext==JavaDoc
+							      lastFormulaContext==JavaDoc ||
+							      lastFormulaContext==AfterDocBrief ||
+							      lastFormulaContext==AfterDocLine
 							     )
 							    current->brief += addFormula();
 							  else
diff --git a/src/suffixtree.cpp b/src/suffixtree.cpp
index 1befe25..ad0aebd 100644
--- a/src/suffixtree.cpp
+++ b/src/suffixtree.cpp
@@ -38,7 +38,7 @@ bool writeNumber(QFile &f,int num)
          (f.putch(num&0xff)==-1);
 }
 
-bool writeEncodedNumber(QFile &f,uint number)
+static bool writeEncodedNumber(QFile &f,uint number)
 {
   bool error=FALSE;
   uint n=number;
@@ -52,7 +52,7 @@ bool writeEncodedNumber(QFile &f,uint number)
   return error; 
 }
 
-int encodedNumberSize(uint number)
+static int encodedNumberSize(uint number)
 {
   uint n=number;
   int size=1;
diff --git a/src/suffixtree.h b/src/suffixtree.h
index 3e59193..a0b7434 100644
--- a/src/suffixtree.h
+++ b/src/suffixtree.h
@@ -29,10 +29,6 @@ class IndexTree;
 enum WordRefMasks { WORDINNAME_MASK=4, INNAME_MASK=2, FULLWORD_MASK=1 };
 enum WordRefBits  { WORDINNAME_BIT=2, INNAME_BIT=1, FULLWORD_BIT=0 };
 
-//  bool  inName;
-//  bool  fullWord;
-//  bool  wordInName;
-
 struct WordRef
 {
   int   id;
@@ -77,7 +73,6 @@ class SuffixTree
     SuffixTree();
    ~SuffixTree();
     void insertWord(const char *word,int index,bool inName);
-    //void buildIndex();
     void resolveForwardReferences();
     void dump();
     int size(); // return the size of the (flat) tree in bytes
diff --git a/src/translator.h b/src/translator.h
index 313b05e..6bc534d 100644
--- a/src/translator.h
+++ b/src/translator.h
@@ -25,38 +25,33 @@
 class Translator
 {
   public:
-    //--------------------------------------------------------------------
-    // NOTICE:
-    // the following functions are now obsolete: these are no longer used and 
-    // will disappear in future versions. You do not have to translate them!
-    virtual QCString trInherits() 
-    { return "Inherits"; }
-    virtual QCString trAnd() 
-    { return "and"; }
-    virtual QCString trInheritedBy() 
-    { return "Inherited By"; }
-    virtual QCString trReference() 
-    { return "Reference"; }
-    virtual QCString trReimplementedFrom()
-    { return "Reimplemented from"; }
-    virtual QCString trReimplementedIn()
-    { return "Reimplemented in"; }
-    virtual QCString trIncludeFile()
-    { return "Include File"; }
-    virtual QCString trGeneratedFrom(const char *s,bool single)
-    { 
-      QCString result=(QCString)"The documentation for this"+s+
-                     " was generated from the following file";
-      if (single) result+=":"; else result+="s:";
-      return result;
-    }
-    // end of obsolete functions 
-    //--------------------------------------------------------------------
 
+    // --- Language contol methods -------------------
+    
+    /*! Used for identification of the language. May resemble 
+     * the string returned by latexBabelPackage(), but it is not used
+     * for the same purpose. The identification should not be translated.
+     * It should be replaced by the name of the language in English
+     * (e.g. Czech, Japanese, Russian, etc.). It should be equal to 
+     * the identification in language.h.
+     */
+    virtual QCString idLanguage()
+    { return "english"; }
+    /*! Used to get the command(s) for the language support. This method
+     *  was designed for languages which do not prefer babel package.
+     *  If this methods returns empty string, then the latexBabelPackage()
+     *  method is used to generate the command for using the babel package.
+     */
+    virtual QCString latexLanguageSupportCommand()
+    {
+      return "";
+    }
     /*! returns the name of the package that is included by LaTeX */
     virtual QCString latexBabelPackage() 
     { return ""; }
 
+    // --- Language translation methods -------------------
+
     /*! used in the compound documentation before a list of related functions. */
     virtual QCString trRelatedFunctions()
     { return "Related Functions"; }
diff --git a/src/translator_cz.h b/src/translator_cz.h
index ffbcdc3..63edec7 100644
--- a/src/translator_cz.h
+++ b/src/translator_cz.h
@@ -27,249 +27,478 @@
 //
 // havran@fel.cvut.cz, 1999/04/11
 
+
+// Notice that the following texts were written in Czech using
+// MS-Windows code page 1250. If you want to use it in Unix, 
+// convert the file to the ISO Latin-2 
+// This is a prototype created by Petr Prikryl (prikrylp@skil.cz), 2000/06/20.
+//
 class TranslatorCzech : public Translator
 {
   public:
-    QCString latexBabelPackage()
+    virtual QCString idLanguage()
     { return "czech"; }
-    QCString trInherits()
-    { return "Dedi"; }
-    QCString trAnd()
-    { return "a"; }
-    QCString trInheritedBy()
-    { return "Je potomkem"; }
-    QCString trRelatedFunctions()
-    { return "Pribuzne metody"; }
-    QCString trRelatedSubscript()
-    { return "(Tyto funkce nejsou metody.)"; }
-    QCString trDetailedDescription()
-    { return "Podrobna dokumentace"; }
-    QCString trMemberTypedefDocumentation()
-    { return "Dokumentace pro deklaraci typu (typedef) ve tride";}
-    QCString trMemberEnumerationDocumentation()
-    { return "Dokumentace vyctovych typu"; }
-    QCString trEnumerationValueDocumentation()
-    { return "Dokumentace hodnot vyctovych typu"; }
-    QCString trMemberFunctionDocumentation()
-    { return "Dokumentace metod"; }
-    QCString trMemberDataDocumentation()
-    { return "Dokumentace datovych slozek tridy"; }
-    QCString trGeneratedFrom(const char *s,bool single)
-    { 
-      QCString result=(QCString)"Dokumentace pro tento"+s+
-                     " byla generovana z nasledujiciho souboru";
-      if (single) result+=":";   else result+="s:";
-      return result;
-    }
-    QCString trMore()
-    { return "Detaily"; }
-    QCString trReference()
-    { return "Reference"; }
-    QCString trListOfAllMembers()
-    { return "Seznam vsech datovych polozek a metod tridy."; }
-    QCString trMemberList()
-    { return "Seznam datovych polozek a metod tridy"; }
-    QCString trThisIsTheListOfAllMembers()
-    { return "Toto je uplny seznam datovych polozek a metod tridy pro"; }
-    QCString trIncludingInheritedMembers()
-    { return "zahrnuje vsechny nasledujici zdedene datove polozky a metody."; }
-    QCString trGeneratedAutomatically(const char *s)
-    { QCString result="Automaticky vygenerovany pomoci programu doxygen"; 
-      if (s) result+=(QCString)" pro "+s;
-      result+=" ze zdrojoveho souboru."; 
+
+    virtual QCString latexLanguageSupportCommand()
+    { return "\\usepackage{czech}\n"; }
+    
+    /*! returns the name of the package that is included by LaTeX */
+    virtual QCString latexBabelPackage() 
+    { return ""; }
+
+    /*! used in the compound documentation before a list of related functions. */
+    virtual QCString trRelatedFunctions()
+    { return "Souvisejнcн funkce"; }
+
+    /*! subscript for the related functions. */
+    virtual QCString trRelatedSubscript()
+    { return "(Vэљe uvedenй funkce nejsou иlenskэmi funkcemi.)"; }
+
+    /*! header that is put before the detailed description of files, classes and namespaces. */
+    virtual QCString trDetailedDescription()
+    { return "Detailnн popis"; }
+
+    /*! header that is put before the list of typedefs. */
+    virtual QCString trMemberTypedefDocumentation()
+    { return "Dokumentace k иlenskэch typщm"; }
+    
+    /*! header that is put before the list of enumerations. */
+    virtual QCString trMemberEnumerationDocumentation()
+    { return "Dokumentace k иlenskэm vэиtщm"; }
+    
+    /*! header that is put before the list of member functions. */
+    virtual QCString trMemberFunctionDocumentation()
+    { return "Dokumentace k metodбm"; }
+    
+    /*! header that is put before the list of member attributes. */
+    virtual QCString trMemberDataDocumentation()
+    { return "Dokumentace k datovэm иlenщm"; }
+
+    /*! this is the text of a link put after brief descriptions. */
+    virtual QCString trMore() 
+    { return "Podrobnosti..."; }
+
+    /*! put in the class documentation */
+    virtual QCString trListOfAllMembers()
+    { return "Seznam vљech иlenщ."; }
+
+    /*! used as the title of the "list of all members" page of a class */
+    virtual QCString trMemberList()
+    { return "Seznam иlenщ tшнdy"; }
+
+    /*! this is the first part of a sentence that is followed by a class name */
+    virtual QCString trThisIsTheListOfAllMembers()
+    { return "Ъplnэ seznam иlenщ tшнdy "; }
+
+    /*! this is the remainder of the sentence after the class name */
+    virtual QCString trIncludingInheritedMembers()
+    { return ", vиetnм vљech zdмdмnэch иlenщ."; }
+    
+    /*! this is put at the author sections at the bottom of man pages.
+     *  parameter s is name of the project name.
+     */
+    virtual QCString trGeneratedAutomatically(const char *s)
+    { QCString result="Generovбno automaticky programem Doxygen "
+                      "ze zdrojovэch textщ";
+      if (s) result+=(QCString)" projektu "+s;
+      result+="."; 
       return result;
     }
-    QCString trEnumName()
-    { return "pojmenovani vyctoveho typu"; }
-    QCString trEnumValue()
-    { return "hodnota vyctoveho typu"; }
-    QCString trDefinedIn()
-    { return "definovany v"; }
-    QCString trIncludeFile()
-    { return "Vklada soubor"; }
-    QCString trVerbatimText(const char *f)
-    { return (QCString)"Toto je presny text z vlozeneho souboru "+f+""; }
-    QCString trModules()
+
+    /*! put after an enum name in the list of all members */
+    virtual QCString trEnumName()
+    { return "jmйno vэиtu"; }
+    
+    /*! put after an enum value in the list of all members */
+    virtual QCString trEnumValue()
+    { return "hodnota vэиtu"; }
+    
+    /*! put after an undocumented member in the list of all members */
+    virtual QCString trDefinedIn()
+    { return "definovбn v"; }
+
+    /*! put as in introduction in the verbatim header file of a class.
+     *  parameter f is the name of the include file.
+     */
+    virtual QCString trVerbatimText(const char *f)
+    { return (QCString)"Ъplnэ text vklбdanйho souboru "+f+"."; }
+    
+    // quick reference sections
+
+    /*! This is put above each page as a link to the list of all groups of 
+     *  compounds or files (see the \group command).
+     */
+    virtual QCString trModules()
     { return "Moduly"; }
-    QCString trClassHierarchy()
-    { return "Hierarchie trid"; }
-    QCString trCompoundList()
-    { return "Seznam objektovych typu"; }
-    QCString trFileList()
-    { return "Seznam souboru"; }
-    QCString trHeaderFiles()
-    { return "Hlavickove soubory"; }
-    QCString trCompoundMembers()
-    { return "Datove slozky a metody objektovych typu"; }
-    QCString trFileMembers()
-    { return "Globalni deklarace"; }
-    QCString trRelatedPages()
-    { return "Souvisejici stranky"; }
-    QCString trExamples()
-    { return "Priklady:"; }
-    QCString trSearch()
-    { return "Hledej"; }
-    QCString trClassHierarchyDescription()
-    { return "Tento seznam dedicnych zavislosti je temer setriden"
-	     " podle abecedy:";
-    }
-    QCString trFileListDescription(bool extractAll)
-    {
-      QCString result="A toto je seznam vsech ";
-      if (!extractAll) result+="zdokumentovanych ";
-      result+="souboru s kratkymi popisy:";
+    
+    /*! This is put above each page as a link to the class hierarchy */
+    virtual QCString trClassHierarchy()
+    { return "Hierarchie tшнd"; }
+    
+    /*! This is put above each page as a link to the list of annotated classes */
+    virtual QCString trCompoundList()
+    { return "Seznam sloћenin"; }
+    
+    /*! This is put above each page as a link to the list of documented files */
+    virtual QCString trFileList()
+    { return "Seznam souborщ"; }
+
+    /*! This is put above each page as a link to the list of all verbatim headers */
+    virtual QCString trHeaderFiles()
+    { return "Seznam hlaviиkovэch souborщ"; }
+
+    /*! This is put above each page as a link to all members of compounds. */
+    virtual QCString trCompoundMembers()
+    { return "Souибsti sloћenin"; }
+
+    /*! This is put above each page as a link to all members of files. */
+    virtual QCString trFileMembers()
+    { return "Seznam globбlnнch symbolщ"; }
+
+    /*! This is put above each page as a link to all related pages. */
+    virtual QCString trRelatedPages()
+    { return "Souvisejнcн strбnky"; }
+
+    /*! This is put above each page as a link to all examples. */
+    virtual QCString trExamples()
+    { return "Pшнklady"; }
+
+    /*! This is put above each page as a link to the search engine. */
+    virtual QCString trSearch()
+    { return "Hledat"; }
+
+    /*! This is an introduction to the class hierarchy. */
+    virtual QCString trClassHierarchyDescription()
+    { return "Zde naleznete seznam, vyjadшujнcн vztah dмdiиnosti tшнd. "
+             "Je seшazen pшibliћnм (ale ne ъplnм) podle abecedy:";
+    }
+
+    /*! This is an introduction to the list with all files. */
+    virtual QCString trFileListDescription(bool extractAll)
+    {
+      QCString result="Zde naleznete seznam vљech ";
+      if (!extractAll) result+="dokumentovanэch ";
+      result+="souborщ se struиnэmi popisy:";
       return result;
     }
-    QCString trCompoundListDescription()
-    { return "Zde jsou tridy, struktury a "
-             "unie s kratkymi popisy:";
+
+    /*! This is an introduction to the annotated compound list. */
+    virtual QCString trCompoundListDescription()
+    { return "Sloћeninami (compound) se rozumн netriviбlnн prvky, kterй "
+             "zahrnujн tшнdy, struktury (struct), unie (union) "
+             "a rozhranн (interface). V seznamu jsou uvedeny jejich struиnй "
+             "popisy:"; 
     }
-    QCString trCompoundMembersDescription(bool extractAll)
+
+    /*! This is an introduction to the page with all class members. */
+    virtual QCString trCompoundMembersDescription(bool extractAll)
     {
-      QCString result="Zde je seznam vsech ";
-      if (!extractAll) result+="zdokumentovanych ";
-      result+="clenu tridy (metod a datovych slozek) s odkazy na ";
-      if (extractAll) result+="dokumentaci tridy pro kazdo polozku:";
-      else result+="tridy, kam patri:";
+      QCString result="Zde naleznete seznam vљech ";
+      if (!extractAll) result+="dokumentovanэch ";
+      result+="иlenщ tшнd s odkazy na ";
+      if (extractAll) 
+        result+="dokumentaci tшнd, ke kterэm pшнsluљejн:";
+      else 
+        result+="tшнdy, ke kterэm pшнsluљejн:";
       return result;
     }
-    QCString trFileMembersDescription(bool extractAll)
+
+    /*! This is an introduction to the page with all file members. */
+    virtual QCString trFileMembersDescription(bool extractAll)
     {
-      QCString result="Zde je seznam vsech ";
-      if (!extractAll) result+="zdokumentovanych ";
-      result+="globalnich deklaraci s odkazy ";
-      if (extractAll) result+="na dokumentaci k souboru pro kazdou deklaraci:";
-      else result+="na soubory, kde jsou umisteny:";
+      QCString result="Zde naleznete seznam vљech ";
+      if (!extractAll) result+="dokumentovanэch ";
+      result+="globбlnнch symbolщ, kterй jsou definovбny v souborech projektu. "
+              "Pro kaћdэ symbol je uveden odkaz na ";
+      if (extractAll) 
+        result+="dokumentaci pшнsluљnйho souboru";
+      else 
+        result+="soubor, ve kterйm je symbol definovбn";
+      result+=". Symbol mщћe oznaиovat makro, typ, instanci tшнdy, "
+              "promмnnou, konstantu, funkci, vэиet, hodnotu vэиtu a podobnм:";  
+        
       return result;
     }
-    QCString trHeaderFilesDescription()
-    {return "Zde jsou hlavickove soubory ktere tvori programove"
-            " rozhrani aplikace(API):";
-    }
-    QCString trExamplesDescription()
-    { return "Zde je seznam vsech prikladu:"; }
-    QCString trRelatedPagesDescription()
-    { return "Zde je seznam vsech souvisejicich stranek dokumentace:"; }
-    QCString trModulesDescription()
-    { return "Zde je seznam vsech modulu:"; }
-    QCString trNoDescriptionAvailable()
-    { return "Zadny popis neni k dispozici."; }
 
-    QCString trDocumentation()
+    /*! This is an introduction to the page with the list of all header files. */
+    virtual QCString trHeaderFilesDescription()
+    { return "Zde naleznete hlaviиkovй soubory, kterй tvoшн "
+             "aplikaиnн programбtorskй rozhranн (API):"; }
+
+    /*! This is an introduction to the page with the list of all examples */
+    virtual QCString trExamplesDescription()
+    { return "Zde naleznete seznam vљech pшнkladщ:"; }
+
+    /*! This is an introduction to the page with the list of related pages */
+    virtual QCString trRelatedPagesDescription()
+    { return "Zde naleznete seznam vљech souvisejнcнch strбnek dokumentace:"; }
+
+    /*! This is an introduction to the page with the list of class/file groups */
+    virtual QCString trModulesDescription()
+    { return "Zde naleznete seznam vљech modulщ:"; }
+
+    /*! This sentences is used in the annotated class/file lists if no brief
+     * description is given. 
+     */
+    virtual QCString trNoDescriptionAvailable()
+    { return "Popis nenн k dispozici"; }
+    
+    // index titles (the project name is prepended for these) 
+
+
+    /*! This is used in HTML as the title of index.html. */
+    virtual QCString trDocumentation()
     { return "Dokumentace"; }
-    QCString trModuleIndex()
-    { return "Index modulu"; }
-    QCString trHierarchicalIndex()
-    { return "Index hierarchie"; }
-    QCString trCompoundIndex()
-    { return "Index objektovych typu"; }
-    QCString trFileIndex() 
-    { return "Index souboru"; }
-    QCString trModuleDocumentation()
-    { return "Dokumentace modulu"; }
-    QCString trClassDocumentation()
-    { return "Dokumentace tridy"; }
-    QCString trFileDocumentation()
-    { return "Dokumentace souboru"; }
-    QCString trExampleDocumentation()
-    { return "Dokumentace prikladu"; }
-    QCString trPageDocumentation()
-    { return "Dokumentace stranek"; }
-    QCString trReferenceManual()
-    { return "Referencni manual"; }
-
-    QCString trDefines()
-    { return "Definice"; }
-    QCString trFuncProtos()
-    { return "Prototypy funkci"; }
-    QCString trTypedefs()
-    { return "Deklarace datovych typu(typedefs)"; }
-    QCString trEnumerations()
-    { return "Vyctove typy (enumerations)"; }
-    QCString trFunctions()
+
+    /*! This is used in LaTeX as the title of the chapter with the 
+     * index of all groups.
+     */
+    virtual QCString trModuleIndex()
+    { return "Rejstшнk modulщ"; }
+
+    /*! This is used in LaTeX as the title of the chapter with the 
+     * class hierarchy.
+     */
+    virtual QCString trHierarchicalIndex()
+    { return "Rejstшнk hierarchie tшнd"; }
+
+    /*! This is used in LaTeX as the title of the chapter with the 
+     * annotated compound index.
+     */
+    virtual QCString trCompoundIndex()
+    { return "Rejstшнk sloћenin"; }
+
+    /*! This is used in LaTeX as the title of the chapter with the
+     * list of all files.
+     */
+    virtual QCString trFileIndex() 
+    { return "Rejstшнk souborщ"; }
+
+    /*! This is used in LaTeX as the title of the chapter containing
+     *  the documentation of all groups.
+     */
+    virtual QCString trModuleDocumentation()
+    { return "Dokumentace modulщ"; }
+
+    /*! This is used in LaTeX as the title of the chapter containing
+     *  the documentation of all classes, structs and unions.
+     */
+    virtual QCString trClassDocumentation()
+    { return "Dokumentace tшнd"; }
+
+    /*! This is used in LaTeX as the title of the chapter containing
+     *  the documentation of all files.
+     */
+    virtual QCString trFileDocumentation()
+    { return "Dokumentace souborщ"; }
+
+    /*! This is used in LaTeX as the title of the chapter containing
+     *  the documentation of all examples.
+     */
+    virtual QCString trExampleDocumentation()
+    { return "Dokumentace pшнkladщ"; }
+
+    /*! This is used in LaTeX as the title of the chapter containing
+     *  the documentation of all related pages.
+     */
+    virtual QCString trPageDocumentation()
+    { return "Dokumentace souvisejнcнch strбnek"; }
+
+    /*! This is used in LaTeX as the title of the document */
+    virtual QCString trReferenceManual()
+    { return "Referenиnн pшнruиka"; }
+    
+    /*! This is used in the documentation of a file as a header before the 
+     *  list of defines
+     */
+    virtual QCString trDefines()
+    { return "Definice maker"; }
+
+    /*! This is used in the documentation of a file as a header before the 
+     *  list of function prototypes
+     */
+    virtual QCString trFuncProtos()
+    { return "Prototypy"; }
+
+    /*! This is used in the documentation of a file as a header before the 
+     *  list of typedefs
+     */
+    virtual QCString trTypedefs()
+    { return "Definice typщ"; }
+
+    /*! This is used in the documentation of a file as a header before the 
+     *  list of enumerations
+     */
+    virtual QCString trEnumerations()
+    { return "Vэиty"; }
+
+    /*! This is used in the documentation of a file as a header before the 
+     *  list of (global) functions
+     */
+    virtual QCString trFunctions()
     { return "Funkce"; }
-    QCString trVariables()
-    { return "Promenne"; }
-    QCString trEnumerationValues()
-    { return "Hodnoty vyctovych typu"; }
-    QCString trReimplementedFrom()
-    { return "Je znovu implementovan podle"; }
-    QCString trReimplementedIn()
-    { return "Je znovu implementovan v"; }
-    QCString trAuthor()
+
+    /*! This is used in the documentation of a file as a header before the 
+     *  list of (global) variables
+     */
+    virtual QCString trVariables()
+    { return "Promмnnй"; }
+
+    /*! This is used in the documentation of a file as a header before the 
+     *  list of (global) variables
+     */
+    virtual QCString trEnumerationValues()
+    { return "Hodnoty vэиtщ"; }
+    
+    /*! This is used in man pages as the author section. */
+    virtual QCString trAuthor()
     { return "Autor"; }
-    QCString trDefineDocumentation()
-    { return "Dokumentace definic pomoci maker"; }
-    QCString trFunctionPrototypeDocumentation()
-    { return "Dokumentace prototypu funkci"; }
-    QCString trTypedefDocumentation()
-    { return "Dokumentace deklaraci datovych typu(typedefs)"; }
-    QCString trEnumerationTypeDocumentation()
-    { return "Dokumentace vyctovych typu"; }
-    QCString trFunctionDocumentation()
-    { return "Dokumentace funkci"; }
-    QCString trVariableDocumentation()
-    { return "Dokumentace promennych"; }
-    QCString trCompounds()
-    { return "Polozky objektovych typu"; }
-    QCString trFiles()
-    { return "Soubory:"; }
-    QCString trGeneratedAt(const char *date,const char *projName)
+
+    /*! This is used in the documentation of a file before the list of
+     *  documentation blocks for defines
+     */
+    virtual QCString trDefineDocumentation()
+    { return "Dokumentace k definicнm maker"; }
+
+    /*! This is used in the documentation of a file/namespace before the list 
+     *  of documentation blocks for function prototypes
+     */
+    virtual QCString trFunctionPrototypeDocumentation()
+    { return "Dokumentace prototypщ"; }
+
+    /*! This is used in the documentation of a file/namespace before the list 
+     *  of documentation blocks for typedefs
+     */
+    virtual QCString trTypedefDocumentation()
+    { return "Dokumentace definic typщ"; }
+
+    /*! This is used in the documentation of a file/namespace before the list 
+     *  of documentation blocks for enumeration types
+     */
+    virtual QCString trEnumerationTypeDocumentation()
+    { return "Dokumentace vэиtovэch typщ"; }
+
+    /*! This is used in the documentation of a file/namespace before the list 
+     *  of documentation blocks for enumeration values
+     */
+    virtual QCString trEnumerationValueDocumentation()
+    { return "Dokumentace vэиtovэch hodnot"; }
+
+    /*! This is used in the documentation of a file/namespace before the list 
+     *  of documentation blocks for functions
+     */
+    virtual QCString trFunctionDocumentation()
+    { return "Dokumentace funkcн"; }
+
+    /*! This is used in the documentation of a file/namespace before the list 
+     *  of documentation blocks for variables
+     */
+    virtual QCString trVariableDocumentation()
+    { return "Dokumentace promмnnэch"; }
+
+    /*! This is used in the documentation of a file/namespace/group before 
+     *  the list of links to documented compounds
+     */
+    virtual QCString trCompounds()
+    { return "Sloћeniny"; }
+
+    /*! This is used in the documentation of a group before the list of 
+     *  links to documented files
+     */
+    virtual QCString trFiles()
+    { return "Soubory"; }
+
+    /*! This is used in the standard footer of each page and indicates when 
+     *  the page was generated 
+     */
+    virtual QCString trGeneratedAt(const char *date,const char *projName)
     { 
-      QCString result=(QCString)"Generovany dne "+date;
-      if (projName) result+=(QCString)" pro "+projName;
-      result+=(QCString)" ";
+      QCString result=(QCString)"Generovбno "+date;
+      if (projName) result+=(QCString)" pro projekt "+projName;
+      result+=(QCString)" programem";
       return result;
     }
-    QCString trWrittenBy()
-    {
-      return "napsany podle";
-    }
-    QCString trClassDiagram(const char *clName)
+    /*! This is part of the sentence used in the standard footer of each page.
+     */
+    virtual QCString trWrittenBy()
     {
-      return (QCString)"Diagram trid pro "+clName;
+      return " -- autor ";
     }
-    QCString trForInternalUseOnly()
-    { return "Jen pro interni pouziti."; }
-    QCString trReimplementedForInternalReasons()
+
+    /*! this text is put before a class diagram */
+    virtual QCString trClassDiagram(const char *clName)
     {
-      return "Znovu implementovany z internich duvodu; programove rozhrani"
-             " aplikace(API) neni zmeneno.";
+      return (QCString)"Diagram dмdiиnosti pro tшнdu "+clName;
     }
-    QCString trWarning()
-    { return "Upozorneni"; }
-    QCString trBugsAndLimitations()
-    { return "Chyby a omezeni"; }
-    QCString trVersion()
+    
+    /*! this text is generated when the \internal command is used. */
+    virtual QCString trForInternalUseOnly()
+    { return "Pouze pro vnitшnн pouћitн."; }
+
+    /*! this text is generated when the \reimp command is used. */
+    virtual QCString trReimplementedForInternalReasons()
+    { return "Reimplementovбno z internнch dщvodщ; aplikaиnн rozhranн zachovбno."; }
+
+    /*! this text is generated when the \warning command is used. */
+    virtual QCString trWarning()
+    { return "Pozor"; }
+
+    /*! this text is generated when the \bug command is used. */
+    virtual QCString trBugsAndLimitations()
+    { return "Chyby a omezenн"; }
+
+    /*! this text is generated when the \version command is used. */
+    virtual QCString trVersion()
     { return "Verze"; }
-    QCString trDate()
+
+    /*! this text is generated when the \date command is used. */
+    virtual QCString trDate()
     { return "Datum"; }
-    QCString trAuthors()
-    { return "Autor(i)"; }
-    QCString trReturns()
-    { return "ma navratovou hodnotu"; }
-    QCString trSeeAlso()
-    { return "Podrobnosti take tady"; }
-    QCString trParameters()
+
+    /*! this text is generated when the \author command is used. */
+    virtual QCString trAuthors()
+    { return "Autor/autoшi"; }
+
+    /*! this text is generated when the \return command is used. */
+    virtual QCString trReturns()
+    { return "Vracн"; }
+
+    /*! this text is generated when the \sa command is used. */
+    virtual QCString trSeeAlso()
+    { return "Viz takй"; }
+
+    /*! this text is generated when the \param command is used. */
+    virtual QCString trParameters()
     { return "Parametry"; }
-    QCString trExceptions()
-    { return "Vyjimky"; }
-    QCString trGeneratedBy()
-    { return "Generovan podle"; }
+
+    /*! this text is generated when the \exception command is used. */
+    virtual QCString trExceptions()
+    { return "Vэjimky"; }
     
-    // new since 0.49-990307 
+    /*! this text is used in the title page of a LaTeX document. */
+    virtual QCString trGeneratedBy()
+    { return "Generovбno programem"; }
+
+    // new since 0.49-990307
     
-    QCString trNamespaceList()
-    { return "Seznam prostoru jmen"; }
-    QCString trNamespaceListDescription(bool extractAll)
+    /*! used as the title of page containing all the index of all namespaces. */
+    virtual QCString trNamespaceList()
+    { return "Seznam prostorщ jmen"; }
+
+    /*! used as an introduction to the namespace list */
+    virtual QCString trNamespaceListDescription(bool extractAll)
     {
-      QCString result="Zde je seznam vsech ";
-      if (!extractAll) result+="dokumentovanych ";
-      result+="prostoru jmen s kratkymi popisy:";
+      QCString result="Zde naleznete seznam vљech ";
+      if (!extractAll) result+="dokumentovanэch ";
+      result+="prostorщ jmen se struиnэm popisem:";
       return result;
     }
-    QCString trFriends()
-    { return "Spratelene tridy, funkce a metody"; }
+
+    /*! used in the class documentation as a header before the list of all
+     *  friends of a class
+     */
+    virtual QCString trFriends()
+    { return "Friends"; }
     
 //////////////////////////////////////////////////////////////////////////
 // new since 0.49-990405
@@ -278,76 +507,75 @@ class TranslatorCzech : public Translator
     /*! used in the class documentation as a header before the list of all
      * related classes 
      */
-    QCString trRelatedFunctionDocumentation()
-    { return "Dokumentace pro spratelene funkce a ostatni"; }
+    virtual QCString trRelatedFunctionDocumentation()
+    { return "Dokumentace k friends"; }
     
 //////////////////////////////////////////////////////////////////////////
 // new since 0.49-990425
 //////////////////////////////////////////////////////////////////////////
 
     /*! used as the title of the HTML page of a class/struct/union */
-    QCString trCompoundReference(const char *clName,
-                                 ClassDef::CompoundType compType,
-                                 bool /*isTemplate*/)
+    virtual QCString trCompoundReference(const char *clName,
+                                    ClassDef::CompoundType compType)
     {
       QCString result=(QCString)clName+" ";
-      result+=" Reference";
       switch(compType)
       {
-        case ClassDef::Class:      result+=" tridy"; break;
-        case ClassDef::Struct:     result+=" struktury"; break;
-        case ClassDef::Union:      result+=" unie"; break;
-        case ClassDef::Interface:  result+=" rozhrani"; break;
-        case ClassDef::Exception:  result+=" exception"; break;
+        case ClassDef::Class:      result+=" Tшнda"; break;
+        case ClassDef::Struct:     result+=" Struktura"; break;
+        case ClassDef::Union:      result+=" Unie"; break;
+        case ClassDef::Interface:  result+=" Rozhranн"; break;
+        case ClassDef::Exception:  result+=" Vэjimka"; break;
       }
+      result+=" Reference";
       return result;
     }
 
     /*! used as the title of the HTML page of a file */
-    QCString trFileReference(const char *fileName)
+    virtual QCString trFileReference(const char *fileName)
     {
-      QCString result=fileName;
-      result+=" Reference souboru"; 
+      QCString result="Odkaz na soubor";
+      result+=fileName; 
       return result;
     }
 
     /*! used as the title of the HTML page of a namespace */
-    QCString trNamespaceReference(const char *namespaceName)
+    virtual QCString trNamespaceReference(const char *namespaceName)
     {
       QCString result=namespaceName;
-      result+=" Reference prostoru jmen";
+      result+=" Namespace Reference???";
       return result;
     }
     
     /*! \mgroup Class sections
      *  these are for the member sections of a class, struct or union 
      */
-    QCString trPublicMembers()
-    { return "Verejne metody a datove polozky"; }
-    QCString trPublicSlots()
-    { return "Verejne sloty"; }
-    QCString trSignals()
-    { return "Signaly"; }
-    QCString trStaticPublicMembers()
-    { return "Staticke verejne metody a datove polozky"; }
-    QCString trProtectedMembers()
-    { return "Chranene metody a datove polozky"; }
-    QCString trProtectedSlots()
-    { return "Chranene sloty"; }
-    QCString trStaticProtectedMembers()
-    { return "Staticke chranene metody a datove polozky"; }
-    QCString trPrivateMembers()
-    { return "Privatni metody a datove polozky"; }
-    QCString trPrivateSlots()
-    { return "Privatni sloty"; }
-    QCString trStaticPrivateMembers()
-    { return "Staticke privatni metody a datove polozky"; }
+    virtual QCString trPublicMembers()
+    { return "Veшejnй metody"; }
+    virtual QCString trPublicSlots()
+    { return "Veшejnй sloty"; }
+    virtual QCString trSignals()
+    { return "Signбly"; }
+    virtual QCString trStaticPublicMembers()
+    { return "Statickй veшejnй metody"; }
+    virtual QCString trProtectedMembers()
+    { return "Chrбnмnй metody"; }
+    virtual QCString trProtectedSlots()
+    { return "Chrбnмnй sloty"; }
+    virtual QCString trStaticProtectedMembers()
+    { return "Statickй chrбnмnй metody"; }
+    virtual QCString trPrivateMembers()
+    { return "Privбtnн metody"; }
+    virtual QCString trPrivateSlots()
+    { return "Privбtnн sloty"; }
+    virtual QCString trStaticPrivateMembers()
+    { return "Statickй privбtnн metody"; }
     /*! \endmgroup */ 
     
     /*! this function is used to produce a comma-separated list of items.
      *  use generateMarker(i) to indicate where item i should be put.
      */
-    QCString trWriteList(int numEntries)
+    virtual QCString trWriteList(int numEntries)
     {
       QCString result;
       int i;
@@ -372,62 +600,62 @@ class TranslatorCzech : public Translator
     /*! used in class documentation to produce a list of base classes,
      *  if class diagrams are disabled.
      */
-    QCString trInheritsList(int numEntries)
+    virtual QCString trInheritsList(int numEntries)
     {
-      return "dedi "+trWriteList(numEntries)+".";
+      return "Dмdн "+trWriteList(numEntries)+".";
     }
 
     /*! used in class documentation to produce a list of super classes,
      *  if class diagrams are disabled.
      */
-    QCString trInheritedByList(int numEntries)
+    virtual QCString trInheritedByList(int numEntries)
     {
-      return "je zdeden z "+trWriteList(numEntries)+".";
+      return "Zdмdмna tшнdami "+trWriteList(numEntries)+".";
     }
 
     /*! used in member documentation blocks to produce a list of 
      *  members that are hidden by this one.
      */
-    QCString trReimplementedFromList(int numEntries)
+    virtual QCString trReimplementedFromList(int numEntries)
     {
-      return "Znovu implementuje "+trWriteList(numEntries)+".";
+      return "Reimplementace z "+trWriteList(numEntries)+".";
     }
 
     /*! used in member documentation blocks to produce a list of
      *  all member that overwrite the implementation of this member.
      */
-    QCString trReimplementedInList(int numEntries)
+    virtual QCString trReimplementedInList(int numEntries)
     {
-      return "znovu implementovan v "+trWriteList(numEntries)+".";
+      return "Reimplementovбno v "+trWriteList(numEntries)+".";
     }
 
     /*! This is put above each page as a link to all members of namespaces. */
-    QCString trNamespaceMembers()
-    { return "Polozky prostoru jmen"; }
+    virtual QCString trNamespaceMembers()
+    { return "???Namespace Members"; }
 
     /*! This is an introduction to the page with all namespace members */
-    QCString trNamespaceMemberDescription(bool extractAll)
+    virtual QCString trNamespaceMemberDescription(bool extractAll)
     { 
-      QCString result="Tady je seznam vsech ";
-      if (!extractAll) result+="zdokumentovanych ";
-      result+="clenu prostoru jmen s odkazy na ";
+      QCString result="Zde naleznete seznam vљech ";
+      if (!extractAll) result+="dokumentovanэch ";
+      result+="???namespace members s odkazy na ";
       if (extractAll) 
-        result+="dukumentaci prostoru jmen pro kazdou polozku:";
+        result+="dokumentaci prostoru jmen pro kaћdэ иlen:";
       else 
-        result+="prostor jmen, kteremu patri:";
+        result+="prostory jmen, ke kterэm pшнsluљejн:";
       return result;
     }
     /*! This is used in LaTeX as the title of the chapter with the 
      *  index of all namespaces.
      */
-    QCString trNamespaceIndex()
-    { return "Index prostoru jmen"; }
+    virtual QCString trNamespaceIndex()
+    { return "Rejstшнk prostorщ jmen"; }
 
     /*! This is used in LaTeX as the title of the chapter containing
      *  the documentation of all namespaces.
      */
-    QCString trNamespaceDocumentation()
-    { return "Dokumentace prostoru jmen"; }
+    virtual QCString trNamespaceDocumentation()
+    { return "Dokumentace prostorщ jmen"; }
 
 //////////////////////////////////////////////////////////////////////////
 // new since 0.49-990522
@@ -436,7 +664,7 @@ class TranslatorCzech : public Translator
     /*! This is used in the documentation before the list of all
      *  namespaces in a file.
      */
-    QCString trNamespaces()
+    virtual QCString trNamespaces()
     { return "Prostory jmen"; }
 
 //////////////////////////////////////////////////////////////////////////
@@ -446,48 +674,49 @@ class TranslatorCzech : public Translator
     /*! This is put at the bottom of a class documentation page and is
      *  followed by a list of files that were used to generate the page.
      */
-    QCString trGeneratedFromFiles(ClassDef::CompoundType compType,
+    virtual QCString trGeneratedFromFiles(ClassDef::CompoundType compType,
         bool single)
     { // here s is one of " Class", " Struct" or " Union"
       // single is true implies a single file
       QCString result=(QCString)"Dokumentace pro ";
       switch(compType)
       {
-        case ClassDef::Class:      result+="tuto tridu"; break;
-        case ClassDef::Struct:     result+="tuto strukturu"; break;
-        case ClassDef::Union:      result+="tuto unii"; break;
-        case ClassDef::Interface:  result+="toto rozhrani"; break;
-        case ClassDef::Exception:  result+="exception"; break;
+        case ClassDef::Class:      result+="tuto tшнdu"; break;
+        case ClassDef::Struct:     result+="tuto strukturu (struct)"; break;
+        case ClassDef::Union:      result+="tuto unii (union)"; break;
+        case ClassDef::Interface:  result+="toto rozhranн"; break;
+        case ClassDef::Exception:  result+="tuto vэjimku"; break;
       }
-      result+=" byla vygenerovana z nasledujiciho souboru";
-      if (single) result+=":"; else result+="s:";
+      result+=" byla generovбna z ";
+      if (single) result+="nбsledujнcнho souboru:"; 
+      else        result+="nбsledujнcнch souborщ:";
       return result;
     }
 
     /*! This is in the (quick) index as a link to the alphabetical compound
      * list.
      */
-    QCString trAlphabeticalList()
-    { return "Abecedni seznam"; }
+    virtual QCString trAlphabeticalList()
+    { return "Abecednн seznam sloћenin"; }
 
 //////////////////////////////////////////////////////////////////////////
 // new since 0.49-990901
 //////////////////////////////////////////////////////////////////////////
 
     /*! This is used as the heading text for the retval command. */
-    QCString trReturnValues()
-    { return "Vraci hodnoty"; }
+    virtual QCString trReturnValues()
+    { return "Vracenй hodnoty"; }
 
     /*! This is in the (quick) index as a link to the main page (index.html)
      */
-    QCString trMainPage()
-    { return "Hlavni stranka"; }
+    virtual QCString trMainPage()
+    { return "Hlavnн strбnka"; }
 
     /*! This is used in references to page that are put in the LaTeX 
      *  documentation. It should be an abbreviation of the word page.
      */
-    QCString trPageAbbreviation()
-    { return "str."; }
+    virtual QCString trPageAbbreviation()
+    { return "s."; }
 
 //////////////////////////////////////////////////////////////////////////
 // new since 0.49-991003
@@ -495,16 +724,157 @@ class TranslatorCzech : public Translator
 
     virtual QCString trSources()
     {
-      return "Zdrojove soubory";
+      return "Zdroje";
     }
     virtual QCString trDefinedAtLineInSourceFile()
     {
-      return "Definice v souboru @1 na radce @0";
+      return "Definice je uvedena na шбdku @0 v souboru @1.";
     }
     virtual QCString trDefinedInSourceFile()
     {
       return "Definice v souboru @0.";
-    }    
+    }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-991205
+//////////////////////////////////////////////////////////////////////////
+
+    virtual QCString trDeprecated()
+    {
+      return "Zastaralй";
+    }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.0.0
+//////////////////////////////////////////////////////////////////////////
+
+    /*! this text is put before a collaboration diagram */
+    virtual QCString trCollaborationDiagram(const char *clName)
+    {
+      return (QCString)"Diagram tшнd pro "+clName+":";
+    }
+    /*! this text is put before an include dependency graph */
+    virtual QCString trInclDepGraph(const char *fName)
+    {
+      return (QCString)"Graf zбvislostн souborщ pro "+fName+":";
+    }
+    /*! header that is put before the list of constructor/destructors. */
+    virtual QCString trConstructorDocumentation()
+    {
+      return "Dokumentace konstruktoru a destruktoru"; 
+    }
+    /*! Used in the file documentation to point to the corresponding sources. */
+    virtual QCString trGotoSourceCode()
+    {
+      return "Zobrazit zdrojovэ text tohoto souboru.";
+    }
+    /*! Used in the file sources to point to the corresponding documentation. */
+    virtual QCString trGotoDocumentation()
+    {
+      return "Zobrazit dokumentaci tohoto souboru.";
+    }
+    /*! Text for the \pre command */
+    virtual QCString trPrecondition()
+    {
+      return "Precondition";
+    }
+    /*! Text for the \post command */
+    virtual QCString trPostcondition()
+    {
+      return "Postcondition";
+    }
+    /*! Text for the \invariant command */
+    virtual QCString trInvariant()
+    {
+      return "Invariant";
+    }
+    /*! Text shown before a multi-line variable/enum initialization */
+    virtual QCString trInitialValue()
+    {
+      return "Initializer:";
+    }
+    /*! Text used the source code in the file index */
+    virtual QCString trCode()
+    {
+      return "zdrojovэ text";
+    }
+    virtual QCString trGraphicalHierarchy()
+    {
+      return "Grafickй zobrazenн hierarchie tшнd";
+    }
+    virtual QCString trGotoGraphicalHierarchy()
+    {
+      return "Zobrazit grafickou podobu hierarchie tшнd";
+    }
+    virtual QCString trGotoTextualHierarchy()
+    {
+      return "Zobrazit textovou podobu hierarchie tшнd";
+    }
+    virtual QCString trPageIndex()
+    {
+      return "Rejstшнk strбnek";
+    }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.0
+//////////////////////////////////////////////////////////////////////////
+    
+    virtual QCString trNote()
+    {
+      return "Poznбmka";
+    }
+    virtual QCString trPublicTypes()
+    {
+      return "Veшejnй typy";
+    }
+    virtual QCString trPublicAttribs()
+    {
+      return "Veшejnй atributy";
+    }
+    virtual QCString trStaticPublicAttribs()
+    {
+      return "Statickй veшejnй atributy";
+    }
+    virtual QCString trProtectedTypes()
+    {
+      return "Chrбnмnй typy";
+    }
+    virtual QCString trProtectedAttribs()
+    {
+      return "Chrбnмnй atributy";
+    }
+    virtual QCString trStaticProtectedAttribs()
+    {
+      return "Statickй chrбnмnй atributy";
+    }
+    virtual QCString trPrivateTypes()
+    {
+      return "Privбtnн typy";
+    }
+    virtual QCString trPrivateAttribs()
+    {
+      return "Privбtnн atributy";
+    }
+    virtual QCString trStaticPrivateAttribs()
+    {
+      return "Statickй privбtnн atributy";
+    }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.3
+//////////////////////////////////////////////////////////////////////////
+
+    /*! Used as a marker that is put before a todo item */
+    virtual QCString trTodo()
+    {
+      return "Udмlat";
+    }
+    /*! Used as the header of the todo list */
+    virtual QCString trTodoList()
+    {
+      return "Seznam plбnovanэch ъprav";
+    }
+
 };
 
 #endif // TRANSLATOR_CZ_H
diff --git a/src/translator_de.h b/src/translator_de.h
index faaf665..4f8ddf2 100644
--- a/src/translator_de.h
+++ b/src/translator_de.h
@@ -25,26 +25,8 @@
 class TranslatorGerman : public Translator
 {
   public:
-    //--------------------------------------------------------------------
-    // NOTICE:
-    // the following functions are now obsolete: these are no longer used and
-    // will disappear in future versions. You do not have to translate them!
-    QCString trInherits()
-    { return "Abgeleitet von "; }
-    QCString trAnd()
-    { return "und"; }
-    QCString trInheritedBy()
-    { return "Basisklasse f&uuml;r"; }
-    QCString trReference()
-    { return "Verweis"; }
-    QCString trReimplementedFrom()
-    { return "Implementiert von"; }
-    QCString trReimplementedIn()
-    { return "erneute Implementation in"; }
-    QCString trIncludeFile()
-    { return "Include-Datei"; }
-    // end of obsolete functions
-    //--------------------------------------------------------------------
+    QCString idLanguage()
+    { return "german"; }
 
     QCString latexBabelPackage()
       // returns the name of the package that is included by LaTeX
diff --git a/src/translator_es.h b/src/translator_es.h
index a60a5ab..92466f5 100644
--- a/src/translator_es.h
+++ b/src/translator_es.h
@@ -30,34 +30,8 @@
 class TranslatorSpanish : public Translator
 {
   public:
-    //--------------------------------------------------------------------
-    // NOTICE:
-    // the following functions are now obsolete: these are no longer used and 
-    // will disappear in future versions. You do not have to translate them!
-    virtual QCString trInherits() 
-    { return "Inherits"; }
-    virtual QCString trAnd() 
-    { return "y"; }
-    virtual QCString trInheritedBy() 
-    { return "Inherited By"; }
-    virtual QCString trReference() 
-    { return "Referencia"; }
-    virtual QCString trReimplementedFrom()
-    { return "Reimplementado de"; }
-    virtual QCString trReimplementedIn()
-    { return "Reimplementado en"; }
-    virtual QCString trIncludeFile()
-    { return "Include File"; }
-    virtual QCString trGeneratedFrom(const char *s,bool single)
-    { 
-      QCString result=(QCString)"The documentation for this"+s+
-                     " was generated from the following file";
-      if (single) result+=":"; else result+="s:";
-      return result;
-    }
-    // end of obsolete functions 
-    //--------------------------------------------------------------------
-
+    virtual QCString idLanguage()
+    { return "spanish"; }
     /*! returns the name of the package that is included by LaTeX */
     virtual QCString latexBabelPackage() 
     { return ""; }
diff --git a/src/translator_fi.h b/src/translator_fi.h
index d85d0c0..504008f 100644
--- a/src/translator_fi.h
+++ b/src/translator_fi.h
@@ -79,6 +79,8 @@ positiiviset kommentit otetaan ilolla vastaan.
 class TranslatorFinnish : public Translator
 {
   public:
+    QCString idLanguage()
+    { return "finnish"; }
     QCString latexBabelPackage()
       // returns the name of the package that is included by LaTeX
     { return "finnish"; }
diff --git a/src/translator_fr.h b/src/translator_fr.h
index c7c5636..c7d9486 100644
--- a/src/translator_fr.h
+++ b/src/translator_fr.h
@@ -25,6 +25,8 @@
 class TranslatorFrench : public Translator
 {
   public:
+    QCString idLanguage()
+    { return "french"; }
     /*! returns the name of the package that is included by LaTeX */
     QCString latexBabelPackage()
     { return "french"; }
diff --git a/src/translator_hr.h b/src/translator_hr.h
index 66ce398..40e5733 100644
--- a/src/translator_hr.h
+++ b/src/translator_hr.h
@@ -23,6 +23,8 @@
 class TranslatorCroatian : public Translator
 {
   public:
+    QCString idLanguage()
+    { return "croatian"; }
     QCString latexBabelPackage()
     { return "croatian"; }
     QCString trRelatedFunctions()
diff --git a/src/translator_it.h b/src/translator_it.h
index f032b52..23e7ce1 100644
--- a/src/translator_it.h
+++ b/src/translator_it.h
@@ -33,34 +33,8 @@
 class TranslatorItalian : public Translator
 {
   public:
-    //--------------------------------------------------------------------
-    // NOTICE:
-    // the following functions are now obsolete: these are no longer used and
-    // will disappear in future versions. You do not have to translate them!
-    QCString trInherits()
-    { return "Inherits"; }
-    QCString trAnd()
-    { return "and"; }
-    QCString trInheritedBy()
-    { return "Inherited By"; }
-    QCString trReference()
-    { return "Reference"; }
-    QCString trReimplementedFrom()
-    { return "Reimplemented from"; }
-    QCString trReimplementedIn()
-    { return "Reimplemented in"; }
-    QCString trIncludeFile()
-    { return "Include File"; }
-    QCString trGeneratedFrom(const char *s,bool single)
-    {
-      QCString result=(QCString)"The documentation for this"+s+
-                     " was generated from the following file";
-      if (single) result+=":"; else result+="s:";
-      return result;
-    }
-    // end of obsolete functions
-    //--------------------------------------------------------------------
-
+    QCString idLanguage()
+    { return "italian"; }
     /*! returns the name of the package that is included by LaTeX */
     QCString latexBabelPackage()
     { return "italian"; }
diff --git a/src/translator_jp.h b/src/translator_jp.h
index 38c8670..650dc5d 100644
--- a/src/translator_jp.h
+++ b/src/translator_jp.h
@@ -23,33 +23,8 @@
 class TranslatorJapanese : public Translator
 {
   public:
-    //--------------------------------------------------------------------
-    // NOTICE:
-    // the following functions are now obsolete: these are no longer used and 
-    // will disappear in future versions. You do not have to translate them!
-    QCString trInherits()
-    { return "·Сѕµ"; }
-    QCString trAnd()
-    { return "¤И"; }
-    QCString trInheritedBy()
-    { return "јЎ¤Л·Сѕµ¤µ¤м¤Ж¤¤¤Ю¤№ЎЈ"; }
-    QCString trReference()
-    { return "ҐкҐХҐЎҐмҐуҐ№"; }
-    QCString trReimplementedFrom()
-    { return "јЎ¤тєЖДкµБ"; }
-    QCString trReimplementedIn()
-    { return "јЎ¤ЗєЖДкµБ"; }
-    QCString trIncludeFile()
-    { return "Ґ¤ҐуҐЇҐлЎјҐЙҐХҐЎҐ¤Ґл"; }
-    QCString trGeneratedFrom(const char *s,bool)
-    { 
-      QCString result=(QCString)"¤і¤О"+s+
-	           "¤ЛВР¤№¤лҐЙҐ­ҐеҐбҐуҐИ¤П°КІј¤ОҐХҐЎҐ¤Ґл¤«¤йАёА®¤µ¤м¤Ю¤·¤їЎЈ";
-      return result;
-    }
-    // end of obsolete functions 
-    //--------------------------------------------------------------------
-
+    QCString idLanguage()
+    { return "japanese"; }
     /*! returns the name of the package that is included by LaTeX */
     QCString latexBabelPackage()
     { return "a4j"; }
diff --git a/src/translator_nl.h b/src/translator_nl.h
index e2de0fc..99812f2 100644
--- a/src/translator_nl.h
+++ b/src/translator_nl.h
@@ -23,6 +23,8 @@
 class TranslatorDutch : public Translator
 {
   public:
+    QCString idLanguage()
+    { return "dutch"; }
     QCString latexBabelPackage()
     { return "dutch"; }
     QCString trRelatedFunctions()
diff --git a/src/translator_ru.h b/src/translator_ru.h
index 7f509be..84fc1b9 100644
--- a/src/translator_ru.h
+++ b/src/translator_ru.h
@@ -22,6 +22,8 @@
 class TranslatorRussian : public Translator
 {
   public:
+    QCString idLanguage()
+    { return "russian"; }
     QCString latexBabelPackage()
     { return "russian"; }
     QCString trRelatedFunctions()
diff --git a/src/translator_se.h b/src/translator_se.h
index afeea50..92f2461 100644
--- a/src/translator_se.h
+++ b/src/translator_se.h
@@ -67,6 +67,8 @@ Problem!
 class TranslatorSwedish : public Translator
 {
   public:
+    QCString idLanguage()
+    { return "swedish"; }
     QCString latexBabelPackage()
     { return "swedish"; }
 
diff --git a/src/util.cpp b/src/util.cpp
index 9643a7d..f9ab566 100644
--- a/src/util.cpp
+++ b/src/util.cpp
@@ -212,6 +212,10 @@ ClassDef *getResolvedClass(const char *name)
   QCString *subst = typedefDict[name];
   if (subst) // there is a typedef with this name
   {
+    if (*subst==name) // avoid resolving typedef struct foo foo; 
+    {
+      return classDict[name];
+    }
     int count=0; // recursion detection guard
     QCString *newSubst;
     while ((newSubst=typedefDict[*subst]) && count<10)
@@ -241,11 +245,20 @@ QCString removeRedundantWhiteSpace(const QCString &s)
   if (s.isEmpty()) return s;
   QCString result;
   uint i;
-  for (i=0;i<s.length();i++)
+  uint l=s.length();
+  for (i=0;i<l;i++)
   {
     char c=s.at(i);
-    if (c!=' ' ||
-	(i!=0 && i!=s.length()-1 && isId(s.at(i-1)) && isId(s.at(i+1)))
+    if (i<l-2 && c=='<' && s.at(i+1)!='<')
+    {
+      result+="< ";
+    }
+    else if (i>0 && c=='>' && s.at(i-1)!='>')
+    {
+      result+=" >";
+    }
+    else if (c!=' ' ||
+	(i!=0 && i!=l-1 && isId(s.at(i-1)) && isId(s.at(i+1)))
        )
     {
       if ((c=='*' || c=='&' || c=='@') && 
@@ -547,7 +560,7 @@ void writeQuickLinks(OutputList &ol,bool compact,bool ext)
   //bool texEnabled = ol.isEnabled(OutputGenerator::Latex);
   ol.disableAllBut(OutputGenerator::Html);
   QCString extLink,absPath;
-  if (ext) { extLink="_doc"; absPath="/"; }
+  if (ext) { extLink="_doc"; absPath=Config::docURL+"/"; }
   //if (manEnabled) ol.disable(OutputGenerator::Man);
   //if (texEnabled) ol.disable(OutputGenerator::Latex);
   if (compact) ol.startCenter(); else ol.startItemList();
@@ -651,7 +664,7 @@ void writeQuickLinks(OutputList &ol,bool compact,bool ext)
   if (Config::searchEngineFlag)
   {
     if (!compact) ol.writeListItem();
-    ol.startQuickIndexItem("_cgi","");
+    ol.startQuickIndexItem("_cgi",Config::cgiURL+"/"+Config::cgiName);
     parseText(ol,theTranslator->trSearch());
     ol.endQuickIndexItem();
   } 
@@ -968,6 +981,8 @@ static void trimNamespaceScope(QCString &t1,QCString &t2)
 void stripIrrelevantConstVolatile(QCString &s)
 {
   int i,j;
+  if (s=="const")    { s.resize(0); return; }
+  if (s=="volatile") { s.resize(0); return; }
   i = s.find("const ");
   if (i!=-1) 
   {
@@ -2323,8 +2338,10 @@ QCString insertTemplateSpecifierInScope(const QCString &scope,const QCString &te
 QCString stripScope(const char *name)
 {
   QCString result = name;
-  int i=result.findRev("::");
-  if (i!=-1)
+  int ti=result.find('<'); // find start of template
+  if (ti==-1) ti=result.length();
+  int i = ti>2 ? result.findRev("::",ti-2) : -1; // find scope just before template
+  if (i!=-1) // found scope
   {
     result=result.right(result.length()-i-2);
   }
-- 
cgit v0.12

