1# 2# 3# Mod�le HTG de base pour la g�n�ration de pages LaTeX 4# Doit �tre inclus en premier par le mod�le 5# Peut �tre compl�t� par des proc�dures issues du mod�le sp�cifique 6# 7# Historique 8# 1999/06/20 : pda : ajout du langage latex 9# 1999/07/02 : pda : simplification 10# 1999/07/26 : pda : ajout de lt et gt 11# 12 13############################################################################### 14# Mise en forme du texte 15############################################################################### 16 17proc htg_gras {} { 18 if [catch {set arg [htg getnext]} v] then {error $v} 19 return "\\textbf {$arg}" 20} 21 22proc htg_teletype {} { 23 if [catch {set arg [htg getnext]} v] then {error $v} 24 return "\\texttt {$arg}" 25} 26 27proc htg_italique {} { 28 if [catch {set arg [htg getnext]} v] then {error $v} 29 return "\\textem {>$arg}" 30} 31 32proc htg_souligne {} { 33 if [catch {set arg [htg getnext]} v] then {error $v} 34 return "\\textem {$arg}" 35} 36 37proc htg_retrait {} { 38 if [catch {set arg [htg getnext]} v] then {error $v} 39 return "\\begin {quote}\n$arg\n\\end {quote}" 40} 41 42proc htg_image {} { 43 if [catch {set source [htg getnext]} v] then {error $v} 44 if [catch {set texte [htg getnext]} v] then {error $v} 45 return "<IMG SRC=\"$source\" ALT=\"$texte\">" 46} 47 48proc htg_liste {} { 49 if [catch {set arg [htg getnext]} v] then {error $v} 50 return "\\begin {itemize}\n$arg\n\\end {itemize}" 51} 52 53proc htg_enumeration {} { 54 if [catch {set arg [htg getnext]} v] then {error $v} 55 return "\\begin {enumerate}\n$arg\n\\end {enumerate}" 56} 57 58proc htg_item {} { 59 if [catch {set arg [htg getnext]} v] then {error $v} 60 return "\\item $arg\n" 61} 62 63proc htg_titre {} { 64 if [catch {set niveau [htg getnext]} v] then {error $v} 65 if [catch {set texte [htg getnext]} v] then {error $v} 66 switch $niveau { 67 1 { set texte "\\begin {center}\n\\huge\\textbf {$texte}\n\\end {center}" } 68 2 { set texte "\\section {$texte}" } 69 3 { set texte "\\subsection {$texte}" } 70 4 { set texte "\\subsubsection {$texte}" } 71 5 { set texte "\\paragraph {$texte}" } 72 } 73 return $texte 74} 75 76proc htg_verbatim {} { 77 if [catch {set texte [htg getnext]} v] then {error $v} 78 return "\\begin {verbatim}\n$texte\n\\end{verbatim}" 79} 80 81############################################################################### 82# Caract�res sp�ciaux 83############################################################################### 84 85proc htg_lt {} { 86 return {$<$} 87} 88 89proc htg_gt {} { 90 return {$>$} 91} 92 93############################################################################### 94# URLs et liens 95############################################################################### 96 97proc htg_lien {} { 98 if [catch {set texte [htg getnext]} v] then {error $v} 99 if [catch {set url [htg getnext]} v] then {error $v} 100 return "\\textbf {$texte}\\footnote {$url}" 101} 102 103proc htg_ancre {} { 104 if [catch {set nom [htg getnext]} v] then {error $v} 105 if [catch {set texte [htg getnext]} v] then {error $v} 106 return "\\label {$nom} $texte" 107} 108 109############################################################################## 110# Tableaux 111############################################################################## 112 113# <TABLE 114# ALIGN=CENTER/LEFT/RIGHT => le tableau dans la page 115# BGCOLOR=couleur 116# BORDER=n 117# BORDERCOLOR=? 118# WIDTH=n% 119# 120# <TR 121# ALIGN=CENTER/LEFT/RIGHT => le texte dans les cellules 122# BGCOLOR= 123# VALIGN=BASELINE/BOTTOM/CENTER/TOP => le texte dans les cellules 124# 125# <TD 126# ALIGN=CENTER/LEFT/RIGHT => le texte dans la cellule 127# BGCOLOR= 128# COLSPAN=n 129# ROWSPAN=n 130# VALIGN=BASELINE/BOTTOM/CENTER/TOP 131# WIDTH=n% 132 133proc htg_tableau {} { 134 if [catch {set attributs [htg getnext]} v] then {error $v} 135 if [catch {set defaut [htg getnext]} v] then {error $v} 136 if [catch {set contenu [htg getnext]} v] then {error $v} 137 138 # 139 # Analyser les attributs du tableau 140 # 141 142 set border 0 143 set center 0 144 foreach a $attributs { 145 set cv [split $a =] 146 set c [string tolower [lindex $cv 0]] 147 set v [string tolower [lindex $cv 1]] 148 149 switch $c { 150 border { 151 set border $v 152 } 153 align { 154 if {[string compare $v center] == 0} then { 155 set center 1 156 } 157 } 158 } 159 } 160 161 # 162 # D�terminer les attributs des colonnes du tableau 163 # 164 165 set cols "" 166 foreach col $defaut { 167 set align l 168 foreach a $col { 169 set cv [split $a =] 170 set c [string tolower [lindex $cv 0]] 171 set v [string tolower [lindex $cv 1]] 172 173 switch $c { 174 align { 175 switch $v { 176 center { set align c } 177 left { set align l } 178 right { set align r } 179 } 180 } 181 width { 182 # XXX ! Mettre la largeur correcte 183 set align p@${v}mm 184 } 185 } 186 } 187 if {$border > 0} then { append cols "|" } 188 append cols $align 189 } 190 if {$border > 0} then { append cols "|" } 191 192 # 193 # Parcourir les lignes et les cases, et les mettre en forme 194 # 195 196 set resultat "" 197 foreach ligne $contenu { 198 # 199 # la premi�re ligne est sp�ciale 200 # 201 if {$border > 0 && [string compare $resultat ""] == 0} then { 202 append resultat "\\hline " 203 } 204 205 set numcol 0 206 foreach case $ligne { 207 set nbcol [lindex $case 0] 208 set attrcase [lindex $case 1] 209 set texte [lindex $case 2] 210 211 if {$numcol > 0} then { 212 append resultat "& " 213 } 214 215 if {$nbcol > 1} then { 216 # XXX ! int�grer les attributs de cette case 217 set r "\\multicolumn {$nbcol} {|l|} {$texte}" 218 } else { 219 set r $texte 220 } 221 222 append resultat $r 223 224 incr numcol 225 } 226 append resultat "\\\\ \n" 227 if {$border > 0} then { 228 append resultat "\\hline " 229 } 230 } 231 232 set resultat "\\begin {tabular} {$cols}\n$resultat\n\\end {tabular}" 233 234 if {$center} then { 235 set resultat "\\begin {center}\n$resultat\n\\end {center}" 236 } 237 238 return $resultat 239} 240 241proc fusion-attributs {a1 a2} { 242 foreach a $a1 { 243 set cv [split $a =] 244 set c [lindex $cv 0] 245 set v [lindex $cv 1] 246 set tab($c) $v 247 } 248 249 foreach a $a2 { 250 set cv [split $a =] 251 set c [lindex $cv 0] 252 set v [lindex $cv 1] 253 set tab($c) $v 254 } 255 256 set r "" 257 foreach a [array names tab] { 258 append r "$a=$tab($a) " 259 } 260 return $r 261} 262 263# 264# Attributs des colonnes du tableau 265# Ceux-ci sont d�finis par \casedefauttableau {}, puis sont 266# renvoy�s � \tableau qui les propage ensuite vers les diff�rentes cases. 267# Chaque colonne poss�de plusieurs attributs (s�par�s par des espaces) 268# Les diff�rentes colonnes sont s�par�es par des ";" 269# 270 271proc htg_casedefauttableau {} { 272 if [catch {set attributs [htg getnext]} v] then {error $v} 273 return [list $attributs] 274} 275 276proc htg_bordure {} { 277 if [catch {set largeur [htg getnext]} v] then {error $v} 278 if [catch {set couleur [htg getnext]} v] then {error $v} 279 return [list BORDER=$largeur] 280} 281 282# BASELINE/BOTTOM/CENTER/TOP 283proc htg_centragevertical {} { 284 if [catch {set centrage [htg getnext]} v] then {error $v} 285 return "" 286} 287 288# CENTER/LEFT/RIGHT 289proc htg_centragehorizontal {} { 290 if [catch {set centrage [htg getnext]} v] then {error $v} 291 return [list ALIGN=$centrage] 292} 293 294proc htg_taille {} { 295 if [catch {set taille [htg getnext]} v] then {error $v} 296 return [list WIDTH=$taille] 297} 298 299proc htg_couleurfond {} { 300 if [catch {set couleur [htg getnext]} v] then {error $v} 301 return "" 302} 303 304# 305# Le contenu du tableau (les lignes et les cases) proprement dit 306# Une ligne est r�cup�r�e sous la forme d'une liste : {case case ...} 307# o� chaque case est une liste : {nbcols attributs texte} 308# 309 310proc htg_lignetableau {} { 311 if [catch {set texte [htg getnext]} v] then {error $v} 312 return [list $texte] 313} 314 315proc htg_casetableau {} { 316 if [catch {set attributs [htg getnext]} v] then {error $v} 317 if [catch {set texte [htg getnext]} v] then {error $v} 318 return [list [list 1 $attributs $texte]] 319} 320 321proc htg_multicasetableau {} { 322 if [catch {set nbcol [htg getnext]} v] then {error $v} 323 if [catch {set attributs [htg getnext]} v] then {error $v} 324 if [catch {set texte [htg getnext]} v] then {error $v} 325 326 return [list [list $nbcol $attributs $texte]] 327} 328 329############################################################################## 330# M�morisation des parties 331############################################################################## 332 333proc htg_set {} { 334 global partie 335 336 if [catch {set variable [htg getnext]} v] then {error $v} 337 if [catch {set partie($variable) [htg getnext]} v] then {error $v} 338 return {} 339} 340 341proc htg_partie {} { 342 global partie 343 344 if [catch {set id [htg getnext]} v] then {error $v} 345 if [catch {set texte [htg getnext]} v] then {error $v} 346 set texte [nettoyer-latex $texte] 347 set partie(id) $texte 348 return {} 349} 350 351proc htg_recuperer {} { 352 global partie 353 354 if [catch {set id [htg getnext]} v] then {error $v} 355 return $partie($id) 356} 357 358############################################################################## 359# Mise en forme LaTeX 360############################################################################## 361 362proc nettoyer-latex {texte} { 363 # convertir les ~ en espaces ins�cables et les ~~ en ~ 364 regsub -all {~} $texte {\ } texte 365 regsub -all {\ \ } $texte {\~{}} texte 366 regsub -all {\ } $texte {~} texte 367 368 return $texte 369} 370