hevea-2.36-manual/0000755004317100512160000000000014252364060014037 5ustar marangetcristalhevea-2.36-manual/manual008.html0000644004317100512160000003476414252364056016455 0ustar marangetcristal With a little help from LATEX Previous Up Next

6 With a little help from LATEX

Sometimes, HEVEA just cannot process its input, but it remains acceptable to have LATEX process it, to produce an image from LATEX output and to include a link to this image into HEVEA output. HEVEA provides a limited support for doing this.

6.1 The image file

While outputting doc.html, HEVEA echoes some of its input to the image file, doc.image.tex. Part of this process is done at the user’s request. More precisely, the following two constructs send text to the image file:

\begin{toimage}
text
\end{toimage}
 
%BEGIN IMAGE
text
%END IMAGE

Additionally, \usepackage commands, top-level and global definitions are automatically echoed to the image file. This enables using document-specific commands in text above.

Output to the image file builds up a current page, which is flushed by the \imageflush command. This command has the following effect: it outputs a strict page break in the image file, increments the image counter and output a <img src="pagename.png"> tag in HEVEA output file, where pagename is build from the image counter and HEVEA output file name. Then the imagen script has to be run by:

# imagen doc

This will process the doc.image.tex file through LATEX, dvips, ghostscript and a few others tools, which must all be present (see section C.4.1), finally producing one pagename.png file per page in the image file.

The usage of imagen is described at section C.1.5. Note that imagen is a simple shell script. Unix users can pass hevea the command-line option -fix. Then hevea will itself call imagen, when appropriate.

6.2 A toy example

Consider the “blob” example from section 4.2. Here is the active part of a blob.tex file:

 \newcommand{\blob}{\rule[.2ex]{1ex}{1ex}}
 \blob\ Blob \blob

This time, we would like \blob to produce a small black square, which \rule[.2ex]{1ex}{1ex} indeed does in LATEX. Thus we can write:

 \newcommand{\blob}{%
 \begin{toimage}\rule[.2ex]{1ex}{1ex}%
 \end{toimage}%
 \imageflush}
 \blob\ Blob \blob

Now we issue the following two commands:

 # hevea blob.tex
 # imagen blob

And we get:

Blob

Observe that the trick can be used to replace missing symbols by small .png images. However, the cost may be prohibitive, text rendering is generally bad, fine placement is ignored and font style changes are problematic. Cost can be lowered using \savebox, but the other problems remain.

6.3 Including Postscript images

In this section, a technique to transform included Postscript images into included bitmap images is described. Note that this technique is used by HEVEA implementation of the graphics package (see section B.14.1), which provides a more standard manner to include Postscript images in LATEX documents.

Included images are easy to manage: it suffices to let LATEX do the job. Let round.ps be a Postscript file, which is included as an image in the source file round.tex (which must load the epsf package):

 \begin{center}
 \epsfbox{round.ps}
 \end{center}

Then, HEVEA can have this image translated into a inlined (and centered) .png image by modifying source as follows:

 \begin{center}
 %BEGIN IMAGE
 \epsfbox{round.ps}
 %END IMAGE
 %HEVEA\imageflush
 \end{center}

(Note that the round.tex file still can be processed by LATEX, since comment equivalents of the toimage environment are used and that the \imageflush command is inside a %HEVEA comment — see section 5.3.)

Then, processing round.tex through HEVEA and imagen yields:

It is important to notice that things go smoothly because the \usepackage{epsf} command gets echoed to the image file. In more complicated cases, LATEX may fail on the image file because it does not load the right packages or define the right macros.

However, the above solution implies modifying the original LATEX source code. A better solution is to define the \epsfbox command, so that HEVEA echoes \epsfbox and its argument to the image file and performs \imageflush:

 \newcommand{\epsfbox}[1]{%
 \begin{toimage}
 \epsfbox{#1}
 \end{toimage}
 \imageflush}

Such a definition must be seen by HEVEA only. So, it is best put in a separate file whose name is given as an extra argument on HEVEA command-line (see section 5.1). Putting it in the document source protected inside an %HEVEA comment is a bad idea, because it might then get echoed to the image file and generate trouble when LATEX is later run by imagen.

Observe that the above definition of \epsfbox is a definition and not a redefinition (i.e. \newcommand is used and not \renewcommand), because HEVEA does not know about \epsfbox by default. Also observe that this not a recursive definition, since commands do not get expanded inside the toimage environment.

Finally, if the Postscript image is produced from a bitmap, it is a pity to translate it back into a bitmap. A better idea is first to generate a PNG file from the bitmap source independantly and then to include a link to that PNG file in html output, see section 8.2 for a description of this more adequate technique.

6.4 Using filters

Some programs extend LATEX capabilities using a filter principle. In such a scheme, the document contains source fragments for the program. A first run of the program on LATEX source changes these fragments into constructs that LATEX (or a subsequent stage in the paper document production chain, such as dvips) can handle. Here again, the rule of the game is keeping HEVEA away from the normal process: first applying the filter, then making HEVEA send the filter output to the image file, and then having imagen do the job.

Consider the gpic filter, for making drawings. Source for gpic is enclosed in .PS.PE, then the result is available to subsequent LATEX source as a TEX box \box\graph. For instance the following source, from a smile.tex file, draws a “Smile!” logo as a centered paragraph:

 .PS
 ellipse "{\Large\bf Smile!}"
 .PE
 \begin{center}
 ~\box\graph~
 \end{center}

Both the image description (.PS.PE) and usage (\box\graph) are for the image file, and they should be enclosed by %BEGIN IMAGE%END IMAGE comments. Additionally, the image link is put where it belongs by an \imageflush command:

 %BEGIN IMAGE
 .PS
 ellipse "{\Large\bf Smile!}"
 .PE
 %END IMAGE
 \begin{center}
 %BEGIN IMAGE
 ~\box\graph~
 %END IMAGE
 %HEVEA\imageflush
 \end{center}

The gpic filter is applied first, then come hevea and imagen:

 # gpic -t < smile.tex > tmp.tex
 # hevea tmp.tex -o smile.html
 # imagen smile

And we get:

Observe how the -o argument to HEVEA is used and that imagen argument is HEVEA output basename (see section C.1.1.2 for the full definition of HEVEA output basename).

In the gpic example, modifying user source cannot be totally avoided. However, writing in a generic style saves typing. For instance, users may define the following environment for centered gpic pictures in LATEX:

 \newenvironment{centergpic}{}{\begin{center}~\box\graph~\end{center}}

Source code will now be as follows:

 \begin{centergpic}
 .PS
 ellipse "{\Large\bf Smile!}"
 .PE
 \end{centergpic}

HEVEA will process this source correctly, provided it is given its own definition for the centergpic environment beforehand:

 \newenvironment{centergpic}
   {\begin{toimage}}
   {\box\graph\end{toimage}\begin{center}\imageflush\end{center}}

Assuming that the definition above is in a smile.hva file, the command sequence for translating smile.tex now is:

 # gpic -t < smile.tex > tmp.tex
 # hevea smile.hva tmp.tex -o smile.html
 tmp.tex:5: Warning: ignoring definition of \centergpic
 tmp.tex:5: Warning: not defining environment centergpic
 # imagen smile

The warnings above are normal: they are issued when HEVEA runs across the LATEX-intended definition of the centergpic environment and refuses to override its own definition for that environment.


Previous Up Next hevea-2.36-manual/thaihevea.htoc0000644004317100512160000000045314252364057016664 0ustar marangetcristal\begin{tocenv} \tocitem \@locref{sec1}{\begin{@norefs}\@print{1}\quad{}Latin/Thai Character Set{}\end{@norefs}} \tocitem \@locref{sec2}{\begin{@norefs}\@print{2}\quad{}Thai in \LaTeX{}\end{@norefs}} \tocitem \@locref{sec3}{\begin{@norefs}\@print{3}\quad{}Thai in \hevea{}\end{@norefs}} \end{tocenv} hevea-2.36-manual/manual001.png0000644004317100512160000000653214252364055016255 0ustar marangetcristalPNG  IHDRv &iCCPiccHgPY<@BPC*%Z(ҫ@PEl+4EE\"kE t,ʺqQAYp?{ossp e{bRɎ(tջ{i常r)teJOYLgWX\2XyKο,]~ )sT8بlOrTzV $G&D~SGfDnr&AltL:5204_gK!FgE_zs zt@WOm|:3z @(U t08|A $`(E`8@-hM<.L@ށA2@F 7 Bh( ʀrPT UAuP t݄84 }aXև0v}p4 ^O6< "@]p$BV)GVC!Bd h(&JerFTVT1 uՁECDh2Z@Ёht]nDѓw aa0Θ Lf3sӆL`X VkaӱJI%vG)p`\.Wk] p xq:o—;IA"X| q B+aH$͉^XvbqD%iRi/82! L ے&US{1O,BlXXؐ+ NP6Pr(3;Yq8WJ)Hq"HJ IKIJGJJIKa8y"Ֆ͒="{MvV.g)Ǘ+;-Hז,L_~NAQI!ER¬"CV1NLMZ)VL $L`V0{"eyeg :JJU*[5JLGU殖֢HVQ?ާ>حѩ1͒fX9֘&YF3U^FuX6m]}G1Չ93 |UҪU$]nnCM/OS~~>&   .y݆i񍪍&v\mu:ƑGLMv|253Θ՘lOv19|y-Եl^Zä́UUКij}ZhlfSoV6¶vʼn伲3صs-[{'BCSGhGfhgWΣ<lqu%V>svu.֪MZ26,b&*4r**4j:*@LMLyl,7*us\m|GD\bh$jR|Robrv`NJA0"`H*hL֧uӗ? ͌]֙ՙdKd'eo޴gTcOQ{rswol m ڳMu[NO [A^i۝;OrR V (m? Yrˆ[EEE[?Xި%%Ga%oDDiNe̲²7Yn\^{p(㐰­Rr_bULp]u[|͞iU-x4:zccǞ77Q'z̚KZ!'lsWnk]8q/v=s}ٚvZ{aԱC) _}ABEKr.]N<{%DƞWzuW8}nX8[[Mowf[@;]wv8d3tyoy02*|`a׏2-<>+|"ߵ~o /ۏ?yx??'󟓟O)M5MMqb݋ɗ)/f 櫳/ M^̛oy=}na>|ZZ.V|R?B,sMT cHRMz&u0`:pQ<3PLTE# # # # # # # # # # # # # # # <tRNS\v?!b`2bKGD , pHYsaa?itIME 1GЯIDATHU F:oIf3۞?^Τt{O *vG[ƎD%WHeӡ S'@}"B0{U 6#2 dV8%/W 2o\!6d2]E 1H,:4\<6r̞#~co\vP3Ca%Cmq,i*/{RnEE+eޑ7 )Kr9yB!o ń2d6x(-ŅGRJ],_Z_SfSp{Aw3Gp@{`m'Ũ jL0VkOeq>jϺhgjG>tb3E шe2XSڶ!2d89턋1-܆n[[Gn׳? ϗ%tEXtdate:create2022-06-15T16:09:49+02:008$%tEXtdate:modify2022-06-15T16:09:49+02:00IK-tEXticc:copyrightCopyright Artifex Software 2011Ŵ1tEXticc:descriptionArtifex Software sRGB ICC Profile 2tEXticc:manufacturerArtifex Software sRGB ICC Profile\~=+tEXticc:modelArtifex Software sRGB ICC Profile1(tEXtSoftwareGPL Ghostscript 9.26XnIENDB`hevea-2.36-manual/manual027.html0000644004317100512160000001601714252364056016445 0ustar marangetcristal Classes, Packages and Page Styles Previous Up Next

B.5 Classes, Packages and Page Styles

B.5.1 Document Class

Both LATEX 2є \documentclass and old LATEX \documentstyle are accepted. Their argument style is interpreted by attempting to load a style.hva file. Presently, only the style files article.hva, seminar.hva, book.hva and report.hva exist, the latter two being equivalent.

If one of the recognized styles has already been loaded at the time when \documentclass or \documentstyle is executed, then no attempt to load a style file is made. This allows to override the document style file by giving one of the four recognized style files of HEVEA as a command line argument (see 2.2).

Conversely, if HEVEA attempt to load style.hva fails, then a fatal error is flagged, since it can be sure that the document cannot be processed.

B.5.2 Packages and Page Styles

HEVEA reacts to \usepackage[options]{pkg} in the following way:

  1. The whole \usepackage command with its arguments gets echoed to the image file (see 6).
  2. HEVEA attempt to load file pkg.hva, (see section C.1.1.1 on where HEVEA searches for files).

Note that HEVEA will not fail if it cannot load pkg.hva and that no warning is issued in that case.

The HEVEA distribution contains implementations of some packages, such as verbatim, colors, graphics, etc.

In some situations it may not hurt at all if HEVEA does not implement a package, for instance HEVEA does not provide an implementation for the fullpage package.

Users needing an implementation of a package that is widely used and available are encouraged to contact the author. Experienced users may find it fun to attempt to write package implementations by themselves.

B.5.3 The Title Page and Abstract

All title related commands exist with the following peculiarities:

  • The argument of the \title command appears in the html document header. As a consequence titles should remain simple. Normal design (as regards HEVEA) is for \title to occur in the document preamble, so that the title is known at the time when the document header is emitted, this is, while processing \begin{document}. However, there are two subtleties.
    1. If no \title command occurs in document preamble and that one \title command appears in the document, then the title is saved into the .haux file for the next run of HEVEA to put it in the html document header.
    2. If \title commands are present both in preamble and after \begin{document} the former takes precedence.
  • When not present the date is left empty. The \today command generates will work properly only if hevea is invoked with the -exec xxdate.exe option. Otherwise \today generates nothing and a warning is issued.

The abstract environment is present in all base styles, including the book style. The titlepage environment does nothing.

HEVEA places the \title argument into an h1-element with class titlemain and puts the arguments of \author and \date into a h3-element with class titlerest. The abstract goes into a blockquote-element with class abstract.


Previous Up Next hevea-2.36-manual/manual040.html0000644004317100512160000000445214252364057016441 0ustar marangetcristal Practical information Previous Up

Part C
Practical information


Previous Up hevea-2.36-manual/manual003.html0000644004317100512160000000512214252364056016432 0ustar marangetcristal How to get started Up Next

1 How to get started

Assume that you have a file, a.tex, written in LATEX, using the article, book or report style. Then, translation is achieved by issuing the command:

# hevea a.tex

Probably, you will get some warnings. If HEVEA does not crash, just ignore them for the moment (Section 4 explains how to correct errors).

If everything goes fine, this will produce a new file, a.html, which you can visualise through a html browser.

If you wish to experiment HEVEA on small LATEX source fragments, then launch HEVEA without arguments. HEVEA will read its standard input and print the translation on its standard output. For instance:

# hevea
$x \in \mathcal{E}$
^D
<span style="font-style:italic">x</span> &#X2208; <span style="color:red"><span style="font-style:italic">E</span></span>

Incidentally, notice that the symbol “∈” translates to the appropriate numerical character reference and that the calligraphic letter “E” renders as a red “E”. You can find some more elaborate examples in the on-line documentation.


Up Next hevea-2.36-manual/manual005.html0000644004317100512160000006573214252364056016451 0ustar marangetcristal A note on style Previous Up Next

3 A note on style

3.1 Spacing, Paragraphs

Sequence of spaces normally are translated into one single space. Newlines in the input document undergo a special treatement. A newline triggers a special scanning mode that reads all following spaces and newlines. In case at least one additional newline character is read, then HEVEA executes the \par command. Otherwise, HEVEA outputs a single newline character. This process approximates TEX process for introducting paragraph breaks and, as a result, empty lines produce paragraph breaks.

Space after commands with no argument is skipped (as in LATEX) — however this is not true in math mode, as explained in section 3.2.1.

The following two subsections describe management of paragraphs and spaces after command sequences in greater detail. They can be skipped in first reading.

3.1.1 Spurious Paragraphs

Paragraphs are rendered by the means of p elements. HEVEA is a bit simplistic in breaking paragraphs and spurious paragraphs may be present in the final html document. Normally, as HEVEA never outputs p elements whose contents is made of spaces only, this should not happen very often. Unfortunately, some commands do not produce any output in LATEX, while they do produce output in HEVEA: those commands are \label, \index etc. HEVEA translates \label{name} into the anchor <a id="name"></a>. As a result, the following source fragment will introduce a spurious paragraph.

This a first paragraph.

\label{label}

This is another paragraph.

Indeed, whe have the following translation:

<p>This a first paragraph.</p>
<p><a id="label"></a></p>
<p>This is another paragraph.</p>

Which your browser renders as follows — with additional borders emphasizing p elements.

This a first paragraph.

This is another paragraph.

Most of the time, such extra paragraphs remain unnoticed. Of course, they can be supressed by erasing one of the empty lines. For instance:

This a first paragraph.

\label{label}
This is another paragraph.

A similar situation occurs when a sectioning command is followed by \label and a paragraph break:

\section*{A section}\label{section:label}

First paragraph. 

Produced html is, after a few cosmetic simplifications:

<h2 class="section">A section</h2>
<p><a id="section:label"></a></p>
<p>First paragraph.</p>

Output is so, because closing the element h2 implies re-opening a new paragraph. Your browser renders the above html fragment as follows:

A section

First paragraph.

Here, two possible re-writing of source are:

\section*{A\label{section:label} section}

First paragraph.
\section*{A section}

\label{section:label}First paragraph.

In all cases, this amounts to avoiding a paragraph whose contents consists in a sole \label command.

Spurious paragraphs are more easily seen by running hevea with the command-line option -dv, which instructs hevea to add border on some of the elements it produces, including p elements.

3.1.2 Spaces after Commands

Space after commands with no argument is skipped. Consider the following example:

\newcommand{\open}{(}
\newcommand{\close}{)}
\open text opened by ``\verb+\open+''
and closed by ``\verb+\close+''\close.

We get:

(text opened by “\open” and closed by “\close”).

In the output above, the space after \open does not find its way to the output.

More generally, HEVEA tries to emulate LATEX behaviour in all situations, but discrepancies probably exist. Thus, users are invited to make explicit what they want. This is good practice anyway, because LATEX is mysterious here. Consider the following example, where the \tryspace macro is first applied and then expansed by hand:

\newcommand{\bfsymbol}{\textbf{symbol}}
\newcommand{\tryspace}[1]{#1 XXX}

Some space: \tryspace{\bfsymbol}\\
No space: \bfsymbol XXX

Spacing is a bit chaotic here, the space after symbol remains when #1 is substituted for it by LATEX (or HEVEA).

Some space : symbol XXX
No space : symbolXXX

Note that, if a space before “XXX” is wanted, then one should probably write:

\newcommand{\tryspace}[1]{#1{} XXX}

Finally, whether the tabulation character is a space or not is random, so avoid tabs in your source document.

3.2 Math mode

HEVEA math mode is not very far from normal text mode, except that all letters are shown in italics and that space after macros is echoed.

However, typesetting math formulas in html rises two difficulties. First, formulas contain symbols, such as Greek letters; second, even simple formulas do not follow the simple basic typesetting model of html.

3.2.1 Spacing in math mode

By contrast with LATEX, spaces from the input are significant in math mode, this feature allows users to instruct HEVEA on how to put space in their formulas. For instance, \alpha\rightarrow\beta is typeset without spaces between symbols, whereas \alpha \rightarrow \beta produces these spaces.

\alpha\rightarrow\beta : α→β
\alpha \rightarrow \beta : α → β

Note that LATEX ignores spaces in math mode, so that users can freely adjust HEVEA output without changing anything to LATEX output.

3.2.2 Symbols


Figure 1: Some symbols
\in:   \notin: 
\int:   \prod: 
\preceq:   \prec: 
\leq:   \geq: 
\cup:   \cap: 
\supset:   \subset: 
\supseteq:   \subseteq: 

With respect to previous versions of HEVEA since the begining, the treatment of symbols has significantly evolved. Outputting symbols is now performed by using Unicode character references, an option that much more complies whith standards than the previous option of selecting a “symbol” font. Observe that this choice is now possible, because more and more browsers correctly display such references. See Figure 1 for a few such symbols.

However, this means that ancient or purposely limited browsers (such as text-oriented browsers) cannot display maths, as translated by HEVEA. For authors that insist on avoiding symbols that cannot be shown by any browser, HEVEA offers a degraded mode that outputs text in place of symbols. HEVEA operates in this mode when given the -textsymbols command-line option. Replacement text is in English. For instance. the “∈” symbol is replace by “in”. This is far from being satisfactory, but degraded mode may be appropriate for documents than contain few symbols.

3.2.3 Displays

Apart from containing symbols, formulas specify strong typesetting constraints: sub-elements must be combined together following patterns that departs from normal text typesetting. For instance, fractions numerators and denominators must be placed one above the other. HEVEA handles such constraints in display mode only.

The main two operating modes of HEVEA are text mode and display mode. Text mode is the mode for typesetting normal text, when in this mode, text items are echoed one following the other and paragraph breaks are just blank lines, both in input and output. The so called displayed-paragraph environments of LATEX (such as center or quote) are rendered by html block-level elements (such as div or blockquote). Rendering is correct becauses both LATEX displayed environments and html block-level elements start a new line. Conversly, since opening a html block-level elements means starting a new line, any text that sould appear inside a paragraph must be translated using only html text-level elements. HEVEA chooses to translate in-text formulas that way.

HEVEA display mode allows more control on text placement, since entering display mode means opening a html table element and that tables allow to control the relative position of their sub-elements. Displays come in two flavor, horizontal displays and vertical displays. An horizontal display is a one-row table, while a vertical display is a one-column table. These tables holds display sub-elements, displays sub-elements being centered vertically in horizontal display mode and horizontally in vertical display mode.

Display mode is first opened by opening a displaymath environment (e.g. by $$ or \[). Then, sub-displays are opened by LATEX constructs which require them. For instance, a displayed fraction (\frac) opens a vertical display.

The distinction between text and display modes clearly appears while typesetting math formulas. An in-text formula such as $\int_1^2 xdx = \frac{3}{2}$ appears as: ∫12 xdx =3/2, while the same formula has a better aspect in display mode:

2


1
xdx = 
3
2

As a consequence, HEVEA is more powerful in display mode and formulas should be displayed as soon as they get a bit complicated. This rule is also true in LATEX but it is more strict in HEVEA, since html capabilities to typeset formulas inside text are quite poor. In particular, it is not possible to get in-text “real” fractions or in-text limit-like subscripts.

Users should remember that HEVEA is not TEX or LATEX and that HEVEA author neither is D. E. Knuth nor L. Lamport. Thus, some formulas may be rendered poorly. For instance, two fractions with different denominator and numerator height look strange.

1
N
i=0
Ui
 = 
N
i=0
Ui
1

The reason is that vertical displays in an horizontal display are html tables that always get centered in the vertical direction. Such a crude model cannot faithfully emulate any TEX box placement.

Users can get an idea on how HEVEA combines elements in display mode by giving the -dv command-line option, which instructs HEVEA to add borders to the table elements introduced by displays.

3.2.4 Arrays and display mode

By contrast with formulas, which HEVEA attempts to render with text-level elements only when they appear inside paragraphs, LATEX arrays always translate to the block-level element table, thereby introducing non-desired line breaks before and after in-text arrays. As a consequence, in-text arrays yield an acceptable output, only while alone in a paragraph.

Consider the following source:

This is a small array:
\begin{tabular}{|cc|}
\hline item-1 & item-2 \\
\hline\end{tabular}. Next sentence.

We get:

This is a small array:
item-1item-2
. Next sentence.

However, since in some sense, all html tables are displayed, the array and tabular environments implicitly open display mode, thus allowing a satisfactory typesetting of formulas in arrays. More precisely, array elements whose column format specification is l, c or r are typeset in display mode (see section B.10.2).

3.3 Warnings

When HEVEA thinks it cannot translate a symbol or construct properly, it issues a warning. This draws user attention onto a potential problem. However, rendering may be correct.

In the following (silly) example, HEVEA gets nervous because of the complicated length given as argument to \hspace:

\newlength{\mylength}\setlength{\mylength}{5pt}
\begin{tabular}{c@{\hspace{\mylength}}c}
Before & After
\end{tabular}

Running HEVEA on this input produces a warning:

# hevea manual.tex
...
manual.tex:697: Warning: Command not found: \mylength
manual.tex:697: Warning: \hspace with arg ''
...

However the final rendering is correct:

BeforeAfter

Note that all warnings can be suppressed with the -s (silent) option. When a warning reveals a real problem, it can often be cured by writing a specific macro. The next two sections introduce HEVEA macros, then section 4 describes how to proceed with greater detail.

3.4 Commands

Just like LATEX, HEVEA can be seen as a macro language, macros are rewritten until no more expansion is possible. Then, either some characters (such as letters, integers…) are outputed or some internal operation (such as changing font attributes, or arranging text items in a certain manner) are performed.

This scheme favors easy extension of program capabilities by users. However, predicting program behaviour and correcting errors may prove difficult, since final output or errors may occur after several levels of macro expansion. As a consequence, users can tailor HEVEA to their needs, but it remains a subtle task. Nevertheless, happy LATEX users should enjoy customizing HEVEA, since this is done by writing LATEX code.

3.5 Style choices

LATEX and html differ in many aspects. For instance, LATEX allows fine control over text placement, whereas html does not. More symbols and font attributes are available in LATEX than in html. Conversely, html has font attributes, such as color, which standard LATEX has not.

Therefore, there are many situations where HEVEA just cannot render the visual effect of LATEX constructions. Here some choices have to be made. For instance, calligraphic letters (\mathcal) are rendered in red.

If you are not satisfied with HEVEA rendering of text style declarations, then you can choose your own, by redefining the \cal macros, using \renewcommand, the macro redefinition operator of LATEX. The key point is that you need not worry about HEVEA internals: just redefine the old-LATEX style text-style declarations (i.e. \it, \sc, etc.) and everything should get fine:

\renewcommand{\sc}{\Huge}
\renewcommand{\cal}{\em}

(See sections 4 and 5 on how to make such changes while leaving your file processable by LATEX, and section 10.2 for a more thorough descripton of customizing type styles).

With such redefinitions, we get:

This is small caps and this is CALLIGRAPHIC LETTERS

Note that many of LATEX commands and environments are defined in the hevea.hva file that HEVEA loads before processing any input. These constructs are written using LATEX source code, in the end they invoke HEVEA internal commands.

Other LATEX constructs, such as LATEX key constructs or HEVEA internal commands (see section 8.3), that require special processing are defined in HEVEA source code. However, the vast majority of these definitions can be overridden by a redefinition. This may prove useless, since there is little point in redefining core constructs such as \newcommand for instance.


Previous Up Next hevea-2.36-manual/manual046.html0000644004317100512160000000667514252364057016460 0ustar marangetcristal Acknowledgements Previous Up Next

C.6 Acknowledgements

The following people contributed to HEVEA development:

  • Philip A.Viton, maintains a Windows (win32) port of HEVEA.
  • Tibault Suzanne authored the HTML 5 generator that now is the default generator of HEVEA.
  • Abhishek Thakur implemented most of the new features of version 1.08, including, translations of symbols to Unicode entities, the babel package, and style sheet support.
  • Christian Queinnec wrote an extra lexer to translate code snippets produced by its tool VideoC for writing pedagogical documents on programming. The very principle he introduced for interfacing the videoc lexer with HEVEA main lexer is now used extensively throughout HEVEA source code.
  • Andrew Seagar is at the origin of support for the Thai language. He is the author of the document “How to Use HEVEA with the Thai Character Set”.
  • Pierre Boulet, by using HEVEA as a stage in his tool MlDoc for documenting Objective Caml source code, forced me into debugging HEVEA implementation of the alltt environment.
  • Nicolas Tessaud implemented the -text and -info output modes (see section 11).
  • Georges Mariano asked for many feature, and argued a lot to have them implemented.
  • Many users contributed by sending bug reports.

Previous Up Next hevea-2.36-manual/manual003.png0000644004317100512160000000613014252364055016251 0ustar marangetcristalPNG  IHDR5. &iCCPiccHgPY<@BPC*%Z(ҫ@PEl+4EE\"kE t,ʺqQAYp?{ossp e{bRɎ(tջ{i常r)teJOYLgWX\2XyKο,]~ )sT8بlOrTzV $G&D~SGfDnr&AltL:5204_gK!FgE_zs zt@WOm|:3z @(U t08|A $`(E`8@-hM<.L@ށA2@F 7 Bh( ʀrPT UAuP t݄84 }aXև0v}p4 ^O6< "@]p$BV)GVC!Bd h(&JerFTVT1 uՁECDh2Z@Ёht]nDѓw aa0Θ Lf3sӆL`X VkaӱJI%vG)p`\.Wk] p xq:o—;IA"X| q B+aH$͉^XvbqD%iRi/82! L ے&US{1O,BlXXؐ+ NP6Pr(3;Yq8WJ)Hq"HJ IKIJGJJIKa8y"Ֆ͒="{MvV.g)Ǘ+;-Hז,L_~NAQI!ER¬"CV1NLMZ)VL $L`V0{"eyeg :JJU*[5JLGU殖֢HVQ?ާ>حѩ1͒fX9֘&YF3U^FuX6m]}G1Չ93 |UҪU$]nnCM/OS~~>&   .y݆i񍪍&v\mu:ƑGLMv|253Θ՘lOv19|y-Եl^Zä́UUКij}ZhlfSoV6¶vʼn伲3صs-[{'BCSGhGfhgWΣ<lqu%V>svu.֪MZ26,b&*4r**4j:*@LMLyl,7*us\m|GD\bh$jR|Robrv`NJA0"`H*hL֧uӗ? ͌]֙ՙdKd'eo޴gTcOQ{rswol m ڳMu[NO [A^i۝;OrR V (m? Yrˆ[EEE[?Xި%%Ga%oDDiNe̲²7Yn\^{p(㐰­Rr_bULp]u[|͞iU-x4:zccǞ77Q'z̚KZ!'lsWnk]8q/v=s}ٚvZ{aԱC) _}ABEKr.]N<{%DƞWzuW8}nX8[[Mowf[@;]wv8d3tyoy02*|`a׏2-<>+|"ߵ~o /ۏ?yx??'󟓟O)M5MMqb݋ɗ)/f 櫳/ M^̛oy=}na>|ZZ.V|R?B,sMT cHRMz&u0`:pQ<0PLTE# # # # # # # # # # # # # # uitRNSvǎ!֣?\|:bKGD pHYsaa?itIME 1GЯIDATӝ1 0>J(+#x]S7%s`R\˗<B7,H)t fQnHz׮oQҖ,QSJG|%DDC=b5T(G'jS7E  XppI*pD8?s[`Z c5o%tEXtdate:create2022-06-15T16:09:49+02:008$%tEXtdate:modify2022-06-15T16:09:49+02:00IK-tEXticc:copyrightCopyright Artifex Software 2011Ŵ1tEXticc:descriptionArtifex Software sRGB ICC Profile 2tEXticc:manufacturerArtifex Software sRGB ICC Profile\~=+tEXticc:modelArtifex Software sRGB ICC Profile1(tEXtSoftwareGPL Ghostscript 9.26XnIENDB`hevea-2.36-manual/manual004.png0000644004317100512160000001271014252364055016253 0ustar marangetcristalPNG  IHDRNQ͂* &iCCPiccHgPY<@BPC*%Z(ҫ@PEl+4EE\"kE t,ʺqQAYp?{ossp e{bRɎ(tջ{i常r)teJOYLgWX\2XyKο,]~ )sT8بlOrTzV $G&D~SGfDnr&AltL:5204_gK!FgE_zs zt@WOm|:3z @(U t08|A $`(E`8@-hM<.L@ށA2@F 7 Bh( ʀrPT UAuP t݄84 }aXև0v}p4 ^O6< "@]p$BV)GVC!Bd h(&JerFTVT1 uՁECDh2Z@Ёht]nDѓw aa0Θ Lf3sӆL`X VkaӱJI%vG)p`\.Wk] p xq:o—;IA"X| q B+aH$͉^XvbqD%iRi/82! L ے&US{1O,BlXXؐ+ NP6Pr(3;Yq8WJ)Hq"HJ IKIJGJJIKa8y"Ֆ͒="{MvV.g)Ǘ+;-Hז,L_~NAQI!ER¬"CV1NLMZ)VL $L`V0{"eyeg :JJU*[5JLGU殖֢HVQ?ާ>حѩ1͒fX9֘&YF3U^FuX6m]}G1Չ93 |UҪU$]nnCM/OS~~>&   .y݆i񍪍&v\mu:ƑGLMv|253Θ՘lOv19|y-Եl^Zä́UUКij}ZhlfSoV6¶vʼn伲3صs-[{'BCSGhGfhgWΣ<lqu%V>svu.֪MZ26,b&*4r**4j:*@LMLyl,7*us\m|GD\bh$jR|Robrv`NJA0"`H*hL֧uӗ? ͌]֙ՙdKd'eo޴gTcOQ{rswol m ڳMu[NO [A^i۝;OrR V (m? Yrˆ[EEE[?Xި%%Ga%oDDiNe̲²7Yn\^{p(㐰­Rr_bULp]u[|͞iU-x4:zccǞ77Q'z̚KZ!'lsWnk]8q/v=s}ٚvZ{aԱC) _}ABEKr.]N<{%DƞWzuW8}nX8[[Mowf[@;]wv8d3tyoy02*|`a׏2-<>+|"ߵ~o /ۏ?yx??'󟓟O)M5MMqb݋ɗ)/f 櫳/ M^̛oy=}na>|ZZ.V|R?B,sMT cHRMz&u0`:pQ<A qh-v+ @LXR0a\B!zm=SE8{dZg>KD0'h&*gZl5;Qk嵿5႕ b.`-b4V?6{ ]?QTias I4ILSdؑsժ+ V%o%X,Xqa~fSevQQ V1G_o(`ePmT$r+݊Bcz@x!O.xA> >\6 -Umez%G@=Ӣ {,vjU]=:|RN"O,6f~:d>S"F3m&ڨjѤ6N2YJJ뀈@`iOx*xU] lN#^ґ%$}rz3wa:}ҳL Q|8' 铵 NfO_ X\.w[hz87vNLtI(ds?X}7.1\s+ ڦju)̐q%[pZI lO'Tm8|j fԺaz8A4d*U{"W`^ U\j'GtWijO[i)r7>GU~Km!l➩:6ӑ\dR{9 #z*p* Viͫ2"o,17Z\O ?WRNc?ʔ7 >ehJ(i\NխˇY̎ʗŻm{ю~)e=h?B\}qpI| !?v.wu2x"([hEaSMp8 PrSpܓiVtK"xt(~R TP戋p'w78 )Za4)ձkXN=Nkhp4{m{ %|$sq:ȏq"NpOyc#s78']N,eIFU8d+](.5N'fa/G5k09D䈫2Uv:9'9G80/ @/3Wq{ ;B^k:> N=اC.FL!|D|G oB~3UOzp|5}=?@~gr3Sh sSFZ2K ˟-+i34HzT+ټnMf?07fzv⼞ }NƼQeeOi>gॵawۉGZcY%g>u~:=qoEb\LC$fbC>k\OjV"GzN/F:_]$8 ~c$:ub7c^zP1`']]>&N`*7Rd9ԫcVEB a$K7{Ih[QNd繘I8_ɶH&oFoﶞ-> G,tZ1{B%$UzQtr4du#U?(2IW ec'd2.>OY4mxZhR7nIkjQ?< yěy(Jw06n6V-۵.IFc#2wo*f˶oҦƷ B G?^̆lb%tEXtdate:create2022-06-15T16:09:49+02:008$%tEXtdate:modify2022-06-15T16:09:49+02:00IK-tEXticc:copyrightCopyright Artifex Software 2011Ŵ1tEXticc:descriptionArtifex Software sRGB ICC Profile 2tEXticc:manufacturerArtifex Software sRGB ICC Profile\~=+tEXticc:modelArtifex Software sRGB ICC Profile1(tEXtSoftwareGPL Ghostscript 9.26XnIENDB`hevea-2.36-manual/manual023.html0000644004317100512160000001772714252364056016452 0ustar marangetcristal Commands and Environments Up Next

B.1 Commands and Environments

B.1.1 Command Names and Arguments

LATEX comments that start with “%” and end at end of line are ignored and produce no output. Usually, HEVEA ignore such comments. However, HEVEA processes text that follows “%HEVEA” and some other comments have a specific meaning to it (see section 5.3).

Command names follow strict LATEX syntax. That is, apart from #, $, ~, _ and ^, they either are “\” followed by a single non-letter character or “\” followed by a sequence of letters. Additionally, the letter sequence may be preceded by “@” (and this is the case of many of HEVEA internal commands), or terminated by “*” (starred variants are implemented as plain commands).

Users are strongly advised to follow strict LATEX syntax for arguments. That is, mandatory arguments are enclosed in curly braces {} and braces inside arguments must be properly balanced. Optional arguments are enclosed in square brackets []. However, HEVEA does its best to read arguments even when they are not enclosed in curly braces. Such arguments are a single, different from “\”, “{” and “ ”, character or a command name. Thus, constructs such as \'ecole, $a_1$ or $a_\Gamma$ are recognized and processed as école a1 and aΓ. By contrast, a^\mbox{...} is not recognized and must be written a^{\mbox{...}}.

Also note that, by contrast with LATEX, comments are parsed during argument scanning, as an important consequence brace nesting is also checked inside comments.

With respect to previous versions, HEVEA has been improved as regards emulation of complicated argument passing. That is, commands and their arguments can now appear in different static text bodies. As a consequence, HEVEA correctly processes the following source:

\newcommand{\boite}{\textbf}
\boite{In bold}

The definition of \boite makes it reduces as \textbf and HEVEA succeeds in fetching the argument “{In bold}”. We get

In bold

The above example arguably is no “legal” LATEX, but HEVEA handles it. Of course, there remains numerous “clever” LATEX tricks that exploits TEX internal behaviour, which HEVEA does not handle. For instance consider the following source:

\newcommand{\boite}[1]{\textbf#1}
\boite{{In bold}, Not in Bold.}

LATEX typesets the text “In bold” using bold font, leaving the rest of the text alone. While HEVEA typesets everything using bold font. Here is HEVEA output:

In bold, Not in Bold.

Note that, in most similar situations, HEVEA will likely crash.

As a conclusion of this important section, Users are strongly advised to use ordinary command names and curly braces and not to think too much the TEX way.

B.1.2 Environments

Environment opening and closing is performed like in LATEX, with \begin{env} and \end{env}. The *-form of an environment is a plain environment.

It is not advised to use \env and \endenv in place of \begin{env} and \end{env}.

B.1.3 Fragile Commands

Fragile commands are not relevant to HEVEA and \protect is defined as a null command.

B.1.4 Declarations

Scope rules are the same as in LATEX.

B.1.5 Invisible Commands

I am a bit lost here. However spaces in the output should correspond to users expectations. Note that, to HEVEA being invisible commands is a static property attached to command name.

B.1.6 The \\ Command

The \\ and \\* commands are the same, they perform a line break, except inside arrays where they end the current row. Optional arguments to \\ and \\* are ignored.


Up Next hevea-2.36-manual/manual017.html0000644004317100512160000000151314252364056016437 0ustar marangetcristal Notes
7
Sent to a separate file
8
Sent to a separate file
hevea-2.36-manual/manual036.html0000644004317100512160000004015714252364056016447 0ustar marangetcristal Pictures and Colours Previous Up Next

B.14 Pictures and Colours

B.14.1 The picture environment and the graphics Package

It is possible to have pictures and graphics processed by imagen (see section 6.1). In the case of the picture environment it remains users responsibility to explicitly choose source chunks that will get rendered as images. In the case of the commands from the graphics package, this choice is made by HEVEA.

For instance consider the following picture:

\newcounter{cms}
\setlength{\unitlength}{1mm}
\begin{picture}(50,10)
\put(0,7){\makebox(0,0)[b]{cm}}
\multiput(10,7)(10,0){5}{\addtocounter{cms}{1}\makebox(0,0)[b]{\arabic{cms}}}
\multiput(1,0)(1,0){49}{\line(0,1){2.5}}
\multiput(5,0)(10,0){5}{\line(0,1){5}}
\thicklines
\put(0,0){\line(1,0){50}}
\multiput(0,0)(10,0){6}{\line(0,1){5}}
\end{picture}

Users should enclose all picture elements in a toimage environment (or inside %BEGIN IMAGE%END IMAGE comments) and insert an \imageflush command, where they want the image to appear in html output:

%BEGIN IMAGE
\newcounter{cms}
\setlength{\unitlength}{1mm}
\begin{picture}(50,10)
  ...
\end{picture}
%END IMAGE
%HEVEA\imageflush

This will result in normal processing by LATEX and image inclusion by HEVEA:

All commands from the graphics package are implemented using the automatic image inclusion feature. More precisely, the outermost invocations of the \includegraphics, \scalebox, etc. commands are sent to the image image file and there will be one image per outermost invocation of these commands.

For instance, consider a document doc.tex that loads the graphics package and that includes some (scaled) images by:

\begin{center}
\scalebox{.5}{\includegraphics{round.ps}}
\scalebox{.75}{\includegraphics{round.ps}}
\includegraphics{round.ps}
\end{center}

Then, issuing the following two commands:

# hevea doc.tex
# imagen doc

yields html that basically consists in three image links, the images being generated by imagen.

Since the advent of pdflatex, using \includegraphics to insert bitmap images (e.g. .gif or .jpg) became frequent. In that case, users are advised not to use HEVEA default implementation of the graphics package. Instead, they may use a simple variation of the technique described in Section 8.2.

B.14.2 The color Package

HEVEA partly implements the color package. Implemented commands are \definecolor, \color, \colorbox, \textcolor, \colorbox and \fcolorbox. Other commands do not exist. At startup, colours black, white, red, green, blue, cyan, yellow and magenta are pre-defined.

Colours are defined by \definecolor{name}{model}{spec}, where name is the color name, model is the color model used, and spec is the color specification according to the given model. Defined colours are used by the declaration \color{name} and by the command \textcolor{name}{text}, which change text color. Please note that, the \color declaration accepts color specifications directly when invoked as \color[model]{spec}. The \textcolor command has a similar feature.

As regards color models, HEVEA implements the rgb, cmyk, hsv and hls color models. In those models, color specifications are floating point numbers less than one. For instance, here is the definition for the red color:

\definecolor{red}{rgb}{1, 0, 0}

The named color model is also supported, in this model color specification are just names… Named colours are the ones of dvips.

GreenYellow, Yellow, Goldenrod, Dandelion, Apricot, Peach, Melon, YellowOrange, Orange, BurntOrange, Bittersweet, RedOrange, Mahogany, Maroon, BrickRed, Red, OrangeRed, RubineRed, WildStrawberry, Salmon, CarnationPink, Magenta, VioletRed, Rhodamine, Mulberry, RedViolet, Fuchsia, Lavender, Thistle, Orchid, DarkOrchid, Purple, Plum, Violet, RoyalPurple, BlueViolet, Periwinkle, CadetBlue, CornflowerBlue, MidnightBlue, NavyBlue, RoyalBlue, Blue, Cerulean, Cyan, ProcessBlue, SkyBlue, Turquoise, TealBlue, Aquamarine, BlueGreen, Emerald, JungleGreen, SeaGreen, Green, ForestGreen, PineGreen, LimeGreen, YellowGreen, SpringGreen, OliveGreen, RawSienna, Sepia, Brown, Tan, Gray, Black, White.

There are at least three ways to use colours from the named model.

  1. Define a color name for them.
  2. Specify the named color model as an optional argument to \color and \textcolor.
  3. Use the names directly (HEVEA implements the color package with the usenames option given).

That is:

  1. \definecolor{rouge-brique}{named}{BrickRed}\textcolor{rouge-brique}{Text as a brick}.
  2. \textcolor[named]{BrickRed}{Text as another brick}.
  3. \textcolor{BrickRed}{Text as another brick}.

Which yields:

  1. Text as a brick.
  2. Text as another brick.
  3. Text as another brick.

HEVEA also implements the \colorbox and \fcolorbox commands.

\colorbox{red}{Red background},
\fcolorbox{magenta}{red}{Red background, magenta border}.
Red background, Red background, magenta border.

Those two commands accept an optional first argument that specifies the color model, as \textcolor does:

\fcolorbox[named]{RedOrange}{Apricot}{Apricot background, RedOrange border}.
Apricot background, RedOrange border.

Colours should be used carefully. Too many colours hinders clarity and some of the colours may not be readable on the document background color.

B.14.2.1 The bgcolor environment

With respect to the LATEX color package, HEVEA features an additional bgcolor environment, for changing the background color of some subparts of the document. The bgcolor environment is a displayed environment and it normally starts a new line. Simple usage is \begin{bgcolor}{color}\end{bgcolor}, where color is a color defined with \definecolor. Hence the following source yield a paragraph with a red background:

\begin{bgcolor}{red}
\color{yellow}Yellow letters on a red backgroud
\end{bgcolor}
Yellow letters on a red background

The bgcolor environment is implemented by one-cell table element, it takes an optional argument that is used as an attribute for the inner td element (default value is style="padding:1em"). Advanced users may change the default, for instance as:

\begin{bgcolor}[style="padding:0"]{yellow}
\color{red}Red letters on a yellow backgroud
\end{bgcolor}

The resulting output will be red letters on a yellow background and no padding:

Red letters on a yellow background, no padding

B.14.2.2 From High-Level Colours to Low-Level Colours

High-level colours are color names defined with \definecolor. Low-level colours are html-style colours. That is, they are either one of the sixteen conventional colours black, silver etc., or a RGB hexadecimal color specification of the form "#XXXXXX".

One changes the high-level high-color into a low-level color by \@getcolor{high-color}. Low-level colours are appropriate inside html attributes and as arguments to the \@fontcolor internal macro. An example of \@getcolor usage can be found at the end of section 8.5.

There is also \@getstylecolor command that acts like\@getcolor, except that it does not output the double quotes around RGB hexadecimal color specifications. Such low-level colours are appropriate for style definitions in cascading style sheets [CSS-2]. See Section 9.3 for an example.


Previous Up Next hevea-2.36-manual/manual010.png0000644004317100512160000001164314252364056016255 0ustar marangetcristalPNG  IHDR~1bKGD̿ pHYsaa?itIME 2pIDATxϫ.Y?g dمhƀq1Dw. =,+,zxҁ0f1 .mN:BǞE=]]U]qX/ۿϷ Gne *}77ozt}d.G&[ }3r 6mZ:B/ 4K ]m~ep?>#GSٌ%#GFA@|Ԗm]`y/n\,>b@;A06(2iFNؿCƃ] u, ٜ 'ŷiJ4) 2];iIm3fo,7|4%mjCjirv *ۢ@ @˯&Rz/?PM CSG 9=>Jzd>JX aCGF/`bPC rS {c%CC~cG+4ߚKc1$WM@-zȾa)0h7p͋ME4^D)}&c03}ڥ /pG?NԀ^4 +h47ud )\0 t@M!B4zJ 8wm.d (O]C uxarʁ. |ICl"R{1 .t"" f`jyDFN}ƭأwqsAna%" >#[srhũ7q}vP$9/͜uKG6KrН wB*%9f'6oZY*:9Op( ZҟyW'dAIcV͞v\#03dPӢ%4@﹒1aN%GY0IQS8FZ һZ5i0.^ɞ&|.9mZr':\v-U$N{ٝlˇb@9fAT:oyه[Zgh8o(0|ϟQ3H<-!k8p/F҃8me}e}?:0`(0; s'l 4P=U@@.є F ,w~x~bk\CO9ݸƳx{_@s4 x( NIGXD )-30|]ۤNg 'z67Nχn<) ."%%!wG{S4V瞺Pd YP,xaG'狭Ϟlr _@ebR8a%QRC']XE >-~{mSNϘs&pF?_>>;q_:ooBNtu_]+dq ߡWAj -ӯRV;A.4@H/U's)+Y 1kt] fxʻO3@YV J:sT"_G+-2!]O۳C_ !F.R-M%$BEмpȞÊLW% 8\8 ?sKR{닍4{/߬+.ʐTY>[y0thڣ4uHB/lxW&kʶM@{Jh~0K9oLwA?OEFmH"Vc> ^l(kn5,ۯ!F5_ MuʪܭMY bwh$1]ӅUv)z{AJaO뼎TDKx/΋~lO00v-mRq.uge)]0_:i(rf1hN,6.g-mDyZ{Eޟ5;2/ASPvHq8W}D2x!Kmt.ĖsfC/l^* (n'rٶ21lo+mg͵<~UR:~j $e~3)毌x^vZ(kyM<~d9l19T-  1'1 g΃hzdp&~n%Bx4x.&; _S<}kQe`Z{zLdl.|ɺq ~"^8oƠ}*fUޢ<0#§R{{ZX+R`).96=w/}×w -뗀PU)e7y|7Ы׾=mB.OHk̏=^V"+g%2}W.;ď(3bosʽk+ O< f1οϭ[Sw}ٴ5wn{_ <e5~vckWB-٬o2[ۼv")ϼ6%kﹷ3o=-d}KhȔ✊A S)ѵz.ܽn4[$ɇ?| (H Czԅѯ;nFֆܣ?W31.b3zJaD~]3`x5vC3dʟQlUodb# Y/$-:?wUhw.\.~H=&MANI2'T@9.3i a!os{>oaaB}{zd9~xV/Lz&9ý#@'m,?۪/2srRv`\*4BLcvkb_ _Ӯ.01nu?{xm!웓7ʒzzo6%0+wNMqZ-{5NW]-N'q86ۋ%r}1|%lo.do'_|im);UCKUdhuv:v^[HhCx/MOV_V| ܹRky%tEXtdate:create2022-06-15T16:09:50+02:00aa%tEXtdate:modify2022-06-15T16:09:50+02:00-tEXticc:copyrightCopyright Artifex Software 2011Ŵ1tEXticc:descriptionArtifex Software sRGB ICC Profile 2tEXticc:manufacturerArtifex Software sRGB ICC Profile\~=+tEXticc:modelArtifex Software sRGB ICC Profile1(tEXtSoftwareGPL Ghostscript 9.26XnIENDB`hevea-2.36-manual/manual043.html0000644004317100512160000000467314252364057016451 0ustar marangetcristal Availability Previous Up Next

C.3 Availability

C.3.1 Internet stuff

HEVEA home page is http://hevea.inria.fr/. It contains links to the on-line manual and to the distribution.

The author can be contacted at Luc.Maranget@inria.fr.

C.3.2 Law

HEVEA can be freely used and redistributed without modifications. Modifying and redistributing HEVEA implies a few constraints. More precisely, HEVEA is distributed under the terms of the Q Public License, but HEVEA binaries include the Objective Caml runtime system, which is distributed under the Gnu Library General Public License (LGPL). See the LICENSE file for details.

The manual itself is distributed under the terms of the Free Document Dissemination Licence.


Previous Up Next hevea-2.36-manual/manual019.html0000644004317100512160000006222214252364056016445 0ustar marangetcristal Support for style sheets Previous Up Next

9 Support for style sheets

9.1 Overview

Starting with version 1.08, HEVEA offers support for style sheets (of the CSS variant see [CSS-2]).

Style sheets provide enhanced expressiveness. For instance, it is now possible to get “real” (whatever real means here) small caps in html, and in a relatively standard manner. There are other, discrete, maybe unnoticeable, similar enhancements.

However, style sheets mostly offer an additional mechanism to customise their documents to HEVEA users. To do so, users should probably get familiar with how HEVEA uses style sheets in the first place.

HEVEA interest for style sheets is at the moment confined to block-level elements (div, table, H<n>, etc.). The general principle is as follows: when a command or an environment gets translated into a block-level element, the opening tag of the block level element has a class="name" attribute, where name is the command or environment name.

As an example the LATEX command \subsection is implemented with the element h3, resulting in html output of the form:

    <h3 class="subsection">
    ...
    </h3>

By default, most styles are undefined, and default rendering of block-level elements applies. However, some packages (such as, for instance fancysection, see Section B.16.4) may define them. If you wish to change the style of section headers, loading the fancysection package may prove appropriate (see B.16.4). However, one can also proceed more directly, by appending new definitions to the document style sheet, with the command \newstyle. For instance, here is a \newstyle to add style for subsections.

  \newstyle{.subsection}{padding:1ex;color:navy;border:solid navy;}

This declaration adds some style element to the subsection class (notice the dot!): blocks that declare to belong to the class will show dark-blue text, some padding (space inside the box) is added and a border will be drawn around the block. These specification will normally affect all subsections in the document. Given the previous style definition, the sectioning command

\subsection*{A styled subsection heading}

should yield:

A styled subsection heading

The following points are worth noticing:

  • To yield some effect, \newstyle commands must appear in the document preamble, i.e. before \begin{document}.
  • Arguments to \newstyle commands are processed.
  • The hevea package defines all style sheet related commands as no-ops. Thus, these commands do not affect document processing by LATEX.

9.2 Changing the style of all instances of an environment

In this very document, all verbatim environments appear over a light green background, with small left and right margins. This has been performed by simply issuing the following command in the document preamble.

\newstyle{.verbatim}{margin:1ex 1ex;padding:1ex;background:\#ccffcc;}

Observe that, in the explicit numerical color argument above, the hash character “#” has to be escaped.

9.3 Changing the style of some instances of an environment

One can also change the style class attached to a given instance of an environment and thus control styling of environments more precisely.

As a matter of fact, the name of the class attribute of environment env is referred to through an indirection, by using the command \getenvclass{env}. The class attribute can be changed with the command \setenvclass{env}{class}. The \setenvclass command internally defines a command \env@class, whose content is read by the \getenvclass command. As a consequence, the class attribute of environments follows normal scoping rules. For instance, here is how to change the style of one verbatim environment.

{\setenvclass{verbatim}{myverbatim}
\begin{verbatim}
This will be styled through class 'myverbatim', introduced by:
\newstyle{.myverbatim}
  {margin:1ex 3x;padding:1ex;
   color:maroon;
   background:\@getstylecolor[named]{Apricot}}
\end{verbatim}}

Observe how the class of environment verbatim is changed from its default value to the new value myverbatim. The change remains active until the end of the current group (here, the “}” at the end). Then, the class of environment verbatim is restored to its default value — which happen to be verbatim.

This example also shows two new ways to specify colours in style definition, with a conventional html color name (here maroon) or as a high-level color (see Section B.14.2), given as an argument to the \@getstylecolor internal command (here Apricot from the named color model).

A good way of specifying style class changes probably is by defining new environments.

\newenvironment{flashyverbatim}
  {\setenvclass{verbatim}{myverbatim}\verbatim}
  {\endverbatim}

Then, we can use \begin{flashyverbatim}\end{flashyverbatim} to get verbatim environments style with the intended myverbatim style class.

This text is typeset inside the environment
\emph{flashyverbatim}, and hence with the \emph{myverbatim}
style.

9.4 Which class affects what

Generally, the styling of environment env is performed through the commands \getenvclass{env} and \setenvclass{env}{}, with \getenvclass{env} producing the default value of env.

Concretely, this means that most of the environments are styled through an homonymous style class. Here is a non-exhaustive list of such environments

figure, table, itemize, enumerate, list, description, trivlist, center, flushleft, flushright, quote, quotation, verbatim, abstract, mathpar (cf Section B.17.16), lstlisting (cf. Section B.17.14), etc.

All sectioning commands (\part, \section etc.) output H<n> block-level elements, which are styled through style classes named part, section, etc.

List making-environment introduce extra style classes for items. More specifically, for list-making environments itemize and enumerate, li elements are styled as follows:

<ul class="itemize">
<li class="li-itemize"> ...
</ul>
<ol class="enumerate">
<li class="li-enumerate"> ...
</ol>

That is, li elements are styled as environments, the key name being li-env.

The description, trivlist and list environments (which all get translated into DL elements) are styled in a similar way, internal DT and DD elements being styles through names dt-env and dd-env respectively.

9.5 A few examples

9.5.1 The title of the document

The command \maketitle formats the document title within a table element, with class title, for display. The name of the title is displayed inside block h1, with class titlemain, while all other information (author, date) are displayed inside block h3, with class titlerest.

<table class="title">
 <tr>
  <td style="padding:1ex">
   <h1 class="titlemain">..title here..</h1>
   <h3 class="titlerest">..author here..</h3>
   <h3 class="titlerest">..date here..</h3>
  </td>
 </tr>
</table>

Users can impact on title formatting by adding style in the appropriate style classes. For instance the following style class definitions:

\newstyle{.title}
  {text-align:center;margin:1ex auto;color:navy;border:solid navy;}
\newstyle{.titlerest}{font-variant:small-caps;}

will normally produce a title in dark blue, centered in a box, with author and date in small-caps.

Title

Date

Author

9.5.2 Enclosing things in a styled div

At the moment, due to the complexity of the task, environments tabular and array cannot be styled as others environments can be, by defining an appropriate class in the preamble. However, even for such constructs, limited styling can be performed, by using the divstyle environment. The opening command \begin{divstyle}{class} takes the name of a class as an argument, and translates to <div class="class">. Of course the closing command \end{divstyle} translates to </div>. The limitation is that the enclosed part may generate more html blocks, and that not all style attribute defined in class class class will apply to those inner blocks.

As an example consider the style class definition below.

\newstyle{.ruled}{border:solid black;padding:1ex;background:\#eeddbb;color:maroon}

The intended behaviour is to add a black border around the inner block (with some padding), and to have maroon text over a light brown background.

If we, for instance, enclose an itemize environment, the resulting effect is more or less what we have expected:

\begin{divstyle}{ruled}
\begin{itemize}
\item A ruled itemize
\item With two items.
\end{itemize}
\end{divstyle}
  • A ruled itemize
  • With two items.

However, enclosing a centered tabular environment in a divstyle{ruled} one is less satisfactory.

\begin{divstyle}{ruled}
\begin{center}\begin{tabular}{|c|c|}
\hline \bf English & \bf French\\ \hline
Good Morning & Bonjour\\ Thank You & Merci\\ Good Bye & Au Revoir\\ \hline
\end{tabular}\end{center}
\end{divstyle}
EnglishFrench
Good MorningBonjour
Thank YouMerci
Good ByeAu Revoir

In the html version of this document, one sees that the brown background extend on all the width of the displayed page.

This problem can be solved by introducing an extra table. We first open an extra centered table and then only open the divstyle environment.

\begin{center}\begin{tabular}{c}
\begin{divstyle}{ruled}
\begin{tabular}{|c|c|}
\hline \bf English & \bf French\\ \hline
Good Morning & Bonjour\\ Thank You & Merci\\ Good Bye & Au Revoir\\
\hline
\end{tabular}
\end{divstyle}
\end{tabular}\end{center}

This works because of the rules that govern the width of html table elements, which yield minimal width. This trick is used in numerous places by HEVEA, for instance in document titles, and looks quite safe.

EnglishFrench
Good MorningBonjour
Thank YouMerci
Good ByeAu Revoir

Another solution is to specify the display property of the styling div block as being inline-block:

\newstyle{.ruledbis}
  {border:solid black;padding:1ex;background:\#eeddbb;color:maroon;display:inline-block;}
EnglishFrench
Good MorningBonjour
Thank YouMerci
Good ByeAu Revoir

9.5.3 Styling the itemize environment

Our idea is highlight lists with a left border whose color fades while lists are nested. Such a design may be appropriate for tables of content, as the one of this document.

  • Part A
    • Chapter I
      • Section I.1
      • Section I.2
    • Chapter II
      • Section II.1
      • Section II.2
    • Chapter III
  • Part B
    • Chapter IV
      • Section IV.1
        • Section IV.1.a
        • Section IV.1.b
      • Section IV.2
    • Chapter V

The text above is typeset from the following LATEX source.

\begin{toc}
\item Part~A
\begin{toc}
\item Chapter~I
\begin{toc}
\item Section~I.1
\item Section~I.2
\end{toc}
  ...
\end{toc}
\end{toc}

For simplicity, we assume a limit of four over the nesting depth of toc environment. We first define four style classes toc1, toc2, toc3 and toc4 in the document preamble. Since those classes are similar, a command \newtocstyle is designed.

\newcommand{\newtocstyle}[2]
{\newstyle{.toc#1}{list-style:none;border-left:1ex solid #2;padding:0ex 1ex;}}
\newtocstyle{1}{\@getstylecolor{Sepia}}
\newtocstyle{2}{\@getstylecolor{Brown}}
\newtocstyle{3}{\@getstylecolor{Tan}}
\newtocstyle{4}{\@getstylecolor{Melon}}

The toc environment uses a counter to record nesting depth. Notice how the style class of the itemize environment is redefined before \begin{itemize}.

\newcounter{toc}
\newenvironment{toc}
{\stepcounter{toc}\setenvclass{itemize}{toc\thetoc}\begin{itemize}}
{\addtocounter{toc}{-1}\end{itemize}}

The outputted html is:

<ul class="toc1"><li class="li-itemize">
Part&nbsp;A
<ul class="toc2"><li class="li-itemize">
Chapter&nbsp;I
<ul class="toc3"><li class="li-itemize">
Section&nbsp;I.1
<li class="li-itemize">Section&nbsp;I.2
  ...
</ul>
</ul>

9.6 Miscellaneous

9.6.1 HACHA and style sheets

HACHA now produces an additional file: a style sheet, which is shared by all the html files produced by HACHA. Please refer to section 7.1 for details.

9.6.2 Producing an external style sheet

By default, style declarations defined with \newstyle go into the header of the html document doc.html. However, one can send those declaration into an external style file, whose name is doc.css. Then, HEVEA automatically relates doc.html to its style sheet doc.css. To achieve this behaviour, it suffices to set the value of the boolean register externalcss to true, by issuing the command \externalcsstrue in the preamble of the source document. Notice that HEVEA output still can be processed by HACHA, with correct behaviour.

9.6.3 Linking to external style sheets

The HEVEA command \loadcssfile{url} allows the user to link to an external style sheet (like the link option for HTML). The command takes an url of the external sheet as argument and emits the HTML text to link to the given external style sheet. As an example, the command

\loadcssfile{../abc.css}

produces the following html text in the head of the document.

  <link rel="stylesheet" type="text/css" href="../abc.css">

To yield some effect, \loadcssfile must appear in the document preamble. Several \loadcssfile commands can be issued. Then the given external style sheets appear in the output, following source order.

Notice that the argument to \loadcssfile is processed. Thus, if it contains special characters such as “#” or “$”, those must be specified as \# and \$ respectively. A viable alternative would be to quote the argument using the \url command from the url package (see Section B.17.12).

9.6.4 Limitations

At the moment, style class definitions cumulate, and appear in the style element in the order they are given in the document source. There is no way to cancel the default class definitions performed by HEVEA before it starts to process the user’s document. Additionally, external style sheets specified with \loadcssfile appear before style classes defined with \newstyle. As a consequence (if I am right), styles declared by \newstyle take precedence over those contained in external style sheets. Thus, using external style-sheets, especially if they alter the styling of elements, may produce awkward results.

Those limitations do not apply of course to style classes whose names are new, since there cannot be default definitions for them. Then, linking with external style sheets can prove useful to promote uniform styling of several documents produced by HEVEA.


Previous Up Next hevea-2.36-manual/manual.hind0000644004317100512160000004562414252364054016176 0ustar marangetcristal\begin{indexenv} \indexitem `` '' (space), \@locref{hevea_default157}{B.3.1} \begin{indexenv} \indexitem after macro, \@locref{hevea_default2}{3.1.2} \begin{indexenv} \indexitem in math, \@locref{hevea_default4}{3.2.1}, \defocc{\@locref{hevea_default175}{B.7.7}} \end{indexenv} \end{indexenv} \indexspace \indexitem \texttt{\#\#}\textit{n}, \@locref{hevea_default211}{B.16.2} \indexspace \indexitem \texttt{- todir} (\texttt{imagen} option), \@locref{hevea_default141}{10.6} \indexitem \texttt{-dv} (\texttt{hevea} option), \@locref{hevea_default1}{3.1.1}, \@locref{hevea_default6}{3.2.3} \indexitem \texttt{-e} (\texttt{hevea} option), \@locref{hevea_default188}{B.11.4} \indexitem \texttt{-fix} (\texttt{hevea} option), \@locref{hevea_default28}{6.1}, \@locref{hevea_default143}{10.7}, \@locref{hevea_default162}{B.4.3}, \@locref{hevea_default183}{B.11.1}, \@locref{hevea_default280}{C.1.5}, \@locref{hevea_default281}{C.1.6} \indexitem \texttt{-gif} (\texttt{imagen} option), \@locref{hevea_default139}{10.5} \indexitem \texttt{-O} (\texttt{hevea} option), \@locref{hevea_default94}{8.4}, \@locref{hevea_default255}{B.17.14} \indexitem \texttt{-o} (\texttt{hevea} option), \@locref{hevea_default271}{C.1.1.2} \indexitem \texttt{-pdf} (\texttt{imagen} option), \@locref{hevea_default265}{B.17.17} \indexitem \texttt{-textsymbols} (\texttt{hevea} option), \@locref{hevea_default5}{3.2.2} \indexitem \texttt{-tocbis} (\texttt{hacha} option), \@locref{hevea_default38}{7.2.3} \indexitem \texttt{-tocter} (\texttt{hacha} option), \@locref{hevea_default39}{7.2.3} \indexitem \texttt{-w} (\texttt{hevea} option), \@locref{hevea_default144}{11.1} \indexspace \indexitem \texttt{\char92@addimagenopt}, \defocc{\@locref{hevea_default142}{10.7}} \indexitem \texttt{\char92@addstyle}, \@locref{hevea_default91}{8.3} \indexitem \texttt{\char92@bodyargs}, \@locref{hevea_default151}{B.2} \indexitem \texttt{\char92@charset}, \@locref{hevea_default156}{B.2} \indexitem \texttt{\char92@clearstyle}, \defocc{\@locref{hevea_default86}{8.3}} \indexitem \texttt{\char92@close}, \defocc{\@locref{hevea_default81}{8.3}}, \@locref{hevea_default101}{8.5}, \@locref{hevea_default111}{8.5} \indexitem \texttt{\char92@def@charset}, \defocc{\@locref{hevea_default115}{8.6}}, \@locref{hevea_default239}{B.17.4} \indexitem \texttt{\char92@fontcolor}, \defocc{\@locref{hevea_default88}{8.3}} \indexitem \texttt{\char92@fontsize}, \defocc{\@locref{hevea_default87}{8.3}} \indexitem \texttt{\char92@footnotelevel}, \defocc{\@locref{hevea_default58}{7.3.7}} \indexitem \texttt{\char92@getcolor}, \@locref{hevea_default112}{8.5}, \defocc{\@locref{hevea_default200}{B.14.2.2}} \indexitem \texttt{\char92@getprint}, \defocc{\@locref{hevea_default77}{8.3}}, \@locref{hevea_default106}{8.5} \indexitem \texttt{\char92@getstylecolor}, \@locref{hevea_default122}{9.3}, \defocc{\@locref{hevea_default201}{B.14.2.2}} \indexitem \texttt{\char92@hevealibdir}, \defocc{\@locref{hevea_default270}{C.1.1.1}} \indexitem \texttt{\char92@hr}, \defocc{\@locref{hevea_default79}{8.3}} \indexitem \texttt{\char92@htmlargs}, \@locref{hevea_default152}{B.2} \indexitem \texttt{\char92@meta}, \@locref{hevea_default153}{B.2} \indexitem \texttt{\char92@nostyle}, \defocc{\@locref{hevea_default85}{8.3}}, \@locref{hevea_default107}{8.5}, \@locref{hevea_default108}{8.5} \indexitem \texttt{\char92@open}, \defocc{\@locref{hevea_default80}{8.3}}, \@locref{hevea_default100}{8.5}, \@locref{hevea_default110}{8.5} \indexitem \texttt{\char92@print}, \defocc{\@locref{hevea_default76}{8.3}}, \@locref{hevea_default105}{8.5} \indexitem \texttt{\char92@print@u}, \@locref{hevea_default8}{4.2}, \defocc{\@locref{hevea_default78}{8.3}}, \@locref{hevea_default113}{8.5}, \@locref{hevea_default114}{8.6} \indexitem \texttt{\char92@span}, \defocc{\@locref{hevea_default84}{8.3}} \indexitem \texttt{\char92@style}, \defocc{\@locref{hevea_default82}{8.3}} \indexitem \texttt{\char92@styleattr}, \defocc{\@locref{hevea_default83}{8.3}} \indexspace \indexitem \verb+\bigl,\bigr+ etc., \@locref{hevea_default173}{B.7.5} \indexitem \verb+\boxed+, \@locref{hevea_default172}{B.7.5} \indexitem \verb+\sqrt+, \@locref{hevea_default166}{B.7.3} \indexspace \indexitem \texttt{\char92addcontentsline}, \defocc{\@locref{hevea_default161}{B.4.3}} \indexitem \texttt{\char92ahref}, \defocc{\@locref{hevea_default61}{8.1.1}} \indexitem \texttt{\char92ahrefloc}, \@locref{hevea_default54}{7.3.6}, \defocc{\@locref{hevea_default64}{8.1.1}} \indexitem \texttt{\char92ahrefurl}, \defocc{\@locref{hevea_default62}{8.1.1}} \indexitem \texttt{amsmath} package, \@locref{hevea_default233}{B.17.1} \indexitem \texttt{amssymb} package, \@locref{hevea_default234}{B.17.1} \indexitem \texttt{\char92aname}, \@locref{hevea_default53}{7.3.6}, \defocc{\@locref{hevea_default65}{8.1.1}} \indexitem argument\begin{indexenv} \indexitem of commands, \@locref{hevea_default147}{B.1.1} \indexitem of \texttt{\char92 input}, \@locref{hevea_default187}{B.11.4} \end{indexenv} \indexitem \texttt{array} package, \@locref{hevea_default235}{B.17.2} \indexspace \indexitem babel\begin{indexenv} \indexitem languages, \@locref{hevea_default249}{B.17.11.2} \end{indexenv} \indexitem \texttt{babel} package, \@locref{hevea_default248}{B.17.11} \indexitem \texttt{bgcolor} environment, \@locref{hevea_default109}{8.5}, \defocc{\@locref{hevea_default199}{B.14.2.1}} \indexitem block-level elements, \@locref{hevea_default75}{8.3} \indexitem browser configuration, \@locref{hevea_default282}{C.2} \indexspace \indexitem \texttt{calc} package, \@locref{hevea_default237}{B.17.3} \indexitem \texttt{chapterbib} package, \@locref{hevea_default247}{B.17.10} \indexitem \texttt{cleveref} package, \@locref{hevea_default268}{B.17.20} \indexitem color\begin{indexenv} \indexitem of background, \see{\texttt{\char92@bodyargs}}{\@locref{hevea_default150}{B.2}} \indexitem of section headings, \@locref{hevea_default216}{B.16.4} \end{indexenv} \indexitem \texttt{\char92color}, \@locref{hevea_default195}{B.14.2} \indexitem \texttt{color} package, \@locref{hevea_default194}{B.14.2} \indexitem \texttt{\char92colorbox}, \@locref{hevea_default197}{B.14.2} \indexitem \texttt{\char92colorsections}, \defocc{\@locref{hevea_default218}{B.16.4}} \indexitem command\begin{indexenv} \indexitem and arguments, \@locref{hevea_default146}{B.1.1} \indexitem definition, \defocc{\@locref{hevea_default176}{B.8.1}}, \@locref{hevea_default203}{B.16.1.1}, \@locref{hevea_default212}{B.16.2} \indexitem syntax, \@locref{hevea_default145}{B.1.1} \end{indexenv} \indexitem comment\begin{indexenv} \indexitem \texttt{\%BEGIN IMAGE}, \@locref{hevea_default23}{5.3} \indexitem \texttt{\%BEGIN LATEX}, \@locref{hevea_default22}{5.3} \indexitem \texttt{\%END IMAGE}, \@locref{hevea_default25}{5.3} \indexitem \texttt{\%END LATEX}, \@locref{hevea_default24}{5.3} \indexitem \texttt{\%HEVEA}, \@locref{hevea_default21}{5.2.3} \end{indexenv} \indexitem \texttt{comment} package, \@locref{hevea_default241}{B.17.7} \indexitem \texttt{\char92cutdef}, \@locref{hevea_default36}{7.2.2}, \@locref{hevea_default40}{7.2.4} \indexitem \texttt{\char92cutend}, \@locref{hevea_default37}{7.2.2}, \@locref{hevea_default41}{7.2.4} \indexitem \texttt{cutflow} environment, \defocc{\@locref{hevea_default52}{7.3.6}} \indexitem \texttt{cutflow*} environment, \defocc{\@locref{hevea_default55}{7.3.6}} \indexitem \texttt{\char92cuthere}, \@locref{hevea_default35}{7.2.2}, \@locref{hevea_default42}{7.2.4} \indexitem \texttt{\char92cutname}, \defocc{\@locref{hevea_default46}{7.3.1}} \indexitem \texttt{cuttingdepth} counter, \@locref{hevea_default34}{7.2.2} \indexitem \texttt{\char92cuttingunit}, \@locref{hevea_default31}{7.2.2}, \@locref{hevea_default43}{7.2.4} \indexspace \indexitem \texttt{deepcut} package, \@locref{hevea_default44}{7.2.5} \indexitem \texttt{\char92def}, \@locref{hevea_default202}{B.16.1.1} \indexitem display problems\begin{indexenv} \indexitem for authors, \@locref{hevea_default220}{B.16.5} \indexitem for viewers, \@locref{hevea_default283}{C.2} \end{indexenv} \indexitem \texttt{displayjax} environment, \defocc{\@locref{hevea_default223}{B.16.6}}, \defocc{\@locref{hevea_default227}{B.16.6.1}} \indexitem \texttt{divstyle} environment, \defocc{\@locref{hevea_default126}{9.5.2}} \indexspace \indexitem \texttt{\char92else}, \@locref{hevea_default209}{B.16.1.4} \indexitem \texttt{esponja} command, \@locref{hevea_default273}{C.1.3} \indexitem \texttt{externalcss} (boolean register), \defocc{\@locref{hevea_default128}{9.6.2}} \indexitem \texttt{\char92externalcsstrue}, \defocc{\@locref{hevea_default129}{9.6.2}} \indexspace \indexitem \texttt{fancysection} package, \@locref{hevea_default217}{B.16.4} \indexitem \texttt{\char92fcolorbox}, \@locref{hevea_default198}{B.14.2} \indexitem \texttt{\char92fi}, \@locref{hevea_default210}{B.16.1.4} \indexitem \texttt{figcut} package, \@locref{hevea_default45}{7.2.5} \indexitem \texttt{\char92flushdef}, \defocc{\@locref{hevea_default57}{7.3.7}}, \@locref{hevea_default59}{7.3.7} \indexitem \texttt{\char92footahref}, \defocc{\@locref{hevea_default63}{8.1.1}} \indexitem \texttt{\char92footnoteflush}, \defocc{\@locref{hevea_default56}{7.3.7}} \indexitem \texttt{\char92footurl}, \@locref{hevea_default71}{8.1.1} \indexitem \texttt{\char92formatlinks}, \defocc{\@locref{hevea_default51}{7.3.5}} \indexspace \indexitem GIF, \@locref{hevea_default135}{10.5}, \@locref{hevea_default276}{C.1.5} \indexitem \texttt{\char92gdef}, \@locref{hevea_default206}{B.16.1.3} \indexitem \texttt{\char92getenvclass}, \@locref{hevea_default103}{8.5}, \defocc{\@locref{hevea_default121}{9.3}} \indexitem \texttt{\char92global}, \@locref{hevea_default205}{B.16.1.3} \indexitem \texttt{graphics} package, \@locref{hevea_default192}{B.14.1} \indexitem \texttt{graphicx} package, \@locref{hevea_default193}{B.14.1} \indexspace \indexitem \texttt{hacha} command, \@locref{hevea_default272}{C.1.2} \indexitem \texttt{hanging} package, \@locref{hevea_default267}{B.17.19} \indexitem \texttt{hevea} boolean register, \@locref{hevea_default20}{5.2.3} \indexitem \texttt{hevea} command, \@locref{hevea_default269}{C.1.1} \indexitem \texttt{hevea.sty} \LaTeX{} style file, \@locref{hevea_default9}{5.2} \indexitem \texttt{\char92heveadate}, \@locref{hevea_default215}{B.16.3} \indexitem \texttt{\char92heveaimagedir}, \@locref{hevea_default140}{10.6} \indexitem \texttt{\char92home}, \defocc{\@locref{hevea_default68}{8.1.1}} \indexitem \texttt{\char92htmlcolor}, \@locref{hevea_default72}{8.1.2} \indexitem \texttt{\char92htmlfoot}, \@locref{hevea_default149}{B.2} \indexitem \texttt{\char92htmlhead}, \@locref{hevea_default148}{B.2} \indexitem \texttt{htmlonly} environment, \defocc{\@locref{hevea_default11}{5.2.1}} \indexitem \texttt{\char92htmlprefix}, \defocc{\@locref{hevea_default47}{7.3.2}} \indexitem hyperlinks, \@locref{hevea_default60}{8.1.1}, \@locref{hevea_default251}{B.17.12} \indexspace \indexitem \texttt{\char92if}, \@locref{hevea_default208}{B.16.1.4} \indexitem \texttt{ifpdf} package, \@locref{hevea_default264}{B.17.17} \indexitem \texttt{ifthen} package, \@locref{hevea_default179}{B.8.5} \indexitem image inclusion\begin{indexenv} \indexitem bitmap, \@locref{hevea_default73}{8.2} \indexitem in Postscript, \defocc{\@locref{hevea_default29}{6.3}}, \@locref{hevea_default132}{10.4}, \@locref{hevea_default191}{B.14.1} \indexitem output format, \@locref{hevea_default133}{10.5} \end{indexenv} \indexitem \texttt{\char92imageflush}, \defocc{\@locref{hevea_default27}{6.1}}, \@locref{hevea_default137}{10.5} \indexitem \texttt{imagen} command, \@locref{hevea_default274}{C.1.5} \indexitem \texttt{\char92imgsrc}, \@locref{hevea_default50}{7.3.4}, \defocc{\@locref{hevea_default67}{8.1.1}}, \@locref{hevea_default74}{8.2}, \@locref{hevea_default104}{8.5}, \@locref{hevea_default138}{10.5} \indexitem \texttt{index} package, \@locref{hevea_default242}{B.17.8} \indexitem \texttt{indexcols} counter, \@locref{hevea_default190}{B.11.5} \indexitem \texttt{indexenv} environment, \defocc{\@locref{hevea_default189}{B.11.5}} \indexitem inference rules, \@locref{hevea_default260}{B.17.16} \indexitem \texttt{\char92input}, \defocc{\@locref{hevea_default186}{B.11.4}} \indexitem \texttt{inputenc} package, \@locref{hevea_default238}{B.17.4} \indexitem \texttt{\char92inputencoding}, \defocc{\@locref{hevea_default240}{B.17.4}} \indexspace \indexitem \texttt{\char92label}, \@locref{hevea_default159}{B.4.1}, \defocc{\@locref{hevea_default184}{B.11.2}} \indexitem \texttt{latexonly} environment, \defocc{\@locref{hevea_default10}{5.2.1}}, \@locref{hevea_default17}{5.2.2} \indexitem \texttt{\char92let}, \@locref{hevea_default154}{B.2}, \defocc{\@locref{hevea_default204}{B.16.1.2}} \indexitem \texttt{listings} package, \@locref{hevea_default254}{B.17.14} \indexitem \texttt{\char92loadcssfile}, \defocc{\@locref{hevea_default130}{9.6.3}} \indexitem \texttt{longtable} package, \@locref{hevea_default257}{B.17.15} \indexitem \texttt{\char92lstavoidwhitepre}, \defocc{\@locref{hevea_default256}{B.17.14}} \indexspace \indexitem \texttt{\char92mailto}, \defocc{\@locref{hevea_default66}{8.1.1}} \indexitem \texttt{\char92marginpar}, \defocc{\@locref{hevea_default180}{B.9.3}} \indexitem math accents, \@locref{hevea_default174}{B.7.6} \indexitem \texttt{mathjax} environment, \defocc{\@locref{hevea_default231}{B.16.6.1}} \indexitem \texttt{mathjax} package, \@locref{hevea_default222}{B.16.6} \begin{indexenv} \indexitem \texttt{displayjax} environment, \@locref{hevea_default226}{B.16.6.1} \indexitem \texttt{mathjax} environment, \@locref{hevea_default230}{B.16.6.1} \indexitem \verb+\textjax+, \@locref{hevea_default228}{B.16.6.1} \end{indexenv} \indexitem \texttt{mathjax.sty} \LaTeX{} style file, \@locref{hevea_default225}{B.16.6} \indexitem \texttt{mathjaxauto.hva} file, \@locref{hevea_default232}{B.16.6.2} \indexitem \texttt{mathpartir} package, \@locref{hevea_default259}{B.17.16} \begin{indexenv} \indexitem derivation trees, \@locref{hevea_default263}{B.17.16.4} \indexitem \verb+\inferrule+, \@locref{hevea_default262}{B.17.16.2} \indexitem \texttt{mathpar} environment, \@locref{hevea_default261}{B.17.16.1} \end{indexenv} \indexitem \texttt{multibib} package, \@locref{hevea_default245}{B.17.10} \indexitem \texttt{multind} package, \@locref{hevea_default243}{B.17.8} \indexspace \indexitem \texttt{natbib} package, \@locref{hevea_default244}{B.17.9} \indexitem \texttt{\char92newcites}, \@locref{hevea_default246}{B.17.10} \indexitem \texttt{\char92newcommand}, \@locref{hevea_default177}{B.8.1} \indexitem \texttt{\char92newif}, \@locref{hevea_default207}{B.16.1.4} \indexitem \texttt{\char92newstyle}, \defocc{\@locref{hevea_default118}{9.1}} \indexitem \texttt{\char92normalmarginpar}, \defocc{\@locref{hevea_default182}{B.9.3}} \indexitem \texttt{\char92notocnumber}, \@locref{hevea_default33}{7.2.2} \indexspace \indexitem \texttt{\char92oneurl}, \@locref{hevea_default70}{8.1.1} \indexspace \indexitem PDF, \@locref{hevea_default278}{C.1.5} \indexitem PNG, \@locref{hevea_default134}{10.5}, \@locref{hevea_default275}{C.1.5} \indexitem pdflatex, \@locref{hevea_default279}{C.1.5} \indexitem \texttt{\char92purple}, \@locref{hevea_default99}{8.5} \indexspace \indexitem \texttt{raw} environment, \@locref{hevea_default95}{8.4} \indexitem \texttt{rawhtml} environment, \defocc{\@locref{hevea_default12}{5.2.1}}, \@locref{hevea_default92}{8.4}, \@locref{hevea_default155}{B.2} \indexitem \texttt{\char92rawhtmlinput}, \@locref{hevea_default93}{8.4} \indexitem \texttt{\char92rawinput}, \@locref{hevea_default96}{8.4} \indexitem \texttt{rawtext} environment, \@locref{hevea_default97}{8.4} \indexitem \texttt{\char92rawtextinput}, \@locref{hevea_default98}{8.4} \indexitem \texttt{\char92ref}, \defocc{\@locref{hevea_default185}{B.11.2}} \indexitem \texttt{\char92renewcommand}, \@locref{hevea_default178}{B.8.1} \indexitem \texttt{\char92reversemarginpar}, \defocc{\@locref{hevea_default181}{B.9.3}} \indexitem \texttt{\char92rule}, \@locref{hevea_default7}{4.2} \indexspace \indexitem SVG, \@locref{hevea_default136}{10.5}, \@locref{hevea_default277}{C.1.5} \indexitem \texttt{\char92setenvclass}, \@locref{hevea_default102}{8.5}, \defocc{\@locref{hevea_default120}{9.3}} \indexitem \texttt{\char92setlinkstext}, \defocc{\@locref{hevea_default49}{7.3.4}} \indexitem spacing, \see{`` ''}{\@locref{hevea_default158}{B.3.1}} \indexitem sqrt, \@locref{hevea_default167}{B.7.3} \indexitem style-sheets, \@locref{hevea_default117}{9} \begin{indexenv} \indexitem \verb+\divstyle+, \@locref{hevea_default125}{9.5.2} \indexitem \verb+\loadcssfile+, \@locref{hevea_default131}{9.6.3} \indexitem \verb+\newstyle+, \@locref{hevea_default119}{9.1} \indexitem and \hacha, \@locref{hevea_default30}{7.1} \end{indexenv} \indexitem styles for\begin{indexenv} \indexitem lists, \@locref{hevea_default127}{9.5.3} \indexitem miscellaneous objects, \@locref{hevea_default124}{9.5.2} \indexitem title, \@locref{hevea_default123}{9.5.1} \end{indexenv} \indexitem \texttt{supertabular} package, \@locref{hevea_default258}{B.17.15} \indexspace \indexitem \texttt{\char92tableofcontents}, \defocc{\@locref{hevea_default160}{B.4.3}} \indexitem \texttt{tabularx} package, \@locref{hevea_default236}{B.17.2} \indexitem tabulation, \@locref{hevea_default3}{3.1.2} \indexitem text-level elements, \@locref{hevea_default89}{8.3} \begin{indexenv} \indexitem span, \@locref{hevea_default90}{8.3} \end{indexenv} \indexitem \texttt{\char92textcolor}, \@locref{hevea_default196}{B.14.2} \indexitem \texttt{\char92textjax}, \defocc{\@locref{hevea_default224}{B.16.6}}, \defocc{\@locref{hevea_default229}{B.16.6.1}} \indexitem \texttt{\char92textoverline}, \@locref{hevea_default171}{B.7.5} \indexitem \texttt{\char92textstackrel}, \@locref{hevea_default169}{B.7.5} \indexitem \texttt{\char92textunderline}, \@locref{hevea_default170}{B.7.5} \indexitem Thai, \@locref{hevea_default266}{B.17.18} \indexitem \texttt{\char92title}, \@locref{hevea_default164}{B.5.3} \indexitem \texttt{\char92tocnumber}, \@locref{hevea_default32}{7.2.2} \indexitem \texttt{\char92today}, \@locref{hevea_default165}{B.5.3}, \@locref{hevea_default213}{B.16.3} \indexitem \texttt{toimage} environment, \defocc{\@locref{hevea_default13}{5.2.1}}, \@locref{hevea_default19}{5.2.2}, \@locref{hevea_default26}{6.1} \indexitem \texttt{\char92toplinks}, \defocc{\@locref{hevea_default48}{7.3.3}} \indexspace \indexitem \texttt{undersection} package, \@locref{hevea_default219}{B.16.4} \indexitem unicode, \@locref{hevea_default168}{B.7.4} \indexitem \texttt{\char92url}, \@locref{hevea_default69}{8.1.1}, \defocc{\@locref{hevea_default250}{B.17.12}} \indexitem \texttt{url} package, \@locref{hevea_default252}{B.17.12} \indexitem \texttt{\char92urldef}, \@locref{hevea_default253}{B.17.12} \indexitem \texttt{\char92usepackage}, \@locref{hevea_default0}{2.3.2}, \@locref{hevea_default163}{B.5.2} \indexspace \indexitem \texttt{verbimage} environment, \defocc{\@locref{hevea_default14}{5.2.1}}, \@locref{hevea_default18}{5.2.2} \indexitem \texttt{verblatex} environment, \defocc{\@locref{hevea_default15}{5.2.1}}, \@locref{hevea_default16}{5.2.2} \indexspace \indexitem \texttt{winfonts} package, \@locref{hevea_default221}{B.16.5} \indexspace \indexitem \texttt{xxcharset.exe} script, \@locref{hevea_default116}{8.6} \indexitem \texttt{xxdate.exe} script, \@locref{hevea_default214}{B.16.3} \end{indexenv} hevea-2.36-manual/manual.css0000644004317100512160000001401014252364056016027 0ustar marangetcristal.c000{background-color:green;height:3px} .c001{border-spacing:0;} .c002{border-spacing:6px;border-collapse:separate;} .c003{border:0;border-spacing:1;border-collapse:separate;} .c004{border:0;border-spacing:1px;border-collapse:separate} .c005{border:1px solid black;} .c006{color:#006600} .c007{color:#B7140B} .c008{color:black} .c009{color:fuchsia} .c010{color:maroon} .c011{color:purple} .c012{color:red} .c013{color:white} .c014{color:yellow} .c015{display:inline-block;transform:translateY(calc(0pt - ( 2px )))} .c016{font-family:Helvetica} .c017{font-family:monospace} .c018{font-family:monospace;font-weight:bold} .c019{font-family:sans-serif} .c020{font-size:small} .c021{font-size:x-large} .c022{font-size:xx-large} .c023{font-style:italic} .c024{font-style:oblique} .c025{font-variant:small-caps} .c026{font-variant:small-caps;font-size:small} .c027{font-weight:bold} .c028{font-weight:bold;color:blue} .c029{font-weight:bold;color:red} .c030{height:4em; margin:0ex 2px;} .c031{height:4em; margin:0ex 4px;} .c032{text-align:center} .c033{text-align:center;border:solid 1px;white-space:nowrap} .c034{text-align:center;white-space:nowrap} .c035{text-align:left} .c036{text-align:left;border:solid 1px;white-space:nowrap} .c037{text-align:left;white-space:nowrap} .c038{text-align:right;white-space:nowrap} .c039{vertical-align:bottom} .c040{vertical-align:middle} .c041{vertical-align:middle;text-align:left;} .c042{vertical-align:top} .c043{vertical-align:top;text-align:center;border:solid 1px;white-space:nowrap} .c044{vertical-align:top;text-align:left;} .c045{vertical-align:top;text-align:left;border:solid 1px;} .c046{vertical-align:top;text-align:left;white-space:nowrap} .c047{whitespace:nowrap;text-align:center} .c048{whitespace:nowrap;text-align:left} .c049{width:10%;text-align:center} .c050{width:100%;} .c051{width:40%;text-align:center} .c052{width:5%;text-align:center} .c053{width:6px;} .c054{width:90%;text-align:center} .floatrule{background-color: black; border: none; height: 1px; width: 80%} .li-itemize{margin:1ex 0ex;} .li-enumerate{margin:1ex 0ex;} .dd-description{margin:0ex 0ex 1ex 4ex;} .dt-description{margin:0ex;} .footnotetext{margin:0ex; padding:0ex;} div.footnotetext P{margin:0px; text-indent:1em;} .thefootnotes{text-align:left;margin:0ex;} .dt-thefootnotes{margin:0em;} .dd-thefootnotes{margin:0em 0em 0em 2em;} .caption{padding-left:2ex; padding-right:2ex; margin-left:auto; margin-right:auto} .title{margin:2ex auto;text-align:center} .titlemain{margin:1ex 2ex 2ex 1ex;} .titlerest{margin:0ex 2ex;} .center{text-align:center;margin-left:auto;margin-right:auto;} .flushleft{text-align:left;margin-left:0ex;margin-right:auto;} .flushright{text-align:right;margin-left:auto;margin-right:0ex;} div table{margin-left:inherit;margin-right:inherit;margin-bottom:2px;margin-top:2px} td table{margin:auto;} table{border-collapse:collapse;} td{padding:0;} .cellpadding0 tr td{padding:0;} .cellpadding1 tr td{padding:1px;} pre{text-align:left;margin-left:0ex;margin-right:auto;} blockquote{margin-left:4ex;margin-right:4ex;text-align:left;} td p{margin:0px;} .quote{margin-left:3em;margin-right:3em;text-align:inherit;text-indent:0pt} .rule-rect{fill: black;} .lrbox{box-sizing:border-box;display:inline-block;overflow:visible;white-space:nowrap;} .framebox{border:1px solid black;padding:0.25em;} .vertical-rule{border:none;width:2px;background-color:black;} .horizontal-rule{border:none;background-color:black;} .hrule{border:none;height:2px;width:100%;background-color:black;} .display{border-collapse:separate;border-spacing:2px;line-height:1.1;width:auto; border:none;} .dcell{white-space:nowrap;padding:0px; border:none;} .dcenter{margin:0ex auto;} .marginparleft{float:left; clear:left; margin-left:0ex; margin-right:1ex;} .marginparright{float:right; clear:right; margin-left:1ex; margin-right:0ex;} .part{margin:2ex auto;text-align:center} .clisting{font-family:monospace;white-space:pre; border-left:solid black;padding-left:2ex;margin-left:2ex;} .delimleft{border-collapse:separate;border-spacing:0px;margin:0px 4px 0px 0px;} .delimright{border-collapse:separate;border-spacing:0px;margin:0px 0px 0px 4px;} .bracell{padding:0ex;} .lstlisting{font-family:monospace;white-space:pre;margin-right:auto;margin-left:0pt;text-align:left} .mprow{border-collapse:separate;border-spacing:2ex;width:100%;margin:0ex;} .mprcell{padding:0px;width:auto;} .subsectionex{padding:1ex;color:navy;border:solid navy;} .verbatim{margin:1ex 1ex;padding:1ex;background:#CCFFCC;} .myverbatim{margin:1ex 3ex;padding:1ex; color:maroon; background:#FFAD7A} .toc1{list-style:none;border-left:1ex solid #4C0D00;padding:0ex 1ex;} .toc2{list-style:none;border-left:1ex solid #661300;padding:0ex 1ex;} .toc3{list-style:none;border-left:1ex solid #DB9370;padding:0ex 1ex;} .toc4{list-style:none;border-left:1ex solid #FF897F;padding:0ex 1ex;} .xtitle{text-align:center;margin:1ex auto;color:navy;border:solid navy;} .xtitlerest{font-variant:small-caps;} .ruled{border:solid black;padding:1ex;background:#eeddbb;color:maroon} .ruledbis{border:solid black;padding:1ex;background:#eeddbb;color:maroon;display:inline-block} .show{border:solid black; border-width:thin; margin:2ex;} body{background-color:white} a:link{color:#00B200;text-decoration:underline;} a:visited{color:#006600;text-decoration:underline;} a:hover{color:black;text-decoration:none;background-color:#99FF99} .title{background-color:#00B200} .titlemain{background-color:#00B200} .titlerest{ackground-color:#00B200} .part{padding:1ex;background-color:#00CC00} .section{padding:.5ex;background-color:#2DE52D} .subsection{padding:0.3ex;background-color:#66FF66} .subsubsection{padding:0.5ex;background-color:#99FF99} .paragraph{padding:0.5ex;background-color:#CCFFCC} .fmarginpar{border:solid thin #66FF66; width:20%; text-align:left} .ffootnoterule{border:none;margin:1em auto 1em 0px;width:50%;background-color:#00CC00} .ftoc1{list-style:none;margin:0ex 1ex;padding:0ex 1ex;border-left:1ex solid #00CC00} .ftoc2{list-style:none;margin:1ex 1ex;padding:0ex 1ex;border-left:1ex solid #2DE52D} .ftoc3{list-style:none;margin:0ex 1ex;padding:0ex 1ex;border-left:1ex solid #66FF66} hevea-2.36-manual/thaihevea001.png0000644004317100512160000116354314252364060016741 0ustar marangetcristalPNG  IHDRv@I# &iCCPiccHgPY<@BPC*%Z(ҫ@PEl+4EE\"kE t,ʺqQAYp?{ossp e{bRɎ(tջ{i常r)teJOYLgWX\2XyKο,]~ )sT8بlOrTzV $G&D~SGfDnr&AltL:5204_gK!FgE_zs zt@WOm|:3z @(U t08|A $`(E`8@-hM<.L@ށA2@F 7 Bh( ʀrPT UAuP t݄84 }aXև0v}p4 ^O6< "@]p$BV)GVC!Bd h(&JerFTVT1 uՁECDh2Z@Ёht]nDѓw aa0Θ Lf3sӆL`X VkaӱJI%vG)p`\.Wk] p xq:o—;IA"X| q B+aH$͉^XvbqD%iRi/82! L ے&US{1O,BlXXؐ+ NP6Pr(3;Yq8WJ)Hq"HJ IKIJGJJIKa8y"Ֆ͒="{MvV.g)Ǘ+;-Hז,L_~NAQI!ER¬"CV1NLMZ)VL $L`V0{"eyeg :JJU*[5JLGU殖֢HVQ?ާ>حѩ1͒fX9֘&YF3U^FuX6m]}G1Չ93 |UҪU$]nnCM/OS~~>&   .y݆i񍪍&v\mu:ƑGLMv|253Θ՘lOv19|y-Եl^Zä́UUКij}ZhlfSoV6¶vʼn伲3صs-[{'BCSGhGfhgWΣ<lqu%V>svu.֪MZ26,b&*4r**4j:*@LMLyl,7*us\m|GD\bh$jR|Robrv`NJA0"`H*hL֧uӗ? ͌]֙ՙdKd'eo޴gTcOQ{rswol m ڳMu[NO [A^i۝;OrR V (m? Yrˆ[EEE[?Xި%%Ga%oDDiNe̲²7Yn\^{p(㐰­Rr_bULp]u[|͞iU-x4:zccǞ77Q'z̚KZ!'lsWnk]8q/v=s}ٚvZ{aԱC) _}ABEKr.]N<{%DƞWzuW8}nX8[[Mowf[@;]wv8d3tyoy02*|`a׏2-<>+|"ߵ~o /ۏ?yx??'󟓟O)M5MMqb݋ɗ)/f 櫳/ M^̛oy=}na>|ZZ.V|R?B,sMT cHRMz&u0`:pQ<bKGD pHYsaa?itIME 3IDATx]wxTӞNPBBދ TEAR"KP$@HIHd˽Grsv9s̼ڶmL>}۷oے˗/PF dggcΝ8vѼysQF ""ҥ RSSq}h޼9j5<ǏCբuBN: ^|h׮ Hŋ}_5A7^z̀?233k.=z))hڴ):gYYԩ/ڵ+tFH˙#ߥKgгgO5kVĉPh۶+͟==;wĉ'3SNV5E_}>V+σ0gܹ`j5֬Y7o"-- | @Xz!-- 탅+kwJ^/]4dYƊ+pušGR hذ!$Iz7=e˖]vTVZj߸ VVVl4h`8RJlXx1nܸa~5(Q$Iʙ?M$ԪUX/6z7x >e5kB`Æ v233G2l~g^Lj^$0aPdIhZX׮]Cl\x6lLL Fi`"qF\vgH󁁁] ISٷo_;3@8q`wA`` ?ȨH?PhQދVիWzW4?w\ܿ/_FcĈ3PfMH3W=Sie01j;w.>};,Avv6~W888}75g2oq}DFF +TzuȲlyS7ܹ@u>>>y{{CǓ'O1c@e)RP\94oʂnY4|ϿB>ҥ ߽)**<=|ϟ9ΙP̞=:`???HEѣGHLLȑ#>S2xπesGW ~„ Ghh(f̘I`ccFex擒ADػw<@^\S!CxcǎE\\B`޼yeeʔ8::Bo',Mׇ~hdn߾mU\PR4ʵkצ#G)))&NHƍ={Ҍ3ٳgdccCjʕ+GO} &&oƒ%Kj9"rڵV߅ A⣏>Bjj*]_٨Z*Z- :vn-5kDhܾ}/N _0|4 oP/ܲ,o߾HKK۷/@բJ*7 k3{l>%,, !!!F>};v@e!2Ы\2XACIKK#Ϟ>}J ҥKSXXY^EDDtuu={ХKN:MvvvI +WR_~:uygϞ-p٤ٳ<k6/_۷߽;lV'Ob@ < 99<:w ={;w$I_~ׯ*Vn ^:Zn>}[nEff&ThٲeJҥMMM%BAO^zQƍxt FJ"RIvvvÇ&.FcÇo>ϳtw Ҽp-n۶-T*N>͛7#+; *UY2 Kߛ,NbݱcGj={wFAF^oÚ ?uѦMj푔gbӦMhƇTa8 ݻwS(33,,,H$ر#99bo̙3Ϟ=Ctt4&LY9]T)jZ 7osKnL"k,[h7o.69sxg@XjժƘ wNܹsX?,@NE_p˄ct}J/^h:ǨQLe9ooo^$8*U[7nܠzYb(66֭K׮]7RfͨL24zh_XbԺuw ?;79{lOHH0y-x fϞ IT,Xp!>|܃j*eYƨQǏᅦ,˜9$IQhQt:h={4КǏ y&J(,˘4iެ:]v-K0'|4ܸqk׮,ˌ?WѣGYk#b-YYYشi._g8z(vލl}ҳgO"00':XXe˖$IXv)4pQ}v,˼2HWQ4j?ѣG[ya$%%1}j^58q"SSr9DEEq*T*U@b8s `McBB:b~x)?I&|np'RRR=莬,ݻOV/ PNLg rWB$Lb2 6tnSpB˗8pJ*Pغu+N>$pLV$ɩSԊ+ ԯ_?5njӧhx>򊿬^n@zϏ$I/M/_EB` B\\ `0UVEVVmۆ'O"99Q~FxK뺅% Dbb" jѡCtEZe˖!((IVzuddd`ǎ8qRSS²™*e?O2eAZǎ| AVcʕs'nj%$5c׮]ƸJSO8ѬΓO_DDhoҥ DLL zm`իg:}c 4laaaƤI I9+VF/[n!-- }1Hԭ[+JL:(}o*IЧOZ\6l˗_ <<O> , |"}(䟐N:1cdY7'5:,]ZOk1sL#22'O%3K###q]~X+<|/"_5?c x|wTB/_Ͻ>x!~GhZ?pwwN_-ԩS<{˼{na|n4x`DGG#88cYf|b If͚'S"Uis~F8WDUiӦɥ>ǪB0y Ç ߷o_~W![n,\¿я|gx%?~Z}}^6+oJZb 8ܽ{|׬YF\1FBddN\H yǎkt7j,ԵkWBBAk.*UݻѣGTn]' o!777ѣ-Y 4WlQ?/ <҅胓[%EXQFx]]]MjtiM gggJJJ2|Сt9תUUF۶mG?%&&?;skwx\r)bѣGn؀|Ij {{{~KBҽ{wdddʕ+ذabgg'R慉327lԐdY&gggJMM?6nH ޽K˗LR(/^H[fڵkhR y&6t=+JҀѣtAjР ڽ{7 2*T@իW_Ҽ)ejFl,G%]x.\@[=zoFDD[n5ּMhh4sfHѣGT^=]vѠAϏUf8+WСCL>) >1biZg[li=Mӹsgܹ3YYYѹs… ԪU+ݻwӨQxͿsI&HIIÇw^jPߟu)9|0uҥ第HRӦMtq:u?7oNiiiT*IeR(F)bj|jdaaA.]6mPӦM‚N8NgϞu,L|2;voccSϟ?ouF$;w:wL[&[:r(;w5jDYYYBp$IbwW3>K @ YEƻa/]CӦM#G`޽`ST*)==߹scƌ=pBr׮]~Ǵc޽;B/RnݨEL'O1E׹… ԼyYLŋ'[[[5jЮ]GtYSPppoY6t6=jՂ,ؼy3.]t^ѡCdee5/TPYYظq#.\`$nR͚53~۔(} 5jȡtRRR.ba7mڔg”,^PڵkyQj裏>psmݺ:uD}7y̟"nZJȲM6ŋPT0W;wa/#GK|͙:wbYKFUИCBerLl۶ ϟGvv+yǎ_suĈo޽{ Ð!Cjaoo)Vk %׹}љ3guִh">|8%IDק .СC~ߎ5(Q,c֬ CTT J* w/'&Mϟӧ<B󞞞k~4fu8|pJMM5|FyӪUtW_}>f4i͍t:.]-ZD֭N/_$KKKkּNcL5$I”)S0?9t޼W9yd֬YG-ZD>$wwwRTT)?>]4 3ƏMnJSJ*MQ_'ׯ?߻w˗/Ve=t:ODDD`ԩG!..aŢ ND YfѣGxM!ϟO|OoǷYb_~OBB.]uA1Iȑ#G"""B!3TD9sApe{@dFFm(++uF۷o'"-[н{zꔚ]V^>u֑B-[ݻwbŊEƐSH'Ba2P(L?7i҄dY&'''ڷo pÊ0SSI&qoA~VVV@hQ\ָqct:>O>?`t)ɫZG_f\|BnBFÇ~޽=? ] f$rJ(w:uߟ5/_FZZob1ڵ3c7oAZGp7lwo6J-[YYYp%$''3ۜI5i]E1#GI!CJTlܸ/_FJJ0|xx?+js4hJ===!2&L`'OLÇA/+W,lܸ/^DZZ\$JF#Æ38D 6ҥKHJJ'k{3VVXF"sgJUXٲexb<|III>|D5-[ŋBΝ_b|g~:֯_Ng2F#h e Y`E*T R.^h:nT* (:̍tdddƍ0OGw\n2l0CjaÆ7EgϞ3ٳg:u*dYf3A 4Ȁ~1{cFp %ٳg3gdY=VGtt4q/_f%k&nGys~iS2F]tiSb"LR#{Z&mL lt:rr}{'O &Zd n߾muf00TTlknvڅ M>GDGG!""gφNҽV›ݿD 4LU j⒠jѴigSPt„  Ǐ1m4f?#n߾7vJNIDZcdffr)駟 hً+Y_"22Q~:﫯/4 /_wYSٶm[hZ0`^|;w3'>}?79s7oFff&[ <h4l>===L`DWh'N5.] 33ϟǎ; I;w0I:g*M &ϊܝڷoJgbӦMb #{C^ .VaW 3g_w)?پ};mذ'NPb p ǏRFLJb7lٲyqu-Z4ϕM666Rą,- :IKKR[{ؘ]+L666.$BٙBCCӓƏOϟ?tRTHN_iLLJk$_N]v0rpp>ʔ)oZBBB@D|i3̄,w3/2jժ_~wB@||<Jݻ7)7RިQ#ڻw/`ϯfE{1cP߾})%%ʖ-K666T|y kR͚54p@*]4=~dYP~&HAehтo!!!P*f=f|ᇼ\]]i&ӈ_VN>fl._(&#0o<M)~ԩ& Te4hЀX=|666SBeATڵk+WVZtPk_@ \&MеkWۛxf+^9~|ay R}qC$4iuG!!!DDDǖ>#<6lOp;˜M 6daaa;`aP(xĊĤiӆIP2eh3:x ׏"##ޞ6lH]v%NGO{E.+>wMFAdɒ7Nq髯blrvv6\]]qq9*ooovH5k BױcǢo߾(K@ZZlss$I5G[ݻwGHHm>gbbbgϞq]HhѢeڻw/J( hZԮ]ǏI]+^?~)w~S9d1b\}9_s@ѠhѢ1zWVV/[6i公,@׮] _666Ù1cZhI [[[6AJejč2/šrAA$ԨQӕ.]RDBBB cƌ| ^0ߴisL#yqwrٲeSt:Qxql۶ pE+V.]`r @_֭!Iԩ˖-U eNNN&&7xWWW֮]eB@բZj.^+++$$$@$tܙЗ/_Ɔ#syД---< Pkgn7N$ ŋqٻ'w@P0GO?Ceh49;v\p}O>B@XXX(V14?)Y$%%%Y9Ѽzɽ YrY7nP%ȧQcIV'N$YbŊA͚5k׮ڵkJ*s޽;UTBCC)>>]Fi&?>uܙVZE,-8q⟏NpK~~̍gg6 ϒ%Kdgg4yWB}:ڵkYooo6A;v쀇# j֬gԟQܼz̬~Mr)aA".U|hh(Ν;W(l{FL@-vЁRX!yNo„ ܹ38<{A>$2j֬n _5u)$ Af 8::2}ڴih>gXbnٲ^^^@֭>\\BwܡRJы/,S󵝣Fի۷/gGAG/^Piy>+I-^jԨAj*VPP-[HRѥK ~^tiZt)T*:wu֍bcc֖:wL5k֤4z ) z}w4i$ JOO'[[[:y$|oN/^xԢE 䄹2c 7o[yw`` թSP&##TB۶mƍӱch̙tM$4iBCCϩM6Sff&Yf͚tio 0nuLҥK9!2|}}k.9'8өS'L2|-&M![d-[MIvvI6Ջ^p!j֬ Vtxxxp5ˉ'퍌 H-Zpp8::˗/;vpL707n\,Ŝd^1?^})/ŗ)SnbG<))NN RYQ|y`mmͷ:xȠF_P|$Q;v,ŇCRȑ#s޽PTSJpj}2ddYFtt4;?uB"==EaBǏTR|`I_tO>4hpRLO?&I*T&ԩSbN6mb(QDy(..?N'Nྪ￧,/i4u|=ݻwŋ)44Μ9ﻛ6mJJWNݣPZlӧO)&&&gGTZ5_)))箮EԷo_L&KKK qw}GRvv69;;N?NÇP-[Rj(***痴oÆ {k>sLM`` Ϟ=Cff&z={"33ҥKQlY#33˗dž ǏCP˗If'5֫.XZZqݕ*Uɓ'uU^bbbёzMNNNE@ݣӼyc&///ڲe 3>xaaQ:rm5kҐ!C(==nݺE7 eT*еkhƌtRڸq#%%%Nr?@իWHӇǏm/FbWU`;\EՅ~Edpݸq#Um*Ufs"rq;w.C IV _ώ7渓.LLas+t|1ŋr`̄ZFJ8zM8::2V^Q`m`ѢEU;ٴiS ]$-7mdQ_ .XO9$nh%111&&&9@$,,,YYYR|6<<,--iOʊ\]]M6hFLQ}!FCNІ hΜ9CR(T|y4it:y&oߞ={F...'rqq1<@mE_YA*!IUV^;@Gʕ+_;?qvvORѢEiĉJ锜Lt1 uݻDDGӧO'I͛TbE #GGGѣ.]>}[u5: _rݺuCڷlق2e^N&vZN[+Bbۼy36oԗ~f׮]fpx$ZW|&MhΝdY&GGG1c߿ƏOzd*_<ڒ/oFժU+WL2eڵkT`a´i DֶP_|Q/ɽE8xر&OMKe3fLπ,6oތRJA@$Ԯ]+Wq'Xq:teʔaNFqǰ0ѣѽ{wF [XX0-/5kBA04988)ZѣR\\988Pͩe˖MTxqz.]ƏO(;;<==tڼy3M>=ӣG) ?~;}th4dz!.]:w˲LӦM#wwwҥ UZ5gL°q;;;o ~ޮ];rpp;ġChرJJ4iBt:z!YZZ˗/ӓ>38JHH RI<^z$ nb0NCFӧAdd$5## ~;W_1pQT)Dlڴ)݃B`aØZjy+ȑ#h4&aS)\q}x{{.xQ+j.߰aC苳3|qܲeK|?Cpp0W4%_| 刦DҥKwݻg܊uN<6mڠ~kJ믿Vѳ5ܻwf—_~i r <==խ[7?),HHH#%5jCdgFz_H߹s'ʔ)L&Xd *"E ))K>} 2ȼ?V F"iӦ(RYlǏѧO ۝{'`ذa̸ dΝefȽ{=B0{lNrhZ+V 'N,xݻ "γl0.\`,ҥ _ĢT*9r8߿oԲ,I&;@P4h7IMM};dx5]v|܎K. ppp(5Q-Z ϟ?///uԉ `ii;@t_RʊQm۶mCŊj9|rGGG~ׯyoÝ&]6l3әN$ESPnذ?ЩS'fGCF%K=`޽(R222РAγ޽{bTC_bE/sOV^F9r$RRR VΝ;QBH-J/JsmhРdYZFѢEܹs(Z(;vS(J'OF!2aaamPR%k5 y6^Z^G-Z@edggTR޳g)b/Zz5*TFZ+bW㶶HLJ$IСw=GEg͚֭[pegdɒXv777ժUonnny+>Ч0#y߄Yf!66e˖ͷ:ORرc~[2e :tkkk>}Tr_,̙36@%KаaC6ŋ73@+C&MП(XX۷oGŊ2W+V ]vǑϟX *PXX=}{^|ܨAQ 57k׮Dϟ'???Y&EDDн{M6$I]~,--iӦ z*hт޽{L-Z8:{,ծ]ʗ/OaaaJ[ttyxxP)""n߾MZcGQZZs'="͔)S8,{{{$!o߿vDW쀥K2{ȏ'''{`;@I8 鰵eV;vp;wСo먨(899>k,]@){}ƠA0`Wpp0*U@ 33%K<ӧၔ|NNNO>mڴa䜧'Μ9S*l׮Yna7M8޵kW܄/aj.s!s׃x(J˖-\e=ܹsjΝ;!,vpC r׏i q4$k"?{,dv1tԑ幥J*WWW8RGGG'@ѢEǩS')IZn3gr(ёYNvڙ2MHӦMy[ˍu҅/7paD6nܘc6$XXX|rb={VVVl:uznU+~ܹ>|8>a .dΕ+Wpz$ >]t1z!CRgΜ7Eڶm3#:/_/v{*U2wuue~)X`j׮ V !|I(QڪU+̞='(ձcG@'9r$*Vʕ+cƍt8w P1O>:{쁋 _6l~:w3NO>r"ָut:/_*UpbŊزe t:Μ98Nva„ t(Y?GʕjjQre>ܹ>AAeDEE‚AE\\\o'Zj:ywT{U<v킧'P^=}s,,, Yѯ_?|rHH-_5jԀ$IjX"'OT*U5kG :VZ"YӧڵkT)ĉ20 ɗ/_Ƅ ЩS'ȲQqٴiV I I*W_~%}|Ӈ\##_@PX,̄ K8qLvwߴУGdffK?8m4 }l߾ggz۷o111K9dȐ?w Ό駟Pzut:j/_;vߝ0qD\tou'߶A&kܸqҵ J%.\g@*U}Z*@ذۻwo܌L}{}$-[d2888~ԩر#dYFzz:+&hBff&4 V![n½{ERR\\\׿dԨQŭoߞ+?6?ޟ6'!#H6om'f͚ݼyӀW^|DEE8dWD-ZM΅ ֖ׯODDG6mڐu/CCClٲoԩS7oRFFhтѬY3rttϟӃ٣GRժUtҔN/^䟝;w 퐝 Zm:]rvvv9XtYBݍ9IA(cy N+~wrPvvv1b Pÿ+ʖ- ZiE&~~~tEP3Ŀ]$27o/gWcX5k ժUƍ^)_e0$I(Wi\{{{5P}PL6hЀ#AAP*|9y b6WFjFɒ% _hQU*'j5t: `NNN޽{34ʊMO?hZdeeR9]mQlY:Njժ1 ޣG<~M6-˟8qӧO7b”wF.bwFѢE:xAÇR8kj*/_j]]]Y6l`3/:nkJ 嗐֏k4ܼIgddҒǣ/Jbځm4i?Ri\OKK5k֠bŊR^ԗ,K;fs(0J5*]\\ J,ɕM4… 9I" P*\?R4Xk~&= X~J?w\^D :KQ2W+L_ +++F N3޻w}/_4H?#)RĠ|\OTt:Hu:oEsK!Eq+2 AGɒ%V5krDU*#ۯ>zh|lYׯG2e8hJ7x/sAZtiV}tt:ԯ_/P߇%}⅍/R8bW kkk>\׭[*UE~'9rJ* f6Z +)MrYPPa zUJztQ|$AAʅ2e wf(WP.ڵ9 +++.2OHDP-[h͚5N| yzzR\\lْn޼IF ݻw)B=7dggGTVO>>>t=rpp NﳑOŋ'".řݻG˖-#2]`tԠAjݺ5988P||<}t ѣ͝;ʕ+Gj]Fk׮e˖QΝ;Gɴ~z឵ "°aĉT\9l:{,GnܸA8hjy+`Q[ywll,>}J*EԵkWʢ .0Wpll,?:t@tJHHN:QBBG$}||(,,N>M6Ss6T9e6mSzyyxQN) D)M`b2?VꝖoڵ e˖egnݺ߹s' +1G!!!Xf '߶kŸƆ_~A-m۷qyVEj ...[+=**Kp8::NNN[///رE͹@ir.Pt޽_,}d( eYfak^DAk+=44,sL)vSdDWWWdffri2:ZY9Hlg4dvL*{͓/_2ې+VlٲIgϞѤIۛBBBB S3gիW:wLٳԽ{wZf U\h߾}tRF3-kzDЬfGYGJc[DZgK/жm[±JBQ*d=)@J!%%6667ꦔޭ[77;QWhٳDjj*$IBY񑑑prr̙3ѪU+IrwwunۆRJ1h)OkYJ Vxxoe=z4RSSZ"?ѢE rΝ_wGEEƆnEA޽OK*T<_.\5x ֦MJ ?~Ϟ=wb8uY#ajD,N~СoݺմU*"yILL ſ8/< ADDEZAAAHLJdO^J b̠#8..Ċ?s /Ws*sS%םT*899jR閖P*\l[,_7B VzŊMe"00 b$/[ @9H" Ę1c ]]]B Lx8880cv{{{Μ9mڴooo>}?󒗬Z իWXyʕJ2EjN? mәOG?7ŋlx{{xWWW׏Մ?GΝ9#R56lww~(YhA];>}%J`>mrAXXlmmh׮f[N'''>g&uB2e HDi u/PӧOG۶mE{_G`oo]W\iT'YĐe (JYO6Er!q#%gϞcy:u'LJ7o^`E HpEÜԳosS(L͂ РAHLaϞ=ljKx߶m[`>}\gRjG=z46os.VKavP>\#hKqvvF/YժUcڒŋ3ߩSPhQnڠ)nb4 ,*?+ oܸ1sQc߾}ljٶm[̜5?%w܁-Ill,홖d…Y&4 3+ɓ@$n6{d  0#)RIժU^\r y$]QFgggK./_B&!/XIn֬T*9~_+أGt {5*J'a~#T%Ғ/P LΜ9\`WK׻wonGuݤIPJjlذ(#CRQΝT*q'kڴi%=/]SLAPP|yIJJ : L_!V9n8&\Ai&jժ7wMX[[soR]pL$uXX+Ɗߺu+/lt:ԪUǛJ7~Iteλw؛P]bl"TѡC&Uvt֭6oٲ~~~|׮]Tvi;wD^,~h7tս{w;v̀R?zSv@c*@RK/QdYNCV,_3Gٜw w0+]0r'" $JѣGs83sYM6ٳgprr8qDt$!11׭[ *0qJoٲ%۬U#xM)dɒf+ts&0y3ǎмys̚5mL4ѿ(V+}&Ϗ*N-Cz )a'L~|VV\\\X[n?o李2/\V?xmԨQ|D˗ƛTq<~s/#GLE\(Hnݺ#Gb˖-W۷G&M`F97o62&$$089 >{ҥo݋/F5rXo߾ZǏjѪU+L<Zm|HHZ-&L;9o}7o TX1Ǐ{mmڴanjlSz^"7hҤ S:88αZ,I&7oG'|=ݺu 톆݈M?~7:u@2H>|^^^HKKNCFp 3_DW۷1f]ަcc_A& hݺu!I4 ʕ+NJ?z(lmmIмys. %?>o(+HZ-2NCÆ _ӧO\pO<`9 ‹(b҇ U*>c9@N ggg>\.\:u@!;;\u!8::\D*444nC(mvfΜ[2YX=z`X@ ѨQ#6eʔNǏ='Bڴi&qTGE6M̙VZqTٙϖÇDl5kyڵkGarּ̙Fq3*GGG@8p{DnprrBbb"dY6P|||?JҠmCf I>|8%(S y+vܐ YT}4hbŊqFоMtiQfM2]zcŋk||QtAe8ptѕ\]J߰aFMvU(J.裏 )aΝ˭.D..oJ _~aV ___.U75aaҳfBV 2^N:\Ae,qԥ:880Bo T+]H R~s`u>>>1_'noܸwwwnra.]#W^0w+>>>mGÆ Vŋ9rX9J/Lco6yfE#$)) 7lٲljժ^͕+WP(>`R6˗ѢE ./!CիWԽI &4Q P(xaB,[,+Wc5|p{5AjJO6m Y-6h4dggdɒ/Z(ݻww/^Me< ym1c06^_v-ʔ)rʱ;y8;;$Э[7>\i>=z4J333QHVƍ V I6> J ֺw> ΑZZZrTe\r%-jTQxEcǎ-ÇƍѾ}{E۴i3:E:۷o3H_Dvh\15k0^eTToaF>&ӧɓ'tv9qaټR?`ذa5jIԊ7nG+JT{'YYY7n1FFF?yv-,,xůXjՂN~u+ '2u & "<{[yiРAo!!ާRS"EhŤRVZte*Q-_GgΜlT[ڴiC.]1cН;wHeСM=q=z4~Gq֯_2e0ʷz|Ғm ]`իZAD\W4bуVVV^MժUWV  `v)S0dNUiРC߿+уmBb ԭ[ù%K /_J_hYJ߿?>BKRN:X`賋 }ppp7X*UZFVVJ,^ͥKWzfPf F!Cu`4t̙3 6=N pǰETT+^B֭/j5j5*Wt+ݜ]p]H( /9]ͭtg rs[8{l̜9+V4ηlْ+E>1|05hWĮWwu9&.sWV*xྑa5jԈMݻwT*!CXqqqP(q㕍J裏VzR (ޭ鐖+W2/W^5c0!++ WR4RgAV3ݫ |!8e'V8\0_|9jԨVk^ŴҘkr?J7o˦/vؾ}ၴ4hZԭ[;?~lF+>55_~e˖Z/.] -ݬY3>B Ԉ#гgO>\ |Y0氅8q@HHiӦ\ BE fŋ.`p]ri=z;v@ȓOfV\qaϞ=b?k׮E>} W\qaw*SoԨRRRSqa۶mP$$11)))؞={P|y֮]q<=CgϞe111`ScRUTAٲenRb*+ujՂRJ2+ BˢsA)S~FFFrVZjF?/_<Eet={CVEZ# 05,#))s133.ʸj*ʻ/^Lw˗/BJ*ŋstI)&&uԪU+5kS*U($$J,I&L(ڵkiZ*Uek_}ڴis_?~@ؿhѢܳYf:deIDATTҼD/}6m05sD޽ʕ$IeuݻwammD>\_׍2S~Wh֬t:RRRPH+ڵkʔ),h9`SŅaÆw)=67,N`γPtiV޽{bCp3aÆtQfm˂gtY1{|y]R+<,Z-/6psscf͚q{ !o$د_?'?뻉;..QQQ= 7|FۛU KmOfwϏC"cS]Uin߿@Āzjޭo&D85/ҬY3lٲŀLH.]qVDDlmmϘ1-[N!99vvvw܉rqF/恍޴iλM𼔮&pyIDDğxt߿ܹ3&M aaarjGOOO7\wJE<>_S.z.QJ6]W@B>} YѵkWEEGG‚'믿fPAE"VEHEpi]~:1gdg M:ȁ9::߻w/J.ͱ ]R\TQX1Έu_|HSu̥ڱc*TA5jVzzz:jI 3jH^JB\\ xt:<{ aaa|KϞ=ógl ̑gϞ!..Έ'^R… `N:⣣ćٳѢE HywiB`Ƈ/_3gߟqy)bŊx L ̙3ӧ{E?2?/ 5Μ9 &p[H]pHLL$Iܹ3ѰfwRk4*U탋KH^*V@Ћ/ʊE]e1c puuũSX)=q ~a=== l-|) s/ڵ,HII%۷oO݄333+ܹsBzz:dYF8 GGGΕΘ1ZNsrqq_@pc;wwؑϚhꫯB˖-jɒ%q;udV_+p\2( 3gDvp-ZEHnJҥKѠA*(Qƻg?yĠ{ɓ9g)]D eY6QNDDepAJ/L -Stooo.-/d3'o6x\ҡC||p_d$I29s0/Q={nֻM2LPoe,8;;smʕ???F;w...PT$ ۷5** |5kZn?,/Y1wq/b-Wy)]D0G~rHFm8880իQJHIPjUϟg*YѩS'@EFF͜9Ӽ>GU~J?p466@vZ:t[޽{wz )Jӧ(Q.\HqqqTF uy{{ӂ ĉt)$???ںu+nݚN:E&M e7oNO<@׸޽ n%駟br]]]p]r%*W V Z *pt̙3c_%ʠ ȇJ%Xbj֬&bŊ܂ܹsDJJʿK=zݻ1tPt #j۷󊏎x~-x?6IYqWR+V9/RBe|ܚg…UZ-eSVzjh6P=SGZBTPEEEqGAPիW$upp0gW(IA˗/G*Uh___lݺ509s !!!3o߾&N0x\ZY&NgsET"++ ,QF\WB FqXիW YJm۶ѣB 0/^=;vlٲ|(֭[߭[ te~|LL  /f>1G.#[$2/Of:JWTؼy3:UTaJ;wɉO?,#** lj藑$99 g6tNswDz{n-[PdIdffBQJ*6(o0`  ŅK,Yjժz5f9e{nxxxpkzq}mPP,,,ExqrttdF7nggg;wf 4```   ˇk||ِe 64UwůoWR!<<JABm|ѢE l8dYF lʗxȐ!ػwolJ}c/5d^Q-rԩɅ]Eꐐc'L`VAEr(ZV-67od]Ӆ xj׮m'$IHJJ%+xTVZet}+Sbrˇ~"Bdd$bbb(VZ᫯FTtN8wĉԩdYFbbb"ٰaV V V *pۆ[nH"E*mۖ#͛_+]e^MtݲeKns8;;s}ʔ)|ݝi&ncVQbE;gM6-K>C5RIЦM= 2ebo߾Ŋ֩Sc5d/`833NNNev R^@uؑ-w&N6>##Lٶm|}}9vUn]XS&L`d`7wTR*ĉ(QWRǏCT;v,t6^T7l؀jժA$t: )=99!!!fgp}DDDs+>Ҡ/eNC$uӦMFJ!?VgC$#2*W?$E9Wɓ'SN8;;… r!;;;o]KKKԬYzQykиqog{{{#r/^Ύ3PӦMcxVVZW\A%wSRn]XZZ"::cǎe8qHNNNC˖-HBQ}///V-[P̫yM q Ӕ)Sйsg>\]]qj^ʖ-]w-ƆEnJ?m|VV\\\l߾Jz>c Dīh0W޻wo.wXqNѬY3;8q^^^l۴i6^0K J1cưU*J%.]ĦSzVn{{{tP#J+!\`` )h{ưa 2^x \|@NO 2+ѣ(]4yz lll7^ޡ] ]t!*=?2'NthѢϟ FJׇ]tTP"⧿ ޞk-Zd}fѣGQhQAӡiӦ|\>stմ0l0#>>,oذ!O"0'Oܷnݚfxx8,--l*iS`` ,,,ՋX wɒ%Udʗ/ϊ?~8C%I2@fM+]TSN7o^15Iȵ OSappp@ffxx )M:uqAמ={bРAPTfhҤ O`R|I8;;3#Fv0sLH&9QrvF'(V\D/@8::իN~h֬dYFFFp!65J☕,,,kRV{E;vAYf ʖ-_~XϞ=1b65 PNhZ{>|9u:7n̊ٻMFr˕+6-Z%Qd5=7oބ bccRгgO>\EP/l|j֬6HcǎW^sZvڡVZ\UVP1?ʏ%KIe-[L)Nj[?mfWӄ\={qATt Y}CzF:mR,Unf7ʭt\~8𔝝 777<?~Zc<_{ƍ "25bGDDثoGDivx{{h~g^āwߡnݺl]\\n%wiݺu\2Sz @r:{TTlllx7̝;fT>|>>>I4jS~iŨY&||| *]eĊ߸q#(* 7oބ#rd-B .DڵyK68\]]]MEIVN:'a t'}_D h4Ȳu[*l|ll,+^\`eeŦfѢE_>lٲl?WzA#sD?$\4aETɃtDlذUTgUƱׯҒ| xdܹ,Va+VS O̝;5cJϯ\gرx5k֠zr_|}}Xnnn|@уom̙ƍC$ӚǤ҅ƣb;'''gO...|)ѯOH7-- 666i i&? ]wQU][wVbAAwE{Q{ޢ5&F(vBA-g~?nA3xI^ Q)`ѣGi  \^b</%Ӯ]tH~K\x%KPLL&ùsо}{*6jԈҎ긅*&,, S;v@߾}i...y OBGG^XE{֪#>>Z7zhR+ΝCӦMf͚N0K..݋.]@P|~ӑ] Ks?.vA@=<Ԧ{yy֘;wniͩ$14iϯT*ѨQ|/Gž={#_hƎ LDhhhƟ;wT*4i"9㵵#'Ĉ\l3СCrum899GtԦ_8|0VX:E?qI|)xӝ[[[ʰ(.<,@"qMBBT{{{؆֭[C.#''tml2V\5c?1ɴ+STO>,**yݛխ[f``ڵkWg3֯_?<<}Xڵ/KHH/^|yiקSN$)&.<#J~2^z11yPvmI1$E-Irr2455i/\@qm e˖t888RJ:)VA|qsQT.̌~'''ԨQYYY*UﵵayC r8@ MMM:,YqACKK6̙3h߾=y͘P^9"qbŊ/oy… hРįNNN000s-NjoiiڵkSЕ tڕ>'"N'y333@5jԈ"رc?999֦-.MtчիWQ^=kTΑď*U --[nL&C@@$BP~deeF;LMM{m߾=Ң3΋9xbL0Z[bE/UVmۖ/xLVpKAM@=MU~hٳСp<έgŃZyjժz={t{{{B t;^p!&L@g&P,ajjJz{{{ަba7S1cH O6lX,ʸgt iii044ݻwabbLd2t҅6> ժUe0~xӣ3gΐ_Mvv6LMMqegg'&&sΑ8VZn.\H]ZjTV-Q#.<u;x tJEC񖖖Axx8J%wNMj9t3>33FFF.]B |udIGGGprr*pK2 Oё\J7no稠A{߾}4eR`bbBG1FToOY,^'N$vTj%4mڔ}8|(cQ^%t^xZp!m}|v?91mjj}bҥT%+E*V|nӽե] !~Ŋ1cFFFDC:/si ?p>geeĄJwUAPK.ԁ P.]J)==5k֤?<iӕJeX?Û P*Uᛢ7oرcEzq0|(JASS߿RIP(РAXXX@T +W&s߾}e(JjvCTb;v,J%sT*q% aaa`G޾};Hw錷Dz6bРo.܊DL'6;+WҢf֭ݻ7*UΝ;hܸ1 T*:wLa>>>֦… 1i$8hii˭2զ Ocƌ08듓޽{.C'ܹC1 ;w0/+ @&_faYM4vXLK4C=HְaCx~JOOJBϞ=ivOjQ2)hl:y g))cÜ6+pǏO L;w>hZo߾T~=Yr?ydڏOn:ܺuPe,ZPA$|U*u~> PǪg03>$$tn޼ HKSW@?~L y~;AJ*o1yϗvŖ)xOQlzݺu }&&&ԁJGMcŝ,v܉={Аpm"++ ;vEjՐHɓ'^ j?\9r> Ovvv\2R0zhzFEEAGGX޽{I [XX@OOvJ???T\<`.\߿ț]joCΝ;E "OAv`gg'Q;/L&CTTT*P*k\i߿:Kϛ\I^5kք{KN$k׮ƫ1>}:ö\i&zwp3fҼs̨@صkW:j<<4za5551rHT\9ϳxŏ3(JokkK~aZMLL 455k.V$񖖖GVV93 /g~!n?y-c$Z;v,no7o&ln,>V$|xHvZBPPT!܅xȑgee\ |2Oj9`dSbcc!;9pyуFٹ$** &&&tM)SP>M2ogggm޼4:t cx'yfҒw刈\Wb.UW/njC.SM6EDDT*444 HRO?QW^ \222iPԩS#@T\]]i`׮]6ҥ Uȵquuu!e4maaaͅ%΋/RmjJd2 @q!(<2%{\\=4.Y6iiJieӮACVVtuuP(C#Zر#|||P(]=995k-iӦÇCbb"233 Joߒ[lҪU+^{솆PTptt$I^ijjJ* Iгgbƍ鹼?ǫm۶x&MI&ۀ+.;t9sH*UDv%{֭E[q2vi=?<|r1;2###P*W_}@.⩭:t7J%*U\DEEQ0͛7%bU744R=/oٲƤ#~4 ͚5CpH0T*"Ю];j0W 1@_?~j(wڕ~ϜoGFF̌ZsbzUVEjj*222PR%7>6v5kҨJ%õm6jN,?N#77aaahڴ)'ӧ\\\T*Qzu!99jՂ ͤɓ>=Pn]jUV r~~~#G!usSNtGFF%̄ӛ}~ZoZ`{ RbE(JDĉz~r\.Gll,LLL t@CBBdy%6l^[[TӿxNŋSɲYf ˲ BaGGZn]#j?1X{=ʔ)1~geUjϮP!5kewe,559880 VR%>>n߾ͪWׯXvv68p dݝKHH`IIIl,22=ƲiӦK={0cccVV-r9ԩ0`f jʕ+40vX|jd -WV"Nϧ 455!9ui pzBxԩS Doͩ5j >>X7hƍGӃL&CVvݷ莴vZ\.Ymۖfx9 B˖-91b|pˍ4ʚTozrKSSYYY7hwرxA1㑛KL{{{ڵCpp0 *V\DDD~˒攣T*j֬ddeebŊԜ-˗/f޺uk١e˖ CFF,--oXN8qTEjj*M;vŋ0d2ܸq...%,\ ,@8,]wޥ6vqU… gϞ#vq wwwܿOFjj*ΝKԼT\r#Wbzkkk@TԨQ* d,6>lȞ={̀JYJKL&#ٳg0nܸӘbϞ=ܹ3V\3៌,.ڻw/N> mmm\}ҤIq={РA7 2o*={LMMr:<C A@@tBoϞ=!h'3#Gbʕbgg'-nٲ%ZqInhh(Ƀ\B.ƍ% * ;;3A=ud{ޘ 22 J D tbiʕ+UNYYYL[[L}U6s2y50`@<;((5nܸL޽6n.^:t:vȖ,YN<455ْ%KӧYVV[n;y${bGfk֬a[la2}}}ٓ'O؊+؉'ؠAX˖-oSRRΝ;O?߿*W̖/_8tttؒ%K>6-_g$?w֭|||RPBj-ZDYNo֭xr:88H8=077N'; :Ngnn^~ARw^8;;ѣB`` ~ Gtڕ@ύڴi<@k矔}:n8< N:4J2ڼy3]dXpIpu 4S51FiizP*x۷o'k *W\m^*=WTRYYYHNN&]d׭['q*K;W@9s8}׮]^/]ʢo)1υ5PV~:ٙO0666+R 988'7m!!!mo:PXJhڴ)M+RQ=? ¸qХKT\:m|Ν;WlϘ1SL!ۍ7 }쩩cЮIW~q355Ettd8ܿ?ˋCZE 722N18YRDXX̊GcƍRPi}ҥTnrqql8uO1k׮!''L*M;CBB`w*3g޽ AD'J%޿ gEP(Cff&QF _7ٳg qstt$S[%c֭Jt999< @=88C||< J ]vQc9F6mh"Ps%g3gٜT^]2qP($ݻwS0qV"cbbhڵkԑ.sz17mDS 4l   0a2`)‚ 6NoRIjÆ YfϞ @=sFd4*ڵ9}-zdNϛSZZZdĤO'=7k֬o՜QF_~1v]vAv!c,qٙ[1ءCإKX6mktС=zDsǎ mw O<+p!=zZիq=L<O|3ffϞP b͍z!{A]ӓ.*J"u6:::dٮ]ULS&>yd2ݻF]&a-[,g;;;[nÇ޽{nݺQF{13f wKMMe~-y&}6lԩlڴiԩSА5YZZ2Aظqݻw۷oك֭[ل Xv>1cٽ{XBBٕ+Wصkט=z4;v,vs걜~d 'O$=zݻwP*044DZZRRRqt}̜90o<511A||ˋ|f:Dͩr 022ҲqbŊ/*{?#cHII",?ˑ#G~szJE4l H@?w\JEJJ )^RP{nڻ6mO/I4VVVrի#11Q.nN޽7;w& (_9KׯƆʒ|I`6mZj%vlHʕ+###T Kfffyh޿OÇӼo^Hb­ztss #)) GOiq allLT|ӧ$`k׮Ŀ\^rd9}q}v`С:t(y} B0@-K/TL& ~ʕv5␕===rI/;ѣܠR(Q{}:ϟOYd2IsKM۶m[2ӯ_?/, /K| }2P-s]@--OA|cƌy&>&&(G{McbbȞʊ@7PsJOOH*UACdݻq1KVVM"255eÆ c=*9<7VBVz?+""ߟ ߿,,,ئM g6mXVV4h,66M8X=zթShт1 ֲeK~3gΰ}2sss6d̴XYzz:KIIaSLaiiiٳg,779͛7]r0SSSkێ`Ç֖>|{.0'ڵk]]]`ܹRo={*Utܟ] OƤduI #oRNѣGO>T(·.كEA.˗8tP~ T*jժ$dd˗/1j(W\VB *P@/郷oBRQZ5 G0mڴ<'g077/Ɣ7C-9q@7իP^"++%CBBhĉ$Cٳ'޾}Kt$%%^$\N$&%J"^b^gԮ];-[FkצQJ*ATߟrbYLL 4hϧ)]]]d2dddpP9^Ņ/_&eQkrgq ;v, 5nܘ*cCSNa֭fq+V8w[..؛7oӧCCC9S\/X&&&044Ċ+ U.&ڷo+Wb077Gff&}”ǹkjjbСXz5VXu! JhԫWZfuĈx i˓CW^Iߓ/f۶m,Ν @OO8=͛7iL^===>\rujժAz׬YCFQҞ.rss&MP7bE_::: Cnn.*W \0n~1ߨ9*Wl$&&N:PTx%Z ֆB@PPz޽{I%cccajj A8/2cH$عzV({o޼ 'NҥK)AĹPĉt0@yMڵi̗~3ȇ]GGvIs; BH3j(2b^:%͛7r6m ((>X*J?s_WWWҡlݺM4Ahh(rssCҼ[*@rr2j׮ J%5kHCUn] +;K}S,z ܹ#_tѱTݝI/)?3Єѿ * ?%%%!-- :::...d)~z͛7GPPT*}m۶6zbN ס'%% ͛7t]|9O@zȓ |}}pbssshѢ҈[F;ߝ;wn:1Fq%%wNJJ*1s/AݺuM3~۶mdѹsgA-033njC{ضo$2oժk,+ѣEctuu311)leFy]zXdhh(k֬`XFF쟟8q"Y5XÆ YLL S({L.o߲/^W^={3g-ZN:d,..ZƲ5lؐՋ5YYY1}}}fllXnn.ׯ?֖Guֱ5jԈmۖ0JZj233Yxx$νH]KKnu%6,][[+ ptt#d籙%9#""Cuk@5jժR iӦd297em֬BBB+iNN׬YK@ԬY* o޼7ڵkzý㳳~o_PKKM%L[n\<~i_RPs7MR/ dիWtrNUo޼ʕ+9ellc9؋[&]ݻw1w\ӧOժUSkEtݺu+E\vfǎKrHOOGzz:ٜ_jUo7o^^zJ_*544dļyneeA`jj(J[WٳtB<^266nܸAѣGK5Uhׯ/ėЪU+탙Y[jRVZ!)) %{ͱ`z6[~q`L6 ZZZ۷/T* _ ,mF?@OO .ann%K(^3gPN=zիWGdd$W ' WtJԖ~-HLLGR 777Jly"㹃իWj*7/_$YrrDpfkkC$$$CJJ ]JBBB;;;AP./[dlL___C_'; ./nggJ%,Q~J+VDnn.иqcTtE͍N-[P Xfͨ#[R%r竧'=7YYYHJJT\k8|X׽{wp0ƠTkaaAfڴiyMff&߼y3%[m^[zUӏ;VrDjjDXU Ž;Ɔڶm޽{454Y Yzz:EѤ2+++Vre6h 6c v-VZ5fbb"""Jb:ub{ a{ecM6eݻwg kܸ1alڵ,::ݺuթSݛ7=ikk5km۲ߗ̔V*B/GmcǎQ⫯e2UF'i߿Oٸ8~TTpssCE]v \..+q?xѣŋrS`\2,,,;Zԭ4$GFFԾ/y;vJE?ƒ۷%ժUCZZM)JEVܜj޼9qzwMSM;]d{Y8߾}K*GAIڵ+jhhPbZXX`zޜR ҐUB}*EbN3Uł]zxJ۷oǦMJ*Txax2Ug̘A՛:u ..Nb[fߵk:vڕ^?C$Ţ1SLAFFtuu鋔{ +; C !Wғ4hP8`!Z_'/Dž˗/QBmΝ{4:׬Y3DDDP,RpzGx=J%Y7|9s&,--ɽ,::ܾx0Ǒ#G|T*QjUdee_}c033e0IIIx=5MJ 6lg ݻw/쑑`+. DzzzϾ~:K,!㣺u"!!ׇ\.?ڵkGo .'ܹ3]d)&7ܹC%Yfkb^CS-[DPPrbqzIT |=اOEZoi ///,_!!!_RKK|o O>%/X@b), ŜK.x=})JDFFRs‚73g$z9}ZZz'lBZB:u/RYјwrr29X[[cҤI&&&RǑ#Gdٷo_V(E:uC5jȣquu;p o5jԈl6x`T*5dllҥСCؘlْ1AXvB jv)֯_?֡Cַo_;5jXjj*4ibVVVLKK 6͞=oFq,22T*W_1Ryc?fvvvʪx'%[n '''(JԨQӹ`鳧0a mР9B.# ̕?NI{|ܜwޥٳq=zѽ <<<^zy&nܸy2 ӧO)㲸kӦM8qv ;;[( |wHIIAÆ K)S`Ϟ=h֬lq%޽2dH>eOҥ lf8pnݢFqaܺu 3f̀-ann]v_N* {n٢W^Ä  F ĉK/^JHLLDff:^R$sЫT*#-,,f͢TիW 욅y}۳3{{{ֽ{ZlN:C_^^^1ƜX=X 3`,((NOOgQQQ,00uރhтm޼=~>>LCCuރժU0ֶm[.2*4i҄z{W^x<==gdd۳ּysֽ{k.j*6ydv={u֍u҅ 6~U\ծ]d6uTv-fmm؄ ؂ z2`-Z`...ˋYXXkײ#GcDz6mڰ}2gggVR%fllYll,[lt>`#Gdfb7ccBL۶m6o\:{,[`A<ʊ1Lǚ7o^&vwwg7od{e'N`]ve]taSNe`ӦMcׯ_glѢEի,;;M4͟?>|Sׯ3޿߿6nϾkֶm|dvZvvMFf̘Ξ=tttԩS9{)⥋d?7h 8::BR 6,:Bs0A+ѹvڑLJPOz铓EDoVXWօMxd`` >}۶mT*UFBdz{fdbܸqai9bÆ d} -yOIPJNIIrInll &Оtڕ<[JJc͛7n <]d7n @w͠A`ooOyiiiH%VZϟ?1E9󱟩9յkW{d1&;c <kk&;:xZ[IQFx4ڱcqϭ`ԨQ sk֬!?SSSr@sZ.OYI/nNլYΦ ???;uTtplmm)4E> أP ׷rJPTdaaaQ(c,3)H׮]Ko֭[#00Scvz An҆./&iqÆ !"ǏoRMRO>jك[nѤKiX'eA@ZZ,--tqq)6Ʀ.СC 2s+7|C;R wwr clڻwotڕ~z0p…<؅;76۷/֭[G`011Az ׅ168q"/A0j(L>>qqdfzj0a={@/qtt9ԩ$Tz*V\dE<\.PUɻGZNoܸ%K>}*"'''q[nPFtt4SͩCb  4`/222B@@ĉ+&&G'y&NHf:O)J 7mڄ .%_duttو4o:Tkkk+%})s=33?~AKA@XXNommMtIϛS?.>bz#=o|q֭ѸqciN|qrذa.gΜ.޽{KNU@|||/ ?>i\AvoJBPP\\\۷‚=77:::x޿,i?[ mwΝ۵k__ŜgN4JӧPnN]4jaaax`ӟ?k׭->fP(v1ͥ`ViDCr0_s`ܹ3rnذ`y&]6$5t7w7o>2޽;qz.ܾ}8ɓ!99Y䄡CPKݨ}d&{54.X"ξsN?~L.SѣG%Ç}͛ vWӦMCPPU0O6m|C;j(ܾ} I&G#GHF缼R$!_Tޜ|R9:t___rTV HJJ7o&OǏCԭ[III n߾NRd|޽˫1ͣ.RRdT*;8sz/eM6 믿zOz@ L5jő9ըQ#^K=s̡l$$$$ '';q={OGd)Es- ᜞VgddRJDo8߰aEc|,3fzX:`Xp!T^Ņl>jժJׯ_WZ?}KLB :?;w'=~<~XrTjՐ R߿G%N_F jySxB7oސ?˲eCKSNbРAv||<1=}'O&N/FFFĹ{xxwょ*/=_xQ_* $Q5yĜ]v JBpp05kFϋ2@49~…y&]%]VoooӗNvw^J!,hkkCypn:ҖhтLI{aDUϟ?OSX J% bɓ'EQ^ƍM3B]ң:j-[8nKKK %goԨN8 $&&PܹޥK,^HLLD\\nܸaÆgqh",X;uDrr2°j*tJ… p!,_iiix5ѩS'@pwwqdeeo :u*ţjY_˗PvmT* ũ/j;=y$v!bYBBիG~ҤI'}5$SM,`ѣ?:u`ӦM|8Mv|Ν1}tjd7o1vXlڴ }􁳳3zI˗/Sxѣkfgg$ެX8 "##%~~~OSL8dɒ:O .7F ARSSB4/n:ޘPsJOO99 /B_~pvvt$''vO<ĉ˫1&geeluԨQ4i*=6oAAAԾW* Qʏ9=BvN6PfM[[[ݪUH{S^=DEE!77ZZZPTrS<^2...`cd<ٗ,YBF|^ FWq+jw] 鍝FXz5._L%ˏhI" j>|8?|!Ɋz|)LLLtRhiiQ۷رcٳ'yl>4xxx1(7n(Գi ٧uܻw/t???T*TX999%NM1cԩS ?KaoAAAYXXq~*w#Q; iii\!P*LݻwKU`Ԧ91XXX.\_LMM?;t].h`kyJiӎhӦ ڴiS6F&ݻw?K˖-\y.9šDxUZ͋/ AlJ;;;j߰a]d7nHr9u9jNߟˊ|ϟKQj"0n7/ |r̟?;cBⷑxSS_(`9r$ըvJC[J7k֌|+U\plI%_d׬YCy%''UT!i17O&M.]Sۢ%ƦQRsq??333?{ReAcF,BfϞ-b2 BRҥK.TKL&quuuSq X% HFTs * ##&UVQGq ĹɯZ<7J^7n֒/_bƍZq̙3ظq#6oLmܸ:y=777nCJlܸ@>311ALL4T*M}Nz1֭!Ҡȭ[tر!kddD5:;t耀)JQF՘ҬL8hԨod2̜98q{8}ڵ=>$AbzkkkTTbbDpfooO6mi˖-Frv1!!:::`?<Λ 5k?Wjj*qwޑgΝDoZh IdTT,\B`cǎ uH%~49ebbB^KKh`ohmܸ ?xptt$!Xll,JLcN>ܺu 6m«WqF칳%mې#G`ӦMz*\]]2 xo9rϟIDATWΟi-n߹;w8K}1c<.##UT pss*ϖ-[(ٺM6CBB"{5:ǍGY---dee!%%ft533IMD8s?~<_@jlW;w~VcӹsJ=z@,[ II Я_?nÆ xƎY%haM B 1?(2YcYfl':z(}nVVV5kszcccubC۷Rj`jd[nyWd=xz5/1Lc[JD eKKK:g͚{ott4}qN߭[7ѹ?L:u?Kr!5xdq`mmMͥU Rr} D:fٸwUVd2u*GաP(Ao{UV lVVbcca4z3ϟ? T|U*^u!5*'FA g͚++>M/޽#_qu}Ǐ/ʢy١CKc`mmcǎQ0Yrr2T-=OسgۇxI859s&ȈN3vE]t!N#""(͛T0aqzs/|_rg̘A @%I{i޽ytjժt9sH8}TTK~RP(000@zz:d25ݻ9sP˗hz!^RTJ8@z6mPs)L,-?~<*UTt/ZBݺuYdO1==Bv|mڴ &&&r+J۷HNN!KUI %{HHM#G ;;Rě7o dffBGGJ~~~sa㜞~yAݻw%'收6RSSjժATÃS;v젼VZ! %#""H{s5,]4ֶZZ*Ұd/+*) e2I'I9B'}>}&:111T?|.)) sss#NSyǛC$/mȿ+ =.nA`i)z5'OL"-[mm۶̶pss \2223BuGa̙Nm$3F{ OOOx;88h]O0AUR`T&77r999z'%%!99d/7.W^4i҄t(UV\.G`` O:EݻݻwP*000>ћs aÆT}f:D`~~~ ѣGy5,1ztuvL ˖-#9###$$|d,8z(OG?|ݻGF|VRRRnN)={Psu//=_"hŋ %w]n4*LUfWT)̞=SbE*Y׏.ڵ+{9؋cy^|IyK.ş @=ǫubj.6a 8oK\՘Lُ?D1_>%EsǹW^fԩSP(SP xA\ĉhѢ{聄:tqqqPjUϧ˗/qQdee ׯ_':vXlذhժ;u剟),عyhJ0}t;wC9M &;wFRR4551c <3f͛ѰaBfT*!99 ;rJ~wȆC.bŊPKgΜl^JիSd9OsΝ;7FTTDpN:Ә=x`ۓWZZ ŋ3f #..YYY/DͩcǎQ{j+GFFall A`iiI7oܹC;pY9 ,T\* >>>$wgϞ}hxС+!!N'%KR'fdggS/uK}FÆ !߿OfܹԜ⺘ hhh'{Æ ! ?Lim۷Ra82`oګbŊ̔hŜ~ɒ%pɾz{{Kly)SUCCHHH9sPN4k֬e5̛(\o[n (FqbqΫiIIW^ŪjaÆ f͚/_@oV$;֭[#$$D-ZSU.EGI?o<ܾ}AcJZմiS*-_@ߠA➼,n?~$|,* ؇^zbŊd?{ll,9FEEQC ,IMK {4lؐR9`Ȟ:uҳ{A7K0s߿t_a`o߾=A%5>YF u%+P* 8@-O'}Ŋ4jժGnn.*UBPF FKJԭ[7/_0Hb_q7G+T@v 4 xA1|3ƨ)PKte?>,u:/^$.~~…uU>Fyyy8z(}۷o cň.ݻwylŹLbEAOr; n`` ŋd4:rHE6;;ɲduR}cHпxMڵGc@LL cx]CҒ믿g.ً->RRR$vo666vӇHQ #o񵢀]Z`$ 4O~ħ{֭$ԩgV($zs5D9r$}o@j|qz1iݺ5V.6={A J*HOO/gׯqأhںgR=o333)ښN+VWIӦMu<ρ=##999puu+T*$lK <<7nD -yǏ%}v<44r:::Ftt4Iyw:9QT]6]dW~ #u<!!!믿RW^pssRDj_;OMA̬LjpT* /_?IcaT`` ڵkWhӨQ#L>yWKojq/ggg͛qyjSpPީxX~ @GGHJJB:uRKJrԮ]8= qcǎӫWxYɅד544+Wzy ],ZhqڵkF[/HMMA]8}ӦML|[dk137>MJJW"du%O>>>y8}yO>)'HDGTP^bNχ7oN¨\f͚/NNN乸eԩ|}}W)Nb;QF;tWzDic˖-L_R9 ԩCrj :ɵjբ&X߅e˖Z?&~GN\ Ņ,2:P@A*UN׮]dĈx qĤDɾz͚5k̴u \.А۵k;;;t111X~= vލHlٲh\'Nʕ+C AdddBCCG… x hjj"22!!!18H:Ο?OFD^z(^r%^Ysijg"<< ]6 S")) Cdd$D7*Tz<{֨Q)HMM!J۶mÙ3gh_EN/^ڵkD~ A}N* ^OyPGll, ΊT޽{ѠA^Xf ߏիW:'g:u ݻwOw_cK)>gb̘1Xz5 իWW&KOYC  oߞ)z2\eccC'}AƦWƅ j*FtF졡ذa.\իWz»wЪU+ر77*4yd*ČTV 6圾q B @pp0Q11R}ҋ9}bb"&^I{SNެY3lٲU{VV.g^zlܹs[nm۶lŊرcLCCX?~edd[~=y`Cek֬a;v`zzz`666e} UVǏ3WWWfΜf͚ׯOc>&&;wm۶]~]+VG2\6l?r9[v-;v{ c&L`[ne+V`FFF~Pv-?/N:绯l˖-짟~bϞ?c\91b[v-ۺu+k06lɓ߿|xa7/K#⷏?&9C4i'.///:=zd=z􀗗M!/޽{BL"tzFΝJ * '7Gő_5^~ A`TKE#~5ћ~\[ңՓmFFM6͗{KH5tPjpaTI.,TcaoyKz ?RpY Bjժ!##IIIxM7SLÇ)4)) d|JK;w ͛#$$%ccc0|2Fׯ_L&CZZ5^~ÇoWc222A9>aԬY* NNNa 6WΝ#ЋQEÇѿ*!Fƒ0ʊtϧ*`NOO'9fϞ=!о}{@TB 刌DӦM!O:.UT!NohhJWWW:7mDͩƍ#$4CeE!GXXɩ?޼~211S`?s cM344T3҉899QɺuHWo?Fq_tN'ŋ _P Ia7SN>5k$w]N Ė=9@-_ ^ߎ$w۷oK 7}֦:vvvƍ):588H>TYqMK Pn]!<<\?XqkȐ!VZä$խ[qqqUUmFs ˗ 1EI&ܠAAPjU#=Çӧz1iܸ1"""$N\^L=Jj޽{6'+$$ԩS#j3XŅhΝ;q1jjϓ刎1Ԝr=2UkԨQt+X:uX[RO-/-+J<~Ͻ{R`4i]8:kJgggz o߱' bbbS!ٶ=¨޽{۷P*QRRSp͂ h^QF4PQjUd2SNB@jը%ҷow}Gl||d_߾}K*wƱc\..Es߫WRzȑxei A@nn.J v!g ק}ҤI #Yf|Q< x.'F->Z a۷oRPjUdee!>>&&&>ᆪKr#""PZ5( Pfd)ݡC@PWLLn޺I6m!==bbJ$Hx۶mߴiSJ522͚5崱w1رD~$'/X\zm&ōիW |&322Fab)F5k D Cci&"22- x_J%bccI+sΥf $&&l x}_}qz.@ƍpӦRsr4[ZjU s-["00U/:g޽{Bw^9 ܻ8+i˗/,Ұw<١{%mhL\\ٽݽ{sȥba3 >v-:;c,0* pYC 3}x333BDϞ=Ô)Ss醙"##$ScwI:bgMFKyw%ޱcW_}oooɇ sMp)aR`*?aThh(ϟ }* §?~)S@&a…qA@ӦMIN\J$8v$SRIE&0MIM>< hРk  ޾}Kw{O?)9pVB,CCCJ" 9 LB'R5"a+o^5kHQ111'P>7{)&}}}g#)):.\Hڵk#)) Vr677233@̔7h_vӧ6TcfƏsΡ[nL&Ãp]XYY]f>l0>}wܡlQ.Μ9wa֭‚ ~z:tN<%( ːO2 т...0`g+++X[[puu… k׮Sk$]|9raTnn.x|9& bccQ~}@'=7bK$dffJ*PT򢘘}Qs}EDDI&oߖ9UR%#-- zzztMӷhѢbV¢E| ,R+Wad~va9{,T*BCCn:lݺ...57oHxx?|ϏN3g:t(2LBĜ~211<5H1b{!S*l̘1e}{{{ƍdzϟ3l2dvZfffF?JbGf<`AAAf'N`ǎcڵcgÇg,;;M2YYYL6m4v=fiiܹs٬YءCXݺuիl޽lРAk׮lʊ}dcnb`'Of&L`ϟgիW} '''eqF^zjذ!Փ(gbnnNO Evԩ$[nr7oHQիW>.!::rrrF3gPse˖pqqR/'O7#78駟~^NBիSWܹCfƌ>A1}}}(Jǹf-^ K ̜+U n޼)>zL^jUjQk׆J›7owzjگ[.uKTB>ޜ8q;ggg@яqqqԜ~…DoWffP+us~\+ƍqƌxYzu 2{A¨}Q[n][0· WY}ʕ$j@--< F!,,L닎;B&_~1rigϧw\&<<}:uuuu(=FGnѤI[JO?D޽{WZ$Y߿_d7j韭LK7n aԘ1cK*&%%I>4vZRrk3+U=w\t͋2NNN*y9&M@=Mf&qQFqo߾xM$uz+++9s&}$٥ 04h 4[ oQfffaB5Q~'2t90J&LO ɩ/_J %lmmI~zҖ7oAxx8 I?q3J%j֬ Y gO<ĉj&s%B&]t'qz>±baasf͚--ƒ=>>+6|iOR;FTbaԂ ¨FO(Qi4633.-MMMFQFKION\Immm1tP6ɩW""" rm8_~tNfBBիA$_x1&HLpT(СCT ԩ<==%񒱱q̝;T v.Cӧ+ t1bIrMyu\?+7QT._bTX'|~w Y+H.7+Vk `jjҬdkA4H 㩆3~KFRAI^lݽ{wpӨ(+ ~~~IJe's|솆@jj* ?N. Ra')}-Kr.]HQܸqcǎ%Ы;Rw];;;ګ9sնm[zߟcGGGjU#"/^pz/+hcj&Tǹg#))믿W7o(Q;4.M۷͛7\t#T*Һddd/ɓ'%FUXQ㐛n%gӧQQ⌧ׯtؘ1accC5넄PGΎ͆ $sP(\2rssN'x|prrsLFmK.XFDDH%?'Oh=A]t)y5Ȉ>UKO> ѣGHkצX/e vޒߵkI7o`BLL R<9zhx pd#;QQQTxx8Uoy#KSCN<}Tv"6>nϛSGW_}ߗNqܸqx7(O"~#&{r]8^˫Unnn)>ӢE JºBBB>mllN ԨQ Ύ7bKۍ 11OƖ[k\\]d={F!攡!J*9}ǎ˛J-n믿+HN"aQe vkkkɰ ߾};򲨸Q#v׽~:ǍGuzȐIvvvjՊ|)9\p֭bÇXz˿xXZܠA ߕıE˗/GڵQfM,Y`(ŕ+W:GhԨ233zqZZZ2d/_`_7o T=.^HRzy!ĝEky/T&-ZcΝ m>WL}uW|}}RHZGЛnǎ ֤'o9ƍm|J%   <ښe˖ ?|xkΜ9 ~W}&(^OU0zs7o~R;zݻ\.''x*l$L1cZ zg* 4qFbg䈈7;ẃC@84Olg9 )]Q悄Qb/Z9̙3%¨4FT*URszB+)-H~gbkVHNN&Ki{{{ȊSrP(X{A5>>8 xuʂf9 S'(???p/Q$}&MT`_jiD>zzzTCiNRRyG?ҥKxGRJ{7DO8Suzu =III~,X4MCF^[4"۷ dpSK.>_dA. 8,*̠R(s_ꬬ0{ljp255Ett͍Nz{9L&q\i$qܸqԪU+ソ}} #8gذappp 7S]VNc ZlIlѢ ttt̹xjprr ɐ^$SOTƈQw7sٳg޽{-)JxxxP%cv! !iޜԜ;v,{Cff&y888͛%J}w}ͩ*NNo o]ժU<¨kJOA(z.*KիO {֬Yd|4{&Q;wĩ \URo]z@?n82QO>pz17l@%Kl- {ïJqРAN.8366xbM*R yʕ+8q`/f͚Ν;/,12NH;;;1tzO / ͛7SQBBB)=FݻwO ]7##*U%7l۶Rڵk'1p?$^ܜFLvppOY>D"  8gСN\NobӘ-['k0\sK qaԨQv\Ƙu0BŋRAC@@ Wr1/ *» ao3>|Yf9Wbbb$nnnݻ7d2K{;\.1p←/0abgŠ߰aN/Zhh(ݕĜ~ȑ⃝1V`-JgϞ اO 솆)H%pi!!aTDD5Q~ֈ_8 N0S>w}:̙wBg%7mD:9[lP7 ʢ9n)RK;ZYYEvĈ hԨ)9Ã>XM_fʕDI*oNM8Q80E.=VPvvvX"JUV]v+/GCC'NVZso׮gC zpLLLlvqTRڵ,^xqa5;vgQTO榛Q=޽ڵChh(F ssshjj>7oNrSSS6¨@:SݺuMs7~[ZZoH_^=szn|$>o۶-!%Ϥ^~ĉSڵk<{oݺUNO>E{||<޿W^իWP(x5+zg!,,5nnnxbcc}z JūW} v0ד\B+U,0s`x)8;;KSw.]J¨5jHJ%ѩpasz 333d2ܻwNonHMMEZz,߿OS6m_/Ae?7dtׯ'9}9)VYFd…$Rw}$i^^^t=ۗ8o=rJE O괛»v"@n[-TY O4 /ԇI*UF 0No8?,)؟>{*Fu߼BԲeKRؔH,)N T3fP/qzڛÇٳ'<==![XX{ŤIֻN:v]CCyQcǎ:\rڪ"**t(rAAAD'N>MC=z􀛛dP%55UbOy 6Dll, R OOOS>|tJ:t Ko޼Ii''Nē'O"i/)- ;x¨DCRŋP|ŇT####33SrGž} Э[7S$355 y@/NHIQV^ B⭳g^ 999&zsuIl'?uuu)^v`믿PbE0ƠAiӦBʚ6L"C$jccC'E(^7o,1p.8!I̙3F -޽$[boϧb;Mc:uD7]v1F?pqǪGgggاOO/O 0gΜ''OCXX=7sx$`D"8UV8O /M7|9sA@ƍahh۷oƍ 1X[[bŊ.. pIOOҥKd%O-u  ;;;T*ԪU2sެZZ-[Dxx8Kd2Sl|ԫW/HMM^@'Ϥr=9rDRv|M6x%y8{, 6荦& ;p9:SZZZCNN*TJ___dz:=,DGGAVVVzÕ1 TZ* ߿]vHab;K\z䟚%Ucca.]˗/ӰèQbg^Cqe˖QI&vAI2Usrr$'O`ڴiDa111w׿޾}K&Ǐ ~-nݺAФIDDDHgbNˢCǪTrsS۶mH- O:$<>]uuϋ6hЀw={J.|"z u;O: B2Q0Aof =͚5խ[EEExVNVn]֤Ibnٲծ]]~8pu҅=u҅ 25k֌ծ]XϞ:u*kڴ)Z*ݻ7 dɉmذuܙUZXϞ322blLPӧO޽{ٱcLa  Qu׵w ^0;V0)Ec}QW|ϫ3<ל9޽{'''Z WF:uP^=C(bѰΜ96mڠ[n6lݻhjj"77;w./ݻQF T^8͚5CnnqYx{{2dڴi={ +W&HNNƼyǏ#//:3gѣ066>D"$ :v숬,͛x=oߎӧqh۶-tuu!Cv5޽{$h֭D#G#GॉCɓ'~ ^4,Md믿VZ(UV+^ٳgU3gΐ)KAxqU69b :sHYfL/s%v8̤LfVR6G甇N9¤rz~h;%%qO>eV]ŵ;*V^KPϡ"WyPDšcǎx5Zj*U:t(?Pn]<~ P(3W.-Z(}9Z\ޱ033+kX͛ٳgѣttttgϞpww9jԨſVZl/_b 4jO>E>}HNNFTTtwޡiӦ022b_|ڷoSob~VWzu͚5i?~f0333UtX`Yd}^.7rDzbu֥8MXfSs)u,VXPvŪfaީS'6?k``k֬I_ZHUٙo{r/SlddT, `+VЅ ~®111_ S_8^2:uR-,b\RYL&0طoWΫn߾5ܴmۖYL&Xjذ!qy{---67TvO:PI.(5 0@$kժEӧO''''67;o}(#|veI~&ܻwox{My\Y vҤILU v^2t[BZ:**(WfMcƌ}8HFr9IΝ;S@@DeǐɓC`IcNZl7ŋ}8iڴilRI,qAeo$e׊d*~Ǐg`777gwpp0˻8~۷oO*lzLԆ' sαQ4>Zc,e ƍ6ؗ,YB锗Gzzz$R-P\\gϞe ={23,"f-bWk+\:u>øyyyd``@RYNw^x^>%%}h̙JcMFuazb`!ߙ8q" &QZt8,`_|WV^Mg]innΌ O=2KӤI~<ˏ *GEW.<}<`>Sv(00r9ijjD"ab6Ǒkƍq)66LС%$$}黠,yV ;;8/_"k]Rg]v'N0^KK |ɉR,XRxJMM|q>L&аP}̙*M, xM;v03>~4KȞg#]P)??_D

c ڵk`W(|rRWW'uuu7n\*Y<{1tRt)&^Cy㉓'{!_xQ~޼y 09`664FYk񾾾 H*؝+W 4 HB+W|gm@ `Su@]hQX_}W=MMLL(55U%*4;m۶e@ `b!˗?l0ʕ+SVV*_Sf Kc??w\iܸ1.eZ̘{G ttt7,@jjjvۥ%쾫Y ;ߺ*FjNNN'sO)efݺuLm۶Nry׏x/_fV>8פ;w={ƍ+UD2BBBe˖ |SNOr 7]QFe'-}۶m*WYɓ'څhwHT`lծlJTR%f{*yMRttthĉ*/^d4gU~~>ëN25jDqqq_;ϝrGϞ=c^9'233c 2 O] 66"##`D"49(VDXKe Ԃ]T-fj r6Pܼ/< OF%OK* 222B_N]8z)wsxccc={KӮ];EYekkf\Y_;W^ 4DBbbbBrU*/1qD\2I$eJNbEeWMOO-j\x*yd233sQ)Ο?O3f̠sΑ\.G5}tɓ'Ӝ9so׺SN,hkkS~~KiƎKϟ?'vڔLR<<<_~diiI6lGi U\Rx_ 3g0ك}'rӝ˦?X볆zdߌR?NtLfccC3gd%{~~>Ѓݻw'x"egg sx( Ǐc]~<<<(22>|H!%˗/ɉJ>}ڴi҇H,溜/}􉬬X2?o*J7Xojj4ys^a6mJ$HrLW YoziY>}ӓ RNNedfS#gfQRE^zΝtA"*2S+}}}fWAY~sBA]v}J OT^/ O bF [_ff ؙA`nn'O` L/8<}CE\\233ѲeK}mڴWurrr ?ݻ333QJr;445*kcm5jݻwѣgƍ;v, зo_x 69>|:zvFBRJR tttвeK<~ڵCqmڸ}6~7DGG#55=zgOѼYsԮ]<@N`bbk׮aѰB"BW7m̟[lI!!! #T Ovvv̻~cVuuuϧL=<<.zhe, |r:<5" źup }cGPɓ'_>"##qU,^ȑ#TD|""rt?(~~~w^wIA$UxwҬٳX9͘1jժE$XQyZ<&JU]F/HcժU#L8]5!!$ g+ʀС+<)EBӸq[nq1xMMM8<==YڴqFv0nݺ5EFF(%$$0 TƔJOO WDM|6 tΆ233qEt^^^ػw/lll6mƍȀ jժ!%%rǍ7вeKx111Udeea޽۷/^|M6A&M3dgg)))򂙙bcc!+Ҙϟ?-Z64h:33rssАd23 O!!$Jr$)99ӼyҒƍǤΫVJٔMFFF$U"ԩSj\x[ !4)Qk 999d``@rK.DDuVFK}t&CYYYGڬcR[nM@P((&&7nLDE9照,200`9<_xZb-,,(::p EDD8r9HUre&WRQ^^ YYYi„ ƄCK 6ӧOUR`߼y30¾~v"S2ʅ-[CL/?ŢRil Ү]{!%%_AŹa_~@vv6s*Wsv߬8Ǖ+W8DFFQFxr9B!r9Μ9;Ǯ][t gϞL&.FP"++ Dٳg0a8Cbb"ԩ///HRB( ڵђ7o-<==ѡC۫|gW(ejG4hceٳիZlb]r˗nnnwaĉ߼7+WF^^ gΜڋ4hb ///^D ޽h߾=^\AKK Z*222 1w\xD0777󡭭 X}wx5Zj<;OGS?+McffL6]Vf9;3Vg2ٛ5kFwaqIӘ֤K]ve8*Ç`Ο4jժEiiilxG&Q@`3ۻw/oݺ5Д)SM<7n`,ӧqU^22~R( 7ndO?;/+ &/--2ec,,,hԨQB2L ,PɃ)((Zh8T""~\x `|;KӪU+۷/d2e64Lx['///ݻJΏ^)/oo/~VaO%{BB3a6H&Mb/J$jݺ5M>"##Yf:R)%&&Rݺu8z!% O照-[СCX{ie8S X'b ^^^jժ jEךUOLLdiGK3}tz<7vtc֭t!dtt/oܸ'eʕ+QxhX?d2?x\T OOO֫ɓ'ڵk>}: 77&&& Dnn.աP(pa^Ž;>K.8{,8c/_DzPYf8q"R)tttdhiiA*bΝ2dTqعs'8:rssdgg S޻T*e F[naϞ=x=zcǎ}1RfM$&&B]]'1qDpX ccc#// lݺO>{3 0{ayJJ PR%̙3P( РAz=8éSЩS'mعs'޾}={ĉP(Dnn.QJdffB `̙*OKKCڵ L^"W1֭Ë/ЧO8pyyy022BLL 9Ô)SpU̚5 !,,$ !Jq8{,8ߥK?000@rr2"##pٳg3bccQn]xxxaUV#==GAAK|hٲ%PFR(߈zrʬr[qвeKBHV HU#00k׆T*E5J9 DDEEQF EVSSo1fffشi^z={ȑ#HKKCjTVUٳaaaW޿::u rssteڴieddP˖-ӓ.\&K|ɉ(//ƆC%fc8>L&B_X6fժU$iǎCDDyyy]Z{lL߾})22~~i333rpp ===!HDo߾U7GѺSȑ#*fq?~$\UGѤIh֬Y@DEB-;Ӟ={T O*R{C tKN8d2舆 ʕ+ԩ!Hp!`„ Dzz:OOOXXX~C1gxRRRh=nSN! ӦML&ÃL<JJtYf֭C@@;|o믿xbܸqBzz:YO<˗c˖-t*ܹs5j.])S@WWڬy󈎎).]͛#,, {VWWk:x |Ϟ=qabhhh2Ъ,C$a000@nn.Ο?Xm۶1mvvvχ$ ^~ƍ#884&Mrss *JEoK2}hСwRxJJJbƓ'OXJ3}߅'CCC:t(#___Vxڶm? "!&aĉŋ?^.xrۻ\~JLLD͚5eowwwdgg>>>PSSñc0}t;v ؽ{7V\UѣЀ ֮]mn؟oݺm۶aǎزe n݊#G@MP|رcG5qF̚5 6ıcǠÇcٲe6k jjj8z(Μ9]"tOڱcՋ>}@x<~ёf̘Q.oXyyyxB!߳gVX_٣P(G~=4n!!!8s V^Oػw/9␒---H$pI'fϞ@6 B555( ?ׯ_“\.6222ƪX}EdI#U\&NHH[[Y#{f͘t&IRbyOf#~z>0"^RJ,#|V͛q5hЀ/*D}Ğ+WƇPn] <4iN|[n7oЧO߿BR077ǀ0aL4 vvv9s&B!```h$%%AWWbϟg۷ogС.]BC&Vb=z4ݻ sss.Cp%x[[[<ֿ޽ 2;wBopp0BǏW^x v xyyK.8s { ]FKƬXcƌݻwxbrĠqx)@yI[NNNsLɋ3ƎӧOJgIzcxo҈#s爨H:2*oHL?s p۷/yyy1Sik Ϟ=c3gSZhԨƒ\.gj[ne-?̳a4h7o)SÇeR)R R)N mxݺuXti=Ti_Of^`Ƚ`PWW>oD0DQk6aĈxqyiӦx9b1/^AǙ3g~z8;;O>oQFHOOgcDRs炈 ۷Enn.Ѻuk| Ž;;4X`WWW56n܈=zw)0eXXX ##@%N8'OH$.444*wmڴϡP(Zj}D;rRIIIr%0|p<|ָpP^="##HKKW^wdTV ш RRRpDv9r[lAݱl2ذFݺu͞={6B!CCCdggիܹ3ݱrʟvvvҥ j֬ H*@x3̞055e<{EbZjHMMŪU0rH8::bѢEPSSCbb"j׮ b\;;;ѣGx=뇽{2) dff8L0ׯ_̙3l"""iiֆD"sгgT,oÆ lhl g&MH"A cQgYPbXeb #r7kΝ;[z;"" O٤KDD޽QF… ڵkDTh"L۷g ܺu눈hnWؘ Ǐ_?-Y)))R)fSŎ/_ݻV/Ys)uٽ{7ϘM ML<o{022*udܳgcթS]ZصkكիWٓbϞ=HLLիW|r3fwݻ3f r+WF||ϙ3nܸxQ { TW tVVV>F+LMMd2V\hɕ+WܹsZl GGGHRhkk#??g?w|/MNNLLLl'>ϛ7D`4iNNNJ* Wb?&L\.ҥK#FL,!''k֬a#x???4nE*U0j(\p/<999ll5j <<鬗8?7n!!!C=VR(T(X|9~8455̞=5B=ׯ__~lRk׳Fx  l28::bԨQYՑ@ԬYIIIXv-᭬XVZhѢ222ܹs) ({EAAQPP///xe~Μ9YM?#F޽;ijj'edd01nnnO&O"@GG$l-qG ڹs'ׯIPӧKL2r9Ջ9::ҟIiiiƔJƘQdd$@ ooo6M1OǧP(d{z.B׷Z|͘Hs%ֱ:j(z-s)((L200`,ÿ(66 rGuѣӿ^&QJJ s{97⁽O .$OOO\R1_s:|pGooo⛙ID/\R߹s=R._]}[la*DD_ѣG|Tĉ/˗)33( 0DQFu.\HDDcƌaҢ\^uVx˗/%5jԈTzCBBX'X{ݝ} )=# -b<{Ix@QrőY8Ο? Y8fddPAA]\\TxxAe˖R9{,C aR/37<`]n{dzy{{C__cf舻wBCCǺuPF 9sX`fΜ>}|2V GGGܼyBk ƍ8z(v؁ ݃P(1o<4h=VX :u;wpMx"444pTZZK~۴iC$HGGb1%''SjtآEXիWP(f͚F*)͐!CҒV\Q͛7JED"խ[Ν;FGP(ؘ233)??)U1`/Qß6mJ$HH__f͚DDtvhU >qG...ԲeK""Zr%={͛Qaa!U\ I$1SN>}'r222,ɡ*UT$kԩhժs'233qqbȐ!HHH@jj*U}}}xF1ei˖-acco2 "BLL W.]@WWC ]]"##011A+4nfBZqF|RRRPNcX>~x*(( TJBvS1֭'OQÆ )22RD"p~Hz5;PPzz:U^MRr I%$$PAaikkL&HjժcxZo߾AǑ&V1?3СCԧO2W(mT֬YCN""&MPDDʴTT/^HVVVdddRaÆŋ]6dzP((44=z֯_rxQSS ={PN(--5y{{v 8qQ*ydd$W\a1c0Z5jQ%/^"|zH$ 0Ǐ3A1ŷ{;v, VZ֨^z78ڵΝ;1`x6m-|}}ѱcG\| g( <}u2cssDŀڃ׬Y@-[\H4o* ׯ_g gϞŪUS 6 6mKٵ͍ʕ"ҥKYDݛnJ$"Ν;R)%&&2͛d+"fŊt"*E c| 1?/_ O+77Ǖ߶B!d2B!r9<={۷رc8ߣSNr ΆUER9-Z/kXn 'O`ժU8s4|||ЦMܾ}2 (((3x"VXǏ#qdkkKOڵk3s&SSFoE{.ҥK(=={iDv۷/3,=11jզ)ST*K,d*((J*B?2ht"{N*|4j(޽JI,6qG4h "*rM6H$MRxZzPlB111h,Pb;\Z`%&&}6*/^H:t.]_>k`*-$H[[yw/ZɆ= H.Sضmw O/˗iDDԬY3z ;_R(_Oiׯ Ozzzϴ:uӘ !55L/4jVVV_T͛@VV<==͛2 /dee۷b?yYYYFjj*lmm9q)I&x899y9rL*''APPjԨ$lڴSll,bJKK#mVuڪ8HMM z@"?z *U*כVccc8;;=X{^bOαc]va[CC/_ PR%"66+WF~~>: k׭ũS-Zݻ̝CPÇ ŋq]/J̬ 44FFFMوߒ%K uݻwχr9nܸF/}0iҤ ~^)S bFF444 ˱w^ 8ϟ?dž p1]vq#7n=zK.Xp!r9H`Ljoҥ8D.CMMtv⥛6mbT>qRNVV3gΔ>Çg0`֬YCiӦիt~H=z`$?WܥK $H(D"2Z֭[/0Zjƚǔi6mڰS{c^zEŋ111%مB!ݾ}bccU/'99`ӧoߞFD"!ի| .۷Vd\DDD999شi+<߿ǖL&BӦMÕ+Wᅢccc#''B {a߼y3:3*JtttDdذaFc~FK<|Z(11r ?.Ѷm2k׮hovpp9sѯ$VJiii*577yaS555޽;YYY1aSoooV8( yaS555;v,rmllӓfϞ]b¦jjj4{lGQPP988@ E۷iժUF+aS~SN1-_LMТE(00޵ի}8#mmmˣ,a©S~AK<Vx "BATPP;88xf͚BRQzzz ǣW^D8u TGcǎ#[fٳjŝ5k޿CSS+WF`` ڵmH4lذ{|n;v$ddhhHɢݻwiDD4uT>qGkצT'===Խ{wܹ3Oʅ'}}}ϧT&OmggR_~86dyƝ,--`rjpssC׮]|_XkpY |onݺ ժUШQ#ԬYoСC@ 4\26mwޡVZWݻ=z@MM ^6 ѱcGz_>?f͚ÑR 5jo u۷ѷo_^AP+"{+&Jgڳg~~~P(HSS$ %$$P80ɦ244dݻw'"7ұc؈/IRbccqDTK᝝RJ?-<ti oe={`޽@.]piB]]2 o޼A @ӧҥK:u*B!eOOѣӧ^zx@hwAAAӗy)5k@~ر(((qu'D"0tP@&L)"ҥKߟ XݻvIDD{tg$R( Kӓ'OHOONbBa-ߟEx)M6+ aر3?iӹsgĤDsȽ)OJDE::u""֭[HXÇ#H$*G^:%''CD_ 1<<Gu!"!&N;vlf{yy6WXӀښ C_ߑ-mܸǏDDAɴX=+ ZbOv+++aE!\NԼys"Ruٳ'} U\rrs(;;9)MF]v%~O2Ԉ8eݻsL H,Sjj*UZUT2;b1kec O6lHTXXH*U"LFaaԬY3-[*/rR oUpttd#~-[{JkRRSҦݻwߦM %L@Ȉ&*ؘ2Ajj*&M5j`֬Yewyq]S###޽{hѢqaܹnnnܹ3Μ9 66111L0}ttoDEEHKKCժEJgϞEΝ]vࡃ#Zl;w ==HLLDPP2SΞ_<-X+++'""JM+T*0accCw&"N:l8VN8ݻ4֧MF'""CCCo$\F~~~,ٺu+9rH*Pbb"YXXSI*bGVgϞ2III9s&ѧO3rwwǨQQFwE>J*~g7o4nb$%%͛7ѩS',]{쁻;f͚@AOOUTaaa#GBMM ӦMÅ p-<|055eKFUЬY3>}=zu됞cǎ! cƌAtt4rrrccc|#\.gïcSi"{bb"sN#2QAA yfEvkkk_(88rssRDDgfƔLLQ 00) (ݺuc*ʼz||<խ[f̘cViʢ~<6of-:t{`` XӧOgkY} | :{hh(SZZ=^z?o<~:5hЀbbbT<Y/͑#GhӦMDDԿxDlСlɓ'4ev^SS/@||>RϞ=HCg/ӽ{w?~pΝ24>|8ƍŋۥ|ۗ[쌡C~6/?{,fΜɄIqݻ7 .\raaah֬?~:Fr9DZaxÁHݰaØ#˘>}: Q~}{ ͩڢk׮pss޽{w^{8}tKUd&@@2I&Yd+Ȕ>gŋ'OOOf tR ""ggg_hѢEѮiӦ$Texx8s;v+<у|||HPPNNJOiONwU)<)D1={tcǎ%+*-_1e v&˗4g>m4wף>x2;HD4sLY&j޵#}}}""rrr*-,,(!! HGGR O]vO>Rx :u(99YEyߟ:twޒ 9r޷o_ <`B-KU_~޿Or%{͚5ؘTҥʗkkɒ%CTZ58h̘1DDpB&co><<͘1 ?~ LMMi_MJr@533#SSS255%GGG%BAo>ٵI\PԃcA9Y`;d2 ֭[OK6lؐTT ())͉8Zrƌ𤯯 O照ӽ1&*" TJ)))_y-iddD)))TPP@ZZZP(($$۷vIԵkWa2^z |6mSv6撮.) e1D"I߿g]LvN _۷1w\f͚hhh@PliѫW/>|)r"4ӦM󡧧HThiiA& Wih`۶mXn8csCnn.%͛BDԫWo߾L&c3gΜa]W\-[cc̙O(Ǖ+WLGnn.W???bFK8p@DGb*UesD˗/M6h߾=LLLa8;;cػw/8rrrtig̘Bd r>nܸ Ԗ0Yt)>|Cbƍ˃1Ñl؉~P(FC( BHRܺu CٳgqI_/^@߾}qHR1-J*Doii NQd"ְaC~rBNjJGDׯ͝;^xA[l!XN%=N6222~Ÿ/~:w\JMM%KKKھ};M8޽{GaaatҥPiCs%{{{5kIRz<.LJV^M4w\z={{{L:R=;vҥKjչsJ s@@ 0vXXZZ"33*޼7! OFnn.RD*[<O* 4l5k3lذE9ssDFF}􁕕ƌ׮]Cdd$ڴi$''033ÇѢE ̟cbΜ@jj*LMM`Ԯ]Æ ĉٳpttݻw!ЬYOc\]]RZZ3*UJBruu%777""V .UJ}RFFqG%r(::\]])""])qdɡ?Rrr2s$LIIf{=>>ݝ] O""-Zɓ'i͚5*) &^|"… YĄRRRhܸq Om۶e' 444H"Pbb"խ[8S3f̠{sL&+M>^lY웗Wn߯tRmeeE2M6$֖VZE2K$RBBUVd2={ƌ}pAbTRHIIa'pڵ ڵk?x0b"== +VǏ1dlܸIIIY& ]]]FǏ "qpvvX,#f|I@jT֯Roq֏fffRDD%%%k_kF`eE'N`" IOO (>>͉Hс/< <\\]HPeeeQVvQQ8zqb:uPRRb#DBjkk&u* J"T\W\A:u /1"ΝCXXzTx4i3fWƓ'OeGjj*jժ u ={F ׮]CLL Znͮ1j׮Ge˖믿;vχQz hii߿"Udӣ޽{Ӝ9sÔ̿}xcŊty""[.D"H%A2e˖DDt)  o$H(55j֬IӧOW^ѨQZxJNNV: e2۷QǏq2Ao٥1_ oZYYѠAX /u^DPRa˗ӥKXosYzlZ~}(55ׯOӧOƍS~~weqP(ãLs{zz:]xԩS+ommMya"""H&k^ʜ~ڴiTZ5JOO_~͞6K,af͚QLL d2v0dyNkז,?>]|YEش,#={JWV`W{$* jѢEt\<==j7lذH()ɳ֭[G/m۶ѥKXA[zܸqLDEyæ=<<elmm=7nLl/|Z5)}z/`uY]PP3g"߶4i?߸q&LA*B__"iiiuw֭2dCzHݳgгgO={XhݻQFaʕKtB( |=,Y94o<`QUǑ#Gb D$f,Jw؁~7o-бcG\vEmX 0^@ŋ1bV^lTV !!!5QFXl ЪU+ܻw)Ub""= sUH$9 Bٳ}W===Ѻukܽ{z{ 8˖-cڒk֬Arr2LMM|6*|/_ .͚5B KPzHNNS`޼y Zj044Dff&lllлwo~6mb) /tccc\p>|`O2 x! k"!!5j@hh(RSSQJdddPŋ ~CcIVy'''ׯ3}3eo$###E{fVSLL M4*WLOoCe<RFFUV yE"b:Ä 㑜B''' 0kÇannߣuh۶-=Ch٢eJP(Dvv6WTZk֬kO+-= !!HHH@ڵPz D"k[/J aÆ¢??? ))ilmm[naݺ05HMM244 5jPPFZZQzuƆk֬s ԯ_lnٙ) ;w+VG0l0YYYYT+WbȑpttĒ%KQCѼHMMvʄMMLL[a1cƐoDT${*q%켰I(Җ-[(33޼yCB^zU vԉB!ݾ}NJiii$ YjI";/ljjjJB޿UB7 @6USS#PH^^^loV/e(XՍ7hΜ9,' ϣl'(<ܜH.dyx?|pz?yJ释J=~D/_fAOǗ쉉ONNN`w{ڿv___8߿zc\BR|}}iڴi%GH.3O>T*%JKK{ndCnnn4n8:r)oӦM#c݁dccCǑw5_ѭ[h֬Y NNNMyyyj*:}4YZZ~u$""9]pUGdo߾e#~cy9/+++eMYݻw XR Qaa!U`#~֭cuڵcF_r $F_R%ɡܼ\z=9Vn{r ӧrյ|qcV`ook׮ACCXr%p1?/Aܹs8~8aooK.AMM vvvhذ!ٳg… سgVX&Mvvv ٳQNݻXp!&M=zʕ+8eddݻ4sLVB||m۶СC#:t˗/C&/^q @ ٳYJ# !HYA޽<ݻϱj*={aaahҤ ?~ Duuu( ܻwZ/3DxF@L+^KMM ^оbccѥKqZh#G0ܹ]vӧB˗/Qn]DGGC(b̙ĉzzzӧҠ\;wbx)֮]'O"88Z-D{1+W ǘ1c*ڵ N/Щc'=zm۶޽nnnիlmmADPSSDR-) 1r1qD(8rssQZ5 l߾/qF=z|ѱcG\|YeD]] ,ݻw1f̘ |RS (**$ҿbccI&?γׯ_pݻ УG :\*Uzo:x?Pvd2[nASS-Bnݾɳ?|Bu!$&&B__yyyx"wl߾ǏѾ}{\rЀT*ūWݮ]0{l\v &M@ @^^(!##Rx:s иqcݱdԔI&1ח{a[ݻwO>הd{hƌٳgDDdhhH* 4p@9|۶mU@~8Q(4h-ӏ:u|$e˖Xt)_fY,rZx1,XcǢcǎ?aÆY[O*4f٘8q"1k,r_B`'Nspwwǁc{}ÇAD hѢV 0c a8Y&>}T^c׮],ٲe >>sθp`P(v%,Z֭e˖LKqƨVn߾],Y;r9zU1ղeKcV8?bܯ_?p?gp4n/^\.P(\.Dž Ю];|¶mۘ+' ɠ#F 22?q5L2!!!uօ;{ B̟ѹsg\|ZVi߲dcJ.]JDDS8q"͙3nܸA17 DBk7:x m۶?H._iɓ'3/<&qG?~ݻLe&b HJJAD,ϝ;@ќ*/T_6mĞ={κ%GUhTV )))Pp ̚5 W^Ŕ)SQQQ]6|}}dff=zwm69r?~zuʪ܆!44jB\\y ĠZjFRRׯf޽ؿ?Ю];09111 QQQc_eoٲǏz422^~yyy8p=WRyyy#kU9s  CCCDEE!>>U!33׮]CNၝ;w6lPdeeA[[yyypssC @AJJ `bbT9rׯ `?ۤH.SRRծ]8O2Zr̙400`|~;v YZZR_466Q*9}mF%D"aMq۶mǏViG'O<ڶmׯN=pڶmѶmH&}wo+++f{)H*RJJ 3}{S>dH$#ee]v1]2!&G$)>>ܽ{&Mb<eeeQ~~>y˗/رcݻwLQ$`hҥFo޾!4hwx}ڷo뽙?>k/-)y;vбcLj8ڲeKk=: |}}nIh=ѱcH$Ǭ(k=x`fj, I,:99DxN:>>*_d֩HӦO"SJJ I$~}Ĉt!8[nm"*'MDo߽eV666zj6lXoQFFs~~>988|{Ϟ=8kRdd$J:uqj*@g&\ZR Bv322o߾q~Z4Exmm"ٹܿe眜X={6ݼy̆E"c`` oߞ,--СC,Pݛ>}DǑ:iɇ2V$*EMLLT4毿"LFϧEǏ֖6l|K,\ic4|V4fѢEC-Eт /YВ%Kݻh"EqpB(1###hΝw^Zhyxx0E}A{`wrr";;;Zp!k׮%L]5f+++Zr%׏I/B6ϟ?gApܹѮQF$H&1`&qanݺ) 潚E,)͔)SÇqխ[*4*%gΜkײEr9_QʕY቏c*,,$mmmdԫW/jٲ%:tM<'L ؈riʔ)&fV[n{gggRܨɄiiizGaҤIt,\077ǻw@h̘1[#vڅ8;;cǎw#F*UBhh(0sLܼy+l___T^{ B=zڵkXv-"##[n=+"%KPfy\#B &Uv-FK~ܹ,ZOlil]vWKJJuqtm3>ϊvK]]gUP[[[l޼^B߾}w^C]] *&LׯcܹPWWGzz:T 8kХKv킍 ѡC\xDAa7'\jjjʪhoiR(_>ѱcGxzzѣظq#^|c׮]PSScVjBBB0Ϛ5 jjj̄:wthiiA&ٳٳ'޾}ݻwc߾}BΝqYr^B @Ϸ [ֽ{X_PSSիh߾=qI[NNN}ѳgOe`r...]6  1}t\rTe߼yf̘QM6e3gΐO.x*3]3g0ZrȐ!𤡡AyyE&b|{<%կ_bccUxر#lݺ OjjjTXXHLÇL.z,#-[[//S{) nee rb+h7p@ HOOUJNNN4n8FK71~Ç“Sff&>=zDӦM{Y͝;^~M] ĄƍG z:حEE2444H*H$bzΟS)|;v쀋 :u###ժUH$B\\i-uFvTJXj?NN?+Md/,,$QG4ܹs+!! HOO %C 6$"u 66իW'ٳgL>oZF &ORBCCY߿?S-h߾=GiiiTVҥ1/^T*%@P,nnnԮ];%f͚Jׯ_S͚5ӓUFݻw/V oyh?wI[}7ִ|r|2Ih!TJQQQ ֖6nHDEZ|ϋ~;2w*;;;3Ϛ5?>>r9{ 6lлwoJׯ/WQիWk㇐Kizݻw_~W2}9C׮]zj >?Ν; 3LwAƍ1sL4nx6nOOrTj CKK }1n8:u ϟ?Ǎ7 ЧOdziqYoK,lقW^aҥ)y'O  UT`r}KEg[pqqAU~Y꽿vVqqqaJ۷1vXgϐx?Qp[CǏzj9s>}B6mpm( hhh@"猖x"c 4۶mC~~>V \,hhh@&877o_MӧP( vvv5ѣشiѻwQаLVi ICDtEz=PFFw}<B߿'wEZZZDT4y6gff@ ;v!lWkϹ\jpVzU74]v#F[[[Dk۷k>z( O!!!PT066F7/l۶OVP9"`_W~]\ (mWQ!-- HNN,c &`ʕl5sL!99ŋ$Ix ϟ?{ʌQBBBgd 88={K.h߾=:-J,$&&$}UTADd`aaZ-[z.__v???xzzfnBG~'N !!VTrww;4 T*Zn4gQT)t:͛lZJ“JB`` v؁%K:HIIALl ʕ+#|ʕ.]1مF񓼨7HA-Z#==(]4^4gfB  EFFLLLh`ܾ};,Y;;;tϟ?􊌌 t-ĉqi@%D/>zc|_<55<<M&L }}}%K'Đ)T*:tP6£EW.###ڴij722D' JMM%KP߾}ҥK4sL$/۷oF!@ǎcߞ={h…t-o忒N#}}} P3K3n8""rћ7o(55 {Q4}9h @,,,(44cАZ--\C/_&{{{h4M 63N:E 4j֬IsΥׯS޽iҥ$I||ܜRSSIOO?aj@Z-*P3qDSRRTRAiiiO$ŋY`kP&MԩS$IF+WPΝi޽tA3g]rzI i4PEP4'O&NGTNq O `tӦM͛7b TP%Pnj(|w9s&̠333L8ӦMCxx8&Lua}6LMM5(5%%ӧO7MSNaIGXr;wr"ؤISSScÆ غu+M,Ygnck})l<`ܻw$\r+j GZ,X]vQZPҥ 8psxzƎwuʔ)׭[h5z\|91sLzLHHPAzܹsJ,;v 556l@LLLf]d=(_<wBӡ\rAZZLMM!I>}|… Yx[.2fff:t(BBBާK*xΝ;4h(E_|BCCƈ8KKKZz5M6nݼEDDo޼N:hjjJDDVVŋchʔ)wɒ%u5ϡ'fʐbŊDDdffFL#F+Wgj֬IDDŊ`ڴi%''ӹs(""⃏\*U"̤` ۷ok׮::f̘ 2eʐEFFRɒ%)&&/_Nݻw7o^www^:=|TR~zըQ|}}iϞ=xb}6u֍V^MTT)rPT)""AٳgiԩG^^^櫌No۷HHHO8ʘoBV۷ܚο2FV߾}\ήi䄰0}FbgAwxxxo߾Ell,g}`ZyyСC>}:XXX %%qqqwx$ sssԭع}{733Cjj*bbbP|yHLS;F<֪UөVZ2gvoVNOOŋS?˽_|Vs5KI$IOOʕ+*O+WLOO'[[\_‚,,,GDTzu 33\_5]|իG^T>}:;vGDDQQQdffFk*Uos̙3А<<<|ԬY3 3O&MГ'Ohxb|2uܙ6oL111dffFiiiX"PZZ}taNˑ% u600(`SccB[bŊڽܜt:]z7oNnnntQ7oݺu DӧO'dhhHKʕc7ӠAڵk4sLR %%%JbŊN'ORv8iʕ3ѣ-_>T*rrrjժQDD̙3<ůz,u ZQOO$Ik׮q΢>M<ۈER EGGSHHRFF/ϙ3t:u֍wNW^e1 8q7nLNNN_ƍԫW/Zl'һw8@__i]v?;Zg/ &CCC0a9s[@^ݻ7]rϟOnnn;/,ORرcRҒbcc1$I4Bi J*ћ7o(##+FjiɦMRpp0ڵ^~M7ΓJ"sssJNNGQʕ)(($IR8VXAqqqTlYdM=߷@ƍ 6j5hN Oĝ;wXiq4:IgϞq̢EXi]6 O@HH*W)<{/>>gZhݺukZbEDDPɒ%)((Ʀhg/ ֿ LSo VwPT)5 Ϟ=CnXxڿfDJl355ZF@@v܉ r/ͳgcTTe̘1:t,Y;viVQ<ȑ#9^ cg7{l>>)|ݹ_K__`$ K.ӧsM/_l` ҥKH_剝CkttRI @:uݒ~-߿044Djj*Ǎ]Ϟ=CϞ=f 5j ہ &{vs 70 `֭AD~*Eo͹+۷oϿ>}4賦 sa=?T gMs˗cӦM,tD'Ob„ onn}*<{nw^~(^|Ⱦ};wxijKTG8,^bXOĉ۶n:|СCO&O{bb"ͽyy}*طm?5ko߾EvWƆ dpuu>1""e˖9scǎ 4K[[[@Rٳ4i///Ň*005jPՊ|rSdIt:DFF!8~|FF+M2yCo /|dffFÆ ;w3=|jԨnذ!EEE3=~ƌÝrmܸf͚EeʔZjQ߾}IQrv=^rbbb|-իWCm۶EQll,m߾hHdeeE666@uԡ~ZnMtڱcݽ{TRdddD^^TLj޼9YuFV"///:pS۶m)::bccxTlYu5j|SN<@؟f7no.\#F03f&9r$ OHLLDJJ бcl<|Æ NSM6UYX[[s /_ZDt)RPs?Çg/^HOO7o0/0ѴiSf&&ĉ2x`+d$''s̙ÞڵkgR v]k30|p#p@rFT7ox_jwKjՊ+"VdP*Ud^΃x∋Czzo(7n.Fg_~?j(^PJ*|'''_n~7@۶m9@__޽;lmmΝci|h-S ϟsjŋo֬}3^iӦWG$I9$ZMjiΝW_ioѣGUVth4dnnN}%J &NHN!C( _&Jn+WR׮]Ν;l2ھ};|6mJN*2oV߼Ϝ9˗/cȑѣG$ UVEDDajj V WWW4o@G|?:%%4i$>޺uhE򘣣#,YSz_07?{x"vCBBTzA!::~~~޹===!))ŤXZu<.^Ȁ駟xfirx*ušh \xjذ!?)** ˗?~P ...9 OG.]h`ff qcױcDz,--y䍭-Z-SV5ך]$cѸqё^zEDDdeeU:099J(A={iqF$KK;,,ҵk诿{>8;/'-YZjE˗H244^z"Lϟ?&MZ&jڴ)bdrr29;;SF(114 PhEDKKKJOOgϞq&58@G&JHH sss `?~L+J5j ???ΑAݣ:uꐇM2N>MC !=== MKhZv-[͛( +++ݻw4a}6]xn߾M*UZiӦ^cǎG_ޓ'O ҅ ֭[dbbBQQQJo߾>}޻vKʕ+dkkKbr:x խ[p>|zMoߦу͛GZ*/ %J۷ɉiѢEl2ܹ>'VK?jժQ@@uԨQOdaaA!!!!I;vΝ;ӽ{_m۶QN￧ǏtNG7odѤI*@/NIIIfߊERyvѠFH^UWr/Mtt4T*so޼ANd6&7ȩS2d榦H!>>_*K{҆ hݺu#jٲ%>>^h„ tI|%eddQEW%Bʖ-K+VR6mhΝCK`4 MUV/^PRRYYYQbbR˗~zё4iB'Nx*e[BCCϏt:M4ODH+V$gggJLLT0WE`/|M4lBW'OP֭i箝E666FT|y %4b:t3HL2Adk[C ,-ZЋ/hݺuyfz 5jԈΜ9Cќ<} *U [jx[ю)ҧ ac7nĚ5kd5}:@DDTIpen=z4 OSr/έYb7hЀ=PT 7Ǐ!C͛2NJjɵdxB+! 9~=ༀ]IϺg R-6l1vHKK._ Irƞ1c߿lٲDZZVћ7oƪU^>FGGB $ W\A&M9wwK!99 nnnh֬`͚5 ǓYXXɤjժKt9;;QDDܹC_~%6СC?;w ){вe>...m6255+WP2eHOO/|###z}O+T*:s ͘1=J/+W~&I 0&&>̎E` iTJVϨG)))dddDB+VP""iЀ"""L2LQQQdiiItyn޼VZEڵiӦі-[{#UVV#KKK P$:piӆf_p![So… ssŽ.\[b⟧5{FF/^x"rsyf$%%a…x5(h#?Xp!0|h4\=c D[>޽{G*TP7oBi542*W}xr 5nܘh˖-- ͔@@NNNTjU  "CqH__"""B_:ʗ/OW\F3۷իԻwoZp!++Wnré\rԨQ#%333RTtiVAر#F RTsVZcǎ%*jhhH Ӝ9sʕ+Էo_?>t:2004oh-2ebiLL IDm۶ѯJ<]oF:IV˗/|Nzzz4tP:~8?OCQ͚5חNJDy̑KD/^ƮÇӌ3ҥKԿ;w.t:266X R ~j{ԹsguGCQӦM״sNZd ݹszAV"ICF%JxgE`Oi4zhUcqi4 On߾%!M:.\@yJ"kkk x FDԿp͚=ˋ6lH.\P|N:焿ϟO7n`t:211ŇJ>ߢRgRSS9%^6}t:tgo޼9```Jp6m?~Dzޘd“/\߰aCh{UO/_ԙsIDAT$Ib^.<J? ___T* <FbbdwtDDDiZ.< PlY ==EW^=nݺ Z T*J“VEɒ%𦦦'"##|ސ$OOlv6//\ vxzz"==9FU($hǫ]6R`ee4bŊ`Μ9 RJvkkkHr@9sXiVcܹ˖-cӫWQ{(YdB$Pҥ۷ti> )Sk%KPBBBiֵkצK~;wLK.`+Rllgg VUլYVXAڵk7|}ر[###ݻwuڕ)::J.M%Jϟ_|A#Gzꑽ=]r֭[G?HR 鑟-[ڴiCԻwoZ~=ҡCϏZhA b*Wݾ}իGǏRJfΜIo߾hP$|bkݺ5߿"ƛO'Nlzzz3f'zNS4pQOٓQD |H+V200S&_~dooOTdIȠΝc~rwwƍٳgc.\ڵk'7]~z. UXݳtisիWhڵW\I^^^dccC)99\VА4Z ԱcGzO{95oޜ?Nj(11^zEe˖ӧO4կ_\]]?Fwt;w.۷QFtEh4dllLiit-QJ뿦SHDD-ZqkGDDf͚j iۆLMLO VK񔜜Lf攒B,%5lؐ.^H)))dccCQQQDʕpj4k,x"ۗ(44*T@nnnB .={ҵkh޼yo>6ܾ}RSSɺ5ӽ{{Ud| PWہ,/Ԁ###PdCf|_PP"!kΜ9(SbVׯ9I_ş,{)=Sx#8Yfի5!!E!NGqܹ,c}ŃQ{)))$Ix17͛7OQD=Dutt4N>c*HHH@RRJ(V˱}vv|H͛70nݺ͛7vTjU:{JZuӦMԾ}{jҤ AϞ=:DZLLL(99^~MKa SLQ(T|yVsQ{;GFF"##Ɛ$ ^6˗3_2en+޽{3햟ke@Zl 777hZ/^[~E|6㏸|2$IB*U*xVZ?Cj4#-- QQQ(U?9Eد_?ܻw:˗Gtt4Go+ʘϕ.PP+W +++hZz[x/_HR9NBredd]vX"ڵk71֮]4 8.]_|y(ֵm۶hݺ5`ʕؼE)<522“ȖCRRRz@pdT֚5kr$kFOZoz6mʀodd$*W 8sW\QkRRlll0b}Y~l“J9իF"߿x|66,Wۿ/611a jѢEسgPBk2#Lk֬ ;N!j5BCCQF HmJ 2V,Y;wT^jAAA[n>|]`۶mزe ܒr{hh(5jħ vȷ$Zݺu6tP拋+$&%‚kx5||ڵY PBo7k .\Y/Ʋ5k33IgfP㏊$)) $IׯyCӽBMu:$ 7اMgI0{lO)`+D0I`ll#ƣD3tPܾ}`ff2K.\ˆ (ԭ[7eLJJ ޽{SNaժU{˖-?s j5Ke|nYn֭[hӦ Ӓ# e*… 6yx iii000&<-YKƍ+ GڵGeWvrm)`Ƹq 6l>=55DѣG3SdIDGG+y/86o<@qqq,k{dd$KănݚsfϞͯՕ7cǎ IR)˗/cȑxҥK#** jZ/_[lZ!!!R ĉ4`5HCF ?[n֣|g777$_!/_f~z6Dƈ^NKl޽$IׇZ7c0$ȯO ʜ%ƫ/Y/^Çqر\Z)$ݻwhҤ INNN8%^%q=*UBXX~Z٨VZݝUR)ӧOc„ +cc3g 00_?Vb3J*g< )SV\|qf V cccy&C vQbɯ0>>>hѢ[4j6mb fM1cg֭[m۶ t:,,,777\t7Çu֐$ UVEXXI[%W^8'xzz򺦥g𶶶N<V ]Hr?FJ*!** iii055>q[r% 44]Y);5kLAػw/ԩtTR%5j SSSh4xyyqܖ-[“+IIIHHHv36lK.A$T\HOOuurrBV`,vFLJ رc`y{LL 799s rLjT YBx5"""[ؒhصZ-/qqq?'?~ I8ck]Bv#YYYAVˋw7Լys|őX^WaĈtR準}ŋVU~ʕ\׭[7GIzs`'"|]fUI>̱b&[$Prn:o̠8;;+544ժUѣ<\x@DSޛ7o\x1vؑMQv@ju PZtQ믿hܸqJϘ1C #v *0"(Csٰaa۷2D4v]t #Gd D r_~aAf<|v@"h|™#ޘ2e 22RzDAw{1Ǐχ5j ((H͛7cL 7|իW1bdf5~+W*xxW7O?/1۷ZaWrIRrl Y[Zƈ;w0;qDԩ@]$ }?T*x݅8$Zi vqw)SIti-_Z5DDD ==Pfoݺ{i+`Ĉ(QHG^juuvvf˅|=99׮]!$$0i$7͚5ְ;99!44TqƍLC_ *Uرc066{k׮ؽ{GD+ B'd9Q!kBVnĠA`gg *6@Dطo `_nϟoQQQ Ç1~x|t̙3F*S $I­[2UlY/^>)11FC>LÇ'===&sssViN\]]IPHH]~֭KiiiF*L[l;?5nܘH\;rqqʕ+SPP4yd200p*Y$yyyQXX8}45mڔ^~Mׯד#ժU<<<(>>'|WNDD4zh:p5)**,--),,TRCvmǏ__>ٳFIǏN:۷oѣ4tPzAyyZjEǏf͚iȑzDD;v절Ǐ%RDD=~zAjӦ =y֮]K7nׯ_S-hoصRիWTR%N0aPll,ؐEFF9ѣGuS|={(ѣGTf̍D=GILfffITxqJJJ۷_~y`c\\\X[v-4rD%,&'dffgϞkyϟ(VMWwfر8wt҈P˅sݶm[. ,, *g@.^ÇgHKK!cuBqvv.{xP-tnٲ Bzzze%Jiʔ)T|yڲe Nf۰aCק͛7ivZݻ7-[Pёbcci޼y4|*QM6l6[l!ooo~:M:vI:tzwhԦM$###ڼy3ʕ+iɒ%3wЁ}_hԪU+8p mڴ_Piʕ4c *]4mٲ id?Ǟn&Mׇ_֬YCjբ1cƍ @w-s;7+mڴN:N$OEքW:.666UO>yqNƍQ_4{\Ϟ=y733;w='MćZj!00`Ka۶mXlK.,<"-- qqk׮4rH+U4ERĩ:ɍ ڵc)'X>8NlٲJRD‰ pG_~ ___t:_fӦMca{x9$I q])SphfyUn](ˋ?T۷o7:tt:͹TW^fԨQp𡡡= J1ʝ9BxFiTbXU5O)!K$<}uF#00j@pp0T{tϟ?NcPt@ iРASkUBBBڱcG?y# O"$Y"ZreDFE"-- ?C!<) Y¨e>vyzpք,It:,X%M O={FѥK| $IR~)lR "#߯?hٲeBxrvv&艃ŋ?.\ A-&&yhrSRRRX f#rJ:w|t ݺuØ1c8C`Ϛc~]EBJVϛ7{+UPR0sL߹s'ϤHIIALlK$ܹs=LatO޼lذO-[ Z"RJ$ .\P4Bx{ZZVTTR0a9sҨ iNȒ3C YOk&"Nk50޽{2M&鈋S^̙*VP!1ckFFFQBl4i!C ZL_֖-[ٙUR!,,d/^QFKݻwcȑ۷/ۻ>Vƌ; :==FFFO":<'dz*c5ȑ#\ "kkkkn 8|q** e˖x| 222aݝߟߺukuzK# -G׮}9r$C`}c~I2eqqqa~7m۶ߵ~ O~ @=ʓ* āIFFFHIIARRLLL 3gādf!I^^^\ٳ|7 x}}}wTDL]q)W|lWWW|x޵kWFS^~}ԩS'۔OMś,ޔ](r¤IEB?+m۶bHMMEpp03W^Owvf,DS0i$;wx8Y`4"I7bq?E<;|3t:}߻r] 8Ç3*%wkYx$ڵkxЁ_X1~5kǏ?+>gx!7*,aTȚ⒧2ݻw+e?voooEBY:ujAZZGG?{L1Q@0 ˅nݺ1“XWx;;;L6_fMjN:9 ONNNjaǓvoolm(ŋ _g'%%1'- 99s>%vxh-Zp)KԣY<1"0(#Gxa2Nóg?zhU]x 槧\x^L܈!wabڴiLVX'>>>|NؼyBxzB\\ʖ-?4(G`۷/ay|ܙ3i$J,){ Ix]cbbP|y$ZlIrZRx# 7s7nd[x<&Y`wD6m?,`Cxx8h}N2As@ Qbg̺Ï?'ç圐%Rܺu+7Oe[.yA2 dkkˀٳYx<8hZNsNس'`*g({޽رc2<3F.gKAxv 3!K܊d9Gq~I~-^;JIIAb`oogϞq:g.iD#ݻ߫޽{3ŇO>Ӓ&LRr Q$3kxƬZ?9o޼U@طoαYgVF"`_zuv\{E#7*#99ɜr=Y&Y -*ОOInݚS ēJ:9sc};yF?{ws_~Cs28pyx9MMM1` ɓ'sdZx:cV`i-٭[7z1KRhT(^x6DnT4uA@@"!3קʧ],iݺ5fu?{,Ӵ b\r¬YI3/E6m ooot:Cp?<٠&ھ!!A0*LyoTȚ槀‚Dڵkiذ! OJ&Ǐ8h n߾;뷰N"+VZ i ei߾}<_} I$Iw իWGXXJR?ˋ NZnTܹ3rB$de(i Y]dM;UZ^=*'Qn4Ɯ9s`ccD$$$dɒ x!<ɧ}9$ڜ$6թSO>ͶKY|yRe^47o.{^*;(hIԾBx^nTALLLP3_e2@^E9rDx1X43Xfy94rǓ`` SdҒ `ggݻɓ'웞LI{wSNUOb94 К/8{,^ www 8v™3gX*>|'N_իWMW^eJAyfڵ իWcǎ!==W^EvN6*ȝ9B˗/Q >37oFƍ9\z5GJv1"99rۡCI=4h///>PNF!>%J$Ix9Z̙UVUq\nyx176:: ^=###NhٲeE%JvځpuL8e˖Epp'J*VV\;v|46/`'";vu֏6`k"%W{͙s8,|Rhؿ 0\< Yl2TѤI$n 1i$crh}9̞= Jk&M ٳ'ɮ>}z@%\  ȌbREnḛa`ggV-[0tP#Gpzpҥx߼yOb`⯾yxG:u)3oaa-3ٳg r /u;;;߿fF^1r^$&|RH\5r%Iׇ:[/GnU*U6$ 7gϞ xyBQ߿sR-_-&~ Fℬʕ+gKz-/]ڴiÀ;jdd$43fј1Ѭ%P=MYyx/,u Ç׻woE6}iI9_n]6d$"rqڵBܰa͞=Pg;vgF~}ѵkHQ߾}ի@k׮;w۩VZԭ[7ի?wtUJOO!C˗ڵkBcǎ%;;;ڷo_ݻwK.w۩mIճ+Wׯŋ/ҥKiԤIٳ']v$I>}իW)::f̘A:u"P~ȑ#daaAze~FC +WÇ4g9s&M0j׮8q"iZڳgܹUF=z^zѹsXb4x`|2ݸqi„ 4vXZd U\N>}q^|_>rBVInTS$dݹs,t6FI~'?>[B1t:\\\s~I&FߘLO:襹uOBzz:p|KTyZ Cz{Gx t:J.LIѯ_?FqѠ&"1`=5jȑ/^ԵkW|N Yw:~ҥlDBpFWWW*{f̘Zj[t Y¨ /I'drB/,s` "&sMrxA\dnnɓ'#""HrZRB VU~ѢE믿Xx СCaaaQ{yL!---y]˖- Ng̘TX.!9@Nv/7*dMvEB,NZYxVU _yRkZ`=ʽ4۷h *VnݺARXbrуFFF@tt4o$rO:'N({^.OR ' C'F9/r>** GAXXX.]R_zYp]lqٳ000{P//'CCCb OUTA@@"yLJyKxn-Bx*{3 $jb\wӬT%Woܸ4"C>"]>O~úu`oomՕ ͢f?sIsv桵\rTd9k&MpNfYF{=ʁ{f[[[>yUR%މ䎧OIOOZ߾}k׮qIcggsA$ԨQ%₇_~=g5~WxGV"66ּËfy&}A/йsg) M4Z-+ qivFc "B70gTRQ87W^٤ 'OJ*8wl Yb';srJ ek. foӦ"!+11QueϞ= IPjU6(WWW<?~|“Ӏ=!< 2/ĺt:x[~-[hA“9 O| ?~ N\}}}q) "BRRG 3gQJ}D.LZh O2*DO`#rZ-RRRp @Vxț2eKvx dSF4 мyscݺu<&'QY9Ijhݺ53AK,R1'),,7}7ѣGt IOgjjMF̦M$! Μ%dڵ .Sw!!1/rHa"!rʐ$ ^O"uWxruuC.<5hЀwxN,;ĺ iȑ\|HxR2`ffJ`&/EI#<{jj*z2E;wRX.b###)hϞ?ѨPJ̄, v,.)r?r6lQ!mڴ۷o Y$IQO>993fPOQF&n䱠 >x###J(%HΝ}gn$"IZ~~~LK߳gOÝw)))߿?'"+Yyxǂ}ر" 6nd] ™#n09/cׯlI Tƈio9ѐ]l޼,+b_aÆ1/So޼zʕr.U;~rO>HMKe1 @eS~84`na]L7;z#L NyjHHHOzhO?Çt@=wG}ϙ1M6{CZ[hܾ}gΜA!I]vqZG3/7n`؏ò45j% ?EIm۶Ԃp+}n޼ѣGB Pкl2lݶ<==Lбc>g k=Bǎ9(`-q O<)=zGG< 52L}TbEDFE*AK,aLLLBE砯/ YHNNVf5Μ9Ϭ q-Xx6rC6m I*U*I^|e//GrSQ#XD%yB>)))055ewvd x"yLnkl֬*<%$$p˗/'A֬Y ###9Qf@!j y`|D83'TP!ۈtwwwߴiOԩbRVU@]*QpJ&୭U;VX%M͙jӧ>'ȋ/7o9@y\ :"2wxKKl Yrϟ?vyzh${묓*dƌ—0?TNNNlDhӦ GvQ6ȹs8Rx∍U˕Ea y˗R/pSԩSQ\9:c`_f5<<<ХK9Q `9r$=hDFFm۶$1r* *T3_,79kB\ ?r$I T~e̴i[^=)vTooon jYbŊ) u^ |Guqqᧈo߾=^|zY/^d|\×-[6ŋ|6W @8q".\6ͭe5/zzz8q"޼y66%"L8ܹ3;?32Fft066fDvriH5jNԥK\˘~y066ĉ1dE80~ ѯS~}Cr,ẁԩ^~ NKKKq 1cY&{H`i6nmڴt:LLL0x`qϽ\xqu$^4o^^^{XX>}e˖ЫW/\t K~m\r;w#bbbϟ?羋}믿`ll GGG\pO<ȑ#>uֱ *Xy%OVrgNք,GGǏ2WYjʔ)GGGyO6Q?xfΜF:uRX|ڵ+$gΜk׸`ر8}4 Ob1Z-9}A>W S@Xi5 xO-իW\6ߨQ=/5uxcF%dED+,|N Yr%0j Y(U"<<鰴J?"' Om۶e(Q?3 UVƔO“Bxj%<<<0|pbbb8ԩS7>;DN}fl:f̘B ,ɓ'ԦM~_NG@UT*Uеk/%Kٳgo߾M~~~ԥKz1)Sj֬Iwޥ/*UDO]NǏS۶mֶPˋW^+255 ЃZjTrex"nݚLMMիԿ8jӦ 988PʕjժtM_>-[N:E{DrssݻښԩCߧիSʕԾ}{200;wP~ӓөEu~:uڕΜ9C}]Ǐt_н{FTre:s u҅t:=zC4iBTjUuVQin;(7*gV!'dرc +8+V'q*]?m41o*'!x9s*J!\m6[B|Ds>K$ؖv%wU=|wx:u(&UP@hL{{{tޝ/Z$Cu-C%פI] '''^WZ>^xCe c͋/ɚ9P$rI8s[t:ܹ3Lq Y>̑oР%|ݻ5YO$4"<8.oE1z>6}?KWCpaߢ2&` ,N+, cΞ=tf^.VA?y-czGqB/`uppigL1eDА#)S(W3Y[[s"$jqԩS$ _|M61[j"D% C1zh:u y; ʚ%IлwlUBCC>E NǮ]}x5Zm攑̖_@pfffh4h߾=MY'wwwh4r :KF"z~%ns.{ʕ1!KH֭cWnT)!ĉLB~ʘ@T^K]ɇlmms(i*U`.“%%3ڵk\Ҍ7OuAjj*/Çݻwsszh$FOV^KF|||1Õu&_ř#UVqKÆ ?u ٻwo yB|43g'Cٲe4XXX@Vc̙< v˖-LK 1FӒcǎ^ T;o$k֬Du +' `t`dd1?`tرc7p==v&0`0p@<~i?v9_lnn1"}B_9st:] YdL,O<}5\x*S """bŊa֬Yf0fšU'?ڋ÷~Annn,Z4iMy{K$e v׆ @D -0EH?)>0}t?Ns+c~',1"=h0*|y.cSӧO0/`Ф xV+.gi&O'N0 Z͝޽Ӗ-[SN > ZRl$ٳ'@ OVC}-g 588gΜC?[n|g߱cR2e˖ vFû٣HغxbrcJ>|Ko߾e^ߘ $yYl=67qf|RE~نy)Spұ04Ϟ=_ '[0zhpkź:99n:&ڶm 'g'^Wa#X"ӽr@`7拫qLM}J..ޘ7o|6ϝ;jZ1`rѣ $r3?z7۵kF===T<좎g|YG=ziDGEdzH#7~ݽ{w;w0ogg rVnذi:$>T /_O?T2fٲev2aÆv'()rD%7l;|#߰aC*L~~~ܻ"h׵kW|dȔƍ6"_G`9A.|K<]̙}bŊAV# kfoaO*< 7j'Od)$$jFFFj`~ܑW_ Z ?>` Uwwcvvq*W̡D9D嗙F1ن>!+M%ԫW/K.m*WO`Eݺu1~x?r{N YY/O“Hx&^zu@'d &+-)aI4م)ǻ-[S-5𔒒ij;>ɅMrISX1TZ'OɓM\`Omdfԩ,+Waaaltb0~ׇF9RJ=z*<"55|6AL$!@`sA͚5ѨQZ'U"  'Fg+ I#F(Tϟ?^6ח3c*H1cYȃnضm]veZRn7odˇ,Y2ٙ'ϠUV }ӦMغu+n݊ׯcѢE ZgH&dݼySx|(!K.v#L,:2y@@SIggnooG4}tb]6*OOOAL=z􀣣#/W^}6;EISblm:t`Q5m޼9s_W>"]Їr^z6DL(2F˃ YbG eQA߯_?.iD͜!{R=z O;Q$=~8k7e_5|ΝjkkVjy" F/3Ϝ9)Æ cLQH͛7,_Pل4̜9Gg O3~'~NܹsYx\r“w܉%K3S -)%ɤtҐ$ 7o˗wsyP vE` HJJNBbb"lllYt)GcyxSSSL:U1~ CH<ǏJH-{P3yx<&;ĉqlTC*Zjرcȑ#4l0ӣ$211%KR\\mٲ:uDߧEў={ˋj׮Mׯ_͛7AJYfŋDDBJTlY%KP^ի4k,200X"կ_ܜ{_V־i4((b "(i{nE;;" 츿?xg<{\5<;hΝZǕ\B4vX:~8y{{ӴiӨ\B3""ԩm޼zEJ/oCd/,,ի0{Y&.]ӑ=33u7'Ut҅窫AxEndĈ 9g$ˑ7%%KS^w9s[XX0+kB5bj֬Wȑ#GGEE}]3{1ًX=b\J7e ˗1D6Jbߵk׿֜IR;w2 ^WW#o<=lӇɗp%ѯ_?@قWUUE^^ٳg+VFDD|VFMJJb|-ZNXncǎE4i RSScd/]zL<{-Bnmm?m:b_t)#q]-v/gt޽l|sn\s {KS~}f!Lyf֮];Vsܕ7ٳgy}x$×әkAy?[MǏ#00/vTX1-Ga׮]ϡ-[8q @vsKy {iuvvf}x'''}tZ2,b#sq5֭_ʿ_fffLdTk׮1n2fʔ)겜V!Z*r9v>F."cccy'_F go[;wD޽Cر?ef{pÆ yY2 YYYe|>$$x5js:]6C^B|>$$%FTHt1q6܋qCCCo> qqql]r17hЀWȖ[гgOsݻwl᝝/j*&]"HsA إR)$/9,?e<7oB&ACC9prOaaa-imm̈́ΜYy>|y'z걍'&4[ne-=zo޼m-9s0ۺu˺4x266رe k׮سgy\ق/xJua 4;D&9lSH&YISjU<LbE|4 c-xw[SdXX۹eHhبŸޞ-YvkKFDD]ve rFu(yS~:ZXZ0T>Q_-v\ӧ߿?N< ̟?*G0T۷XhN:g_VZZ?M6ɓ'QTT5k`Ν0ato8qj׮~Çq5lܸ9d={wn'''>rǏ`uN[\ Rdee\IӱcGҪnaats exgc/=_>|~`b.cr cOjjjE^^K+G.߇wppÇYWx4]]]y}n<03մ4Ɩ8p [YY1G3y[ؿ?RRRX=ֿ|/G2>26vZTll=+$@"..yU~b2e YptݻwGƦ;vPU,4;dq3f0%U5"}׮]66s~ef4ffL 6@}xm<8fZz Ef/9۷oaܹ>իW|>"=66AW\_\rQ &N9s簧۷y7ϙk-[C ᵵ1ߐ!Cε#5SI-vTY1(b(b(b(RFQ+b(bc-u%"݌3f@> 2!e˖ѐ!CH*ʢ-[;v PHTTTD(;'I[[>8qb1uЁrrrR^H$і-[K.Q֭WNNV\RRB{ݻwiq[Μ9Ahk׮yzzRzz: \N DD4sL6ԠArrr7o'''СCI&z9;wݾ}; B5ԹsgѡGǏ'---ر#ÑB!%%%ںu+{E277'???"$Ji$())ͽuծ]4h@<`?={6M<,==Ft5)kH Pll,I$@^211ӧOy9,1̙3ADHHH`6TDquzjBűݘ7oޠUV044Ev 555?~!88***lkOCx #9]5rrrێ%%%wweri[ ~7(47n܀#6lv|"ԩS֤qưc\-0h (iٲ%㪫"<<yyy k:w ?'N;v۷w,.^jժYf$1fcArknݺSo7y "7"={oooX[[DׯP(D~PTTywM"KN;w.B!&M8Ϟ=CƍaeeҚr9RRR@REf/˱{n"<< BХKD"E]t o/_dlC O#Q+]?n#''2 Ç@ @RR[nue/1{lL<5R crYʈcX{h::: 9Add$ÚBC$1uxx8?ssst^bXӯ_?1ҥKQ4i'O(/?g|}VZ&ˑP1cưՋ/ФI2\.ǦM~1WrFFFprr3#I$̝;4iKϟ?Gannθ=Rk֬ ''͛7X,f/ɰsg*lvѻt58~8Ю];vKJKFX `WY;b())aɒ%d;w...`X3g`ɬҒR)V^ ---3Ά/d2رFFFa -rǎ%KJJп())1`kooƍ3RL0JJJ7o{P=z...j;Da̘1*<<|85k}}}oݺFFFaMZͺrGڷoo пhjj2/nccƍBQQ&LMMM,XU=B͚5QF P+--… !1qD&+4h&&&-%JXπ]CC߻wUT]b̘1b3g]tTZwѓÇ3o<߶m+tuuz9 18\捌v+k@ڹ4TT ͚5< >:::XlY9+++jӧOX,ƬYdffɩ,]b#Gaye"&&?~DDD ccc߿aѣGahhvÇ?Y011Aƍ`AAƍmmm$.N- #sB,#aJ+_|zښ?n4hC6V\{ZYYnݺ<2e 1{lvO> j֬{mJJJ*F>/^666HKK\.gjjjf'[gOJEŮvZرݣiiiс/J2dzj5w܁ܐŰ&!!;w.Ú'O R),YUUU95͚5CժUq95[lԩÚ`DQZ5@%P(DTT0߼y.]d `GK@ IDATW===000]|9hiiϏ|AA⠮5n݂e8q"D"ΝѣG kbR&aɒ% 9r$k|}}akkԩPhu TTTо}{E޽[iӦ 0|p`ٲel{`kk8g̘PSȀ?vܹ(..ƠA  j*ݸqժUCƍy; 9s&Cԯ_ΌE|r:t(`ϟ??Tig;vX;tEъQOvS{E`6'sss---޽IKKZlw18p D"x㰦jժdX#J1yd^gҥKAD6l233ѢE -8qر#K(..B^  yf6ŋ/{d5j96ޛGYU^RR(l߾666hѢk Vaܼuٳgj[KO<'VÚ5k@(b燖-[BOORCC=z@nn.{Pq*+W:06Pyy6mD@"Gz;wﰹb8/œ?իW>JR5 BB޽{ ^&a޼yD0a_=`$ɰvZ#66xb/˱gf޽{hԨ?C~x+bd2JKKQZZk"44qqq(AAA "OsQ?DH///FJ>}:Ba*^_?n޺{gcA8z(G: w9ח5#GP(ŋݹs...pqqaL&ܹs!0i$5pww%kd2@MM qqq PFinr9v}}}sJ\'NJPb}|͚5+'NPs2|}!PfMܿߵbYhӦMBpf%%%=z4TUU\dUڵyzq, 7f=< ؼy3{j?hڴ){bXd 1߿[[ۿ1gbL:Ғ]tD+V@WWЩy022bl_;^|֯_e˖ؘw=// "k?j 쑑 "1n_ǏQV-ZjrI+&77۷ߏJ*!88c^^bbb-[>>><9r$b1x[[[8991)..ٳ!1m45ϳ> b-,, ˗/. .߿/CCCDGG]tpJSSST~~>hkkcڵAuUX[[^}:M8ZZZ`>+qŮ ]]]tԉ~z!l… 044DӦM9r$ttt,I)֟:iiiNpuuEjxJdhiiaذaLQx &N/_"55סo %%%x%nݺ … 2Gjj*@DXj˿˝gc߿?k {۷)=*CWW;waMLL ys>>>:-_L6 ZZZN...eQHIKK #F`Xkʊעٺu+b1x.]rDzzzh.sss1`NW^AʕYŋ6O<UUUtԉ}@999ٳ' }vv/\]]]'p~~> ---\dee777U)SYf'OZj c(++cذa())I&rU]t@ ]&sy*Hw<… ?*r*b>x`̟?߿?._z:Ғ`y`tt4xBsA[[͚5a͐!C j*5w܁%ܐSk#!!={6{dddjժ]vQ2F#++ ܨ ::]BcǎA]]ڵf-::$W\!OTXX8.C xDEEAGG;wԃ?:::h޼9{(,,UVo߆ -H0eB̜9أG'''drr2w \[Vr-!""qqqضm[G@ 9|j}v@*3fǿT+D HJJl;B~5|+(ׯ\-,,pqD" 22Nc|aa! Y&imm VLJ$L<BgφL&CDD>|unrLJJ@ a5̄xnl۶۷ҥ *U:?~ 8#z ---lݺؕ0227cVL͚5###f|y"~DDTUU?gPRRW޸qvvv`l \θ\85#ϣ{W/^ʕ+rJn:xzzb̘1 cCҥK033/&OΝ;CII III:;vccc***ܹ3"""]vΝZlo>a '\reiܸ1d:u*gs>| IXlC a-[h2QP(DDDೳѥKVkhh}<^k]t E*@hjjرc=z:::ԩ{*..fԥ< -Z`7G3!))ͽy&РAҪ|pڵ2 +Wŋy_#bǎߙ~-‚[nH$BLL *ر#b1ƏbhҤwidffM6Ɂ\.3/yvεb G###o߾Yt***E_111jV7o.r#G@ ŋ;wu…&NSYQ.cڵPRRBll,/e˖֮ F=XU^XX B'+ @)۷COO={AYYBr>| bm.RJ$aƍ<+SZu3"-ds\\]R ,2Ə63W>h ȑ#%Y1 `W6bccY?wzzztm===ݛׂ+&9133CΝyXӳWOD"_'OX3zϊ*]\\Pzư7ʘ8q"oQF077 ֮] MMM…ZhMMMr׮]044DDD(**bw^6ĉB@@r!66"VT*-ahhȻyyy V733CPPowPWWƍYU~ETZM4a^43f ձh"V߿UO|0|hjjbҤIܹW-B\r#GĂ pxzz… q^~ ggg+]b-!1j(  R)6mۗ5:t9SΝyXӫW/EϣjժaѣQjܸ1j֬ GGGN̰022BNxXӫW .̌gykkk#)) ZjӬY 1}tښ>'t211ۙUmBCCahh{X4*UB۶m,^| ///TZL&ƍ>}Wo"00fffe;b<; .^ˋF mmm^YwѿrJc޼ypΝ]" 絼e!++ :uB~ر `:t(pc̙@TT&L;w{ իWqe !!}v?ع~bϞ= O>BTT֯_iӦ!22L&ѣG_m߿.៙Ν;NKKc73w}Ǝ(>}Mwލnݺae(..ƟvYYYؼy3Zn5k֠ݺuCtt4d 8Y&c7qo?~zUTYмysקO/`_p! ѫW/lݺ!!!gnsgʔ)PVVƶmp5,Zk=44111J㡣pű˨U9"Bzz:/_c(`Jˑɓ'5r, +V R{"µkװm6l߾ZZZDxx8ك'O  @QQz쉐r㋭G}"J1|D"ۜgE"˰իWر#,,,xJփBYY:uaMLLLD'NsS>/00Ш tFya SQeyN:ptt D6lsƃXVRReO}|Ⱦ(0f>} T^.\`}ӦMի;X+W>|0KRSS㞪͛7/QxD"\'>oœ6Ν;1cƀ>{39;;c֬YhѢVZ6/Z{dd$ P^G9P ˗QXXX̀=&&>p`ڵ+VZ!88:t(!ϛ7H_ VVV CCC!C9ÇgZ}}}l̮}#] 0`6lTTTxl5L\ԯ_NNN ۴iâ툋… gu=899nݺS\.c;v,x{{ӧkajjc?Q:%%%277 Ο?===Ţ" 4"'uU^ǔ)SX7ᣇfBC`Smcccє !:Z1dFQAiUJ?_^޿N:AOO^CCAAA](())D6.\)Zh ˒$\|HJJb_(*.{}ڸq#.],]3Z1;v@RR? qٳgx)x 쥥X|yu-*yy):tIIIzE$%%ۏnżz IIIVsNq?V{n$%% ъqpIfW5QҔA*b媕HJJbחAa "̝;WWWVŋAD5j/ݨy氱[lP(DϞ=y`}} "##?&&& ҿ Y&yFgLljժU!\0h f n<߹s'D"zD>|ފQ |r 2*ʕ+.zjj*TTTǏѩS'xǎ!x&<7… Z*ϣ"Oy=R)U B8p=z(LLLо}{xRիrJ///=I$HR&tpp;w\NT9zhA*Dʕq6wݺuPVVfCTlljjj8y$w^!,, >w+FQ+*vE*'OVZpsschD3f@EEӦMcUӧOփ^CCÆ D6m ===co۶m000@^x@OQeII Dr7mڔU𥥥3f h"^j׮$ ,XUUUL0jذ!LMMI*bڵň+&NzdLv+]?s-ڢnݺ/ӧOS899Ɔ6JKK 5]޽{&M R)6o.UӧRGGb!v0Z9+nܸGR 4i’0fhjjG)\jb̛7ZZZHHH`/^|Vj*N9eql]S+] ` MMM֭[@ݺuSLX,ܹsfӧOQvm2$'t;v,/hˋg6intttЧO^Z`` *U::tpvvf\شyOsSre4i҄'t=z4tttKU=Ԟ?:uJ*<_|91tP[̠v+]?b ]]]0`uLMMQ~}>)**„ t@e$/HpBaر<&Mr96lUUUӇUo޼A`` yJ777+.ĉ*':]xzzzDÇX, 8Q+/\hڴiPWW̙39?{ uA͚5y-dbСaK4h@ `}wnԨ{nɓ "*v _7`jj ^Xq㠤 >#\]]Y^&a… 3f {p<}M6}?xP޽{WpJ=ză+@WW;vintuuѬY3^А!C+WsT VD9s&;ǏmP(Đ!C J^>d^4޲epev3Āмys"B֭궰 H$k׮M6aRǏ@ 3&NxO>Ef`kkˣIn޼**͛7 1Ossa/ uuu^|JJJP y&Wwww.$X_y 6#bŊrߣb笒+W޽^PW3Tڴiól}׬YիWaoo\:ydf͚>xFK.aB-`iim۶ "ѬEӪU+A[[R,#((H$.daa-Z7TaÆUyg?>.,^**vV΍cǎaܸq?~<Əq `ƠAsN3g`eeVZҍ ":_Su`>_y-ZаR]]̚$//AAA<$ ի6mīUV!\hԨQ "$&&wA:ux&p!A,̿ ׮]y~i۷=i~%`#/^ľ}~rOgϞcܱrC*طoi,`[{ص.ݰGž}Iqqqhݺ5/N.̙3Z*Q*bС HNN.R82 3g΄P(Ĕ)SXӧhذ!lllx[+W*K7j֬tuurBWW< ())hG9ٛD"A>}  yo/^=6m^*bر N:bL @$aܸqA 4nǵbrssѿmsrss+tVVVDY?9c -- nnn8trssѧOxzz˗(,,D||<5k777v1NEv_ _QZZ;v*/QPPhQZe͛7@WvN9&mTJonobX5 C Yzm888N: KKK1sLa괩<ܺuښUGX,y<޽;n CCϦǩ|B_\\>}@UU6l ˋ=ԸbUUU,\=|+Vmgdd^_}Zn SSSTZvvv!ԩSC~ "tЁO>b`Ϟ=PUUEXX{pTv̙3B-xv v4hY &N555fm֮]NNNvEowСC4g233SNQ˖-I&QXXJrJȠM6۷5jDyyy4zh6mPaa!͙3>|@.\ %%%Zv-ծ]={F'///jڴ)xƌC>~#HDs%[[[z*_uFtݻ7rJH$ȑ#ܜ>LGQFQժU… Dr5kF***Ci&y&-]رcCCD˗o>RSS;vPݺu);;LBkצ-ZЇhڴiTPP@'HD˗/5jÇ)))ttt7)*v~.+W^A ۊg}JSN!##/7q=<}O>ŋ1{l^R3n݂ y1N:kVc?ӪU+444PPP#G^zXx1,,,燬,V;::ƍ߬{o<*.]=zH$Ϟ= 333nݚեR)  ܸ~:G?N "ⵚ=zwww888ƍ Gʇ qU˗/)55rm>SN ?~zzz dQ\\={B(VA͙"W&pŋ+Z1_ 35`E۶m! .W;rٛk0wj| `?ty~rqqqVLvv6/g{~~>:t"b^(@5޻w/AYlrzB^~[ڵN8 EDD@ Ξ= ^.LNfso,׫W>dsgΜ @)S'O*U|YVZHA9+~׮]Bdd$cSND :vX/x/ތ#1vX}Y1(**]2 EEE(**RJKؼ/oc/)t9? ؿVS\ήuQQAݜܿqԻ (--EQQRRR[M.C*-;/bؼe3tttЯ_?vyyy*r8p&&& a=撒DFFdrgϞEj^"`DXt)ln߾ '''ԩSq¥R)f͚%%%$$$sF `eetd2VZ dzB/;;f/ɐ }}}DGGBt<ѣGaaa;MmD2M -.]b PX ~c>CCCT ???k׎.N>hkBmիWT*/_tt5kdݠAܿh޼9. gdd0mпaTXXnܸ"&ӧOC |ёyU\"++ 077-[^z:@SSǃ猷tªbDDD -[~p1gsoܸ?8<̘1uO7jܸ1x⮕+WB `РA<-[Ȉ;w*YUΝ;CUUN8cc k[ (++S@@ӓ i޼yC97&XS%FFFT^= :s y摪/'Y&U\TUUYf$ )''PDD/\~$HDDDTn]_>ĉ)>>RRR~1 jݺ5͍,--iȐ!L:xO?n---fm޼PJJ {nݺEϟ?dO`ŊI5jԠ{QϞ=I&5ш#:D/_!C1]r|}}ȈzM"mF^b'YfMTF _zwwwXYYk׮6 k׮LLLp1&ٷѥK&+x7h*UBf͘S~~>ݻg*trvvFjx|dd$k.67-- b~~~]PP8#%/t;---ŤI 0w\6ѣGpqq3llɒ% 1b;L˱hnʒv!H`aa(ٳǏn:9Y'+\zaD"ѣ!Q^=`?>Ǐgs322дiShׯge lU*b000 tС444g[TT={BUU7o.c@sΡZj9Xx1 wjժ'''֖@}t`EXX|||ܲt~LJ\R~\xIMM)cK.XnX9Ž|OW|+te?#HЩS'L8֭c/_DӦMѻwoH$T\DF4`H$,=55Ϟ=Cqq1ƌMMMܼy%yNq@O2w'(`?ajj&O^k2w7~`/))A>}0p@>}Of a `J^sss&Q#66سg'OBCCZb6?~Dll,tttaV\~+WF#F 0n8GT=B͚5x̓2&L]{zzΎ\.Ǻu렬uǫWСC B@UU;w t244%:;_&tj֬1dhiiZܹKKK ْ$$$@UUg;v044^RR={B&޽{ćfɓ_ "BJJ;i$f̘3Gaŋ_߿;w2Bqqx `NDgǁ }y㵯=z]gͩS֭[627׮] 4iZ4%%%=z4D"? Gڵz2 χ@ ?O}:Ջ454y(}}}j۶-ijfeeI1Zz:yzz֭[III֬YCON"Ga}0005kУGhݺuM *,,CPII -XӤL6l '''z͞=5jD>>>k0aЛ7oH$… zt Zf =xOr I$ј1cʒ?NaÆQҥKLr<==IYYCm6r -\*UD'5#TJK$Re˖ѳgJk.W}ƏOԪU+ϧ3gR^^ݸ~hժU@锘H͛7'OOO̤#FT*RD4c V|_޿{'7+UݻwG^^,XVyyyPUUΝ;y;R~v΍ 4iD [17`E{QQb1°}v6ʕ+[RR}}oyʻv %%%ݻ=}4*W7% bcc!xoW^E5ФISuΞ=|QyUgRR'ʂ,,,xB[B$!&&ѱcGhii/9z\ۥQQQ k~9XZZߟ]{LCV7o\ZnMv7nwAڲe zꗨ5jDUT!CCC*((͛7;W Њ+o7o{f͚Խ{wϧիWSQQm۶h׮]N4tPjܸ1jՊ^zE3gΤRs)))ъ+ёnܸAK,v1:t(I$@4c 203g)<cǎ,Щsά]ekhh`ӦMl… Z*6m/_0ѣ+߿׼/Pz9` <|QtBBB~*qqlْ]ӧOCOO\c <<<```v322н{wԭ[^^^o7ԩӿ^ 7n{G 6 gtįa ;;ZBʕrڵ ޽;\عs'c~:u +W?\͛7aee777iԩŘ;w.KתU ժUc4п:yzž6l.ˮmdd#GaddN:1ǏѫW/a/\3334mڔ= 0j(hkk#))Q8P(OP$(GAA^\)3ׯѪU+XZZɓ v MMMt֍ѽ{wTT vZl: 4zzzHIIa7oބ)ׯl 0qDhiia… 322x{{7 BCCƏ_p&]d2_۷ַoбcG3B,SNӞ={?JV)x}}}x{{j#F6/_+] `c9s&D" */^u֨R N:n׮]PRRBnxݻwgB'ƃ?} hٲ%c?X,ƍ011;ϷfرPQQ… Y;ѣG+/t{D7n;gϞ˫  зo_d`` ,,,xJփBYY:u1nbbb```:q@ʍCAII :ubo-v:Ϗh+]?dޞeu ]@@*UӧO탲2X"77]v:9sh۶- 0Bk׮es^jժ?dr&N"B^z?,Y"ȑ#y͛7G*Up6w˖- ٳ'M$((zzzx q###̳39 '@;cǎÇW^˗Q]?% vލ;wzv\׮]瑚ʔwam h`=RSS X\\_>}ؽ{{|-?zz*Ǐcʕ+dػw/RSSʣ|+˗hҤ LLLqrlڴ ۷/sKE6m\.ǁ`dd0BG=s lllЪU+vd|r6ƍpttD#DDD@&a6mgddQFVr9VX%%%}}}Z4\ X,Ftt4 eee>r=z(LMMѩS'~?z@ M+&77Ξ=ԨQ Scwŋj*v!y.\2`=z-©ShܹbEwڏdԬYr{Ʈ]  o>:u EEE(--L&͛QD"kиqcvn?أT$$$Nh%%%dX|9"##k]*f͚X|91}tK.8u @X~=...<wXp'O@EE׮]öm۰gb?NBff&={nݺ6!Ѹqc>|[1Bcƌ1c<<<`llbS~eET6m^&a߾}011A׮]yPQQa \ӧO,ӭ())aٲel-ݼyjՂ=kH$̘1***6mʟ>}uJ*JXb4551l0 'd2mՋ?UUU>|Çann } P}]II=1i$~_ƻw€Ν@sJ۽{7;nwvvf wFͿ/\vvvڵ+j׮ Pk]3g2IHH`?b e^vmC]܏e^o޼+|Nn  ح!ѷo_vܣGttt`ggW^ÇW:o_ "k׆@ @rr2;b~<@xx8rssq4lؐעXhb1&L_FÆ abba֭[COOwFJеkWnxx8b1v(Ϝ%Zho^vΐ!C:yxxuyO>ZZZ{ٳgprrB*U't\V߽{&MȈ<9S`` tuuq'"x%߷sqo A۶m|Ik'NҥK先V̂ իW#33 DDD/cǎX|9&Nf͚!""K,iDDDѣ8y$ѭ[7v[lΝ;#""/_FHH? (<|K,A1/ZC=c|p"55fϜ1xIHC .V\0y[XXT:qNs)Ykժի~3f KKK^qFO>-{r8|0;CUbS6n֬YPSSÔ)S0fffAg/ɰj*"..Uɯ^B6m`mm{VWWG׮]TOzhiiEN:::HIIYpN~„  QV-Ԯ]gUpBbر윳ФIz6l*  9x&X< J'O f͚E \6l@ѿ1KZ []Lr V}1\2լY:dҥ iiiA<瓭-ݸqN4aDDD4qD:{,M0 <}C攘.^vEo3_Ͳ֮]KjjjDDi&Zz5S`` *..0*,,u֑͚5h.I(r,Zt)YXXѹsh„ AÆ #SqȐ!tM9s&988ѽ{hРAdggG3f`1c :v5݉˗El2RVV&"+VЖ-[o߾ԪU+4rHr\Q+*vEŮؿ݈CRRppp@ /\.ٳAD4iƍf͚<$˗9&w^D"TݺuX,F֭ѲeKV0"֭cs]kkk4i҄IR0Eek3(? ޽{h";wN:pss{wy\DqժU+֯_@~۷oѮ];21,TMM !!!nݺAYYǃ?{,*W6m07R 8Wfs^ {{{xyy\#Ye&l 6#tR  hѢ,,,K mHh֢APPЏuwT/;W%ƍWc˖- `/7'L"¼yh߿ׇcjV `ԨQ<*͛7CYY{f,>]v:===0-G,σǙ3g`ee-[2$ǃ'6lӆL> DiӦ~zz:<<} J*&ɰrJb};BWW!r9RSSh*] `R`1b:w <|_>gVǎ5j |իW+RIIEE <\=EFPF ի؁ D_|mښ<ԭ[*** e yBgBKK ~~~<;AA[['tuxBbL8jjj?>;t8::ɉEh"(++c̘1윟?z8`dH$"HH$.ٱ)?K{L&c gb:Q Ǐݻ7455ev\rf-b1"IIIlݻwQF2e2fϞ @I&58880xǃ`ii?xBѣw^vl bccuֱ7n܀<==YǏP(ļy~d4isnnnpqqdRRR{;&˗/c]ɭH>4`/..F! m۶C4jD]_ 򠪪pŋ1sLAII SN% s~VZZtR{NNN< ###oߞ]JKKѯ_?^t%ۛ\.Ǹq@DݻW\\\xVDgϞޣG 2#G1|pٓN@@ =3?oO>>T:rlݺjjjի:tvAMMh8722BHHxiigacc-Z0\.СC}27n޼ gggԫWg0sLL2==D"222ٳgSaa}]Iddd___&3rHbt3x!Asĉ!0e2֮] >~QEwVVV//Z000ݻ˅N_ϟ1`hjjbݺut[`nn |/?<͛?? |7޹s']ǷJ/]D^^*b۷o_wߏ̜97ob^~W^y*s}2077g$>ȯP(T/ ѲeK**))ARRn:Fdmm ___XZZ*Z TA׎ܹs!!!VΞz {G.]>:u&SNAGG[ݻ7x<6nH^r666Rcƌ! ,sܽ777xxx0\]]A1c*~3u6lqի sssѦM2?x ID 066FPP}D0`8իׯQv`W׀]BBB\˾}#** |>;}4LMMFbׯReիWQfM1WoEUP~}Ԯ]oߦYx18È#hիW-[@II ݻwg66m@SS?|0tttбcGR#c2 F޽{MАhd2mMMMуácǎѹ1"##Ïnݺ8Fy١yT$J1|p*8S]v`%PSj-[BSS^T*ݻallXc.--Ett4 lllBϏ1`())aprrB)S@EE3gΤƍvvvxK^"`ҥ#h<77~~~gN7CWW{]?p1?pI[.#!!rQ&Q0 Ě7o +ǠAh?X5k@WW bhzzz8s Ν;add8!::Bw}O< sss3= ---^Fׯ_-ֹSL̙N"|98uvv}%P(dNaZзo_j*,,D֭~011Add$>Dlݺ)f͚ݻw??s)oӦMC"\|axܻwgϞEv0ydk׮gLj5ؗ,Yh_@ǎD*y5[yyy E^hw_~Ǚ3gP\\ǣK.رcuVt |2.]mb„ ^RRpt 999(((kGFFƏXdff~1LX;wƚ5kr_ ;w <<Æ Caa!=zPsΡ 2qqq8vwvQo߾:uŋQ\R"""ŋXz5fD"k]veRӑ KKKЪofآE Q}=uttGSC'O4'$''CWWk׮q.`ĉ HMMӧOS:T۷񁕕tB&-Gn^OO#;͠ ֭[5_pFFF?@aa!~;wK,j9BDDIDAT-[|Je؟>} Bm6lڴ ZZZ@DDn݊OFkXt)~(ϟNNNy&ʗ/_UUU <߼y-[gΜΝ;t/+ N< ---3B$2Bׯe߻/o߾=ƌMMM,Z>~S^,¼y󠪪 &˗񁃃SUUU׏ׇҒ uuuDFF2B2BBCC}РV͛GAKK+J֭ʏŋx'O!_uCnX2 ݺuØ1ch"RLL n޼I# Tl4mz(ccc)///R; ӧ2 +V@=+QQ sFx<`Ϟ=:z}Ϟ=ǣ`;v,TUU^"pwwGvv65: 3f@"z8 dX|9x<RRR(p_|VZzwFFԩSPSSCHW%맢/B'MMMF蔝 "00hF%%%ѹGZP^=څQ*bܹx?~<Ӆ5kd[ZZ2Bu ?v ===޽-ZgϞ!==> ;wDzz:y ?t9rk.ӼH\|q5_wQRR lڴ?:Tׯ_w?^˗/CH$† 2\vYŋqIWl3n8:{2뮸ݻ>|鴒wbܹt\p6mb-&9\D͛7#==" 8C !SN6lڵkV!}aii܃ݻwSw3//QQQ&BCC>zS5ߟ1=z48… N::Lq1\lҤ 2׃8ݛ1hӦ LLL2@II ;vKaa!Bqx8gB0qJ5j0uqϻw ccc^dffBEEӧO4%VQ|uLI~q222(G^ {{{4i҄1?~<!1̽{GEE@ukEn޼<=zǏJu𚚚СGy2O֜?jeeeٳw`֝gqNJJBݺuq]Tꔧ{^x&M׮]sׯ_>>}~_BBBӧO3B;wF^^d2-xسg{iXXX $$_L&T*Err2!L&}||c{yv̙Jdx4hGGGܺu]t)8Ð!ChJ۷h޼9En۶ ***HHH@QQd2 ?"""8z({CpvvVD슈]+"__xpvv5R .ƌCs_FFPZ5Jذa444Я_?"((LMff&CGSdr 88]$ ֭ UVѷׯvhРc~1uTx<̘1bxyyޞ ***:t(͕iӦӫ$t ѣ'M6PVVѣGCTv`'ĉ7oDbQٳall;{+b>|.D(`hhh`ܸqvo޼AajjJ//ѡrjՊFrٳ&&&ҥ #t*ɨ5((o޼A||<0h bʕ4r ԬY_/D:u*0sLj3֖njb˖-F2󃁁C__B' zNh)1 ݻ?>sk׎:(U< _{RRTUUpB+Zh̓P(ɓ{zzܜVuɅN:::NZ!]v]tajۻt*tŅF?ƠA  ͛7accOOO*t*--Ŕ)S 8:3hH$BZZZ%ѨQ#0 ԶiPQQQ]vH$􄃃BТE +D^ĨQ  tR𶶶pqq훖MƘ_ԫWvvv+W&RRR@hժ,,,] ХKZ3ѽVZ(ӧO0`:+Xnܸjժˋ:M0 5kddZ޾AFPzu%##ZZZ۷o%ի W9˅S S 2Feeexzz2W.R\\aÆACC˗/Qzuxxx^$aPQQi(D={OOOԪUXJJJ4ho^xKi S&{E.]|& 4)) ذad5117|ii)Ǝ 555,\^ǣGPө&\]]i/1o<(++ct|9|}}322>}\Qjӧe=..;w?'N̙3؁/ևS*YfC VXA{888AT1-H0}tpiӦшhР\\\*sW>(86664E|Ǐ#t:}4dظq#jժq4ES^^ѣGa…tz:xT8;^dzgиqcԬYu:vث % @ &OLd2OGX)^9bGVVU@b :1-nݺZjaÆ4d5k!ǏѨQ#ԪU_f !HNNf܍BCC^4w^|DGGtNHH:w ---Fhh(s ۧOx<_νz*ѴiS*NH%;v,!HMM\޻MÏ ѣG3͚5S`o'O`̙HNNV7Ç߭8p ӺҥKE@@(d9r$!Xh{Ww{ϛ7:lNN6m [[[`FFWL1$/ n t>h(++#33=s LMM~ϯ]νvG/Ą̞=GE%K8 >nT^B`` q)Ç D"l۶[ATu2?wf0`ڷohptt;v,8"2y^zpqqdXp!x<FMѯ^B&M`ffF7#L7BUU{f܍BBBSNѵ8pzzzQyYYtommKR 8aժUtaÆL&ԩSqON7'OaÆpppJ֊=u*6M{=~]*Fޤfذa(--e~.^x< >Uθ~:nyg<>OU.\;1c Lt BTTTFsU_f qqq044d|O*F$o߾7rs Xǃc޼y4B}!QV-`I$,Z***=z4۷oiɠ</JqFkSO uuu xyhcccDGG3B.]cΝOF:XA3g 7n@ڵI1O%%%L>a-$ VX555 :D>l4%HBj׮Mso!/^9/_D͚5a0w=??QQQhٲ%uF;uC ?Ƶk#qUٳ7nܠ {9sիW5Zl;wrhӦ =8-))A߾}t^rvvva/Ə ̟?F=BZPfMFpBhiiUޠAo tuu8:U:A(LJnrSLL  MMMܹiU`ee-[21)))PWWNJ+:5j^z4_^^iӦACC3f̠>999[7NB#GDÆ >{:׊zA `ĉ3gxVV]L\L&CZ@;w9b<|vvvXlb1+ΈٳgF!&&xo=77o޼A^^~kӧ L޽ӧO1n88;;67 -[@o߾az_zfffhԨ7B-bON^^^`zjhkkcT蔗'''^&aGLL  }}}ڵnTgΜ Zl8!@[[V͛7aeez1BSB `ܹ(+/q_Njjjrpo*]у~0G!ϟ?r`?r A؋_Ͽz_{ii)u8t׮]d6OG  <6nHחn45j,]RITNf͂Nʘ_Efj*c(--E||<޽{ XYYԩS4*߽{7455Cŏ?"66 hٲ% [U&LRSS5˅Njƒ~]*F$ҒI蛙aȑXd vKMBP.*X,Ƒ#Gn:r`߰a]ϟ;wSNU"߽{ v}3"J9z(NÒ`jjѣGpgϞal߮\}}}4nܘÆ Z%=1c |L:FrMZ |>գs_~`P={TtFFFػw/{hhhUV4u[TTCKK ׯgzјۛ cǎ ,X@ѣGpvvnNGGUՊڵkPUU2JT.o#ZM61l7nܸWe vyݴ߮KK.A*"))p?x;vmXǎ ڴiC"$&&B]]۷o˗ahhj_W^^Caٲet۷QfM4hЀVHR̜9atǏ ggg !99޳ׯ_#$$VVVi޽xf ?bbb[ܲOΓbذaM7)HXL+Rҹ݃˯+w3fv뾭-]w2Ǫ v;w $$ WUDž S̜9o޼[ZǞ4`QqF>}귃]yJtNrrOIcǎ 8|0s DDDt|>[laxaii͛SI$1ѹoF:uEU0w\B0~x5n5jիW)Gq~ؘ}Ν;7O>!::jjjٳGhh(})//G񐞞N^vT*ń @9s~]*b9vhҤ !PVVkU<<ԩ!$wҤI +V0*ߙc *F{聕+Wbʕ1s!ٳ'&MCYY2ߓ! 66V}.Bǎҹ'O1"""X,F޽q6l@^|vRQy=ԫWuŝw+:婍/^iƍݻ7CXXSADEEMugϞ9D"@aೳ ooo+J* ^ի3%AMMMFcԬYTT.*… !V$?H$XntuuGCOO޽{U}qqqرc-<{,,--ѢE dNn݂ +k477͚5[B[[7_rב066ƾhT~1u֌E~BkWajj  `,-sB `ҤI,Y >|@pp0U'ORhٳA~~>m jh ѢE aaNP]*bÇ3)n 555$$$0&ϑVرc@֭+ i&FjhhJJ1rHhjjbҥ6(uօ?M̚5 jjj2e /^ApttdzѬ^0`ӷ&88VVV:x555]?1d={,S+tƺuT*=)HeJs;lC!_㗟dw],ȯCx&vH/._? ϲŸE_/ϒ跁??_w #9ɓ'aذaLIaooO#xضmx<uFYItq|={@ ֭[\qƌǰaàK޽{H$9s&x<LBӧhذ!S/ɰfx<ׯ kkkF$߹sg#66+thlݿm`/--EΝ~;w7o]\YYbbbgdeeax!!ӧOW^!55Gq8s #G@__flڴ t̙3hڴ)d2zI]aƇyf$&&B$!%%W}ڵի$ 1ydxyyNb 6VxzzB-~%إR) +Vɓ'>}:Zl3A+M-x<}\GG!;;۶m޽{!yfϟ#""[la\!hڴb`ٲe `Ȑ!x%Zl۷oqڵ+?~HWWWWGxx8nԣG`֭t+W`jjD>|88Ò%K(Gn߾ gggԯ_1={6!8q">yprrb$׮] B~ *G/ @@ P`RB())Q_?>ϟ;w@EE m]]cX`}E[.f͚UVYfpssm`_`jԨLF9ԩS1|"uÇXhii6GEE!11qP233iBfp-w޿ gqt̓'BBBlxyy!..].P].]u?}ԩS1p@dffAh֬=)) NNNk_'x `jj~PVVFll,RXXHhhh0cO< ===iӆi۫W/xL5,ǬY*SN&MQ://xԩSZP($ԺO:E9}48ԯ_ϟ?wޑg333ҴiS呬,RVVF܈)))!yyyȑ#ȈG͛7Çqpp eee%w%ӓH$RPP@;FTUU'EEEիW‚LFȹsL&##fff撓'OHDd2ٷx"bWDn[̞=ӦMgU^,--X,Ɗ+C>//022\d``nݺ*BDEEAOO@ԀERRB!aÆBÆ ' &@ `4WԬY5j*t*/ǂ  ӻwаaCTVQShh( >33FFF4nXQǮ ˛ta̙3iŋpuuKBSS|7o+++&Em6tڕn?~DTTLLLo>zyq"44NT K-cccx{{2b;Biii Ν MMML4^ׯѠA2_v 455Dss#448qݨ P()J +IIIPWW9e`ٌ;j׮۷oӨ|ҥPRRСC)D_z@ܹs|r۶mPVVF׮])DsssѩSJB'N@MM aaaLC/eߦMfp5*t(9r$ձd%_NpssŘ={61ydz999hذ!j֬4 D ޼yCL(Z (.bǭ[h ;xi֬Yɺu֭[v˖-q:t( h4x<3兝:u#t:qTUUF ٳ'444WM6)2 >|>K,s޽5k~kٳg8L8^ӧOѨQ#ԪU֭[Yoiiɴ WD Q`7os\ K 0#GqXh{ԩSǼyG: p}7w!<}zH$HJJBBB}UVJd2&C[tssѬL&üyqƏO#/^VVVuFFѿ(((o탶6t~DEE:8 .doŅi5|`qv^BÆ affVI褥dc˖-IT*Ş={`dd8ZXVVΝ;CII 4=y$Xd|YnT٨U6lH#xYǬYFxxxnjK,*NT*Ŗ-[޽{Cvث^*7nN˖-4b?x WƍS0aPWWǢE(߿'''Ԯ]\TyђA9^~žVшbY:::HII/G`` ܹFFFJbԮ]ZZZػw/'`iiP{|rr2ձfQegg 4NHeeeIpx{{<2`/((@tt4`oolܸjժB0w*/annT3'''ԫW{c[`֭KL^^^OO{YYfϞz^zh޼yѣG055ei*.Zjhܸ14j(B,^ k Nfb hkkcȐ!Lm{`` LMMرzzzGaa!QPPΝ;Wj{ #$$1HNN֮]KlXXXA'N@ @jjj%#}k(t0aB%9/IAWW'N SwN?"L0z?`w!aZ>yo߾!̇^VVQF[n ?>uwww〉W^!88W^EHHΞ=W"&&s&322ТE */bWB' 7nB#֭[#992 yyyXp!jժNb˖-v.]4i(@P+VPܻw666puue?}thhh`̙/_<;iD"eˠ!C۷hѢqY*پ};444/Qйsg"33F'O@ @HH}> ===_16lDcǎcԨQ"s΅:&NHk_zoooW^@b&L@q-t`„ tAw]&h+Wзo/1׍y,`J*YK.AYY<n{eڵL\UL?~>UrK<hٲ%~HIIӧO===رҥKֆ?|qq1 uuuZ ~n666u"SLfΜI!ԫW...'R˖-ǐ!CKZ/<#..)#t:y$JS?>}B߾}! Svv6K_ZZ#GBUU/8::D9scĉ:={krz=.^CGGGd2| IIIػvӧOC*b֬Y PUE8pa3ݻ˗~v444@/^DLL5͛WT*EFF-+8ݺu͛ZktEaa!uMMMܹi  ʕ+)Doݺ{{{x{{SRDS8L>}ׯ:uƍtM+VqHIIa ?Zj={qqq;w8>|@TTqA=y$QիTUUcWx6mڔ19r$x<3hiL&ܹsiL&5BUU;v!̙31i$ӧʁZG+߄voooL>ꈎZU{QQTUUq6m9r3 ,,쿞)S(Ǖ+aooB|>c W^ń ШQ#̝;I~HJJ!ڵMѭ[7())a&off-[4X,СCqc sMԮ] 6F0sLB0ydǏQFprrb׬YB ~Zj޳gХKzYPXN:ASSsO:]]]nݚݻ7x<6ldlll~32 ?,X{xZA",:9v`@n#q\T@UA*:u >>>? BCC?r% ^Xr%!ߟ~4ba``vѨ\${8[laokk͛Sd21ѹo߆<<O)u1j͚5ǔN8̙3_>Su2 Fx `ǎUUs44jԈTE59%K`w 9uuuqGl_&ѣ033C۶miY,gϞ8tjԨMҼܾ8,X޽{pww MWHRaرL1___L&롦~!""KT^PVZASSgΜs333.]0Qytt4x<2Ip)XYY!$$H$$''8Y^svv6ѰaC xT)SО:ǏQ~}ԨQw%L5kQ`&M5sاO㘃ѦMR5]U|y:uב7n8zU۷pwwi333=zFB6EXXΜ9JAUU#Gϱիagee7"E"Ǝ eee2ua*Jb1RSSqB7oޠA055B'D B 0v 䀗Jؽ{7K_ZZhƟT&xgyy9 eeeZ^~NNN_~b̜9]t?bbb]r%O? ~L_ZP>FAAAڵ+?tSʱ_jwAk]oX&ݻwx bccb>}vAGG8d2>|ժUC۶mQKK 6l|2ǘ_3Xp!+J 1|FxzžXf tuu1hРBg/:U+**Btt4B!CK*O< sss^\BKK WՍ7`kk ///F4ehiiaΜ93SbC"""^zA__7nʂ1* dr<-++ìYSŚpG+W@ +_e˖077gR4;wbccihbϞ=L'dbڵ033C+ B!RSS, +O ¢E={R۷9>Dam۶ٳ'e ƬJBb >:ݿ666pss///ǴiӠӧ簳ӋfPQQtN˖-acc3gعs'Ԙv>|@tt4LMM7s/xMMMM|"taNׯ_,t*-1cy +O[ [у)ޮ];ȑ#  11:::رcՅ?>|ȥ+WR޽{hРӤkڴix>}:R)cxyyŅ9d]bx<RRR(puիWxXs022bNNd-**B>}YI$k` իWXn֭[_o/=)) vvvx"ݖ-[qiǎs=UUUmۖ飞555ZҥK022B`` ޾{K1UUn݂#Ï3f///:ѣGdj*B0p@ ׯ_#88{nx"w>nݺVh߾=pQmH[[ڵJKK[2B`` m J1|pBxbuօL81}|zΜ=CfffBUUFչsg2gΜ!!kyy9㐑A^z?Ϟ=CFFy󑑑A޼yϟ###~x`^~5د\ W{!] h^܏=BFFN:~z_tݙsdŋ`l"7n}ݳg]KpIddd0R{EFF}5߿ Z\ZZuzuZVVVcƍ[a~]dddPzN޽{i8##+by=(]vACC]v)ϟ?}PVVf?^^&O0zhB`xxxݣIMMq;v,cѤIXZZ2J 6@II }a ?BBBEY` f ?Z|:YXX 44KR$''իWTLaa!455~;w֭C͚5ѽ{w8wAQQك,Z [Ʈ]V1~Ex|ӧcɒ%L_ vD;;;XO<ѲeKDDDz*d2Uqaǎ?tG3x}}}Qvm899QH$‚ q}EdbbBY% ӡdFԪU+hiiQLLL%kii)tuuuڵ57OKŜ:u ڵԩSQTT;",, 񈏏ǽ{pYk'OƋ/xj;R1K,Att4֯_ׯ_;vD||<k AϞ=߯N8}4Ξ= t֭҅[SN͛7o>m'>? [n+дiS%K`Ȑ!Eff&JJJ0o۷hӦ 9I> D߰D".] mmm1~>|MؘFR7o>wԶwzzz8p9r&&&hӦ D[[7|-r ,--ѨQJ.\(upp@ZӼy  1yJB' έTQ蔗-[Ȉ]`hhx~ ]t.vTTV Z‡U1S׌dFYJ,#-- 5jc~ѴiSX[[Ww_7:)#t:rtttЦMwޕNW\!|}}t(t*//ǬYKԫWvvvL+WBSS)))4{l8}4ݨv@.]0o8111066ݻiۖ_N<==̙3ɟ4&OLGdڵW^̚17w4hu?N.]DڶmGԔ8;;Q^h!ZZZo߾$--ԪUBIRRquu%ӦM#ʄBƍG=JLB !xRZ5b B!d…dӦM$%%H^^ر#QRR"[l!B6nHHnHTTxtؑ-[CCC2ydpҧO O?~LV^MWN!dQFdDIIBȠAȥKȼy󈫫+!w޽{5jk6m$cǎ%M6%kMȺu눚!˗u֑~6m +"vEĮ7 y1-gFS42 iii8#F{{{\x?+s߿G`bb= eeeDDDȷb._ 4k -Z!C@II +Vsܹ4hЀ% m7uTz?F YqS/)|ѢE E*Fv`c,o֬Y<֭tt]t)!6ln$'p+mnݺ1Сtuuq:رc`z#!!ضmjժ!005cҥt[ І{2U4x |}} ?h͛7 Ej՘굽{#::sۿ + uӧO!ӦM~1|||׭\Io߾EV`bb~׮]PQQA||רӗCV555>|=qѶm[W?㑕[[[0r ;w,j1n8iӦ^:S,~zx<ۗnT>|@XX~@ΝF8?333DDD0F{q_>{e8::I&2F&aܸq8ϧڵkSd2,\<_4ifff4dظq#TUUѻwoQ $$ 8}}}DGGEvث>KKKツ4oޜQ*DgϞE:u̙eeeL4~^xʒ% ֬Y 4 䀗F700@nhotJJJLc`ii6mPD"ԩS|>Z\GGGgQ,c7oݨ>|777899MM"NGQ۷occcFqFB׏V| PWWjwHvث?aÆZjCV華/Ls wu֥r̞=:u*˗/KKKB][[CZB']]]rSbb"]ϟѱcGhiiѾ,r>sssGII Tʕ+W`gg/++㡡ӨѣGUj֬.\---?>o߾N:Vrt 6"{D"!S={Frrr h*gb444l2Zr]Օ*@0c ̜5ŋ[.WNSrP(Ĉ#h>ժUce"111ر# i9PNF Էo_2ѯ^ 3330BqA(bѢE Dr@ $t򂥥%X,իW㒠 @MMMvثn*F$ڵkz*V^ KKK1 Ǐ?܇{#/^`Ȑ!ի)ܹ xxx0o'O&c:uf͚Luuu91h֬Wluuu$&&(977;vDjը<==!N ЧO:5jԨI `%>|;;;ȿKf͂NJ˗B5hF"`ժUPWWq OT*Eii)]hyy9JKK)/++ۿ`/--??W],u}`i\ZZJU!b?~8<<<~m?ϟ1p@hhh`ڵ4qmXXXAL'BII sΥ߻Ǐu֥9xT4|1H/\޲e |>6r@,T`50b\paشiu%~@:u@Q ASSشi&OL;5nܘ!T߾}Æ zM6aӦMpqqqHII/n`E-˫/_M6+SV"qZl4JNNukg} T^9H$4iGESz[/Y1u/^@`` lmmiKbKeB0iҤ:PH7 7n܀ ի9smݻw*ǏcǙWvy4@9J … 011APPS}2p@pUVY&5jĸM:̘1}!6lڵk3u+V!hժ,,,ܹ|>@pp0:v@P^("""VܔGx9PVV,--@D$ FBҘ[s!Ǐg ?4i5j0Oܹ#-- sΥ?FBB!pwwgjWb~Q#--ē'OVT̙3g0j(nycǎѵ/[J1+Ɯ*] ƍTeBн{Jͣ~4cؾ};amm-ZPd2 2͛ShotSΊOl͚5x0`M Z>#tڳg֭[Sfuʴ<ŀmڴ&y?xa:ppp@ӦM:cǂT:޽{Wj 8=Y%^{b߿N5Aa] 3jԨW.1aBQ.vjT*¿vLiǀ}Xb7>|lj'~0`Zn]ɾ… Gs1aL_WWWњpTsaĉL^VVViݺuPUUErr2C`` e2]]]3Laaap]"o߾\'''鳧:Ə0w\ʾNNNYȑ#Ïƍg`WxW߻wO{QQTUU(XSL:Ӓ}URϟٳg+XԄyH* PQQL&Å `ggf͚^$aĈPVVFZZwwޅ ֭8Ν;4iS j,.HvZj|4oޜ|.]sNV:EFFBUUq1XZYu4$'UVVƺuFuU8::LJD"L8***;w.}Ŏ4_h()-޿ݲ1$$$O>kkk F:wLboeeer9rݻw*rW]]hii6U}8p+++RV-ҹsgǟI$ҳgOR,YÇPHnJիG>|H&NHIfH~~>8q"),,$/_$:::dɒ%Ύ\~lذu7oސO>uuubhhHMFɅ ILL "< $//ԬYXXXaÆ%e%rACFM ɓ'OHXXy-iٲ%QILL$dÇ$==~ɳH~;iݺ57o)(( YYYD(tB޽KRSSIƍ#1b),,$EEEDGG rUIBCCI͚5ɋ/H=HAA166&Fd„ 蛟 vXLZjEȲeˈP(gffFO\BڶmK׫ܗ`dͤaÆɓUdDD"hi&rYsk"HII )++#eee˗$11E)v%%%$77̞=MMM7|>;;;IR)Yd y9r166&۶m##Ϟ=#'O&k&͚5#dĉ۷Xْ7___FrssIrr2%<YfrerYEȣGH\\%իW'LÇUUUr!rK,--ɥKH6m۷oI`` &B222ӧOɺu눩7nL^|IOIxx8d޼y$++דڵkǏ 777Cȑ#In{O HZZ o&{%-Z פW^ÇD(VN~j*ҥKA۶mQvmBK.1MB* 'b̙3)?-״ƅ /"??p*U7bnݺjժˋJ!Wx044DvvV|H;2ybhkkYf4 g 2BܽKKKԫW/^EK0ecٴ1''pvvfz,Y***>|8ׯ_! Iթ[n*uFrssjժQ%֭[W:aӦMqt*))Q#K2B'{{{ԭ[*凧ǏǾ}o>8qۇcǎP UsY5c? {ii)ۇPڵ G ǎ}c$%%ܜ^8p|>:tڭk%_ .@(y8p * 'M>ٳgӹ=;֭K$ɰdx;vt_[lIH$ <,_|ڵѰaCZ& 3f!z15j'''dggS^ o޾App0LLL޽ʈel"##^^OOmڴr <7ns/_ [[[4k֌HR=,Xb`W23E'%%"""cǎѹG!:t@s"8f/^;;;2FÇ!/fY777xxx|S9qD֌iݺuHJJy?UVƹsܽ{BKK 𣤤:ub倯VÏ}t|͚5Ǩ58إR)Q^^)ؿ=b1fO?}ۡ=z0FPVVL&Çaff:^+"ݻw͛f% FEѷw ue̛7|>ǏMT*Ezz:444L|hr>rW?qкukFԿx<]kWQV-P%D"A```7v`4h(|6o }}}ՋhӦ 444PV-ddd:u9B8ŋ3N Xb>>$11dggÇ+++2h ɧO!۷Ν;^RZZJR)>}:"s!d۶m$s_&?~<9~8vi߾=111!666ڵkŋoKR2|ON+WHZZ"G%}}}ҡCJ/^L>|H>LLLLȎ;;%SL!իW'D$I&W^fbggG>}J6l@|///B>~Hb1 dĄ\r}J.\@ ͛T*5SE]cWsرcqƌC#g9ФI8::<lذǡW^4}-ڶm 333Ft!|oߞF֭B!vuttмysZ^XZZBYYWsoݺKKKx{{SXɓ'a欙tGh]!L&òeqBYehoNLJ\t FFFĉPUUEXXcѳgϿmz$!!ꅱi&ҡC?jͥѣ$88YD"!v"Խ~=y}UGuݻuuu2k,ү_?bjjJ!ÇdʕΎtڕw+V ="ޞB۷oɼy󈁁8p +۵kG!|L2QF>O!رce˖חBH$"ƍ#ȨQ:ٴi$w&>>>$(( 2i$R\\L "z_ܼyԩ][jj*baaA!ٳgdɒ%‚Ջ]ns&NNNB>|@f͚EB!:t(86;Md2ܹHHH`m۶e711a$b1z:/:xyE&aѢE4 r]Օ 40n8Q|~~~d 322Cּ<AKK gϝst҅ǣer[XX( իWǽ{w|4Zr%1dM6T*Ŷm۠ݻoqq1ڶm ڗE.t277GSϞ=KPF 4m_ Ҝ{ڵkӲ[DT`ܸqtz6l333":iii!99 䟵T*Ş={`dd8<** JJJػw/EK`իWS1JJJ1cMAqL/:0B"m?tЮ];nϞ=72uիWGZG#tzj֬ ggg*t*//Ǽy󠩩I&:ׯ_^z033bk֬N%G@hkk3 N;w5W]* F9Cx? G! wwJ?GrL:s̡lNNaggG/PѣG󃹹9 6@GGz|mFFF8t:th׮?}={BWWKot门AV7nL7b5 BkNfB!C0큁055ec!>>w){D"ǏBbׯ_%K5d2DFFbҤĪxrOii)&LMMM̟?ӧUjժD ,:ƌC7ׯ_qưIaW^4w{m8|0S&m2^zAN111,I&NB1>~`Z?www8::2 -[FR7hѢlllpYQm߾GII"{ܰWP۷aii p3>x`D"D"HR!*-WS1=0n8(++c4w#Ԯ]nnnt3H$X`|>ƌC!sZ)kƍѳWOq}U]v@dÎ;)1x`cժUL1x"SN̙35?ypqqar˖-Ð!C-Z֖/i``ŦM*ÇҥK1m4jVUR1vǃ&?~9s鳧!;v{~~>_KKK4nܘFb*wᤇ޽K߄.\㘶#999h֬2M68уh׮LLL2ÇCYYڵ|XXuMMMܹνt~aʕތԩSqOׯ:uƍ8CJJ #tjԊF`9o jU?7oFZZyѴbݺu׮]S\&aĉ `tŨ:`ɒ% `ذa amm/ҹ[nCbb"M|ڵv:xMMMk!!!4*֭}vY477G-蛈D"СCqspM8;;W29s&!==<c6ߛӧ)LLL@aQ~ǍG{97i1˔)ShOHA׮];O< wwwdeeA,ӇD*"//1vcUEEEؽ{7޼yaÆɓx-C2ٳ^ӱm6c "؁/|T#T8,_B͛S<==3faԩ4hy ֖:Z HII>|@@@ttthF&a׮] HHH` ?ڷo>O$pQm۶^,gϞxذaxy<.8 ,jwR ,رcF+ܜ:_jjjׯMֈ]$aڴi CƍiҿaÆeee߿?4iCCJ`ŋ)0߿OnD"Bx<=` |}}"IHԳgOưw]ޒƍ(**b$ 1b&~ 9{gΞ=+HΜ=/2ԥ!仪{ТE 0cСPVVƲew֭[pvv;c~1sLbԩLEdPʅNZZZz3 * G2 GrذagYYY4$?KD3f שST$ 5557VƼy`Z$ 222׀ƍ۪XL#X,FZʫU k׮E޽vBddo;_=vBBBۂٳg>S͛78|0<<}3ttt\jjjm?F^ aQ]|󣩬R3ZZZXp!k,Ӈ}Μ9ڻvUVVZ})))3goիB6*7o`EB:u S1 UV1KKK1e*t*/*t]6A `QLm{ƍaiiD6mP(DϞ=QTTx|۷ :CDDc~ѫW/cƍt#ʂ1iɒ% mmmₜ9tS5k:UlUի֭/K4lؐٝ={գ;?YfWwG쥥LOs̡ܯÇQfMB0mڴo^_u{ܶ`hh]v{pY2 mmm֭[033-d + j׮ڵkSb,\***=z4}^z&Mޞoܸژ{oT*z%SϞ=-[kʂ.7nLb >ZZZ{חcPSS5^zprrɱbȐ!PQQʕ+Ӫ v>-Z|dVgЯ?k<~Ǐ29ߣ!?9SҒ:9JKKL,\/[b888GTO#Ǐ#..ػw/]ǹs砩-[ nIIIPWWGFF͛7annFMƍ܇nݺpsswR .èQsFL;x<S;o߾e#_۶m˴޽;c&f͚罤\(tE SQM6 <ӧOs+~[cfff%TU;!=z/ŋSCU<<oBΞ=ĉ8~8&? x<;;իWT% &LBΝK޿pssU4!Ç}97o[[[\xrd˖-8_ݍrsѾ}{TWUUE۶m> PUUe*.]###2' ˗ӹnB͚5MYe2f̘BLR1=w"IDAT s`'ʕ+WϟwwwBh_1Wد^ BЧOYfprria$Q/X())1o4Ν)遣X,qS '''R%3f`RR 63\|9!lhٲ%͙^.֭}ҪTm2}K. x}>|8!̦[bܹsZîPVP*ߎwÇN:7r}UZiLD7n@:uP~JN0ex)5j{{{Fzjx< 8ѢE 3ߵkmU}PRRur#""1V//g{r_>N +/ g#2  :uĨ:vd2;wvvv y<.]eSYfc4s4hִ_*b͚5PSSàAжm[_M/wtCBBM5CPRRb$; DDD0o"{|2+ƍǜ%dtT]v`%#99 4&T*ž}PZ5DEE2Rt jjjضmmO{9T^͛7g:D6 Xt)= sHYfA]]SLQ/+++z*j*BF蔗GNr˅NN:tGRꥥӧԐA7˗/kܸqPSSiÇ]" !O#,, L ###DEE1ݺumF# ͛7g/ PȔR߹sիW[%@ ̙3䩍(,]BMĄ-[e5(ǁFuM64-UTT>}@[[ׯ|XZZחn%%%;v,#tRD +/ؓ'0_`/ ԩc׵kWbvΝ7oN7" 2Ν;+tܹsZ5j@&MhMMM5[4mڔ&)I{Uu] MQ, (`@&ET0 `Nńň 0'@%vZo03w>ym uΩj׮–-[~1]v xpSKK E{ 4044$t4i.PZVJoD"AiY)bOUUaj|-![ec,-+EYY} B߿HlIPYYOPHD(++?ˮGT*EYYs_鸪u 1sH").y*Wvx_v8d &)Ӳ\}} 4)) iiiPPPСC|{5aeeǏ%%%tޝwE(W:={5N5N_YUɓ'CYYϧ.//ua*ϊb,Y 7n/^UVelٲׯڵk ÇP3x=]]]l۶)U[C4j(?.^^^0۷gϞźu舴4bH$TTTK.سg.^5kСCW=zD… qp'OB,Ӈo>hkkcΜ9Ν;Ѽys`?z(ZhT`x(,,(**–-[ЫW/<{WgH`_|9 XXL6 tܗ.]H$ȑ#QXX۷ocٲe8W\.H0p@\yyyHMMEv퐜L6;NԩS1b444Qo hժ]lݻFRϞ=C׮]{nHRH$ݻaaa_T#揩X~8Ð!C38N_NNx<ň#t:wڵkǘܹ;v8p:}k׎۷'W\amtt4qrr"VVV?eܵj"d۶m֭[D 0 v"JJJϏBH|}}mEEEMFE˗Ixx8JO B @&#ii󉦦&9y$iӦ "{&&&&{D,իW"M|>ٵkiܸ1)(( cǎ% 4 ̝;Br-qYjqJrssɂ H`` iڴ)y5j@B!8̜9ؐϓlҿDnܼAK{{{@!ٷo9<4i111!.\ D";MMMҧOLӧOIFFQUU%&-[$eee$..ؐN:rl2RZZJ>Lx<ٲe /^ SL!!?<O凧_ݪb޼yVZ/_Qm۠3F!!!PVVfj:tq͞;wuavR-[uаaC7I*"33 6lMm۶ҢT*ݻ!лwo[n& |:1d=hݺ5c~1zhaٲe4 ԯ_zVUUaܹPWWnj3hŋhР,--ӪUUCԺuk)66pJKKѭ[7۷FG9BBBVZyr`ؿKJJU*,Z4i}M6ׯ6 BS4EEE=BE?999Gxx8Mm &&e011A֭@F222IKZNk׮B,_=z4j fff oݺ:::bt طo#G(.. .v9]]].Bχ*&O̸5k % ֯_UUU| =?h>G}!t:<8:1ZZZXf͟ iӠIY '''ܽ9OOO ƌChժj׮n UUUݺu)#t:rm.v9ˁbq}8::>QyZZ|>&O\p H^*b2dׯ_#$$VVVT |қ((( << 3BC Eş>,, PSSCff&{mXZZˋVUUaʔ)PPPz6~_>Sl,==<I?ˮc֭| -'!iÆ Ò%K(ܽ{...hԨ).J1|BB>~>>>ppp` qLA͛7 ),tڿ?|>whhhh0e|v(UTT !!|>tl7n@ڵѼys ԩSqΝK޿psscx2ݨQhϟM6SΝ;Gfgg8ۗ1h>,v9ˁ]?%&&b 0@ h4 /!Əc܍PvmFyfx< 0 ===<UUUtڕ EEERBIII81S~:͸͜9hڴ)\\\Ï+WR+B+ܜ;w3F9<#v9ˁb`ԩ 0gg翌fח).^D,/)AXXTUU#nݺ1}qTݻwo?h۶-^`y,_ޛ7oRw#a1̙3zV7h޼9lllpuwڵx6l] ===UUUՋ#v9ˁ4Yفe`|1Ϙ1<f͢j^^7n ;;;ƀzŊPPPȑ#QY4??Z>#tΆ@ @<448r{![n܍ԾqLokk J}H$3f 8Czz:]ܹ7w7SG'Dyatz95k+++Fn:(++#!!de)xT={@GG{F ޽Ù3gp 9K4g'b?~8ɘ_̜9JJJ={6'O6664DȀƌP[h=== ɧҹ8p >^EĚJԫWJJJزe {yؠu֔SUUcBQQK. ,~H$BZZTTT0uέΝKSO<3lllh+ MMM?xoooQ.tccݻ7JKKѯ_?lٲaXYYח13f 444N.݃-\]] *1w\hhh`ƌK wޡU#Gcg>֭ObR); eee_͛7CKK cǎEnn.rssq4k uχZlׯ_Qv UUUBpB]*s4o.]BPPΟ?/k׮4{qq1ZlgN#""999>BCC`קT@ @ff&7n cʔ)… )?~NNNpppÇ)/Z:yިUgahjj"..qB ,tڷottt憒qBzgN.\!ZjF ---޽{UׯOiHMMKS:uH$!0j(ƸPWW9DЇ!++;`~=}q000йsg$%%}Ʒ7oހ8>}~w5t&L@II ?|Bd$$$ gA¶mۘ?1aØ7o/R>|bII_z -O">>ظq#}oܸ###4i҄O8jjjXd G4D?>1i$;;;&a())!..raÆPQQA׮])V!&&… B֭Щ#F@ 5k%6lO̝;IKٙX,ƲeˠѣGk~%=~Aj R'Nqر#CGbZl Btuu͓=+++Bp_ ###q8;;UVT]Fٳ/W^E>}Q\t{Э[ [v8(((@AAqQTTA1x`6m|LNN5\>~8!++abb-pUUƏ>%KPͅ3<<|qq1 ޽^Dž  +n!11Xv-ۭ۷`eeMH$ԩS0w\ÇhРׯOsR˖-èQ +ƍx͚51bo-88W,`B|~X~=233Pӹ(f1x`|lڴY---K(1ap޽KX4'B&L@ɓ'Ãq8p n##}cf]vx]FBcKy I&4f!ӧO գG>\ptĵkh_^=.U/`>) }||(riii g Ѿ}]233jw-#˗SGBYYǁ8DGGSI(3z;v,|}}jGV]iXZZC$ BvѴiSD3SU{4iCVX#F۷ر***AHHMAYY$ʊ]ve ?bccqnJ^puaxRG!۷ 0,4p)SЅٳghѢq_ % &N(o ;=+xǭ[0dܾ}oƙ3gh{tz*qy<})+ Ä ӧOÇ߿?ttth"\~k׮EN@*`6lڷo>OeROFڵ@bxXjS# >TJy <==accV\ eee1  ۷o6_V0(**24C ]vev"ǣǍ $;,W?yLCMM SL#yI_K y{<|큟ݖ={|tɇ :::عs'SNڵHJN&V^M͛U6lH91c͛GO>K ҥKYѩy:͛(9+ktuu1h x= ÇS`dd.]05---l޼.;ѲeKaرHOO\ؠ^ztQ$t9s&7o.v9uVYÇQtIkVC gϞE\^`ddݻwS;}4tttо}{%aN7oބ)<==i_QQ)S@ :խ[ /Z8q"|_~ {{{Ԯ]F7n:,aaa033/kjjK.ѿc֭KNnnn5N r` ;wDp'˯9{n(**gϞ4.,,DTTϩS3㡩YCdlb&M0霉'BEE/fNuօrb,\ 8q"B!zM')KRlܸ 4h]8JJJҥ Ã#tk J1|p:YYY1i)y*FT#wuG+++:u~gx<уwгgOR_OY:0y8`ӦM>>>@V(b„ `X777ՃcpBpOOO O>/+۷ԩLMM?Y;x |>t~صkֆ?MKUTT )) Xf {-ԩSM6.v9ݻ S~Gdd$طo{̧M`` JŁaÆ իWQNlْRh% &MBϟO޻wpww;VcǎaQNg-[q~t 5x***ҥ חO>PRR2722BvÏdpǰnܸGG {Ett4Ν;w`޼yСRSSObܹsq-mԏ3 ,ӧOѧO 03gN\h!̙|lf͢'?CCC <|ZBJJ RSSzj#!!ݻwqQDFFbܹˏRhسg.\:G:L:/Fyy9RSS1b̟? l}-_|3g.^7HMMŭ[$1c-[F~4gdd`СHKKãG0rHtޝѣTUU*z]2Mż{AAAf"C]]4*/++CϞ=3g`ff;ҴX,k׮ɉq7iӦٳgT&WVV 6 ǎÇ8%##{DDbcc!ѡCZ /_X,Ɣ)SPPP3gqˊ;H`Űʕ+ԫWpssT*EPPx<ԾX-׮]Cvv6F %%%:Xܺu AWW;***VZ}U*A1FPUUɓ'idGdd$nԫW/x<ƾ̙3F@@eLI$ͮ\fիƍSNT*Ejj*8̙3ihڴ)j׮eYj|>NG󃞞xT;wB]]111GN@y2766FΝ6^$_~87of^ƃDR)ƍ#ߠ)((___"iiiD"-[SSSsׯuDB֭KoN~t%ƍӧD"!ӦM#JJJ8q!ŋ#G?WK.qשSBQTT$ 6$<{H$ҵkW3FMFɶmիWIAAB#$}gϒ#Gd2|pi&#b NR3qLJDIrr2H$رcٳVZW^PHHffjjjӓܰaCD6oL$ Yl)//'< ="#$:t bBrȑ/ۊݻwۛCȮ]۷oIjj*QUU%N"mڴ!{nݺgϞdդܹ(**;w&MGQF-Zۓ7oސTRUUErssYr%[.~: !!!QFӧ$99B񈪪*9s&133#O&VVV$::Ԯ]ܿDGG*@tuuȑ#9x >9r$!/_&AAAÇm۶ښߟD"uVRRRBӉ29|0%^"{ҥkRTTDIUU9~8QPP 7o&5"ȴiӈ?%/_$&M"BUJժ# iXjW!6SZZA"0c.,,;"g׮]8~83R1(((@UUq#듖/^yPXXiƯMŔ*J8uvAS)_ҒhTXCWW)))A'N{޽066F= uuuرO> +++mo~.<|paʕ4*uРA i֬YPWWǬYNׯ!tȀ&ƎKw"޽!X,Ɩ-[P#ES]tAsδTAYYuuudee1,ڵk_T `'-Z)״$2{՘KJJȢEȘ1c5c $%%L:_u>|HN:EU޹s' 4W;%%ZXZZ۷"ڵkɓIBB:t(!wޑ]?7:uTJvMJzALB!d޽{dŊA9uѣi۶-IOO'ǑR2j(rpBҪU+B!7o$:t dӦMDIITTTTn:JBCC !$ٿ?߿?ܹ3ų>C˗/e˖///B!.\ ]tb䬘_-Y1x7n {{{Z8M"`͚5PQQAbb"y:tN8Aw9{쁚zA'߽{ha׮]4=s4жm[F蔔mmm[ XD#x3334jԈ*Yvɓ'C]] ,;Ǐuex ѹsg3(..fNىyr`H6lONzyynݺ̣!!!atjժ|>W^000޽{i3g@]]Q~PWWƍb S6mt@QQ|!\ݝh$ -Z> &xZl {{{E>ЅCƃ777gNz;wZqq1رmڴ.iyکSR˃7֭8eff8S}5`aaAY4'@͛puuEF(K$̞=<ӧOOI&5Nk֬???hkk3B]vAKK 111"K.PPPi#GLr`l kDFFׯ_:u0b*ѣGpss=FHta޾}f͚АgeeAGGC :?R%̀Z" ''&&&l*]Y޽{CIIJJ۴i^wިȑ# JuѠA}@SS۷ogX4pqq9r$444o߆ i_YYYfACCf͢;gϞ֔E# ---3|aa!Zl  ՅN->|.]@GGr`ؿE{)ݻW _ =zxwF/_DJJ 455dz#3WUaԩS ///X[[3vZ$$$0333?~S mmmDDDŠ{vAƍb0|phkk3No߆%4h8:M>::U]\\`ggҥKq}^ߢe˖d"͛7CSS 9w{EE޽.]ŋQWTT`ȑҥ  D'˗/T&3SNE.]ЫW/:axvvvpss/ 1w\(++c괩+={&Mh$ ֮] %%%3@XYYQ>UUQQADD}߽{޽{SSTTO, FG$%}[nS +++1yd:ŅX,ŋŋ-ʂ2H$Xz5o1%:>}m۶AEEXXX07gsn:… GӀ=77iiiM61U\mٲ^WvT PDsΝ;_ecy&~w:o5&KR1ʗ2zaee%F ,_F݃<==i]XsaԩǏѬY38;;x о<+)^"`x7n3j vvv f˖-xߗ^UUӲ׆ B",`50i$m_X`&M~`ҤIx[nܹs1iҤ/J|K`9&MǏ#33)Ȣ`޼y8/셅4i>|u1fۅ}6әF`߿?<==o^\\˗/ [ѬH$˜1cq}6\\\IeRiii `ɴo^^ZhGGGpz `Ȑ!߼y`24}{T(~}Ϟ= mmm0FCǣ!5Zh~L<ɂ4jqGzz:!=z4c:u0#{"&&C!/k~D"&M29K^Uw؁ &B틬,g˖-ieѣc;<ܹsظq?{u\<%߻w 6!={T&L@ݡsbPRRDlڴ|%ؠUVLMq|]p!<<<РAh"B0~x&mݺ5c@ |x< 8Y ˃?pjjjG`` O^zAAAwf:t"8W6c `֬Y ?XaĈ+kfffp7HLL/]}}Νx"!SzÇcʹq_~FpOk׮1j>DV? w㠦F#S6n:uLoՆ pBhʕ+prrB͑8C7oP[xW|-?~ 4!򞫷gϞQoy6 KňD"o_v-W^EݺuѴiS*Ř:u*x<ΝK߭GaÆg o-_JJJ3f ͕}>>>000)D[BSS bxPRRzabbݻ: ? |>=J8{,lllЦM b#G?P߾WWW4hРYǴiӘb///ԪUhd***HJJ1b?}4ڵkG -d{FP\\]+'|r`ԨQ(..Fnn.|]verÿeeexN>R<~ox5N]~~>y7#tڴituukMRٗSSS&(G߾}lJ<{,j׮ ???z3j((++cٲetsFRBś*ON߉ϟA"W&F //Ԯ]rB*ѣG2NADDuc* jjj_l 셽u֬Y . ݻw#]>|7oޠA8{,v܉޽{իW}[b B9s Nё_o߾&&&ر#=/--EBBIkL: ,`NoU_ 6m SSN:::$l.:99FR н{w\euttMs ~~ҨQܹڵkͭI ` ˄N2%P(ˡs]Tv7770K'Rm6ӧhH`/**dfE~~>yիBx T_w044? n:;8p***ckR1pqhkkcǎ4J.))ņ >k022B&M(M)))5N[.xPC]]SLa/4i:u0000`Ν; K?"115Nhܸ1xIYYϧ!庺@r`}̘1)B"VZ Pe-99<@DD p 'N hǏ8p TUUuVtgQUU1cƀ!=={.֭˰O$ q&OL>~͛7âqwwq ^2QGxx8c mmmFt9hjj]vᇬjVVVh޼9=Fɓ'!-->\]]._ اMOOO[A]]r`޽;9y$455Q8p |>h˗/ ZFXǃŋ?Sxܹ7774lؐ+Z'L@{ |}}aggK.Qٴi8àAÏPrÙ:z C;wӪ*$$$P搬]~vvvh޼9c1m4B0{ly*Fnľb br`?dQyii)"""}ѾN1iE$aȐ!8ׯ}\lْa3f _x???XXX0B[Ghh(A &uF Z:ܹs@iE,#99\q5#v9ˁvYc~%u֔a O^TT **F啕c_'O%iDOuգ٫W͚5,8s̡yG 4'J|r|5NUV044)Tm۶AMM gG!!! ^֭B}q 3ܹs/ۉHR5 1[oQUKRy._eZyy9|nKJJD% CCCՋR+++ѣG(((tT*ʼn'`mm;R 6l|>֬YCڵk[.H$ӡٳgǏX,FFFTUU1zht҅-Z~  %N$88T+ Jq"<}zzz% ^zMbΜ9ߑgϞaر?߾}0#11&>|aΝtV\+W"##Wӧ۷7o 99 .'?~ļyK?ϟ?G||<.] ƏvYĖk׮aɒ%D\\3ܹ@777sx FJ?ǎ諾V\ISxxx[nx=|@pp0߷oLLLNNeee:sX|yX[[u PSSc߽{7SRR۷gϞ|>6mŋPRRž={hMwww<}M6)s΁8| .!!sΔZ~}̙37nq=ҢE`ooT=zN: ^zpwwRg<<6n܈t۷/R~-GDD 66bN066 6 044ċ/0b:u 3Sg8| bXXX`ʕ˃ TUUwwwlvBǎ 777ݺuC^^Á ڵkΆ 8ѡC\rpwwǬYsDFFɓ'z(|WmԔ;v@GG߿=z@__{'`hh:0Æ 6233iׯ7,rL:Id޽;-ZBf͚1b6l BN ###=z.T999Cxx8U% &&ضm[Aii)F ---dddPe=z[n#O"-¦Mp deeaƌ(**B\\O?|~Ν;Xp!?o>:nٸd^\\%K˗_} ~aaaxgx<<~;++ [nEQQB!\={9~MƢ6m4h@|ao޼qpEdeeݻJľyf,X7nŋѮ]; 2|2 [[[xsAaa!S" 3'OD,F/_DQN sN|DGGӈZFFFɓT$; MS7ntRܿX,FZZ|>&OLʪ0VKR_|>C kҒ*YOЭ[7FԷo_a׮] ^ 0BRZ.π+++ҳgOoj۷o'1WTT'O6mk,INN W낂#Ҹqո_Ntttj ͛7'dҥۗH^^ٸq#"8qٰay1֭]6x۷$##о{!ׯ_':t #<|,X(**aÆq9~89}4iٲ%"<B2{l"JIBBQSS#;v aÆϏpGR2p@K8#w%ޞѱXyDEE3s3xٳg$33hw֭$77tԉG޽{G.]J444H\\x8~r%Ҷm[Nx<$O>3ɾ8hVOjll\޽{={2u#""ӾN)qqqx9˗acc___(%%*>cɒ% ԰Cڵrԛ7oqԟT .Ã?x TUUѵkWzPZZh(**b׮]abbS1r`ؿKNNƍ7вeKԪU7#..1ر#}ACC=z4W >ם:u  b233i߫WRw7Yq9s0^^^pvvƭ[h˗85/ೳXf *Ã?rtuuѭ[7CƃN֐h.v9ˁ,+4o[*bӦMQv߿G@@p)7''ٳ'Ãٳ'x<J8uTxxyy!//{D"30k,WCƍakkPX 9r$]ѪU+Q%T*Evv6D塡PRR^R uFyB111xغu+yI9ˁ]?001e"Ì򂱱1nܼA#je0!!}@{S ѫW/T:** 4]!JqIX[[# ) EEE^Rnܸ'''8::23g΄2fϞM'OuAON"PWWǘ1c(E&tե[n.H 𕕕ׯ.v9&q]ܻwk#ob:u*+)7jfffS$aڵARR]vc~׮]TZ\---(9ڷoϘ_$%%ACCWQyӦMQN4jԈ^eB' $tJOO&Ə|addDiLR_`TݺucKZl)v9ˁK[II :uꄘ>}&L#G}?z<***ke몪*̝;3f@e˗hذ!j׮M^,cժUgAAڷosss&EsNhii!**Y `hhݻwEɓGi$&&BGGѣLpB'*t Xh444Bw-o޼AfPV-&߰a s055ő#GBo>k׮<#v9i|2F |'Oƛ7oR"o߾````⡡wwwZå f͂2RSSijӧhԨ(K$Z JJJHNN kNv킲2(gϞ066fN:r ƍi *t.8q"԰xbyx.XJJJ4iϟ ~Æ PRR)۷ %xؿ?TTT./mEEEٳ'>|#GP#c&&&C^@ݻ-a! 3g2U7n z.&T*ŪU񐔔D˗Сݻ { ,t:uTUU?)Y𡡡bc&&&hѢMTUUaXd \ԭ[ؘD" 񐒒B>y>>>pttdoܸ<faaa5L.H0{lL4 ˖->l0dddПoݺ'''4i҄FRg!ӦMcRX͚5Cݺuq55k@ABBW^cǎ077gh={d܍"##!ӧ!HM1x`|lڴz*~L0a…{hϋ-!'j vvv M2++ aC#C?~/h"xxx`^<,XjjjlԨQ8qv>G^د]FaܹHOO鏷o"(((TtEѯ_?BtR۷F1F!&M`lْ"'2:YjAAAg>''***d ?"##O> ###2BCqXn{LJq72e !7o훛ƍՕ ?F~ii_Gll,S~SN?&SUUf͚ݻw1|oݺu/AaL`J~vy`!|||i&zRd/ !ue" `ƍxqq|YY$ՀYYS`۶m(,,ƍg왗cРAH$رcahhBLMM)| `bR)&NB.\HLZ#8Ǐg‚YYYPTT!kqq1,H#**GGGӰBBÃvu7iKRL>̚5I55i X<#F ۷oCCC&߱cTTTCWUU!((Ϟ=ý{0w\cĈ 111ƈ#hE?{  7WvTʿ:t l`1STVV2D"H$ QY{TJ}8SSS:}M6!5B||<>-ZpXI&aL-899}6d(**b4Wkx{{ؘ $ !C0<:@UU'O'''FFFٳ'ꌊχ{iԮ]EbrJ:geu $1sL|̜9.TO<'ԩV\ eee ]]]H$ؾ};ѿ4hǤbD"~oI_2#k] ڷo۷ݻ3?~={ˤb֭[w k.t=vڴiEuիW Epp0Nb }/`ONNÇakk ooo UUU4iTTT`EBtqq#FPŋC]])))޼yYt::@CC|uSu/// TUU?LZV-oߞR+++ \޻7o 69*BUUf͢QӧOڵkEM$aŊЩ>>>U,c˖-ݣpСt[-o ݻw!tB˚X,ҥKsU}ƌԩ$׮]#|>^o LOc"dȐ!/˽GΜ=CƌǬN @ȓ'Oߋ/HNN=z4sQQQ\vIKK#e˖7oސ'O---rJbmmM())3fKKKr9{n2`R^=r ҫW/" QVV&Æ #FFFdϞ=̙3d֬Yښ>}PH:wLHϞ=Yf sٲe 100 'M4!eeedĄtؑHR2o<+r9N3yYd -[$޽#&L ?~$DYI,^X[[[n,ҹsgҰaCC2x`" QVR&'N$D__>oc?rDf̘3f`ڴiT -*~93ÃGVXKKx*Ǿ{n|p &`…5rnrҏͱj\{YY>m۶Ѿ/^9?OD"=!==}6իƍG7o!|vh ~ݺuܯ3((&&& M~"##i=z􀚚rrrh3g@GG4_YY!CaÆ իWQvmlْ14i!HKKc*=<<۷o﫟K BM<d'N_qAV(IR?"s v0a]=VZښM6aРA4@k׮UZ@={Ǟ={755EǎÏa>k֮}]uۛPٳÏ&MٙS9ˁÇ ۰aC9Zbb"G>~8o>q^|hѢ4i8CZZk޿53UJR,]<ƍCs-[Ą R)l 44* ߿?wyzǣ4I[[[}xʓqq݉T/ 0sLP=~M6 n߾-v9}ݺuBTThÆ CVHRǎBBBhDP!Cc4Br ѬY3E"LTÇGGGJQ}UTT0n8}͚5!E#:iii1B>cǎPUUʼn'u=z`|VϜ9:u]v4$ 1|p|X.T7o݄ 6lH5HYfAQQ3f̨QS<#)--Exx8G9+Pyy9 555_ݕ+W`ccf͚1'OϟOѣGpvv#tZd &MDyo߾E&M%k=~z">>>|6С(K$ݻ쪬 PWWǎ;hYm~W|R嫩1B[ni֬YPWWǬY"Wˁ]r`!-!!gR\\Oss>=z( DY?|!C@GG6l`wYf5NXx1./^-Z4k֬ 8!uVVV8q}{쁚zAݻwv&ڶm$%%A[[2RSEE&O > طoΞ= BQFA([n0`D" X;w`ܹӧB~ ;w˗Xp!!WbccX"DEE2H`!wƦM{n(++uֈšCDJذq͛Pd:t=++ ڨop(BD" +Wn3?ի/^ eee ..Jǃ>C)x9s&޽{dDEE0ٳgpssCbb">m; 6|U%m>}ҔI~~>0%%%8p uV&EΩѣ 5)H9scݻ7?~&M0R)֬YpתU|DFFҔɻwЫW/`޽3gɲ= 㡮7~6mJ5SRREEEeY ޮ];ǁ8=>nܸLB۷xt۷o>b|D^6i#G1Bh#]GGP5j!5Fe~ĈXp!fΜImaaEؓ(O>U9W===}(SǡChcǎAEE!!!4G***ؖeu4VaԨQxXlS܆ܹsA'훗oo333AA||<_FPP)ăx` ?z -->>bػw/N>ŋӧQUUtgϞ2,Y䋷_9s /^K.a붭̸e"gbDO<ҥKפb._ŋԩS²e˘q?yYf&kϟga~T*~׮]Cz/^{۷Ν;CkS1Wŋ{\vwuZ߅ qF\~0Xw^\\ŋc͚5W}W^EII /^UVA"#yŋHЖ;w fff L_{{t 8x { hii!44 ǣ$\t ƍ!K,}o߹ 7774lؐ1pss!))); [[[fǸqFp3;`0~(++#""D>~((++c޽ٳgahh;2 8^~x*?<O)((@@@tuu߻w/ЫWj',[MLL^?!-[dv))) 0?hső%K871hݺ5qg߲e 0`P#88<---tޝ1wS^" ))QTL۶m!U^z\PP՘KKK!>ML3gTUUA$!77۷iŋaȑ(++H$«WТE ZkZ7++ ***߿?!{t|>G}srrnݺ͛7D@TT!8q"=>8ynC ! <жm[())1״g 22D(//GqvE?~h߾=={HD!XjB!D"\'''4jܧCf_JD"|ݿ? йsg~"ݻ7!زe {Ԯ]x1^f^$#o׫Wh޼9 B@II ,`X prriH%K@UU'Nd^^^022a^gHZu^qTT!xyc#BdffBSS2sdiK$ܹӧc޽;?iuSPP૪%%%dff3WM4^PSBII Epss=^MM Ǐ̃$t200BXLϒ Bw"?~D`` pqz999011Add$#tӧT*ٳNmڴǪ*Ɂ].seԪU 媨@JJ 444h"@x…2e 333@!33:::HLLd۷^ CCCDEEH-))zD"Za~~~ٳg۾}; ЧOmmmoرc033C`` ?S!n:zyUX[[ˋ N2?>wNN`ooO*,^*t211a~aߣcǎc~޽022BDD]>~>}@SS۷ogX4G~~\$ovvvشi}ad͛3 &@SS} ""FFFO,===2CBWWׯڵk066F&MTdFjoouRL褡QCkkk333!ycǎ033:T{B[[Lһwo0BgB___N;aРAÖ-[DtТE )++Ø1c >ԩwww Bf͂2fΜ􄓓xDUVAII IIIkN/;~WVV~1g'OgggZrV,cPRR¨Q{%QN={>l(++o߾^PPBcǎAMM AAA >..:::ի000@f(s7njƔ*;w.0uT:_={///888|E#`ڵPRRB||<*x aee DDD0B޽{А:#v9TLII _cx'|EEF EEEݻwakkƍX,ƬY0c 7//^^^pqq@TիW!11/_D(T̬Y@؇ 9s0aԯ_hR)/_Ne}?mƆF'}({022bhǏ2?0p@c֭L1CCClmڴ ѣe˖ѱݻw9xXsaԩ y<Ãj(Y7|_TTDKݻm۶hv]]]҃RBII ٴK`ll  TS]z-ԭ[pdΜ9 `ڴiGV8@_ׯ_#00B3fI0i$n%`OLLTz\ >>/_}b~Νx|QQá]`)++C-[о/_Zn~;aҥ;wOOOuJHKK!'O}?~ 8::2<׃8 o޼AHHLLL}ѽ{wCؿI~q ,,q G0/^DڵGY cǎ)}5#ϧً/0 6lq|ysR1ŹyL֮] 0l0}:t{쁒{PQQiߓ'OB__!!!tYUUEz{ƥKcĉ5wRÏ4|}Zn kkGIDATk\tڜ2BBB<555ӅJ7Mȶ Q" !7nd"? G^\4jգ9R/#033c"͛7CQQ ¥K~9r{||<ݑKq&M3hVVV4&f0tPW|1@SS~ Iyy9"""ɓ'i`qƴ߼ysWJ?o<ݨqƨ[.\lz5Zn &ߺu+ѿzNSRR`R :tzzzˏ{x***pAUk[ZZ~r #3[^ #b1&M4?xprr[^"ƍG7oFFFv͛?}63'ŤR)N8Zj!007"ڵk)h_zuEӦMsiӦcΜ9t>z 6=]$ =,3f ͕t)HuVhjjbРA >88ʴL\#22رcQTTϟCQQxB շvT< t`:t(JJJ **SXX>}'ODZ(Wk"2t jjj5!!!4!C(\|h֬ɓ(<|...pttb:RRRL$g*t{֭[hԨߏ?P)..QquOY"Eݺu”]`0e v^BF`ffF=eP[[III޿6m@SS#D]v{fNPSSRǏHHH ֮]Kk`oo///fN6 ;w.yyypuum #tϧNn SPP444pIHH J퍜:KKKB0|p\p᧧bR)Fܹs&~aĉqAApp0ӧرco 8=25===۷q9cccǏ2d^+W`iiY@aҤI5NpttdN ,&N|ƍannM6}` x!^~Mx9JKK˗ѣG.`4jԈ\"::ɚN]R1***!77666pqqg-7ofΜI˗%IQTM6022b~ǎC޽鮥eJ?~&&&puue/ϵѯ_KKBSB `t'GGGc)2СCn{PP =//ZB߾}$ m]]]B`ffSR1o߾E^^_eǏV2JUs\\˾-,,X ֭LLL(rZZZR+cN2f͚1B:=|666W#t;w.1}t t/_W{ii)_ x7`-Two߾ [cӦM҂-\UUl_x1c@KK +Vg"Uׯ|jj*}ѠAZsHvPSSȑ#`lӦ pdl߾ݻ7>/066޽{iT mmmtؑ^wII 㡫8:I 0B<ٙϟ?ZdիWhҤ lll ]n?;T6msOeu544~`~ 6d=zoauV((( &&233  1h 0P d_^^ѣGCUUT=<<>oEB̞= >}:D"7IBڕ+W6>nܸcG'O~ԙ*<<qqqHMMEfP\\={nݺ DYY\z5}vwEZШQ#<}ӧCQQgϦǏ1bї/_m۶SxHMAALiH ''z&@$ZZZؼy31447~7nݵT?3G I̓LBӧh֬q]\ >CB(uTxyy۷%;vǣPxx8ǡP֯_?|lݺt,,,GY=bc|Ӿo߆+<{RV}5GQ[~/:I`13g΄#v9p:w`B%Jaoo8(UUUaժUXjk׎aK >aŊܼyNNNhڴ)#R5k!1cC4k ~͚5 0*W?י3r:{`'OҔbuÏ!++|2ЪU+z0-1~xB{zΝ?5M01hժlmm9(DS1o߾E@@ ߳gѫW/-[nPRRb^'N^P(ĠA ЪU+IRL0,\{.6l777ܹs盲b.^GaŊx={\###gfD%ƍh޼5(D5j"""jԳX%&&2 PvmSJ=z4!XYe`Y.RaѲhaСL};BWW999PUUEϞ=DS"""O:cccmnjÔːMtؿڵ ǁc5WwV^x8QvI^VNKK LTeonnb0yՅN'OqHKK/ 9Q"C*B"Ѓпecdd$^cQ+**bʕ9Ư1c6lqﰷ?~<8ŋݻ2B aĉ4 hL7BYY9_(..F@@qi7''s'O4I^"PkҾ׮]36mM0{lz=zD ɄN:|>)[jǧb***PVV_?](>_s=]*Kv&k111Xn444HbiӦ®]h}wEݻwg" Օ2>Lx#5kFAB搣yvL^\5jlق:M 8p ŋaoo-[^$a„ XhP߿777|>ph"(++#%%Ԕ:mܸέ^}PSS߫W/ٳFFFի#tѣ{n:_O8kkktؑP(İa>~uqt)0c (((a-]dl UUU=⏼/%D"VY]@~~~a~044D߾}iDTZZݻC x Myy9:֭[8ؠI&媬Ĕ)Siqㆼl ԩC[Qo7mDP-N ŋC(RwttQZ]&ty&k׮c」Jnn:MA$"(b@Q A0af1cĜsv cΘØs.۹1b3Xzz[o=XG###ԯ_)H,,,ʼɐزe ݥbccʂ6lhѤI ߿G~ `&J*:cB `ܸq}uu ^``\C7o*UP*y:t`x۷Q7n!;v,#t8 ||)^;#""Zp͛󑒒~$%%ؘ?|0$ ;tXz5˵7nL{|5kDaa!ON(5>FԩS1|p4k֌~n*hժʴMӦM~اOAaԩqt邎;̚5 yyyHKKݻѽ{wSN[ҊIvYp!0\E#h֌͛:0]6m Jur/>~|,VJBHH tR>}jPXXHi?FDD|}}qY`ڴ19~mlӧOǞ={獨W}GΞ=ׯ_#!!{-[H'>KCP0o>r2t؎;B 0'`oof͚1"5ήd W^u֥ @A~~>ݭ[ www={Ȓ%KгgOzxZXZ0_~>ڷo'%%>|&&&d?8{k3g7&ZÇB}j+͛7q[inn'#11;wFEE5kFnKѣG~ʟ@@hh(3nÆ د]B._+WRjyڵ+mD|b\VVf͚1‘I& U9wApp0T(.]#y9ZhcccTZ{m۶:tVVVh՚ncU*i?>}EUVL>v ZF!$$X`]k{͚51vXP͞ŋq]tadee1[[%b>~PȨsss2"Ν;1ɓ'ꊐ/^V-FyjL2#F`#AAAcz˗/X,FϞ=HxxR)xNdbb:|P_؃M VB||< 553g΄##Yv-w:u!!!JBii)j׮P`۷/:tdfqezp~/_BÆ )˗/i&!##! }tqLXr\v5;l0|L6>k׮Q1C&MAfN+WD"Avv6sӢE P{Ndjjdʃ/++Crr2|>6o?|0ТE; }g7P|HsZ1eee(**BIIIZ\| ...O+ڭWz^:}8pX#G2‘ڵk(,] } )k"D"ѣfpߝZ=S\\j[߿g>wYY8&߮;v~ x%GL>F={`ggޭ[7B,_~D p~Щ ÇP(Ĵihƍ񁧧'Æ CBBBe֭ +++j6R|r 7oTJ^Vc˖-DJJ =.))Arr2D""""B,\.Tϟg+;ۊ}~dܹ{O?]}b2k,|把 N D6lH!ի$**T^,_rRPP@-[FI֭ !͡3^:JŒ3  1x`߿O-g?NիWC("++>O"!!66:/̈́t&&&ԩS+tJ:B*U!!!<~xD"7wA@@<==iFVc ɡ#4oNNN8|0M6A$!%%>ɰĖ-[R)"""VTT^z+V@ӦM`|`W*hڴ)#z-/K@Ƥk:vjՂk4̝;|> PR â:k#n8pm۶A m۶ k#55J=z2 aaaL n^ `oo 8cĈ2e ???Jӧu4h{]jժLڵk󑕕Ex+++Fw^#&&feeAP`Æ L7f?G.N[.eT*7|>cǎe:u0y$,--ѬY35x:-- /^' &~ׯ///&~Ջ~ЦInݺ<8z IIIP(ؾ_\.GVh{G+V P0ܿN|N82g:ŋA:uĉAQ8`1:wL/^ ::FFF] JѦMK @= DDD0МBܹsS3vuCnn.#Rk޼9矡W'ڽG`?Kwԩ|>z ZAڵkӱ.])S@#FgΜaCvv6 mX$z~[oBz9@dd$~`23a>%&̌3˗/Sv”)S0|p:ݻ L===tޝ_|r-k\\%͟.]`РAsgoh׭[H,X(w SSS$&&R+//Gzz:x<S=zgҍﯳ8_p5j`4'fOPTٳg8ŋ!лwo~1ؘ[6C*"--%$$@OOI`?$ǃ'qq~i\m VFAaa!x< 4nLj*k׮BժU+H$zDR0}hРܹ4T*,;Xq732dhKKKRTXjd2wN]JЉkqB' OnO粲2@ PAVπ}֬Yt+ B#cǎbOHH `ժU9y$\\\аaC]1tPbL>V9ׯ_GjPZ5zhU^^iӦA*"??95#tZd *>(QvF_سgN:#G~Q`߸q#`ffF@JUV΋ L}ϸ}vX[[M6`ڵtwUM6RA,c._ OOOԨQѩS'=ޞVXp! ѿy%BBB`dd6l@N{J ݻvvv|II !|rP>}kYY)FL:n޼ oooxxx3rB*btcԭ[8w}v˗/)""2)99!hۉ7ope35...@ll,\EEܥ3+ғ'Ot1xx̙: ժUc&MB(<|5kք=.^ PXFFF۷/aaa߽'OP^=X[[3ρDn{֭affm`ff6m0;֭ch666 a( Bܹs|8;;Gnn.?~ &@.c„ רQNNNwͅ"// hҤ ,--_v-J%233k$&&۷o ޽{aaa(ϟ CCC=00vvv_>>|p(D'-wss'-HD'BW]6h%:1k.ܜ͛7Sn! ͔^TTgϞai CXXS<o/_Dxx8˜oxcǎ-",, 111%OׯG˖-PA]*v>O{xk.( 1m.@a͚5L +~-׮W(ԨQsJKK1~xHRFt=jժL?o_Ǟ^zAZҥK!JѣGZ1>}[-$r9ڴiÄ_tQGtQ#$$ .dN}gDd}:t.T7oL&Crr2޾}u[1/_D1qD8pngmgCAHHi֓'O(3##F!pwwFAqq1z񜻣!}%sceee1c6l0 $רQڵ BqqqWN`bb37nL?ǻwпH$,X899QO n;f֪U L~޼y ^TTT:u ڵƍqmdffJK1yd!?$;w~htRtޝǃX}vM6 >==fffشi}vǎB'-rrr SϞ=!PNʖ*++C~~>B!&OL֭[Qs8V1k, 81kڴ)\]]q1zk׮233S$&&Ɔ:۷"QQQ:B'cccFtiZh ̛7kₚ5k~h)VT 0fz'j׮[k4,\}Cʃ;Xz7o둗8̟?yQQB!!W\.G߾}1p@t7nD~Э[7@}ԨQx K{DDaeeiBN\,ر#d2~gT*Grss!`:ҥKpuuE`@F82fx<7 PSTס} `/**BNתUvɓ'aĈ:POOOz]n(<~ѰŁ&@ @bb"_zT 3^zA__K.ANN^z .AAAtUQQ|xBDEEg֭EPNfff a@sұ/_֭Kj5&LѣGӱՃ7C]hx<zÃwpp`X4_b/))AZZ|}\?]m`OUGHܽ{_sCT>.500@ll,CQȀ>C;qF***Я_?F8TRU@ʢ#\EZ1'NuER@`'f͚LAСCz*?uxN$11سg{d2DGGEtʂ@ u4'OBCC7nd郴4Btgԭ[.]޺u 4CҮf>:p͛7C$CBP<3330.]1^.I&ncС:%W\8k~pg rJ|tڕb΋/u67`u/_Ps~z\|_6l"##ѠAFmovJ@F3a 8{Ni&rddd0ckkk2.! ƍ;2aڴipf͚aNӧOСCizҥ/q u DFF~}GIݺu˗/{;w.O 'O $$\1R)t(BE{nXXX 11OfD5j+++ʀh4Xf b1tBoV߽{/ݻ'OfTTq-ԬYb~gffmZСC {ƨQ1O>EvܗlŨjlܸ&&&(|0469^vBNyy9v ==O*aàS2b2ӧOH$°ap/cR[Im6L07n }}}?o޾}5kք ]T*Ν Q{6lR֮] ccct҅.o߾Ett4D"=?N666W5[VVLݗFcǨ ;)//!0sLx5j`/&O P|!N:+as>j5~g1Bi4%M`ppp@TTzzzXt)]Μ9ԯ_19r$0i$Pݼy~~~pwwgy3g΄X,6PPP,,,h:{UvVh 6Đ!C;4h_=z4au>>}N::`022d@5kwZ1&&&4MRaڵ055EVV ňB`~ݰAll,C%ڵ+R)VXد:;;Az*))a H0}tv///v6m4QVׯѼys=zطonܸe˖}vVLii)ƌT'R?QzuP(//ٳP(0d':q#tzM`hh;`eeX{YYYJT蔛۷ M4XRRAA"`֬Y^ 777Ѕ &M M皶Љ۵pB'###׏;oڴ)#޾}jժA."N;utQ{=wTKٳR իGwJKK1rHHRL2f̘\#F0Ǻu2JVJe˖AP|=`/..FժUеkWܹsPdkkus+Z1|>SN۱+WH$;!o߼yCÿT34jj5֬Y###tԉnzsssJ;111EEڵ+rJ Ng͚+:}<ڵkE5j􄛛mrjH\Ψ!'O ::vvvJD"ABBacǎM4ItR(ʕ+w?mpB'DI&1R0{lb1kӦM쌣G҅jݺu000?j۶-}vzL&C֭`l(J&̙3055E?(߽!0{l&>>>FAA 0zOL[;k122?ܜp/ݻwѤIիWS&~IeB +޳g Pvʂ|8{ÃIrWm?xogo(Y?֭[ȀRĦMǏSK>}```%K0a-\ע)//ǨQ 0i$zQF ll0`> +x@ @FF]8>}6mʊ)HH֭[3 .]А:q߰aCg)//BsΥc]U" .'N;}ܾ}?>s3g!pLK͵hN{P(DLL CQ v'OBCC.u߾}1o޼0Ξ= [[[4nܘ +**0dj񩤆^Ę6m?Dƍʕ+qCGLL Ν;@@A͛7HKKT*exǎ1Z޽!xb:pqqAPP=?QT駟0az7n@@@jԨAm&`ܹ _~?CXXSSST-x<3mڴ vJe:uH$bCO%BBBy1{l:B:uFAAk4eQFpD{pă;;;FqF3 DŽr\Θ,PɃGf֝BЩSߏݻ1gΜ+)V1bB0yd:Vu~8s#W:991+V0ϊ矟Պ<[n@o䩓ynݺ=[b2'NADD#aɡٲܼ9wQNJS;v,|>ƍfԩ\r?>ѯ_?лI&P*:B'B,&s4&&|> H-33S'Z*BBBh_x1c+W5jԠ Z)S@ `ȑXagg-[X={"&&>˰0d2he 55sM}nnndH͙3pqjܼy ҥKˣ ̘QYÇW!} ?>Pϟ?OOOW̱cB$aܸqݹs~~~pvv{EE͛LCNܽqB'FԻwo16v킭- B^2U?WWW, P(d^ oooT^qV2e  666:a- 9997zf )sB'sss3mvA,|RF )--E=  +5x DJ6_3-V777ؠN:x!>|7o 11%!"**M+`/++vGGGgϞssg~~>1sL8;;IT\\L_o׮]!x<.\H?w+Vd;z?/++C0qDr7F#0o</^I&033c:eff23 {쁕~tvv6r9oc`ӧ5_>accÇ_P(VK׮nw~)^.T-7osss!˱pB v.\@*UPV-&j̘1d(((@iY)jժJ*1k,4h O vJw`o޼Att4J%;v쀥%h?;pT(Xf }vIƍN8G0pի;4ir9ԬYQ&%%a:̌ 6Ԕqm۶022/B+3Y[jż={\.ҥK@FL)SU+"4my&&OZj!-- iiiXf ޾}Mcǎv066ŋi… A@@F\.gN'(YOLaÆr.+ ѭ[7& ch]x&0++ e033cCCC̛7իWiXB'LGuܹd0`\ {{{E~z( 3A۶maaa_~gתU+xѣJ%^>{,V4c jrg*J0U`~~>b1pmۛqB b2M4\fBdff҉w {X,Ftt4#tڵ+x;NôhN PÇSwF>''ӦMP(D׮]cΝ;!22ajjh?CCCF[Ogr888f͚0zhD"L8ǟI^4ś> R 9Bc Ƞ3k׎ yZbNU[tY!((5BȐ!CٳgɨQH !W^ٙбSN%w&999$88BȳgHFFQ(dD__BȲeիIǎI˖- #߿'IIIDѐe˖LF߿OΜ9CZj]#'3g$K.%"Bڵkɒ%KHJJ !<dRRRB,YB!޽L6lْdddGN:3g[[[B!'N $00ۗ>ժUCz7aƎKwM˓/X<OG8ҼysXYY1i&#--y H$:@Rطok׎&''C__[n~%ZjPC{ 0Ξ=Kř sssqE4 k;;;ׯ_@L \ƥP( 3224ǏaaaTVѿB0g: 85J'ݝ[x1x<zE'Oe˖`~֭DHIIamB$Q:tb,u[>WWؿLŮhpAx<5(iРhɒ%ի={9add-[ ɐT9<&l) Hp!;wIII1%%|>oppp@-虈ZFNN!L5{9T^uY;v,Poݺzjժ2h0||z82B7:+rgv_{t#.c+6m43fб/_?p5A`ʔ)4[V;#88qV䞑zA/_""" xABk׎s̃'`"޺uk>YfщeԨQLɓ|-00yӒ%K HЧO(p LLL^1q}}vlbFm`aa$J}5 ~W8;;yp_FSP/\ooo ^Ra;v,?k׆3mѨj6Էo_ vϟ?G&M`ddD #++Y9v_R^^Ν;C 0*'N4.VӐ!CQXXHWTjUT*+fz`ccCw-+T*E^pH$NfffHMMeZfs/NVZQ`EEz>Xw  aXYf1OOO0bI&A"` vvv: իW a*x$ѱcGFԦMSTT-Z@.n +++oߞqLMMi_cexc!bΛ7>/]Q2n80BwNNNvrss3̛7rdhЉxJ5k;wfbcc_mS\|عsg`ժUt:q2jC X,f@ 4UFό1uTHR]Çkkk#tz5 P(M6iii))) [lJS˖-%L"88X'/!!!X&// saux&L\.dNs4 iKKK׭[R;͛7ߤsGm`炛?,j/ѢE x[l)T(JϴB_amm0F,ӷo_b]xR9`0L4>;w|>j8ӧammUhd6=66صk]v sssQ`,**BΝaddիW{>y$lmmѰaC}DVhn >$K ccc$~7d2DDDݻw޽;B!VXI"88.6l|>MX֨Qk4L><OߤI14UWQ)mbhwo޼AFFd2t (J",,Drss!pB:ŋpqqAzp}3f x<ƏX$׮]>>> k޼y`{vGĘ juڵ)v3' 55s9sPJB  O?1z-4"GMt~ d̙3m۶<33oîS`W*HHH`(jDpرc077GCNN5-AAApd̘1 `:w 4o\Gp޾} 6;N9M|ٲex޽;v[%*yh׮㣞 jo-[d7={,=ZQ}I&ѱ׮]C@@NǬYtҸɉ_n|>233Rd~=000@\\㣞}}} XYYU,k~<qqh4?~NA?yY\޽ѣGhٲ%lll߼y3RRR~% 881K6k4xyywwwh4gϞz`z*ׯ}|qb B|>?b߳wwO G;F‘~s|֏#'N!?oF PjUWU{KWϟ?Ν;QPP .ܹsSsfȐ!LVgHH"Z ]v˗/Ѻuk( \.G۶m-cҧRЧOBY;Yf^zӓ:iWځaaab~ƍGFF9vZ#Ǐ3BCCAoqF\ &O BFI? J*kٲeѣQ=-[Rd~۶m000@B+wbʕewA(%ѣC*`Æ {ѹ۷H$x+s[1_dff1uǎpdx5k\#tFI+{!((LҥK! ѳgO>}qݿgϞ12h| 8.T=BF`ii3g{^f ХKF bh8Fڵkǀ]jj*|>S,o33_q5ڵkT< c?Q^=TRV .rrrPF? \ ===Fw^X[[#.. ҸԩCǞ#;wƆ2dff2>ǎ 9ڽAA 0 W^|||hSLP(D~~>#SlmmVҥKa``_ FJYfA,c{ `nnNjWieW\\V*'h4ؾ};tNiiiLB~C*UFN߿?Ν Z\>|ިY&}+**0ac̘1޽RpB(fpB'9 󁸸8Bg!66i@OOs߰aC&bСôizuԨQժU¼ L>"ÇUG+++ZT*j{ܫW/o޼A j*tA\`5t>Ͽ صlqqq8<ڴiÌ޹sg!:::EqUwT(?~NNNhܸ1#4h$ fΜIWݽ2@ tN_tRB^'`wss Q^^3f@.c 100 TTX|9J%zxշj FFF9%cU[A&aÆ !5ksccc .]BժUAPV.J kiԨLMM)T*ҩS'B;wuݰAll,={Fi]vT*ʕ+3СC!HPXXHׯ^^^ܡ SNL&èQljNXx1|0S׀ݻwhРك;wVZa[%=99 %q 9\} 𖖖hܸ^ s P? طu}6oܸ 6dڻw/i%9h"ÃVeee2e r9|ԩZkǾi_x-[ʊn R$~ii011ƍBCCo:@*2K.i̘1:Bwzpqq:=}5-SsΝ;S`|%aaav SSSԨQZ]tRdO:+++3B!CP6WRժUcN P(amm gϞիw %%HIImҤ ֮]{۶m? mll ѭ[7%+ޱc$ txfff022 P߿? 'NLI"N;wKJJ0rH\p^Byy9QVV z }Ŕ)S(+;ptuueR(T&[.ܘŋ!ǏSۺu+$ P43#G@PPSnn.޽bɒ%/]D>??SNFj(sm.X!C0Y5 Ӄ_z5b1:wLӧ-xUR)bbb(z ;wNR԰aCfw\#trvv/3|,tY&<<<!ѷo_v#ԭ[󡯯/_B **n!7`x<b1#N.HBՋWqq1uF <cƎѩU* ɾ+|t֍? 9crNBNFFsc?NN~/999000ŋ)\t [.=-//O?@'BR}qVLYYvڅGaϞ=>^~?) ̞=k憀`mĉ駟t'(C`ɒ%ٳ'}v>Ddd$x@v1BTb-LF*B г.S"lllP^=&zԩS}ܸy>>>ZFaa!|>L޽{<իWSN 54>>*Y;tXZp}FFFɓ066F&M~A$at,gQNڢرc!0n8znB@@c Ugܹs+V+rJh>^ԏrAFk׮]Y+{6l9yZ``2K.̄%k.!>>C*2TǏCT",,nyKKKѧO|,Zab ((Zѣжm~={6˗/ uԡ *v#u<===).[ Bwuְeh۶mOׯ\ΰ8F֣G,_=wѰaCF6rHx>ػw/gB2, j}jffP@9hΟ!ŋpssCzǭ?:n8ʃצۛ.\cR`׮]4y&ML<&OGt*++C&MЬY38::2ڵk󑕕Tv022b~Ϟ=Jg(j̄?ؖ*>I;< ?~wV1dBCYSVZoڴi `С:N:}Jgqڵ+m <{ QQQ055bm۶io߾EJJ B!lق\z GHX^^^za 0"~ L0~:M7ϝ;2Zt=xL`:lذt@||999tz)ajjM```4nݚ7! 4*^]]]ux\XXH^rehM6 <Æ cDj7Ξ=pw|+V^d 2@eeG? fff۷/# a5 6nBL===&gX[[3 ԩ}_pVib3(]r~~~u~Yxyy~LiԨQ(((͛;ӏ={6G'OQF033czk׮L&cs PȰhv KKKmۖz-[ꨐ9{߿?|>̙p2IVcĉ駟@8991a--H$b\1_xMА<bdd F@$[[[0у]vgN;6lH^VSOS҅Y&UF+x,3MAV۷o333vܹ3ؿgdd`d0`?FATԩS\nLLLйsgF8&! PQii):uPF1C P(Daa!3g|>|:vE`` Ur"aq򭨨ٳ!J1x`:>}Ԕ<獮T*uNH$֨m6X[[m۶h׮^zEm&D"h48rTP^+++À  1g Zjc/&LX,ѣFIZ-Z\~1V!!! `Æ033Cff&^pxXLN111 )--E׮]uLN:UA:|pBL6.T7nT{zz2BB`ذaؿh+gφ')T*^ &&&ڵ+#RdLΝP('N 6d2L&̙3q=Rо}{ڵkx-z聴3:~85j?K.Ev퐖pi+={RIJeF^FBVnnnLXĵ6~ҥdѣGFFFANN.]J{ܳ(fff eѣ055eNׯ O'?:iT^u֬d4huwwj5֬Y\N:1ABB,--sN|cccDGG3Kn`bbN> 4hBٳg3_J&ѩ l!=# !$&&R/eKKKBiӦ.]Wbرj777$&&bʔ)(//Ǜ7oбcGb̙pvvZk׮˗/aʕذaB!(ܹsh֬~wB皫oݺ///^`EEMPȘݿZ*Ӄ_bB!v|cccuN;wX,F||Ԕ:8qLZ[SB__ С^~ ۷effȵZbl0&|f͢  YYYaO)rC2Lƍ$W\ >Ã@ۻw/(hRgddА:q 9M6Ç1ۗ{tt4tGGG&L X`OII>l0bХK3g`nn m>4.0k,^ OOOݗZƤI񐟟O޾}AAAbyKW<Ź> ǃo۶-c-ejzrƜ b˖-cZĘt9|>'Oq Ϗ Ct,ǃZ'$$8 }}}9k \:u JM4|IIeи>srnݺz^VVKbҥ(++É'h"s :fɒ%{.J[1=¢Eh֭[iO:͛7… ϖ/_ Usy,ZǏGyy9.]|nퟣGb߾}?RkBիW?)1c!4h'#fȳg 333P(D||<#==bY䎟8ss \h"ŋ;<{ -½{?;ӊCA*u kK.cCO4iB U 3fб/_6vSN!Ç}65j777p*dBU!ի%CܱcЦM&(%%[nc= RFֳgO|,Y=w\\\LY9DAAASq/ 4.gggׯCFFbbbNff&B!?y$ЬY3z~9hx<&ŋT59<#'N[IDAT~ ԭ['HXXlmm?)ر#c?L$ݻْtؑ ty"Y> 333DEE1xXb𮮮hܸ1;FÇrqgbw6mʜd.>/^Ne2ڴiW?,TѣGakk&#'',Xx.IرcAرcn޼IӍΟ?Oqdxv=Baee? }}}&͛7HHHD"ax1bcci1˱|>ٹ2ZA@ԊJOjjw_|3 <<ׯ_ӖAWTT@֭[W\\\py:vӧJJJhS4k LOkl@۷WhP^^N:+4 :;;;lBΊFZNƍ=z(#R2~OEj\/ǃǵkq?DPPp9:vի޿Fϟ#,, 40]`˖-JС^zE]b}v:BTT=zFCy,_=u[n6e)b+v???T^jբ*JC 0 wA:uZ R:ʃM4N1233?[W ={`kk$䔗s߽@ii) hx'''jBEzM=u_Wn]zƢR0zhL0VnBZPjUڢQU;w.D"Ć gΜAnn.^xu]taZ[MqF6mHFF#^QQ<|,˨QӴI&AOO9,nܸ1֭ {{{FxbH$ax𡡡崂N&&&`vcx탽=Svv6ӧ PfJBf~`r/5k֤}䲲2?ƍchgprrbWϟBm%v۷T*erv [[[*[1<V!H?x _b-`w9N:Xf000@AAÃ?:d2 CPP|>*N&&&f/Znʹj5oN뫿;v֮]T RA,cҸ\'jԨ2X^IH$=z4) … ahh_*NFFFโ ;vd\J!Ji{M`޽CTT-HJJJ=+&^_>?ϧŋ舚5k2cB.@'@J*&  ̀DÆ amm<䒜8fL\\LMMuMŋÇ RSSCTb˖ֹ%Zh{ CCC,^ݹs`ooڵk3Q ЩW^puu epB'ccctޝᶷnL}vUZȋбcGcݺu8>`( ̙3wrrB5>2a„O :i$ϟW8C9RDff&\SSSEw^XXX **ggg˗/gvvv?Z1?{bb"rssaddŋ3okk0j(5jժÃB"`Ȑ!XaÆpvvfZ4VT*EΝ ..666L¶m۾*j899NNNprrBǎH߸q#R)RSS [nehhѢ" ƌܹs@ݺu5!˙ط[nݝ,//ǔ)S H0rHt ^ÇY jK.D"A=+gm6riӆ ررcP*qq1CCC,\B'nגѣGC*2B;w Ϛ5 dK4i'''EvZHRdff26JVP(h>%tQ/ڊ)..F޽!uQn] 𥥥>'RF5>qU*jz4d:9WVZ===tܙϓ'OhBݻq* ޽ܹs@[_SJtoܸzzzHMMgϐKKKl۶C вeK߽{w( ZiXXX~L?x`D"̜9C_rw>ɓ#GgwÃh4 .] @ݻg#DEE6mڠ/u˗/SSSlڴQr2mHRԩMBBBcǎXv-8Or-tڻw/D"'NL`J͛7g#ݻwP(d{Ο?;;;ӊÇnk(A[82c x< < AժU?ɃN!_.ݻ7֭[d,]>xprr@,G.uRRLMM*СC000@V̮]B,3Bg 5syy9gAZj>}P#۷o#88xl ?Ftt4lmm$PɃh&АiK=z c(z===,YB'̨x4ic___zȪh0{lx<]\\u(^[sss&o>BDGG3YYY?Z1?UG)ZhpmpZ)m: AIk׮! 5j`#gϦm.uf׭[>;jkk~^z1Ζ-[Ɔ-[@  %%vA*R&PɃ722B֭OYΞ>}NNN:C!ӦMc95k"88.ӧO!C puueWZEӸ?bbb`ff] X B$1i\ǎ9"""T>}pB#Ν;ѣGmT^7o!۷/}_Enbb" ux2 ъ_|pkѢ'#܄ޔK]pdܸqt_><<P=-[1~W:~۶mH$h߾=߽{Gid"##iE89sK]N:YjQ=xS'YOOYYYx7PLL R BQ888 << ׯ!]6{n1aB0zhf'ҠATZ[hx<zʹ]"""`ff͛!СCFMPHsssDGG߿ƍalذD}ΝذaSURRBGH s=oذ q[J>OYӊL|ݑ#G3a:m PF Ph40ax<F\J -rrrhsؘIߴirwch4Xr%D"~k- H(sֹ&&&HNNf}&#:qϮwxL,ǃ \50atiԭ[nnnTɪh0o<*tI&033cz6lT*EVVSGGGw KKK$&&2<;q;v ... ev"x5kK.դh0i$|*t"((LҥK! ЉáP((k4lݺFFFHMKe#ڴi@8[[o7n@ ޽{۷x9BPڵkSO8A_"M 0'O_~:}_߿:uΎU*,YL 8Waff#tjӦ m۶o׊@VVBCC|&O{ ɀ !̖[ 0o<\pBh~~~ :`߽{4i333ԪU HOOG||<ڶm'ODKKK OM6 ?:==2q2.CCC@*2K.jժ󣻹2L0Rƍcxžpttd͛+LLL`/쥥p>|p:u Ϟ=CII nܸe˖ʕ+_ /_kעvڰU`EE,YcccӇ󇇇ؘj6m:t@A شiUADDc1J.\HpuuE@@c }}}L8rm/NЩAL-t |hw+++$&&2vYYYJucjժ1lAA*2W^|||oI&A&a}}aggGw-B~Ѷ˗/ѴiS(J9vd۷oѶm[( }V̉'Pn]4o3f̀@ !...ṾGh6?yx9UĻ{.^B !ڵgJ%ڵk.abbzoߢ: .]=B'*f:=}5l`=zW^o߾MKbʌZj1|$ rssLxx8)sm)cccg+ 7oСCQO>:SoG!77>ĨQP(0uT===F[q>}:r9#tz ׯ{{{/_CCCdggS`,--3&&&HHH`]011anݺD&M%//;w.=۹z'NǏIt>|}}#tT^`Mֆu;vd]~]`_x1B!!F>u+'O>ԽQF8q?~ P>O?krr2>EOe+$ ڵkG_JWBN|iI"njժ13 1x`~V/qR6|;V'ÃJ!KJGBGGG>|6mEs$''Ғ k9td2""">)tVC?}II*<<͛6_~oב#G>Ÿ|r999ErDDuIj۷osssFtaEAfvv6d2#tٳ'!C@__3f`ZPfM * SN}ܹs킹 ൕ>!!ȀRm)EP(wЧO`>.]2F@ @AA#C5ٳgct{  @<M]|cb 3gݻ)X~|}I`GTTlllmm.u '[ޒڝ;wNNNƝ\F ɓ'ӱ׮]C͚5G' ̜5NJ+OW^eD+FVc"YZ^=x{{s>ۢE@A޽z!Zl {{{&e|fK$%%H/JѪU+FֵkWcժUūWpY١qƌHmȐ!x(,,.w8YV-h4t^:IUrJʃNt;wBOO rg4HRRDxx8A4`?UTAPPO?Q6ɤvڨQ' G߿pZsWد_3f?`$G`Dn>9N[;,ev+ٳg ;wڴiC+oߢC j9*mRN81Վ-j)H`` f$+ٳu2۸}6._Ǐcɘ6m9O9~vѤI6aÆpssӉxѣc sssP(DcRRD"eb SSSDFF2ݻaٲet3gJþg7bBY;Yg!dDjpttĉ4\|]Nhkŋ{T*EBBZlIKZz4.ly,U;|=K;?i- .CNNѢE X[[ѣ_طn݊}V͚5 ؕJ%}!>OKKKF: ͛7iȑ#iRDNkDEEA"0f066fX4HKKcxG'y̛70pίe)/bz*jժŴw˖޺7n4fup[j\;P(D$''W]޽Ѿ}{8sF .&L ͛75oQF1Γ+k1_~5kDjp5,3Mz=Bpp0,--)Hh4Z ay-Z:Dn۶ h߾=v)))شy{a899!""111xU!| N:V1vX|7>۷oN:puueOϟ}}}Fc34iJh4 6lB,ʌybbbOiؽ{7ORq|QjUPJ[O>e9Q~}ZƲe ѳgOP}ׯ_[nHJJB||ϟ'jժEcǎX, k)@󃳳32o|&&&T\>}ؘ:]p666vB'///3_XXLkiР ~ڵ+޾}4<h$(}`jjk҅033Cƍahhy桢 8 ;/CN鑾>zA'ǏѺurD"C|%xmѣG)X[蔓\޽ 88A*2k׮J*cRǏP( ]6<==i^VcG>}~}-DHM|9`nn8duNǾ?VVV[.Ç =򂏏5m4B 6y_F+5k{h v H댊ZPޛ((bb+X)XƘ FMbDACIT׀-("LyϷ-ub\Z%og߻ V^ BzB'L3\t h۶-g1w\c:n߾6mڠE077{]@T*J%\as4WQTBQs__^ڿX՜?D5k>ҥ <==M6A,#4S<::NNNi Pc QQQD Pѣ'5jqF.@LRi/j5Rќ?ӊ'OAAA-USS'BGGk֬aҥKpww'U*>sb9tMF T;mݻw^Oɪ̓ƍׯcРAN044DXXNK{ܼuV]vzӧOD"eڮ\ooomۖj5c͘1ͽmiӦ\b\{W/{,[_ {{bM QN< [[[j&MH$BFF{4o~~~]hpB̙޸qm4 6mΑh{D"D"aOT8p d2g9 B޽{s"4H$l޼=}45j 3gάGe|2ڴim۲~4,_ D)SKjܸ1?pD;KKJJзo_XZZr~YYYCll,磞|lТٳ'cr!a;wM6EN!`޼y+ѣG .… ~!%%J666 "8889ۛD"؃ٚٳ9``sS8{P(x2 | HpDRaܸq "|njVd2ϟ bAɀ]*9/o 9r)))Dd;q8ZԩSADŋ yڛ6:((nnni˖-LK]H11๥qFqOd ,~C[ՙҸ-z.,eΝH$:t(g?зo_d2> BXfwСh УGN!8joځB ۜv? &`͚5ر#ݱm6l۶ N£G[bÆ 5kG7ي1cVx.9CTT[(2GDD9Mb ̟?˗/Ǚ3g1cư5ݽ{III7omۆׯC*bԨQlp{ǎf͚qyŘ8q"W Wܹx9ctt4 %Ǫ:$''C$L4ORD^m6Z 055֭[m62hguꫯ`ll-[`۶mY:J>"[lyQDf:jvɒ%\/0[VPݻ s|ff&ʉ""" Jq1f)pAaH൪\ ,, ;v,D"W͞={Z͛<[MpwwZiZhh(BCCaaa$~-R)&sj}r|H׮];5oޜ꨼d uܙd2UTT۷ƍԨQ#jӦ w?Q̌H&ѥKёٽ;~8I$jݺ5ғ'O ΎJKKٳT[[K-Z z)=|rrrښHGGҥKT^^NM6%zf333 $*//7nPqq15nܘITRyy9䐱11UVVRQQ]|\\\חj5Q~~>P۶mҒTXXHԹsg@%%%TXXHe˖@TZZJdkkK$~=+UWWSՕjjj‚IWWիt…?󆊽b+wiΝ;Yȑ#FTTabbQO:GGGs)V1_ٍ7f͚qBKsNB@TTXa=LLL0zh 6 (//Gxx8 ~ȅ_$$$̌=z8ǏB4 +\\\жmW,zIxj߿? kyΎUo߾@VVwbbbXYUURRR`bbLv'N8aԩSiZ1 [XXg-#GQQQ7-- غu+𖖖ԩ't6mSCj+Y4i///.\Tsc}hҤ ֭T*ѣ$p899ѣ/N?L& ssabb=z͠ cǎ 6l tkjj0{ldzB-ZYf dma鬥x}ՕklݺR\~k߾}aoo:\vTYYÇ۷ogĉ@```=1֬Y`o`׀=//%%%8>0VVVbĈ011bN:ńNY'OV^ʕ+hҤ ڶm7ϟ?:::;w.۷o͛7g~cǎł H0zh@wN?ttt0p@fwȐ!Ny022BϞ=9QFA.c\X:vY̜9zzz/ WWWnݚ /!H0}tvÃ;dݶm$ RSS9䘘8::rJCAOO111NfffIkGUWWc„ i!`V"..VVVhK=|pvpjeenݺ1zamm-&NX ѬY3tЁs\`D">6͛ԩZh___FQ]~=D"ӹ899q={@,cv055Nyyy0222YBOO[lNڵ+!V-]r s f-[1ypwwhۈm=֗=Brr2d2;NdffPЊi`=-- b "_~066>''r}a=O2&6ɓprrBHH;JŨv+V`s/\-[ Xx11٭[X5Ma޼y3D"85ǃ߿?tuuѿN6h ri\yyy@޽-tmm-F X˜>}M4G ={6 4@ }~ժU "L< ޽;5j_~ݱcb1 =Դ}eO"HNN.v?~vvvѣOV㫯š5k8`ܹsXf l7;ߊ2d===.ѣBtt4ǥ1bD}ɓpwwGPP;๾UvڡUV0oٲiӦ1aѭ[78;;sUyTT 刏DjD"ҸpN6f֮]9U~rB'!nQ]hT^mT+дiS ł+)**/\\\X^=622„ XÇB`/s111upttD߾}9#F@GGY7{]o-N:JP\\ ttt%M ̌oVVVHNN~ae1all{2zavv6HOOg{|ic̞=FFFXx1kAܼy͛7nܸqơ˗/\.̙39cǎacc^;%== ݻ7@mU$%%A&a׮]ڨ4σ3SL8qNz2 }UVpqqP(0ydvy!aaa^Ro(?FLL  YYYG߾}9jPPЛ{a-[D˖-&McǎXn?VY +޽֐H$\rk{ZӀXb8#"sՊ9t+[1߇\:e0l0 D 4EEH$ĉ9LHHYFVcΝ011Arr2'xkiiUU9r$LMMi&ૄN˖-NŸv{,Yrg ???8;;s/ľiz>|eVB[̌3DRR,,,߲Xdɿ Fw~1ddd0$P"??}w$''s^=񰳳þ}egg\uZZ̰m66~ڴidXj|-[2|]].zC+l󃇇עY~=1j(<{gggϞ=044D6Hbb"8%k~~>r9wUcǎBZ/T*ҥKukU˗/Me2qQ11wgb1{j$''cݺu\q4 <<)))8x >޽{7{?]o޼k;h st7fvX,FRRǃ |!tɁ"##9O cczB'KKK =z4***pxxxחnT*,Xb| [n͛7Y7lXtbr=DFFŅ)Y`޽H$߿?Ƈ"!!\XK~~>УGTT>jӧ!J ~|ǐH$Xt)k׮>>>OVcٲeA[TT`xxxbGlll=%=#D"\ͽx"Zh3_FE0k,/NBƍvGTTs}1N7|{W b=k׮aXrD⸿?` J~ٳgHMM}7ns֭[H1cư6Ojkk˭c !J9?vubF]]]1c 55D/ /AD>}z=UuVD"1mTy=!8CWWKχ Ù"GH$bi\pfn$=ϟ^v ~~~6իWvGϞ=vD"W{EGllm7CSa ҞgX^b|rՋ뷗!66g榦b g͚>3ٲ\txx8 {L&Yӧo>yլߵkWՋDfa ^˫^5+G޽{֭7@WWÇ?!Jq".. HLLX,fDŅf;wС{"§~"Mt8wvZb;mT%%%ٳ',,, ᅦ!FF*S 1h [.SH> '''6]Vcذa5j*RXz5>Ç{X]}{xx8$ fΜܹN:ϟcټy3 9F022B^~.sss 2C,s'N666Ҹ U7F=QRaҤIz!BCCP(k4|055Errf-L wbd2BCCor 6=IR&]@cǎ0^555??M/Z1uuuXt) 1k,Ӿ}{۳7J7BP`̘15l= Y[K:Y[[BO1`|RF8;;sBx֯_Zq!;;M6ƺ:|'… 9|VhJVN CV ii)22 5;;;ksh777M&M222ŋh޼9|||=C]].|;w.j۶-8Ӻu 1aX: /^`)O!C ""III\{=33]tA.]4rK.Ůum^n!CеkWQFTܽ{U;ox1.]@HLLDѥK2`yݱyfxyy1hmm-/^ \-ݻ@B ƏwKKKwŔ{aʜۣwެfkii3gΠQFcך̙3rK,a`wMxzzݝhl2KT*xr/FQ%"##annU탵5Q^^D<~P(عs'GtttDHH~1i$rNtEu֬3̟?r9ۜѪU+4jԈ=)zj( |G?((VVV imm--Z !..Q[[ JO?oz4xż ^1 WFFвeW!AΝbqY2 &L*ݻёF]`ll@N  kkkݻ}Vsrr`ff޽{ͬ 1't:s lmmB' iӦdBL&NGǎƍ!0rHN%Fw^( nݚ]sEEaiiy!!!\IѦM?: oooo.CXTbʕd2e 3d2쵵Ϟ=c/FJJ R)V\-Z4{c033Ì3C}'O3`}6ڴi-Zp& &0@wxzzzHLLdRII Bq~c}B3g06O:ׯ_Zn*xREAOOsa\TT4mڔoܸ9r$ 22 m۶G||<ǃOJJ't*((\.Ghh + 3 dvͷnB˖-͵hVX]]]L:uT"%%cǎŔ)SpyTUUAOOӦMc6o6o`ǻ k׮escǎT*1w\b̟?}x~8̓h4Xf  sc&/8:qAA\]]9Fĉ!Qosn׮g`lYmZΝ#r߿ظq#5kdeeʕ+>=fee5R Z۷#<<b1l0T*ۃyfdee1VE]]JKKѯ_? "}+vJwww|Wy&8t9JF׃кuk|װӼ+'N>}:$ K\xyy1NJ_|]]]̘1Ύj5lLtgϞJegXYYqBѣG{H$Lhp14j{fT*1zhH$[mTg>>te(((f̘ATZZJr/_NTXXH;w(jѢ|@dnnN4g255\*,,$/R\\UVV9::ҸqH$Ѿ}޽{4{l211 Stt4yzzRbb"ѶmۨoNFFFw^ܹ3ݸqƎK~~~A`z ;wR)_rJ޽;уhĉSR*dllL-"{{{:~8bdAtiڲe S֭ݻNdhhH&&&駟%SϞ={Z1GE߾}1w\EDD{nbHLLĘcPUU1c`Ȑ!pJm/\HL8V?]صkqƌ2(Tv'NvʉeMcccXUvW^EƍѢE yV -q=SvB9L=`ccQj}͑h*++1p@sֹGe[Bc= ׯgٳg:[ӭ[I]a2m >N`oo.]*y055Ň~DEE Ga<kС055Ŏ;ؽaggnݺqIH&M1222ؓȥKBk׮E/;?KڴiNYTҕ+WE̚5 ;wZjN֏?rss{]\\LFFFT*ԩSdjjJ:t`ͥǏSv‚*++ (007۳'H$B"s8x"oADDR$"nݺ{z*9;;';w޽KDDdhhHDDwޥsΑ5eggӳgϨcǎP(N8Ar:uTQQA>>>dmmonn.Qpp0{Yw5oޜS#GH,SHHϛW\7oRƍI&DDV)++Ppp0۷ҥK@^^^eeeJ.]=xN>M;v}dffFDD?T*]'N2jժӧOѣ/eD a40ɱ6 a4_8J %tEXtdate:create2022-06-15T16:09:51+02:00ǎj%tEXtdate:modify2022-06-15T16:09:51+02:00Ҳ-tEXticc:copyrightCopyright Artifex Software 2011Ŵ1tEXticc:descriptionArtifex Software sRGB ICC Profile 2tEXticc:manufacturerArtifex Software sRGB ICC Profile\~=+tEXticc:modelArtifex Software sRGB ICC Profile1(tEXtSoftwareGPL Ghostscript 9.26XnIENDB`hevea-2.36-manual/manual044.html0000644004317100512160000001064214252364057016443 0ustar marangetcristal Installation Previous Up Next


C.4 Installation

C.4.1 Requirements

The programs hevea and hacha are written in Objective Caml. Thus, you really need Objective Caml (the more recent version, the better) to compile them. However, some binary distributions exist, which are managed by people other than me (thanks to them). Links to some of these distributions appear in HEVEA home page.

HEVEA users may instruct the program not to process a part of the input (see section 6). Instead, this part is processed into a bitmap file and HEVEA outputs a link to the image file. LATEX source is changed into .png images by the imagen script, which basically calls, LATEX, dvips, ghostscript and the convert command from the image processing package ImageMagick.

To benefit from the full functionality of HEVEA, you need all this software. However, HEVEA runs without them, but then you will have to produce images by yourself.

C.4.2 Principles

The details are given in the README file from the distribution. Basically, HEVEA should be given a library directory. The installation procedure stores the hevea.hva and base style files in this directory. There are two compilation modes, the opt mode selects the native code OCaml compiler ocamlopt, while the byte mode selects the bytecode OCaml compiler ocamlc. In HEVEA case, ocamlopt produces code that is up to three times as fast as the one produced by ocamlc. Thus, default compilation mode is opt, however it may be the case on some systems that only ocamlc is available.

Note that, when installing HEVEA from the source distribution, the hevea.sty (and mathjax.sty) style files are simply copied to HEVEA library directory. It remains users (and package maintainers) responsibility to make those files accessible to LATEX.


Previous Up Next hevea-2.36-manual/manual010.html0000644004317100512160000000130014252364056016422 0ustar marangetcristal Answers

Quiz answers

  1. Black is black.
  2. White is white.
  3. Dylan is Dylan.
hevea-2.36-manual/manual041.html0000644004317100512160000010633014252364057016440 0ustar marangetcristal Usage Up Next

C.1 Usage

C.1.1 HEVEA usage

The hevea command has two operating modes, normal mode and filter mode. Operating mode is determined by the nature of the last command-line argument.

C.1.1.1 Command line arguments

The hevea command interprets its arguments as names of files and attempts to process them. Given an argument filename there are two cases:

  • If filename is base.tex or base.hva, then a single attempt to open filename is made.
  • In other cases, a first attempt to open filename.tex is made. In case of failure, a second attempt to open filename is made.

In all attempts, implicit filenames are searched along hevea search path, which consist in:

  1. the current directory “.”,
  2. user-specified directories (with the -I command-line option),
  3. hevea library directory.
  4. one of the sub-directories html, text or info from hevea library directory, depending upon hevea output format,

The hevea library directory is fixed at compile-time (this is where hevea library files are installed) and typically is /usr/local/lib/hevea. However, this compile-time value can be overridden by setting the HEVEADIR shell environment variable. In all cases, the value of hevea library directory can be accessed from the processed document as the value of the command \@hevealibdir.

C.1.1.2 Normal mode

If the last argument has an extension that is different from .hva or has no extension, then it is interpreted as the name of the main input file. The main input file is the document to be translated and normally contains the \documentclass command. In that case two basenames are defined:

  • The input basename, basein, is defined as the main input file name, with extension removed when present.
  • The output basename, baseout, is basein with leading directories omitted. However the output basename can be changed, using the -o option (see below).

HEVEA will attempt to load the main input file. Ancillary files from a previous run of LATEX (i.e. .aux, .bll and .idx files) will be searched as basein.ext. The output base name governs all files produced by HEVEA. That is, html output of HEVEA normally goes to the file baseout.html, while cross-referencing information goes into baseout.haux. Furthemore, if an image file is generated (cf. section 6), its name will be baseout.image.tex.

Thus, in the simple case where the hevea command is invoked as:

# hevea file.tex

The input basename is file and the output basename also is file. The main input file is searched once along hevea search path as file.tex. html output goes into file file.html, in the current directory. In the more complicated case where the hevea command is invoked as:

# hevea ./dir/file

The input base name is ./dir/file and the output basename is file. The main input file is loaded by first attempting to open file ./dir/file.tex, then file ./dir/file. html output goes into file file.html, in the current directory.

Finally, the output base name can be a full path, but you have to use option -o. For instance, we consider:

# hevea -o out/out.html file.tex

Then, html output goes into out/out.html — notice that directory out must exist. Furthermore, hevea output base name is out/out. This means that hevea generates files out/out.haux, out/out.image.tex etc.

The article.hva, seminar.hva, book.hva and report.hva base style files from HEVEA library are special. Only the first base style file is loaded and the \documentclass command has no effect when a base style file is already loaded. This feature allows to override the document base style. Thus, a document file.tex can be translated using the article base style as follows:

# hevea article.hva file.tex

C.1.1.3 Filter mode

If there is no command-line argument, or if the last command-line argument has the extension .hva, then there is neither input base name nor output base name, the standard input is read and output normally goes to the standard output. Output starts immediately, whithout waiting for \begin{document}. In other words hevea acts as a filter.

Please note that this operating mode is just for translating isolated LATEX constructs. The normal way to translate a full document file.tex being “hevea file.tex” and not “hevea < file.tex > file.html”.

C.1.1.4 Options

The hevea command recognises the following options:

-version
Show hevea version and exit.
-v
Verbose flag, can be repeated to increase verbosity. However, this is mostly for debug.
-dv
Add border around some of the block-level elements issued. Specifically, all div and p are bordered, while the structure of displayed material is also shown.
-s
Suppress warnings.
-I dirname
Add dirname to the search path.
-o name
Make name the output basename. However, if name is base.html, then the output basename is base. Besides, -o - makes HEVEA output to standard output.
-e filename
Prevent hevea from loading any file whose name is filename. Note that this option applies to all files, including hevea.hva and base style files.
-fix
Iterate HEVEA until a fixpoint is found. Additionally, images get generated automatically.
-O
Optimise html by calling esponja (see section C.1.3).
-exec prog
Execute file prog and read the output. The file prog must have execution permission and is searched by following the searching rules of hevea.
-francais
Deprecated by babel support. This option issues a warning message.
-help
Print version number and a short help message.

The following options control the html code produced by hevea. By default, hevea outputs a page encoded in US-ASCII with most symbols rendered as html or numerical Unicode entities.

-entities
Render symbols by using entities. This is the default.
-textsymbols
Render symbols by English text.
-moreenties
Enable the output of some infrequent entities. Use this option to target browsers with wide entities support.
-mathml
Produces MathML output for equations, very experimental.
-pedantic
Be strict in interpreting html definition. In particular, this option disable size and color changes inside <PRE></PRE>, which are otherwise performed.

The following options select and control alternative output formats (see section 11):

-text
Output plain text. Output file extension is .txt.
-info
Output info format. Output file extension is .info.
-w width
Set the line width for text or info output, defaults to 72.

Part A of this document is a tutorial introduction to HEVEA, while Part B is the reference manual of HEVEA.

C.1.2 HACHA usage

The hacha command interprets its argument base.html as the name of a html source file to cut into pieces.

It also recognises the following options:

-v
Be a little verbose.
-o filename
Make HACHA output go into file filename (defaults to index.html). Additionally, if filename is a composite filename, dir/base, then all files outputted by HACHA will reside in directory dir.
-tocbis
Another style for table of contents: sub-tables are replicated at the beginning of every file.
-tocter
Like -tocbis above, except that sub-tables do not appear in the main table of contents (see Section 7.2.3).
-no-svg-arrows
Use GIF arrows for the Previous/Up/Next links, in place of the default SVG arrows.
-nolinks
Do not insert Previous/Up/Next links in generated pages.
-hrf
Output a base.hrf file, showing in which output files are the anchors from the input file gone. The format of this summary is one “anchor\tfile” line per anchor. This information may be needed by other tools.
-help
Print version number and a short help message.

Section 7 of the user manual explains how to alter HACHA default behaviour.

C.1.3 esponja usage

The program esponja is part of HEVEA and is designed to optimise hevea output. However, esponja can also be used alone to optimise text-level elements in html files. Since esponja fails to operate when it detects incorrect html, it can be used as a partial html validator.

C.1.3.1 Operating mode

The program esponja interprets its arguments as names of files and attempt to process them. It is important to notice that esponja will replace files by their optimised versions, unless instructed not to do so with option -n.

Invoking esponja as

# esponja foo.html

will alter foo.html. Of course, if esponja does not succeed in making foo.html any smaller or if esponja fails, the original foo.html is left unchanged. Note that this feature allows to optimise all html files in a given directory by:

# esponja *.html

C.1.3.2 Options

The command esponja recognises the following options:

-v
Be verbose, can be repeated to increase verbosity.
-n
Do not alter input files. Instead, esponja output for file input.html goes to file input.esp. Option -n implies option -v.
-u
Output esponja intermediate version of html. In most occasions, this amounts to pessimize instead of to optimise. It may yield challenging input for other html optimisers.

C.1.4 bibhva usage

The program bibhva is a simple wrapper, which basically forces bibtex into accepting a .haux file as input and producing a .hbbl file as output. Usage is bibhva bibtex-options basename.

C.1.5 imagen usage

The command imagen is a simple shell script that translates a LATEX document into many .png images. The imagen script relies on much software to be installed on your computer, see Section C.4.1.

It is a companion program of HEVEA, which must have been previously run as:

# heveabase.tex
or
# hevea-o base.html

In both cases, base is HEVEA output basename. When told to do so (see section 6) HEVEA echoes part of its input into the base.image.tex file.

The imagen script should then be run as:

# imagen base

The imagen script produces one basennn.png image file per page in the base.image.tex file.

This is done by first calling latex on base.image.tex, yielding one dvi file. Then, dvips translates this file into one single Postscript file that contains all the images, or into one Postscript file per image, depending upon your version of dvips. Postscript files are interpreted by ghostscript (gs) that outputs ppm images, which are then fed into a series of transformations that change them into .png files.

The imagen script recognises the following options:

-mag nnnn
Change the enlarging ratio that is applied while translating DVI into Postscript. More precisely, dvips is run with -xnnnn option. Default value for this ration is 1414, this means that, by default, imagen magnifies LATEX output by a factor of 1.414.
-extra command
Insert command as an additional stage in imagen ppm to png production chain. command is an Unix filter that expects a ppm image in its standard input and outputs a ppm image on its standard output. A sensible choice for command is one command from the netpbm package, several such commands piped together, or various invocations of the convert command from ImageMagick.
-quant number
Add an extra color quantisation step in imagen ppm image production chain, where number is the maximal number of colors in the produced images. This option may be needed as a response to a failure in the image production chain. It can also help in limiting image files size.
-png
Output PNG images. This is the default.
-gif
Output GIF images in place of PNG images. GIF image files have a .gif extension. Note that hevea should have been previously run as hevea gif.hva base.tex (so that the proper .gif filename extension is given to image file references from within the html document).
-svg
Output SVG images in addition to PNG (or GIF) images. Note that hevea should have been previously run as hevea svg.hva base.tex.
-pnm
Output PPM images. This option mostly serves debugging purposes. Experimented users can also take advantage of it for performing additional image transformation or adopting exotic image formats.
-t arg
Pass option “-t arg” to dvips. For instance, using “-t a3” may help when images are truncated on the right.
-pdf
Have imagen call pdflatex instead of latex.

The first three options enable users to correct some misbehaviours. For instance, when the document base style is seminar, image orientation may be wrong and the images are too small. This can be cured by invoking imagen as:

# imagen -extra "pnmflip -ccw" -mag 2000 base

Notice that hevea calls imagen by itself, when given the command-line option -fix. In that situation, the command-line options of imagen can be controlled from source file by using the command \@addimagenopt (see Section 10.7).

C.1.6 Invoking hevea, hacha and imagen

In this section, we give a few sequence of (Unix) commands to build the html version of a document in various situations. The next section gives a few Makefile’s for similar situations.

We translate a file doc.tex that requires a specific style file doc.hva. The file is first translated into doc.html by hevea, which also reads the specific style file doc.hva. Then, hacha cuts doc.html into several, doc001.html, doc002.html, etc. also producing the table of links file index.html.

# hevea -fix doc.hva doc.tex
# hacha doc.html

Thanks to the command-line option -fix, hevea runs the appropriate number of times automatically. In case hevea produces a non-empty doc.image.tex file, then hevea calls imagen by itself (because of option -fix). Hence, the above sequence of two commands is also appropriate in that situation.

In case some problem occurs, it is sometime convenient to run imagen by hand. It is time not to use the option -fix.

# rm -f doc.image.tex
# hevea doc.hva doc.tex

Now, hevea normally has shown the imagen command line that it would have run, if it had been given the option -fix. For instance, if doc.hva includes \input{gif.hva}, then hevea shows the following warning:

HeVeA Warning: images may have changed, run 'imagen -gif doc'

Now, one can run imagen as it should be.

It is sometime convenient not to clobber the source directory with numerous target files. It suffices to instruct hevea and hacha to output files in a specific directory, say doc.

# hevea -fix -o doc/doc.html doc.hva doc.tex
# hacha -o doc/index.html doc/doc.html

Notice that hevea does not create the target directory doc: it must exist before hevea runs. Again, in case hevea calls imagen, image generation should proceed smoothly and the final files doc001.png, doc002.png, … should go into directory doc.

In all situations, while installing files to their final destination, it is important not to forget any relevant files. In particular, in addition to the root file (index.html), contents files (doc001.html, doc002.html, etc.) and images (doc001.png, doc002.png, etc.), one should not forget the arrow images and the style sheet generated by hacha (contents_motif.gif, next_motif.gif, previous_motif.gif and doc.css).

As a consequence, producing all files into the subdirectory doc may be a good idea, since then one easily install all relevant files by copying doc to a public destination.

# cp -r doc $(HOME)/public_html

However, one then also installs the auxiliary files of hevea, and hevea output file doc.html, which is no longer useful once hacha has run. Hence, those should be erased beforehand.

# rm -f doc/doc.h{tml,aux,ind,toc} doc/doc.image.tex
# cp -r doc $(HOME)/public_html

C.1.7 Using make

Here is a typical Makefile, which is appropriate when no images are produced.

HEVEA=hevea
HEVEAOPTS=-fix
HACHA=hacha
#document base name
DOC=doc
index.html: $(DOC).html
        $(HACHA) -o index.html $(DOC).html

$(DOC).html: $(DOC).hva $(DOC).tex
        $(HEVEA) $(HEVEAOPTS) $(DOC).hva $(DOC).tex

clean:
        rm -f $(DOC).html $(DOC).h{toc,aux,ind}
        rm -f index.html $(DOC)[0-9][0-9][0-9].html $(DOC).css

Note that the clean rule removes all the doc001.html, doc002.html, etc. and doc.css files produced by hacha. Also note that make clean also removes the doc.haux, doc.hind and doc.htoc files, which are HEVEA auxiliary files.

When the image file feature is used, one can use the following, extended, Makefile:

HEVEA=hevea
HEVEAOPTS=-fix
HACHA=hacha
#document base name
DOC=doc
index.html: $(DOC).html
        $(HACHA) -o index.html $(DOC).html

$(DOC).html: $(DOC).hva $(DOC).tex
        $(HEVEA) $(HEVEAOPTS) $(DOC).hva $(DOC).tex

clean:
        rm -f $(DOC).html $(DOC).h{toc,aux,ind}
        rm -f index.html $(DOC)[0-9][0-9][0-9].html $(DOC).css
        rm -f $(DOC).image.* $(DOC)[0-9][0-9][0-9].png *_motif.gif

Observe that the clean rule now also gets rid of doc.image.tex and of the various files produced by imagen.

With the following Makefile, hevea, imagen, hacha all output their files into a specific directory DIR.

HEVEA=hevea
HEVEAOPTS=-fix
HACHA=hacha
#document base name
DOC=doc
DIR=$(HOME)/public_html/$(DOC)
BASE=$(DIR)/$(DOC)

$(DIR)/index.html: $(BASE).html
        $(HACHA) -tocter -o $(DIR)/index.html $(BASE).html

$(BASE).html: $(DOC).hva $(DOC).tex
        $(HEVEA) $(HEVEAOPTS) $(DOC).hva -o $(BASE).html $(DOC).tex

partialclean:
        rm -f $(BASE).h{tml,aux,toc,ind} $(BASE).image.*

clean:
        rm -f $(DIR)/*

The above Makefile directly produces html and PNG files into the final directory $(HOME)/public_html/$(DOC). The new partialclean entry erases files that are not useful anymore, once imagen and hacha have performed their tasks.

However, most often, it is more appropriate to build html and PNG files in a specific directory, and then to copy them to their final destination.

   ...

#document base name
DOC=doc
DIR=$(DOC)
BASE=$(DIR)/$(DOC)
INSTALLDIR=$(HOME)/public_html/$(DOC)

  ...

install: partialclean
        cp $(DIR)/* $(INSTALLDIR)
  ...

Up Next hevea-2.36-manual/manual011.html0000644004317100512160000000215614252364056016435 0ustar marangetcristal A cut subsubsection Up Next

7.3.8 A cut subsubsection

A note in a subsubsection, flushed at subsubsections.2


2
At the end of my page.

Up Next hevea-2.36-manual/manual032.html0000644004317100512160000001276514252364056016447 0ustar marangetcristal Lining It Up in Columns Previous Up Next

B.10 Lining It Up in Columns

B.10.1 The tabbing Environment

Limited support is offered. The tabbing environment translate to a flexible tabular-like environment. Inside this environment, the command \kill ends a row, while commands \= and \> start a new column. All other tabbing commands do not even exist.

B.10.2 The array and tabular environments

These environments are supported, using html table element, rendering is satisfactory in most (not too complicated) cases. By contrast with LATEX, some of the array items always are typeset in display mode. Whether an array item is typeset in display mode or not depends upon its column specification, the l, c and r specifications open display mode while the remaining p and @ do not. The l, c,r and @ specifications disable word wrap, while the p specification enables it.

Entries in a column whose specification is l (resp. c or r) get left-aligned (resp. centered or right-aligned) in the horizontal direction. They will get top-aligned in the vertical direction if there are other column specifications in the same array that specify vertical alignment constraints (such as p{wd}, see below). Otherwise, vertical alignment is unspecified.

Entries in a column whose specification is p{wd} get left-aligned in the horizontal direction and top-aligned in the vertical direction and a paragraph break reduces to one line break inside them. This is the only occasion where HEVEA makes a distinction between LR-mode and paragraph mode. Also observe that the length argument wd to the p specification is ignored.

Some LATEX array features are not supported at all:

  • Optional arguments to \begin{array} and \begin{tabular} are ignored.
  • The command \vline does not exists.

Some others are partly rendered:

  • Spacing between columns is different.
  • @ formatting specifications in \multicolumn argument are ignored.
  • If a | appears somewhere in the column formatting specification, then the array is shown with borders.
  • The command \hline does nothing if the array has borders (see above). Otherwise, an horizontal rule is outputted.
  • The command \cline ignores its argument and is equivalent to \hline.
  • Similarly the command \extracolsep issues a warning and ignores its argument.

Additionally, the tabular* environment is recognised and gets rendered as an html table with an advisory width attribute.

By default, HEVEA implements the array package (see [LATEX-bis, Section 5.3] and section B.17.2 in this document), which significantly extends the array and tabular environments.


Previous Up Next hevea-2.36-manual/manual.htoc0000644004317100512160000004537414252364053016212 0ustar marangetcristal\begin{tocenv} \tocitem \@locref{usermanual}{\begin{@norefs}\@print{Part A}\quad{}\label{usermanual}Tutorial{}\end{@norefs}} \begin{tocenv} \tocitem \@locref{getstarted}{\begin{@norefs}\@print{1}\quad{}How to get\label{getstarted} started{}\end{@norefs}} \tocitem \@locref{sec4}{\begin{@norefs}\@print{2}\quad{}Style files{}\end{@norefs}} \begin{tocenv} \tocitem \@locref{sec5}{\begin{@norefs}\@print{2.1}\quad{}Standard base styles{}\end{@norefs}} \tocitem \@locref{sec6}{\begin{@norefs}\@print{2.2}\quad{}Other base styles{}\end{@norefs}} \tocitem \@locref{sec7}{\begin{@norefs}\@print{2.3}\quad{}Other style files{}\end{@norefs}} \end{tocenv} \tocitem \@locref{sec10}{\begin{@norefs}\@print{3}\quad{}A note on style{}\end{@norefs}} \begin{tocenv} \tocitem \@locref{sec11}{\begin{@norefs}\@print{3.1}\quad{}Spacing, Paragraphs{}\end{@norefs}} \tocitem \@locref{sec14}{\begin{@norefs}\@print{3.2}\quad{}Math mode{}\end{@norefs}} \tocitem \@locref{sec19}{\begin{@norefs}\@print{3.3}\quad{}Warnings{}\end{@norefs}} \tocitem \@locref{sec20}{\begin{@norefs}\@print{3.4}\quad{}Commands{}\end{@norefs}} \tocitem \@locref{sec21}{\begin{@norefs}\@print{3.5}\quad{}Style choices{}\end{@norefs}} \end{tocenv} \tocitem \@locref{sec22}{\begin{@norefs}\@print{4}\quad{}How to detect and correct errors{}\end{@norefs}} \begin{tocenv} \tocitem \@locref{sec23}{\begin{@norefs}\@print{4.1}\quad{}\hevea{} does not know a macro{}\end{@norefs}} \tocitem \@locref{sec24}{\begin{@norefs}\@print{4.2}\quad{}\hevea{} incorrectly interprets a macro{}\end{@norefs}} \tocitem \@locref{sec25}{\begin{@norefs}\@print{4.3}\quad{}\hevea{} crashes{}\end{@norefs}} \end{tocenv} \tocitem \@locref{both}{\begin{@norefs}\@print{5}\quad{}\label{both}Making \hevea{} and \LaTeX{} both happy{}\end{@norefs}} \begin{tocenv} \tocitem \@locref{sec30}{\begin{@norefs}\@print{5.1}\quad{}File loading{}\end{@norefs}} \tocitem \@locref{heveastyle}{\begin{@norefs}\@print{5.2}\quad{}The \label{heveastyle}\protect\texttt{hevea} package{}\end{@norefs}} \tocitem \@locref{sec35}{\begin{@norefs}\@print{5.3}\quad{}Comments{}\end{@norefs}} \end{tocenv} \tocitem \@locref{imagen}{\begin{@norefs}\@print{6}\quad{}\label{imagen}With a little help from \LaTeX{}\end{@norefs}} \begin{tocenv} \tocitem \@locref{image:file}{\begin{@norefs}\@print{6.1}\quad{}The \textit{image}\label{image:file} file{}\end{@norefs}} \tocitem \@locref{sec38}{\begin{@norefs}\@print{6.2}\quad{}A toy example{}\end{@norefs}} \tocitem \@locref{sec39}{\begin{@norefs}\@print{6.3}\quad{}Including Postscript images{}\end{@norefs}} \tocitem \@locref{sec40}{\begin{@norefs}\@print{6.4}\quad{}Using filters{}\end{@norefs}} \end{tocenv} \tocitem \@locref{hacha}{\begin{@norefs}\@print{7}\quad{}\label{hacha}Cutting your document into pieces with \hacha{}\end{@norefs}} \begin{tocenv} \tocitem \@locref{sec42}{\begin{@norefs}\@print{7.1}\quad{}Simple usage{}\end{@norefs}} \tocitem \@locref{sec43}{\begin{@norefs}\@print{7.2}\quad{}Advanced usage{}\end{@norefs}} \tocitem \@locref{sec49}{\begin{@norefs}\@print{7.3}\quad{}More Advanced Usage{}\end{@norefs}} \end{tocenv} \tocitem \@locref{sec65}{\begin{@norefs}\@print{8}\quad{}Generating \html{} constructs{}\end{@norefs}} \begin{tocenv} \tocitem \@locref{sec66}{\begin{@norefs}\@print{8.1}\quad{}High-Level Commands{}\end{@norefs}} \tocitem \@locref{imgsrc}{\begin{@norefs}\@print{8.2}\quad{}More on included\label{imgsrc} images{}\end{@norefs}} \tocitem \@locref{internal}{\begin{@norefs}\@print{8.3}\quad{}Internal \label{internal}macros{}\end{@norefs}} \tocitem \@locref{rawhtml}{\begin{@norefs}\@print{8.4}\quad{}The \texttt{rawhtml}\label{rawhtml} environment{}\end{@norefs}} \tocitem \@locref{sec73}{\begin{@norefs}\@print{8.5}\quad{}Examples{}\end{@norefs}} \tocitem \@locref{encodings}{\begin{@norefs}\@print{8.6}\quad{}The \label{encodings}document charset{}\end{@norefs}} \end{tocenv} \tocitem \@locref{style:sheets}{\begin{@norefs}\@print{9}\quad{}Support\label{style:sheets}\index{style-sheets} for style sheets{}\end{@norefs}} \begin{tocenv} \tocitem \@locref{sec76}{\begin{@norefs}\@print{9.1}\quad{}Overview{}\end{@norefs}} \tocitem \@locref{css:change:all}{\begin{@norefs}\@print{9.2}\quad{}Changing \label{css:change:all} the style of all instances of an environment{}\end{@norefs}} \tocitem \@locref{css:change}{\begin{@norefs}\@print{9.3}\quad{}Changing \label{css:change}the style of some instances of an environment{}\end{@norefs}} \tocitem \@locref{whatclass}{\begin{@norefs}\@print{9.4}\quad{}Which class affects\label{whatclass} what{}\end{@norefs}} \tocitem \@locref{sec80}{\begin{@norefs}\@print{9.5}\quad{}A few examples{}\end{@norefs}} \tocitem \@locref{sec84}{\begin{@norefs}\@print{9.6}\quad{}Miscellaneous{}\end{@norefs}} \end{tocenv} \tocitem \@locref{sec89}{\begin{@norefs}\@print{10}\quad{}Customising \hevea{}\end{@norefs}} \begin{tocenv} \tocitem \@locref{sec90}{\begin{@norefs}\@print{10.1}\quad{}Simple changes{}\end{@norefs}} \tocitem \@locref{sec91}{\begin{@norefs}\@print{10.2}\quad{}Changing defaults for type-styles{}\end{@norefs}} \tocitem \@locref{sec92}{\begin{@norefs}\@print{10.3}\quad{}Changing the interface of a command{}\end{@norefs}} \tocitem \@locref{sec93}{\begin{@norefs}\@print{10.4}\quad{}Checking the optional argument within a command{}\end{@norefs}} \tocitem \@locref{sec94}{\begin{@norefs}\@print{10.5}\quad{}Changing the format of images{}\end{@norefs}} \tocitem \@locref{sec95}{\begin{@norefs}\@print{10.6}\quad{}Storing images in a separate directory{}\end{@norefs}} \tocitem \@locref{imagen-source}{\begin{@norefs}\@print{10.7}\quad{}Controlling\label{imagen-source} \texttt{imagen} from document source{}\end{@norefs}} \end{tocenv} \tocitem \@locref{alternative}{\begin{@norefs}\@print{11}\quad{}Other \label{alternative}output formats{}\end{@norefs}} \begin{tocenv} \tocitem \@locref{sec98}{\begin{@norefs}\@print{11.1}\quad{}Text{}\end{@norefs}} \tocitem \@locref{sec99}{\begin{@norefs}\@print{11.2}\quad{}Info{}\end{@norefs}} \end{tocenv} \end{tocenv} \tocitem \@locref{referencemanual}{\begin{@norefs}\@print{Part B}\quad{}\label{referencemanual}Reference manual{}\end{@norefs}} \begin{tocenv} \tocitem \@locref{sec101}{\begin{@norefs}\@print{B.1}\quad{}Commands and Environments{}\end{@norefs}} \begin{tocenv} \tocitem \@locref{sec102}{\begin{@norefs}\@print{B.1.1}\quad{}Command Names and Arguments{}\end{@norefs}} \tocitem \@locref{sec103}{\begin{@norefs}\@print{B.1.2}\quad{}Environments{}\end{@norefs}} \tocitem \@locref{sec104}{\begin{@norefs}\@print{B.1.3}\quad{}Fragile Commands{}\end{@norefs}} \tocitem \@locref{sec105}{\begin{@norefs}\@print{B.1.4}\quad{}Declarations{}\end{@norefs}} \tocitem \@locref{sec106}{\begin{@norefs}\@print{B.1.5}\quad{}Invisible Commands{}\end{@norefs}} \tocitem \@locref{sec107}{\begin{@norefs}\@print{B.1.6}\quad{}The \texttt{\char92\char92} Command{}\end{@norefs}} \end{tocenv} \tocitem \@locref{sec108}{\begin{@norefs}\@print{B.2}\quad{}The Structure of the Document{}\end{@norefs}} \tocitem \@locref{sec109}{\begin{@norefs}\@print{B.3}\quad{}Sentences and Paragraphs{}\end{@norefs}} \begin{tocenv} \tocitem \@locref{sec110}{\begin{@norefs}\@print{B.3.1}\quad{}Spacing{}\end{@norefs}} \tocitem \@locref{sec111}{\begin{@norefs}\@print{B.3.2}\quad{}Paragraphs{}\end{@norefs}} \tocitem \@locref{sec:footnotes}{\begin{@norefs}\@print{B.3.3}\quad{}Footnotes\label{sec:footnotes}{}\end{@norefs}} \tocitem \@locref{accents}{\begin{@norefs}\@print{B.3.4}\quad{}Accents\label{accents} and special symbols{}\end{@norefs}} \end{tocenv} \tocitem \@locref{sec114}{\begin{@norefs}\@print{B.4}\quad{}Sectioning{}\end{@norefs}} \begin{tocenv} \tocitem \@locref{section:section}{\begin{@norefs}\@print{B.4.1}\quad{}\label{section:section}Sectioning Commands{}\end{@norefs}} \tocitem \@locref{appendix}{\begin{@norefs}\@print{B.4.2}\quad{}The \label{appendix}Appendix{}\end{@norefs}} \tocitem \@locref{sec117}{\begin{@norefs}\@print{B.4.3}\quad{}Table of Contents{}\end{@norefs}} \tocitem \ahrefloc{no:number}{Use \hacha{}} \end{tocenv} \tocitem \@locref{sec119}{\begin{@norefs}\@print{B.5}\quad{}Classes, Packages and Page Styles{}\end{@norefs}} \begin{tocenv} \tocitem \@locref{sec120}{\begin{@norefs}\@print{B.5.1}\quad{}Document Class{}\end{@norefs}} \tocitem \@locref{sec121}{\begin{@norefs}\@print{B.5.2}\quad{}Packages and Page Styles{}\end{@norefs}} \tocitem \@locref{sec122}{\begin{@norefs}\@print{B.5.3}\quad{}The Title Page and Abstract{}\end{@norefs}} \end{tocenv} \tocitem \@locref{sec123}{\begin{@norefs}\@print{B.6}\quad{}Displayed Paragraphs{}\end{@norefs}} \begin{tocenv} \tocitem \@locref{sec124}{\begin{@norefs}\@print{B.6.1}\quad{}Quotation and Verse{}\end{@norefs}} \tocitem \@locref{sec125}{\begin{@norefs}\@print{B.6.2}\quad{}List-Making environments{}\end{@norefs}} \tocitem \@locref{sec126}{\begin{@norefs}\@print{B.6.3}\quad{}The \protect\texttt{list} and \protect\texttt{trivlist} environments{}\end{@norefs}} \tocitem \@locref{sec127}{\begin{@norefs}\@print{B.6.4}\quad{}Verbatim{}\end{@norefs}} \end{tocenv} \tocitem \@locref{sec128}{\begin{@norefs}\@print{B.7}\quad{}Mathematical Formulae{}\end{@norefs}} \begin{tocenv} \tocitem \@locref{sec129}{\begin{@norefs}\@print{B.7.1}\quad{}Math Mode Environment{}\end{@norefs}} \tocitem \@locref{sec130}{\begin{@norefs}\@print{B.7.2}\quad{}Common Structures{}\end{@norefs}} \tocitem \@locref{sec131}{\begin{@norefs}\@print{B.7.3}\quad{}Square Root{}\end{@norefs}} \tocitem \@locref{sec132}{\begin{@norefs}\@print{B.7.4}\quad{}Unicode and mathematical symbols{}\end{@norefs}} \tocitem \@locref{sec133}{\begin{@norefs}\@print{B.7.5}\quad{}Putting one thing above/below/inside{}\end{@norefs}} \tocitem \@locref{sec134}{\begin{@norefs}\@print{B.7.6}\quad{}Math accents{}\end{@norefs}} \tocitem \@locref{sec135}{\begin{@norefs}\@print{B.7.7}\quad{}Spacing{}\end{@norefs}} \tocitem \@locref{sec136}{\begin{@norefs}\@print{B.7.8}\quad{}Changing Style{}\end{@norefs}} \end{tocenv} \tocitem \@locref{sec137}{\begin{@norefs}\@print{B.8}\quad{}Definitions, Numbering{}\end{@norefs}} \begin{tocenv} \tocitem \@locref{sec138}{\begin{@norefs}\@print{B.8.1}\quad{}Defining Commands{}\end{@norefs}} \tocitem \@locref{sec139}{\begin{@norefs}\@print{B.8.2}\quad{}Defining Environments{}\end{@norefs}} \tocitem \@locref{sec140}{\begin{@norefs}\@print{B.8.3}\quad{}Theorem-like Environments{}\end{@norefs}} \tocitem \@locref{sec141}{\begin{@norefs}\@print{B.8.4}\quad{}Numbering{}\end{@norefs}} \tocitem \@locref{sec142}{\begin{@norefs}\@print{B.8.5}\quad{}The \texttt{ifthen} Package{}\end{@norefs}} \end{tocenv} \tocitem \@locref{sec143}{\begin{@norefs}\@print{B.9}\quad{}Figures, Tables, and Other Floating Bodies{}\end{@norefs}} \begin{tocenv} \tocitem \@locref{sec144}{\begin{@norefs}\@print{B.9.1}\quad{}Figures And Tables{}\end{@norefs}} \tocitem \@locref{sec145}{\begin{@norefs}\@print{B.9.2}\quad{}Footnotes{}\end{@norefs}} \tocitem \@locref{sec146}{\begin{@norefs}\@print{B.9.3}\quad{}Marginal Notes{}\end{@norefs}} \end{tocenv} \tocitem \@locref{sec147}{\begin{@norefs}\@print{B.10}\quad{}Lining It Up in Columns{}\end{@norefs}} \begin{tocenv} \tocitem \@locref{sec148}{\begin{@norefs}\@print{B.10.1}\quad{}The \protect\texttt{tabbing} Environment{}\end{@norefs}} \tocitem \@locref{sec149}{\begin{@norefs}\@print{B.10.2}\quad{}The \texttt{array} and \texttt{tabular} environments{}\end{@norefs}} \end{tocenv} \tocitem \@locref{sec150}{\begin{@norefs}\@print{B.11}\quad{}Moving Information Around{}\end{@norefs}} \begin{tocenv} \tocitem \@locref{files}{\begin{@norefs}\@print{B.11.1}\quad{}\label{files}Files{}\end{@norefs}} \tocitem \@locref{cross-reference}{\begin{@norefs}\@print{B.11.2}\quad{}Cross-References\label{cross-reference}\label{cross}{}\end{@norefs}} \tocitem \@locref{sec153}{\begin{@norefs}\@print{B.11.3}\quad{}Bibliography and Citations{}\end{@norefs}} \tocitem \@locref{sec155}{\begin{@norefs}\@print{B.11.4}\quad{}Splitting the Input{}\end{@norefs}} \tocitem \@locref{sec156}{\begin{@norefs}\@print{B.11.5}\quad{}Index and Glossary{}\end{@norefs}} \tocitem \@locref{sec157}{\begin{@norefs}\@print{B.11.6}\quad{}Terminal Input and Output{}\end{@norefs}} \end{tocenv} \tocitem \@locref{sec158}{\begin{@norefs}\@print{B.12}\quad{}Line and Page Breaking{}\end{@norefs}} \begin{tocenv} \tocitem \@locref{sec159}{\begin{@norefs}\@print{B.12.1}\quad{}Line Breaking{}\end{@norefs}} \tocitem \@locref{sec160}{\begin{@norefs}\@print{B.12.2}\quad{}Page Breaking{}\end{@norefs}} \end{tocenv} \tocitem \@locref{sec161}{\begin{@norefs}\@print{B.13}\quad{}Lengths, Spaces and Boxes{}\end{@norefs}} \begin{tocenv} \tocitem \@locref{sec162}{\begin{@norefs}\@print{B.13.1}\quad{}Length{}\end{@norefs}} \tocitem \@locref{sec163}{\begin{@norefs}\@print{B.13.2}\quad{}Space{}\end{@norefs}} \tocitem \@locref{sec164}{\begin{@norefs}\@print{B.13.3}\quad{}Boxes{}\end{@norefs}} \end{tocenv} \tocitem \@locref{sec165}{\begin{@norefs}\@print{B.14}\quad{}Pictures and Colours{}\end{@norefs}} \begin{tocenv} \tocitem \@locref{sec166}{\begin{@norefs}\@print{B.14.1}\quad{}The \texttt{picture} environment and the \texttt{graphics} Package{}\end{@norefs}} \tocitem \@locref{sec167}{\begin{@norefs}\@print{B.14.2}\quad{}The \texttt{color} Package{}\end{@norefs}} \end{tocenv} \tocitem \@locref{sec170}{\begin{@norefs}\@print{B.15}\quad{}Font Selection{}\end{@norefs}} \begin{tocenv} \tocitem \@locref{sec171}{\begin{@norefs}\@print{B.15.1}\quad{}Changing the Type Style{}\end{@norefs}} \tocitem \@locref{sec172}{\begin{@norefs}\@print{B.15.2}\quad{}Changing the Type Size{}\end{@norefs}} \tocitem \@locref{sec173}{\begin{@norefs}\@print{B.15.3}\quad{}Special Symbols{}\end{@norefs}} \end{tocenv} \tocitem \@locref{sec174}{\begin{@norefs}\@print{B.16}\quad{}Extra Features{}\end{@norefs}} \begin{tocenv} \tocitem \@locref{sec175}{\begin{@norefs}\@print{B.16.1}\quad{}\TeX{} macros{}\end{@norefs}} \tocitem \@locref{sec181}{\begin{@norefs}\@print{B.16.2}\quad{}Command Definition inside Command Definition{}\end{@norefs}} \tocitem \@locref{sec182}{\begin{@norefs}\@print{B.16.3}\quad{}Date and time{}\end{@norefs}} \tocitem \@locref{fancysection}{\begin{@norefs}\@print{B.16.4}\quad{}Fancy \label{fancysection}sectioning commands{}\end{@norefs}} \tocitem \@locref{winfonts}{\begin{@norefs}\@print{B.16.5}\quad{}Targeting \label{winfonts}Windows{}\end{@norefs}} \tocitem \@locref{mathjax}{\begin{@norefs}\@print{B.16.6}\quad{}\textsf{MathJax} \label{mathjax}support{}\end{@norefs}} \end{tocenv} \tocitem \@locref{sec189}{\begin{@norefs}\@print{B.17}\quad{}Implemented Packages{}\end{@norefs}} \begin{tocenv} \tocitem \@locref{sec190}{\begin{@norefs}\@print{B.17.1}\quad{}AMS compatibility{}\end{@norefs}} \tocitem \@locref{sec191}{\begin{@norefs}\@print{B.17.2}\quad{}The \texttt{array} and \texttt{tabularx} packages{}\end{@norefs}} \tocitem \@locref{calc}{\begin{@norefs}\@print{B.17.3}\quad{}The \texttt{calc}\label{calc} package{}\end{@norefs}} \tocitem \@locref{inputenc}{\begin{@norefs}\@print{B.17.4}\quad{}Specifying \label{inputenc}the document input encoding, the \texttt{inputenc} package{}\end{@norefs}} \tocitem \@locref{sec194}{\begin{@norefs}\@print{B.17.5}\quad{}The \texttt{hyphenat} package{}\end{@norefs}} \tocitem \@locref{sec195}{\begin{@norefs}\@print{B.17.6}\quad{}More symbols{}\end{@norefs}} \tocitem \@locref{commentpack}{\begin{@norefs}\@print{B.17.7}\quad{}The \texttt{comment}\label{commentpack} package{}\end{@norefs}} \tocitem \@locref{multind}{\begin{@norefs}\@print{B.17.8}\quad{}Multiple Indexes with the \texttt{index} and \texttt{multind}\label{multind} packages{}\end{@norefs}} \tocitem \@locref{sec198}{\begin{@norefs}\@print{B.17.9}\quad{}``Natural'' bibliographies, the \texttt{natbib} package {}\end{@norefs}} \tocitem \@locref{sec199}{\begin{@norefs}\@print{B.17.10}\quad{}Multiple bibliographies{}\end{@norefs}} \tocitem \@locref{sec202}{\begin{@norefs}\@print{B.17.11}\quad{}Support for \texttt{babel}{}\end{@norefs}} \tocitem \@locref{urlpackage}{\begin{@norefs}\@print{B.17.12}\quad{}The \label{urlpackage}\texttt{url} package{}\end{@norefs}} \tocitem \@locref{sec207}{\begin{@norefs}\@print{B.17.13}\quad{}Verbatim text: the \texttt{moreverb} and \texttt{verbatim} packages{}\end{@norefs}} \tocitem \@locref{listings:package}{\begin{@norefs}\@print{B.17.14}\quad{}Typesetting \label{listings:package}computer languages: the \texttt{listings} package{}\end{@norefs}} \tocitem \@locref{sec209}{\begin{@norefs}\@print{B.17.15}\quad{}(Non-)Multi page tabular material{}\end{@norefs}} \tocitem \@locref{mathpartir:package}{\begin{@norefs}\@print{B.17.16}\quad{}Typesetting inference rules: the \label{mathpartir:package} \aname{mathpartir}{\texttt{mathpartir}} package{}\end{@norefs}} \tocitem \@locref{sec215}{\begin{@norefs}\@print{B.17.17}\quad{}The \texttt{ifpdf} package{}\end{@norefs}} \tocitem \@locref{sec216}{\begin{@norefs}\@print{B.17.18}\quad{}Typesetting Thai{}\end{@norefs}} \tocitem \@locref{sec217}{\begin{@norefs}\@print{B.17.19}\quad{}Hanging paragraphs{}\end{@norefs}} \tocitem \@locref{sec218}{\begin{@norefs}\@print{B.17.20}\quad{}The \texttt{cleveref} package{}\end{@norefs}} \tocitem \@locref{sec219}{\begin{@norefs}\@print{B.17.21}\quad{}Other packages{}\end{@norefs}} \end{tocenv} \end{tocenv} \tocitem \@locref{practical}{\begin{@norefs}\@print{Part C}\quad{}\label{practical}Practical information{}\end{@norefs}} \begin{tocenv} \tocitem \@locref{sec221}{\begin{@norefs}\@print{C.1}\quad{}Usage{}\end{@norefs}} \begin{tocenv} \tocitem \@locref{sec222}{\begin{@norefs}\@print{C.1.1}\quad{}\hevea{} usage{}\end{@norefs}} \tocitem \@locref{sec227}{\begin{@norefs}\@print{C.1.2}\quad{}\hacha{} usage{}\end{@norefs}} \tocitem \@locref{sec228}{\begin{@norefs}\@print{C.1.3}\quad{}\texttt{esponja} usage{}\end{@norefs}} \tocitem \@locref{bibhva}{\begin{@norefs}\@print{C.1.4}\quad{}\texttt{bibhva}\label{bibhva} usage{}\end{@norefs}} \tocitem \@locref{sec232}{\begin{@norefs}\@print{C.1.5}\quad{}\texttt{imagen} usage{}\end{@norefs}} \tocitem \@locref{sec233}{\begin{@norefs}\@print{C.1.6}\quad{}Invoking \texttt{hevea}, \texttt{hacha} and \texttt{imagen}{}\end{@norefs}} \tocitem \@locref{makefile}{\begin{@norefs}\@print{C.1.7}\quad{}Using \label{makefile}\texttt{make}{}\end{@norefs}} \end{tocenv} \tocitem \@locref{browser}{\begin{@norefs}\@print{C.2}\quad{}Browser \label{browser}configuration{}\end{@norefs}} \tocitem \@locref{sec236}{\begin{@norefs}\@print{C.3}\quad{}Availability{}\end{@norefs}} \begin{tocenv} \tocitem \@locref{sec237}{\begin{@norefs}\@print{C.3.1}\quad{}Internet stuff{}\end{@norefs}} \tocitem \@locref{sec238}{\begin{@norefs}\@print{C.3.2}\quad{}Law{}\end{@norefs}} \end{tocenv} \tocitem \@locref{sec239}{\begin{@norefs}\@print{C.4}\quad{}Installation{}\end{@norefs}} \begin{tocenv} \tocitem \@locref{sec240}{\begin{@norefs}\@print{C.4.1}\quad{}Requirements{}\end{@norefs}} \tocitem \@locref{sec241}{\begin{@norefs}\@print{C.4.2}\quad{}Principles{}\end{@norefs}} \end{tocenv} \tocitem \@locref{sec242}{\begin{@norefs}\@print{C.5}\quad{}Other \LaTeX{} to \html{} translators{}\end{@norefs}} \tocitem \@locref{sec243}{\begin{@norefs}\@print{C.6}\quad{}Acknowledgements{}\end{@norefs}} \tocitem \ahrefloc{@biblio}{\refname} \tocitem \ahrefloc{@index}{Index} \end{tocenv} \end{tocenv} hevea-2.36-manual/previous_motif.svg0000644004317100512160000000027114252364057017640 0ustar marangetcristal hevea-2.36-manual/manual033.html0000644004317100512160000004253414252364056016445 0ustar marangetcristal Moving Information Around Previous Up Next

B.11 Moving Information Around

B.11.1 Files

In some situations, HEVEA uses some of the ancillary files generated by LATEX. More precisely, while processing file doc.tex, the following files may be read:

.aux
The file doc.aux contains cross-referencing information, such as figure or section numbers. If this file is present, HEVEA reads it and put such numbers (or labels) inside the links generated by the \ref command. If the .aux file is not present, or if the hevea command is given the -fix option, HEVEA will instead use .haux files.
.haux
Such files are HEVEA equivalents of .aux files. Indeed, they are .aux files tailored to HEVEA needs. Two runs of HEVEA might be needed to get cross references right.
.htoc
This file contains a formatted table of contents. It is produced while reading the .haux file. As consequence a table of contents is available only when the .haux file is read.
.hbbl
The doc.hbbl file is generated by bibhva from doc.haux. When present, it is read by the \bibliography command.
.bbl
The doc.bbl file is generated by BibTEX from doc.aux. When present, and if no doc.hbbl exists, doc.bbl is read by the \bibliography command.
.hidx and .hind
HEVEA computes its own indexes, using .hidx files for storing index references and, using .hind files for storing formatted indexes. Index formatting significantly departs from the one of LATEX. Again, several runs of HEVEA might be needed to get indexes right.

HEVEA does not fail when it cannot find an auxiliary file. When another run of HEVEA is needed, a warning is issued, and it is user’s responsibility to rerun HEVEA. However, the convenient -fix command-line option instructs HEVEA to rerun itself, until it believes it has reached stable state.

B.11.2 Cross-References

The LATEX commands \label and \ref are changed by HEVEA into html anchors and local links, using the “a” element. Additionally, numerical references to sectional units, figures, tables, etc. are shown, as they would appear in the .dvi file. Numerical references to pages (such as generated by \pageref) are not shown; only an link is generated.

The anchor used is the label argument to \label{label}. More precisely, \label{label} translates to <a id="label"></a>; while \ref{label} translates to <a name="#label">nnn</a>, where nnn is the appropriate numerical reference to a section. As a consequence spaces are better avoided in label.

Starting with HEVEA version 2.04, the html anchors used by \label and \ref cannot differ from the arguments to these commands anymore. Moreover, when \label{label} occurs inside the argument of a sectioning command (i.e. in section title, as recommended by section B.4.1), then HEVEA and HACHA will use label as the “id” attribute of the corresponding section. For instance, the LATEX source of this very section is:

\subsection{Cross-References\label{cross-reference}}

It translates to html similar to

<h3 class="subsection" id="cross-reference">B.11.2&#XA0;&#XA0;Cross-References</h3>

Notice that no <a id="cross-reference"></a> appears above. Instead id="cross-reference" appears in the enclosing h3 header element.

While processing a document doc.tex, cross-referencing information can be computed in two different, mutually exclusive, ways, depending on whether LATEX has been previously run or not:

  • If there exists a file doc.aux and that hevea has not been given the command-line option -fix, then cross-referencing information is extracted from that file. Of course, the doc.aux file has to be up-to-date, that is, it should be generated by running LATEX as many times as necessary. (For HEVEA needs, one run is probably sufficient).
  • If no doc.aux file exists or if hevea has been given the -fix command-line option, then HEVEA expect to find cross-referencing information in the file doc.haux.

The second option is recommended.

When using its own doc.haux file, HEVEA will output a new doc.haux file at the end of its processing. This new doc.haux file contains actualised cross referencing information. Hence, in that case, HEVEA may need to run twice to get cross-references right. Note that, just like LATEX, HEVEA issues a warning then the cross-referencing information it generates differs from what it has read at start-up, and that it does not fail if doc.haux does not exist.

Observe that if a non-correct doc.aux file is present, then cross-references will apparently be wrong. However the links are correct.

B.11.3 Bibliography and Citations

The \cite macro is supported. Its optional argument is correctly handled. Citation labels are extracted from the .aux file if present, from the .haux file otherwise. Note that these labels are put there by LATEX in the first case, and by HEVEA in the second case, when they process the \bibitem command.

Using BibTEX

All BibTEX related commands exist and echo the appropriate information into the .haux file.

In particular, the \bibliography command exists and attempts to load the formatted bibliography, i.e. to load the .hbbl file. The .hbbl file is produced from the .haux file by the companion program bibhva (see C.1.4). To include the bibliographic references extracted from .bib databases, it should normally suffice to do:

# hevea doc.tex
# bibhva doc
# hevea doc.tex

In case no .hbbl file exists, the \bibliography command attempts to load the .bbl file normally used while combining LATEX and BibTEX. Thus, another way to extract bibliographic references from .bib databases is:

# latex doc.tex
# bibtex doc
# hevea doc.tex

In case both files exist, notice that loading the .hbbl file has priority over loading the .bbl file.

B.11.4 Splitting the Input

The \input and \include commands exist and they perform exactly the same operation of searching (and then processing) a file, whose name is given as an argument. See section C.1.1.1 on how HEVEA searches files. However, in the case of the \include command, the file is searched only when previously given as an argument to the \includeonly command.

Note the following features:

  • TEX syntax for \input is not supported. That is, one should write \input{filename}.
  • If filename is excluded with the -e command-line option (see section C.1.1.4), then HEVEA does not attempt to load filename. Instead, it echoes \input{filename} and \include{filename} commands into the image file. This sounds complicated, but this is what you want!
  • HEVEA does not fail when it cannot find a file, it just issues a warning.

The \listfiles command is a null command.

B.11.5 Index and Glossary

Glossaries are not handled. (Who uses them anyhow?)

While processing a document doc.tex, index entries go into the file doc.hidx, while the formatted index gets written into the file doc.hind. As with LATEX, two runs of HEVEA are normally needed to format the index. However, if all index producing commands (normally \index) occur before the index formatting command (usually \printindex), then only one run is needed.

As in LATEX, index processing is not enabled by default and some package has to be loaded explicitly in the document preamble. To that aim, HEVEA provides the standard packages makeidx and imakeidx, as well as two extended packages that allow the production of several indexes (see section B.17.8).

Formatting of indexes in HEVEA departs from LATEX behaviour: environment the@hevea@index replaces the theindex environment; the@hevea@index places all index entries in class theindex. The environment can be modified with the commonly accepted magic:

\let\OldTheIndex\the@hevea@index
\let\OldEndTheIndex\endthe@hevea@index
\renewenvironment{the@hevea@index}%
                 {\OldTheIndex ...}%
                 {... \OldEndTheIndex}

An optional index prolog paragraph gets the ID indexprologue such that it can be manipulated with CSS as, for example:

p#indexprologue {
  font-size: smaller;
}

The index entries themselves are formatted using special indexenv environments. Those details do not normally concern users. However, the number of columns in the presentation of the index can be controlled by setting the value of the indexcols counter (default value is two). And the boolean indexcolseprule toggles typesetting rules between index columns (default is false, which means no rules).

B.11.6 Terminal Input and Output

The \typeout command echos its argument on the terminal, macro parameter #i are replaced by their values. The \typein command is not supported.


Previous Up Next hevea-2.36-manual/manual-packages.html0000644004317100512160000020042114252364057017763 0ustar marangetcristal Implemented Packages Previous Up

B.17 Implemented Packages

HEVEA distribution includes .hva packages that are implementations of LATEX packages. Packages described in the “Blue Book” (makeidx, ifthen, graphics —and graphicx!—, color, alltt) are provided. Additionally, quite a few extra packages are provided. I provide no full documentation for these packages, users should refer to the first pages of the package documentation, which can usually be found in the book [LATEX-bis], in your local LATEX installation or in a TeX CTAN-archive.

At the moment, most package options are ignored, except for the babel package, where it is essential.

B.17.1 AMS compatibility

HEVEA amsmath package defines some of the constructs of the amsmath package. At the moment, supported constructs are the cases environment and matrix environments [LATEX-bis, Section 8.4], the environments for multi-line displayed equations (gather, split,…) [LATEX-bis, Section 8.5] and the \numberwithin command [LATEX-bis, Section 8.6.2].

HEVEA provides support for the amssymb symbols using Unicode. I found Unicode equivalent for most symbols. However, a few symbols remain undefined (e.g. \varsubsetneqq).

B.17.2 The array and tabularx packages

The array package is described in [LATEX-bis, Section 5.3] and in the local documentation of modern LATEX installations. It is a compatible extension of LATEX arrays (see B.10.2). Basically, it provides new column specifications and a \newcolumntype construct for user-defined column specifications. Table 1 gives a summary of the new column specifications and of how HEVEA implements them.


Table 1: Column specifications from the array package
m{width}Equivalent to the p column specification (the width argument is ignored, entries are typeset in paragraph mode with paragraph breaks being reduced to a single line break), except that the entries are centered vertically.
b{width}Equivalent to the p column specification, except that the entries are bottom-aligned vertically.
>{decl}Can be used before l, c, r, p{}, m{} or b{}. It inserts decl in front of the entries in the corresponding column.
<{decl}Can be used after l, c, r, p{}, m{} or b{}. It inserts decl after entries in the corresponding column.
!{decl}Equivalent to @{decl}

Note that centered, top-aligned or bottom-aligned in the vertical direction, do not have exactly the same meaning in LATEX and in html. However, the aspect is the same when all columns agree w.r.t. vertical alignment. Ordinary column types (c, l and r) do not specify vertical alignment, which therefore becomes browser dependent.

The >{decl} and <{decl} constructs permit the encoding of TEX \cases macro as follows:

\def\cases#1{\left\{\begin{array}{l>{$}l<{$}}#1\end{array}\right.}

(This is an excerpt of the latexcommon.hva file.)

New column specifications are defined by the \newcolumntype construct:

\newcolumntype{col}[narg]{body}

Where col is one letter, the optional narg is a number (defaults to 0), and body is built up with valid column specifications and macro-argument references (#int). Examples are:

\newcolumntype{C}{>{\bf}c}
\newcolumntype{E}[1]{*{#1}{c}}
\begin{tabular}{CE{3}}\hline
one & two & three & four \\
five & six & seven & eight \\ \hline
\end{tabular}

The column specification C means that entries will be typeset centered and using bold font, while the column specifications E{num} stands for num centered columns. We get:

onetwothreefour
fivesixseveneight

HEVEA implements column specifications with commands defined in the \newcommand style. Thus, they have the same behaviour as regards double definition, which is not performed and induces a warning message. Thus, a column specification that is first defined in a macro.hva specific file, overrides the document definition.

The tabularx package [LATEX-bis, Section 5.3.5] provides a new tabular environment tabularx and a new column type X. HEVEA makes the former equivalent to tabular and the latter equivalent to p{ignored}. By contrast with the subtle array formatting that the tabularx package performs, this may seem a crude implementation. However, rendering is usually correct, although different.

More generally and from the html point of view such sophisticated formatting is browser job in the first place. However, the html definition allows suggested widths or heights for table entries and table themselves. From HEVEA point of view, drawing the border line between what can be specified and what can be left to the browser is not obvious at all. At the moment HEVEA choice is not to specify too much (in particular, all length arguments, either to column specifications or to the arrays themselves, are ignored). As a consequence, the final, browser viewed, aspect of arrays will usually be different from their printed aspect.

B.17.3 The calc package

The calc package enables using traditional, infix, notation for arithmetic operations inside the num argument to the \setcounter{name}{num} and \addtocounter{name}{num} constructs (see [LATEX-bis, Section A.4])

The calc package provides a similar extension of the syntax of the len argument to the \setlength and \addtolength constructs. HEVEA does not implement this extension, since it does not implement length registers in the first place.

B.17.4 Specifying the document input encoding, the inputenc package

The inputenc package enables LATEX to process a file according to various 8 bits encodings, plus UTF-8. The one used encoding is specified as an option while loading the package \usepackage[encoding]{inputenc}. At the moment, HEVEA recognises ten latin encodings (from latin1 to latin10), the koi8-r encoding, the ascii encoding, four windows encodings, the applemac encoding, and the utf8 encoding. It is important to notice that loading the inputenc package alters the html document charset. For instance if the latin9 input encoding is selected by:

\usepackage[latin9]{inputenc}

Then, the document charset is ISO-8859-15, which is an enhanced version of ISO-8859-1 with some characters for Œ, œ and €. The rationale behind changing the output document charset at the same time as changing the input encoding is to allow non-ascii bytes in the input file to be replicated as themselves in the output file.

However, one can change the document charset (and the output translator) by using the internal command \@def@charset. For instance, one can specify latin1 encoding, while producing html pages in ascii:

\usepackage[latin1]{inputenc}
%HEVEA\@def@charset{US-ASCII}

See section 8.6 for a more thorough description of html charset management.

The inputenc package also provides the command \inputcoding{encoding} that changes the input encoding at any time. The argument encoding can be any of the options accepted by \usepackage[encoding]{inputenc}. The command \inputcoding of HEVEA follows the behaviour of its LATEX counterpart, it the sense that it obeys scope rules. Notice that \inputcoding does not change the document output encoding and charset.

B.17.5 The hyphenat package

Control of hyphenation on the HTML-side is much more limited than on the LATEX-side. Therefore, the functionality of the ported hyphenat package is limited. The package options none and htt are ignored.

B.17.6 More symbols

HEVEA implements the following packages: latexsym amssymb, textcomp (a.k.a. “Text companion”) and eurosym (a nice € symbol in LATEX).

B.17.7 The comment package

The comment package provides two commands, \excludecomment and \includecomment, for (re-)defining new environments that ignore their content or that do nothing. The comment environment is also defined as an environment of the first kind.

B.17.8 Multiple Indexes with the index and multind packages

HEVEA supports several simultaneous indexes, following the scheme of the index package, which is present in modern LATEX distributions. This scheme is backward compatible with the standard indexing scheme of LATEX.

Support is not complete, but the most useful commands are available. More precisely, HEVEA knows the following commands:

\newindex{tag}{ext}{ignored}{indexname}
Declare an index. The first argument tag is a tag to select this index in other commands; ext is the extension of the index information file generated by LATEX (e.g., idx); ignored is ignored by HEVEA; and indexname is the title of the index. There also exists a \renewindex commands that takes the same arguments and that can be used to redefine previously declared indexes.
\makeindex
Perform \newindex{default}{idx}{ind}{Index}.
\index[tag]{arg}
Act as the LATEX \index command except that the information extracted from arg goes to the tag index. The tag argument defaults to default, thereby yielding standard LATEX behaviour for the \index command without an optional argument. There also exists a stared-variant \index* that Additionally typesets arg.
\printindex[tag]
Compute, format and output index whose tag is tag. The tag argument defaults to default.

The multind package is supported to some extend, but index is definitely to be preferred.

B.17.9 “Natural” bibliographies, the natbib package

LATEX version of natbib is present in modern installations.

Implementation is quite complete and compatible with version 8.0 of the natbib package (with the keyval style command \setcitestyle).

Unimplemented features are the sorting and compression of references. Automatic generation of an index of citations is handled, but the current implementation probably is quite fragile.

B.17.10 Multiple bibliographies

The multibib package

HEVEA provides a slightly incomplete implementation of the multibib package. The one non-implemented feature is the simultaneous definition of more than one bibliography. That is one cannot invoke \newcites as follows:

\newcites{suf1, suf2}{Title1, Title2}

Instead, one should perform to calls to the \newcites command:

\newcites{suf1}{Title1}\newcites{suf2}{Title2}

The chapterbib package

A basic implementation is provided. At the moment, you can define one bibliography per included file and no toplevel bibliography. HEVEA implementation of this package recognises the option sectionbib and provides the command \sectionbib to change the sectioning command introduced by bibliographies.

B.17.11 Support for babel

B.17.11.1 Basics

HEVEA offers support for the LATEX package babel. When it reads the command

  \usepackage[LANG-LIST]{babel}

it loads babel.hva, and sends it the saved LANG-LIST. The file babel.hva then looks at each language (say x) in it, and loads x.hva, which offers support for the language x. As in LATEX, the last language in the list is selected as default; it also determines the document’s language, this is, the lang attribute of its html element. As an example the command

\usepackage[english,french,german]{babel}

would load babel.hva, then the files english.hva, french.hva, german.hva containing the respective definitions, and finally activate the definitions in german.hva and sets the current language to german.

B.17.11.2 Commands and languages

The following babel commands for changing and querying the language work as in LATEX:

  1. \selectlanguage{LANG}: Change the language to LANG.
  2. \iflanguage{LANG}: Branch after comparing LANG with current language.
  3. \foreignlanguage{LANG}{TEXT}: Switch to language LANG and then typeset TEXT.
  4. \begin{OTHER-LANG}\end{OTHER-LANG}: Select language OTHER-LANG in an environment. HEVEA is frugal – only those languages are allowed for OTHER-LANG that have been announced in the LANG-LIST; see section B.17.11.1.
  5. \begin{OTHER-LANG*}\end{OTHER-LANG*}: Same as above.
  6. \begin{hyphenrules}{LANG}\end{hyphenrules}: Switch only the hyphenation rules to those of LANG.
  7. \hyphenrules{LANG}: Same as above in the form of a macro.

Items 3, 4, and 5 use CSS class foreignlanguage, which can be defined by the user (it is not defined by HEVEA).

The language specific details are described in the corresponding .hva file, just as in the .sty file for LATEX. Users need to supply this file for their language, or modify/check the files if they are already supplied with the distribution. The list of languages is given below.

americanaustrianbrazilcatalan
checkcroatiandanishdutch
englishesperantofinnishfrench
galiciangermanitalianmagyar
norsknynorskpolishportuguese
romanianrussianslovakslovene
spanishswedishturkish 

B.17.11.3 Writing hva files

The languages for which .hva files are available with the distribution are english, french, german, austrian, czech and portuguese. These may need to be modified as not all accents and hyphenation techniques are supported.

They can be written/modified as simple TEX files (see the section  B.16.1.1 on writing TEX macros for details). As an example, one may also take a look at the file french.hva, which describes the details for french.

Note how all definitions are inside the definition for \french@babel, which is the command that \selectlanguage{french} would call. Similar commands need to be provided (i.e. \x@babel in \x.hva for language x).

Notice that it is wise to write the \x.hva in plain ascii only. Some definitions may involve specifying Unicode characters, for doing so, using the \@print@u is recommended (cf. Section 8.3). The definition of Unicode characters can be found at http://www.unicode.org/charts/. Most language specific Unicode characters can be found in the first few files.

B.17.12 The url package

LATEX source.

This package in fact provides a enhanced \verb command that can appear inside other command arguments. This command is named \url, but it can be used for any verbatim text, including DOS-like path names. Hence, one can insert urls in one’s document without worrying about LATEX active characters:

This is a complicated url: \url{http://foo.com/~user#label%coucou}.

which gets typeset as: “This is a complicated url: http://foo.com/~user#label%coucou.”

The main use for the \url command is to specify urls as arguments to HEVEA commands for hyperlinks (see section 8.1.1):

\hevea{} home page is
\ahrefurl{\url{http://hevea.inria.fr/}}

It yields: “HEVEA home page is http://hevea.inria.fr/”.

However the \url command is fragile, as a consequence it cannot be used inside \footahref first argument (This is a LATEX problem, not an HEVEA one). The url package solves this problem by providing the \urldef command for defining commands whose body is typeset by using \url:

\urldef{\heveahome}{\url}{http://hevea.inria.fr/}

Such a source defines the robust command \heveahome as the intended url. Hence the following source works as expected:

Have a look at \footahref{\heveahome}{\hevea{} home page}

It yields: “Have a look at HEVEA home page”.

Using \url inside command definitions with a #i argument is a bad idea, since it gives “verbatim” a rather random meaning. Unfortunately, in some situations (e.g, no %, no #), it may work in LATEX. By contrast, it does not work in HEVEA. In such situations, \urldef should be used.

HEVEA implementation is somehow compatible at the “programming level”. Thus, users can define new commands whose argument is understood verbatim. The urlhref.hva style file from the distribution takes advantage of this to define the \url command, so that it both typesets an url and inserts a link to it.

\input{urlhref.hva}
Have a look at \url{http://hevea.inria.fr/}

It yields “Have a look at http://hevea.inria.fr/”. The urlhref.hva style file (which is an HEVEA style file and not a LATEX style file) can be adequate for bibliographic references, which often use \url for its typesetting power. Of course, loading urlhref.hva only makes sense when all arguments to \url are urls…

B.17.13 Verbatim text: the moreverb and verbatim packages

These two packages provide new commands and environments for processing verbatim text. I recommend using moreverb rather than verbatim, since HEVEA implementation is more advanced for the former package.

B.17.14 Typesetting computer languages: the listings package

I strongly recommend the listings package. Learning the user interface requires a little effort, but it is worth it.

HEVEA features a quite compatible implementation, please refer to the original package documentation. Do not hesitate to report discrepancies. Note that HEVEA does not produce very compact html in case you use this package. This can be cured by giving hevea the command-line option -O (see C.1.1.4).

The lstlisting environment is styled through an homonymous style class (see 9.2 and 9.3) and most lstlisting environments get translated to div elements with the appropriate \getenvclass{lstlisting} class, which, by default is lstlisting. A few points deserve mention:

  1. The definition of default style class lstlisting includes the important declarations font-family:monospace; and white-space:pre;, which, more or less, specify non-proportional font and mandatory line breaks. In case you replace lstlisting by another style class (by \setenvclass{lstlisting}{another one}), your alternate definition should probably feature an identical specification. Otherwise, rendering would be poor, as regards spacing and line breaks. Here is how specific listings are styled. We first define a new environment to typeset programs written in the C language, by using the command \lstnewenvironment:
    \lstdefinestyle{colors}{keywordstyle={\bf\color{blue}}, commentstyle={\em\color{magenta}}}
    \lstnewenvironment{clisting}
      {\setenvclass{lstlisting}{clisting}\lstset{language=C, style=colors}}
      {}
    
    The command \lstnewenvironment{name}{starting code}{ending code} is from the listings package, with similar semantics. In the starting code above, the fragment \setenvclass{lstlisting}{clisting} instructs HEVEA to use the style class clisting locally (notice that it could just be another name). The style class clisting is defined in the document preamble as follows:
    \newstyle{.clisting}{font-family:monospace;white-space:pre;
    border-left:solid black;padding-left:2ex;margin-left:2ex;}
    
    Typesetting a C listing with a black border on the left is then as simple as:
    \begin{clisting}
    /* Compute, guess what! */
    int fact(int n) {
      int r = 1 ;
      for ( ; n > 0 ; n--) {
        r *= n ;
      }
      return r ;
    }
    \end{clisting}
    
    The final result is:
    /* Compute, guess what! */ int fact(int n) { int r = 1 ; for ( ; n > 0 ; n--) { r *= n ; } return r ; }
  2. When listings are framed, that is, when some frame=… or background=… keyval specifications are active, they no longer get translated to div elements. Instead they get translated to one cell tables whose td and table elements are styled through style classes lstlisting and lstframe, respectively. Of course, those two style classes follow the usual \setenvclass/\getenvclass mechanism. That way, one can for instance center all framed listings by issuing the following declaration in the document preamble:
    \newstyle{.lstframe}{margin:auto;}
    
    Notice that the default style class lstframe is empty.
  3. Unfortunately the white-space:pre; style declaration is still a bit young, and some browsers implement it in rather incomplete fashion. This is particularly true as regards text copy-pasted from browser display. In case you want to provide your readers with easy copy-paste of listings, you can, by issuing the command \lstavoidwhitepre in the document preamble. Then, white-space:pre; is not used any longer: spaces get rendered by non-breaking space entities and line-breaks by <BR> elements, which significantly increase output size. However, as a positive consequence, display remains correct and text copy-pasted from browser display indeed possesses the line-breaks shown in display.

B.17.15 (Non-)Multi page tabular material

LATEX source for the longtable and supertabular packages.

Those two packages provide LATEX users with the possibility to typeset tabular material over several pages [LATEX-bis, Section 5.4]. Of course, HEVEA does not care much about physical pages. Thus the supertabular and longtable environments are rendered more or less as tabular environments inside table environments.

B.17.16 Typesetting inference rules: the mathpartir package

The mathpartir package, authored by D. Rémy, essentially provides two features:

  1. An environment mathpar for typesetting a sequence of math formulas in mixed horizontal and vertical mode. The environment selects the best arrangement according to the line width, exactly as paragraph mode does for words.
  2. A command \inferrule (and its starred variant) for typesetting inferences rules.

We give a short description, focussing on HEVEA-related details. Users are encouraged to refer to the original documentation of the package.

In the following, comments on rule typesetting apply to HEVEA output and not to LATEX output.

B.17.16.1 The mathpar environment

In its LATEX version, the mathpar environment is a “paragraph mode for formulas”. It allows to typeset long list of formulas putting as many as possible on the same line:

\begin{mathpar} A-Formula \and Longer-Formula \and And \and The-Last-One \end{mathpar}
    
AFormula
LongerFormula
And
TheLastOne

In the example above, formulas are separated with \and. The LATEX implementation also changes the meaning of paragraph breaks (either explicit as a \par command or implicit as a blank line) to act as \and. It also redefines the command \\ as an explicit line-break in the flow of formulas.

\begin{mathpar} \int_0^2 xdx = \frac{3}{2} \\ \int_0^3 xdx = \frac{5}{2} \end{mathpar}
    
2


0
xdx = 
3
2
3


0
xdx = 
5
2

The HEVEA version is simplistic: Formulas are typeset in math display mode, \and separators always produce horizontal space, while \\ always produce line-breaks. However, when prefixed by \hva the meaning of explicit separators is reversed: that is, \hva\and produces a line-break, while \hva\\ produces horizontal space. Hence, we can typeset the previous example on two lines:

\begin{mathpar} A-Formula \and Longer-Formula \hva\and And \and The-Last-One \end{mathpar}
    
AFormula
LongerFormula
And
TheLastOne

It is to be noticed that the LATEX version of the package defines \hva as a no-op, so as to allow explicit instructions given to HEVEA not to impact on the automatic typesetting performed by LATEX.

B.17.16.2 The inferrule macro

The \inferrule macro is designed to typeset inference rules. It should only be used in math mode (or display math mode). It takes three arguments, the first being optional, specifying the label, premises, and conclusions respectively. The premises and the conclusions are both lists of formulas, and are separated by \\. A simple example of its use is

\inferrule
  [label]
  {one \\ two \\ three \\ or \\ more \\ premises}
  {and \\ any \\ number \\ of \\ conclusions \\ as \\ well}

which gives the following rendering:

label
one       two       three       or       more       premises
and       any       number       of       conclusions       as       well

Again, HEVEA is simplistic. Where LATEX performs actual typesetting, interpreting \\ as horizontal or vertical breaks, HEVEA always interpret \\ as an horizontal break. In fact HEVEA interpret all separators (\\, \and) as horizontal breaks, when they appear in the arguments of the \inferrule command. Nevertheless prefixing separators with \hva yields vertical breaks:

\inferrule {aa \hva\\ bb} {dd \\ ee \\ ff}
    
aa
bb
dd       ee       ff

The color of the horizontal rule that separates the premises and conclusions can be changed by redefining the command \mpr@hhline@color. This color must be specified as a low-level color (cf. Section B.14.2.2).

B.17.16.3 Options

By default, lines are centered in inference rules. However, this can be changed either by using \mprset{flushleft} or \mprset{center}, as shown below.

$$\mprset{flushleft} \inferrule {a \\ bbb \hva\\ ccc \\ dddd} {e \\ ff \hva\\ gg} $$
    
a       bbb  
ccc       dddd
e       ff
gg

B.17.16.4 Derivation trees

The mathpartir package provides a starred variant \inferrule*. In LATEX, the boxes produced by \inferrule and \inferrule* differ as regards their baseline, the second being well adapted to derivation trees. All this is irrelevant to HEVEA, but \inferrule* remains of interest because of its interface: the optional argument to the \inferrule* command is a list of key=value pairs in the style of keyval. This makes the variant command much more flexible.

keyEffect for value v
beforeExecute v before typesetting the rule. Useful for instance to change the maximal width of the rule.
leftPut a label v on the left of the rule
LeftIdem.
rightAs left, but on the right of the rule.
RightAs Left, but on the right of the rule.
labPut a label v above the inference rule, in the style of \inferrule.
LabIdem.
vdotsRaise the rule by v and insert vertical dots, the length argument is translated to a number of line-skips.

Additionally, the value-less key center centers premises and conclusions (this is the default), while flushleft commands left alignment of premises and conclusions (as \mprset{flushleft} does). Other keys defined by the LATEX package exist and are parsed, but they perform no operation.

As an example, the code

\begin{mathpar} \inferrule* [Left=Foo] {\inferrule* [Right=Bar,width=8em, leftskip=2em,rightskip=2em,vdots=1.5em] {a \and a \and bb \hva\\ cc \and dd} {ee} \and ff \and gg} {hh} \hva\and \inferrule* [lab=XX]{uu \and vv}{ww} \end{mathpar}

produces the following output:

Foo 
a       a       bb Bar
cc       dd 
ee 
      ff       gg
 hh
XX
uu       vv
ww

B.17.17 The ifpdf package

This package should be present in modern latex installations. Basically, the package defines a boolean register pdf, whose value is true for tools that produce PDF (such as pdflatex) and false for tools that produce DVI (such as latex).

The hevea version of the package simply defines the boolean register pdf with initial value true. Command-line option -pdf is also added to imagen command-line options (by using the command \@addimagenopt, see Section 10.7). As a result, imagen will normally call pdflatex in place of latex.

In case standard latex processing in imagen is wished, one can issue the command \pdffalse after loading the ifpdf package and before \begin{document}. Then, no command line option is added. Hence, to achieve latex processing of the image file, while still loading the ifpdf package, one writes:

\usepackage{ifpdf}
%HEVEA\pdffalse

B.17.18 Typesetting Thai

HEVEA features an implementation of Andrew Seagar’s technique for Thai in LATEX, by the means of the package thai.hva in the distribution.

As regards input encoding, Thai users of HEVEA could (perhaps) use \usepackage[utf8]{inputenc}. However, the typesetting of Thai is more subtle than just proper characters. For that reason, Thai in LATEX is better performed by another technique, which HEVEA supports. See this specific document.

B.17.19 Hanging paragraphs

The hanging package is implemented. HEVEA implementation consists of no-ops, except for the hangparas environment, which is partially implemented. Assume the following usage of hangparas:

\begin{hangparas}{wd}{n}  …\end{hangparas}

where wd is a length that makes sense both for LATEX and CSS (typically 2ex). Then html output will reproduce LATEX output for n=1, regardless of the given value of argument n. That is, in any paragraph inside the environment, all lines except the first get indented by wd.

B.17.20 The cleveref package

The cleveref package attempts (and mostly succeeds) typesetting references cleverly. Its main feature is a \cref command that accepts several, comma separated, label references and typesets them as a list (which can be one-element long, of course) prefixed with sectional unit names. The HEVEA implementation is quite complete, but it does not support some of the subtleties of the LATEX implementations, especially as regards customisation.

B.17.21 Other packages

The fancyverb and colortbl packages are partly implemented.

The xspace package is implemented, in simple cases, rendering is satisfactory, but beware: HEVEA differs significantly from TEX, and discrepancies are likely.

The chngcntr package is implemented. This package provides commands to connect (and disconnect) counters once they are created (see http://www.tex.ac.uk/cgi-bin/texfaq2html?label=addtoreset).

The import package is partially implemented: all starred commands are missing.

The booktabs package is implemented. This package provides nicer rulers in tables as specific commands. HEVEA defines those as no-ops.


Previous Up hevea-2.36-manual/manual009.png0000644004317100512160000000612714252364056016266 0ustar marangetcristalPNG  IHDRYVySgbKGD̿ pHYsaa?itIME 2p rIDAThA%I3 -"!E< xh(=   WFrQV-7,OĕZǚJ/+3_몞]ō_׫DfP'wZI 5x<PO<OeZ^ژD*͠b O(KM:&{@~45<Լ_T~Wu==>f.y?`B4@?@â6FӇ9@况TxOSq0]Ƨ&K, caKZsD9UW.pގOUt^Ϭ}; D]:IE2H9.PhܩJ;]M*1h^q@E OF<✎-GA5 cӓ({y6LEvQ~hR4Ǫ2r( >|?=1Ǿ+uK-⍙~ /|f?/( 4YtU l뵶4Q &-z<*A \Ϣ*zd 8a<0Ȯ5`tXd+iJ 45EyVQa/rf!-PP8h`#DGgGچi0< O2\R[<<x}^VG5=B/pBGaT,vWgLHhXwAy3%EV-_NCAɊD{HK|{͓0: ~ ]|E}u,z4WfTlH@%7!UFߖ&ҽ)z<q@P$<uCYȂXe N! YiCRRE0k)LJzd7}+'eNM֠nB[OEy&Ų4d370IZ#pCM2޷Iϔ a6Ϝe&Gʘ̀޸ydTug-F+2x)hgADV)l+ Ld24WvQ0LEG>B:Ĭ]";hym<byIؚV">׫*2q{lqXnwN]ޑ w^ ,EGM+R&#JADzQSAxPp+U9= mV{}s(<|$غ]U`*[9 RUr,!rX'QXw]hOvMsgrM/׊k`S,?KVK3^63╨gWx %1(wQPo`.e$"D{/ n#]AVnrs(9=*wzbS;B'\Nh ,6<("7t8yq8L4U5nbSӈi ج1XU# hevea-2.36-manual/thaihevea.html0000644004317100512160000003055514252364060016673 0ustar marangetcristal How to Use HEVEA with the Thai Character Set

How to Use HEVEA with the Thai Character Set

Andrew Seagar and นิตยา ซีการ์
email: dr_andrew_seagar@ieee.org

1 Latin/Thai Character Set

Thai LATEX is written in the TIS-620 character encoding. Some people call this ISO-8859-11, but that name was (for a long time) never officially recognised.

The TIS-620 character encoding is an 8-bit single byte character set. It encodes both the ASCII Latin characters (0-127) and the Thai characters (128-255). See, for the official Thai definition, the docuemnt:
“ISO 8859-11 Latin/Thai Character Set standard”
at the website:
www.nectec.or.th/it-standards/iso8859-11/

Non-Thai variations to the official Thai character set were introduced by some vendors. The Windows Thai character set (874) places an unofficial ‘smart quote’ character into one of the empty (illegal) slots in the official Thai set. The DEC (Digital Equipement Coorporation) character set places an unofficial ‘no-break space’ character into another of the empty (illegal) slots in the original official Thai set. It is not too clear what is now “official” and what is not. It is necessary to be a little bit careful. Importing “Thai” docuemnts from Windows into a Linux environment via (for example) Openoffice doesn’t always produce a faithful copy of the original text.

Figure 1 shows the Thai characters according to the Unicode Standard (version 3.0).

2 Thai in LATEX

For Thai in LATEX the package ‘thai’ (file: thai.sty) is used, i.e. \usepackage{thai}.

The source is run through a preprocessor (cttex) to encapsulate all Thai text within bracketted pairs {\thai ....} and to insert the thai-break ‘\tb’ separator.

Normally Thai text is written in a continuous stream with few (if any) blank (space) characters. The preprocessor inserts the ‘\tb’ command to indicate places where the text may be broken if near the end of a line. If these separators are not inserted LATEX has a great deal of trouble in getting a flush right margin without leaving huge gaps in the text.

The style file ‘thai.sty’ contains the definitions for {\thai ....} and \tb. The {\thai ....} command is used to switch the LATEX font.

After passing through the preprocessor, the file is compiled by LATEX in the normal fashion.

3 Thai in HEVEA

For HEVEA the style (package) file ‘thai.sty’ is not used. HEVEA does not recognise the {\thai ....} or \tb constructs. If these constructs are encountered, warnings will be issued and the constructs will be ignored.

In order to use the Thai language with HEVEA, the preprocessor which is normally used before invoking LATEX should not be used. The original (as typed) Thai LATEX file should be passed directly to HEVEA. The command \usepackage{thai} in the file is detected by HEVEA and is used to establish a Thai character encoding. (It is no longer necessary to use the command line flag –charset=TIS-620. This flag is no longer operational).

The commands required to process this file for both Thai LATEX and Thai HEVEA are listed in table 1. The original LATEX filename is assumed to be ‘thaihevea.ttex’ (ttex = Thai tex).


for LATEX 
cttex < thaihevea.ttex > thaihevea.texrun preprocessor
latex thaihevea.texcompile using LATEX
dvips thaihevea.dvi -oconvert using dvips
gv thaihevea.psview using ghostview
for HEVEA 
cp thaihevea.ttex thaihevea.tex‘rename’ file for benefit of HEVEA
hevea thaihevea.texcompile using HEVEA
imagen thaiheveaconvert image to bitmap
firefox thaihevea.htmlview using web browser
Table 1: Processing Thai text with LATEX and HEVEA.

Since the Thai text is not processed to indicate where the text may be broken, the decision is left to the application displaying the html code. The browser I currently use (Firefox) doesn’t know how to break continuous Thai text in suitable places without external help. However the screen width is larger than a page width, which means that on average there are more natural breaks in any line, and the browser is left justifying the text so it doesn’t make large ugly gaps. The right margin is ragged, not flush, but that looks acceptable (to me).

Following is a paragraph of Thai text. It doesn’t say anything important, it is simply here to serve as a basic test. Even if you can’t compile this with LATEX (e.g. you don’t have the file thai.sty or a Thai character set for printing), you can still compile it with HEVEA and make an English/Thai web page.

If you want to eliminate the Thai so you can compile an English-only version of this document, simply insert a comment % character before the \thaistuff command at the top of the file and uncomment the second version of the command (which eliminates the Thai) on the adjacent line.

ศึกษาความหมาย ความสำคัญของสิ่งแวดล้อมศึกษา วิธีการเผยแพร่ประชาสัมพันธ์ ความรู้ทางสิ่งแวดล้อม วิธีการเขียนแผนงานเพื่อเผยแพร่ความรู้ทางสิ่งแวดล้อม นำ สิ่งแวดล้อมศึกษาไปประยุกต์ใช้ในการพัฒนาและเผยแพร่ความรู้ข้อมูล ข่าวสารต่างๆ ในโครงการอื่นๆ ที่มีความสัมพันธ์เกี่ยวข้อง


Figure 1: Thai Character Set


This document was translated from LATEX by HEVEA.
hevea-2.36-manual/manual047.html0000644004317100512160000000666014252364057016453 0ustar marangetcristal References Previous Up Next

References

[LATEX-bis]
M. Gooseens, F. Mittelbach, A. Samarin. The LATEX Companion Addison-Websley, 1994.
[LATEX]
L. Lamport. A Document Preparation System System, LATEX, User’s Guide and Reference Manual. Addison-Websley, 1994.
[htmlgen]
X. Leroy. Lessons learned from the translation of documentation from LATEX to html. ERCIM/W4G Int. Workshop on WWW Authoring and Integration Tools, 1995. Available on the web at http://cristal.inria.fr/~xleroy/w4g.html
[HTML-4.0]
D. Ragget, A. Le Hors and I. Jacobs. HTML 4.0 Reference Specification. Available on the web at http://www.w3.org/TR/REC-html40, 1997.
[HTML-5a]
W3C HTML Working groups. HTML5 A vocabulary and associated APIs for HTML and XHTML http://dev.w3.org/html5/spec/spec.html, 2012.
[HTML-5b]
HTML Living Standard http://www.whatwg.org/specs/web-apps/current-work/multipage/, 2012.
[CSS-2]
Bert Bos, Tantek Çelik, Ian Hickson and Håkon Wium Lie. Cascading Style Sheets, Level 2 Revision 2 Specification. Available on the web at http://www.w3.org/TR/REC-CSS2/, 2011.


Previous Up Next hevea-2.36-manual/manual025.html0000644004317100512160000001167314252364056016446 0ustar marangetcristal Sentences and Paragraphs Previous Up Next

B.3 Sentences and Paragraphs

B.3.1 Spacing

Generally speaking, spaces (and single newline characters) in the source are echoed in the output. Browser then manage with spaces and line-breaks. Following LATEX behaviour, spaces after commands are not echoed. Spaces after invisible commands with arguments are not echoed either.

However this is no longer true in math mode, see section B.7.7 on spaces in math mode.

B.3.2 Paragraphs

New paragraphs are introduced by one blank line or more. Paragraphs are not indented. Thus the macros \indent and \noindent perform no action. Paragraph are rendered by p elements. In some occasions, this technique may produce spurious paragraphs (see 3.1.1).

B.3.3 Footnotes

The commands \footnote, \footnotetext and \footnotemark (with or without optional arguments) are supported. The footnote counter exists and (re)setting it or redefining \thefootnote should work properly. When footnotes are issued by a combination of \footnotemark and \footnotetext, a \footnotemark command must be issued first, otherwise some footnotes may get numbered incorrectly or disappear. Footnotes appear at document end in the article style and at chapters end in the book style. See section 7.3.7 for a description of how footnotes are flushed.

B.3.4 Accents and special symbols

Thanks to Unicode character references, HEVEA can virtually output any symbol. It may happen that HEVEA does not known about a particular symbol, that is, most of the time, HEVEA does not known about a particular command. In that case a warning is issued to draw user attention. Users can then choose a particular symbol amongst the recognized ones, or as an explicit Unicode character reference (see Section 4.2 for an example of this technique).

Commands for making accents used in non-English languages, such as \', work when applied to accent-less (i.e. ascii) letters and that the corresponding accented letters exist in the Unicode character set. Otherwise, the argument to the command is not modified and a warning is issued. For instance, consider the following source code, where, after a legitimate use of acute accents, one attempt to put an accute accent over the letter “h”:

``\'Ecole'' works as in \LaTeX, while ``\'h'' does not.

HEVEA output will be “École” works as in LATEX, while “h” does not. And a warning will be issued.

./tmp.tex:3741: Warning: Application of '\'' on 'h' failed

Observe that using input encodings is a convenient alternative to accent commands — see Section B.17.4.


Previous Up Next hevea-2.36-manual/manual015.html0000644004317100512160000000165214252364056016441 0ustar marangetcristal A cut subsubsection Up Next

7.3.12 A cut subsubsection

A note in a subsubsection flushed at document level.7


Up Next hevea-2.36-manual/manual002.png0000644004317100512160000000702214252364055016251 0ustar marangetcristalPNG  IHDRy޸ &iCCPiccHgPY<@BPC*%Z(ҫ@PEl+4EE\"kE t,ʺqQAYp?{ossp e{bRɎ(tջ{i常r)teJOYLgWX\2XyKο,]~ )sT8بlOrTzV $G&D~SGfDnr&AltL:5204_gK!FgE_zs zt@WOm|:3z @(U t08|A $`(E`8@-hM<.L@ށA2@F 7 Bh( ʀrPT UAuP t݄84 }aXև0v}p4 ^O6< "@]p$BV)GVC!Bd h(&JerFTVT1 uՁECDh2Z@Ёht]nDѓw aa0Θ Lf3sӆL`X VkaӱJI%vG)p`\.Wk] p xq:o—;IA"X| q B+aH$͉^XvbqD%iRi/82! L ے&US{1O,BlXXؐ+ NP6Pr(3;Yq8WJ)Hq"HJ IKIJGJJIKa8y"Ֆ͒="{MvV.g)Ǘ+;-Hז,L_~NAQI!ER¬"CV1NLMZ)VL $L`V0{"eyeg :JJU*[5JLGU殖֢HVQ?ާ>حѩ1͒fX9֘&YF3U^FuX6m]}G1Չ93 |UҪU$]nnCM/OS~~>&   .y݆i񍪍&v\mu:ƑGLMv|253Θ՘lOv19|y-Եl^Zä́UUКij}ZhlfSoV6¶vʼn伲3صs-[{'BCSGhGfhgWΣ<lqu%V>svu.֪MZ26,b&*4r**4j:*@LMLyl,7*us\m|GD\bh$jR|Robrv`NJA0"`H*hL֧uӗ? ͌]֙ՙdKd'eo޴gTcOQ{rswol m ڳMu[NO [A^i۝;OrR V (m? Yrˆ[EEE[?Xި%%Ga%oDDiNe̲²7Yn\^{p(㐰­Rr_bULp]u[|͞iU-x4:zccǞ77Q'z̚KZ!'lsWnk]8q/v=s}ٚvZ{aԱC) _}ABEKr.]N<{%DƞWzuW8}nX8[[Mowf[@;]wv8d3tyoy02*|`a׏2-<>+|"ߵ~o /ۏ?yx??'󟓟O)M5MMqb݋ɗ)/f 櫳/ M^̛oy=}na>|ZZ.V|R?B,sMT cHRMz&u0`:pQ<3PLTE# # # # # # # # # # # # # # # <tRNS\v?!b`2bKGD , pHYsaa?itIME 1GЯvIDATHV0 cIovL!7)2g L˫i?XE$[3(CA8a*STV6`ǝxmR|>}%*_,EBIv'c"ULR"MТJ2e@;iI@GЅնl$l㮯D R3 .w:<85|c _FJI췓v`V'$PۥE-((\ؒ;FUP9ZaImoжw+DU7,Kq]\)QpKX$sٻ<:5]aљ.H Н/Yi#GCڡ:d1+Plj!~e>)3RbbٔN}B!NCQ Vmo[PdKi&f#7i!\nG.UJ] ]fcj4`A*P LFVI[vެji[lQwկMAtZX{AjҰܴ"BTmLY Other LATEX to html translators Previous Up Next

C.5 Other LATEX to html translators

This short section gives pointers to a few other translators. I performed not extensive testing and make no thorough comparison.

LaTeX2html
LaTeX2html is a full system. It is written in perl and calls LATEX when in trouble. As a consequence, LaTeX2html is powerful but it may fail on large documents, for speed and memory reasons. More information on LaTeX2html can be found at
TTH
The principle behind TTH is the same as the one of HEVEA: write a fast translator as a lexer, use symbol fonts and tables. However, there are differences, TTH accepts both TEX and LATEX source, TTH is written in C and the full source is not available (only lex output is available). Additionally, TTH insist on not using any kind of LATEX generated information and will show proper cross-reference labels, even when no .aux file is present. TTH output is a single document, whereas HACHA can cut the output of HEVEA into several files. (however there exists a commercial version of TTH that provides this extra functionality). TTH can be found at
TeX4ht
TeX4ht is a highly configurable TeX-based authoring system dedicated mainly to produce hypertext. It interacts with TeX-based applications through style files and postprocessors, leaving the processing of the source files to the native TeX compiler. As a result, TeX4ht may be more powerful than HEVEA, but may also be more difficult to configure. More information on TeX4ht can be found at:
htmlgen
The htmlgen translator is specialized for producing the Caml manuals. This is HEVEA direct ancestor and I owe much to its author, X. Leroy. See [htmlgen] for a description of htmlgen and a (bit outdated) discussion on LATEX to html translation.

Previous Up Next hevea-2.36-manual/manual034.html0000644004317100512160000000367514252364056016451 0ustar marangetcristal Line and Page Breaking Previous Up Next

B.12 Line and Page Breaking

B.12.1 Line Breaking

The advisory line breaking command \linebreak will produce a line break if it has no argument or if its optional argument is 4. The \nolinebreak command is a null command.

The \\ and \\* commands output a <BR> tag, except inside arrays where the close the current row. Their optional argument is ignored. The \newline command outputs a <BR> tag.

All other line breaking commands, declarations or environments are silently ignored.

B.12.2 Page Breaking

They are no pages in the physical sense in html. Thus, all these commands are ignored.


Previous Up Next hevea-2.36-manual/index.html0000644004317100512160000001021514252364057016041 0ustar marangetcristal HEVEA User Documentation Version 2.36

HEVEA User Documentation
Version 2.36

Luc Maranget*

June 15, 2022


This manual also exists in compressed Postscript, PDF, and as a bundle of HTML files.


Abstract: HEVEA is a LATEX to html translator. The input language is a fairly complete subset of LATEX 2є (old LATEX style is also accepted) and the output language is html that is (hopefully) correct with respect to version 5 [HTML-5a, HTML-5b]

HEVEA understands LATEX macro definitions. Simple user style files are understood with little or no modifications. Furthermore, HEVEA customisation is done by writing LATEX code.

HEVEA is written in Objective Caml, as many lexers. It is quite fast and flexible. Using HEVEA it is possible to translate large documents such as manuals, books, etc. very quickly. All documents are translated as one single html file. Then, the output file can be cut into smaller files, using the companion program HACHA.

HEVEA can also be instructed to output plain text or info files.

Information on HEVEA is available at http://hevea.inria.fr/.

This document consists in three parts, a tutorial introduction, a reference manual and some practical information. The latter part includes a small index.


*
Inria Paris – CS 42112, 75589 Paris Cedex 12. Luc.Maranget@inria.fr

This document was translated from LATEX by HEVEA.
hevea-2.36-manual/manual004.html0000644004317100512160000002451114252364056016436 0ustar marangetcristal Style files Previous Up Next

2 Style files

LATEX style files are files that are not intended to produce output, but define document layout parameters, commands, environments, etc.

2.1 Standard base styles

The base style of a LATEX document is the argument to the \documentclass command (\documentstyle in old style). Normally, the base style of a document defines the structure and appearance of the whole document.

HEVEA really knows about two LATEX base styles, article and book. Additionally, the report base style is recognized and considered equivalent to book and the seminar base style for making slides is recognized and implemented by small additions on the article style.

Base style style is implemented by an HEVEA specific style file style.hva. More precisely, HEVEA interprets \documentclass{style} by attempting to load the file style.hva (see section C.1.1.1 on where HEVEA searches for files). Thus, at the moment, HEVEA distribution includes the files, article.hva, book.hva, etc.

2.2 Other base styles

Documents whose base style is not recognized by HEVEA can be processed when the unknown base style is a derivation of a recognized base style.

Let us assume that doc.tex uses an exotic base style such as acmconf. Then, typing hevea doc.tex will yield an error, since HEVEA cannot find the acmconf.hva file:

# hevea.opt doc.tex
doc.tex:1: Warning: Cannot find file: acmconf.hva
doc.tex:1: Error while reading LaTeX: No base style
Adios

This situation is avoided by invoking HEVEA with the known base style file article.hva as an extra argument:

# hevea article.hva doc.tex

The extra argument instructs HEVEA to load its article.hva style file before processing doc.tex. It will then ignore the document base style specified by \documentclass (or \documentstyle).

Observe that the fix above works because the acmconf and article base styles look the same to the document (i.e. they define the same macros). More generally, most base styles that are neither article nor book are in fact variations on either two of them. However, such styles usually provides extra macros. If users documents use these macros, then users should also instruct HEVEA about them (see section 4.1).

Finally, it is important to notice that renaming a base style file style.cls into style.hva will not work in general. As a matter of fact, base style files are TEX and not LATEX source and HEVEA will almost surely fail on TEX-ish input.

2.3 Other style files

A LATEX document usually loads additional style files, by using the commands \input or \usepackage or \input.

2.3.1 Files loaded with \input

Just like LATEX, HEVEA reacts to the construct \input{file} by loading the file file. (if I got it right, HEVEA even follows TEX’s crazy conventions on .tex extensions).

As it is often the case, assume that the document doc.tex has a \input{mymacros.tex} instruction in its preamble, where mymacros.tex gathers custom definitions. Hopefully, only a few macros give rise to trouble: macros that performs fine typesetting or TEXish macros. Such macros need to be rewritten, using basic LATEX constructs (section 4 gives examples of macro-rewriting). The new definitions are best collected in a style file, mymacros.hva for instance. Then, doc.tex is to be translated by issuing the command:

# hevea mymacros.hva doc.tex

The file mymacros.hva is processed before doc.tex (and thus before mymacros.tex). As a consequence of HEVEA behaviour with respect to definition and redefinition (see section B.8.1), the macro definitions in mymacros.hva take precedence over the ones in mymacros.tex, provided the document original definitions (the ones in mymacros.tex) are performed by \newcommand (or \newenvironment).

Another situation is when HEVEA fails to process a whole style file. Usually, this means that HEVEA crashes on that style file. The basic idea is then to write a mymacros.hva style file that contains alternative definitions for all the commands defined in mymacros.sty. Then, HEVEA should be instructed to load mymacros.hva and not to load mymacros.tex. This is done by invoking hevea as follows:

# hevea mymacros.hva -e mymacros.tex doc.tex

Of course, mymacros.hva must now contain replacements for all the useful macros of mymacro.tex.

2.3.2 Files loaded with \usepackage

As far as I know, LATEX reacts to the construct \usepackage{name} by loading the file name.sty. HEVEA reacts in a similar, but different, manner, by loading the file name.hva.

HEVEA distributions already includes quite a few .hva implementations of famous packages (see section B.17). When a given package (say zorglub) is not implemented, the situation may not be as bad as it may seem first. Hopefully, you are only using a few commands from package zorglub, and you feel confident enough to implement them yourself. Then, it suffices to put your definitions in file zorglub.hva and HEVEA will react to \usepackage{zorglub} by loading zorglub.hva.

See section B.5.2 for the full story on \usepackage.


Previous Up Next hevea-2.36-manual/manual012.html0000644004317100512160000000221714252364056016434 0ustar marangetcristal Another cut subsubsection Previous Up

7.3.9 Another cut subsubsection

Another note in a subsubsection, flushed at subsubsections.3


3
At the end of my page.

Previous Up hevea-2.36-manual/fddl.html0000644004317100512160000000466314252364052015650 0ustar marangetcristal Free Document Dissemination Licence - V1 Free Document Dissemination Licence -- FDDL version 1

This document may be freely read, stored, reproduced, disseminated, translated or quoted by any means and on any medium provided the following conditions are met:

  • every reader or user of this document acknowledges that he his aware that no guarantee is given regarding its contents, on any account, and specifically concerning veracity, accuracy and fitness for any purpose;
  • no modification is made other than cosmetic, change of representation format, translation, correction of obvious syntactic errors, or as permitted by the clauses below;
  • comments and other additions may be inserted, provided they clearly appear as such; translations or fragments must clearly refer to an original complete version, preferably one that is easily accessed whenever possible;
  • translations, comments and other additions must be dated and their author(s) must be identifiable (possibly via an alias);
  • this licence is preserved and applies to the whole document with modifications and additions (except for brief quotes), independently of the representation format;
  • whatever the mode of storage, reproduction or dissemination, anyone able to access a digitized version of this document must be able to make a digitized copy in a format directly usable, and if possible editable, according to accepted, and publicly documented, public standards;
  • redistributing this document to a third party requires simultaneous redistribution of this licence, without modification, and in particular without any further condition or restriction, expressed or implied, related or not to this redistribution. In particular, in case of inclusion in a database or collection, the owner or the manager of the database or the collection renounces any right related to this inclusion and concerning the possible uses of the document after extraction from the database or the collection, whether alone or in relation with other documents.
Any incompatibility of the above clauses with legal, contractual or judiciary decisions or constraints implies a corresponding limitation of reading, usage, or redistribution rights for this document, verbatim or modified.

Version française : LLDD hevea-2.36-manual/extras.html0000644004317100512160000007626314252364056016256 0ustar marangetcristal Extra Features Previous Up Next


B.16 Extra Features

This section describes HEVEA functionalities that extends on plain LATEX, as defined in [LATEX]. Most of the features described here are performed by default.

B.16.1 TEX macros

Normally, HEVEA does not recognise constructs that are specific to TEX. However, some of the internal commands of HEVEA are homonymous to TEX macros, in order to enhance compatibility. Note that full compatibility with TEX is not guaranteed.

B.16.1.1 À la TEX macros definitions

The \def construct for defining commands is supported. It is important to notice that HEVEA semantics for \def follows TEX semantics. That is, defining a command that already exists with \def succeeds.

Delimiting characters in command definition are somehow supported. Consider the following example from the TEX Book:

\def\Look{\textsc{Look}}
\def\x{\textsc{x}}
\def\cs AB#1#2C$#3\$ {#3{ab#1}#1 c\x #2}
\cs AB {\Look}{}C${And \$}{look}\$ 5.

It yields: And $lookabLookLook cx5.

Please note that delimiting characters are supported as far as I could, problems are likely with delimiting characters which include spaces or command names, in particular the command name \{. One can include \{ in a command argument by using the grouping characters {}:

\def\frenchquote(#1){\guillemotleft~\emph{#1}~\guillemotright{} (in French)}
he said \frenchquote(Alors cette accolade ouvrante {``\{''}~?).

Yields: he said « Alors cette accolade ouvrante “{” ? » (in French).

Another issue regards comments: “%” in arguments may give undefined behaviours, while comments are better avoided while defining macros. As an example, the following code will not be handled properly by HEVEA:

\def\x%
   #1{y}

Such TEX source should be rewritten as \def\x#1{y}.

Another source of incompatibility with TEX is that substitution of macros parameters is not performed at the same moment by HEVEA and TEX. However, things should go smoothly at the first level of macro expansion, that is when the delimiters appear in source code at the same level as the macro that is to parse them. For instance, the following source will give different results in LATEX and in HEVEA:

\def\cs#1A{``#1''}
\def\othercs#1{\cs#1A}
\othercs{coucouA}

LATEX output is “coucou”A, while HEVEA output is “coucouA”. For instance, here is HEVEA output: “coucouA”. Please note that in most situations this discrepancy will make HEVEA crash.

B.16.1.2 The \let construct

HEVEA also processes a limited version of \let:

\let macro-name1 = macro-name2

The effect is to bind macro-name1 to whatever macro-name2 is bound to at the time \let is processed. This construct may prove very useful in situations where one wishes to slightly modify basic commands. See sections 10.3 and B.2 for examples of using \let in such a situation.

B.16.1.3 The \global construct

It is possible to escape scope and to make global definitions and bindings by using the TEX construct \global. The \global construct is significant before \def and \let constructs.

Also note that \gdef is equivalent to \global\def.

B.16.1.4 TEX Conditional Macros

The \newif\ifname, where name is made of letters only, creates three macros: \ifname, \nametrue and \namefalse. The latter two set the name condition to true and false, respectively. The \ifname command tests the condition name:

\ifname
text
1
\else
text2
\fi

Text text1 is processed when name is true, otherwise text2 is processed. If text2 is empty, then the \else keyword can be omitted.

Note that HEVEA also implements LATEX ifthen package and that TEX simple conditional macros are fully compatible with LATEX boolean registers. More precisely, we have the following correspondences:

TEXLATEX
\newif\ifname\newboolean{name}
\nametrue\setboolean{name}{true}
\namefalse\setboolean{name}{false}
\ifname text1\else text2\fi\ifthenelse{\boolean{name}}{text1}{text2}

B.16.1.5 Other TEX Macros

HEVEA implements the macros \unskip and \endinput. It also supports the \csname\endcsname construct.

B.16.2 Command Definition inside Command Definition

If one strictly follows the LATEX manual, only commands with no arguments can be defined inside other commands. Parameters (i.e. #n) occurring inside command bodies refer to the outer definition, even when they appear in nested command definitions. That is, the following source:

\newcommand{\outercom}[1]{\newcommand{\insidecom}{#1}\insidecom}
\outercom{outer}

yields this output:

outer

Nevertheless, nested commands with arguments are allowed. Standard parameters #n still refer to the outer definition, while nested parameters ##n refer to the inner definition. That is, the source:

\newcommand{\outercom}[1]{\newcommand{\insidecom}[1]{##1}\insidecom{inner}}
\outercom{outer}

yields this output:

inner

B.16.3 Date and time

Date and time support is not enabled by default, for portability and simplicity reasons.

However, HEVEA source distribution includes a simple (sh) shell script xxdate.exe that activates date and time support. The hevea command, should be invoked as:

# hevea -exec xxdate.exe ...

This will execute the script xxdate.exe, whose output is then read by HEVEA. As a consequence, standard LATEX counters year, month, day and time are defined and LATEX command \today works properly. Additionally the following counters and commands are defined:

Counter weekdayday of week, 0…6 (e.g. 3)
Counter Hourhour, 00…11 (e.g. 04)
Counter hourhour, 00…23 (e.g. 16)
Counter minuteminute, 00…59 (e.g. 09)
Counter secondsecond, 00…6110(e.g. 46)
Command \ampmAM or PM (e.g. PM)
Command \timezoneTime zone (e.g. CEST)
Command \heveadateOutput of the date Unix command, (e.g. Wed Jun 15 16:09:46 CEST 2022)

Note that I chose to add an extra option (and not an extra \@exec primitive) for security reasons. You certainly do not want to enable HEVEA to execute silently an arbitrary program without being conscious of that fact. Moreover, the hevea program does not execute xxdate.exe by default since it is difficult to write such a script in a portable manner.

Windows users should enjoy the same features with the version of xxdate.exe included in the Win32 distribution.

B.16.4 Fancy sectioning commands

Loading the fancysection.hva file will radically change the style of sectional units headers: they appear over a green background, the background color saturation decreases as the sectioning commands themselves do (this is the style of this manual). Additionally, the document background color is white.

Note : Fancy section has been re-implemented using style-sheets. While it respects the old behaviour, users are encouraged to try out style-sheets for more flexibility. See Section 9 for details.

The fancysection.hva file is intended to be loaded after the document base style. Hence the easiest way to load the fancysection.hva file is by issuing \usepackage{fancysection} in the document preamble. To allow processing by LATEX, one may for instance create an empty fancysection.sty file.

As an alternative, to use fancy section style in doc.tex whose base style is article you should issue the command:

  # hevea article.hva fancysection.hva doc.tex

You can also make a doc.hva file that contains the two lines:

  \input{article.hva}
  \input{fancysection.hva}

And then launch hevea as:

  # hevea doc.hva doc.tex

Sectioning command background colours can be changed by redefining the corresponding colours (part, chapter, section,…). For instance, you get various mixes of red and orange by:

\input{article.hva}
\input{fancysection.hva}
\definecolor{part}{named}{BrickRed}
\definecolor{section}{named}{RedOrange}
\definecolor{subsection}{named}{BurntOrange}

(See section B.14.2 for details on the named color model that is used above.)

Another choice is issuing the command \colorsections{hue}, where hue is a hue value to be interpreted in the HSV model. For instance,

\input{article.hva}
\input{fancysection.hva}
\colorsections{20}

will yield sectional headers on a red-orange background.

HEVEA distribution features another style for fancy sectioning commands: the undersection package provides underlined sectional headers.

B.16.5 Targeting Windows

At the time of this release, Windows support for symbols through Unicode is not as complete as the one of Linux, which I am using for testing HEVEA.

One of the most salient shortcomings is the inability to display sub-elements for big brackets, braces and parenthesis, which HEVEA normally outputs when it processes \left[, \right\} etc.

We (hopefully) expect Windows fonts to display more of Unicode easily in a foreseeable future. As a temporary fix, we provide a style file winfonts.hva. Authors concerned by producing pages that do not look too ugly when viewed through Windows browsers are thus advised to load the file winfonts.hva. For instance they can invoke HEVEA as:

# hevea winfonts.hva ...

At the moment, loading winfonts.hva only changes the rendering of LATEX big delimiters, avoiding the troublesome Unicode entities. As an example, here are some examples of rendering.

delimitersdefaultwinfonts
\left\{ … \right\}  




1
2
3




  
 / 
 | 

 | 
 \ 
1
2
3
 \
 |
 >
 |
 /
\left[ … \right]  



1
2
3



  
1
2
3
\left( … \right)  



1
2
3



  



1
2
3
 \
 |
 |
 /
\left\vert … \right\vert  



1
2
3



  
1
2
3
\left\Vert … \right\Vert  
⎪⎪
⎪⎪
⎪⎪
⎪⎪
1
2
3
⎪⎪
⎪⎪
⎪⎪
⎪⎪
  
1
2
3

More generally, it remains authors responsibility to be careful not to issue too refined Unicode entities. To that aim, authors that target a wide audience should first limit themselves to the most common symbols (e.g. use \leq [≤] in place of \preceq [≼]) and, above all, they should control the rendering of their documents using several browsers.

B.16.6 MathJax support

MathJax support is enabled by loading the mathjax package. Two operating mode modes are provided: explicit and automatic. Notice that HEVEA distribution includes a innocuous mathjax.sty for LATEX compatibility — see also Sec. C.4.2.

B.16.6.1 Explicit mode

Explicit mode is enabled when \usepackage{mathjax} appears in the document preamble, or when HEVEA is invoked as “hevea mathjax.hva…”.

Basic consists in one environment displayjax and one command \textjax. The environment is appropriate for displayed maths. As an example, the following source

A displayed formula:
\begin{displayjax}
\frac{\pi}{4} = \left[1 - \frac{1}{3} + \frac{1}{5} - \frac{1}{7} +
\frac{1}{9} + \cdots + \frac{(-1)^n}{2n+1} + \cdots \right]
\end{displayjax}

is displayed as follows:

A displayed formula: \[ \frac{\pi}{4} = \left[1 - \frac{1}{3} + \frac{1}{5} - \frac{1}{7} + \frac{1}{9} + \cdots + \frac{(-1)^n}{2n+1} + \cdots \right] \]

The \textjax command is appropriate for inline mathematical contents. For instance, the following source

``A nice inline formula:
\textjax{\frac{\pi}{4} = \left[1 - \frac{1}{3} + \frac{1}{5} - \frac{1}{7} +
\frac{1}{9} + \cdots + \frac{(-1)^n}{2n+1} + \cdots \right]}.''

is typeset as: “A nice inline formula: \(\frac{\pi}{4} = \left[1 - \frac{1}{3} + \frac{1}{5} - \frac{1}{7} + \frac{1}{9} + \cdots + \frac{(-1)^n}{2n+1} + \cdots \right]\).”

Advanced support consists in the mathjax environment. Source code enclosed in \begin{mathjax}\ldots\end{mathjax} will be reproduced into output for the MathJax script to handle it. However, HEVEA does not start any other action. Thanks to this feature, users can have any (recognised by MathJax) displayed math environment processed by MathJax. For instance, the following source

\begin{mathjax}
\begin{eqnarray*}
z^2  & = & x^2 + y^2\\
\end{eqnarray*}
\end{mathjax}

will be displayed as:

\begin{eqnarray*} z^2 & = & x^2 + y^2\\ \end{eqnarray*}

Finally, notice that a document that uses the explicit MathJax constructs can be processed by LATEX, provided it loads the mathjax.sty file present in HEVEA distribution. This can be done simply by having the line \usepackage{mathjax} in the document preamble. Then, HEVEA and LATEX will react appropriately (see sections 2.3.2 and B.5.2).

B.16.6.2 Automatic mode

Automatic mode is enabled when \usepackage[auto]{mathjax} appears in the document preamble, or when HEVEA is invoked as “hevea mathjaxauto.hva…”.

In automatic mode, HEVEA will pass all mathematical text to MathJax. This mode seems by far the most practical, but beware:

  1. There is no communication back from MathJax to HEVEA. As result, equation numbers, as generated for instance by the equation environment, will not find their way to the final display.
  2. Some constructs, such as \mbox, are not handled by MathJax.

B.16.6.3 Customising the MathJax script

By default HEVEA insert a reference to the “default” MathJax script with “default” configuration parameters. Advanced users can change this setting by redefining the \jax@meta command, which must contain the appropriate <script> element. See the file html/mathjax.hva for details.


10
According to date man page.

Previous Up Next hevea-2.36-manual/browser.html0000644004317100512160000000375114252364057016424 0ustar marangetcristal Browser configuration Previous Up Next

C.2 Browser configuration

By default, HEVEA does not anymore use the FACE=symbol attribute to the <FONT ...> tag. As a consequence, browser configuration is no longer needed.

HEVEA now extensively outputs Unicode entities. This first means that HEVEA targets modern browsers with decent unicode support, and only those.

In case your browser is recent and that you nevertheless experience display problems on HEVEA-generated pages, see the excellent Alan Wood’s Unicode Resources. It may help to understand display problems and even to solve them by configuring browsers or installing some fonts.


Previous Up Next hevea-2.36-manual/manual030.html0000644004317100512160000002112514252364056016433 0ustar marangetcristal Definitions, Numbering Previous Up Next

B.8 Definitions, Numbering

B.8.1 Defining Commands

HEVEA understands command definitions given in LATEX style. Such definitions are made using \newcommand, \renewcommand and \providecommand. These three constructs accept the same arguments and have the same meaning as in LATEX, in particular it is possible to define an user command with one optional argument. However, HEVEA is more tolerant: if command name already exists, then a subsequent \newcommand{name}…is ignored. If macro name does not exists, then \renewcommand{name}…performs a definition of name. In both cases, LATEX would crash, HEVEA just issues warnings.

The behaviour of \newcommand allows to shadow document definition, provided the new definitions are processed before the document definitions. This is easily done by grouping the shadowing definition in a specific style file given as an argument to HEVEA (see section 5.1). Conversely, changes of base macros (i.e. the ones that HEVEA defines before loading any user-specified file) must be performed using \renewcommand.

Scoping rules apply to macros, as they do in LATEX. Environments and groups define a scope and command definition are local to the scope they occur.

It is worth noticing that HEVEA also partly implements TEX definitions (using \def) and bindings (using \let), see section B.16.1 for details.

B.8.2 Defining Environments

HEVEA accepts environment definitions and redefinitions by \newenvironment and \renewenvironment. The support is complete and should conform to [LATEX, Sections C.8.2].

Environments define a scope both for commands and environment definitions.

B.8.3 Theorem-like Environments

New theorem-like environments can also be introduced and redefined, using \newtheorem and \renewtheorem.

Note that, by contrast with plain environments definitions, theorem-like environment definitions are global definitions.

B.8.4 Numbering

LATEX counters are (fully ?) supported. In particular, defining a counter cmd with \newcounter{cmd} creates a macro \thecmd that outputs the counter value. Then the \thecmd command can be redefined. For instance, section numbering can be turned into alphabetic style by:

\renewcommand{\thesection}{\alph{section}}

Note that TEX style for counters is not supported at all and that using this style will clobber the output. However, HEVEA implements the calc package that makes using TEX style for counters useless in most situations (see section B.17.3).

B.8.5 The ifthen Package

The ifthen package is partially supported. The one unsupported construct is the \lengthtest test expression, which is undefined.

As a consequence, HEVEA accepts the following example from the LATEX manual:

\newcounter{ca}\newcounter{cb}%
\newcommand{\printgcd}[2]{%
  \setcounter{ca}{#1}\setcounter{cb}{#2}%
  Gcd(#1,#2) =
  \whiledo{\not\(\value{ca}= \value{cb}\)}%
    {\ifthenelse{\value{ca}>\value{cb}}%
      {\addtocounter{ca}{-\value{cb}}}%
      {\addtocounter{cb}{-\value{ca}}}%
    gcd(\arabic{ca}, \arabic{cb}) = }%
  \arabic{ca}.}%
For example: \printgcd{54}{30}

For example: Gcd(54,30) = gcd(24, 30) = gcd(24, 6) = gcd(18, 6) = gcd(12, 6) = gcd(6, 6) = 6.

Additionally, a few boolean registers are defined by HEVEA. Some of them are of interest to users.

hevea
Initial value is true. The hevea.sty style file also defines this register with initial value false.
mmode
This register value reflects HEVEA operating mode, it is true in math-mode and false otherwise.
display
This register value reflects HEVEA operating mode, it is true in display-mode and false otherwise.
footer
Initial value is true. When set false, HEVEA does not insert its footer “This document has been translated by HEVEA”.

Finally, note that HEVEA also recognised à la TEX conditional macros (see section B.16.1.4). Such macros are fully compatible with the boolean registers of the ifthen package, as it is the case in LATEX.


Previous Up Next hevea-2.36-manual/manual005.png0000644004317100512160000000560114252364055016255 0ustar marangetcristalPNG  IHDR [ &iCCPiccHgPY<@BPC*%Z(ҫ@PEl+4EE\"kE t,ʺqQAYp?{ossp e{bRɎ(tջ{i常r)teJOYLgWX\2XyKο,]~ )sT8بlOrTzV $G&D~SGfDnr&AltL:5204_gK!FgE_zs zt@WOm|:3z @(U t08|A $`(E`8@-hM<.L@ށA2@F 7 Bh( ʀrPT UAuP t݄84 }aXև0v}p4 ^O6< "@]p$BV)GVC!Bd h(&JerFTVT1 uՁECDh2Z@Ёht]nDѓw aa0Θ Lf3sӆL`X VkaӱJI%vG)p`\.Wk] p xq:o—;IA"X| q B+aH$͉^XvbqD%iRi/82! L ے&US{1O,BlXXؐ+ NP6Pr(3;Yq8WJ)Hq"HJ IKIJGJJIKa8y"Ֆ͒="{MvV.g)Ǘ+;-Hז,L_~NAQI!ER¬"CV1NLMZ)VL $L`V0{"eyeg :JJU*[5JLGU殖֢HVQ?ާ>حѩ1͒fX9֘&YF3U^FuX6m]}G1Չ93 |UҪU$]nnCM/OS~~>&   .y݆i񍪍&v\mu:ƑGLMv|253Θ՘lOv19|y-Եl^Zä́UUКij}ZhlfSoV6¶vʼn伲3صs-[{'BCSGhGfhgWΣ<lqu%V>svu.֪MZ26,b&*4r**4j:*@LMLyl,7*us\m|GD\bh$jR|Robrv`NJA0"`H*hL֧uӗ? ͌]֙ՙdKd'eo޴gTcOQ{rswol m ڳMu[NO [A^i۝;OrR V (m? Yrˆ[EEE[?Xި%%Ga%oDDiNe̲²7Yn\^{p(㐰­Rr_bULp]u[|͞iU-x4:zccǞ77Q'z̚KZ!'lsWnk]8q/v=s}ٚvZ{aԱC) _}ABEKr.]N<{%DƞWzuW8}nX8[[Mowf[@;]wv8d3tyoy02*|`a׏2-<>+|"ߵ~o /ۏ?yx??'󟓟O)M5MMqb݋ɗ)/f 櫳/ M^̛oy=}na>|ZZ.V|R?B,sMT cHRMz&u0`:pQ< PLTE# @g'tRNS@fbKGDf |d pHYsaa?itIME 1GЯIDATc` bQ03Da  (%tEXtdate:create2022-06-15T16:09:49+02:008$%tEXtdate:modify2022-06-15T16:09:49+02:00IK-tEXticc:copyrightCopyright Artifex Software 2011Ŵ1tEXticc:descriptionArtifex Software sRGB ICC Profile 2tEXticc:manufacturerArtifex Software sRGB ICC Profile\~=+tEXticc:modelArtifex Software sRGB ICC Profile1(tEXtSoftwareGPL Ghostscript 9.26XnIENDB`hevea-2.36-manual/manual007.png0000644004317100512160000000730314252364056016261 0ustar marangetcristalPNG  IHDRQ8ŭ &iCCPiccHgPY<@BPC*%Z(ҫ@PEl+4EE\"kE t,ʺqQAYp?{ossp e{bRɎ(tջ{i常r)teJOYLgWX\2XyKο,]~ )sT8بlOrTzV $G&D~SGfDnr&AltL:5204_gK!FgE_zs zt@WOm|:3z @(U t08|A $`(E`8@-hM<.L@ށA2@F 7 Bh( ʀrPT UAuP t݄84 }aXև0v}p4 ^O6< "@]p$BV)GVC!Bd h(&JerFTVT1 uՁECDh2Z@Ёht]nDѓw aa0Θ Lf3sӆL`X VkaӱJI%vG)p`\.Wk] p xq:o—;IA"X| q B+aH$͉^XvbqD%iRi/82! L ے&US{1O,BlXXؐ+ NP6Pr(3;Yq8WJ)Hq"HJ IKIJGJJIKa8y"Ֆ͒="{MvV.g)Ǘ+;-Hז,L_~NAQI!ER¬"CV1NLMZ)VL $L`V0{"eyeg :JJU*[5JLGU殖֢HVQ?ާ>حѩ1͒fX9֘&YF3U^FuX6m]}G1Չ93 |UҪU$]nnCM/OS~~>&   .y݆i񍪍&v\mu:ƑGLMv|253Θ՘lOv19|y-Եl^Zä́UUКij}ZhlfSoV6¶vʼn伲3صs-[{'BCSGhGfhgWΣ<lqu%V>svu.֪MZ26,b&*4r**4j:*@LMLyl,7*us\m|GD\bh$jR|Robrv`NJA0"`H*hL֧uӗ? ͌]֙ՙdKd'eo޴gTcOQ{rswol m ڳMu[NO [A^i۝;OrR V (m? Yrˆ[EEE[?Xި%%Ga%oDDiNe̲²7Yn\^{p(㐰­Rr_bULp]u[|͞iU-x4:zccǞ77Q'z̚KZ!'lsWnk]8q/v=s}ٚvZ{aԱC) _}ABEKr.]N<{%DƞWzuW8}nX8[[Mowf[@;]wv8d3tyoy02*|`a׏2-<>+|"ߵ~o /ۏ?yx??'󟓟O)M5MMqb݋ɗ)/f 櫳/ M^̛oy=}na>|ZZ.V|R?B,sMT cHRMz&u0`:pQ<3PLTE# # # # # # # # # # # # # # # <tRNS\v?!Jp+bKGD , pHYsaa?itIME 2p'IDATXW $rvJ{==[rC.^X/_göUŌ/]n~NvyE&7;TM:p:'i>^e"z Ͱ[ۭ4s냨\d崖E@:gÕ^Z< Ap79,p̍t]a.1| ,N&k P+BE9)!~Q/ԀOUVB"HL(b?DSkB'||s8I]P#krYL. <u-M ޠS=HCsf-i 5?^9JtØl)[ C+s'd}cĝb)\kADſ0Ja3ΑT*G-%MSB{G|RσRzT܂ o9S>?(.=Ca']8M[^0wJA/HH;G4">a 0V)Gu(܉Ԍ? } Ә~#\tQ|3e̲ZKt<x#l/ dK\RC"p7\ .aK[.q:ۅZcc0oDeAsV܆zUQXoF1Ӑ~+QNueLsP~',ާ_c_ OԹo>pN}z$?-fK1s]%tEXtdate:create2022-06-15T16:09:50+02:00aa%tEXtdate:modify2022-06-15T16:09:50+02:00-tEXticc:copyrightCopyright Artifex Software 2011Ŵ1tEXticc:descriptionArtifex Software sRGB ICC Profile 2tEXticc:manufacturerArtifex Software sRGB ICC Profile\~=+tEXticc:modelArtifex Software sRGB ICC Profile1(tEXtSoftwareGPL Ghostscript 9.26XnIENDB`hevea-2.36-manual/manual007.html0000644004317100512160000004625414252364056016451 0ustar marangetcristal Making HEVEA and LATEX both happy Previous Up Next

5 Making HEVEA and LATEX both happy

A satisfactory translation from LATEX to html often requires giving instructions to HEVEA. Typically, these instructions are macro definitions and these instructions should not be seen by LATEX. Conversely, some source that LATEX needs should not be processed by HEVEA. Basically, there are three ways to make input vary according to the processor, file loading, the hevea package and comments.

5.1 File loading

HEVEA and LATEX treat files differently. Here is a summary of the main differences:

  • LATEX and HEVEA both load files given as arguments to \input, however when given the option -e filename, HEVEA does not load filename.
  • HEVEA loads all files given as command-line arguments.
  • Both LATEX and HEVEA load style files given as optional arguments to \documentstyle and as arguments to \usepackage, but the files are searched by following different methods and considering different file extensions.

As a consequence, for having a file latexonly loaded by LATEX only, it suffices to use \input{latexonly} in the source and to invoke HEVEA as follows:

# hevea -e latexonly

Having heveaonly loaded by HEVEA only is more simple: it suffices to invoke HEVEA as follows:

# hevea heveaonly

Finally, if one has an HEVEA equivalent style.hva for a LATEX style file style.sty, then one should load the file as follows:

\usepackage{style}

This will result in, LATEX loading style.sty, while HEVEA loads style.hva. As HEVEA will not fail in case style.hva does not exist, this is another method for having a style file loaded by LATEX only.

Writing an HEVEA-specific file file.hva is the method of choice for supplying command definitions to HEVEA only. Users can then be sure that these definitions are not seen by LATEX and will not get echoed to the image file (see section 6).

The file file.hva can be loaded by either supplying the command-line argument file.hva, or by \usepackage{file} from inside the document. Which method is better depends on whether you choose to override or to replace the document definition. In the command-line case, definitions from file.hva are processed before the ones from the document and will override them, provided the document definitions are made using \newcommand (or \newenvironment). In the \usepackage case, HEVEA loads file.hva at the place where LATEX loads file.sty, hence the definitions from file.hva replace the definitions from file.sty in the strict sense.

5.2 The hevea package

The hevea.sty style file is intended to be loaded by LATEX and not by HEVEA. It provides LATEX with means to ignore or process some parts of the document. Note that HEVEA copes with the constructs defined in the hevea.sty file by default. It is important to notice that the hevea.sty style file from the distribution is a package in LATEX 2є terms and that it is not compatible with old LATEX. Moreover, the hevea package loads the comment package which must be present. Also notice that, for compatibility, HEVEA reacts to \usepackage{hevea} by loading its own version of the comment package (Section B.17.7).

5.2.1 Environments for selecting a translator

HEVEA and LATEX perform the following actions on source inside the latexonly, verblatex, htmlonly, rawhtml, toimage and verbimage environments:

environment HEVEALATEX
latexonly ignore, \end{env} constructs are processed (see section 5.2.2)process
verblatex ignoreprocess
htmlonly processignore
rawhtml echo verbatim (see section 8.4)ignore
toimage send to the image file, \end{env} constructs and macro characters are processed (see section 6)process
verbimage send to the image file (see section 6)process

As an example, this is how some text can be typeset in purple by HEVEA and left alone by LATEX:

We get:
\begin{htmlonly}%
\purple purple rain, purple rain%
\end{htmlonly}
\begin{latexonly}%
purple rain, purple rain%
\end{latexonly}%
\ldots

We get: purple rain, purple rain

It is impossible to avoid the spurious space in HEVEA output for the source above. This extra spaces comes from the newline character that follows \end{htmlonly}. Namely this construct must appear in a line of its own for LATEX to recognize it. Anyway, better control over spaces can be achieved by using the hevea boolean register or comments, see sections 5.2.3 and 5.3.

Also note that environments define a scope and that style changes (and non-global definitions) are local to them. For instance, in the example above, “…” appears in black in html output. However, as an exception, the environments image and verbimage do not create scope. It takes a little practice of HEVEA to understand why this is convenient.

5.2.2 Why are there two environments for ignoring input?

Some scanning and analysis of source is performed by HEVEA inside the latexonly environment, in order to allow latexonly to dynamically occur inside other environments.

More specifically, \end{env} macros are recognized and their env argument is tested against the name of the environment whose opening macro \env opened the latexonly environment. In that case, macro expansion of \endenv is performed and any further occurrence of \end{env’} is tested and may get expanded if it matches a pending \begin{env’} construct.

This enables playing tricks such as:

\newenvironment{latexhuge}
  {\begin{latexonly}\huge}
  {\end{latexonly}}

\begin{latexhuge}
This will appear in huge font in \LaTeX{} output only.
\end{latexhuge}

LATEX output will be:

While there is no HEVEA output.

Since HEVEA somehow analyses input that is enclosed in the latexonly environment, it may choke. However, this environment is intended to select processing by LATEX only and might contain arbitrary source code. Fortunately, it remains possible to have input processed by LATEX only, regardless of what it is, by enclosing it in the verblatex environment. Inside this environment, HEVEA performs no other action than looking for \end{verblatex}. As a consequence, the \begin{verblatex} and \end{verblatex} constructs may only appear in the main flow of text or inside the same macro body, a bit like LATEX verbatim environment.

Relations between toimage and verbimage are similar. Additionally, formal parameters #i are replaced by actual arguments inside the toimage environment (see end of section 6.3 for an example of this feature).

5.2.3 The hevea boolean register

Boolean registers are provided by the ifthen package (see [LATEX, Section C.8.5] and section B.8.5 in this document). Both the hevea.sty style file and HEVEA define the boolean register hevea. However, this register initial value is false for LATEX and true for HEVEA.

Thus, provided, both the hevea.sty style file and the ifthen packages are loaded, the “purple rain” example can be rephrased as follows:

We get:
{\ifthenelse{\boolean{hevea}}{\purple}{}purple rain, purple rain}\ldots

We get: purple rain, purple rain

Another choice is using the TEX-style conditional macro \ifhevea (see Section B.16.1.4):

We get:
{\ifhevea\purple\fi purple rain, purple rain}\ldots

We get: purple rain, purple rain

5.3 Comments

HEVEA processes all lines that start with %HEVEA, while LATEX treats these lines as comments. Thus, this is a last variation on the “purple rain” example:

We get
%HEVEA{\purple
purple rain, purple rain%
%HEVEA}%
\ldots

(Note how comments are placed at the end of some lines to avoid spurious spaces in the final output.)

We get: purple rain, purple rain

Comments thus provide an alternative to loading the hevea package. For user convenience, comment equivalents to the latexonly and toimage environment are also provided:

environmentcomment equivalent
\begin{latexonly}\end{latexonly}
%BEGIN LATEX
%END LATEX
  
\begin{toimage}\end{toimage}
%BEGIN IMAGE
%END IMAGE

Note that LATEX, by ignoring comments, naturally performs the action of processing text between %BEGIN and %END comments. However, no environment is opened and closed and no scope is created while using comment equivalents.


Previous Up Next hevea-2.36-manual/sectioning.html0000644004317100512160000001723514252364056017104 0ustar marangetcristal Sectioning Previous Up Next

B.4 Sectioning

B.4.1 Sectioning Commands

Sectioning commands from \part down to \subparagraph are defined in base style files. They accept an optional argument and have starred versions.

The non-starred sectioning commands from \part down to \subsubsection show section numbers in sectional unit headings, provided their level is greater than or equal to the current value of the secnumdepth counter. Sectional unit levels and the default value of the secnumdepth counter are the same as in LATEX. Furthermore, given a sectional unit secname, the counter secname exists and the appearance of sectional units numbers can be changed by redefining \thesecname. For instance, the following redefinition turn the numbering of chapters into alphabetic (uppercase) style:

\renewcommand{\thechapter}{\Alph{chapter}}

When jumping to anchors, browsers put the targeted line on top of display. As a consequence, in the following code:

\section{A section}
\label{section:section}
 ...
See Section~\ref{section:section}

Clicking on the link produced by \ref{section:section} will result in not displaying the targeted section title. A fix is writing:

\section{\label{section:section}A section}
 ...
See Section~\ref{section:section}

Starting with version 2.04, HEVEA and HACHA will use the label name (section:section above) for the table of contents they generate. For instance, the source code for the next sectioning command just below is:

\subsection{The \label{appendix}Appendix}

As a consequence, the link to the next section on top of this page should read as:

<a href="sectioning.html#appendix">The Appendix</a>

That is, HEVEA used the label name given in source as an anchor. Notice that this behaviour applies to the \label command that occurs first in the sectioning command argument.

B.4.2 The Appendix

The \appendix command exists and should work as in LATEX.

B.4.3 Table of Contents

HEVEA now generates a table of contents, using a procedure similar to the one of LATEX(a .htoc file is involved). One inserts this table of contents in the main document by issuing the command \tableofcontents. Table of contents is controlled by the counter tocdepth. By default, the table of contents shows sectioning units down to the subsubsection level in article style and down to the subsection level in book (or report) style. To include more or less sectioning units in the table of contents, one should increase or decrease the tocdepth counter. It is important to notice that HEVEA produces such a table of contents, only when it has total control over cross-references. More precisely, HEVEA cannot produce the table of contents when it reads LATEX-produced .aux files. Instead, it should read its own .haux files. This will naturally occur if no .aux files are present, otherwise these .aux files should be deleted, or HEVEA should be instructed not to read them with the command-line option -fix (see Sections B.11.1 and  C.1.1.4).

One can also add extra entries in the table of contents by using the command \addcontentslines, in a way similar to LATEX homonymous command. However, hyperlinks need to be introduced explicitly, as in the following example, where an anchor is defined in the section title and referred to in the argument to \addcontentsline:

\subsection*{\aname{no:number}{Use \hacha{}}}
\addcontentsline{toc}{subsection}{\ahrefloc{no:number}{Use \hacha{}}}

(See Section 8.1.1 for details on commands related to hyperlinks.)

There is no list of figures nor list of tables.

Use HACHA

However, HEVEA has a more sophisticated way of producing a kind of map w.r.t. the sectioning of the document. A later run of HACHA on HEVEA output file splits it in smaller files organized in a tree whose nodes are tables of links. By contrast with LATEX, starred sectioning commands generate entries in these tables of contents. Table of contents entries hold the optional argument to sectioning commands or their argument when there is no optional argument. Section 7 explains how to control HACHA.


Previous Up Next hevea-2.36-manual/manual031.html0000644004317100512160000001354214252364056016440 0ustar marangetcristal Figures, Tables, and Other Floating Bodies Previous Up Next

B.9 Figures, Tables, and Other Floating Bodies

B.9.1 Figures And Tables

Figures and tables are put where they appear in the source (location “h”), regardless of their placement arguments. HEVEA wraps them in BLOCKQUOTE elements that are associated with CSS classes figure and table respectively. Figures and tables are separated from enclosing text by two horizontal rules (CSS class floatrule). If the capabilities of floatrule prove insufficient users can create their own separators by defining the parameter-less macro \floatseparator, like for example,

\newcommand{\floatseparator}{\begin{center}\ast\end{center}}

or even drop them completely by supplying an empty expansion and thereby recover the original LATEX layout.

Captions and cross referencing are handled. However, captions are not moved at end of figures or tables: instead, they appear where the \caption commands occur in source.

The \suppressfloats command does nothing; the figure related counters (such as topnumber) exist but are useless.

B.9.2 Footnotes

The basics of footnotes are discussed in section B.3.3.

HEVEA puts the text of every footnote in a block associated with CSS class footnotetext. The rule that separates the body text from the footnotes can by styled with CSS class footnoterule.

B.9.3 Marginal Notes

Marginal notes go in the right margin by default. To get marginal notes in the left margin, use \reversemaginpar. Marginal notes are handled in an HEVEA specific way. By default, all notes go in the right margin. Issuing \reversemarginpar causes the notes to go in the left margin. Unsurprisingly, issuing \normalmarginpar reverts to default behaviour.

The \marginpar command has an optional argument.

\marginpar[left_text]{right_text}

If optional argument left_text is present and that notes go in the left margin, then left_text is the text of the note. Otherwise, right_text is the text of the note. As a conclusion, marginal notes in HEVEA always go to a fixed side of the page, which side being controlled by the commands \normalmarginpar (right side) and \reversemarginpar (left side). This departs form LATEX that selects a default side depending on the parity of the page counter.

Marginal notes are styled by the means of two environment style classes (see Section 9.3) : marginpar and marginparside. The latter marginparside takes care of margins and placement as a float, its value is marginparright for notes in the right margin and marginparleft for notes in the left margin. Users are not expected to alter those. The marginpar environment style class governs the general aspect of all marginal notes. Users can control the aspect of all marginal notes by defining a new style class and assigning the marginpar environment style class. For instance, to get all marginal notes in red font, and taking 10% of the page width (in place of the default 20%), one can issue the following commands in the document preamble.

\newstyle{.mynote}{width:10\%; color:red;}
\setenvclass{marginpar}{mynote}

Previous Up Next hevea-2.36-manual/manual006.html0000644004317100512160000004224014252364056016437 0ustar marangetcristal How to detect and correct errors Previous Up Next

4 How to detect and correct errors

Most of the problems that occur during the translation of a given LATEX file (say trouble.tex) can be detected and solved at the macro-level. That is, most problems induce a macro-related warning and can be solved by writing a few macros. The best place for these macros is an user style file (say trouble.hva) given as argument to HEVEA.

# hevea trouble.hva trouble.tex

By doing so, the macros written specially for HEVEA are not seen by LATEX. Even better, trouble.tex is not changed at all.

A worth-mentiong alternative is inserting \usepackage{trouble} in the document preamble. Then, given HEVEA semantics for \usepackage (see Section B.5.2), HEVEA-specific commands should be placed in the file “trouble.hva” file, while LATEX-specific commands should be placed in the file “trouble.sty”.

Of course, adapting a document to HEVEA processing will be easier if the LATEX source is written in a generic style, using macros. Note that this style is recommended anyway, since it facilitates document maintenance.

4.1 HEVEA does not know a macro

This section has been outdated by the implementation of \raisebox by C. Spiel. Nevertheless, the method illustrated here is still highly valuable. This method can be summarised as “if HEVEA does not know about a macro, you may solve the problem a simple one yourself” and “do not ignore warnings”.

Consider the following LATEX source excerpt:

You can \raisebox{.6ex}{\em raise} text.

LATEX typesets this as follows:

Since HEVEA does not know about \raisebox, it incorrectly processes this input. More precisely, it first prints a warning message:

trouble.tex:34: Unknown macro: \raisebox

Then, it goes on by translating the arguments of \raisebox as if they were normal text. As a consequence some .6ex is finally found in the html output:

You can .6exraise text.

To correct this, you should provide a macro that has more or less the effect of \raisebox. It is impossible to write a generic \raisebox macro for HEVEA, because of html limitations.1 However, in this case, the effect of \raisebox is to raise the box a little. Thus, the first, numerical, argument to \raisebox can be ignored in a private \raisebox macro defined in trouble.hva:

\newcommand{\raisebox}[2]{$^{\mbox{#2}}$}

Now, translating the document yields:

You can raise text a little.

Of course, this will work only when all \raisebox commands in the document raise text a little. Consider, the following example, where text is both raised a lowered a little:

You can \raisebox{.6ex}{\em raise}
or \raisebox{-.6ex}{\em lower} text.

Which LATEX renders as follows:

Whereas, with the above definition of \raisebox, HEVEA produces:

You can raise or lower text.

A solution is to add a new macro definition in the trouble.hva file:

\newcommand{\lowerbox}[2]{$_{\mbox{#2}}$}

Then, trouble.tex itself has to be modified a little.

You can \raisebox{.6ex}{\em raise}
or \lowerbox{-.6ex}{\em lower} text.

HEVEA now produces a satisfying output:

You can raise or lower text.

Note that, for the document to remain LATEX-processable, it should also contain the following definition for \lowerbox:

\newcommand{\lowerbox}[2]{\raisebox{#1}{#2}}

This definition can safely be placed anywhere in trouble.tex, since by HEVEA semantics for \newcommand (see section B.8.1) the new definition will not overwrite the old one.

4.2 HEVEA incorrectly interprets a macro

Note : HEVEA now renders the \rule command very similarly to LATEX. Hence the forthcomming section is in some sense obsolete. Nevertheless, the technique described is useful and the section is still worth reading.

Sometimes HEVEA knows about a macro, but the produced html does not look good when seen through a browser. This kind of errors is detected while visually checking the output. However, HEVEA does its best to issue warnings when such situations are likely to occur.

Consider, for instance, this definition of \blob as a small black square.

\newcommand{\blob}{\rule[.2ex]{1ex}{1ex}}
\blob\ Blob \blob

Which LATEX typesets as follows:

HEVEA always translates \rule as <hr>, ignoring size arguments. Hence, it produces the following, wrong, output:


Blob

We may not be particularily commited to a square blob. In that case, other small symbols would perfectly do the job of \blob, such as a bullet (\bullet). Thus, you may choose to give \blob a definition in trouble.hva:

\newcommand{\blob}{\bullet}

This new definition yields the following, more satisfying output:

• Blob •

In case we do want a square blob, there are two alternatives. We can have LATEX typeset some subparts of the document and then to include them as images, section 6 explains how to proceed. We can also find a square blob somewhere in the variety of Unicode (or do I mean ISO 10646?) characters, and define \blob as a numerical character reference. Here, the character U+02588 seems ok.

\newcommand{\blob}{\@print@u{X2588}}
█ Blob █

However, beware that not all browsers display all of Unicode…

Finally, users that experience poor rendering of the \rule command can also upgrade HEVEA, so as to benefit from the new implementation of this command:

Blob

4.3 HEVEA crashes

HEVEA failure may have many causes, including a bug. However, it may also stem from a wrong LATEX input. Thus, this section is to be read before reporting a bug…

4.3.1 Simple cases: LATEX also crashes

In the following source, environments are not properly balanced:

\begin{flushright}
\begin{quote}
This is right-flushed quoted text.
\end{flushright}
\end{quote}

Such a source will make both LATEX and HEVEA choke. HEVEA issues the following error message that shows the LATEX environment that is not closed properly:

./trouble.tex:6: Environment nesting error: html: 'DIV' closes 'BLOCKQUOTE'
./trouble.tex:4: Latex environment 'quote' is pending
Adios

Thus, when HEVEA crashes, it is a good idea to check that the input is correct by running LATEX on it.

4.3.2 Complicated cases

Unfortunately, HEVEA may crash on input that does not affect LATEX. Such errors usually relate to environment or group nesting.

Consider for instance the following “optimized” version of a quoteright environment:

\newenvironment{quoteright}{\quote\flushright}{\endquote}

\begin{quoteright}
This a right-flushed quotation
\end{quoteright}

The \quote and \flushright constructs are intended to replace \begin{quote} and \begin{flushright}, while \endquote stands for \end{quote}. Note that the closing \endflushright is omitted, since it does nothing. LATEX accepts such an input and produces a right-flushed quotation.

However, HEVEA usually translates LATEX environments to html block-level elements and it requires those elements to be nested properly. Here, \quote translates to <blockquote>, \flushright translates to <div class="flushright"> and \endquote translates to </blockquote>. At that point, HEVEA refuses to generate obviously non-correct html and it crashes:

Giving up command: \@close
Giving up command: \endquote
Giving up command: \endquoteright
Giving up command: \end
./trouble.tex:7: Environment nesting error: html: 'BLOCKQUOTE' closes 'DIV'
./trouble.tex:5: Latex environment 'quoteright' is pending
Adios

Also notice that the error message above includes a backtrace showing the call-chain of commands.

In this case, the solution is easy: environments must be opened and closed consistently. LATEX style being recommended, one should write:

\newenvironment{quoteright}
  {\begin{quote}\begin{flushright}}
  {\end{flushright}\end{quote}}

And we get:

This is a right-flushed quotation

Unclosed LATEX groups ({…) are another source of nuisance to HEVEA. Consider the following horreur.tex file:

\documentclass{article}

\begin{document}
In this sentence, a group is opened now {\em and never closed.
\end{document}

LATEX accepts this file, although it produces a warning:

# latex horreur.tex 
This is TeX, Version 3.14159 (Web2C 7.2)
  ...
(\end occurred inside a group at level 1)
Output written on horreur.dvi (1 page, 280 bytes).

By contrast, running HEVEA on horreur.tex yields a fatal error:

# hevea horreur.tex 
Giving up command: \@raise@enddocument
Giving up command: \enddocument
Giving up command: \end
./horreur.tex:4: Environment nesting error: Latex env error: 'document' closes ''
./horreur.tex:3: Latex environment '' is pending
Adios

Thus, users should close opening braces where it belongs. Note that HEVEA error message “Latex environment ’env’ is pending” helps a lot in locating the brace that hurts.

4.3.3 Desperate cases

If HEVEA crashes on LATEX source (not on TEX source), then you may have discovered a bug, or this manual is not as complete as it should. In any case, please report to Luc.Maranget@inria.fr.

To be useful, your bug report should include LATEX code that triggers the bug (the shorter, the better) and mention HEVEA version number.


1
Clearly the author of those lines was wrong, as demonstrated here.

Previous Up Next hevea-2.36-manual/manual029.html0000644004317100512160000004537614252364056016461 0ustar marangetcristal Mathematical Formulae Previous Up Next

B.7 Mathematical Formulae

B.7.1 Math Mode Environment

The three ways to use math mode ($$, \(\) and \begin{math}\end{math}) are supported. The three ways to use display math mode ($$$$, \[\] and \begin{displaymath}\end{displaymath}) are also supported. Furthermore, \ensuremath behaves as expected.

The equation, eqnarray, eqnarray* environments are supported. Equation labelling and numbering is performed in the first two environments, using the equation counter. Additionally, numbering can be suppressed in one row of an eqnarray, using the \nonumber command.

Math mode is not as powerful in HEVEA as in LATEX. The limitations of math mode can often be surpassed by using math display mode. As a matter of fact, math mode is for in-text formulas. From the html point of view, this means that math mode does not close the current flow of text and that formulas in math mode must be rendered using text-level elements only. By contrast, displayed formulas can be rendered using block-level elements. This means that HEVEA have much more possibilities in display context than inside normal flow of text. In particular, stacking text elements one above the over is possible only in display context. For instance compare how HEVEA renders $\frac{1}{\sum_{i=1}^{\infty} i$ as: 1/∑i=1 i, and $$\frac{1}{\sum_{i=1}^{\infty} i$$ as:

1
i=1
i

B.7.2 Common Structures

HEVEA admits, subscript (_), superscripts (^) and fractions (\frac{numer}{denom}). The best effect is obtained in display mode, where html table element is extensively used. By contrast, when not in display mode, HEVEA uses only SUB and SUP text-level elements to render superscrits and subscript, and the result may not be very satisfying.

However, simple subscripts and superscripts, such as x_i or x^2, are always rendered using the SUB and SUP text-level elements and their appearance should be correct even in in-text formulas.

When occurring outside math mode, characters _ and ^ act as ordinary characters and get echoed to the output. However, a warning is issued.

An attempt is made to render all ellipsis constructs (\ldots, \cdots, \vdots and \ddots). The effect may be strange for the latter two.

B.7.3 Square Root

The nth root command \sqrt is supported only for n=3,4, thanks to the existence of Unicode characters for the same. For the others, we shift to fractional exponents, in which case, the \sqrt command is defined as follows:

\newcommand{\sqrt}[3][2]{\left(#2\right)^{1/#1}}

Then, the source fragment: $$\sqrt[5]{\frac{1}{n!}} + \sqrt[3]{\pi} + \sqrt{\pi}$$ gets rendered as follows:




1
n!



1
5



 
 + 
π
 + 
π

B.7.4 Unicode and mathematical symbols

The support for unicode symbols offered by modern browsers allows to translate almost all math symbols correctly.

Log-like functions and variable sized-symbols are recognized and their subscripts and superscripts are put where they should in display mode. Subscript and superscript placement can be changed using the \limits and \nolimits commands. Big delimiters are also handled.

B.7.5 Putting one thing above/below/inside

The commands \stackrel, \underline and \overline are recognized. They produce sensible output in display mode. In text mode, these macros call the \textstackrel, \textunderline and \textoverline macros. These macros perform the following default actions

\textstackrel
Performs ordinary superscripting.
\textunderline
Underlines its argument, using the U text-level element.
\textoverline
Overlines using style-sheets (used <SPAN> with a top border).

The command \boxed works well both in display and normal math mode. Input of the form \boxed{\frac{\pi}{2}} produces π/2 in normal math, and

π/2

in display-math mode. The commands \bigl,\bigr etc. are also rendered well. Some examples can be found here.

B.7.6 Math accents

Math accents that have coresponding text accents (\hat, \tilde, etc.) are handled by default. They in fact act as the corresponding text-mode accents (Section B.3.4). As a consequence, they work properly only on ascii letters. This may be quite cumbersome, but at least some warnings draw user’s attention on the problem. If accents are critical to your document and that HEVEA issues a lot of warnings, a solution is to redefine the math accent command. A suggested replacement is using limit superscripts. That way accents are positioned above symbols in display mode and after symbols in text mode.

\renewcommand{\hat}[1]{\mathop{#1}\limits^{\textasciicircum}\nolimits}
Displayed:
$$
\hat{\mu} = \hat{\Delta}.
$$
In text: $\hat{\mu} = \hat{\delta}$

An you get, displayed:

^
µ
 
 = 
^
Δ
 
.

In text: µ^ = δ^.

Whereas, with the default of \hat being \^, you get “µ = δ”, with the following warnings:

./tmp.tex:4652: Warning: Application of '\^' on '\mu' failed
./tmp.tex:4652: Warning: Application of '\^' on '\delta' failed

The \vec command is rendered differently in display and non-display mode. In display mode, the arrow appears in normal position, while in non-display the arrow appears as an ordinary superscript.

\vec{u} in text mode: u,  \vec{u} in display mode: 
u
 

Most “extensible accents” (\widetilde, \widehat, etc.) are not even defined. There are a few exceptions: line “accents”:

  
abc
\underline
  
abc
\overline

Brace “accents”:

  
 
1 × 2 × ⋯ × n


\underbrace
  


1 × 2 × ⋯ × n
 
\overbrace

And arrow “accents”:

  

1 × 2 × ⋯ × n
 
\overleftarrow
  

1 × 2 × ⋯ × n
 
\overrightarrow

B.7.7 Spacing

By contrast with LATEX, space in the input matters in math mode. One or more spaces are translated to one space. Furthermore, spaces after commands (such as \alpha) are echoed except for invisible commands (such as \tt). This allows users to control space in their formulas, output being near to what can be expected.

Explicit spacing commands (\,, \!, \: and \;) are recognized, the first two commands do nothing, while the others two output one space.

B.7.8 Changing Style

Letters are italicized inside math mode and this cannot be changed. The appearance of other symbols can be changed using LATEX 2є style changing commands (\mathbf, etc.). The commands \boldmath and \unboldmath are not recognized. Whether symbols belonging to the symbol font are affected by style changes or not is browser dependent.

The \cal declaration and the \mathcal command (that yield calligraphic letters in LATEX) exist. They yield red letters by default.

Observe that this does not corresponds directly to how LATEX manage style in math mode and that, in fact, style cannot really change in math mode.

Math style changing declarations \displaystyle and \textstyle do nothing when HEVEA is already in the requested mode, otherwise they issue a warning. This is so because HEVEA implements displayed maths as tables, which require to be both opened and closed and introduce line breaks in the output. As a consequence, warnings on \displaystyle are to be taken seriously.

The commands \scriptstyle and \scriptscriptstyle perform type size changes.


Previous Up Next hevea-2.36-manual/manual020.html0000644004317100512160000003533114252364056016436 0ustar marangetcristal Customising HEVEA Previous Up Next

10 Customising HEVEA

HEVEA can be controlled by writing LATEX code. In this section, we examine how users can change HEVEA default behaviour or add functionalities. In all this section we assume that a document doc.tex is processed, using a private command file macros.hva. That is, HEVEA is invoked as:

# hevea macros.hva doc.tex

The general idea is as follows: one redefines LATEX constructs in macros.hva, using internal commands. This requires a good working knowledge of both LATEX and html. Usually, one can avoid internal commands, but then, all command redefinitions interact, sometimes in very nasty ways.

10.1 Simple changes

Users can easily change the rendering of some constructs. For instance, assume that all quotations in a text should be emphasised. Then, it suffices to put the following re-declaration in macros.hva:

\renewenvironment{quote}
  {\@open{blockquote}{}\@style{em}}
  {\@close{blockquote}}

The same effect can be achieved without using any of the internal commands:

\let\oldquote\quote
\let\oldendquote\endquote
\renewenvironment{quote}{\oldquote\em}{\oldendquote}

In some sense, this second solution is easier, when one already knows how to customise LATEX. However, this is less safe, since the definition of \em can be changed elsewhere.

There is yet another solution that takes advantage of style sheets. One can also add this line to the macros.hva file:

\newstyle{.quote}{font-style:oblique;}

This works because the environment quote is styled through style class quote (see Section 9.2). Notice that this solution has very little to do with “emphasising” in the proper sense, since here we short-circuit the implicit path from \em to oblique fonts.

10.2 Changing defaults for type-styles

HEVEA default rendering of type style changes is described in section B.15.1. For instance, the following example shows the default rendering for the font shapes:

\itshape italic shape \slshape slanted shape
\scshape small caps shape \upshape upright shape

By default, \itshape is italics, \slshape is oblique italics, \scshape is small-caps (thanks to style sheets) and \upshape is no style at all. All shapes are mutually exclusive, this means that each shape declaration cancels the effect of other active shape declarations. For instance, in the example, small caps shapes is small caps (no italics here).

italic shape slanted shape small caps shape upright shape

If one wishes to change the rendering of some of the shapes (say slanted caps), then one should redefine the old-style \sl declaration. For instance, to render slanted as Helvetica (why so?), one should redefine \sl by \renewcommand{\sl}{\@span{style="font-family:Helvetica"}} in macros.hva.

And now, the shape example above gets rendered as follows:

italic shape slanted shape small caps shape upright shape

Redefining the old-style \sl is compatible with the cancellation mechanism, redefining \slshape is not. Thus, redefining directly LATEX 2є \slshape with \renewcommand{\slshape}{} would yield:

italic shape slanted shape small caps shape upright shape

Hence, redefining old-style declarations using internal commands should yield satisfactory output. However, since cancellation is done at the html level, a declaration belonging to one component may sometimes cancel the effect of another that belongs to another component. Anyway, you might have not noticed it if I had not told you.

10.3 Changing the interface of a command

Assume for instance that the base style of doc.tex is jsc (the Journal of Symbolic Computation style for articles). For running HEVEA, the jsc style can be replaced by article style, but for a few commands whose calling interface is changed. In particular, the \title command takes an extra optional argument (which HEVEA should ignore anyway). However, HEVEA can process the document as it stands. One solution to insert the following lines into macros.hva:

\input{article.hva}% Force document class 'article'
\let\oldtitle=\title
\renewcommand{\title}[2][]{\oldtitle{#2}}

The effect is to replace \title by a new command which calls HEVEA \title with the appropriate argument.

10.4 Checking the optional argument within a command

HEVEA fully implements LATEX 2є \newcommand. That is, users can define commands with an optional argument. Such a feature permits to write a \epsfbox command that has the same interface as the LATEX command and echoes itself as it is invoked to the image file. To do this, the HEVEA \epsfbox command has to check whether it is invoked with an optional argument or not. This can be achieved as follows:

\newcommand{\epsfbox}[2][!*!]{%
\ifthenelse{\equal{#1}{!*!}}
{\begin{toimage}\epsfbox{#2}\end{toimage}}%No optional argument
{\begin{toimage}\epsfbox[#1]{#2}\end{toimage}}}%With optional argument
\imageflush}

10.5 Changing the format of images

Semi-automatic generation of included images is described in section 6. Links to included images are generated by the \imageflush command, which calls the \imgsrc command:

\newcommand{\imageflush}[1][]
{\@imageflush\stepcounter{image}\imgsrc[#1]{\hevaimagedir\jobname\theimage\heveaimageext}}

That is, you may supply a html-style attribute to the included image, as an optional argument to the \imageflush command.

By default, images are PNG images stored in .png files. HEVEA provides support for the alternative GIF image file format. It suffices to invoke hevea as:

# hevea gif.hva doc.tex

Then imagen must be run with option -gif:

# imagen -gif doc

A convenient alternative is to invoke hevea as:

# hevea -fix gif.hva doc.tex

Then hevea will invoke imagen with the appropriate option when it thinks images need to be rebuild. An even more convenient alternative is to load gif.hva from within document source, for instance with the \usepackage command.

HEVEA also provides support for the alternative SVG image file format. As for GIF images, it is more convenient to use option -fix to combine hevea and imagen invocations:

# hevea -fix svg.hva doc.tex

Notice that imagen production chain of SVG images always call pdflatex, even when not given the -pdf command-line option. Hence the source code of images must be processable by pdflatex. This precludes using latex-only packages such as pstricks for instance.

As not all browsers display SVG images, hevea and imagen are bit special: imagen produces both PNG9 and SVG images; while hevea offers both image sources, letting client browser select the most appropriate one by the means of the srcset attribute of the img element.

10.6 Storing images in a separate directory

By redefining the \heveaimagedir command, users can specify a directory for images. More precisely, if the following redefinition occurs in the document preamble.

\renewcommand{\heveaimagedir}{dir}

Then, all links to images in the produced html file will be as “dir/…”. Then imagen must be invoked with option - todir:

# imagen -todir dir doc

As usual, hevea will invoke imagen with the appropriate option, provided it is passed the -fix option.

10.7 Controlling imagen from document source

The internal command \@addimagenopt{option} add the text option to imagen command-line options, when launched automatically by hevea (i.e. when hevea is given the -fix command-line option).

For instance, to instruct hevea/imagen to reduce all images by a factor of √2, it suffices to state:

%HEVEA\@addimagenopt{-mag 707}

See section C.1.5 for the list of command-line options accepted by imagen.


9
or GIF, if gif.hva is loaded

Previous Up Next hevea-2.36-manual/manual048.html0000644004317100512160000010140114252364057016441 0ustar marangetcristal Index Previous Up

Index


Previous Up hevea-2.36-manual/manual014.html0000644004317100512160000000170414252364056016436 0ustar marangetcristal Another cut subsubsection Previous Up

7.3.11 Another cut subsubsection

Another note in a subsubsection, flushed at sections.6


Previous Up hevea-2.36-manual/manual022.html0000644004317100512160000002132214252364057016434 0ustar marangetcristal Reference manual Previous Up Next

Part B
Reference manual

This part follows the pattern of the LATEX reference manual [LATEX, Appendix C].


Previous Up Next hevea-2.36-manual/manual021.html0000644004317100512160000001205614252364056016436 0ustar marangetcristal Other output formats Previous Up

11 Other output formats

It is possible to translate LATEX file into other formats than html. There are two such formats: plain text and info files. This enables producing postscript, html, plain text and info manuals from one (LATEX) input file.

11.1 Text

The LATEX file is processed and converted into a plain text formatted file. It allows some pretty-printing in plain text.

To translate into text, invoke HEVEA as follow:

# hevea -text [-w <width>] myfile.tex

Then, HEVEA produces myfiles.txt a plain text translation of myfile.tex.

Additionally, the optional argument -w <number> sets the width of the output for text formatting. By default, The text will be 72 characters wide.

Nearly every environment has been translated, included lists and tables. The support is nearly the same as in html, excepted in some cases described hereafter.

Most style changes are ignored, because it is hardly possible to render them in plain text. Thus, there are no italics, bold fonts, underlinings, nor size change or colours… The only exception is for the verbatim environment that puts the text inside quotes, to distinguish it more easily.

Tables with borders are rendered in the same spirit as in LATEX. Thus for instance, it is possible to get vertical lines between some columns only. Table rendering can be poor in case of line overflow. The only way to correct this (apart from changing the tables themselves) is to adjust the formatting width, using the the -w command-line option.

For now, maths are not supported at all in text mode. You can get very weird results with in-text mathematical formulas. Of course, simple expressions such as subscripts remains readable. For instance, x2 will be rendered as x^2, but ∫01f(x)dx will yield something like : int01f(x)dx.

11.2 Info

The file format info is also supported. Info files are text files with limited hypertext links, they can be read by using emacs info mode or the info program. Please note that HEVEA translates plain LATEX to info, and not TeXinfo.

You can translate your LATEX files into info file(s) as follows:

# hevea -info [-w <width>] myfile.tex

Then, HEVEA produces the file myfile.info, an info translation of myfile.tex. However, if the resulting file is too large, it is cut into pieces automatically, and myinfo.info now contains references for all the nodes in the others files, which are named myfile.info-1, myfile.info-2,…

The optional argument -w has the same meaning as for text output.

The text will be organised in nodes that follow the pattern of LATEX sectioning commands. Menus are created to navigate through the sections easily

A table of content is produced automatically. References, indexes and footnotes are supported, as they are in html mode. However, the info format only allows pointers to info nodes, i.e. in HEVEA case, to sectional units. As a consequence all cross references lead to sectional unit headers.


Previous Up hevea-2.36-manual/thaihevea.haux0000644004317100512160000000037714252364057016701 0ustar marangetcristal\@@addtocsec{htoc}{sec1}{0}{\@print{1}\quad{}Latin/Thai Character Set{}} \@@addtocsec{htoc}{sec2}{0}{\@print{2}\quad{}Thai in \LaTeX{}} \@@addtocsec{htoc}{sec3}{0}{\@print{3}\quad{}Thai in \hevea{}} \newlabel{commands}{{1}{X}} \newlabel{thaichar}{{1}{X}} hevea-2.36-manual/manual.haux0000644004317100512160000004530414252364054016214 0ustar marangetcristal\citation{html} \citation{htmlb} \@@addtocsec{htoc}{usermanual}{-1}{\@print{Part A}\quad{}\label{usermanual}Tutorial{}} \new@anchor@label{sec2}{usermanual}{{A}{X}} \@@addtocsec{htoc}{getstarted}{0}{\@print{1}\quad{}How to get\label{getstarted} started{}} \new@anchor@label{sec3}{getstarted}{{1}{X}} \@@addtocsec{htoc}{sec4}{0}{\@print{2}\quad{}Style files{}} \@@addtocsec{htoc}{sec5}{1}{\@print{2.1}\quad{}Standard base styles{}} \@@addtocsec{htoc}{sec6}{1}{\@print{2.2}\quad{}Other base styles{}} \newlabel{otherbase}{{2.2}{X}} \@@addtocsec{htoc}{sec7}{1}{\@print{2.3}\quad{}Other style files{}} \new@anchor@label{sec9}{usepackage:both}{{2.3.2}{X}} \@@addtocsec{htoc}{sec10}{0}{\@print{3}\quad{}A note on style{}} \@@addtocsec{htoc}{sec11}{1}{\@print{3.1}\quad{}Spacing, Paragraphs{}} \new@anchor@label{sec12}{spurious:par}{{3.1.1}{X}} \@@addtocsec{htoc}{sec14}{1}{\@print{3.2}\quad{}Math mode{}} \new@anchor@label{sec15}{spacemath}{{3.2.1}{X}} \newlabel{symbols}{{3.2.2}{X}} \newlabel{symbol:fig}{{1}{X}} \@@addtocsec{htoc}{sec19}{1}{\@print{3.3}\quad{}Warnings{}} \@@addtocsec{htoc}{sec20}{1}{\@print{3.4}\quad{}Commands{}} \@@addtocsec{htoc}{sec21}{1}{\@print{3.5}\quad{}Style choices{}} \newlabel{stylechoice}{{3.5}{X}} \@@addtocsec{htoc}{sec22}{0}{\@print{4}\quad{}How to detect and correct errors{}} \newlabel{trouble}{{4}{X}} \@@addtocsec{htoc}{sec23}{1}{\@print{4.1}\quad{}\hevea{} does not know a macro{}} \newlabel{dontknow}{{4.1}{X}} \@@addtocsec{htoc}{sec24}{1}{\@print{4.2}\quad{}\hevea{} incorrectly interprets a macro{}} \newlabel{blob}{{4.2}{X}} \newlabel{square:blob}{{4.2}{X}} \@@addtocsec{htoc}{sec25}{1}{\@print{4.3}\quad{}\hevea{} crashes{}} \@@addtocsec{htoc}{both}{0}{\@print{5}\quad{}\label{both}Making \hevea{} and \LaTeX{} both happy{}} \new@anchor@label{sec29}{both}{{5}{X}} \@@addtocsec{htoc}{sec30}{1}{\@print{5.1}\quad{}File loading{}} \newlabel{fileloading}{{5.1}{X}} \newlabel{heveaonly}{{5.1}{X}} \@@addtocsec{htoc}{heveastyle}{1}{\@print{5.2}\quad{}The \label{heveastyle}\protect\texttt{hevea} package{}} \new@anchor@label{sec31}{heveastyle}{{5.2}{X}} \newlabel{why}{{5.2.2}{X}} \newlabel{heveabool}{{5.2.3}{X}} \citation{latex} \@@addtocsec{htoc}{sec35}{1}{\@print{5.3}\quad{}Comments{}} \newlabel{comments}{{5.3}{X}} \@@addtocsec{htoc}{imagen}{0}{\@print{6}\quad{}\label{imagen}With a little help from \LaTeX{}} \new@anchor@label{sec36}{imagen}{{6}{X}} \@@addtocsec{htoc}{image:file}{1}{\@print{6.1}\quad{}The \textit{image}\label{image:file} file{}} \new@anchor@label{sec37}{image:file}{{6.1}{X}} \@@addtocsec{htoc}{sec38}{1}{\@print{6.2}\quad{}A toy example{}} \@@addtocsec{htoc}{sec39}{1}{\@print{6.3}\quad{}Including Postscript images{}} \newlabel{substimage}{{6.3}{X}} \@@addtocsec{htoc}{sec40}{1}{\@print{6.4}\quad{}Using filters{}} \@@addtocsec{htoc}{hacha}{0}{\@print{7}\quad{}\label{hacha}Cutting your document into pieces with \hacha{}} \new@anchor@label{sec41}{hacha}{{7}{X}} \@@addtocsec{htoc}{sec42}{1}{\@print{7.1}\quad{}Simple usage{}} \newlabel{html:footer}{{7.1}{X}} \newlabel{hacha:style}{{7.1}{X}} \@@addtocsec{htoc}{sec43}{1}{\@print{7.2}\quad{}Advanced usage{}} \new@anchor@label{sec46}{table:link:style}{{7.2.3}{X}} \@@addtocsec{htoc}{sec49}{1}{\@print{7.3}\quad{}More Advanced Usage{}} \new@anchor@label{sec50}{cutname}{{7.3.1}{X}} \newlabel{answers}{{7.3.6}{X}} \new@anchor@label{sec58}{hachafoot}{{7.3.7}{X}} \@@addtocsec{htoc}{sec65}{0}{\@print{8}\quad{}Generating \html{} constructs{}} \@@addtocsec{htoc}{sec66}{1}{\@print{8.1}\quad{}High-Level Commands{}} \new@anchor@label{sec67}{hyperlink}{{8.1.1}{X}} \newlabel{urlareprocessed}{{8.1.1}{X}} \newlabel{color:high}{{8.1.2}{X}} \@@addtocsec{htoc}{imgsrc}{1}{\@print{8.2}\quad{}More on included\label{imgsrc} images{}} \new@anchor@label{sec69}{imgsrc}{{8.2}{X}} \@@addtocsec{htoc}{internal}{1}{\@print{8.3}\quad{}Internal \label{internal}macros{}} \new@anchor@label{sec70}{internal}{{8.3}{X}} \citation{html} \@@addtocsec{htoc}{rawhtml}{1}{\@print{8.4}\quad{}The \texttt{rawhtml}\label{rawhtml} environment{}} \new@anchor@label{sec72}{rawhtml}{{8.4}{X}} \@@addtocsec{htoc}{sec73}{1}{\@print{8.5}\quad{}Examples{}} \newlabel{getcolor:usage}{{8.5}{X}} \@@addtocsec{htoc}{encodings}{1}{\@print{8.6}\quad{}The \label{encodings}document charset{}} \new@anchor@label{sec74}{encodings}{{8.6}{X}} \@@addtocsec{htoc}{style:sheets}{0}{\@print{9}\quad{}Support\label{style:sheets}\index{style-sheets} for style sheets{}} \new@anchor@label{sec75}{style:sheets}{{9}{X}} \@@addtocsec{htoc}{sec76}{1}{\@print{9.1}\quad{}Overview{}} \citation{css} \@@addtocsec{htoc}{css:change:all}{1}{\@print{9.2}\quad{}Changing \label{css:change:all} the style of all instances of an environment{}} \new@anchor@label{sec77}{css:change:all}{{9.2}{X}} \@@addtocsec{htoc}{css:change}{1}{\@print{9.3}\quad{}Changing \label{css:change}the style of some instances of an environment{}} \new@anchor@label{sec78}{css:change}{{9.3}{X}} \newlabel{getstylecolor:example}{{9.3}{X}} \@@addtocsec{htoc}{whatclass}{1}{\@print{9.4}\quad{}Which class affects\label{whatclass} what{}} \new@anchor@label{sec79}{whatclass}{{9.4}{X}} \@@addtocsec{htoc}{sec80}{1}{\@print{9.5}\quad{}A few examples{}} \@@addtocsec{htoc}{sec84}{1}{\@print{9.6}\quad{}Miscellaneous{}} \@@addtocsec{htoc}{sec89}{0}{\@print{10}\quad{}Customising \hevea{}} \@@addtocsec{htoc}{sec90}{1}{\@print{10.1}\quad{}Simple changes{}} \@@addtocsec{htoc}{sec91}{1}{\@print{10.2}\quad{}Changing defaults for type-styles{}} \newlabel{customize-style}{{10.2}{X}} \@@addtocsec{htoc}{sec92}{1}{\@print{10.3}\quad{}Changing the interface of a command{}} \newlabel{customize-let}{{10.3}{X}} \@@addtocsec{htoc}{sec93}{1}{\@print{10.4}\quad{}Checking the optional argument within a command{}} \newlabel{fullepsfbox}{{10.4}{X}} \@@addtocsec{htoc}{sec94}{1}{\@print{10.5}\quad{}Changing the format of images{}} \@@addtocsec{htoc}{sec95}{1}{\@print{10.6}\quad{}Storing images in a separate directory{}} \@@addtocsec{htoc}{imagen-source}{1}{\@print{10.7}\quad{}Controlling\label{imagen-source} \texttt{imagen} from document source{}} \new@anchor@label{sec96}{imagen-source}{{10.7}{X}} \@@addtocsec{htoc}{alternative}{0}{\@print{11}\quad{}Other \label{alternative}output formats{}} \new@anchor@label{sec97}{alternative}{{11}{X}} \@@addtocsec{htoc}{sec98}{1}{\@print{11.1}\quad{}Text{}} \@@addtocsec{htoc}{sec99}{1}{\@print{11.2}\quad{}Info{}} \@@addtocsec{htoc}{referencemanual}{-1}{\@print{Part B}\quad{}\label{referencemanual}Reference manual{}} \new@anchor@label{sec100}{referencemanual}{{B}{X}} \citation{latex} \@@addtocsec{htoc}{sec101}{0}{\@print{B.1}\quad{}Commands and Environments{}} \@@addtocsec{htoc}{sec102}{1}{\@print{B.1.1}\quad{}Command Names and Arguments{}} \@@addtocsec{htoc}{sec103}{1}{\@print{B.1.2}\quad{}Environments{}} \@@addtocsec{htoc}{sec104}{1}{\@print{B.1.3}\quad{}Fragile Commands{}} \@@addtocsec{htoc}{sec105}{1}{\@print{B.1.4}\quad{}Declarations{}} \@@addtocsec{htoc}{sec106}{1}{\@print{B.1.5}\quad{}Invisible Commands{}} \@@addtocsec{htoc}{sec107}{1}{\@print{B.1.6}\quad{}The \texttt{\char92\char92} Command{}} \@@addtocsec{htoc}{sec108}{0}{\@print{B.2}\quad{}The Structure of the Document{}} \newlabel{structure}{{B.2}{X}} \newlabel{metadef}{{B.2}{X}} \newlabel{exlet}{{B.2}{X}} \@@addtocsec{htoc}{sec109}{0}{\@print{B.3}\quad{}Sentences and Paragraphs{}} \@@addtocsec{htoc}{sec110}{1}{\@print{B.3.1}\quad{}Spacing{}} \@@addtocsec{htoc}{sec111}{1}{\@print{B.3.2}\quad{}Paragraphs{}} \@@addtocsec{htoc}{sec:footnotes}{1}{\@print{B.3.3}\quad{}Footnotes\label{sec:footnotes}{}} \new@anchor@label{sec112}{sec:footnotes}{{B.3.3}{X}} \@@addtocsec{htoc}{accents}{1}{\@print{B.3.4}\quad{}Accents\label{accents} and special symbols{}} \new@anchor@label{sec113}{accents}{{B.3.4}{X}} \@@addtocsec{htoc}{sec114}{0}{\@print{B.4}\quad{}Sectioning{}} \@@addtocsec{htoc}{section:section}{1}{\@print{B.4.1}\quad{}\label{section:section}Sectioning Commands{}} \new@anchor@label{sec115}{section:section}{{B.4.1}{X}} \@@addtocsec{htoc}{appendix}{1}{\@print{B.4.2}\quad{}The \label{appendix}Appendix{}} \new@anchor@label{sec116}{appendix}{{B.4.2}{X}} \@@addtocsec{htoc}{sec117}{1}{\@print{B.4.3}\quad{}Table of Contents{}} \@addcontentsline{htoc}{1}{\ahrefloc{no:number}{Use \hacha{}}} \@@addtocsec{htoc}{sec119}{0}{\@print{B.5}\quad{}Classes, Packages and Page Styles{}} \@@addtocsec{htoc}{sec120}{1}{\@print{B.5.1}\quad{}Document Class{}} \@@addtocsec{htoc}{sec121}{1}{\@print{B.5.2}\quad{}Packages and Page Styles{}} \newlabel{usepackage}{{B.5.2}{X}} \@@addtocsec{htoc}{sec122}{1}{\@print{B.5.3}\quad{}The Title Page and Abstract{}} \@@addtocsec{htoc}{sec123}{0}{\@print{B.6}\quad{}Displayed Paragraphs{}} \@@addtocsec{htoc}{sec124}{1}{\@print{B.6.1}\quad{}Quotation and Verse{}} \@@addtocsec{htoc}{sec125}{1}{\@print{B.6.2}\quad{}List-Making environments{}} \@@addtocsec{htoc}{sec126}{1}{\@print{B.6.3}\quad{}The \protect\texttt{list} and \protect\texttt{trivlist} environments{}} \@@addtocsec{htoc}{sec127}{1}{\@print{B.6.4}\quad{}Verbatim{}} \@@addtocsec{htoc}{sec128}{0}{\@print{B.7}\quad{}Mathematical Formulae{}} \@@addtocsec{htoc}{sec129}{1}{\@print{B.7.1}\quad{}Math Mode Environment{}} \@@addtocsec{htoc}{sec130}{1}{\@print{B.7.2}\quad{}Common Structures{}} \@@addtocsec{htoc}{sec131}{1}{\@print{B.7.3}\quad{}Square Root{}} \@@addtocsec{htoc}{sec132}{1}{\@print{B.7.4}\quad{}Unicode and mathematical symbols{}} \@@addtocsec{htoc}{sec133}{1}{\@print{B.7.5}\quad{}Putting one thing above/below/inside{}} \@@addtocsec{htoc}{sec134}{1}{\@print{B.7.6}\quad{}Math accents{}} \newlabel{mathaccents}{{B.7.6}{X}} \@@addtocsec{htoc}{sec135}{1}{\@print{B.7.7}\quad{}Spacing{}} \newlabel{spacemathref}{{B.7.7}{X}} \@@addtocsec{htoc}{sec136}{1}{\@print{B.7.8}\quad{}Changing Style{}} \@@addtocsec{htoc}{sec137}{0}{\@print{B.8}\quad{}Definitions, Numbering{}} \@@addtocsec{htoc}{sec138}{1}{\@print{B.8.1}\quad{}Defining Commands{}} \newlabel{usermacro}{{B.8.1}{X}} \@@addtocsec{htoc}{sec139}{1}{\@print{B.8.2}\quad{}Defining Environments{}} \citation{latex} \@@addtocsec{htoc}{sec140}{1}{\@print{B.8.3}\quad{}Theorem-like Environments{}} \@@addtocsec{htoc}{sec141}{1}{\@print{B.8.4}\quad{}Numbering{}} \@@addtocsec{htoc}{sec142}{1}{\@print{B.8.5}\quad{}The \texttt{ifthen} Package{}} \newlabel{ifthen}{{B.8.5}{X}} \@@addtocsec{htoc}{sec143}{0}{\@print{B.9}\quad{}Figures, Tables, and Other Floating Bodies{}} \@@addtocsec{htoc}{sec144}{1}{\@print{B.9.1}\quad{}Figures And Tables{}} \@@addtocsec{htoc}{sec145}{1}{\@print{B.9.2}\quad{}Footnotes{}} \@@addtocsec{htoc}{sec146}{1}{\@print{B.9.3}\quad{}Marginal Notes{}} \@@addtocsec{htoc}{sec147}{0}{\@print{B.10}\quad{}Lining It Up in Columns{}} \@@addtocsec{htoc}{sec148}{1}{\@print{B.10.1}\quad{}The \protect\texttt{tabbing} Environment{}} \@@addtocsec{htoc}{sec149}{1}{\@print{B.10.2}\quad{}The \texttt{array} and \texttt{tabular} environments{}} \newlabel{arraydef}{{B.10.2}{X}} \citation{latexbis} \@@addtocsec{htoc}{sec150}{0}{\@print{B.11}\quad{}Moving Information Around{}} \@@addtocsec{htoc}{files}{1}{\@print{B.11.1}\quad{}\label{files}Files{}} \new@anchor@label{sec151}{files}{{B.11.1}{X}} \@@addtocsec{htoc}{cross-reference}{1}{\@print{B.11.2}\quad{}Cross-References\label{cross-reference}\label{cross}{}} \new@anchor@label{sec152}{cross-reference}{{B.11.2}{X}} \newlabel{cross}{{B.11.2}{X}} \@@addtocsec{htoc}{sec153}{1}{\@print{B.11.3}\quad{}Bibliography and Citations{}} \@@addtocsec{htoc}{sec155}{1}{\@print{B.11.4}\quad{}Splitting the Input{}} \@@addtocsec{htoc}{sec156}{1}{\@print{B.11.5}\quad{}Index and Glossary{}} \newlabel{index}{{B.11.5}{X}} \@@addtocsec{htoc}{sec157}{1}{\@print{B.11.6}\quad{}Terminal Input and Output{}} \@@addtocsec{htoc}{sec158}{0}{\@print{B.12}\quad{}Line and Page Breaking{}} \@@addtocsec{htoc}{sec159}{1}{\@print{B.12.1}\quad{}Line Breaking{}} \@@addtocsec{htoc}{sec160}{1}{\@print{B.12.2}\quad{}Page Breaking{}} \@@addtocsec{htoc}{sec161}{0}{\@print{B.13}\quad{}Lengths, Spaces and Boxes{}} \@@addtocsec{htoc}{sec162}{1}{\@print{B.13.1}\quad{}Length{}} \@@addtocsec{htoc}{sec163}{1}{\@print{B.13.2}\quad{}Space{}} \@@addtocsec{htoc}{sec164}{1}{\@print{B.13.3}\quad{}Boxes{}} \@@addtocsec{htoc}{sec165}{0}{\@print{B.14}\quad{}Pictures and Colours{}} \@@addtocsec{htoc}{sec166}{1}{\@print{B.14.1}\quad{}The \texttt{picture} environment and the \texttt{graphics} Package{}} \newlabel{graphics}{{B.14.1}{X}} \@@addtocsec{htoc}{sec167}{1}{\@print{B.14.2}\quad{}The \texttt{color} Package{}} \newlabel{color}{{B.14.2}{X}} \newlabel{color:package}{{B.14.2}{X}} \newlabel{bgcolor}{{B.14.2.1}{X}} \newlabel{getcolor}{{B.14.2.2}{X}} \citation{css} \@@addtocsec{htoc}{sec170}{0}{\@print{B.15}\quad{}Font Selection{}} \@@addtocsec{htoc}{sec171}{1}{\@print{B.15.1}\quad{}Changing the Type Style{}} \newlabel{type-style}{{B.15.1}{X}} \@@addtocsec{htoc}{sec172}{1}{\@print{B.15.2}\quad{}Changing the Type Size{}} \@@addtocsec{htoc}{sec173}{1}{\@print{B.15.3}\quad{}Special Symbols{}} \@@addtocsec{htoc}{sec174}{0}{\@print{B.16}\quad{}Extra Features{}} \citation{latex} \@@addtocsec{htoc}{sec175}{1}{\@print{B.16.1}\quad{}\TeX{} macros{}} \newlabel{texmacro}{{B.16.1}{X}} \newlabel{texmacros}{{B.16.1.1}{X}} \newlabel{texcond}{{B.16.1.4}{X}} \@@addtocsec{htoc}{sec181}{1}{\@print{B.16.2}\quad{}Command Definition inside Command Definition{}} \@@addtocsec{htoc}{sec182}{1}{\@print{B.16.3}\quad{}Date and time{}} \@@addtocsec{htoc}{fancysection}{1}{\@print{B.16.4}\quad{}Fancy \label{fancysection}sectioning commands{}} \new@anchor@label{sec183}{fancysection}{{B.16.4}{X}} \@@addtocsec{htoc}{winfonts}{1}{\@print{B.16.5}\quad{}Targeting \label{winfonts}Windows{}} \new@anchor@label{sec184}{winfonts}{{B.16.5}{X}} \@@addtocsec{htoc}{mathjax}{1}{\@print{B.16.6}\quad{}\textsf{MathJax} \label{mathjax}support{}} \new@anchor@label{sec185}{mathjax}{{B.16.6}{X}} \@@addtocsec{htoc}{sec189}{0}{\@print{B.17}\quad{}Implemented Packages{}} \newlabel{implemented:package}{{B.17}{X}} \citation{latexbis} \@@addtocsec{htoc}{sec190}{1}{\@print{B.17.1}\quad{}AMS compatibility{}} \citation{latexbis} \citation{latexbis} \citation{latexbis} \@@addtocsec{htoc}{sec191}{1}{\@print{B.17.2}\quad{}The \texttt{array} and \texttt{tabularx} packages{}} \newlabel{arraypack}{{B.17.2}{X}} \citation{latexbis} \newlabel{arraytable}{{1}{X}} \citation{latexbis} \@@addtocsec{htoc}{calc}{1}{\@print{B.17.3}\quad{}The \texttt{calc}\label{calc} package{}} \new@anchor@label{sec192}{calc}{{B.17.3}{X}} \citation{latexbis} \@@addtocsec{htoc}{inputenc}{1}{\@print{B.17.4}\quad{}Specifying \label{inputenc}the document input encoding, the \texttt{inputenc} package{}} \new@anchor@label{sec193}{inputenc}{{B.17.4}{X}} \@@addtocsec{htoc}{sec194}{1}{\@print{B.17.5}\quad{}The \texttt{hyphenat} package{}} \@@addtocsec{htoc}{sec195}{1}{\@print{B.17.6}\quad{}More symbols{}} \@@addtocsec{htoc}{commentpack}{1}{\@print{B.17.7}\quad{}The \texttt{comment}\label{commentpack} package{}} \new@anchor@label{sec196}{commentpack}{{B.17.7}{X}} \@@addtocsec{htoc}{multind}{1}{\@print{B.17.8}\quad{}Multiple Indexes with the \texttt{index} and \texttt{multind}\label{multind} packages{}} \new@anchor@label{sec197}{multind}{{B.17.8}{X}} \@@addtocsec{htoc}{sec198}{1}{\@print{B.17.9}\quad{}``Natural'' bibliographies, the \texttt{natbib} package {}} \@@addtocsec{htoc}{sec199}{1}{\@print{B.17.10}\quad{}Multiple bibliographies{}} \@@addtocsec{htoc}{sec202}{1}{\@print{B.17.11}\quad{}Support for \texttt{babel}{}} \new@anchor@label{sec203}{sec:babel-basics}{{B.17.11.1}{X}} \newlabel{it:macro-foreignlanguage}{{3}{X}} \newlabel{it:environment-other-language}{{4}{X}} \newlabel{it:environment-other-language-star}{{5}{X}} \@@addtocsec{htoc}{urlpackage}{1}{\@print{B.17.12}\quad{}The \label{urlpackage}\texttt{url} package{}} \new@anchor@label{sec206}{urlpackage}{{B.17.12}{X}} \@@addtocsec{htoc}{sec207}{1}{\@print{B.17.13}\quad{}Verbatim text: the \texttt{moreverb} and \texttt{verbatim} packages{}} \@@addtocsec{htoc}{listings:package}{1}{\@print{B.17.14}\quad{}Typesetting \label{listings:package}computer languages: the \texttt{listings} package{}} \new@anchor@label{sec208}{listings:package}{{B.17.14}{X}} \@@addtocsec{htoc}{sec209}{1}{\@print{B.17.15}\quad{}(Non-)Multi page tabular material{}} \citation{latexbis} \@@addtocsec{htoc}{mathpartir:package}{1}{\@print{B.17.16}\quad{}Typesetting inference rules: the \label{mathpartir:package} \aname{mathpartir}{\texttt{mathpartir}} package{}} \new@anchor@label{sec210}{mathpartir:package}{{B.17.16}{X}} \@@addtocsec{htoc}{sec215}{1}{\@print{B.17.17}\quad{}The \texttt{ifpdf} package{}} \@@addtocsec{htoc}{sec216}{1}{\@print{B.17.18}\quad{}Typesetting Thai{}} \@@addtocsec{htoc}{sec217}{1}{\@print{B.17.19}\quad{}Hanging paragraphs{}} \@@addtocsec{htoc}{sec218}{1}{\@print{B.17.20}\quad{}The \texttt{cleveref} package{}} \@@addtocsec{htoc}{sec219}{1}{\@print{B.17.21}\quad{}Other packages{}} \@@addtocsec{htoc}{practical}{-1}{\@print{Part C}\quad{}\label{practical}Practical information{}} \new@anchor@label{sec220}{practical}{{C}{X}} \@@addtocsec{htoc}{sec221}{0}{\@print{C.1}\quad{}Usage{}} \@@addtocsec{htoc}{sec222}{1}{\@print{C.1.1}\quad{}\hevea{} usage{}} \newlabel{heveausage}{{C.1.1}{X}} \newlabel{comline}{{C.1.1.1}{X}} \newlabel{search:path}{{C.1.1.1}{X}} \newlabel{basenames}{{C.1.1.2}{X}} \new@anchor@label{sec226}{heveaoptions}{{C.1.1.4}{X}} \@@addtocsec{htoc}{sec227}{1}{\@print{C.1.2}\quad{}\hacha{} usage{}} \@@addtocsec{htoc}{sec228}{1}{\@print{C.1.3}\quad{}\texttt{esponja} usage{}} \newlabel{esponjausage}{{C.1.3}{X}} \newlabel{esponjaoptions}{{C.1.3.2}{X}} \@@addtocsec{htoc}{bibhva}{1}{\@print{C.1.4}\quad{}\texttt{bibhva}\label{bibhva} usage{}} \new@anchor@label{sec231}{bibhva}{{C.1.4}{X}} \@@addtocsec{htoc}{sec232}{1}{\@print{C.1.5}\quad{}\texttt{imagen} usage{}} \newlabel{imagenusage}{{C.1.5}{X}} \@@addtocsec{htoc}{sec233}{1}{\@print{C.1.6}\quad{}Invoking \texttt{hevea}, \texttt{hacha} and \texttt{imagen}{}} \@@addtocsec{htoc}{makefile}{1}{\@print{C.1.7}\quad{}Using \label{makefile}\texttt{make}{}} \new@anchor@label{sec234}{makefile}{{C.1.7}{X}} \@@addtocsec{htoc}{browser}{0}{\@print{C.2}\quad{}Browser \label{browser}configuration{}} \new@anchor@label{sec235}{browser}{{C.2}{X}} \@@addtocsec{htoc}{sec236}{0}{\@print{C.3}\quad{}Availability{}} \@@addtocsec{htoc}{sec237}{1}{\@print{C.3.1}\quad{}Internet stuff{}} \@@addtocsec{htoc}{sec238}{1}{\@print{C.3.2}\quad{}Law{}} \@@addtocsec{htoc}{sec239}{0}{\@print{C.4}\quad{}Installation{}} \@@addtocsec{htoc}{sec240}{1}{\@print{C.4.1}\quad{}Requirements{}} \newlabel{requirements}{{C.4.1}{X}} \newlabel{imagen:needs}{{C.4.1}{X}} \@@addtocsec{htoc}{sec241}{1}{\@print{C.4.2}\quad{}Principles{}} \newlabel{installsty}{{C.4.2}{X}} \@@addtocsec{htoc}{sec242}{0}{\@print{C.5}\quad{}Other \LaTeX{} to \html{} translators{}} \citation{htmlgen} \@@addtocsec{htoc}{sec243}{0}{\@print{C.6}\quad{}Acknowledgements{}} \@addcontentsline{htoc}{0}{\ahrefloc{@biblio}{\refname}} \bibcite{latexbis}{\LaTeX-bis} \bibcite{latex}{\LaTeX} \bibcite{htmlgen}{htmlgen} \bibcite{html4}{HTML-4.0} \bibcite{html}{HTML-5a} \bibcite{htmlb}{HTML-5b} \bibcite{css}{CSS-2} \newlabel{section@the@hevea@index@default}{{C.6}{X}} \@addcontentsline{htoc}{0}{\ahrefloc{@index}{Index}} hevea-2.36-manual/manual016.html0000644004317100512160000000170314252364056016437 0ustar marangetcristal Another cut subsubsection Previous Up

7.3.13 Another cut subsubsection

Another note in a subsubsection at document level.8


Previous Up hevea-2.36-manual/manual011.png0000644004317100512160000001541614252364056016260 0ustar marangetcristalPNG  IHDR$TbKGD̿ pHYsaa?itIME 2p)IDATx]Hrp#K/u ȣ!_Δ3}'+`pRFP %FR^l 3#dn' Sd222#2I]60ʜ;~ 0ݤ3]4ޝX)oi{4QxP2!j}r9@ +kwޮOk%<)/:Wɴ7eE4TA HnC>.acZ1: ,4ΫVM( _INM[$2'4F$V"tpO[1opLD(HOcLF`ۄ N))"],11 1N댖n1[LZ4v5f&23 &t00P1j2 }KZb۾Ov;@Jk`;әޫӎ,LoeڊX`X04aOB[moM0qoK&wدSI_mH9Dya?2 eduY &X!BSHH)@] t:b'>Zܛ"zQ`WEhy'6^M^{ovHuyas=2Hp"koIKu@~YOeo4&͜;dT:9vΧrmޛk(wj'WRnЬ}7#s4M MS`nK)2R Ƥ{D7'kO9gtl1Y&ʊV_f,T0"(!wpH5ț|gGsB%̽-8y$Bv/&tc`0yI\  uA6 2KD})-Xkv[B'&AڤTecRz636\`DE387hM׊Aʓsg>_@f جK&'j&o,WĒ/42Zgw뽞V2 ϟX,kdgmP:(;GkS[6w'H h =j(tW,C|,k IBV]!1M3ADlF[¥粊k/.&.XKϔ9vphvrA@I,[#ul_["PxeA(|g|` \q|đ.ϸ7fZ[rT`dwŏ9>oB2f|<&Ye\ߖg`i*1\#qL"bY@ ;h#]5X'׌~-lm3M֑CcR>Jذ)gj%.԰55*W|UI\V)qEy#Lq(mh\MA6wQAPXHzRjXՄl_g] P=+9u{86ٷe| ~c׬9s U܀Nq;Z1] Z'V0 .vJvq-DO>ჰ 2ngpM2iVS1|#;mfqg6DLԬ(xUR[1ײu28cDΠ͆`BFD{4bXN_&(mЎOj2WRxuv(uu;"lB#}L_M B,ݚʵ ؿfwgPgd́>֕ t֥m Y M$q0dSE={xBUvMs<j6hQEA>hLEe ˈ~rEml_ Y8B4RQ.ed/(5Ej mbPI5YӴ]qG=LrRb*C^(놘IqzOigim_m[F=,"Yb.R׺!YCZ$gvbPQRNw^PTr%`%w.>*NR T6Szj?Xi[ڣ3=6VW5 a :*w"y1tͪVb=oɡTl";_[l( G&"@V).w>9z[p>r%üã=5HUν{r.Wod:.Lϵئ9sqL{U"Jg"Y =jDWn{oqTwCY>Y8R쑊xYg _'|Zڌ-j.a'*󗢽`!hۑ{JfGfD%[ƙ:HaZNe(Yzley߰Q-Dy\2s#[Z4tdi+NÈlwKW#\W .d) iVyb]ڽ<72scd30ZH e_%Xhrw^2 3]y 3Cy;mn}˔@H/MQC\$GlQf‰zG/]Xl#GİMc1My؎{y Q|Fg#~nz:ɞW"8𙓹3Xw^]όmع5U+9Ǖ9Oq/jc|.q1ۀ8&j jlnUSɆyjOSlK?Ů'c +{q.3cV3sR{mk^UщݎNi~ o<>c]s/<_sV/dK4C o2GaoۿE _Ɨe$ҫKƗ )>|oϯgϝ/TY*~Y6S^AFM;hsQ:2 lU^'Tn@ v5R[E2M x^ˇ"2y/}:RdȘ]a3mx.Q1zI4B#]`L.u%tu^Cڐz_ņ{ڼ}NG61SBvͩѫ\z&i:U܌,_*Q6rM|==SKL\ ?X!u|gIzGsB_Y%TG,KHʢj{TKHh==7B"U%ݵPwEƸ^ho`4BcxW,j>GCo<33wѰCmڰCݳ7/#UC|3]1OB *y,%D.-jR l {=NP7jTUyzL WfOQ1{m(YᄓUHNƮuQδxt}1ǔA Gǎu"Ԫ;Sdű8j+'s%h OVBs2qafky4l% ,h]ПQ"7fpᬬ\ KμD_#02ShRnkw1ၬ7O+a:"htJLLcSUDQ;fun|D rqv8њEIRsBh^(nZGGhk͊jU,J  %cGܻ:k~iTy/@/ ;,D`~Z!Hة3O Vtdw >3H2ytY&k'U{r.ʳFIzw%͗,Ocr3{ʟ&d5'YW[4GkG||Ig)Om"3"0fN Uc2_kt]ʸ55ޮkVϡƇ*V&kѩ<;b(u8 ˝!gq\$5&:1`Dзs%K 32S+ՙJ.(2:[Y:#{_>|xXw8/K,mGLYcAgh(Bt(w<s pvU| Y]^qMd\}3444sF (jIw8mTͳ/]sEP(u}-3ٶ1hJ9]'޿pNvN jbI;<`8gӕ* xK1gMyΊNl*kgh hUPg.u e]3 6G7UNYuw|UЋ/qdgWޟe9r\EopvrNZVM k((uuʨMz׌WF'9ڬ]/ʃ>%+,{5ʫ 3c)y^UAը3p՗:do?ZfbGv$e {,_. !Ӭ|6_O"J܉g+h\3+Vd/~pZūj2Su_ :ׯqc=e\<2_cı2տ i.+%tEXtdate:create2022-06-15T16:09:50+02:00aa%tEXtdate:modify2022-06-15T16:09:50+02:00-tEXticc:copyrightCopyright Artifex Software 2011Ŵ1tEXticc:descriptionArtifex Software sRGB ICC Profile 2tEXticc:manufacturerArtifex Software sRGB ICC Profile\~=+tEXticc:modelArtifex Software sRGB ICC Profile1(tEXtSoftwareGPL Ghostscript 9.26XnIENDB`hevea-2.36-manual/manual013.html0000644004317100512160000000164314252364056016437 0ustar marangetcristal A cut subsubsection Up Next

7.3.10 A cut subsubsection

A note in a subsubsection, flushed at sections.5


Up Next hevea-2.36-manual/manual001.html0000644004317100512160000004637114252364056016443 0ustar marangetcristal Contents Up

Contents


Up hevea-2.36-manual/next_motif.svg0000644004317100512160000000027614252364057016747 0ustar marangetcristal hevea-2.36-manual/manual008.png0000644004317100512160000000667114252364056016271 0ustar marangetcristalPNG  IHDR*d] &iCCPiccHgPY<@BPC*%Z(ҫ@PEl+4EE\"kE t,ʺqQAYp?{ossp e{bRɎ(tջ{i常r)teJOYLgWX\2XyKο,]~ )sT8بlOrTzV $G&D~SGfDnr&AltL:5204_gK!FgE_zs zt@WOm|:3z @(U t08|A $`(E`8@-hM<.L@ށA2@F 7 Bh( ʀrPT UAuP t݄84 }aXև0v}p4 ^O6< "@]p$BV)GVC!Bd h(&JerFTVT1 uՁECDh2Z@Ёht]nDѓw aa0Θ Lf3sӆL`X VkaӱJI%vG)p`\.Wk] p xq:o—;IA"X| q B+aH$͉^XvbqD%iRi/82! L ے&US{1O,BlXXؐ+ NP6Pr(3;Yq8WJ)Hq"HJ IKIJGJJIKa8y"Ֆ͒="{MvV.g)Ǘ+;-Hז,L_~NAQI!ER¬"CV1NLMZ)VL $L`V0{"eyeg :JJU*[5JLGU殖֢HVQ?ާ>حѩ1͒fX9֘&YF3U^FuX6m]}G1Չ93 |UҪU$]nnCM/OS~~>&   .y݆i񍪍&v\mu:ƑGLMv|253Θ՘lOv19|y-Եl^Zä́UUКij}ZhlfSoV6¶vʼn伲3صs-[{'BCSGhGfhgWΣ<lqu%V>svu.֪MZ26,b&*4r**4j:*@LMLyl,7*us\m|GD\bh$jR|Robrv`NJA0"`H*hL֧uӗ? ͌]֙ՙdKd'eo޴gTcOQ{rswol m ڳMu[NO [A^i۝;OrR V (m? Yrˆ[EEE[?Xި%%Ga%oDDiNe̲²7Yn\^{p(㐰­Rr_bULp]u[|͞iU-x4:zccǞ77Q'z̚KZ!'lsWnk]8q/v=s}ٚvZ{aԱC) _}ABEKr.]N<{%DƞWzuW8}nX8[[Mowf[@;]wv8d3tyoy02*|`a׏2-<>+|"ߵ~o /ۏ?yx??'󟓟O)M5MMqb݋ɗ)/f 櫳/ M^̛oy=}na>|ZZ.V|R?B,sMT cHRMz&u0`:pQ<BPLTE# # # # # # # # # # # # # # # # # # # # 3tRNS!v?\dѤbKGD pHYsaa?itIME 2p IDAThX $Z;[OjDKC:X,3;@PP2.5抸ss f4=4 &@΄`0ϨQ[$_TwwE=QI୒u2gQI`:ϛ)hha+PmlS)f;l&E_3e \1(} {MzBжي̳]^cS6-8[U'}Y9_=itk\b [G3[EI KK3*[B3Ձ=CE*U hsAC?1hyߤ*Y,Jb9n(Ttm1g2I[9Ag֍@܇1.J."@u*Nթ稒 qN)*AD7Ya2Ɣ&'rHєX&&>V k]6,"?mB֗./겪*z*ij/[c=&۾:$ʪjU``~4oMǨ%tEXtdate:create2022-06-15T16:09:50+02:00aa%tEXtdate:modify2022-06-15T16:09:50+02:00-tEXticc:copyrightCopyright Artifex Software 2011Ŵ1tEXticc:descriptionArtifex Software sRGB ICC Profile 2tEXticc:manufacturerArtifex Software sRGB ICC Profile\~=+tEXticc:modelArtifex Software sRGB ICC Profile1(tEXtSoftwareGPL Ghostscript 9.26XnIENDB`hevea-2.36-manual/manual006.png0000644004317100512160000001541614252364055016263 0ustar marangetcristalPNG  IHDR$TbKGD̿ pHYsaa?itIME 1GЯ)IDATx]Hrp#K/u ȣ!_Δ3}'+`pRFP %FR^l 3#dn' Sd222#2I]60ʜ;~ 0ݤ3]4ޝX)oi{4QxP2!j}r9@ +kwޮOk%<)/:Wɴ7eE4TA HnC>.acZ1: ,4ΫVM( _INM[$2'4F$V"tpO[1opLD(HOcLF`ۄ N))"],11 1N댖n1[LZ4v5f&23 &t00P1j2 }KZb۾Ov;@Jk`;әޫӎ,LoeڊX`X04aOB[moM0qoK&wدSI_mH9Dya?2 eduY &X!BSHH)@] t:b'>Zܛ"zQ`WEhy'6^M^{ovHuyas=2Hp"koIKu@~YOeo4&͜;dT:9vΧrmޛk(wj'WRnЬ}7#s4M MS`nK)2R Ƥ{D7'kO9gtl1Y&ʊV_f,T0"(!wpH5ț|gGsB%̽-8y$Bv/&tc`0yI\  uA6 2KD})-Xkv[B'&AڤTecRz636\`DE387hM׊Aʓsg>_@f جK&'j&o,WĒ/42Zgw뽞V2 ϟX,kdgmP:(;GkS[6w'H h =j(tW,C|,k IBV]!1M3ADlF[¥粊k/.&.XKϔ9vphvrA@I,[#ul_["PxeA(|g|` \q|đ.ϸ7fZ[rT`dwŏ9>oB2f|<&Ye\ߖg`i*1\#qL"bY@ ;h#]5X'׌~-lm3M֑CcR>Jذ)gj%.԰55*W|UI\V)qEy#Lq(mh\MA6wQAPXHzRjXՄl_g] P=+9u{86ٷe| ~c׬9s U܀Nq;Z1] Z'V0 .vJvq-DO>ჰ 2ngpM2iVS1|#;mfqg6DLԬ(xUR[1ײu28cDΠ͆`BFD{4bXN_&(mЎOj2WRxuv(uu;"lB#}L_M B,ݚʵ ؿfwgPgd́>֕ t֥m Y M$q0dSE={xBUvMs<j6hQEA>hLEe ˈ~rEml_ Y8B4RQ.ed/(5Ej mbPI5YӴ]qG=LrRb*C^(놘IqzOigim_m[F=,"Yb.R׺!YCZ$gvbPQRNw^PTr%`%w.>*NR T6Szj?Xi[ڣ3=6VW5 a :*w"y1tͪVb=oɡTl";_[l( G&"@V).w>9z[p>r%üã=5HUν{r.Wod:.Lϵئ9sqL{U"Jg"Y =jDWn{oqTwCY>Y8R쑊xYg _'|Zڌ-j.a'*󗢽`!hۑ{JfGfD%[ƙ:HaZNe(Yzley߰Q-Dy\2s#[Z4tdi+NÈlwKW#\W .d) iVyb]ڽ<72scd30ZH e_%Xhrw^2 3]y 3Cy;mn}˔@H/MQC\$GlQf‰zG/]Xl#GİMc1My؎{y Q|Fg#~nz:ɞW"8𙓹3Xw^]όmع5U+9Ǖ9Oq/jc|.q1ۀ8&j jlnUSɆyjOSlK?Ů'c +{q.3cV3sR{mk^UщݎNi~ o<>c]s/<_sV/dK4C o2GaoۿE _Ɨe$ҫKƗ )>|oϯgϝ/TY*~Y6S^AFM;hsQ:2 lU^'Tn@ v5R[E2M x^ˇ"2y/}:RdȘ]a3mx.Q1zI4B#]`L.u%tu^Cڐz_ņ{ڼ}NG61SBvͩѫ\z&i:U܌,_*Q6rM|==SKL\ ?X!u|gIzGsB_Y%TG,KHʢj{TKHh==7B"U%ݵPwEƸ^ho`4BcxW,j>GCo<33wѰCmڰCݳ7/#UC|3]1OB *y,%D.-jR l {=NP7jTUyzL WfOQ1{m(YᄓUHNƮuQδxt}1ǔA Gǎu"Ԫ;Sdű8j+'s%h OVBs2qafky4l% ,h]ПQ"7fpᬬ\ KμD_#02ShRnkw1ၬ7O+a:"htJLLcSUDQ;fun|D rqv8њEIRsBh^(nZGGhk͊jU,J  %cGܻ:k~iTy/@/ ;,D`~Z!Hة3O Vtdw >3H2ytY&k'U{r.ʳFIzw%͗,Ocr3{ʟ&d5'YW[4GkG||Ig)Om"3"0fN Uc2_kt]ʸ55ޮkVϡƇ*V&kѩ<;b(u8 ˝!gq\$5&:1`Dзs%K 32S+ՙJ.(2:[Y:#{_>|xXw8/K,mGLYcAgh(Bt(w<s pvU| Y]^qMd\}3444sF (jIw8mTͳ/]sEP(u}-3ٶ1hJ9]'޿pNvN jbI;<`8gӕ* xK1gMyΊNl*kgh hUPg.u e]3 6G7UNYuw|UЋ/qdgWޟe9r\EopvrNZVM k((uuʨMz׌WF'9ڬ]/ʃ>%+,{5ʫ 3c)y^UAը3p՗:do?ZfbGv$e {,_. !Ӭ|6_O"J܉g+h\3+Vd/~pZūj2Su_ :ׯqc=e\<2_cı2տ i.+%tEXtdate:create2022-06-15T16:09:49+02:008$%tEXtdate:modify2022-06-15T16:09:49+02:00IK-tEXticc:copyrightCopyright Artifex Software 2011Ŵ1tEXticc:descriptionArtifex Software sRGB ICC Profile 2tEXticc:manufacturerArtifex Software sRGB ICC Profile\~=+tEXticc:modelArtifex Software sRGB ICC Profile1(tEXtSoftwareGPL Ghostscript 9.26XnIENDB`hevea-2.36-manual/manual028.html0000644004317100512160000001476214252364056016453 0ustar marangetcristal Displayed Paragraphs Previous Up Next

B.6 Displayed Paragraphs

Displayed-paragraph environments translate to block-level elements.

In addition to the environments described in this section, HEVEA implements the center, flushleft and flushright environments. HEVEA also implements the corespondant TEX style declaration \centering \raggedright and \raggedleft, but these declarations may not work as expected, when they do not appear directly inside a displayed-paragraph environment or inside an array element.

B.6.1 Quotation and Verse

The quote and quotation environments are similar; they translate to BLOCKQUOTE elements with associated classes quote and quotation, respectively.

The verse environment is supported as BLOCKQUOTE element with class verse.

B.6.2 List-Making environments

The itemize, enumerate and description environments translate to the ul, ol, and DL elements and this is the whole story.

As a consequence, no control is allowed on the appearances of these environments. More precisely optional arguments to \item do not function properly inside itemize and enumerate. Moreover, item labels inside itemize or numbering style inside enumerate are browser dependent.

However, customized lists can be produced by using the the list environment (see next section).

B.6.3 The list and trivlist environments

The list environment translates to the DL element. Arguments to \begin{list} are handled as follows:

\begin{list}{default_label}{decls}

The first argument default_label is the label generated by an \item command with no argument. The second argument, decls is a sequence of declarations. In practice, the following declarations are relevant:

\usecounter{counter}
The counter counter is incremented by \refstepcounter by every \item command with no argument, before it does anything else.
\renewcommand{\makelabel}[1]{}
The command \item executes \makelabel{label}, where label is the item label, to print its label. Thus, users can change label formatting by redefining \makelabel. The default definition of \makelabel simply echoes label.

As an example, a list with an user-defined counter can be defined as follows:

\newcounter{coucou}
\begin{list}{\thecoucou}{%
\usecounter{coucou}%
\renewcommand{\makelabel}[1]{\textbf{#1}.}}
...
\end{list}

This yields:

1.
First item.
2.
Second item.

The trivlist environment is also supported. It is equivalent to the description environment.

B.6.4 Verbatim

The verbatim and verbatim* environments translate to the PRE elements. Inside verbatim*, spaces are replaced by visual spaces (“”). Similarly, \verb and \verb* translate to CODE text elements. The environments are associated with CSS classes of the same names, this is, verbatim and \verb, respectively.

The alltt environment is supported.


Previous Up Next hevea-2.36-manual/manual.html0000644004317100512160000204173414252364056016222 0ustar marangetcristal HEVEA User Documentation Version 2.36

HEVEA User Documentation
Version 2.36

Luc Maranget*

June 15, 2022


This manual also exists in compressed Postscript, PDF, and as a bundle of HTML files.


Abstract: HEVEA is a LATEX to html translator. The input language is a fairly complete subset of LATEX 2є (old LATEX style is also accepted) and the output language is html that is (hopefully) correct with respect to version 5 [HTML-5a, HTML-5b]

HEVEA understands LATEX macro definitions. Simple user style files are understood with little or no modifications. Furthermore, HEVEA customisation is done by writing LATEX code.

HEVEA is written in Objective Caml, as many lexers. It is quite fast and flexible. Using HEVEA it is possible to translate large documents such as manuals, books, etc. very quickly. All documents are translated as one single html file. Then, the output file can be cut into smaller files, using the companion program HACHA.

HEVEA can also be instructed to output plain text or info files.

Information on HEVEA is available at http://hevea.inria.fr/.

Contents

This document consists in three parts, a tutorial introduction, a reference manual and some practical information. The latter part includes a small index.

Part A
Tutorial

1 How to get started

Assume that you have a file, a.tex, written in LATEX, using the article, book or report style. Then, translation is achieved by issuing the command:

# hevea a.tex

Probably, you will get some warnings. If HEVEA does not crash, just ignore them for the moment (Section 4 explains how to correct errors).

If everything goes fine, this will produce a new file, a.html, which you can visualise through a html browser.

If you wish to experiment HEVEA on small LATEX source fragments, then launch HEVEA without arguments. HEVEA will read its standard input and print the translation on its standard output. For instance:

# hevea
$x \in \mathcal{E}$
^D
<span style="font-style:italic">x</span> &#X2208; <span style="color:red"><span style="font-style:italic">E</span></span>

Incidentally, notice that the symbol “∈” translates to the appropriate numerical character reference and that the calligraphic letter “E” renders as a red “E”. You can find some more elaborate examples in the on-line documentation.

2 Style files

LATEX style files are files that are not intended to produce output, but define document layout parameters, commands, environments, etc.

2.1 Standard base styles

The base style of a LATEX document is the argument to the \documentclass command (\documentstyle in old style). Normally, the base style of a document defines the structure and appearance of the whole document.

HEVEA really knows about two LATEX base styles, article and book. Additionally, the report base style is recognized and considered equivalent to book and the seminar base style for making slides is recognized and implemented by small additions on the article style.

Base style style is implemented by an HEVEA specific style file style.hva. More precisely, HEVEA interprets \documentclass{style} by attempting to load the file style.hva (see section C.1.1.1 on where HEVEA searches for files). Thus, at the moment, HEVEA distribution includes the files, article.hva, book.hva, etc.

2.2 Other base styles

Documents whose base style is not recognized by HEVEA can be processed when the unknown base style is a derivation of a recognized base style.

Let us assume that doc.tex uses an exotic base style such as acmconf. Then, typing hevea doc.tex will yield an error, since HEVEA cannot find the acmconf.hva file:

# hevea.opt doc.tex
doc.tex:1: Warning: Cannot find file: acmconf.hva
doc.tex:1: Error while reading LaTeX: No base style
Adios

This situation is avoided by invoking HEVEA with the known base style file article.hva as an extra argument:

# hevea article.hva doc.tex

The extra argument instructs HEVEA to load its article.hva style file before processing doc.tex. It will then ignore the document base style specified by \documentclass (or \documentstyle).

Observe that the fix above works because the acmconf and article base styles look the same to the document (i.e. they define the same macros). More generally, most base styles that are neither article nor book are in fact variations on either two of them. However, such styles usually provides extra macros. If users documents use these macros, then users should also instruct HEVEA about them (see section 4.1).

Finally, it is important to notice that renaming a base style file style.cls into style.hva will not work in general. As a matter of fact, base style files are TEX and not LATEX source and HEVEA will almost surely fail on TEX-ish input.

2.3 Other style files

A LATEX document usually loads additional style files, by using the commands \input or \usepackage or \input.

2.3.1 Files loaded with \input

Just like LATEX, HEVEA reacts to the construct \input{file} by loading the file file. (if I got it right, HEVEA even follows TEX’s crazy conventions on .tex extensions).

As it is often the case, assume that the document doc.tex has a \input{mymacros.tex} instruction in its preamble, where mymacros.tex gathers custom definitions. Hopefully, only a few macros give rise to trouble: macros that performs fine typesetting or TEXish macros. Such macros need to be rewritten, using basic LATEX constructs (section 4 gives examples of macro-rewriting). The new definitions are best collected in a style file, mymacros.hva for instance. Then, doc.tex is to be translated by issuing the command:

# hevea mymacros.hva doc.tex

The file mymacros.hva is processed before doc.tex (and thus before mymacros.tex). As a consequence of HEVEA behaviour with respect to definition and redefinition (see section B.8.1), the macro definitions in mymacros.hva take precedence over the ones in mymacros.tex, provided the document original definitions (the ones in mymacros.tex) are performed by \newcommand (or \newenvironment).

Another situation is when HEVEA fails to process a whole style file. Usually, this means that HEVEA crashes on that style file. The basic idea is then to write a mymacros.hva style file that contains alternative definitions for all the commands defined in mymacros.sty. Then, HEVEA should be instructed to load mymacros.hva and not to load mymacros.tex. This is done by invoking hevea as follows:

# hevea mymacros.hva -e mymacros.tex doc.tex

Of course, mymacros.hva must now contain replacements for all the useful macros of mymacro.tex.

2.3.2 Files loaded with \usepackage

As far as I know, LATEX reacts to the construct \usepackage{name} by loading the file name.sty. HEVEA reacts in a similar, but different, manner, by loading the file name.hva.

HEVEA distributions already includes quite a few .hva implementations of famous packages (see section B.17). When a given package (say zorglub) is not implemented, the situation may not be as bad as it may seem first. Hopefully, you are only using a few commands from package zorglub, and you feel confident enough to implement them yourself. Then, it suffices to put your definitions in file zorglub.hva and HEVEA will react to \usepackage{zorglub} by loading zorglub.hva.

See section B.5.2 for the full story on \usepackage.

3 A note on style

3.1 Spacing, Paragraphs

Sequence of spaces normally are translated into one single space. Newlines in the input document undergo a special treatement. A newline triggers a special scanning mode that reads all following spaces and newlines. In case at least one additional newline character is read, then HEVEA executes the \par command. Otherwise, HEVEA outputs a single newline character. This process approximates TEX process for introducting paragraph breaks and, as a result, empty lines produce paragraph breaks.

Space after commands with no argument is skipped (as in LATEX) — however this is not true in math mode, as explained in section 3.2.1.

The following two subsections describe management of paragraphs and spaces after command sequences in greater detail. They can be skipped in first reading.

3.1.1 Spurious Paragraphs

Paragraphs are rendered by the means of p elements. HEVEA is a bit simplistic in breaking paragraphs and spurious paragraphs may be present in the final html document. Normally, as HEVEA never outputs p elements whose contents is made of spaces only, this should not happen very often. Unfortunately, some commands do not produce any output in LATEX, while they do produce output in HEVEA: those commands are \label, \index etc. HEVEA translates \label{name} into the anchor <a id="name"></a>. As a result, the following source fragment will introduce a spurious paragraph.

This a first paragraph.

\label{label}

This is another paragraph.

Indeed, whe have the following translation:

<p>This a first paragraph.</p>
<p><a id="label"></a></p>
<p>This is another paragraph.</p>

Which your browser renders as follows — with additional borders emphasizing p elements.

This a first paragraph.

This is another paragraph.

Most of the time, such extra paragraphs remain unnoticed. Of course, they can be supressed by erasing one of the empty lines. For instance:

This a first paragraph.

\label{label}
This is another paragraph.

A similar situation occurs when a sectioning command is followed by \label and a paragraph break:

\section*{A section}\label{section:label}

First paragraph. 

Produced html is, after a few cosmetic simplifications:

<h2 class="section">A section</h2>
<p><a id="section:label"></a></p>
<p>First paragraph.</p>

Output is so, because closing the element h2 implies re-opening a new paragraph. Your browser renders the above html fragment as follows:

A section

First paragraph.

Here, two possible re-writing of source are:

\section*{A\label{section:label} section}

First paragraph.
\section*{A section}

\label{section:label}First paragraph.

In all cases, this amounts to avoiding a paragraph whose contents consists in a sole \label command.

Spurious paragraphs are more easily seen by running hevea with the command-line option -dv, which instructs hevea to add border on some of the elements it produces, including p elements.

3.1.2 Spaces after Commands

Space after commands with no argument is skipped. Consider the following example:

\newcommand{\open}{(}
\newcommand{\close}{)}
\open text opened by ``\verb+\open+''
and closed by ``\verb+\close+''\close.

We get:

(text opened by “\open” and closed by “\close”).

In the output above, the space after \open does not find its way to the output.

More generally, HEVEA tries to emulate LATEX behaviour in all situations, but discrepancies probably exist. Thus, users are invited to make explicit what they want. This is good practice anyway, because LATEX is mysterious here. Consider the following example, where the \tryspace macro is first applied and then expansed by hand:

\newcommand{\bfsymbol}{\textbf{symbol}}
\newcommand{\tryspace}[1]{#1 XXX}

Some space: \tryspace{\bfsymbol}\\
No space: \bfsymbol XXX

Spacing is a bit chaotic here, the space after symbol remains when #1 is substituted for it by LATEX (or HEVEA).

Some space : symbol XXX
No space : symbolXXX

Note that, if a space before “XXX” is wanted, then one should probably write:

\newcommand{\tryspace}[1]{#1{} XXX}

Finally, whether the tabulation character is a space or not is random, so avoid tabs in your source document.

3.2 Math mode

HEVEA math mode is not very far from normal text mode, except that all letters are shown in italics and that space after macros is echoed.

However, typesetting math formulas in html rises two difficulties. First, formulas contain symbols, such as Greek letters; second, even simple formulas do not follow the simple basic typesetting model of html.

3.2.1 Spacing in math mode

By contrast with LATEX, spaces from the input are significant in math mode, this feature allows users to instruct HEVEA on how to put space in their formulas. For instance, \alpha\rightarrow\beta is typeset without spaces between symbols, whereas \alpha \rightarrow \beta produces these spaces.

\alpha\rightarrow\beta : α→β
\alpha \rightarrow \beta : α → β

Note that LATEX ignores spaces in math mode, so that users can freely adjust HEVEA output without changing anything to LATEX output.

3.2.2 Symbols


Figure 1: Some symbols
\in:   \notin: 
\int:   \prod: 
\preceq:   \prec: 
\leq:   \geq: 
\cup:   \cap: 
\supset:   \subset: 
\supseteq:   \subseteq: 

With respect to previous versions of HEVEA since the begining, the treatment of symbols has significantly evolved. Outputting symbols is now performed by using Unicode character references, an option that much more complies whith standards than the previous option of selecting a “symbol” font. Observe that this choice is now possible, because more and more browsers correctly display such references. See Figure 1 for a few such symbols.

However, this means that ancient or purposely limited browsers (such as text-oriented browsers) cannot display maths, as translated by HEVEA. For authors that insist on avoiding symbols that cannot be shown by any browser, HEVEA offers a degraded mode that outputs text in place of symbols. HEVEA operates in this mode when given the -textsymbols command-line option. Replacement text is in English. For instance. the “∈” symbol is replace by “in”. This is far from being satisfactory, but degraded mode may be appropriate for documents than contain few symbols.

3.2.3 Displays

Apart from containing symbols, formulas specify strong typesetting constraints: sub-elements must be combined together following patterns that departs from normal text typesetting. For instance, fractions numerators and denominators must be placed one above the other. HEVEA handles such constraints in display mode only.

The main two operating modes of HEVEA are text mode and display mode. Text mode is the mode for typesetting normal text, when in this mode, text items are echoed one following the other and paragraph breaks are just blank lines, both in input and output. The so called displayed-paragraph environments of LATEX (such as center or quote) are rendered by html block-level elements (such as div or blockquote). Rendering is correct becauses both LATEX displayed environments and html block-level elements start a new line. Conversly, since opening a html block-level elements means starting a new line, any text that sould appear inside a paragraph must be translated using only html text-level elements. HEVEA chooses to translate in-text formulas that way.

HEVEA display mode allows more control on text placement, since entering display mode means opening a html table element and that tables allow to control the relative position of their sub-elements. Displays come in two flavor, horizontal displays and vertical displays. An horizontal display is a one-row table, while a vertical display is a one-column table. These tables holds display sub-elements, displays sub-elements being centered vertically in horizontal display mode and horizontally in vertical display mode.

Display mode is first opened by opening a displaymath environment (e.g. by $$ or \[). Then, sub-displays are opened by LATEX constructs which require them. For instance, a displayed fraction (\frac) opens a vertical display.

The distinction between text and display modes clearly appears while typesetting math formulas. An in-text formula such as $\int_1^2 xdx = \frac{3}{2}$ appears as: ∫12 xdx =3/2, while the same formula has a better aspect in display mode:

2


1
xdx = 
3
2

As a consequence, HEVEA is more powerful in display mode and formulas should be displayed as soon as they get a bit complicated. This rule is also true in LATEX but it is more strict in HEVEA, since html capabilities to typeset formulas inside text are quite poor. In particular, it is not possible to get in-text “real” fractions or in-text limit-like subscripts.

Users should remember that HEVEA is not TEX or LATEX and that HEVEA author neither is D. E. Knuth nor L. Lamport. Thus, some formulas may be rendered poorly. For instance, two fractions with different denominator and numerator height look strange.

1
N
i=0
Ui
 = 
N
i=0
Ui
1

The reason is that vertical displays in an horizontal display are html tables that always get centered in the vertical direction. Such a crude model cannot faithfully emulate any TEX box placement.

Users can get an idea on how HEVEA combines elements in display mode by giving the -dv command-line option, which instructs HEVEA to add borders to the table elements introduced by displays.

3.2.4 Arrays and display mode

By contrast with formulas, which HEVEA attempts to render with text-level elements only when they appear inside paragraphs, LATEX arrays always translate to the block-level element table, thereby introducing non-desired line breaks before and after in-text arrays. As a consequence, in-text arrays yield an acceptable output, only while alone in a paragraph.

Consider the following source:

This is a small array:
\begin{tabular}{|cc|}
\hline item-1 & item-2 \\
\hline\end{tabular}. Next sentence.

We get:

This is a small array:
item-1item-2
. Next sentence.

However, since in some sense, all html tables are displayed, the array and tabular environments implicitly open display mode, thus allowing a satisfactory typesetting of formulas in arrays. More precisely, array elements whose column format specification is l, c or r are typeset in display mode (see section B.10.2).

3.3 Warnings

When HEVEA thinks it cannot translate a symbol or construct properly, it issues a warning. This draws user attention onto a potential problem. However, rendering may be correct.

In the following (silly) example, HEVEA gets nervous because of the complicated length given as argument to \hspace:

\newlength{\mylength}\setlength{\mylength}{5pt}
\begin{tabular}{c@{\hspace{\mylength}}c}
Before & After
\end{tabular}

Running HEVEA on this input produces a warning:

# hevea manual.tex
...
manual.tex:697: Warning: Command not found: \mylength
manual.tex:697: Warning: \hspace with arg ''
...

However the final rendering is correct:

BeforeAfter

Note that all warnings can be suppressed with the -s (silent) option. When a warning reveals a real problem, it can often be cured by writing a specific macro. The next two sections introduce HEVEA macros, then section 4 describes how to proceed with greater detail.

3.4 Commands

Just like LATEX, HEVEA can be seen as a macro language, macros are rewritten until no more expansion is possible. Then, either some characters (such as letters, integers…) are outputed or some internal operation (such as changing font attributes, or arranging text items in a certain manner) are performed.

This scheme favors easy extension of program capabilities by users. However, predicting program behaviour and correcting errors may prove difficult, since final output or errors may occur after several levels of macro expansion. As a consequence, users can tailor HEVEA to their needs, but it remains a subtle task. Nevertheless, happy LATEX users should enjoy customizing HEVEA, since this is done by writing LATEX code.

3.5 Style choices

LATEX and html differ in many aspects. For instance, LATEX allows fine control over text placement, whereas html does not. More symbols and font attributes are available in LATEX than in html. Conversely, html has font attributes, such as color, which standard LATEX has not.

Therefore, there are many situations where HEVEA just cannot render the visual effect of LATEX constructions. Here some choices have to be made. For instance, calligraphic letters (\mathcal) are rendered in red.

If you are not satisfied with HEVEA rendering of text style declarations, then you can choose your own, by redefining the \cal macros, using \renewcommand, the macro redefinition operator of LATEX. The key point is that you need not worry about HEVEA internals: just redefine the old-LATEX style text-style declarations (i.e. \it, \sc, etc.) and everything should get fine:

\renewcommand{\sc}{\Huge}
\renewcommand{\cal}{\em}

(See sections 4 and 5 on how to make such changes while leaving your file processable by LATEX, and section 10.2 for a more thorough descripton of customizing type styles).

With such redefinitions, we get:

This is small caps and this is CALLIGRAPHIC LETTERS

Note that many of LATEX commands and environments are defined in the hevea.hva file that HEVEA loads before processing any input. These constructs are written using LATEX source code, in the end they invoke HEVEA internal commands.

Other LATEX constructs, such as LATEX key constructs or HEVEA internal commands (see section 8.3), that require special processing are defined in HEVEA source code. However, the vast majority of these definitions can be overridden by a redefinition. This may prove useless, since there is little point in redefining core constructs such as \newcommand for instance.

4 How to detect and correct errors

Most of the problems that occur during the translation of a given LATEX file (say trouble.tex) can be detected and solved at the macro-level. That is, most problems induce a macro-related warning and can be solved by writing a few macros. The best place for these macros is an user style file (say trouble.hva) given as argument to HEVEA.

# hevea trouble.hva trouble.tex

By doing so, the macros written specially for HEVEA are not seen by LATEX. Even better, trouble.tex is not changed at all.

A worth-mentiong alternative is inserting \usepackage{trouble} in the document preamble. Then, given HEVEA semantics for \usepackage (see Section B.5.2), HEVEA-specific commands should be placed in the file “trouble.hva” file, while LATEX-specific commands should be placed in the file “trouble.sty”.

Of course, adapting a document to HEVEA processing will be easier if the LATEX source is written in a generic style, using macros. Note that this style is recommended anyway, since it facilitates document maintenance.

4.1 HEVEA does not know a macro

This section has been outdated by the implementation of \raisebox by C. Spiel. Nevertheless, the method illustrated here is still highly valuable. This method can be summarised as “if HEVEA does not know about a macro, you may solve the problem a simple one yourself” and “do not ignore warnings”.

Consider the following LATEX source excerpt:

You can \raisebox{.6ex}{\em raise} text.

LATEX typesets this as follows:

Since HEVEA does not know about \raisebox, it incorrectly processes this input. More precisely, it first prints a warning message:

trouble.tex:34: Unknown macro: \raisebox

Then, it goes on by translating the arguments of \raisebox as if they were normal text. As a consequence some .6ex is finally found in the html output:

You can .6exraise text.

To correct this, you should provide a macro that has more or less the effect of \raisebox. It is impossible to write a generic \raisebox macro for HEVEA, because of html limitations.1 However, in this case, the effect of \raisebox is to raise the box a little. Thus, the first, numerical, argument to \raisebox can be ignored in a private \raisebox macro defined in trouble.hva:

\newcommand{\raisebox}[2]{$^{\mbox{#2}}$}

Now, translating the document yields:

You can raise text a little.

Of course, this will work only when all \raisebox commands in the document raise text a little. Consider, the following example, where text is both raised a lowered a little:

You can \raisebox{.6ex}{\em raise}
or \raisebox{-.6ex}{\em lower} text.

Which LATEX renders as follows:

Whereas, with the above definition of \raisebox, HEVEA produces:

You can raise or lower text.

A solution is to add a new macro definition in the trouble.hva file:

\newcommand{\lowerbox}[2]{$_{\mbox{#2}}$}

Then, trouble.tex itself has to be modified a little.

You can \raisebox{.6ex}{\em raise}
or \lowerbox{-.6ex}{\em lower} text.

HEVEA now produces a satisfying output:

You can raise or lower text.

Note that, for the document to remain LATEX-processable, it should also contain the following definition for \lowerbox:

\newcommand{\lowerbox}[2]{\raisebox{#1}{#2}}

This definition can safely be placed anywhere in trouble.tex, since by HEVEA semantics for \newcommand (see section B.8.1) the new definition will not overwrite the old one.

4.2 HEVEA incorrectly interprets a macro

Note : HEVEA now renders the \rule command very similarly to LATEX. Hence the forthcomming section is in some sense obsolete. Nevertheless, the technique described is useful and the section is still worth reading.

Sometimes HEVEA knows about a macro, but the produced html does not look good when seen through a browser. This kind of errors is detected while visually checking the output. However, HEVEA does its best to issue warnings when such situations are likely to occur.

Consider, for instance, this definition of \blob as a small black square.

\newcommand{\blob}{\rule[.2ex]{1ex}{1ex}}
\blob\ Blob \blob

Which LATEX typesets as follows:

HEVEA always translates \rule as <hr>, ignoring size arguments. Hence, it produces the following, wrong, output:


Blob

We may not be particularily commited to a square blob. In that case, other small symbols would perfectly do the job of \blob, such as a bullet (\bullet). Thus, you may choose to give \blob a definition in trouble.hva:

\newcommand{\blob}{\bullet}

This new definition yields the following, more satisfying output:

• Blob •

In case we do want a square blob, there are two alternatives. We can have LATEX typeset some subparts of the document and then to include them as images, section 6 explains how to proceed. We can also find a square blob somewhere in the variety of Unicode (or do I mean ISO 10646?) characters, and define \blob as a numerical character reference. Here, the character U+02588 seems ok.

\newcommand{\blob}{\@print@u{X2588}}
█ Blob █

However, beware that not all browsers display all of Unicode…

Finally, users that experience poor rendering of the \rule command can also upgrade HEVEA, so as to benefit from the new implementation of this command:

Blob

4.3 HEVEA crashes

HEVEA failure may have many causes, including a bug. However, it may also stem from a wrong LATEX input. Thus, this section is to be read before reporting a bug…

4.3.1 Simple cases: LATEX also crashes

In the following source, environments are not properly balanced:

\begin{flushright}
\begin{quote}
This is right-flushed quoted text.
\end{flushright}
\end{quote}

Such a source will make both LATEX and HEVEA choke. HEVEA issues the following error message that shows the LATEX environment that is not closed properly:

./trouble.tex:6: Environment nesting error: html: 'DIV' closes 'BLOCKQUOTE'
./trouble.tex:4: Latex environment 'quote' is pending
Adios

Thus, when HEVEA crashes, it is a good idea to check that the input is correct by running LATEX on it.

4.3.2 Complicated cases

Unfortunately, HEVEA may crash on input that does not affect LATEX. Such errors usually relate to environment or group nesting.

Consider for instance the following “optimized” version of a quoteright environment:

\newenvironment{quoteright}{\quote\flushright}{\endquote}

\begin{quoteright}
This a right-flushed quotation
\end{quoteright}

The \quote and \flushright constructs are intended to replace \begin{quote} and \begin{flushright}, while \endquote stands for \end{quote}. Note that the closing \endflushright is omitted, since it does nothing. LATEX accepts such an input and produces a right-flushed quotation.

However, HEVEA usually translates LATEX environments to html block-level elements and it requires those elements to be nested properly. Here, \quote translates to <blockquote>, \flushright translates to <div class="flushright"> and \endquote translates to </blockquote>. At that point, HEVEA refuses to generate obviously non-correct html and it crashes:

Giving up command: \@close
Giving up command: \endquote
Giving up command: \endquoteright
Giving up command: \end
./trouble.tex:7: Environment nesting error: html: 'BLOCKQUOTE' closes 'DIV'
./trouble.tex:5: Latex environment 'quoteright' is pending
Adios

Also notice that the error message above includes a backtrace showing the call-chain of commands.

In this case, the solution is easy: environments must be opened and closed consistently. LATEX style being recommended, one should write:

\newenvironment{quoteright}
  {\begin{quote}\begin{flushright}}
  {\end{flushright}\end{quote}}

And we get:

This is a right-flushed quotation

Unclosed LATEX groups ({…) are another source of nuisance to HEVEA. Consider the following horreur.tex file:

\documentclass{article}

\begin{document}
In this sentence, a group is opened now {\em and never closed.
\end{document}

LATEX accepts this file, although it produces a warning:

# latex horreur.tex 
This is TeX, Version 3.14159 (Web2C 7.2)
  ...
(\end occurred inside a group at level 1)
Output written on horreur.dvi (1 page, 280 bytes).

By contrast, running HEVEA on horreur.tex yields a fatal error:

# hevea horreur.tex 
Giving up command: \@raise@enddocument
Giving up command: \enddocument
Giving up command: \end
./horreur.tex:4: Environment nesting error: Latex env error: 'document' closes ''
./horreur.tex:3: Latex environment '' is pending
Adios

Thus, users should close opening braces where it belongs. Note that HEVEA error message “Latex environment ’env’ is pending” helps a lot in locating the brace that hurts.

4.3.3 Desperate cases

If HEVEA crashes on LATEX source (not on TEX source), then you may have discovered a bug, or this manual is not as complete as it should. In any case, please report to Luc.Maranget@inria.fr.

To be useful, your bug report should include LATEX code that triggers the bug (the shorter, the better) and mention HEVEA version number.


1
Clearly the author of those lines was wrong, as demonstrated here.

5 Making HEVEA and LATEX both happy

A satisfactory translation from LATEX to html often requires giving instructions to HEVEA. Typically, these instructions are macro definitions and these instructions should not be seen by LATEX. Conversely, some source that LATEX needs should not be processed by HEVEA. Basically, there are three ways to make input vary according to the processor, file loading, the hevea package and comments.

5.1 File loading

HEVEA and LATEX treat files differently. Here is a summary of the main differences:

  • LATEX and HEVEA both load files given as arguments to \input, however when given the option -e filename, HEVEA does not load filename.
  • HEVEA loads all files given as command-line arguments.
  • Both LATEX and HEVEA load style files given as optional arguments to \documentstyle and as arguments to \usepackage, but the files are searched by following different methods and considering different file extensions.

As a consequence, for having a file latexonly loaded by LATEX only, it suffices to use \input{latexonly} in the source and to invoke HEVEA as follows:

# hevea -e latexonly

Having heveaonly loaded by HEVEA only is more simple: it suffices to invoke HEVEA as follows:

# hevea heveaonly

Finally, if one has an HEVEA equivalent style.hva for a LATEX style file style.sty, then one should load the file as follows:

\usepackage{style}

This will result in, LATEX loading style.sty, while HEVEA loads style.hva. As HEVEA will not fail in case style.hva does not exist, this is another method for having a style file loaded by LATEX only.

Writing an HEVEA-specific file file.hva is the method of choice for supplying command definitions to HEVEA only. Users can then be sure that these definitions are not seen by LATEX and will not get echoed to the image file (see section 6).

The file file.hva can be loaded by either supplying the command-line argument file.hva, or by \usepackage{file} from inside the document. Which method is better depends on whether you choose to override or to replace the document definition. In the command-line case, definitions from file.hva are processed before the ones from the document and will override them, provided the document definitions are made using \newcommand (or \newenvironment). In the \usepackage case, HEVEA loads file.hva at the place where LATEX loads file.sty, hence the definitions from file.hva replace the definitions from file.sty in the strict sense.

5.2 The hevea package

The hevea.sty style file is intended to be loaded by LATEX and not by HEVEA. It provides LATEX with means to ignore or process some parts of the document. Note that HEVEA copes with the constructs defined in the hevea.sty file by default. It is important to notice that the hevea.sty style file from the distribution is a package in LATEX 2є terms and that it is not compatible with old LATEX. Moreover, the hevea package loads the comment package which must be present. Also notice that, for compatibility, HEVEA reacts to \usepackage{hevea} by loading its own version of the comment package (Section B.17.7).

5.2.1 Environments for selecting a translator

HEVEA and LATEX perform the following actions on source inside the latexonly, verblatex, htmlonly, rawhtml, toimage and verbimage environments:

environment HEVEALATEX
latexonly ignore, \end{env} constructs are processed (see section 5.2.2)process
verblatex ignoreprocess
htmlonly processignore
rawhtml echo verbatim (see section 8.4)ignore
toimage send to the image file, \end{env} constructs and macro characters are processed (see section 6)process
verbimage send to the image file (see section 6)process

As an example, this is how some text can be typeset in purple by HEVEA and left alone by LATEX:

We get:
\begin{htmlonly}%
\purple purple rain, purple rain%
\end{htmlonly}
\begin{latexonly}%
purple rain, purple rain%
\end{latexonly}%
\ldots

We get: purple rain, purple rain

It is impossible to avoid the spurious space in HEVEA output for the source above. This extra spaces comes from the newline character that follows \end{htmlonly}. Namely this construct must appear in a line of its own for LATEX to recognize it. Anyway, better control over spaces can be achieved by using the hevea boolean register or comments, see sections 5.2.3 and 5.3.

Also note that environments define a scope and that style changes (and non-global definitions) are local to them. For instance, in the example above, “…” appears in black in html output. However, as an exception, the environments image and verbimage do not create scope. It takes a little practice of HEVEA to understand why this is convenient.

5.2.2 Why are there two environments for ignoring input?

Some scanning and analysis of source is performed by HEVEA inside the latexonly environment, in order to allow latexonly to dynamically occur inside other environments.

More specifically, \end{env} macros are recognized and their env argument is tested against the name of the environment whose opening macro \env opened the latexonly environment. In that case, macro expansion of \endenv is performed and any further occurrence of \end{env’} is tested and may get expanded if it matches a pending \begin{env’} construct.

This enables playing tricks such as:

\newenvironment{latexhuge}
  {\begin{latexonly}\huge}
  {\end{latexonly}}

\begin{latexhuge}
This will appear in huge font in \LaTeX{} output only.
\end{latexhuge}

LATEX output will be:

While there is no HEVEA output.

Since HEVEA somehow analyses input that is enclosed in the latexonly environment, it may choke. However, this environment is intended to select processing by LATEX only and might contain arbitrary source code. Fortunately, it remains possible to have input processed by LATEX only, regardless of what it is, by enclosing it in the verblatex environment. Inside this environment, HEVEA performs no other action than looking for \end{verblatex}. As a consequence, the \begin{verblatex} and \end{verblatex} constructs may only appear in the main flow of text or inside the same macro body, a bit like LATEX verbatim environment.

Relations between toimage and verbimage are similar. Additionally, formal parameters #i are replaced by actual arguments inside the toimage environment (see end of section 6.3 for an example of this feature).

5.2.3 The hevea boolean register

Boolean registers are provided by the ifthen package (see [LATEX, Section C.8.5] and section B.8.5 in this document). Both the hevea.sty style file and HEVEA define the boolean register hevea. However, this register initial value is false for LATEX and true for HEVEA.

Thus, provided, both the hevea.sty style file and the ifthen packages are loaded, the “purple rain” example can be rephrased as follows:

We get:
{\ifthenelse{\boolean{hevea}}{\purple}{}purple rain, purple rain}\ldots

We get: purple rain, purple rain

Another choice is using the TEX-style conditional macro \ifhevea (see Section B.16.1.4):

We get:
{\ifhevea\purple\fi purple rain, purple rain}\ldots

We get: purple rain, purple rain

5.3 Comments

HEVEA processes all lines that start with %HEVEA, while LATEX treats these lines as comments. Thus, this is a last variation on the “purple rain” example:

We get
%HEVEA{\purple
purple rain, purple rain%
%HEVEA}%
\ldots

(Note how comments are placed at the end of some lines to avoid spurious spaces in the final output.)

We get: purple rain, purple rain

Comments thus provide an alternative to loading the hevea package. For user convenience, comment equivalents to the latexonly and toimage environment are also provided:

environmentcomment equivalent
\begin{latexonly}\end{latexonly}
%BEGIN LATEX
%END LATEX
  
\begin{toimage}\end{toimage}
%BEGIN IMAGE
%END IMAGE

Note that LATEX, by ignoring comments, naturally performs the action of processing text between %BEGIN and %END comments. However, no environment is opened and closed and no scope is created while using comment equivalents.

6 With a little help from LATEX

Sometimes, HEVEA just cannot process its input, but it remains acceptable to have LATEX process it, to produce an image from LATEX output and to include a link to this image into HEVEA output. HEVEA provides a limited support for doing this.

6.1 The image file

While outputting doc.html, HEVEA echoes some of its input to the image file, doc.image.tex. Part of this process is done at the user’s request. More precisely, the following two constructs send text to the image file:

\begin{toimage}
text
\end{toimage}
 
%BEGIN IMAGE
text
%END IMAGE

Additionally, \usepackage commands, top-level and global definitions are automatically echoed to the image file. This enables using document-specific commands in text above.

Output to the image file builds up a current page, which is flushed by the \imageflush command. This command has the following effect: it outputs a strict page break in the image file, increments the image counter and output a <img src="pagename.png"> tag in HEVEA output file, where pagename is build from the image counter and HEVEA output file name. Then the imagen script has to be run by:

# imagen doc

This will process the doc.image.tex file through LATEX, dvips, ghostscript and a few others tools, which must all be present (see section C.4.1), finally producing one pagename.png file per page in the image file.

The usage of imagen is described at section C.1.5. Note that imagen is a simple shell script. Unix users can pass hevea the command-line option -fix. Then hevea will itself call imagen, when appropriate.

6.2 A toy example

Consider the “blob” example from section 4.2. Here is the active part of a blob.tex file:

 \newcommand{\blob}{\rule[.2ex]{1ex}{1ex}}
 \blob\ Blob \blob

This time, we would like \blob to produce a small black square, which \rule[.2ex]{1ex}{1ex} indeed does in LATEX. Thus we can write:

 \newcommand{\blob}{%
 \begin{toimage}\rule[.2ex]{1ex}{1ex}%
 \end{toimage}%
 \imageflush}
 \blob\ Blob \blob

Now we issue the following two commands:

 # hevea blob.tex
 # imagen blob

And we get:

Blob

Observe that the trick can be used to replace missing symbols by small .png images. However, the cost may be prohibitive, text rendering is generally bad, fine placement is ignored and font style changes are problematic. Cost can be lowered using \savebox, but the other problems remain.

6.3 Including Postscript images

In this section, a technique to transform included Postscript images into included bitmap images is described. Note that this technique is used by HEVEA implementation of the graphics package (see section B.14.1), which provides a more standard manner to include Postscript images in LATEX documents.

Included images are easy to manage: it suffices to let LATEX do the job. Let round.ps be a Postscript file, which is included as an image in the source file round.tex (which must load the epsf package):

 \begin{center}
 \epsfbox{round.ps}
 \end{center}

Then, HEVEA can have this image translated into a inlined (and centered) .png image by modifying source as follows:

 \begin{center}
 %BEGIN IMAGE
 \epsfbox{round.ps}
 %END IMAGE
 %HEVEA\imageflush
 \end{center}

(Note that the round.tex file still can be processed by LATEX, since comment equivalents of the toimage environment are used and that the \imageflush command is inside a %HEVEA comment — see section 5.3.)

Then, processing round.tex through HEVEA and imagen yields:

It is important to notice that things go smoothly because the \usepackage{epsf} command gets echoed to the image file. In more complicated cases, LATEX may fail on the image file because it does not load the right packages or define the right macros.

However, the above solution implies modifying the original LATEX source code. A better solution is to define the \epsfbox command, so that HEVEA echoes \epsfbox and its argument to the image file and performs \imageflush:

 \newcommand{\epsfbox}[1]{%
 \begin{toimage}
 \epsfbox{#1}
 \end{toimage}
 \imageflush}

Such a definition must be seen by HEVEA only. So, it is best put in a separate file whose name is given as an extra argument on HEVEA command-line (see section 5.1). Putting it in the document source protected inside an %HEVEA comment is a bad idea, because it might then get echoed to the image file and generate trouble when LATEX is later run by imagen.

Observe that the above definition of \epsfbox is a definition and not a redefinition (i.e. \newcommand is used and not \renewcommand), because HEVEA does not know about \epsfbox by default. Also observe that this not a recursive definition, since commands do not get expanded inside the toimage environment.

Finally, if the Postscript image is produced from a bitmap, it is a pity to translate it back into a bitmap. A better idea is first to generate a PNG file from the bitmap source independantly and then to include a link to that PNG file in html output, see section 8.2 for a description of this more adequate technique.

6.4 Using filters

Some programs extend LATEX capabilities using a filter principle. In such a scheme, the document contains source fragments for the program. A first run of the program on LATEX source changes these fragments into constructs that LATEX (or a subsequent stage in the paper document production chain, such as dvips) can handle. Here again, the rule of the game is keeping HEVEA away from the normal process: first applying the filter, then making HEVEA send the filter output to the image file, and then having imagen do the job.

Consider the gpic filter, for making drawings. Source for gpic is enclosed in .PS.PE, then the result is available to subsequent LATEX source as a TEX box \box\graph. For instance the following source, from a smile.tex file, draws a “Smile!” logo as a centered paragraph:

 .PS
 ellipse "{\Large\bf Smile!}"
 .PE
 \begin{center}
 ~\box\graph~
 \end{center}

Both the image description (.PS.PE) and usage (\box\graph) are for the image file, and they should be enclosed by %BEGIN IMAGE%END IMAGE comments. Additionally, the image link is put where it belongs by an \imageflush command:

 %BEGIN IMAGE
 .PS
 ellipse "{\Large\bf Smile!}"
 .PE
 %END IMAGE
 \begin{center}
 %BEGIN IMAGE
 ~\box\graph~
 %END IMAGE
 %HEVEA\imageflush
 \end{center}

The gpic filter is applied first, then come hevea and imagen:

 # gpic -t < smile.tex > tmp.tex
 # hevea tmp.tex -o smile.html
 # imagen smile

And we get:

Observe how the -o argument to HEVEA is used and that imagen argument is HEVEA output basename (see section C.1.1.2 for the full definition of HEVEA output basename).

In the gpic example, modifying user source cannot be totally avoided. However, writing in a generic style saves typing. For instance, users may define the following environment for centered gpic pictures in LATEX:

 \newenvironment{centergpic}{}{\begin{center}~\box\graph~\end{center}}

Source code will now be as follows:

 \begin{centergpic}
 .PS
 ellipse "{\Large\bf Smile!}"
 .PE
 \end{centergpic}

HEVEA will process this source correctly, provided it is given its own definition for the centergpic environment beforehand:

 \newenvironment{centergpic}
   {\begin{toimage}}
   {\box\graph\end{toimage}\begin{center}\imageflush\end{center}}

Assuming that the definition above is in a smile.hva file, the command sequence for translating smile.tex now is:

 # gpic -t < smile.tex > tmp.tex
 # hevea smile.hva tmp.tex -o smile.html
 tmp.tex:5: Warning: ignoring definition of \centergpic
 tmp.tex:5: Warning: not defining environment centergpic
 # imagen smile

The warnings above are normal: they are issued when HEVEA runs across the LATEX-intended definition of the centergpic environment and refuses to override its own definition for that environment.

7 Cutting your document into pieces with HACHA

HEVEA outputs a single .html file. This file can be cut into pieces at various sectional units by HACHA

7.1 Simple usage

First generate your html document by applying HEVEA:

# hevea doc.tex

Then cut doc.html into pieces by the command:

# hacha doc.html

This will generate a simple root file index.html. This root file holds document title, abstract and a simple table of contents. Every item in the table of contents contains a link to or into a file that holds a “cutting” sectional unit. By default, the cutting sectional unit is section in the article style and chapter in the book style. The name of those files are doc001.html, doc002.html, etc.

Additionally, one level of sectioning below the cutting unit (i.e. subsections in the article style and sections in the book style) is shown as an entry in the table of contents. Sectional units above the cutting section (i.e. parts in both article and book styles) close the current table of contents and open a new one. Cross-references are properly handled, that is, the local links generated by HEVEA are changed into remote links.

The name of the root file can be changed using the -o option:

# hacha -o root.html doc.html

Some of HEVEA output get replicated in all the files generated by HACHA. Users can supply a header and a footer, which will appear at the begining and end of every page generated by HACHA. It suffices to include the following commands in the document preamble:

\htmlhead{header}
\htmlfoot{footer}

HACHA also makes every page it generates a clone of its input as regards attributes to the <body ...> opening tag and meta-information from the <head><\head> block. See section B.2 for examples of this replication feature.

By contrast, style information specified in the style elements from rom the <head><\head> block is not replicated. Instead, all style definitions are collected into an external style sheet file whose name is doc.css, and all generated html files adopt doc.css as an external style sheet. It is important to notice that, since version 1.08, HEVEA produces a style element by itself, even if users do not explicitely use styles. As a consequence, HACHA normally produces a file doc.css, which should not be forgotten while copying files to their final destination after a run of HACHA.

7.2 Advanced usage

HACHA behaviour can be altered from the document source, by using a counter and a few macros.

A document that explicitly includes cutting macros still can be typeset by LATEX, provided it loads the hevea.sty style file from the HEVEA distribution. (See section 5 for details on this style file). An alternative to loading the hevea package is to put all cutting instructions in comments starting with %HEVEA.

7.2.1 Principle

HACHA recognizes all sectional units, ordered as follows, from top to bottom: part, chapter, section, subsection, subsubsection, paragraph and subparagraph.

At any point between \begin{document} and \end{document}, there exist a current cutting sectional unit (cutting unit for short), a current cutting depth, a root file and an output file. Table of contents output goes to the root file, normal output goes to the output file. Cutting units start a new output file, whereas units comprised between the cutting unit and the cutting units plus the cutting depth add new entries in the table of contents.

At document start, the root file and the output file are HACHA output file (i.e. index.html). The cutting unit and the cutting depth are set to default values that depend on the document style.

7.2.2 Cutting macros

The following cutting instructions are for use in the document preamble. They command the cutting scheme of the whole document:

\cuttingunit
This is a macro that holds the document cutting unit. You can change the default (which is section in the article style and chapter in the book style) by doing:
\renewcommand{\cuttingunit}{secname}.
\tocnumber
Instruct HEVEA to put section numbers into table of content entries.
\notocnumber
Instruct HEVEA not to put section numbers into table of content entries. This is the default.
cuttingdepth
This is a counter that holds the document cutting depth. You can change the default value of 1 by doing \setcounter{cuttingdepth}{numvalue}. A cutting depth of zero means no other entries than the cutting units in the table of contents.

Other cutting instructions are to be used after \begin{document}. They all generate html comments in HEVEA output. These comments then act as instructions to HACHA.

\cuthere{secname}{itemtitle}
Attempt a cut.
  • If secname is the current cutting unit or the keyword now, then a new output file is started and an entry in the current table of contents is generated, with title itemtitle. This entry holds a link to the new output file.
  • If secname is above the cutting unit, then the current table of contents is closed. The output file is set to the current root file.
  • If secname is below the cutting unit and less than the cutting depth away from it, then an entry is added in the table of contents. This entry contains itemtitle and a link to the point where \cuthere appears.
  • Otherwise, no action is performed.
\cutdef[depth]{secname}
Open a new table of contents, with cutting depth depth and cutting unit secname. If the optional depth is absent, the cutting depth does not change. The output file becomes the root file. Result is unspecified if whatever secname expands to is a sectional unit name above the current cutting unit, is not a valid sectional unit name or if depth does not expand to a small positive number.
\cutend
End the current table of contents. This closes the scope of the previous \cutdef. The cutting unit and cutting depth are restored. Note that \cutdef and \cutend must be properly balanced.

Commands \cuthere and \cutend have starred variants, which behave identically except for footnotes (see 7.3.7).

Default settings work as follows: \begin{document} performs

\cutdef*[\value{cuttingdepth}]{\cuttingunit}

and \end{document} performs \cutend*. All sectioning commands perform \cuthere, with the sectional unit name as first argument and the (optional, if present) sectioning command argument (i.e. the section title) as second argument. Note that starred versions of the sectioning commands also perform cutting instructions.

7.2.3 Table of links organisation

A table of links generated by HACHA is a list of links to generated files. Additionally, some sublists may be present, up to a certain depth. The items in those sublists are links inside generated files, they point to sectional unit titles below the cutting unit, up to a certain depth.

More precisely, let A be a certain sectional unit (e.g. “part”), let B be just below A (e.g. “section”), and let C be just below C (e.g. “subsection”). Further assume that cutting is performed at level B with a depth of more than one. Then, every unit A holds a one or several tables of links to generated files, and each generated file normally holds a B unit. Sublists with links to C units inside B units normally appear in the tables of links of level A. The command-line options -tocbis and -tocter instruct hacha to put sublists at other places. With -tocbis sublists are duplicated at the beginning of the B level files; while with -tocter sublist only appear at the beginning of the B level files.

In my opinion, default style is appropriate for documents with short B units; while -tocbis style is appropriate for documents with long B units with a few sub-units; and -tocter style is appropriate for documents with long B units with a lot of sub-units. As you may have noticed, this manual is cut by following the -tocbis style.

Whatever the style is, if a B unit is cut (e.g. because its text is enclosed in \cutdef{C}\cutend), then every C unit goes into its own file and there is no sublist after the relevant B level entry in the A level table of links.

7.2.4 Examples

Consider, for instance, a book document with a long chapter that you want to cut at the section level, showing subsections:

\chapter{A long chapter}
.....

\chapter{The next chapter}

Then, you should insert a \cutdef at chapter start and a \cutend at chapter end:

\chapter{A long chapter}
%HEVEA\cutdef[1]{section}
.....
%HEVEA\cutend
\chapter{The next chapter}

Then, the file that would otherwise contain the long chapter now contains the chapter title and a table of sections. No other change is needed, since the command \section already performs the appropriate \cuthere{section}{...} commands, which were ignored by default. (Also note that cutting macros are placed inside %HEVEA comments, for LATEX not to be disturbed).

The \cuthere macro can be used to put some document parts into their own file. This may prove appropriate for long cover pages or abstracts that would otherwise go into the root file. Consider the following document:

\documentclass{article}

\begin{document}

\begin{abstract} A big abstract \end{abstract}
...

Then, you make the abstract go to its own file as it was a cutting unit by typing:

\documentclass{article}
\usepackage{hevea}

\begin{document}
\cuthere{\cuttingunit}{Abstract}
\begin{abstract} A big abstract \end{abstract}
...

(Note that, this time, cutting macros appear unprotected in the source. However, LATEX still can process the document, since the hevea package is loaded).

7.2.5 More and More Pages in Output

In some situations it may be appropriate to produce many pages from one source files. More specifically, loading the deepcut package will put all sectioning units of your document (from \part to \subsection in their own file.

Similarly, loading the figcut package will make all figures and tables go into their own file. The figcut package accepts two options, show and noshow. The former, which is the default, instructs HEVEA to repeat the caption into the main flow of text, with a link to the figure. The latter option disables the feature.

7.3 More Advanced Usage

In this section we show how to alter some details of HACHA behaviour. This includes controlling output file names and the title of generated web pages and introducing arbitrary cuts.

7.3.1 Controlling output file names

When invoked as hacha doc.html, HACHA produces a index.html table of links file that points into doc001.html, doc002.html, etc. content files. This is not very convenient when one wishes to point inside the document from outside. However, the \cutname{name} command sets the name of the current output file name as name.

Consider a document cut at the section level, which contains the following important section:

\section{Important\label{important} section}
...

To make the important section goes into file important.html, one writes:

\section{Important\label{important} section}\cutname{important.html}
...

Then, section “Important section” can be referenced from an HEVEA unaware html page by:

In this document, there is a very
<a href="important.html#important">important section</a>.

If you are reading the html version of this manual, you may check that you are now reading file cutname.html. This particular file name has been specified from the source using \cutname{cutname.html}.

7.3.2 Controlling page titles

When HACHA creates a web page from a given sectional unit, the title of this page normally is the name of the sectional unit. For instance, the title of this very page should be “Cutting your document into pieces with HACHA”. It is possible to insert some text at the beginning of all page titles, by using the \htmlprefix command. Hence, by writing \htmlprefix{\hevea{} Manual: } in the document, the title of this page would become: “HEVEA Manual: Cutting your document into pieces with HACHA” and the title of all other pages would show the same prefix.

7.3.3 Links for the root file

The command \toplinks{prev}{up}{next} instructs HACHA to put links to a “previous”, “up” and “next” page in the root file. The following points are worth noticing:

  • The \toplink command must appear in the document preamble (i.e. before \begin{document}).
  • The arguments prev, up and next should expand to urls, notice that these argument are processed (see section 8.1.1).
  • When one of the expected argument is left empty, the corresponding link is not generated.

This feature can prove useful to relate documents that are generated independently by HEVEA and HACHA.

7.3.4 Controlling link contents from the document

By default the links to the previous, up and next pages show a small icon (an appropriate arrow). This can be changed with the command \setlinkstext{prev}{up}{next}, where prev, up and next are some LATEX source. For instance the default behaviour is equivalent to:

\setlinkstext
  {\imgsrc[alt="Previous"]{previous_motif.svg}}
  {\imgsrc[alt="Up"]{contents_motif.svg}}
  {\imgsrc[alt="Next"]{next_motif.svg}}

Command \setlinkstext behaves as \toplinks does. That is, it must occur in document preamble, arguments are processed and empty arguments yield no effect (i.e. defaults apply).

7.3.5 Complete control over navigation links

The previous commands only impact the contents of the navigation links. It is possible, although reserved to avanced users, to achieve greater control by using the \formatlinks command. The \formatlinks command takes four arguments which are command themselves. The last three command format the “previous”, “up” and “next” links respectively, while the first argument formats the resulting group of links. For instance, one can avoid images and for arrows and typeset the full set of navivation links in a purple border (see Section 9 for styling techniques) as follows:

\newstyle{a.navarrow}{font-family:monospace;font-size:x-large;color:purple}
\newstyle{div.navarrows}{border:solid purple;display:inline-block;padding:1ex;}
\newcommand{\myprev}[1]{\ahref[class="navarrow" title="Previous" ]{#1}{$\rightarrow$}\quad}
\newcommand{\myup}[1]{\quad\ahref[class="navarrow" title="Up" ]{#1}{$\uparrow$}\quad}
\newcommand{\mynext}[1]{\quad\ahref[class="navarrow" title="Next" ]{#1}{$\writearrow$}}

\newcommand{\mylinks}[1]{\@open{div}{class="navarrows"}#1\@close{div}\end{center}}
\formatlinks{\mylinks}{\myprev}{\myup}{\mynext}

7.3.6 Cutting a document anywhere

Part of a document goes to a separate file when enclosed in a cutflow environment:

\begin{cutflow}{title}\end{cutflow}

The content “…” will go into a file of its own, while the argument title is used as the title of the introduced html page.

The html page introduced here does not belong to the normal flow of text. Consequently, one needs an explicit reference from the normal flow of text into the content of the cutflow environment. This will occur naturally when the content of the cutflow environment. contains a \label construct. This look natural in the following quiz example:

\paragraph{A small quiz}
\begin{enumerate}
\item What is black?
\item What is white?
\item What is Dylan?
\end{enumerate}
Answers in section~\ref{answers}.
\begin{cutflow}{Answers}
\paragraph{Quiz answers}\label{answers}
\begin{enumerate}
\item Black is black.
\item White is white.
\item Dylan is Dylan.
\end{enumerate}
\end{cutflow}

The example yields:

A small quiz

  1. What is black?
  2. What is white?
  3. What is Dylan?

Answers in section 7.3.6.

Quiz answers

  1. Black is black.
  2. White is white.
  3. Dylan is Dylan.

However,introducing html hyperlink targets and references with the \aname and \ahrefloc commands (see section 8.1.1) will be more practical most of the time.

The starred variant environment cutflow* is the same as cutflow, save for the html header and footer (see Section 7.1) which are not replicated in the introduced page.

7.3.7 Footnotes

Footnote texts (given as arguments either to \footnote or \footnotetext) do not go directly to output. Instead, footnote texts accumulate internally in a buffer, awaiting to be flushed. The flushing of notes is controlled by the means of a current flushing unit, which is a sectional unit name or document — a fictional unit above all units. At any point, the current flushing unit is the value of the command \@footnotelevel. In practice, the flushing of footnote texts is performed by two commands:

  • \flushdef{secname} simply sets the flushing unit to secname.
  • \footnoteflush{secname} acts as follows:
    • If argument secname is equal to or above the current flushing unit, then footnote texts are flushed (if any). In the output, the texts themselves are surrounded by special comments that tag them as footnote texts and record secname.
    • Otherwise, no action is performed.

The article style file performs \flushdef{document}, while the book style file performs \flushdef{chapter}. At the end of processing, \end{document} performs \footnoteflush{\@footnotelevel}, so as to flush any pending notes.

Cutting commands interact with footnote flushing as follows:

  • \cuthere{secname} executes \footnoteflush{secname}. Remember that all sectioning commands perform \cuthere with their sectional unit name as argument.
  • \cutdef{secname} saves the current flushing unit and buffer on some internal stack, starts a new buffer for footnote texts, and sets the current flushing unit to secname (by performing \flushdef{secname}).
  • \cutend first flushes any pending texts (by performing \footnoteflush with the current flushing unit as argument), and restores the flushing unit and footnote text buffer saved by the matching \cutdef.
  • The starred variants \cutdef* and \cutend* perform no operation that is related to footnotes.

Later, when running across footnote texts in its input file, HACHA sometimes put notes in a separate file. More precisely, HACHA has knowledge of the current cutting level, the current sectional unit where cuts occur — as given by the relevant \cutdef. Moreover, HACHA knows the current section level — that is, the last sectional command processed. Besides, HACHA extracts the note level from the comments that surround the notes (as given by the command \footnoteflush that produced the notes). Then, HACHA creates a separate file for notes when the cutting level and the note level differ, or when the current level is above the cutting level (e.g. the current level is document while the cutting level is chapter). As a result, notes should stay where they are when they occur at the end of HACHA output file and otherwise go to a separate file.

To make a complicated story even more complicated, footnotes in minipage environments or in the arguments to \title or \author have a different, I guess satisfactory, behaviour.

Given the above description, footnotes are managed by default as follows.

  • In style article, hevea puts all footnotes go at the end of the html file. A later run of hacha creates a separate footnote file.
  • In style book, footnotes are collected at the end of chapters. A later run of  hacha leaves them where they are. Footnotes in the title or author names are managed specially, they will normally appear at the end of the root file.

In case you wish to adopt a book-like behaviour for an article (footnotes at the end of sections), it suffices to insert \flushdef{section} in the document preamble.

We now give a few example of interaction between notes and cutting. We first consider normal behaviour. The page you are reading is a section page, since the current cutting unit is “section”. The current unit is “subsection”. The following two subsubsections are sent to their own files by the means of a \cutdef{subsubsection}/\cutend pair. As a result the text of footnotes appear at the end of the subsubsection pages.

7.3.8 A cut subsubsection

A note in a subsubsection, flushed at subsubsections.2


2
At the end of my page.

7.3.9 Another cut subsubsection

Another note in a subsubsection, flushed at subsubsections.3


3
At the end of my page.

The following two subsubsections are sent to their own files by the means of a \cutdef*{subsubsection}/\cutend* pair. As a result, the text of footnotes in the subsections appear at the end of the current section page.4

7.3.10 A cut subsubsection

A note in a subsubsection, flushed at sections.5

7.3.11 Another cut subsubsection

Another note in a subsubsection, flushed at sections.6

Finally, to send the footnotes in subsubsections to a separate web page, one should use a \cutdef{subsubsection}/\cutend pair (to create a proper buffer for subsubsection notes), redefine the flushing unit, and flush notes explicitly.

\cutdef{subsubsection}\flushdef{document}%
\subsubsection{...}
  ...
\footnoteflush{document}\cutend

7.3.12 A cut subsubsection

A note in a subsubsection flushed at document level.7

7.3.13 Another cut subsubsection

Another note in a subsubsection at document level.8


7
Sent to a separate file
8
Sent to a separate file

4
Standard section footnote.
5
Sent at the end of cutname.html
6
Sent at the end of cutname.html

8 Generating html constructs

HEVEA output language being html, it is normal for users to insert hypertext constructs their documents, or to control colours.

8.1 High-Level Commands

HEVEA provides high-level commands for generating hypertext constructs. Users are advised to use these commands in the first place, because it is easy to write incorrect html and that writing html directly may interfere in nasty ways with HEVEA internals.

A few commands for hyperlink management and included images are provided, all these commands have appropriate equivalents defined by the hevea package (see section 5.2). Hence, a document that relies on these high-level commands still can be typeset by LATEX, provided it loads the hevea package.

MacroHEVEALATEX
\ahref{url}{text}  make text an hyperlink to url  echo text
\footahref{url}{text}  make text an hyperlink to url  make url a footnote to text, url is shown in typewriter font
\ahrefurl{url}  make url an hyperlink to url.  typeset url in typewriter font
\ahrefloc{label}{text}  make text an hyperlink to label inside the document  echo text
\aname{label}{text}  make text an hyperlink target with label label  echo text
\mailto{address}  make address a “mailto” link to address  typeset address in typewriter font
\imgsrc[attr]{url}  insert url as an image, attr are attributes in the html sense  do nothing
\home{text}  produce a home-dir url both for output and links, output aspect is: “~text

It is important to notice that all arguments are processed. For instance, to insert a link to my home page, (http://pauillac.inria.fr/~maranget/index.html), you should do something like this:

\ahref{http://pauillac.inria.fr/\home{maranget}/index.html}{his home page}

Given the frequency of ~, # etc. in urls, this is annoying. Moreover, the immediate solution, using \verb, \ahref{\verb" ... /~maranget/..."}{his home page} does not work, since LATEX forbids verbatim formatting inside command arguments.

Fortunately, the url package provides a very convenient \url command that acts like \verb and can appear in other command arguments (unfortunately, this is not the full story, see section B.17.12). Hence, provided the url package is loaded, a more convenient reformulation of the example above is:

\ahref{\url{http://pauillac.inria.fr/~maranget/index.html}}{his home page}

Or even better:

\urldef{\lucpage}{\url}{http://pauillac.inria.fr/~maranget/index.html}
\ahref{\lucpage}{his home page}

It may seem complicated, but this is a safe way to have a document processed both by LATEX and HEVEA. Drawing a line between url typesetting and hyperlinks is correct, because users may sometime want urls to be processed and some other times not. Moreover, HEVEA (optionally) depends on only one third party package: url, which is as correct as it can be and well-written.

In case the \url command is undefined at the time \begin{document} is processed, the commands \url, \oneurl and \footurl are defined as synonymous for \ahref, \ahrefurl and \footahref, thereby ensuring some compatibility with older versions of HEVEA. Note that this usage of \url is deprecated.

8.1.2 html style colours

Specifying colours both for LATEX and HEVEA should be done using the color package (see section B.14.2). However,one can also specify text color using special type style declarations. The hevea.sty style file define no equivalent for these declarations, which therefore are for HEVEA consumption only.

Those declarations follow html conventions for colours. There are sixteen predefined colours:

\black, \silver, \gray, \white, \maroon, \red, \fuchsia, \purple, \green, \lime, \olive, \yellow, \navy, \blue, \teal, \aqua

Additionally, the current text color can be changed by the declaration \htmlcolor{number}, where number is a six digit hexadecimal number specifying a color in the RGB space. For instance, the declaration \htmlcolor{404040} changes font color to dark gray,

8.2 More on included images

The \imgsrc command becomes handy when one has images both in Postscript and GIF (or PNG or JPG) format. As explained in section 6.3, Postscript images can be included in LATEX documents by using the \epsfbox command from the epsf package. For instance, if screenshot.ps is an encapsulated Postscript file, then a doc.tex document can include it by:

\epsfbox{screenshot.ps}

We may very well also have a GIF version of the screenshot image (or be able to produce one easily using image converting tools), let us store it in a screenshot.ps.gif file. Then, for HEVEA to include a link to the GIF image in its output, it suffices to define the \epsfbox command in the macro.hva file as follows:

\newcommand{\epsfbox}[1]{\imgsrc{#1.gif}}

Then HEVEA has to be run as:

# hevea macros.hva doc.tex

Since it has its own definition of \epsfbox, HEVEA will silently include a link the GIF image and not to the Postscript image.

If another naming scheme for image files is preferred, there are alternatives. For instance, assume that Postscript files are of the kind name.ps, while GIF files are of the kind name.gif. Then, images can be included using \includeimage{name}, where \includeimage is a specific user-defined command:

\newcommand{\includeimage}[1]{\ifhevea\imgsrc{#1.gif}\else\epsfbox{#1.ps}\fi}

Note that this method uses the hevea boolean register (see section 5.2.3). If one does not wish to load the hevea.sty file, one can adopt the slightly more verbose definition:

\newcommand{\includeimage}[1]{%
%HEVEA\imgsrc{#1.gif}%
%BEGIN LATEX
\epsfbox{#1.ps}
%END LATEX
}

When the Postscript file has been produced by translating a bitmap file, this simple method of making a bitmap image and using the \imgsrc command is the most adequate. It should be preferred over using the more automated image file mechanism (see section 6), which will translate the image back from Postscript to bitmap format and will thus degrade it.

8.3 Internal macros

In this section a few of HEVEA internal macros are described. Internal macros occur at the final expansion stage of HEVEA and invoke Objective Caml code.

Normally, user source code should not use them, since their behaviour may change from one version of HEVEA to another and because using them incorrectly easily crashes HEVEA. However:

  • Internal macros are almost mandatory for writing supplementary base style files.
  • Casual usage is a convenient (but dangerous) way to finely control output (cf. the examples in the next section).
  • Knowing a little about internal macros helps in understanding how HEVEA works.

The general principle of HEVEA is that LATEX environments \begin{env}\end{env} get translated into html block-level elements <block attributes></block>. More specifically, such block level elements are opened by the internal macro \@open and closed by the internal macro \@close. As a special case, LATEX groups {} get translated into html groups, which are shadow block-level elements with neither opening nor closing tag.

In the following few paragraphs, we sketch the interaction of \@open\@close with paragraphs. Doing so, we intend to warn users about the complexity of the task of producing correct html, and to encourage them to use internal macros, which, most of the time, take nasty details into account.

Paragraphs are rendered by p elements, which are opened and closed automatically. More specifically, a first p is opened after \begin{document}, then paragraph breaks close the active p and open a new one. The final \end{document} closes the last p. In any occasion, paragraphs consisting only of space characters are discarded silently.

Following html “normative reference [HTML-5a]”, block-level elements cannot occur inside p; more precisely, block-level opening tags implicitly close any active p. As a consequence, HEVEA closes the active p element when it processes \@open and opens a new p when it processes the matching \@close. Generally, no p element is opened by default inside block-level elements, that is, HEVEA does not immediately open p after having processed \@open. However, if a paragraph break occurs later, then a new p element is opened, and will be closed automatically when the current block is closed. Thus, the first “paragraph” inside block-level elements that include several paragraphs is not a p element. That alone probably prevents the consistent styling of paragraphs with style sheets.

Groups behave differently, opening or closing them does not close nor open p elements. However, processing paragraph breaks inside groups involves temporarily closing all groups up to the nearest enclosing p, closing it, opening a new p and finally re-opening all groups. Opening a block-level element inside a group, similarly involves closing the active p and opening a new p when the matching \@close is processed.

Finally, display mode (as introduced by $$) is also complicated. Displays basically are table elements with one row (tr), and HEVEA manages to introduce table cells (td) where appropriate. Processing \@open inside a display means closing the current cell, starting a new cell, opening the specified block, and then immediately opening a new display. Processing the matching \@close closes the internal display, then the specified block, then the cell and finally opens a new cell. In many occasions (in particular for groups), either cell break or the internal display may get cancelled.

It is important to notice that primitive arguments are processed (except for the \@print primitive, and for some of the basic style primitives). Thus, some characters cannot be given directly (e.g. # and % must be given as \# and \%).

\@print{text}
Echo text verbatim. As a consequence use only ASCII in text.
\@getprint{text}
Process text using a special output mode that strips off html tags. This macro is the one to use for processed attributes of html tags.
\@hr[attr]{width}{height}
Output an hr element, this is, a horizontal rule. Optional argument attr are attributes passed on directly (e.g. size=3 noshade), while width and height are length arguments given in LATEX style (e.g. 2pt or .5\linewidth).

Users can style the rules generated with \@hr by overriding class horizontal-rule.

\@print@u{n}
Output Unicode character “n” which can be given either as a decimal number or as a hexadecimal number prefixed with “X”.
\@open{block}{attributes}
Open html block-level element block with attributes attributes. The block name block must be lowercase.

As a special case, block may be the empty string, then an html group is opened. Argument block cannot be p; use \@open@par to open a paragraph element.

\@close{block}
Close html block-level element block. Note that \@open and \@close must be properly balanced.
\@open@par[attributes]
Open a paragraph block element, which optionally gets attributes attributes.
\@close@par
Close a paragraph block element. Note that \@open@par and \@close@par also must be properly balanced.
\@out@par{arg}
If occurring inside a p element, that is, if a <p> opening tag is active, \@out@par first closes it (by emitting </p>), formats arg, and then re-opens a p element. Otherwise, \@out@par simply formats arg. This command is adequate when formatting arg produces block-level elements.

Text-level elements are managed differently. They are not seen as blocks that must be closed explicitly. Instead they follow a “declaration” style, similar to the one of LATEX “text-style declarations” — namely, \itshape, \em etc. Block-level elements (and html groups) delimit the effect of such declarations.

\@span{attr}
Declare the text-level element span (with given attributes) as active. The text-level element span will get opened as soon as necessary and closed automatically, when the enclosing block-level elements get closed. Enclosed block-level elements are treated properly by closing span before them, and re-opening span (with given attributes) inside them. The following text-level constructs exhibit similar behaviour with respect to block-level elements.
\@style{shape}
Declare the text shape shape (which must be lowercase) as active. Text shapes are known as font style elements (i, tt, etc.; warning: most of font style elements are depreciated in html5, and some of them are no longer valid, prefer CSS in span tags) or phrase elements (em, etc.) in the html terminology.
\@styleattr{name}{attr}
This command generalises both \@span and \@style, as both a text-level element name name and attributes are specified. More specifically, \@span{attr} can be seen as a shorthand for \@styleattr{span}{attr}; while \@style{name} can be seen as a shorthand for \@styleattr{name}{}.
\@fontsize{int}
Declare the text-level element span with attribute style="font-size:font-size" as active. The argument int must be a small integer in the range 1,2, … , 7. hevea computes font-size, a CSS fontsize value, from int. More specifically, font-size will range from x-small to 120% included in a xx-large, 3 being the default size medium. Notice that \@fontsize is deprecated in favour of \@span with proper fontsize declarations: \@span{style="font-size=xx-small"}, \@span{style="font-size=x-small"}, \@span{style="font-size=small"}, etc.
\@fontcolor{color}
Declare the text-level element span with attribute "style=color" as active. The argument color must be a color attribute value in the html style. That is either one of the sixteen conventional colours black, silver etc, or a RGB hexadecimal color specification of the form #XXXXXX. Note that the argument color is processed, as a consequence numerical color arguments should be given as \#XXXXXX.
\@nostyle
Close active text-level declarations and ignore further text-level declarations. The effect stops when the enclosing block-level element is closed.
\@clearstyle
Simply close active text-level declarations.

Notice on font styling with CSS

The preferred way to style text in new versions of the html “standard” is using style-sheet specifications. Those can be given as argument to a “style” attributes of html elements, most noticeably of the span elements. For instance, to get italics in old versions of html one used the text-level “i” element as in <i></i>. Now, for the same results of getting italics one may write: <span style="font-style:italic"></span>. An indeed hevea styles text in that manner, starting from version 2.00. Such (verbose) declarations are then abstracted into style class declarations by HEVEA optimiser esponja, which is invoked by hevea when given option “-O”.

Notice that style attributes can be given to elements other than span. However, combining style attributes requires a little care as only one style attribute is allowed. Namely <cite style="font-weight:bold" style="color:red"> is illegal and should be written <cite style="font-weight:bold;color:red">. For instance: Das Kapital.

The command \@addtyle can be handy for adding style to already styled elements:

\@addstyle{name:val}{attrs}
Echo the space-separated attributes attrs of a tag with the name:val style declaration added to these attributes. The style attribute is added if necessary. Examples: \@addstyle{color:red}{href="#"} will produce href="#" style="color:red", and \@addstyle{color:red}{href="#" style="font-style:italic"} will produce href="#" style="font-style:italic;color:red". Note that an unnecessary extra space can be added in some cases.

As an example, consider the following definition of a command for typesetting citation in bold, written directly in html:

\newcommand{\styledcite}[2][]
{{\@styleattr{cite}{\@addstyle{#1}{style="font-weight:bold"}}#2}}

The purpose of the optional argument is to add style to specific citations, as in:

Two fundamental works: \styledcite{The Holy Bible} and
\styledcite[color:red]{Das Kapital}.

We get: Two fundamental works: The Holy Bible and Das Kapital.

Notice that the example is given for illustrating the usage of the \@addstyle macros, which is intended for package writers. A probably simpler way to proceed would be to use LATEX text-style declarations:

\newcommand{styledcite}[2][]{{\@style{cite}#1\bf{}#2}}
Two fundamental works: \styledcite{The Holy Bible} and
\styledcite[\color{red}]{Das Kapital}.

We get: Two fundamental works: The Holy Bible and Das Kapital.

8.4 The rawhtml environment

Any text enclosed between \begin{rawhtml} and \end{rawhtml} is echoed verbatim into the html output file. Similarly, \rawhtmlinput{file} echoes the contents of file file. In fact, rawhtml is the environment counterpart of the \@print command, but experience showed it to be much more error prone.

When HEVEA was less sophisticated then it is now, rawhtml was quite convenient. But, as time went by, numerous pitfalls around rawhtml showed up. Here are a few:

  • Verbatim means that no translation of any kind is performed. In particular, be aware that input encoding (see B.17.4) does not apply. Hence one should use ascii only, if needed non-ascii characters can be given as entity or numerical character references — e.g. &eacute; or &#XE9; for é.
  • The rawhtml environment should contain only html text that makes sense alone. For instance, writing \begin{rawhtml}<table>\end{rawhtml}\begin{rawhtml}</table>\end{rawhtml} is dangerous, because HEVEA is not informed about opening and closing the block-level element table. In that case, one should use the internal macros \@open and \@close.
  • \begin{rawhtml}text\end{rawhtml} fragments that contain block-level elements will almost certainly mix poorly with p elements (introduced by paragraph breaks) and with active style declaration (introduced by, for instance, \it). Safe usage will most of the time means using the internal macros \@nostyle and \@out@par.
  • When HEVEA is given the command-line option -O, checking and optimisation of text-level elements in the whole document takes place. As a consequence, incorrect html introduced by using the rawhtml environment may be detected at a later stage, but this is far from being certain.

As a conclusion, do not use the rawhtml environment! A much safer option is to use the htmlonly environment and to write LATEX code. For instance, in place of writing:

\begin{rawhtml}
A list of links:
<ul>
<li><a href="http://www.apple.com/">Apple</a>.
<li><a href="http://www.sun.com/">Sun</a>.
</ul>
\end{rawhtml}

One can write:

\begin{htmlonly}
A list of links:
\begin{itemize}
\item \ahref{http://www.apple.com/}{Apple}.
\item \ahref{http://www.sun.com/}{Sun}.
\end{itemize}
\end{htmlonly}

A list of links:

If HEVEA is targeted to text or info files (see Section 11). The text inside rawhtml environments is ignored. However there exists a rawtext environment (and a \rawtextinput command) to echo text verbatim in text or info output mode. Additionally, the raw environment and a \rawinput command echo their contents verbatim, regardless of HEVEA output mode. Of course, when HEVEA produces html, the latter environment and command suffer from the same drawbacks as rawhtml.

8.5 Examples

As a first example of using internal macros, consider the following excerpt from the hevea.hva file that defines the center environment:

\newenvironment{center}{\@open{div}{style="text-align:center"}}{\@close{div}}

Notice that the code above is no longer present and is given here for explanatory purpose only. Now HEVEA uses style-sheets and the actual definition of the center environment is as follows:

\newstyle{.center}{text-align:center;margin-left:auto;margin-right:auto;}%
\setenvclass{center}{center}%
\newenvironment{center}
  {\@open{div}{\@getprint{class="\getenvclass{center}"}}
  {\@close{div}}%

Basically environments \begin{center}\end{center} will, by default, be translated into blocks <div class="center"></div>. Additionally, the style class associated to center environments is managed through an indirection, using the commands \setenvclass and \getenvclass. See section 9.3 for more explanations.

Another example is the definition of the \purple color declaration (see section 8.1.2):

\newcommand{\purple}{\@fontcolor{purple}}

HEVEA does not feature all text-level elements by default. However one can easily use them with internal macros. For instance this is how you can make all emphasised text blink:

\renewcommand{\em}{\@styleattr{em}{style="text-decoration:blink"}}

Here is an example of this questionable blinking feature:

Hello!

Then, here is the definition of a simplified \imgsrc command (see section 8.1.1), without its optional argument:

\newcommand{\imgsrc}[1]
  {\@print{<img src="}\@getprint{#1}\@print{">}}

Here, \@print and \@getprint are used to output html text, depending upon whether this text requires processing or not. Note that \@open{img}{src="#1"} is not correct, because the element img consists in a single tag, without a closing tag.

Another interesting example is the definition of the command \@doaelement, which HEVEA uses internally to output A elements.

\newcommand{\@doaelement}[2]
  {{\@nostyle\@print{<a }\@getprint{#1}\@print{>}}{#2}{\@nostyle\@print{</a>}}

The command \@doaelement takes two arguments: the first argument contains the opening tag attributes; while the second element is the textual content of the A element. By contrast with the \imgsrc example above, tags are emitted inside groups where styles are cancelled by using the \@nostyle declaration. Such a complication is needed, so as to avoid breaking proper nesting of text-level elements.

Here is another example of direct block opening. The bgcolor environment from the color package locally changes background color (see section B.14.2.1). This environment is defined as follows:

\newenvironment{bgcolor}[2][style="padding:1em"]
{\@open{table}{}\@open{tr}{}%
\@open{td}{\@addstyle{background-color:\@getcolor{#2}}{#1}}}
{\@close{td}\@close{tr}\@close{table}}

The bgcolor environment operates by opening a html table (table) with only one row (tr) and cell (td) in its opening command, and closing all these elements in its closing command. In my opinion, such a style of opening block-level elements in environment opening commands and closing them in environment closing commands is good style. The one cell background color is forced with a background-color property in a style attribute. Note that the mandatory argument to \begin{bgcolor} is the background color expressed as a high-level color, which therefore needs to be translated into a low-level color by using the \@getcolor internal macro from the color package. Additionally, \begin{bgcolor} takes html attributes as an optional argument. These attributes are the ones of the table element.

If you wish to output a given Unicode character whose value you know, the recommended technique is to define an ad-hoc command that simply call the \@print@u command. For instance, “blackboard sigma” is Unicode U+02140 (hexa). Hence you can define the command \bbsigma as follows:

\newcommand{\bbsigma}{\@print@u{X2140}}

Then, “\bbsigma” will output “⅀”

8.6 The document charset

According to standards, as far as I understand them, html pages are made of Unicode (ISO 10646) characters. By contrast, a file in any operating system is usually considered as being made of bytes.

To account for that fact, html pages usually specify a document charset that defines a translation from a flow of bytes to a flow of characters. For instance, the byte 0xA4 means Unicode 0x00A4 (¤) in the ISO-8859-1 (or latin1) encoding, and 0x20AC (€) in the ISO-8859-15 (or latin9) encoding. Notice that HEVEA has no difficulty to output both symbols, in fact they are defined as Unicode characters:

\newcommand{\textcurrency}{\@print@u{XA4}}
\newcommand{\texteuro}{\@print@u{X20AC}}

But the \@print@u command may output the specified character as a byte, when possible, by the means of the output translator. If not possible, \@print@u outputs a numerical character references (for instance &#X20AC;).

Of course, the document charset and the output translator must be synchronised. The command \@def@charset takes a charset name as argument and performs the operation of specifying the document character set and the output translator. It should occur in the document preamble. Valid charset names are ISO-8859-n where n is a number in 115, KOI8-R, US-ASCII (the default), windows-n where n is 1250, 1251, 1252 or 1257, or macintosh, or UTF-8. In case those charsets do not suffice, you may ask the author for other document charsets. Notice however that document charset is not that important, the default US-ASCII works everywhere! Input encoding of source files is another, although related, issue — see Section B.17.4.

If wished so, the charset can be extracted from the current locale environment, provided this yields a valid (to HEVEA) charset name. This operation is performed by a companion script: xxcharset.exe. It thus suffices to launch HEVEA as:

# hevea -exec xxcharset.exe other arguments

9 Support for style sheets

9.1 Overview

Starting with version 1.08, HEVEA offers support for style sheets (of the CSS variant see [CSS-2]).

Style sheets provide enhanced expressiveness. For instance, it is now possible to get “real” (whatever real means here) small caps in html, and in a relatively standard manner. There are other, discrete, maybe unnoticeable, similar enhancements.

However, style sheets mostly offer an additional mechanism to customise their documents to HEVEA users. To do so, users should probably get familiar with how HEVEA uses style sheets in the first place.

HEVEA interest for style sheets is at the moment confined to block-level elements (div, table, H<n>, etc.). The general principle is as follows: when a command or an environment gets translated into a block-level element, the opening tag of the block level element has a class="name" attribute, where name is the command or environment name.

As an example the LATEX command \subsection is implemented with the element h3, resulting in html output of the form:

    <h3 class="subsection">
    ...
    </h3>

By default, most styles are undefined, and default rendering of block-level elements applies. However, some packages (such as, for instance fancysection, see Section B.16.4) may define them. If you wish to change the style of section headers, loading the fancysection package may prove appropriate (see B.16.4). However, one can also proceed more directly, by appending new definitions to the document style sheet, with the command \newstyle. For instance, here is a \newstyle to add style for subsections.

  \newstyle{.subsection}{padding:1ex;color:navy;border:solid navy;}

This declaration adds some style element to the subsection class (notice the dot!): blocks that declare to belong to the class will show dark-blue text, some padding (space inside the box) is added and a border will be drawn around the block. These specification will normally affect all subsections in the document. Given the previous style definition, the sectioning command

\subsection*{A styled subsection heading}

should yield:

A styled subsection heading

The following points are worth noticing:

  • To yield some effect, \newstyle commands must appear in the document preamble, i.e. before \begin{document}.
  • Arguments to \newstyle commands are processed.
  • The hevea package defines all style sheet related commands as no-ops. Thus, these commands do not affect document processing by LATEX.

9.2 Changing the style of all instances of an environment

In this very document, all verbatim environments appear over a light green background, with small left and right margins. This has been performed by simply issuing the following command in the document preamble.

\newstyle{.verbatim}{margin:1ex 1ex;padding:1ex;background:\#ccffcc;}

Observe that, in the explicit numerical color argument above, the hash character “#” has to be escaped.

9.3 Changing the style of some instances of an environment

One can also change the style class attached to a given instance of an environment and thus control styling of environments more precisely.

As a matter of fact, the name of the class attribute of environment env is referred to through an indirection, by using the command \getenvclass{env}. The class attribute can be changed with the command \setenvclass{env}{class}. The \setenvclass command internally defines a command \env@class, whose content is read by the \getenvclass command. As a consequence, the class attribute of environments follows normal scoping rules. For instance, here is how to change the style of one verbatim environment.

{\setenvclass{verbatim}{myverbatim}
\begin{verbatim}
This will be styled through class 'myverbatim', introduced by:
\newstyle{.myverbatim}
  {margin:1ex 3x;padding:1ex;
   color:maroon;
   background:\@getstylecolor[named]{Apricot}}
\end{verbatim}}

Observe how the class of environment verbatim is changed from its default value to the new value myverbatim. The change remains active until the end of the current group (here, the “}” at the end). Then, the class of environment verbatim is restored to its default value — which happen to be verbatim.

This example also shows two new ways to specify colours in style definition, with a conventional html color name (here maroon) or as a high-level color (see Section B.14.2), given as an argument to the \@getstylecolor internal command (here Apricot from the named color model).

A good way of specifying style class changes probably is by defining new environments.

\newenvironment{flashyverbatim}
  {\setenvclass{verbatim}{myverbatim}\verbatim}
  {\endverbatim}

Then, we can use \begin{flashyverbatim}\end{flashyverbatim} to get verbatim environments style with the intended myverbatim style class.

This text is typeset inside the environment
\emph{flashyverbatim}, and hence with the \emph{myverbatim}
style.

9.4 Which class affects what

Generally, the styling of environment env is performed through the commands \getenvclass{env} and \setenvclass{env}{}, with \getenvclass{env} producing the default value of env.

Concretely, this means that most of the environments are styled through an homonymous style class. Here is a non-exhaustive list of such environments

figure, table, itemize, enumerate, list, description, trivlist, center, flushleft, flushright, quote, quotation, verbatim, abstract, mathpar (cf Section B.17.16), lstlisting (cf. Section B.17.14), etc.

All sectioning commands (\part, \section etc.) output H<n> block-level elements, which are styled through style classes named part, section, etc.

List making-environment introduce extra style classes for items. More specifically, for list-making environments itemize and enumerate, li elements are styled as follows:

<ul class="itemize">
<li class="li-itemize"> ...
</ul>
<ol class="enumerate">
<li class="li-enumerate"> ...
</ol>

That is, li elements are styled as environments, the key name being li-env.

The description, trivlist and list environments (which all get translated into DL elements) are styled in a similar way, internal DT and DD elements being styles through names dt-env and dd-env respectively.

9.5 A few examples

9.5.1 The title of the document

The command \maketitle formats the document title within a table element, with class title, for display. The name of the title is displayed inside block h1, with class titlemain, while all other information (author, date) are displayed inside block h3, with class titlerest.

<table class="title">
 <tr>
  <td style="padding:1ex">
   <h1 class="titlemain">..title here..</h1>
   <h3 class="titlerest">..author here..</h3>
   <h3 class="titlerest">..date here..</h3>
  </td>
 </tr>
</table>

Users can impact on title formatting by adding style in the appropriate style classes. For instance the following style class definitions:

\newstyle{.title}
  {text-align:center;margin:1ex auto;color:navy;border:solid navy;}
\newstyle{.titlerest}{font-variant:small-caps;}

will normally produce a title in dark blue, centered in a box, with author and date in small-caps.

Title

Date

Author

9.5.2 Enclosing things in a styled div

At the moment, due to the complexity of the task, environments tabular and array cannot be styled as others environments can be, by defining an appropriate class in the preamble. However, even for such constructs, limited styling can be performed, by using the divstyle environment. The opening command \begin{divstyle}{class} takes the name of a class as an argument, and translates to <div class="class">. Of course the closing command \end{divstyle} translates to </div>. The limitation is that the enclosed part may generate more html blocks, and that not all style attribute defined in class class class will apply to those inner blocks.

As an example consider the style class definition below.

\newstyle{.ruled}{border:solid black;padding:1ex;background:\#eeddbb;color:maroon}

The intended behaviour is to add a black border around the inner block (with some padding), and to have maroon text over a light brown background.

If we, for instance, enclose an itemize environment, the resulting effect is more or less what we have expected:

\begin{divstyle}{ruled}
\begin{itemize}
\item A ruled itemize
\item With two items.
\end{itemize}
\end{divstyle}
  • A ruled itemize
  • With two items.

However, enclosing a centered tabular environment in a divstyle{ruled} one is less satisfactory.

\begin{divstyle}{ruled}
\begin{center}\begin{tabular}{|c|c|}
\hline \bf English & \bf French\\ \hline
Good Morning & Bonjour\\ Thank You & Merci\\ Good Bye & Au Revoir\\ \hline
\end{tabular}\end{center}
\end{divstyle}
EnglishFrench
Good MorningBonjour
Thank YouMerci
Good ByeAu Revoir

In the html version of this document, one sees that the brown background extend on all the width of the displayed page.

This problem can be solved by introducing an extra table. We first open an extra centered table and then only open the divstyle environment.

\begin{center}\begin{tabular}{c}
\begin{divstyle}{ruled}
\begin{tabular}{|c|c|}
\hline \bf English & \bf French\\ \hline
Good Morning & Bonjour\\ Thank You & Merci\\ Good Bye & Au Revoir\\
\hline
\end{tabular}
\end{divstyle}
\end{tabular}\end{center}

This works because of the rules that govern the width of html table elements, which yield minimal width. This trick is used in numerous places by HEVEA, for instance in document titles, and looks quite safe.

EnglishFrench
Good MorningBonjour
Thank YouMerci
Good ByeAu Revoir

Another solution is to specify the display property of the styling div block as being inline-block:

\newstyle{.ruledbis}
  {border:solid black;padding:1ex;background:\#eeddbb;color:maroon;display:inline-block;}
EnglishFrench
Good MorningBonjour
Thank YouMerci
Good ByeAu Revoir

9.5.3 Styling the itemize environment

Our idea is highlight lists with a left border whose color fades while lists are nested. Such a design may be appropriate for tables of content, as the one of this document.

  • Part A
    • Chapter I
      • Section I.1
      • Section I.2
    • Chapter II
      • Section II.1
      • Section II.2
    • Chapter III
  • Part B
    • Chapter IV
      • Section IV.1
        • Section IV.1.a
        • Section IV.1.b
      • Section IV.2
    • Chapter V

The text above is typeset from the following LATEX source.

\begin{toc}
\item Part~A
\begin{toc}
\item Chapter~I
\begin{toc}
\item Section~I.1
\item Section~I.2
\end{toc}
  ...
\end{toc}
\end{toc}

For simplicity, we assume a limit of four over the nesting depth of toc environment. We first define four style classes toc1, toc2, toc3 and toc4 in the document preamble. Since those classes are similar, a command \newtocstyle is designed.

\newcommand{\newtocstyle}[2]
{\newstyle{.toc#1}{list-style:none;border-left:1ex solid #2;padding:0ex 1ex;}}
\newtocstyle{1}{\@getstylecolor{Sepia}}
\newtocstyle{2}{\@getstylecolor{Brown}}
\newtocstyle{3}{\@getstylecolor{Tan}}
\newtocstyle{4}{\@getstylecolor{Melon}}

The toc environment uses a counter to record nesting depth. Notice how the style class of the itemize environment is redefined before \begin{itemize}.

\newcounter{toc}
\newenvironment{toc}
{\stepcounter{toc}\setenvclass{itemize}{toc\thetoc}\begin{itemize}}
{\addtocounter{toc}{-1}\end{itemize}}

The outputted html is:

<ul class="toc1"><li class="li-itemize">
Part&nbsp;A
<ul class="toc2"><li class="li-itemize">
Chapter&nbsp;I
<ul class="toc3"><li class="li-itemize">
Section&nbsp;I.1
<li class="li-itemize">Section&nbsp;I.2
  ...
</ul>
</ul>

9.6 Miscellaneous

9.6.1 HACHA and style sheets

HACHA now produces an additional file: a style sheet, which is shared by all the html files produced by HACHA. Please refer to section 7.1 for details.

9.6.2 Producing an external style sheet

By default, style declarations defined with \newstyle go into the header of the html document doc.html. However, one can send those declaration into an external style file, whose name is doc.css. Then, HEVEA automatically relates doc.html to its style sheet doc.css. To achieve this behaviour, it suffices to set the value of the boolean register externalcss to true, by issuing the command \externalcsstrue in the preamble of the source document. Notice that HEVEA output still can be processed by HACHA, with correct behaviour.

9.6.3 Linking to external style sheets

The HEVEA command \loadcssfile{url} allows the user to link to an external style sheet (like the link option for HTML). The command takes an url of the external sheet as argument and emits the HTML text to link to the given external style sheet. As an example, the command

\loadcssfile{../abc.css}

produces the following html text in the head of the document.

  <link rel="stylesheet" type="text/css" href="../abc.css">

To yield some effect, \loadcssfile must appear in the document preamble. Several \loadcssfile commands can be issued. Then the given external style sheets appear in the output, following source order.

Notice that the argument to \loadcssfile is processed. Thus, if it contains special characters such as “#” or “$”, those must be specified as \# and \$ respectively. A viable alternative would be to quote the argument using the \url command from the url package (see Section B.17.12).

9.6.4 Limitations

At the moment, style class definitions cumulate, and appear in the style element in the order they are given in the document source. There is no way to cancel the default class definitions performed by HEVEA before it starts to process the user’s document. Additionally, external style sheets specified with \loadcssfile appear before style classes defined with \newstyle. As a consequence (if I am right), styles declared by \newstyle take precedence over those contained in external style sheets. Thus, using external style-sheets, especially if they alter the styling of elements, may produce awkward results.

Those limitations do not apply of course to style classes whose names are new, since there cannot be default definitions for them. Then, linking with external style sheets can prove useful to promote uniform styling of several documents produced by HEVEA.

10 Customising HEVEA

HEVEA can be controlled by writing LATEX code. In this section, we examine how users can change HEVEA default behaviour or add functionalities. In all this section we assume that a document doc.tex is processed, using a private command file macros.hva. That is, HEVEA is invoked as:

# hevea macros.hva doc.tex

The general idea is as follows: one redefines LATEX constructs in macros.hva, using internal commands. This requires a good working knowledge of both LATEX and html. Usually, one can avoid internal commands, but then, all command redefinitions interact, sometimes in very nasty ways.

10.1 Simple changes

Users can easily change the rendering of some constructs. For instance, assume that all quotations in a text should be emphasised. Then, it suffices to put the following re-declaration in macros.hva:

\renewenvironment{quote}
  {\@open{blockquote}{}\@style{em}}
  {\@close{blockquote}}

The same effect can be achieved without using any of the internal commands:

\let\oldquote\quote
\let\oldendquote\endquote
\renewenvironment{quote}{\oldquote\em}{\oldendquote}

In some sense, this second solution is easier, when one already knows how to customise LATEX. However, this is less safe, since the definition of \em can be changed elsewhere.

There is yet another solution that takes advantage of style sheets. One can also add this line to the macros.hva file:

\newstyle{.quote}{font-style:oblique;}

This works because the environment quote is styled through style class quote (see Section 9.2). Notice that this solution has very little to do with “emphasising” in the proper sense, since here we short-circuit the implicit path from \em to oblique fonts.

10.2 Changing defaults for type-styles

HEVEA default rendering of type style changes is described in section B.15.1. For instance, the following example shows the default rendering for the font shapes:

\itshape italic shape \slshape slanted shape
\scshape small caps shape \upshape upright shape

By default, \itshape is italics, \slshape is oblique italics, \scshape is small-caps (thanks to style sheets) and \upshape is no style at all. All shapes are mutually exclusive, this means that each shape declaration cancels the effect of other active shape declarations. For instance, in the example, small caps shapes is small caps (no italics here).

italic shape slanted shape small caps shape upright shape

If one wishes to change the rendering of some of the shapes (say slanted caps), then one should redefine the old-style \sl declaration. For instance, to render slanted as Helvetica (why so?), one should redefine \sl by \renewcommand{\sl}{\@span{style="font-family:Helvetica"}} in macros.hva.

And now, the shape example above gets rendered as follows:

italic shape slanted shape small caps shape upright shape

Redefining the old-style \sl is compatible with the cancellation mechanism, redefining \slshape is not. Thus, redefining directly LATEX 2є \slshape with \renewcommand{\slshape}{} would yield:

italic shape slanted shape small caps shape upright shape

Hence, redefining old-style declarations using internal commands should yield satisfactory output. However, since cancellation is done at the html level, a declaration belonging to one component may sometimes cancel the effect of another that belongs to another component. Anyway, you might have not noticed it if I had not told you.

10.3 Changing the interface of a command

Assume for instance that the base style of doc.tex is jsc (the Journal of Symbolic Computation style for articles). For running HEVEA, the jsc style can be replaced by article style, but for a few commands whose calling interface is changed. In particular, the \title command takes an extra optional argument (which HEVEA should ignore anyway). However, HEVEA can process the document as it stands. One solution to insert the following lines into macros.hva:

\input{article.hva}% Force document class 'article'
\let\oldtitle=\title
\renewcommand{\title}[2][]{\oldtitle{#2}}

The effect is to replace \title by a new command which calls HEVEA \title with the appropriate argument.

10.4 Checking the optional argument within a command

HEVEA fully implements LATEX 2є \newcommand. That is, users can define commands with an optional argument. Such a feature permits to write a \epsfbox command that has the same interface as the LATEX command and echoes itself as it is invoked to the image file. To do this, the HEVEA \epsfbox command has to check whether it is invoked with an optional argument or not. This can be achieved as follows:

\newcommand{\epsfbox}[2][!*!]{%
\ifthenelse{\equal{#1}{!*!}}
{\begin{toimage}\epsfbox{#2}\end{toimage}}%No optional argument
{\begin{toimage}\epsfbox[#1]{#2}\end{toimage}}}%With optional argument
\imageflush}

10.5 Changing the format of images

Semi-automatic generation of included images is described in section 6. Links to included images are generated by the \imageflush command, which calls the \imgsrc command:

\newcommand{\imageflush}[1][]
{\@imageflush\stepcounter{image}\imgsrc[#1]{\hevaimagedir\jobname\theimage\heveaimageext}}

That is, you may supply a html-style attribute to the included image, as an optional argument to the \imageflush command.

By default, images are PNG images stored in .png files. HEVEA provides support for the alternative GIF image file format. It suffices to invoke hevea as:

# hevea gif.hva doc.tex

Then imagen must be run with option -gif:

# imagen -gif doc

A convenient alternative is to invoke hevea as:

# hevea -fix gif.hva doc.tex

Then hevea will invoke imagen with the appropriate option when it thinks images need to be rebuild. An even more convenient alternative is to load gif.hva from within document source, for instance with the \usepackage command.

HEVEA also provides support for the alternative SVG image file format. As for GIF images, it is more convenient to use option -fix to combine hevea and imagen invocations:

# hevea -fix svg.hva doc.tex

Notice that imagen production chain of SVG images always call pdflatex, even when not given the -pdf command-line option. Hence the source code of images must be processable by pdflatex. This precludes using latex-only packages such as pstricks for instance.

As not all browsers display SVG images, hevea and imagen are bit special: imagen produces both PNG9 and SVG images; while hevea offers both image sources, letting client browser select the most appropriate one by the means of the srcset attribute of the img element.

10.6 Storing images in a separate directory

By redefining the \heveaimagedir command, users can specify a directory for images. More precisely, if the following redefinition occurs in the document preamble.

\renewcommand{\heveaimagedir}{dir}

Then, all links to images in the produced html file will be as “dir/…”. Then imagen must be invoked with option - todir:

# imagen -todir dir doc

As usual, hevea will invoke imagen with the appropriate option, provided it is passed the -fix option.

10.7 Controlling imagen from document source

The internal command \@addimagenopt{option} add the text option to imagen command-line options, when launched automatically by hevea (i.e. when hevea is given the -fix command-line option).

For instance, to instruct hevea/imagen to reduce all images by a factor of √2, it suffices to state:

%HEVEA\@addimagenopt{-mag 707}

See section C.1.5 for the list of command-line options accepted by imagen.


9
or GIF, if gif.hva is loaded

11 Other output formats

It is possible to translate LATEX file into other formats than html. There are two such formats: plain text and info files. This enables producing postscript, html, plain text and info manuals from one (LATEX) input file.

11.1 Text

The LATEX file is processed and converted into a plain text formatted file. It allows some pretty-printing in plain text.

To translate into text, invoke HEVEA as follow:

# hevea -text [-w <width>] myfile.tex

Then, HEVEA produces myfiles.txt a plain text translation of myfile.tex.

Additionally, the optional argument -w <number> sets the width of the output for text formatting. By default, The text will be 72 characters wide.

Nearly every environment has been translated, included lists and tables. The support is nearly the same as in html, excepted in some cases described hereafter.

Most style changes are ignored, because it is hardly possible to render them in plain text. Thus, there are no italics, bold fonts, underlinings, nor size change or colours… The only exception is for the verbatim environment that puts the text inside quotes, to distinguish it more easily.

Tables with borders are rendered in the same spirit as in LATEX. Thus for instance, it is possible to get vertical lines between some columns only. Table rendering can be poor in case of line overflow. The only way to correct this (apart from changing the tables themselves) is to adjust the formatting width, using the the -w command-line option.

For now, maths are not supported at all in text mode. You can get very weird results with in-text mathematical formulas. Of course, simple expressions such as subscripts remains readable. For instance, x2 will be rendered as x^2, but ∫01f(x)dx will yield something like : int01f(x)dx.

11.2 Info

The file format info is also supported. Info files are text files with limited hypertext links, they can be read by using emacs info mode or the info program. Please note that HEVEA translates plain LATEX to info, and not TeXinfo.

You can translate your LATEX files into info file(s) as follows:

# hevea -info [-w <width>] myfile.tex

Then, HEVEA produces the file myfile.info, an info translation of myfile.tex. However, if the resulting file is too large, it is cut into pieces automatically, and myinfo.info now contains references for all the nodes in the others files, which are named myfile.info-1, myfile.info-2,…

The optional argument -w has the same meaning as for text output.

The text will be organised in nodes that follow the pattern of LATEX sectioning commands. Menus are created to navigate through the sections easily

A table of content is produced automatically. References, indexes and footnotes are supported, as they are in html mode. However, the info format only allows pointers to info nodes, i.e. in HEVEA case, to sectional units. As a consequence all cross references lead to sectional unit headers.

Part B
Reference manual

This part follows the pattern of the LATEX reference manual [LATEX, Appendix C].

B.1 Commands and Environments

B.1.1 Command Names and Arguments

LATEX comments that start with “%” and end at end of line are ignored and produce no output. Usually, HEVEA ignore such comments. However, HEVEA processes text that follows “%HEVEA” and some other comments have a specific meaning to it (see section 5.3).

Command names follow strict LATEX syntax. That is, apart from #, $, ~, _ and ^, they either are “\” followed by a single non-letter character or “\” followed by a sequence of letters. Additionally, the letter sequence may be preceded by “@” (and this is the case of many of HEVEA internal commands), or terminated by “*” (starred variants are implemented as plain commands).

Users are strongly advised to follow strict LATEX syntax for arguments. That is, mandatory arguments are enclosed in curly braces {} and braces inside arguments must be properly balanced. Optional arguments are enclosed in square brackets []. However, HEVEA does its best to read arguments even when they are not enclosed in curly braces. Such arguments are a single, different from “\”, “{” and “ ”, character or a command name. Thus, constructs such as \'ecole, $a_1$ or $a_\Gamma$ are recognized and processed as école a1 and aΓ. By contrast, a^\mbox{...} is not recognized and must be written a^{\mbox{...}}.

Also note that, by contrast with LATEX, comments are parsed during argument scanning, as an important consequence brace nesting is also checked inside comments.

With respect to previous versions, HEVEA has been improved as regards emulation of complicated argument passing. That is, commands and their arguments can now appear in different static text bodies. As a consequence, HEVEA correctly processes the following source:

\newcommand{\boite}{\textbf}
\boite{In bold}

The definition of \boite makes it reduces as \textbf and HEVEA succeeds in fetching the argument “{In bold}”. We get

In bold

The above example arguably is no “legal” LATEX, but HEVEA handles it. Of course, there remains numerous “clever” LATEX tricks that exploits TEX internal behaviour, which HEVEA does not handle. For instance consider the following source:

\newcommand{\boite}[1]{\textbf#1}
\boite{{In bold}, Not in Bold.}

LATEX typesets the text “In bold” using bold font, leaving the rest of the text alone. While HEVEA typesets everything using bold font. Here is HEVEA output:

In bold, Not in Bold.

Note that, in most similar situations, HEVEA will likely crash.

As a conclusion of this important section, Users are strongly advised to use ordinary command names and curly braces and not to think too much the TEX way.

B.1.2 Environments

Environment opening and closing is performed like in LATEX, with \begin{env} and \end{env}. The *-form of an environment is a plain environment.

It is not advised to use \env and \endenv in place of \begin{env} and \end{env}.

B.1.3 Fragile Commands

Fragile commands are not relevant to HEVEA and \protect is defined as a null command.

B.1.4 Declarations

Scope rules are the same as in LATEX.

B.1.5 Invisible Commands

I am a bit lost here. However spaces in the output should correspond to users expectations. Note that, to HEVEA being invisible commands is a static property attached to command name.

B.1.6 The \\ Command

The \\ and \\* commands are the same, they perform a line break, except inside arrays where they end the current row. Optional arguments to \\ and \\* are ignored.

B.2 The Structure of the Document

Document structure is a bit simplified with respect to LATEX, since documents consist of only two parts. The preamble starts as soon as HEVEA starts to operate and ends with the \begin{document} construct. Then, any input occurring before \end{document} is translated to html. However, the preamble is processed and the preamble comprises the content of the files given as command-line arguments to HEVEA, see section C.1.1.1). As a consequence, command and environment definitions that occur before \begin{document} are performed. and they remain valid during all the processing.

In particular one can define a header and a footer, by using the \htmlhead and \htmlfoot commands in the preamble. Those commands register their argument as the header and the footer of the final html document. The header appears first while the footer appears last in (visible) html output. This is mostly useful when HEVEA output is later cut into pieces by HACHA, since both header and footer are replicated at the start and end of any file generated by HACHA. For instance, to append a copyright notice at the end of all the html pages, it suffices to invoke the \htmlfoot command as follows in the document preamble:

\htmlfoot{\copyright to me}

The \htmlhead command cannot be used for changing anything outside of the html document body, there are specific commands for doing this. Those command must be used in the document preamble. One can change HEVEA default (empty) attribute of the opening <body ...> tag by redefining \@bodyargs. For instance, you get black text on a white background, when the following declaration occurs before \begin{document}:

\renewcommand{\@bodyargs}{style="color:black;background:white"}

Since version 1.08, a recommended alternative is to use style sheets:

\newstyle{body}{color:black; background:white;}

One can also change the default (empty) attribute of the opening <html ...> tag by redefining \@htmlargs. For instance you can set the language attribute of the whole document by issuing the following redefinition in the document preamble:

\renewcommand{\@htmlargs}{lang=en}

Similarly, some elements can be inserted into the output file head element by redefining the \@meta command (Such elements typically are meta, link, etc.). As such text is pure html, it should be included in a rawhtml environment. For instance, you can specify author information as follows:

\let\oldmeta=\@meta
\renewcommand{\@meta}{%
\oldmeta
\begin{rawhtml}
<meta name="Author" content="Luc Maranget">
\end{rawhtml}}

Note how \@meta is first bound to \oldmeta before being redefined and how \oldmeta is invoked in the new definition of \@meta. Namely, simply overriding the old definition of \@meta would imply not outputting default meta-information.

The \@charset command holds the value of the (html) document character set. By default, this value is US-ASCII. In previous versions of HEVEA, one could change the value of the document character set by simply redefining \@charset. Then, it was users responsability to provide a (LATEX) document in the correspounding encoding. This is no longer so, and users should not redefine \@charset directly. Please, see Section 8.6 for details.

B.3 Sentences and Paragraphs

B.3.1 Spacing

Generally speaking, spaces (and single newline characters) in the source are echoed in the output. Browser then manage with spaces and line-breaks. Following LATEX behaviour, spaces after commands are not echoed. Spaces after invisible commands with arguments are not echoed either.

However this is no longer true in math mode, see section B.7.7 on spaces in math mode.

B.3.2 Paragraphs

New paragraphs are introduced by one blank line or more. Paragraphs are not indented. Thus the macros \indent and \noindent perform no action. Paragraph are rendered by p elements. In some occasions, this technique may produce spurious paragraphs (see 3.1.1).

B.3.3 Footnotes

The commands \footnote, \footnotetext and \footnotemark (with or without optional arguments) are supported. The footnote counter exists and (re)setting it or redefining \thefootnote should work properly. When footnotes are issued by a combination of \footnotemark and \footnotetext, a \footnotemark command must be issued first, otherwise some footnotes may get numbered incorrectly or disappear. Footnotes appear at document end in the article style and at chapters end in the book style. See section 7.3.7 for a description of how footnotes are flushed.

B.3.4 Accents and special symbols

Thanks to Unicode character references, HEVEA can virtually output any symbol. It may happen that HEVEA does not known about a particular symbol, that is, most of the time, HEVEA does not known about a particular command. In that case a warning is issued to draw user attention. Users can then choose a particular symbol amongst the recognized ones, or as an explicit Unicode character reference (see Section 4.2 for an example of this technique).

Commands for making accents used in non-English languages, such as \', work when applied to accent-less (i.e. ascii) letters and that the corresponding accented letters exist in the Unicode character set. Otherwise, the argument to the command is not modified and a warning is issued. For instance, consider the following source code, where, after a legitimate use of acute accents, one attempt to put an accute accent over the letter “h”:

``\'Ecole'' works as in \LaTeX, while ``\'h'' does not.

HEVEA output will be “École” works as in LATEX, while “h” does not. And a warning will be issued.

./tmp.tex:3741: Warning: Application of '\'' on 'h' failed

Observe that using input encodings is a convenient alternative to accent commands — see Section B.17.4.

B.4 Sectioning

B.4.1 Sectioning Commands

Sectioning commands from \part down to \subparagraph are defined in base style files. They accept an optional argument and have starred versions.

The non-starred sectioning commands from \part down to \subsubsection show section numbers in sectional unit headings, provided their level is greater than or equal to the current value of the secnumdepth counter. Sectional unit levels and the default value of the secnumdepth counter are the same as in LATEX. Furthermore, given a sectional unit secname, the counter secname exists and the appearance of sectional units numbers can be changed by redefining \thesecname. For instance, the following redefinition turn the numbering of chapters into alphabetic (uppercase) style:

\renewcommand{\thechapter}{\Alph{chapter}}

When jumping to anchors, browsers put the targeted line on top of display. As a consequence, in the following code:

\section{A section}
\label{section:section}
 ...
See Section~\ref{section:section}

Clicking on the link produced by \ref{section:section} will result in not displaying the targeted section title. A fix is writing:

\section{\label{section:section}A section}
 ...
See Section~\ref{section:section}

Starting with version 2.04, HEVEA and HACHA will use the label name (section:section above) for the table of contents they generate. For instance, the source code for the next sectioning command just below is:

\subsection{The \label{appendix}Appendix}

As a consequence, the link to the next section on top of this page should read as:

<a href="sectioning.html#appendix">The Appendix</a>

That is, HEVEA used the label name given in source as an anchor. Notice that this behaviour applies to the \label command that occurs first in the sectioning command argument.

B.4.2 The Appendix

The \appendix command exists and should work as in LATEX.

B.4.3 Table of Contents

HEVEA now generates a table of contents, using a procedure similar to the one of LATEX(a .htoc file is involved). One inserts this table of contents in the main document by issuing the command \tableofcontents. Table of contents is controlled by the counter tocdepth. By default, the table of contents shows sectioning units down to the subsubsection level in article style and down to the subsection level in book (or report) style. To include more or less sectioning units in the table of contents, one should increase or decrease the tocdepth counter. It is important to notice that HEVEA produces such a table of contents, only when it has total control over cross-references. More precisely, HEVEA cannot produce the table of contents when it reads LATEX-produced .aux files. Instead, it should read its own .haux files. This will naturally occur if no .aux files are present, otherwise these .aux files should be deleted, or HEVEA should be instructed not to read them with the command-line option -fix (see Sections B.11.1 and  C.1.1.4).

One can also add extra entries in the table of contents by using the command \addcontentslines, in a way similar to LATEX homonymous command. However, hyperlinks need to be introduced explicitly, as in the following example, where an anchor is defined in the section title and referred to in the argument to \addcontentsline:

\subsection*{\aname{no:number}{Use \hacha{}}}
\addcontentsline{toc}{subsection}{\ahrefloc{no:number}{Use \hacha{}}}

(See Section 8.1.1 for details on commands related to hyperlinks.)

There is no list of figures nor list of tables.

Use HACHA

However, HEVEA has a more sophisticated way of producing a kind of map w.r.t. the sectioning of the document. A later run of HACHA on HEVEA output file splits it in smaller files organized in a tree whose nodes are tables of links. By contrast with LATEX, starred sectioning commands generate entries in these tables of contents. Table of contents entries hold the optional argument to sectioning commands or their argument when there is no optional argument. Section 7 explains how to control HACHA.

B.5 Classes, Packages and Page Styles

B.5.1 Document Class

Both LATEX 2є \documentclass and old LATEX \documentstyle are accepted. Their argument style is interpreted by attempting to load a style.hva file. Presently, only the style files article.hva, seminar.hva, book.hva and report.hva exist, the latter two being equivalent.

If one of the recognized styles has already been loaded at the time when \documentclass or \documentstyle is executed, then no attempt to load a style file is made. This allows to override the document style file by giving one of the four recognized style files of HEVEA as a command line argument (see 2.2).

Conversely, if HEVEA attempt to load style.hva fails, then a fatal error is flagged, since it can be sure that the document cannot be processed.

B.5.2 Packages and Page Styles

HEVEA reacts to \usepackage[options]{pkg} in the following way:

  1. The whole \usepackage command with its arguments gets echoed to the image file (see 6).
  2. HEVEA attempt to load file pkg.hva, (see section C.1.1.1 on where HEVEA searches for files).

Note that HEVEA will not fail if it cannot load pkg.hva and that no warning is issued in that case.

The HEVEA distribution contains implementations of some packages, such as verbatim, colors, graphics, etc.

In some situations it may not hurt at all if HEVEA does not implement a package, for instance HEVEA does not provide an implementation for the fullpage package.

Users needing an implementation of a package that is widely used and available are encouraged to contact the author. Experienced users may find it fun to attempt to write package implementations by themselves.

B.5.3 The Title Page and Abstract

All title related commands exist with the following peculiarities:

  • The argument of the \title command appears in the html document header. As a consequence titles should remain simple. Normal design (as regards HEVEA) is for \title to occur in the document preamble, so that the title is known at the time when the document header is emitted, this is, while processing \begin{document}. However, there are two subtleties.
    1. If no \title command occurs in document preamble and that one \title command appears in the document, then the title is saved into the .haux file for the next run of HEVEA to put it in the html document header.
    2. If \title commands are present both in preamble and after \begin{document} the former takes precedence.
  • When not present the date is left empty. The \today command generates will work properly only if hevea is invoked with the -exec xxdate.exe option. Otherwise \today generates nothing and a warning is issued.

The abstract environment is present in all base styles, including the book style. The titlepage environment does nothing.

HEVEA places the \title argument into an h1-element with class titlemain and puts the arguments of \author and \date into a h3-element with class titlerest. The abstract goes into a blockquote-element with class abstract.

B.6 Displayed Paragraphs

Displayed-paragraph environments translate to block-level elements.

In addition to the environments described in this section, HEVEA implements the center, flushleft and flushright environments. HEVEA also implements the corespondant TEX style declaration \centering \raggedright and \raggedleft, but these declarations may not work as expected, when they do not appear directly inside a displayed-paragraph environment or inside an array element.

B.6.1 Quotation and Verse

The quote and quotation environments are similar; they translate to BLOCKQUOTE elements with associated classes quote and quotation, respectively.

The verse environment is supported as BLOCKQUOTE element with class verse.

B.6.2 List-Making environments

The itemize, enumerate and description environments translate to the ul, ol, and DL elements and this is the whole story.

As a consequence, no control is allowed on the appearances of these environments. More precisely optional arguments to \item do not function properly inside itemize and enumerate. Moreover, item labels inside itemize or numbering style inside enumerate are browser dependent.

However, customized lists can be produced by using the the list environment (see next section).

B.6.3 The list and trivlist environments

The list environment translates to the DL element. Arguments to \begin{list} are handled as follows:

\begin{list}{default_label}{decls}

The first argument default_label is the label generated by an \item command with no argument. The second argument, decls is a sequence of declarations. In practice, the following declarations are relevant:

\usecounter{counter}
The counter counter is incremented by \refstepcounter by every \item command with no argument, before it does anything else.
\renewcommand{\makelabel}[1]{}
The command \item executes \makelabel{label}, where label is the item label, to print its label. Thus, users can change label formatting by redefining \makelabel. The default definition of \makelabel simply echoes label.

As an example, a list with an user-defined counter can be defined as follows:

\newcounter{coucou}
\begin{list}{\thecoucou}{%
\usecounter{coucou}%
\renewcommand{\makelabel}[1]{\textbf{#1}.}}
...
\end{list}

This yields:

1.
First item.
2.
Second item.

The trivlist environment is also supported. It is equivalent to the description environment.

B.6.4 Verbatim

The verbatim and verbatim* environments translate to the PRE elements. Inside verbatim*, spaces are replaced by visual spaces (“”). Similarly, \verb and \verb* translate to CODE text elements. The environments are associated with CSS classes of the same names, this is, verbatim and \verb, respectively.

The alltt environment is supported.

B.7 Mathematical Formulae

B.7.1 Math Mode Environment

The three ways to use math mode ($$, \(\) and \begin{math}\end{math}) are supported. The three ways to use display math mode ($$$$, \[\] and \begin{displaymath}\end{displaymath}) are also supported. Furthermore, \ensuremath behaves as expected.

The equation, eqnarray, eqnarray* environments are supported. Equation labelling and numbering is performed in the first two environments, using the equation counter. Additionally, numbering can be suppressed in one row of an eqnarray, using the \nonumber command.

Math mode is not as powerful in HEVEA as in LATEX. The limitations of math mode can often be surpassed by using math display mode. As a matter of fact, math mode is for in-text formulas. From the html point of view, this means that math mode does not close the current flow of text and that formulas in math mode must be rendered using text-level elements only. By contrast, displayed formulas can be rendered using block-level elements. This means that HEVEA have much more possibilities in display context than inside normal flow of text. In particular, stacking text elements one above the over is possible only in display context. For instance compare how HEVEA renders $\frac{1}{\sum_{i=1}^{\infty} i$ as: 1/∑i=1 i, and $$\frac{1}{\sum_{i=1}^{\infty} i$$ as:

1
i=1
i

B.7.2 Common Structures

HEVEA admits, subscript (_), superscripts (^) and fractions (\frac{numer}{denom}). The best effect is obtained in display mode, where html table element is extensively used. By contrast, when not in display mode, HEVEA uses only SUB and SUP text-level elements to render superscrits and subscript, and the result may not be very satisfying.

However, simple subscripts and superscripts, such as x_i or x^2, are always rendered using the SUB and SUP text-level elements and their appearance should be correct even in in-text formulas.

When occurring outside math mode, characters _ and ^ act as ordinary characters and get echoed to the output. However, a warning is issued.

An attempt is made to render all ellipsis constructs (\ldots, \cdots, \vdots and \ddots). The effect may be strange for the latter two.

B.7.3 Square Root

The nth root command \sqrt is supported only for n=3,4, thanks to the existence of Unicode characters for the same. For the others, we shift to fractional exponents, in which case, the \sqrt command is defined as follows:

\newcommand{\sqrt}[3][2]{\left(#2\right)^{1/#1}}

Then, the source fragment: $$\sqrt[5]{\frac{1}{n!}} + \sqrt[3]{\pi} + \sqrt{\pi}$$ gets rendered as follows:




1
n!



1
5



 
 + 
π
 + 
π

B.7.4 Unicode and mathematical symbols

The support for unicode symbols offered by modern browsers allows to translate almost all math symbols correctly.

Log-like functions and variable sized-symbols are recognized and their subscripts and superscripts are put where they should in display mode. Subscript and superscript placement can be changed using the \limits and \nolimits commands. Big delimiters are also handled.

B.7.5 Putting one thing above/below/inside

The commands \stackrel, \underline and \overline are recognized. They produce sensible output in display mode. In text mode, these macros call the \textstackrel, \textunderline and \textoverline macros. These macros perform the following default actions

\textstackrel
Performs ordinary superscripting.
\textunderline
Underlines its argument, using the U text-level element.
\textoverline
Overlines using style-sheets (used <SPAN> with a top border).

The command \boxed works well both in display and normal math mode. Input of the form \boxed{\frac{\pi}{2}} produces π/2 in normal math, and

π/2

in display-math mode. The commands \bigl,\bigr etc. are also rendered well. Some examples can be found here.

B.7.6 Math accents

Math accents that have coresponding text accents (\hat, \tilde, etc.) are handled by default. They in fact act as the corresponding text-mode accents (Section B.3.4). As a consequence, they work properly only on ascii letters. This may be quite cumbersome, but at least some warnings draw user’s attention on the problem. If accents are critical to your document and that HEVEA issues a lot of warnings, a solution is to redefine the math accent command. A suggested replacement is using limit superscripts. That way accents are positioned above symbols in display mode and after symbols in text mode.

\renewcommand{\hat}[1]{\mathop{#1}\limits^{\textasciicircum}\nolimits}
Displayed:
$$
\hat{\mu} = \hat{\Delta}.
$$
In text: $\hat{\mu} = \hat{\delta}$

An you get, displayed:

^
µ
 
 = 
^
Δ
 
.

In text: µ^ = δ^.

Whereas, with the default of \hat being \^, you get “µ = δ”, with the following warnings:

./tmp.tex:4652: Warning: Application of '\^' on '\mu' failed
./tmp.tex:4652: Warning: Application of '\^' on '\delta' failed

The \vec command is rendered differently in display and non-display mode. In display mode, the arrow appears in normal position, while in non-display the arrow appears as an ordinary superscript.

\vec{u} in text mode: u,  \vec{u} in display mode: 
u
 

Most “extensible accents” (\widetilde, \widehat, etc.) are not even defined. There are a few exceptions: line “accents”:

  
abc
\underline
  
abc
\overline

Brace “accents”:

  
 
1 × 2 × ⋯ × n


\underbrace
  


1 × 2 × ⋯ × n
 
\overbrace

And arrow “accents”:

  

1 × 2 × ⋯ × n
 
\overleftarrow
  

1 × 2 × ⋯ × n
 
\overrightarrow

B.7.7 Spacing

By contrast with LATEX, space in the input matters in math mode. One or more spaces are translated to one space. Furthermore, spaces after commands (such as \alpha) are echoed except for invisible commands (such as \tt). This allows users to control space in their formulas, output being near to what can be expected.

Explicit spacing commands (\,, \!, \: and \;) are recognized, the first two commands do nothing, while the others two output one space.

B.7.8 Changing Style

Letters are italicized inside math mode and this cannot be changed. The appearance of other symbols can be changed using LATEX 2є style changing commands (\mathbf, etc.). The commands \boldmath and \unboldmath are not recognized. Whether symbols belonging to the symbol font are affected by style changes or not is browser dependent.

The \cal declaration and the \mathcal command (that yield calligraphic letters in LATEX) exist. They yield red letters by default.

Observe that this does not corresponds directly to how LATEX manage style in math mode and that, in fact, style cannot really change in math mode.

Math style changing declarations \displaystyle and \textstyle do nothing when HEVEA is already in the requested mode, otherwise they issue a warning. This is so because HEVEA implements displayed maths as tables, which require to be both opened and closed and introduce line breaks in the output. As a consequence, warnings on \displaystyle are to be taken seriously.

The commands \scriptstyle and \scriptscriptstyle perform type size changes.

B.8 Definitions, Numbering

B.8.1 Defining Commands

HEVEA understands command definitions given in LATEX style. Such definitions are made using \newcommand, \renewcommand and \providecommand. These three constructs accept the same arguments and have the same meaning as in LATEX, in particular it is possible to define an user command with one optional argument. However, HEVEA is more tolerant: if command name already exists, then a subsequent \newcommand{name}…is ignored. If macro name does not exists, then \renewcommand{name}…performs a definition of name. In both cases, LATEX would crash, HEVEA just issues warnings.

The behaviour of \newcommand allows to shadow document definition, provided the new definitions are processed before the document definitions. This is easily done by grouping the shadowing definition in a specific style file given as an argument to HEVEA (see section 5.1). Conversely, changes of base macros (i.e. the ones that HEVEA defines before loading any user-specified file) must be performed using \renewcommand.

Scoping rules apply to macros, as they do in LATEX. Environments and groups define a scope and command definition are local to the scope they occur.

It is worth noticing that HEVEA also partly implements TEX definitions (using \def) and bindings (using \let), see section B.16.1 for details.

B.8.2 Defining Environments

HEVEA accepts environment definitions and redefinitions by \newenvironment and \renewenvironment. The support is complete and should conform to [LATEX, Sections C.8.2].

Environments define a scope both for commands and environment definitions.

B.8.3 Theorem-like Environments

New theorem-like environments can also be introduced and redefined, using \newtheorem and \renewtheorem.

Note that, by contrast with plain environments definitions, theorem-like environment definitions are global definitions.

B.8.4 Numbering

LATEX counters are (fully ?) supported. In particular, defining a counter cmd with \newcounter{cmd} creates a macro \thecmd that outputs the counter value. Then the \thecmd command can be redefined. For instance, section numbering can be turned into alphabetic style by:

\renewcommand{\thesection}{\alph{section}}

Note that TEX style for counters is not supported at all and that using this style will clobber the output. However, HEVEA implements the calc package that makes using TEX style for counters useless in most situations (see section B.17.3).

B.8.5 The ifthen Package

The ifthen package is partially supported. The one unsupported construct is the \lengthtest test expression, which is undefined.

As a consequence, HEVEA accepts the following example from the LATEX manual:

\newcounter{ca}\newcounter{cb}%
\newcommand{\printgcd}[2]{%
  \setcounter{ca}{#1}\setcounter{cb}{#2}%
  Gcd(#1,#2) =
  \whiledo{\not\(\value{ca}= \value{cb}\)}%
    {\ifthenelse{\value{ca}>\value{cb}}%
      {\addtocounter{ca}{-\value{cb}}}%
      {\addtocounter{cb}{-\value{ca}}}%
    gcd(\arabic{ca}, \arabic{cb}) = }%
  \arabic{ca}.}%
For example: \printgcd{54}{30}

For example: Gcd(54,30) = gcd(24, 30) = gcd(24, 6) = gcd(18, 6) = gcd(12, 6) = gcd(6, 6) = 6.

Additionally, a few boolean registers are defined by HEVEA. Some of them are of interest to users.

hevea
Initial value is true. The hevea.sty style file also defines this register with initial value false.
mmode
This register value reflects HEVEA operating mode, it is true in math-mode and false otherwise.
display
This register value reflects HEVEA operating mode, it is true in display-mode and false otherwise.
footer
Initial value is true. When set false, HEVEA does not insert its footer “This document has been translated by HEVEA”.

Finally, note that HEVEA also recognised à la TEX conditional macros (see section B.16.1.4). Such macros are fully compatible with the boolean registers of the ifthen package, as it is the case in LATEX.

B.9 Figures, Tables, and Other Floating Bodies

B.9.1 Figures And Tables

Figures and tables are put where they appear in the source (location “h”), regardless of their placement arguments. HEVEA wraps them in BLOCKQUOTE elements that are associated with CSS classes figure and table respectively. Figures and tables are separated from enclosing text by two horizontal rules (CSS class floatrule). If the capabilities of floatrule prove insufficient users can create their own separators by defining the parameter-less macro \floatseparator, like for example,

\newcommand{\floatseparator}{\begin{center}\ast\end{center}}

or even drop them completely by supplying an empty expansion and thereby recover the original LATEX layout.

Captions and cross referencing are handled. However, captions are not moved at end of figures or tables: instead, they appear where the \caption commands occur in source.

The \suppressfloats command does nothing; the figure related counters (such as topnumber) exist but are useless.

B.9.2 Footnotes

The basics of footnotes are discussed in section B.3.3.

HEVEA puts the text of every footnote in a block associated with CSS class footnotetext. The rule that separates the body text from the footnotes can by styled with CSS class footnoterule.

B.9.3 Marginal Notes

Marginal notes go in the right margin by default. To get marginal notes in the left margin, use \reversemaginpar. Marginal notes are handled in an HEVEA specific way. By default, all notes go in the right margin. Issuing \reversemarginpar causes the notes to go in the left margin. Unsurprisingly, issuing \normalmarginpar reverts to default behaviour.

The \marginpar command has an optional argument.

\marginpar[left_text]{right_text}

If optional argument left_text is present and that notes go in the left margin, then left_text is the text of the note. Otherwise, right_text is the text of the note. As a conclusion, marginal notes in HEVEA always go to a fixed side of the page, which side being controlled by the commands \normalmarginpar (right side) and \reversemarginpar (left side). This departs form LATEX that selects a default side depending on the parity of the page counter.

Marginal notes are styled by the means of two environment style classes (see Section 9.3) : marginpar and marginparside. The latter marginparside takes care of margins and placement as a float, its value is marginparright for notes in the right margin and marginparleft for notes in the left margin. Users are not expected to alter those. The marginpar environment style class governs the general aspect of all marginal notes. Users can control the aspect of all marginal notes by defining a new style class and assigning the marginpar environment style class. For instance, to get all marginal notes in red font, and taking 10% of the page width (in place of the default 20%), one can issue the following commands in the document preamble.

\newstyle{.mynote}{width:10\%; color:red;}
\setenvclass{marginpar}{mynote}

B.10 Lining It Up in Columns

B.10.1 The tabbing Environment

Limited support is offered. The tabbing environment translate to a flexible tabular-like environment. Inside this environment, the command \kill ends a row, while commands \= and \> start a new column. All other tabbing commands do not even exist.

B.10.2 The array and tabular environments

These environments are supported, using html table element, rendering is satisfactory in most (not too complicated) cases. By contrast with LATEX, some of the array items always are typeset in display mode. Whether an array item is typeset in display mode or not depends upon its column specification, the l, c and r specifications open display mode while the remaining p and @ do not. The l, c,r and @ specifications disable word wrap, while the p specification enables it.

Entries in a column whose specification is l (resp. c or r) get left-aligned (resp. centered or right-aligned) in the horizontal direction. They will get top-aligned in the vertical direction if there are other column specifications in the same array that specify vertical alignment constraints (such as p{wd}, see below). Otherwise, vertical alignment is unspecified.

Entries in a column whose specification is p{wd} get left-aligned in the horizontal direction and top-aligned in the vertical direction and a paragraph break reduces to one line break inside them. This is the only occasion where HEVEA makes a distinction between LR-mode and paragraph mode. Also observe that the length argument wd to the p specification is ignored.

Some LATEX array features are not supported at all:

  • Optional arguments to \begin{array} and \begin{tabular} are ignored.
  • The command \vline does not exists.

Some others are partly rendered:

  • Spacing between columns is different.
  • @ formatting specifications in \multicolumn argument are ignored.
  • If a | appears somewhere in the column formatting specification, then the array is shown with borders.
  • The command \hline does nothing if the array has borders (see above). Otherwise, an horizontal rule is outputted.
  • The command \cline ignores its argument and is equivalent to \hline.
  • Similarly the command \extracolsep issues a warning and ignores its argument.

Additionally, the tabular* environment is recognised and gets rendered as an html table with an advisory width attribute.

By default, HEVEA implements the array package (see [LATEX-bis, Section 5.3] and section B.17.2 in this document), which significantly extends the array and tabular environments.

B.11 Moving Information Around

B.11.1 Files

In some situations, HEVEA uses some of the ancillary files generated by LATEX. More precisely, while processing file doc.tex, the following files may be read:

.aux
The file doc.aux contains cross-referencing information, such as figure or section numbers. If this file is present, HEVEA reads it and put such numbers (or labels) inside the links generated by the \ref command. If the .aux file is not present, or if the hevea command is given the -fix option, HEVEA will instead use .haux files.
.haux
Such files are HEVEA equivalents of .aux files. Indeed, they are .aux files tailored to HEVEA needs. Two runs of HEVEA might be needed to get cross references right.
.htoc
This file contains a formatted table of contents. It is produced while reading the .haux file. As consequence a table of contents is available only when the .haux file is read.
.hbbl
The doc.hbbl file is generated by bibhva from doc.haux. When present, it is read by the \bibliography command.
.bbl
The doc.bbl file is generated by BibTEX from doc.aux. When present, and if no doc.hbbl exists, doc.bbl is read by the \bibliography command.
.hidx and .hind
HEVEA computes its own indexes, using .hidx files for storing index references and, using .hind files for storing formatted indexes. Index formatting significantly departs from the one of LATEX. Again, several runs of HEVEA might be needed to get indexes right.

HEVEA does not fail when it cannot find an auxiliary file. When another run of HEVEA is needed, a warning is issued, and it is user’s responsibility to rerun HEVEA. However, the convenient -fix command-line option instructs HEVEA to rerun itself, until it believes it has reached stable state.

B.11.2 Cross-References

The LATEX commands \label and \ref are changed by HEVEA into html anchors and local links, using the “a” element. Additionally, numerical references to sectional units, figures, tables, etc. are shown, as they would appear in the .dvi file. Numerical references to pages (such as generated by \pageref) are not shown; only an link is generated.

The anchor used is the label argument to \label{label}. More precisely, \label{label} translates to <a id="label"></a>; while \ref{label} translates to <a name="#label">nnn</a>, where nnn is the appropriate numerical reference to a section. As a consequence spaces are better avoided in label.

Starting with HEVEA version 2.04, the html anchors used by \label and \ref cannot differ from the arguments to these commands anymore. Moreover, when \label{label} occurs inside the argument of a sectioning command (i.e. in section title, as recommended by section B.4.1), then HEVEA and HACHA will use label as the “id” attribute of the corresponding section. For instance, the LATEX source of this very section is:

\subsection{Cross-References\label{cross-reference}}

It translates to html similar to

<h3 class="subsection" id="cross-reference">B.11.2&#XA0;&#XA0;Cross-References</h3>

Notice that no <a id="cross-reference"></a> appears above. Instead id="cross-reference" appears in the enclosing h3 header element.

While processing a document doc.tex, cross-referencing information can be computed in two different, mutually exclusive, ways, depending on whether LATEX has been previously run or not:

  • If there exists a file doc.aux and that hevea has not been given the command-line option -fix, then cross-referencing information is extracted from that file. Of course, the doc.aux file has to be up-to-date, that is, it should be generated by running LATEX as many times as necessary. (For HEVEA needs, one run is probably sufficient).
  • If no doc.aux file exists or if hevea has been given the -fix command-line option, then HEVEA expect to find cross-referencing information in the file doc.haux.

The second option is recommended.

When using its own doc.haux file, HEVEA will output a new doc.haux file at the end of its processing. This new doc.haux file contains actualised cross referencing information. Hence, in that case, HEVEA may need to run twice to get cross-references right. Note that, just like LATEX, HEVEA issues a warning then the cross-referencing information it generates differs from what it has read at start-up, and that it does not fail if doc.haux does not exist.

Observe that if a non-correct doc.aux file is present, then cross-references will apparently be wrong. However the links are correct.

B.11.3 Bibliography and Citations

The \cite macro is supported. Its optional argument is correctly handled. Citation labels are extracted from the .aux file if present, from the .haux file otherwise. Note that these labels are put there by LATEX in the first case, and by HEVEA in the second case, when they process the \bibitem command.

Using BibTEX

All BibTEX related commands exist and echo the appropriate information into the .haux file.

In particular, the \bibliography command exists and attempts to load the formatted bibliography, i.e. to load the .hbbl file. The .hbbl file is produced from the .haux file by the companion program bibhva (see C.1.4). To include the bibliographic references extracted from .bib databases, it should normally suffice to do:

# hevea doc.tex
# bibhva doc
# hevea doc.tex

In case no .hbbl file exists, the \bibliography command attempts to load the .bbl file normally used while combining LATEX and BibTEX. Thus, another way to extract bibliographic references from .bib databases is:

# latex doc.tex
# bibtex doc
# hevea doc.tex

In case both files exist, notice that loading the .hbbl file has priority over loading the .bbl file.

B.11.4 Splitting the Input

The \input and \include commands exist and they perform exactly the same operation of searching (and then processing) a file, whose name is given as an argument. See section C.1.1.1 on how HEVEA searches files. However, in the case of the \include command, the file is searched only when previously given as an argument to the \includeonly command.

Note the following features:

  • TEX syntax for \input is not supported. That is, one should write \input{filename}.
  • If filename is excluded with the -e command-line option (see section C.1.1.4), then HEVEA does not attempt to load filename. Instead, it echoes \input{filename} and \include{filename} commands into the image file. This sounds complicated, but this is what you want!
  • HEVEA does not fail when it cannot find a file, it just issues a warning.

The \listfiles command is a null command.

B.11.5 Index and Glossary

Glossaries are not handled. (Who uses them anyhow?)

While processing a document doc.tex, index entries go into the file doc.hidx, while the formatted index gets written into the file doc.hind. As with LATEX, two runs of HEVEA are normally needed to format the index. However, if all index producing commands (normally \index) occur before the index formatting command (usually \printindex), then only one run is needed.

As in LATEX, index processing is not enabled by default and some package has to be loaded explicitly in the document preamble. To that aim, HEVEA provides the standard packages makeidx and imakeidx, as well as two extended packages that allow the production of several indexes (see section B.17.8).

Formatting of indexes in HEVEA departs from LATEX behaviour: environment the@hevea@index replaces the theindex environment; the@hevea@index places all index entries in class theindex. The environment can be modified with the commonly accepted magic:

\let\OldTheIndex\the@hevea@index
\let\OldEndTheIndex\endthe@hevea@index
\renewenvironment{the@hevea@index}%
                 {\OldTheIndex ...}%
                 {... \OldEndTheIndex}

An optional index prolog paragraph gets the ID indexprologue such that it can be manipulated with CSS as, for example:

p#indexprologue {
  font-size: smaller;
}

The index entries themselves are formatted using special indexenv environments. Those details do not normally concern users. However, the number of columns in the presentation of the index can be controlled by setting the value of the indexcols counter (default value is two). And the boolean indexcolseprule toggles typesetting rules between index columns (default is false, which means no rules).

B.11.6 Terminal Input and Output

The \typeout command echos its argument on the terminal, macro parameter #i are replaced by their values. The \typein command is not supported.

B.12 Line and Page Breaking

B.12.1 Line Breaking

The advisory line breaking command \linebreak will produce a line break if it has no argument or if its optional argument is 4. The \nolinebreak command is a null command.

The \\ and \\* commands output a <BR> tag, except inside arrays where the close the current row. Their optional argument is ignored. The \newline command outputs a <BR> tag.

All other line breaking commands, declarations or environments are silently ignored.

B.12.2 Page Breaking

They are no pages in the physical sense in html. Thus, all these commands are ignored.

B.13 Lengths, Spaces and Boxes

B.13.1 Length

All length commands are ignored, things go smoothly when LATEX syntax is used (using the \newlength, \setlength, etc. commands, which are null macros). Of course, if lengths are really important to the document, rendering will be poor.

Note that TEX length syntax is not at all recognised. As a consequence, writing things like \textwidth=10cm will clobber the output. Users can correct such misbehaviour by adopting LATEX syntax, here they should write \setlength{\textwidth}{10cm}.

B.13.2 Space

The \hspace, \vspace and \addvspace spacing commands and their starred versions recognise positive explicit length arguments. Such arguments get converted to a number of non-breaking spaces or line breaks. Basically, the value of 1em or 1ex is one space or one line-break. For other length units, a simple conversion based upon a 12pt font is used.

HEVEA cannot interpret more complicated length arguments or perform negative spacing. In these situations, a warning is issued and no output is done.

Spacing commands without arguments are recognised. The \enspace, \quad and \qquad commands output one, two and four non-breaking spaces, while the \smallskip, \medskip and \bigskip output one, one, and two line breaks.

Stretchable lengths do not exist, thus the \hfill and \vfill macros are undefined.

B.13.3 Boxes

Box contents is typeset in text mode (i.e. non-math, non-display mode). Both LATEX boxing commands \mbox and \makebox exist. The latter is associated with class makebox, which is empty by default and can be redefined by the user.

Similarly, the boxing-with-frame commands \fbox and \framebox are recognized. Here both, long and short forms refer to class framebox, which also can be redefined by the user.


Boxes can be saved for latter usage by storing them in bins. New bins are defined by \newsavebox{cmd}.

Then some text can be saved into cmd by \sbox{cmd}{text} or \begin{lrbox}{cmd} text \end{lrbox}. The text is translated to html, as if it was inside a \mbox and the resulting output is stored. It is retrieved (and outputted) by the command \usebox{cmd}. The \savebox command reduces to \sbox, ignoring its optional arguments.


No other box-related commands are implemented.

B.14 Pictures and Colours

B.14.1 The picture environment and the graphics Package

It is possible to have pictures and graphics processed by imagen (see section 6.1). In the case of the picture environment it remains users responsibility to explicitly choose source chunks that will get rendered as images. In the case of the commands from the graphics package, this choice is made by HEVEA.

For instance consider the following picture:

\newcounter{cms}
\setlength{\unitlength}{1mm}
\begin{picture}(50,10)
\put(0,7){\makebox(0,0)[b]{cm}}
\multiput(10,7)(10,0){5}{\addtocounter{cms}{1}\makebox(0,0)[b]{\arabic{cms}}}
\multiput(1,0)(1,0){49}{\line(0,1){2.5}}
\multiput(5,0)(10,0){5}{\line(0,1){5}}
\thicklines
\put(0,0){\line(1,0){50}}
\multiput(0,0)(10,0){6}{\line(0,1){5}}
\end{picture}

Users should enclose all picture elements in a toimage environment (or inside %BEGIN IMAGE%END IMAGE comments) and insert an \imageflush command, where they want the image to appear in html output:

%BEGIN IMAGE
\newcounter{cms}
\setlength{\unitlength}{1mm}
\begin{picture}(50,10)
  ...
\end{picture}
%END IMAGE
%HEVEA\imageflush

This will result in normal processing by LATEX and image inclusion by HEVEA:

All commands from the graphics package are implemented using the automatic image inclusion feature. More precisely, the outermost invocations of the \includegraphics, \scalebox, etc. commands are sent to the image image file and there will be one image per outermost invocation of these commands.

For instance, consider a document doc.tex that loads the graphics package and that includes some (scaled) images by:

\begin{center}
\scalebox{.5}{\includegraphics{round.ps}}
\scalebox{.75}{\includegraphics{round.ps}}
\includegraphics{round.ps}
\end{center}

Then, issuing the following two commands:

# hevea doc.tex
# imagen doc

yields html that basically consists in three image links, the images being generated by imagen.

Since the advent of pdflatex, using \includegraphics to insert bitmap images (e.g. .gif or .jpg) became frequent. In that case, users are advised not to use HEVEA default implementation of the graphics package. Instead, they may use a simple variation of the technique described in Section 8.2.

B.14.2 The color Package

HEVEA partly implements the color package. Implemented commands are \definecolor, \color, \colorbox, \textcolor, \colorbox and \fcolorbox. Other commands do not exist. At startup, colours black, white, red, green, blue, cyan, yellow and magenta are pre-defined.

Colours are defined by \definecolor{name}{model}{spec}, where name is the color name, model is the color model used, and spec is the color specification according to the given model. Defined colours are used by the declaration \color{name} and by the command \textcolor{name}{text}, which change text color. Please note that, the \color declaration accepts color specifications directly when invoked as \color[model]{spec}. The \textcolor command has a similar feature.

As regards color models, HEVEA implements the rgb, cmyk, hsv and hls color models. In those models, color specifications are floating point numbers less than one. For instance, here is the definition for the red color:

\definecolor{red}{rgb}{1, 0, 0}

The named color model is also supported, in this model color specification are just names… Named colours are the ones of dvips.

GreenYellow, Yellow, Goldenrod, Dandelion, Apricot, Peach, Melon, YellowOrange, Orange, BurntOrange, Bittersweet, RedOrange, Mahogany, Maroon, BrickRed, Red, OrangeRed, RubineRed, WildStrawberry, Salmon, CarnationPink, Magenta, VioletRed, Rhodamine, Mulberry, RedViolet, Fuchsia, Lavender, Thistle, Orchid, DarkOrchid, Purple, Plum, Violet, RoyalPurple, BlueViolet, Periwinkle, CadetBlue, CornflowerBlue, MidnightBlue, NavyBlue, RoyalBlue, Blue, Cerulean, Cyan, ProcessBlue, SkyBlue, Turquoise, TealBlue, Aquamarine, BlueGreen, Emerald, JungleGreen, SeaGreen, Green, ForestGreen, PineGreen, LimeGreen, YellowGreen, SpringGreen, OliveGreen, RawSienna, Sepia, Brown, Tan, Gray, Black, White.

There are at least three ways to use colours from the named model.

  1. Define a color name for them.
  2. Specify the named color model as an optional argument to \color and \textcolor.
  3. Use the names directly (HEVEA implements the color package with the usenames option given).

That is:

  1. \definecolor{rouge-brique}{named}{BrickRed}\textcolor{rouge-brique}{Text as a brick}.
  2. \textcolor[named]{BrickRed}{Text as another brick}.
  3. \textcolor{BrickRed}{Text as another brick}.

Which yields:

  1. Text as a brick.
  2. Text as another brick.
  3. Text as another brick.

HEVEA also implements the \colorbox and \fcolorbox commands.

\colorbox{red}{Red background},
\fcolorbox{magenta}{red}{Red background, magenta border}.
Red background, Red background, magenta border.

Those two commands accept an optional first argument that specifies the color model, as \textcolor does:

\fcolorbox[named]{RedOrange}{Apricot}{Apricot background, RedOrange border}.
Apricot background, RedOrange border.

Colours should be used carefully. Too many colours hinders clarity and some of the colours may not be readable on the document background color.

B.14.2.1 The bgcolor environment

With respect to the LATEX color package, HEVEA features an additional bgcolor environment, for changing the background color of some subparts of the document. The bgcolor environment is a displayed environment and it normally starts a new line. Simple usage is \begin{bgcolor}{color}\end{bgcolor}, where color is a color defined with \definecolor. Hence the following source yield a paragraph with a red background:

\begin{bgcolor}{red}
\color{yellow}Yellow letters on a red backgroud
\end{bgcolor}
Yellow letters on a red background

The bgcolor environment is implemented by one-cell table element, it takes an optional argument that is used as an attribute for the inner td element (default value is style="padding:1em"). Advanced users may change the default, for instance as:

\begin{bgcolor}[style="padding:0"]{yellow}
\color{red}Red letters on a yellow backgroud
\end{bgcolor}

The resulting output will be red letters on a yellow background and no padding:

Red letters on a yellow background, no padding

B.14.2.2 From High-Level Colours to Low-Level Colours

High-level colours are color names defined with \definecolor. Low-level colours are html-style colours. That is, they are either one of the sixteen conventional colours black, silver etc., or a RGB hexadecimal color specification of the form "#XXXXXX".

One changes the high-level high-color into a low-level color by \@getcolor{high-color}. Low-level colours are appropriate inside html attributes and as arguments to the \@fontcolor internal macro. An example of \@getcolor usage can be found at the end of section 8.5.

There is also \@getstylecolor command that acts like\@getcolor, except that it does not output the double quotes around RGB hexadecimal color specifications. Such low-level colours are appropriate for style definitions in cascading style sheets [CSS-2]. See Section 9.3 for an example.

B.15 Font Selection

B.15.1 Changing the Type Style

All LATEX 2є declarations and environments for changing type style are recognised. Aspect is rather like LATEX 2є output, but there is no guarantee.

As html does not provide the same variety of type styles as LATEX does. However css provide a wide variety of font properties. HEVEA uses generic properties, proper rendering will then depend upon user agent. For instance, it belongs to the user agent to make a difference between italics (rendered by the font style “italic”) and slanted (rendered by the font style “oblique”).

Here is how HEVEA implements text-style declarations by default:

\itshapefont-style:italic
\slshapefont-style:oblique
\scshapefont-variant:small-caps
\upshapeno style
\ttfamilyfont-family:monospace
\sffamilyfont-family:sans-serif
\rmfamilyno style
\bfseriesfont-weight:bold
\mdseriesno style

Text-style commands also exists, they are defined as \mbox{\decl}. For instance, \texttt is defined as a command with one argument whose body is \mbox{\ttfamily#1}. Finally, the \emph command for emphasised text also exists, it yields text-level em elements.

As in LATEX, type styles consists in three components: shape, series and family. HEVEA implements the three components by making one declaration to cancel the effect of other declarations of the same kind. For instance consider the following source, that exhibits shape changes:

{\itshape italic shape \slshape slanted shape
\scshape small caps shape \upshape upright shape}

Then, in the rendering below, “small caps shape” appears in small caps shape only and not in italics:

italic shape slanted shape small caps shape upright shape

Old style declarations are also recognised, they translate to text-level elements. However, no elements are cancelled when using old style declaration. Thus, the source “{\sl\sc slanted and small caps}” yields “slanted” small caps: “slanted and small caps”. Users need probably not worry about this. However this has an important practical consequence: to change the default rendering of type styles, one should redefine old style declaration in order to benefit from the cancellation mechanism. See section 10.2 for a more thorough description.

B.15.2 Changing the Type Size

All declarations, from \tiny to \Huge are recognised. Output is not satisfactory inside headers elements generated by sectioning commands.

B.15.3 Special Symbols

The \symbol{num} outputs character number num (decimal) from the Unicode character set. This departs from LATEX, which output symbol number num in the current font.

B.16 Extra Features

This section describes HEVEA functionalities that extends on plain LATEX, as defined in [LATEX]. Most of the features described here are performed by default.

B.16.1 TEX macros

Normally, HEVEA does not recognise constructs that are specific to TEX. However, some of the internal commands of HEVEA are homonymous to TEX macros, in order to enhance compatibility. Note that full compatibility with TEX is not guaranteed.

B.16.1.1 À la TEX macros definitions

The \def construct for defining commands is supported. It is important to notice that HEVEA semantics for \def follows TEX semantics. That is, defining a command that already exists with \def succeeds.

Delimiting characters in command definition are somehow supported. Consider the following example from the TEX Book:

\def\Look{\textsc{Look}}
\def\x{\textsc{x}}
\def\cs AB#1#2C$#3\$ {#3{ab#1}#1 c\x #2}
\cs AB {\Look}{}C${And \$}{look}\$ 5.

It yields: And $lookabLookLook cx5.

Please note that delimiting characters are supported as far as I could, problems are likely with delimiting characters which include spaces or command names, in particular the command name \{. One can include \{ in a command argument by using the grouping characters {}:

\def\frenchquote(#1){\guillemotleft~\emph{#1}~\guillemotright{} (in French)}
he said \frenchquote(Alors cette accolade ouvrante {``\{''}~?).

Yields: he said « Alors cette accolade ouvrante “{” ? » (in French).

Another issue regards comments: “%” in arguments may give undefined behaviours, while comments are better avoided while defining macros. As an example, the following code will not be handled properly by HEVEA:

\def\x%
   #1{y}

Such TEX source should be rewritten as \def\x#1{y}.

Another source of incompatibility with TEX is that substitution of macros parameters is not performed at the same moment by HEVEA and TEX. However, things should go smoothly at the first level of macro expansion, that is when the delimiters appear in source code at the same level as the macro that is to parse them. For instance, the following source will give different results in LATEX and in HEVEA:

\def\cs#1A{``#1''}
\def\othercs#1{\cs#1A}
\othercs{coucouA}

LATEX output is “coucou”A, while HEVEA output is “coucouA”. For instance, here is HEVEA output: “coucouA”. Please note that in most situations this discrepancy will make HEVEA crash.

B.16.1.2 The \let construct

HEVEA also processes a limited version of \let:

\let macro-name1 = macro-name2

The effect is to bind macro-name1 to whatever macro-name2 is bound to at the time \let is processed. This construct may prove very useful in situations where one wishes to slightly modify basic commands. See sections 10.3 and B.2 for examples of using \let in such a situation.

B.16.1.3 The \global construct

It is possible to escape scope and to make global definitions and bindings by using the TEX construct \global. The \global construct is significant before \def and \let constructs.

Also note that \gdef is equivalent to \global\def.

B.16.1.4 TEX Conditional Macros

The \newif\ifname, where name is made of letters only, creates three macros: \ifname, \nametrue and \namefalse. The latter two set the name condition to true and false, respectively. The \ifname command tests the condition name:

\ifname
text
1
\else
text2
\fi

Text text1 is processed when name is true, otherwise text2 is processed. If text2 is empty, then the \else keyword can be omitted.

Note that HEVEA also implements LATEX ifthen package and that TEX simple conditional macros are fully compatible with LATEX boolean registers. More precisely, we have the following correspondences:

TEXLATEX
\newif\ifname\newboolean{name}
\nametrue\setboolean{name}{true}
\namefalse\setboolean{name}{false}
\ifname text1\else text2\fi\ifthenelse{\boolean{name}}{text1}{text2}

B.16.1.5 Other TEX Macros

HEVEA implements the macros \unskip and \endinput. It also supports the \csname\endcsname construct.

B.16.2 Command Definition inside Command Definition

If one strictly follows the LATEX manual, only commands with no arguments can be defined inside other commands. Parameters (i.e. #n) occurring inside command bodies refer to the outer definition, even when they appear in nested command definitions. That is, the following source:

\newcommand{\outercom}[1]{\newcommand{\insidecom}{#1}\insidecom}
\outercom{outer}

yields this output:

outer

Nevertheless, nested commands with arguments are allowed. Standard parameters #n still refer to the outer definition, while nested parameters ##n refer to the inner definition. That is, the source:

\newcommand{\outercom}[1]{\newcommand{\insidecom}[1]{##1}\insidecom{inner}}
\outercom{outer}

yields this output:

inner

B.16.3 Date and time

Date and time support is not enabled by default, for portability and simplicity reasons.

However, HEVEA source distribution includes a simple (sh) shell script xxdate.exe that activates date and time support. The hevea command, should be invoked as:

# hevea -exec xxdate.exe ...

This will execute the script xxdate.exe, whose output is then read by HEVEA. As a consequence, standard LATEX counters year, month, day and time are defined and LATEX command \today works properly. Additionally the following counters and commands are defined:

Counter weekdayday of week, 0…6 (e.g. 3)
Counter Hourhour, 00…11 (e.g. 04)
Counter hourhour, 00…23 (e.g. 16)
Counter minuteminute, 00…59 (e.g. 09)
Counter secondsecond, 00…6110(e.g. 46)
Command \ampmAM or PM (e.g. PM)
Command \timezoneTime zone (e.g. CEST)
Command \heveadateOutput of the date Unix command, (e.g. Wed Jun 15 16:09:46 CEST 2022)

Note that I chose to add an extra option (and not an extra \@exec primitive) for security reasons. You certainly do not want to enable HEVEA to execute silently an arbitrary program without being conscious of that fact. Moreover, the hevea program does not execute xxdate.exe by default since it is difficult to write such a script in a portable manner.

Windows users should enjoy the same features with the version of xxdate.exe included in the Win32 distribution.

B.16.4 Fancy sectioning commands

Loading the fancysection.hva file will radically change the style of sectional units headers: they appear over a green background, the background color saturation decreases as the sectioning commands themselves do (this is the style of this manual). Additionally, the document background color is white.

Note : Fancy section has been re-implemented using style-sheets. While it respects the old behaviour, users are encouraged to try out style-sheets for more flexibility. See Section 9 for details.

The fancysection.hva file is intended to be loaded after the document base style. Hence the easiest way to load the fancysection.hva file is by issuing \usepackage{fancysection} in the document preamble. To allow processing by LATEX, one may for instance create an empty fancysection.sty file.

As an alternative, to use fancy section style in doc.tex whose base style is article you should issue the command:

  # hevea article.hva fancysection.hva doc.tex

You can also make a doc.hva file that contains the two lines:

  \input{article.hva}
  \input{fancysection.hva}

And then launch hevea as:

  # hevea doc.hva doc.tex

Sectioning command background colours can be changed by redefining the corresponding colours (part, chapter, section,…). For instance, you get various mixes of red and orange by:

\input{article.hva}
\input{fancysection.hva}
\definecolor{part}{named}{BrickRed}
\definecolor{section}{named}{RedOrange}
\definecolor{subsection}{named}{BurntOrange}

(See section B.14.2 for details on the named color model that is used above.)

Another choice is issuing the command \colorsections{hue}, where hue is a hue value to be interpreted in the HSV model. For instance,

\input{article.hva}
\input{fancysection.hva}
\colorsections{20}

will yield sectional headers on a red-orange background.

HEVEA distribution features another style for fancy sectioning commands: the undersection package provides underlined sectional headers.

B.16.5 Targeting Windows

At the time of this release, Windows support for symbols through Unicode is not as complete as the one of Linux, which I am using for testing HEVEA.

One of the most salient shortcomings is the inability to display sub-elements for big brackets, braces and parenthesis, which HEVEA normally outputs when it processes \left[, \right\} etc.

We (hopefully) expect Windows fonts to display more of Unicode easily in a foreseeable future. As a temporary fix, we provide a style file winfonts.hva. Authors concerned by producing pages that do not look too ugly when viewed through Windows browsers are thus advised to load the file winfonts.hva. For instance they can invoke HEVEA as:

# hevea winfonts.hva ...

At the moment, loading winfonts.hva only changes the rendering of LATEX big delimiters, avoiding the troublesome Unicode entities. As an example, here are some examples of rendering.

delimitersdefaultwinfonts
\left\{ … \right\}  




1
2
3




  
 / 
 | 

 | 
 \ 
1
2
3
 \
 |
 >
 |
 /
\left[ … \right]  



1
2
3



  
1
2
3
\left( … \right)  



1
2
3



  



1
2
3
 \
 |
 |
 /
\left\vert … \right\vert  



1
2
3



  
1
2
3
\left\Vert … \right\Vert  
⎪⎪
⎪⎪
⎪⎪
⎪⎪
1
2
3
⎪⎪
⎪⎪
⎪⎪
⎪⎪
  
1
2
3

More generally, it remains authors responsibility to be careful not to issue too refined Unicode entities. To that aim, authors that target a wide audience should first limit themselves to the most common symbols (e.g. use \leq [≤] in place of \preceq [≼]) and, above all, they should control the rendering of their documents using several browsers.

B.16.6 MathJax support

MathJax support is enabled by loading the mathjax package. Two operating mode modes are provided: explicit and automatic. Notice that HEVEA distribution includes a innocuous mathjax.sty for LATEX compatibility — see also Sec. C.4.2.

B.16.6.1 Explicit mode

Explicit mode is enabled when \usepackage{mathjax} appears in the document preamble, or when HEVEA is invoked as “hevea mathjax.hva…”.

Basic consists in one environment displayjax and one command \textjax. The environment is appropriate for displayed maths. As an example, the following source

A displayed formula:
\begin{displayjax}
\frac{\pi}{4} = \left[1 - \frac{1}{3} + \frac{1}{5} - \frac{1}{7} +
\frac{1}{9} + \cdots + \frac{(-1)^n}{2n+1} + \cdots \right]
\end{displayjax}

is displayed as follows:

A displayed formula: \[ \frac{\pi}{4} = \left[1 - \frac{1}{3} + \frac{1}{5} - \frac{1}{7} + \frac{1}{9} + \cdots + \frac{(-1)^n}{2n+1} + \cdots \right] \]

The \textjax command is appropriate for inline mathematical contents. For instance, the following source

``A nice inline formula:
\textjax{\frac{\pi}{4} = \left[1 - \frac{1}{3} + \frac{1}{5} - \frac{1}{7} +
\frac{1}{9} + \cdots + \frac{(-1)^n}{2n+1} + \cdots \right]}.''

is typeset as: “A nice inline formula: \(\frac{\pi}{4} = \left[1 - \frac{1}{3} + \frac{1}{5} - \frac{1}{7} + \frac{1}{9} + \cdots + \frac{(-1)^n}{2n+1} + \cdots \right]\).”

Advanced support consists in the mathjax environment. Source code enclosed in \begin{mathjax}\ldots\end{mathjax} will be reproduced into output for the MathJax script to handle it. However, HEVEA does not start any other action. Thanks to this feature, users can have any (recognised by MathJax) displayed math environment processed by MathJax. For instance, the following source

\begin{mathjax}
\begin{eqnarray*}
z^2  & = & x^2 + y^2\\
\end{eqnarray*}
\end{mathjax}

will be displayed as:

\begin{eqnarray*} z^2 & = & x^2 + y^2\\ \end{eqnarray*}

Finally, notice that a document that uses the explicit MathJax constructs can be processed by LATEX, provided it loads the mathjax.sty file present in HEVEA distribution. This can be done simply by having the line \usepackage{mathjax} in the document preamble. Then, HEVEA and LATEX will react appropriately (see sections 2.3.2 and B.5.2).

B.16.6.2 Automatic mode

Automatic mode is enabled when \usepackage[auto]{mathjax} appears in the document preamble, or when HEVEA is invoked as “hevea mathjaxauto.hva…”.

In automatic mode, HEVEA will pass all mathematical text to MathJax. This mode seems by far the most practical, but beware:

  1. There is no communication back from MathJax to HEVEA. As result, equation numbers, as generated for instance by the equation environment, will not find their way to the final display.
  2. Some constructs, such as \mbox, are not handled by MathJax.

B.16.6.3 Customising the MathJax script

By default HEVEA insert a reference to the “default” MathJax script with “default” configuration parameters. Advanced users can change this setting by redefining the \jax@meta command, which must contain the appropriate <script> element. See the file html/mathjax.hva for details.


10
According to date man page.

B.17 Implemented Packages

HEVEA distribution includes .hva packages that are implementations of LATEX packages. Packages described in the “Blue Book” (makeidx, ifthen, graphics —and graphicx!—, color, alltt) are provided. Additionally, quite a few extra packages are provided. I provide no full documentation for these packages, users should refer to the first pages of the package documentation, which can usually be found in the book [LATEX-bis], in your local LATEX installation or in a TeX CTAN-archive.

At the moment, most package options are ignored, except for the babel package, where it is essential.

B.17.1 AMS compatibility

HEVEA amsmath package defines some of the constructs of the amsmath package. At the moment, supported constructs are the cases environment and matrix environments [LATEX-bis, Section 8.4], the environments for multi-line displayed equations (gather, split,…) [LATEX-bis, Section 8.5] and the \numberwithin command [LATEX-bis, Section 8.6.2].

HEVEA provides support for the amssymb symbols using Unicode. I found Unicode equivalent for most symbols. However, a few symbols remain undefined (e.g. \varsubsetneqq).

B.17.2 The array and tabularx packages

The array package is described in [LATEX-bis, Section 5.3] and in the local documentation of modern LATEX installations. It is a compatible extension of LATEX arrays (see B.10.2). Basically, it provides new column specifications and a \newcolumntype construct for user-defined column specifications. Table 1 gives a summary of the new column specifications and of how HEVEA implements them.


Table 1: Column specifications from the array package
m{width}Equivalent to the p column specification (the width argument is ignored, entries are typeset in paragraph mode with paragraph breaks being reduced to a single line break), except that the entries are centered vertically.
b{width}Equivalent to the p column specification, except that the entries are bottom-aligned vertically.
>{decl}Can be used before l, c, r, p{}, m{} or b{}. It inserts decl in front of the entries in the corresponding column.
<{decl}Can be used after l, c, r, p{}, m{} or b{}. It inserts decl after entries in the corresponding column.
!{decl}Equivalent to @{decl}

Note that centered, top-aligned or bottom-aligned in the vertical direction, do not have exactly the same meaning in LATEX and in html. However, the aspect is the same when all columns agree w.r.t. vertical alignment. Ordinary column types (c, l and r) do not specify vertical alignment, which therefore becomes browser dependent.

The >{decl} and <{decl} constructs permit the encoding of TEX \cases macro as follows:

\def\cases#1{\left\{\begin{array}{l>{$}l<{$}}#1\end{array}\right.}

(This is an excerpt of the latexcommon.hva file.)

New column specifications are defined by the \newcolumntype construct:

\newcolumntype{col}[narg]{body}

Where col is one letter, the optional narg is a number (defaults to 0), and body is built up with valid column specifications and macro-argument references (#int). Examples are:

\newcolumntype{C}{>{\bf}c}
\newcolumntype{E}[1]{*{#1}{c}}
\begin{tabular}{CE{3}}\hline
one & two & three & four \\
five & six & seven & eight \\ \hline
\end{tabular}

The column specification C means that entries will be typeset centered and using bold font, while the column specifications E{num} stands for num centered columns. We get:

onetwothreefour
fivesixseveneight

HEVEA implements column specifications with commands defined in the \newcommand style. Thus, they have the same behaviour as regards double definition, which is not performed and induces a warning message. Thus, a column specification that is first defined in a macro.hva specific file, overrides the document definition.

The tabularx package [LATEX-bis, Section 5.3.5] provides a new tabular environment tabularx and a new column type X. HEVEA makes the former equivalent to tabular and the latter equivalent to p{ignored}. By contrast with the subtle array formatting that the tabularx package performs, this may seem a crude implementation. However, rendering is usually correct, although different.

More generally and from the html point of view such sophisticated formatting is browser job in the first place. However, the html definition allows suggested widths or heights for table entries and table themselves. From HEVEA point of view, drawing the border line between what can be specified and what can be left to the browser is not obvious at all. At the moment HEVEA choice is not to specify too much (in particular, all length arguments, either to column specifications or to the arrays themselves, are ignored). As a consequence, the final, browser viewed, aspect of arrays will usually be different from their printed aspect.

B.17.3 The calc package

The calc package enables using traditional, infix, notation for arithmetic operations inside the num argument to the \setcounter{name}{num} and \addtocounter{name}{num} constructs (see [LATEX-bis, Section A.4])

The calc package provides a similar extension of the syntax of the len argument to the \setlength and \addtolength constructs. HEVEA does not implement this extension, since it does not implement length registers in the first place.

B.17.4 Specifying the document input encoding, the inputenc package

The inputenc package enables LATEX to process a file according to various 8 bits encodings, plus UTF-8. The one used encoding is specified as an option while loading the package \usepackage[encoding]{inputenc}. At the moment, HEVEA recognises ten latin encodings (from latin1 to latin10), the koi8-r encoding, the ascii encoding, four windows encodings, the applemac encoding, and the utf8 encoding. It is important to notice that loading the inputenc package alters the html document charset. For instance if the latin9 input encoding is selected by:

\usepackage[latin9]{inputenc}

Then, the document charset is ISO-8859-15, which is an enhanced version of ISO-8859-1 with some characters for Œ, œ and €. The rationale behind changing the output document charset at the same time as changing the input encoding is to allow non-ascii bytes in the input file to be replicated as themselves in the output file.

However, one can change the document charset (and the output translator) by using the internal command \@def@charset. For instance, one can specify latin1 encoding, while producing html pages in ascii:

\usepackage[latin1]{inputenc}
%HEVEA\@def@charset{US-ASCII}

See section 8.6 for a more thorough description of html charset management.

The inputenc package also provides the command \inputcoding{encoding} that changes the input encoding at any time. The argument encoding can be any of the options accepted by \usepackage[encoding]{inputenc}. The command \inputcoding of HEVEA follows the behaviour of its LATEX counterpart, it the sense that it obeys scope rules. Notice that \inputcoding does not change the document output encoding and charset.

B.17.5 The hyphenat package

Control of hyphenation on the HTML-side is much more limited than on the LATEX-side. Therefore, the functionality of the ported hyphenat package is limited. The package options none and htt are ignored.

B.17.6 More symbols

HEVEA implements the following packages: latexsym amssymb, textcomp (a.k.a. “Text companion”) and eurosym (a nice € symbol in LATEX).

B.17.7 The comment package

The comment package provides two commands, \excludecomment and \includecomment, for (re-)defining new environments that ignore their content or that do nothing. The comment environment is also defined as an environment of the first kind.

B.17.8 Multiple Indexes with the index and multind packages

HEVEA supports several simultaneous indexes, following the scheme of the index package, which is present in modern LATEX distributions. This scheme is backward compatible with the standard indexing scheme of LATEX.

Support is not complete, but the most useful commands are available. More precisely, HEVEA knows the following commands:

\newindex{tag}{ext}{ignored}{indexname}
Declare an index. The first argument tag is a tag to select this index in other commands; ext is the extension of the index information file generated by LATEX (e.g., idx); ignored is ignored by HEVEA; and indexname is the title of the index. There also exists a \renewindex commands that takes the same arguments and that can be used to redefine previously declared indexes.
\makeindex
Perform \newindex{default}{idx}{ind}{Index}.
\index[tag]{arg}
Act as the LATEX \index command except that the information extracted from arg goes to the tag index. The tag argument defaults to default, thereby yielding standard LATEX behaviour for the \index command without an optional argument. There also exists a stared-variant \index* that Additionally typesets arg.
\printindex[tag]
Compute, format and output index whose tag is tag. The tag argument defaults to default.

The multind package is supported to some extend, but index is definitely to be preferred.

B.17.9 “Natural” bibliographies, the natbib package

LATEX version of natbib is present in modern installations.

Implementation is quite complete and compatible with version 8.0 of the natbib package (with the keyval style command \setcitestyle).

Unimplemented features are the sorting and compression of references. Automatic generation of an index of citations is handled, but the current implementation probably is quite fragile.

B.17.10 Multiple bibliographies

The multibib package

HEVEA provides a slightly incomplete implementation of the multibib package. The one non-implemented feature is the simultaneous definition of more than one bibliography. That is one cannot invoke \newcites as follows:

\newcites{suf1, suf2}{Title1, Title2}

Instead, one should perform to calls to the \newcites command:

\newcites{suf1}{Title1}\newcites{suf2}{Title2}

The chapterbib package

A basic implementation is provided. At the moment, you can define one bibliography per included file and no toplevel bibliography. HEVEA implementation of this package recognises the option sectionbib and provides the command \sectionbib to change the sectioning command introduced by bibliographies.

B.17.11 Support for babel

B.17.11.1 Basics

HEVEA offers support for the LATEX package babel. When it reads the command

  \usepackage[LANG-LIST]{babel}

it loads babel.hva, and sends it the saved LANG-LIST. The file babel.hva then looks at each language (say x) in it, and loads x.hva, which offers support for the language x. As in LATEX, the last language in the list is selected as default; it also determines the document’s language, this is, the lang attribute of its html element. As an example the command

\usepackage[english,french,german]{babel}

would load babel.hva, then the files english.hva, french.hva, german.hva containing the respective definitions, and finally activate the definitions in german.hva and sets the current language to german.

B.17.11.2 Commands and languages

The following babel commands for changing and querying the language work as in LATEX:

  1. \selectlanguage{LANG}: Change the language to LANG.
  2. \iflanguage{LANG}: Branch after comparing LANG with current language.
  3. \foreignlanguage{LANG}{TEXT}: Switch to language LANG and then typeset TEXT.
  4. \begin{OTHER-LANG}\end{OTHER-LANG}: Select language OTHER-LANG in an environment. HEVEA is frugal – only those languages are allowed for OTHER-LANG that have been announced in the LANG-LIST; see section B.17.11.1.
  5. \begin{OTHER-LANG*}\end{OTHER-LANG*}: Same as above.
  6. \begin{hyphenrules}{LANG}\end{hyphenrules}: Switch only the hyphenation rules to those of LANG.
  7. \hyphenrules{LANG}: Same as above in the form of a macro.

Items 3, 4, and 5 use CSS class foreignlanguage, which can be defined by the user (it is not defined by HEVEA).

The language specific details are described in the corresponding .hva file, just as in the .sty file for LATEX. Users need to supply this file for their language, or modify/check the files if they are already supplied with the distribution. The list of languages is given below.

americanaustrianbrazilcatalan
checkcroatiandanishdutch
englishesperantofinnishfrench
galiciangermanitalianmagyar
norsknynorskpolishportuguese
romanianrussianslovakslovene
spanishswedishturkish 

B.17.11.3 Writing hva files

The languages for which .hva files are available with the distribution are english, french, german, austrian, czech and portuguese. These may need to be modified as not all accents and hyphenation techniques are supported.

They can be written/modified as simple TEX files (see the section  B.16.1.1 on writing TEX macros for details). As an example, one may also take a look at the file french.hva, which describes the details for french.

Note how all definitions are inside the definition for \french@babel, which is the command that \selectlanguage{french} would call. Similar commands need to be provided (i.e. \x@babel in \x.hva for language x).

Notice that it is wise to write the \x.hva in plain ascii only. Some definitions may involve specifying Unicode characters, for doing so, using the \@print@u is recommended (cf. Section 8.3). The definition of Unicode characters can be found at http://www.unicode.org/charts/. Most language specific Unicode characters can be found in the first few files.

B.17.12 The url package

LATEX source.

This package in fact provides a enhanced \verb command that can appear inside other command arguments. This command is named \url, but it can be used for any verbatim text, including DOS-like path names. Hence, one can insert urls in one’s document without worrying about LATEX active characters:

This is a complicated url: \url{http://foo.com/~user#label%coucou}.

which gets typeset as: “This is a complicated url: http://foo.com/~user#label%coucou.”

The main use for the \url command is to specify urls as arguments to HEVEA commands for hyperlinks (see section 8.1.1):

\hevea{} home page is
\ahrefurl{\url{http://hevea.inria.fr/}}

It yields: “HEVEA home page is http://hevea.inria.fr/”.

However the \url command is fragile, as a consequence it cannot be used inside \footahref first argument (This is a LATEX problem, not an HEVEA one). The url package solves this problem by providing the \urldef command for defining commands whose body is typeset by using \url:

\urldef{\heveahome}{\url}{http://hevea.inria.fr/}

Such a source defines the robust command \heveahome as the intended url. Hence the following source works as expected:

Have a look at \footahref{\heveahome}{\hevea{} home page}

It yields: “Have a look at HEVEA home page”.

Using \url inside command definitions with a #i argument is a bad idea, since it gives “verbatim” a rather random meaning. Unfortunately, in some situations (e.g, no %, no #), it may work in LATEX. By contrast, it does not work in HEVEA. In such situations, \urldef should be used.

HEVEA implementation is somehow compatible at the “programming level”. Thus, users can define new commands whose argument is understood verbatim. The urlhref.hva style file from the distribution takes advantage of this to define the \url command, so that it both typesets an url and inserts a link to it.

\input{urlhref.hva}
Have a look at \url{http://hevea.inria.fr/}

It yields “Have a look at http://hevea.inria.fr/”. The urlhref.hva style file (which is an HEVEA style file and not a LATEX style file) can be adequate for bibliographic references, which often use \url for its typesetting power. Of course, loading urlhref.hva only makes sense when all arguments to \url are urls…

B.17.13 Verbatim text: the moreverb and verbatim packages

These two packages provide new commands and environments for processing verbatim text. I recommend using moreverb rather than verbatim, since HEVEA implementation is more advanced for the former package.

B.17.14 Typesetting computer languages: the listings package

I strongly recommend the listings package. Learning the user interface requires a little effort, but it is worth it.

HEVEA features a quite compatible implementation, please refer to the original package documentation. Do not hesitate to report discrepancies. Note that HEVEA does not produce very compact html in case you use this package. This can be cured by giving hevea the command-line option -O (see C.1.1.4).

The lstlisting environment is styled through an homonymous style class (see 9.2 and 9.3) and most lstlisting environments get translated to div elements with the appropriate \getenvclass{lstlisting} class, which, by default is lstlisting. A few points deserve mention:

  1. The definition of default style class lstlisting includes the important declarations font-family:monospace; and white-space:pre;, which, more or less, specify non-proportional font and mandatory line breaks. In case you replace lstlisting by another style class (by \setenvclass{lstlisting}{another one}), your alternate definition should probably feature an identical specification. Otherwise, rendering would be poor, as regards spacing and line breaks. Here is how specific listings are styled. We first define a new environment to typeset programs written in the C language, by using the command \lstnewenvironment:
    \lstdefinestyle{colors}{keywordstyle={\bf\color{blue}}, commentstyle={\em\color{magenta}}}
    \lstnewenvironment{clisting}
      {\setenvclass{lstlisting}{clisting}\lstset{language=C, style=colors}}
      {}
    
    The command \lstnewenvironment{name}{starting code}{ending code} is from the listings package, with similar semantics. In the starting code above, the fragment \setenvclass{lstlisting}{clisting} instructs HEVEA to use the style class clisting locally (notice that it could just be another name). The style class clisting is defined in the document preamble as follows:
    \newstyle{.clisting}{font-family:monospace;white-space:pre;
    border-left:solid black;padding-left:2ex;margin-left:2ex;}
    
    Typesetting a C listing with a black border on the left is then as simple as:
    \begin{clisting}
    /* Compute, guess what! */
    int fact(int n) {
      int r = 1 ;
      for ( ; n > 0 ; n--) {
        r *= n ;
      }
      return r ;
    }
    \end{clisting}
    
    The final result is:
    /* Compute, guess what! */ int fact(int n) { int r = 1 ; for ( ; n > 0 ; n--) { r *= n ; } return r ; }
  2. When listings are framed, that is, when some frame=… or background=… keyval specifications are active, they no longer get translated to div elements. Instead they get translated to one cell tables whose td and table elements are styled through style classes lstlisting and lstframe, respectively. Of course, those two style classes follow the usual \setenvclass/\getenvclass mechanism. That way, one can for instance center all framed listings by issuing the following declaration in the document preamble:
    \newstyle{.lstframe}{margin:auto;}
    
    Notice that the default style class lstframe is empty.
  3. Unfortunately the white-space:pre; style declaration is still a bit young, and some browsers implement it in rather incomplete fashion. This is particularly true as regards text copy-pasted from browser display. In case you want to provide your readers with easy copy-paste of listings, you can, by issuing the command \lstavoidwhitepre in the document preamble. Then, white-space:pre; is not used any longer: spaces get rendered by non-breaking space entities and line-breaks by <BR> elements, which significantly increase output size. However, as a positive consequence, display remains correct and text copy-pasted from browser display indeed possesses the line-breaks shown in display.

B.17.15 (Non-)Multi page tabular material

LATEX source for the longtable and supertabular packages.

Those two packages provide LATEX users with the possibility to typeset tabular material over several pages [LATEX-bis, Section 5.4]. Of course, HEVEA does not care much about physical pages. Thus the supertabular and longtable environments are rendered more or less as tabular environments inside table environments.

B.17.16 Typesetting inference rules: the mathpartir package

The mathpartir package, authored by D. Rémy, essentially provides two features:

  1. An environment mathpar for typesetting a sequence of math formulas in mixed horizontal and vertical mode. The environment selects the best arrangement according to the line width, exactly as paragraph mode does for words.
  2. A command \inferrule (and its starred variant) for typesetting inferences rules.

We give a short description, focussing on HEVEA-related details. Users are encouraged to refer to the original documentation of the package.

In the following, comments on rule typesetting apply to HEVEA output and not to LATEX output.

B.17.16.1 The mathpar environment

In its LATEX version, the mathpar environment is a “paragraph mode for formulas”. It allows to typeset long list of formulas putting as many as possible on the same line:

\begin{mathpar} A-Formula \and Longer-Formula \and And \and The-Last-One \end{mathpar}
    
AFormula
LongerFormula
And
TheLastOne

In the example above, formulas are separated with \and. The LATEX implementation also changes the meaning of paragraph breaks (either explicit as a \par command or implicit as a blank line) to act as \and. It also redefines the command \\ as an explicit line-break in the flow of formulas.

\begin{mathpar} \int_0^2 xdx = \frac{3}{2} \\ \int_0^3 xdx = \frac{5}{2} \end{mathpar}
    
2


0
xdx = 
3
2
3


0
xdx = 
5
2

The HEVEA version is simplistic: Formulas are typeset in math display mode, \and separators always produce horizontal space, while \\ always produce line-breaks. However, when prefixed by \hva the meaning of explicit separators is reversed: that is, \hva\and produces a line-break, while \hva\\ produces horizontal space. Hence, we can typeset the previous example on two lines:

\begin{mathpar} A-Formula \and Longer-Formula \hva\and And \and The-Last-One \end{mathpar}
    
AFormula
LongerFormula
And
TheLastOne

It is to be noticed that the LATEX version of the package defines \hva as a no-op, so as to allow explicit instructions given to HEVEA not to impact on the automatic typesetting performed by LATEX.

B.17.16.2 The inferrule macro

The \inferrule macro is designed to typeset inference rules. It should only be used in math mode (or display math mode). It takes three arguments, the first being optional, specifying the label, premises, and conclusions respectively. The premises and the conclusions are both lists of formulas, and are separated by \\. A simple example of its use is

\inferrule
  [label]
  {one \\ two \\ three \\ or \\ more \\ premises}
  {and \\ any \\ number \\ of \\ conclusions \\ as \\ well}

which gives the following rendering:

label
one       two       three       or       more       premises
and       any       number       of       conclusions       as       well

Again, HEVEA is simplistic. Where LATEX performs actual typesetting, interpreting \\ as horizontal or vertical breaks, HEVEA always interpret \\ as an horizontal break. In fact HEVEA interpret all separators (\\, \and) as horizontal breaks, when they appear in the arguments of the \inferrule command. Nevertheless prefixing separators with \hva yields vertical breaks:

\inferrule {aa \hva\\ bb} {dd \\ ee \\ ff}
    
aa
bb
dd       ee       ff

The color of the horizontal rule that separates the premises and conclusions can be changed by redefining the command \mpr@hhline@color. This color must be specified as a low-level color (cf. Section B.14.2.2).

B.17.16.3 Options

By default, lines are centered in inference rules. However, this can be changed either by using \mprset{flushleft} or \mprset{center}, as shown below.

$$\mprset{flushleft} \inferrule {a \\ bbb \hva\\ ccc \\ dddd} {e \\ ff \hva\\ gg} $$
    
a       bbb  
ccc       dddd
e       ff
gg

B.17.16.4 Derivation trees

The mathpartir package provides a starred variant \inferrule*. In LATEX, the boxes produced by \inferrule and \inferrule* differ as regards their baseline, the second being well adapted to derivation trees. All this is irrelevant to HEVEA, but \inferrule* remains of interest because of its interface: the optional argument to the \inferrule* command is a list of key=value pairs in the style of keyval. This makes the variant command much more flexible.

keyEffect for value v
beforeExecute v before typesetting the rule. Useful for instance to change the maximal width of the rule.
leftPut a label v on the left of the rule
LeftIdem.
rightAs left, but on the right of the rule.
RightAs Left, but on the right of the rule.
labPut a label v above the inference rule, in the style of \inferrule.
LabIdem.
vdotsRaise the rule by v and insert vertical dots, the length argument is translated to a number of line-skips.

Additionally, the value-less key center centers premises and conclusions (this is the default), while flushleft commands left alignment of premises and conclusions (as \mprset{flushleft} does). Other keys defined by the LATEX package exist and are parsed, but they perform no operation.

As an example, the code

\begin{mathpar} \inferrule* [Left=Foo] {\inferrule* [Right=Bar,width=8em, leftskip=2em,rightskip=2em,vdots=1.5em] {a \and a \and bb \hva\\ cc \and dd} {ee} \and ff \and gg} {hh} \hva\and \inferrule* [lab=XX]{uu \and vv}{ww} \end{mathpar}

produces the following output:

Foo 
a       a       bb Bar
cc       dd 
ee 
      ff       gg
 hh
XX
uu       vv
ww

B.17.17 The ifpdf package

This package should be present in modern latex installations. Basically, the package defines a boolean register pdf, whose value is true for tools that produce PDF (such as pdflatex) and false for tools that produce DVI (such as latex).

The hevea version of the package simply defines the boolean register pdf with initial value true. Command-line option -pdf is also added to imagen command-line options (by using the command \@addimagenopt, see Section 10.7). As a result, imagen will normally call pdflatex in place of latex.

In case standard latex processing in imagen is wished, one can issue the command \pdffalse after loading the ifpdf package and before \begin{document}. Then, no command line option is added. Hence, to achieve latex processing of the image file, while still loading the ifpdf package, one writes:

\usepackage{ifpdf}
%HEVEA\pdffalse

B.17.18 Typesetting Thai

HEVEA features an implementation of Andrew Seagar’s technique for Thai in LATEX, by the means of the package thai.hva in the distribution.

As regards input encoding, Thai users of HEVEA could (perhaps) use \usepackage[utf8]{inputenc}. However, the typesetting of Thai is more subtle than just proper characters. For that reason, Thai in LATEX is better performed by another technique, which HEVEA supports. See this specific document.

B.17.19 Hanging paragraphs

The hanging package is implemented. HEVEA implementation consists of no-ops, except for the hangparas environment, which is partially implemented. Assume the following usage of hangparas:

\begin{hangparas}{wd}{n}  …\end{hangparas}

where wd is a length that makes sense both for LATEX and CSS (typically 2ex). Then html output will reproduce LATEX output for n=1, regardless of the given value of argument n. That is, in any paragraph inside the environment, all lines except the first get indented by wd.

B.17.20 The cleveref package

The cleveref package attempts (and mostly succeeds) typesetting references cleverly. Its main feature is a \cref command that accepts several, comma separated, label references and typesets them as a list (which can be one-element long, of course) prefixed with sectional unit names. The HEVEA implementation is quite complete, but it does not support some of the subtleties of the LATEX implementations, especially as regards customisation.

B.17.21 Other packages

The fancyverb and colortbl packages are partly implemented.

The xspace package is implemented, in simple cases, rendering is satisfactory, but beware: HEVEA differs significantly from TEX, and discrepancies are likely.

The chngcntr package is implemented. This package provides commands to connect (and disconnect) counters once they are created (see http://www.tex.ac.uk/cgi-bin/texfaq2html?label=addtoreset).

The import package is partially implemented: all starred commands are missing.

The booktabs package is implemented. This package provides nicer rulers in tables as specific commands. HEVEA defines those as no-ops.

Part C
Practical information

C.1 Usage

C.1.1 HEVEA usage

The hevea command has two operating modes, normal mode and filter mode. Operating mode is determined by the nature of the last command-line argument.

C.1.1.1 Command line arguments

The hevea command interprets its arguments as names of files and attempts to process them. Given an argument filename there are two cases:

  • If filename is base.tex or base.hva, then a single attempt to open filename is made.
  • In other cases, a first attempt to open filename.tex is made. In case of failure, a second attempt to open filename is made.

In all attempts, implicit filenames are searched along hevea search path, which consist in:

  1. the current directory “.”,
  2. user-specified directories (with the -I command-line option),
  3. hevea library directory.
  4. one of the sub-directories html, text or info from hevea library directory, depending upon hevea output format,

The hevea library directory is fixed at compile-time (this is where hevea library files are installed) and typically is /usr/local/lib/hevea. However, this compile-time value can be overridden by setting the HEVEADIR shell environment variable. In all cases, the value of hevea library directory can be accessed from the processed document as the value of the command \@hevealibdir.

C.1.1.2 Normal mode

If the last argument has an extension that is different from .hva or has no extension, then it is interpreted as the name of the main input file. The main input file is the document to be translated and normally contains the \documentclass command. In that case two basenames are defined:

  • The input basename, basein, is defined as the main input file name, with extension removed when present.
  • The output basename, baseout, is basein with leading directories omitted. However the output basename can be changed, using the -o option (see below).

HEVEA will attempt to load the main input file. Ancillary files from a previous run of LATEX (i.e. .aux, .bll and .idx files) will be searched as basein.ext. The output base name governs all files produced by HEVEA. That is, html output of HEVEA normally goes to the file baseout.html, while cross-referencing information goes into baseout.haux. Furthemore, if an image file is generated (cf. section 6), its name will be baseout.image.tex.

Thus, in the simple case where the hevea command is invoked as:

# hevea file.tex

The input basename is file and the output basename also is file. The main input file is searched once along hevea search path as file.tex. html output goes into file file.html, in the current directory. In the more complicated case where the hevea command is invoked as:

# hevea ./dir/file

The input base name is ./dir/file and the output basename is file. The main input file is loaded by first attempting to open file ./dir/file.tex, then file ./dir/file. html output goes into file file.html, in the current directory.

Finally, the output base name can be a full path, but you have to use option -o. For instance, we consider:

# hevea -o out/out.html file.tex

Then, html output goes into out/out.html — notice that directory out must exist. Furthermore, hevea output base name is out/out. This means that hevea generates files out/out.haux, out/out.image.tex etc.

The article.hva, seminar.hva, book.hva and report.hva base style files from HEVEA library are special. Only the first base style file is loaded and the \documentclass command has no effect when a base style file is already loaded. This feature allows to override the document base style. Thus, a document file.tex can be translated using the article base style as follows:

# hevea article.hva file.tex

C.1.1.3 Filter mode

If there is no command-line argument, or if the last command-line argument has the extension .hva, then there is neither input base name nor output base name, the standard input is read and output normally goes to the standard output. Output starts immediately, whithout waiting for \begin{document}. In other words hevea acts as a filter.

Please note that this operating mode is just for translating isolated LATEX constructs. The normal way to translate a full document file.tex being “hevea file.tex” and not “hevea < file.tex > file.html”.

C.1.1.4 Options

The hevea command recognises the following options:

-version
Show hevea version and exit.
-v
Verbose flag, can be repeated to increase verbosity. However, this is mostly for debug.
-dv
Add border around some of the block-level elements issued. Specifically, all div and p are bordered, while the structure of displayed material is also shown.
-s
Suppress warnings.
-I dirname
Add dirname to the search path.
-o name
Make name the output basename. However, if name is base.html, then the output basename is base. Besides, -o - makes HEVEA output to standard output.
-e filename
Prevent hevea from loading any file whose name is filename. Note that this option applies to all files, including hevea.hva and base style files.
-fix
Iterate HEVEA until a fixpoint is found. Additionally, images get generated automatically.
-O
Optimise html by calling esponja (see section C.1.3).
-exec prog
Execute file prog and read the output. The file prog must have execution permission and is searched by following the searching rules of hevea.
-francais
Deprecated by babel support. This option issues a warning message.
-help
Print version number and a short help message.

The following options control the html code produced by hevea. By default, hevea outputs a page encoded in US-ASCII with most symbols rendered as html or numerical Unicode entities.

-entities
Render symbols by using entities. This is the default.
-textsymbols
Render symbols by English text.
-moreenties
Enable the output of some infrequent entities. Use this option to target browsers with wide entities support.
-mathml
Produces MathML output for equations, very experimental.
-pedantic
Be strict in interpreting html definition. In particular, this option disable size and color changes inside <PRE></PRE>, which are otherwise performed.

The following options select and control alternative output formats (see section 11):

-text
Output plain text. Output file extension is .txt.
-info
Output info format. Output file extension is .info.
-w width
Set the line width for text or info output, defaults to 72.

Part A of this document is a tutorial introduction to HEVEA, while Part B is the reference manual of HEVEA.

C.1.2 HACHA usage

The hacha command interprets its argument base.html as the name of a html source file to cut into pieces.

It also recognises the following options:

-v
Be a little verbose.
-o filename
Make HACHA output go into file filename (defaults to index.html). Additionally, if filename is a composite filename, dir/base, then all files outputted by HACHA will reside in directory dir.
-tocbis
Another style for table of contents: sub-tables are replicated at the beginning of every file.
-tocter
Like -tocbis above, except that sub-tables do not appear in the main table of contents (see Section 7.2.3).
-no-svg-arrows
Use GIF arrows for the Previous/Up/Next links, in place of the default SVG arrows.
-nolinks
Do not insert Previous/Up/Next links in generated pages.
-hrf
Output a base.hrf file, showing in which output files are the anchors from the input file gone. The format of this summary is one “anchor\tfile” line per anchor. This information may be needed by other tools.
-help
Print version number and a short help message.

Section 7 of the user manual explains how to alter HACHA default behaviour.

C.1.3 esponja usage

The program esponja is part of HEVEA and is designed to optimise hevea output. However, esponja can also be used alone to optimise text-level elements in html files. Since esponja fails to operate when it detects incorrect html, it can be used as a partial html validator.

C.1.3.1 Operating mode

The program esponja interprets its arguments as names of files and attempt to process them. It is important to notice that esponja will replace files by their optimised versions, unless instructed not to do so with option -n.

Invoking esponja as

# esponja foo.html

will alter foo.html. Of course, if esponja does not succeed in making foo.html any smaller or if esponja fails, the original foo.html is left unchanged. Note that this feature allows to optimise all html files in a given directory by:

# esponja *.html

C.1.3.2 Options

The command esponja recognises the following options:

-v
Be verbose, can be repeated to increase verbosity.
-n
Do not alter input files. Instead, esponja output for file input.html goes to file input.esp. Option -n implies option -v.
-u
Output esponja intermediate version of html. In most occasions, this amounts to pessimize instead of to optimise. It may yield challenging input for other html optimisers.

C.1.4 bibhva usage

The program bibhva is a simple wrapper, which basically forces bibtex into accepting a .haux file as input and producing a .hbbl file as output. Usage is bibhva bibtex-options basename.

C.1.5 imagen usage

The command imagen is a simple shell script that translates a LATEX document into many .png images. The imagen script relies on much software to be installed on your computer, see Section C.4.1.

It is a companion program of HEVEA, which must have been previously run as:

# heveabase.tex
or
# hevea-o base.html

In both cases, base is HEVEA output basename. When told to do so (see section 6) HEVEA echoes part of its input into the base.image.tex file.

The imagen script should then be run as:

# imagen base

The imagen script produces one basennn.png image file per page in the base.image.tex file.

This is done by first calling latex on base.image.tex, yielding one dvi file. Then, dvips translates this file into one single Postscript file that contains all the images, or into one Postscript file per image, depending upon your version of dvips. Postscript files are interpreted by ghostscript (gs) that outputs ppm images, which are then fed into a series of transformations that change them into .png files.

The imagen script recognises the following options:

-mag nnnn
Change the enlarging ratio that is applied while translating DVI into Postscript. More precisely, dvips is run with -xnnnn option. Default value for this ration is 1414, this means that, by default, imagen magnifies LATEX output by a factor of 1.414.
-extra command
Insert command as an additional stage in imagen ppm to png production chain. command is an Unix filter that expects a ppm image in its standard input and outputs a ppm image on its standard output. A sensible choice for command is one command from the netpbm package, several such commands piped together, or various invocations of the convert command from ImageMagick.
-quant number
Add an extra color quantisation step in imagen ppm image production chain, where number is the maximal number of colors in the produced images. This option may be needed as a response to a failure in the image production chain. It can also help in limiting image files size.
-png
Output PNG images. This is the default.
-gif
Output GIF images in place of PNG images. GIF image files have a .gif extension. Note that hevea should have been previously run as hevea gif.hva base.tex (so that the proper .gif filename extension is given to image file references from within the html document).
-svg
Output SVG images in addition to PNG (or GIF) images. Note that hevea should have been previously run as hevea svg.hva base.tex.
-pnm
Output PPM images. This option mostly serves debugging purposes. Experimented users can also take advantage of it for performing additional image transformation or adopting exotic image formats.
-t arg
Pass option “-t arg” to dvips. For instance, using “-t a3” may help when images are truncated on the right.
-pdf
Have imagen call pdflatex instead of latex.

The first three options enable users to correct some misbehaviours. For instance, when the document base style is seminar, image orientation may be wrong and the images are too small. This can be cured by invoking imagen as:

# imagen -extra "pnmflip -ccw" -mag 2000 base

Notice that hevea calls imagen by itself, when given the command-line option -fix. In that situation, the command-line options of imagen can be controlled from source file by using the command \@addimagenopt (see Section 10.7).

C.1.6 Invoking hevea, hacha and imagen

In this section, we give a few sequence of (Unix) commands to build the html version of a document in various situations. The next section gives a few Makefile’s for similar situations.

We translate a file doc.tex that requires a specific style file doc.hva. The file is first translated into doc.html by hevea, which also reads the specific style file doc.hva. Then, hacha cuts doc.html into several, doc001.html, doc002.html, etc. also producing the table of links file index.html.

# hevea -fix doc.hva doc.tex
# hacha doc.html

Thanks to the command-line option -fix, hevea runs the appropriate number of times automatically. In case hevea produces a non-empty doc.image.tex file, then hevea calls imagen by itself (because of option -fix). Hence, the above sequence of two commands is also appropriate in that situation.

In case some problem occurs, it is sometime convenient to run imagen by hand. It is time not to use the option -fix.

# rm -f doc.image.tex
# hevea doc.hva doc.tex

Now, hevea normally has shown the imagen command line that it would have run, if it had been given the option -fix. For instance, if doc.hva includes \input{gif.hva}, then hevea shows the following warning:

HeVeA Warning: images may have changed, run 'imagen -gif doc'

Now, one can run imagen as it should be.

It is sometime convenient not to clobber the source directory with numerous target files. It suffices to instruct hevea and hacha to output files in a specific directory, say doc.

# hevea -fix -o doc/doc.html doc.hva doc.tex
# hacha -o doc/index.html doc/doc.html

Notice that hevea does not create the target directory doc: it must exist before hevea runs. Again, in case hevea calls imagen, image generation should proceed smoothly and the final files doc001.png, doc002.png, … should go into directory doc.

In all situations, while installing files to their final destination, it is important not to forget any relevant files. In particular, in addition to the root file (index.html), contents files (doc001.html, doc002.html, etc.) and images (doc001.png, doc002.png, etc.), one should not forget the arrow images and the style sheet generated by hacha (contents_motif.gif, next_motif.gif, previous_motif.gif and doc.css).

As a consequence, producing all files into the subdirectory doc may be a good idea, since then one easily install all relevant files by copying doc to a public destination.

# cp -r doc $(HOME)/public_html

However, one then also installs the auxiliary files of hevea, and hevea output file doc.html, which is no longer useful once hacha has run. Hence, those should be erased beforehand.

# rm -f doc/doc.h{tml,aux,ind,toc} doc/doc.image.tex
# cp -r doc $(HOME)/public_html

C.1.7 Using make

Here is a typical Makefile, which is appropriate when no images are produced.

HEVEA=hevea
HEVEAOPTS=-fix
HACHA=hacha
#document base name
DOC=doc
index.html: $(DOC).html
        $(HACHA) -o index.html $(DOC).html

$(DOC).html: $(DOC).hva $(DOC).tex
        $(HEVEA) $(HEVEAOPTS) $(DOC).hva $(DOC).tex

clean:
        rm -f $(DOC).html $(DOC).h{toc,aux,ind}
        rm -f index.html $(DOC)[0-9][0-9][0-9].html $(DOC).css

Note that the clean rule removes all the doc001.html, doc002.html, etc. and doc.css files produced by hacha. Also note that make clean also removes the doc.haux, doc.hind and doc.htoc files, which are HEVEA auxiliary files.

When the image file feature is used, one can use the following, extended, Makefile:

HEVEA=hevea
HEVEAOPTS=-fix
HACHA=hacha
#document base name
DOC=doc
index.html: $(DOC).html
        $(HACHA) -o index.html $(DOC).html

$(DOC).html: $(DOC).hva $(DOC).tex
        $(HEVEA) $(HEVEAOPTS) $(DOC).hva $(DOC).tex

clean:
        rm -f $(DOC).html $(DOC).h{toc,aux,ind}
        rm -f index.html $(DOC)[0-9][0-9][0-9].html $(DOC).css
        rm -f $(DOC).image.* $(DOC)[0-9][0-9][0-9].png *_motif.gif

Observe that the clean rule now also gets rid of doc.image.tex and of the various files produced by imagen.

With the following Makefile, hevea, imagen, hacha all output their files into a specific directory DIR.

HEVEA=hevea
HEVEAOPTS=-fix
HACHA=hacha
#document base name
DOC=doc
DIR=$(HOME)/public_html/$(DOC)
BASE=$(DIR)/$(DOC)

$(DIR)/index.html: $(BASE).html
        $(HACHA) -tocter -o $(DIR)/index.html $(BASE).html

$(BASE).html: $(DOC).hva $(DOC).tex
        $(HEVEA) $(HEVEAOPTS) $(DOC).hva -o $(BASE).html $(DOC).tex

partialclean:
        rm -f $(BASE).h{tml,aux,toc,ind} $(BASE).image.*

clean:
        rm -f $(DIR)/*

The above Makefile directly produces html and PNG files into the final directory $(HOME)/public_html/$(DOC). The new partialclean entry erases files that are not useful anymore, once imagen and hacha have performed their tasks.

However, most often, it is more appropriate to build html and PNG files in a specific directory, and then to copy them to their final destination.

   ...

#document base name
DOC=doc
DIR=$(DOC)
BASE=$(DIR)/$(DOC)
INSTALLDIR=$(HOME)/public_html/$(DOC)

  ...

install: partialclean
        cp $(DIR)/* $(INSTALLDIR)
  ...

C.2 Browser configuration

By default, HEVEA does not anymore use the FACE=symbol attribute to the <FONT ...> tag. As a consequence, browser configuration is no longer needed.

HEVEA now extensively outputs Unicode entities. This first means that HEVEA targets modern browsers with decent unicode support, and only those.

In case your browser is recent and that you nevertheless experience display problems on HEVEA-generated pages, see the excellent Alan Wood’s Unicode Resources. It may help to understand display problems and even to solve them by configuring browsers or installing some fonts.

C.3 Availability

C.3.1 Internet stuff

HEVEA home page is http://hevea.inria.fr/. It contains links to the on-line manual and to the distribution.

The author can be contacted at Luc.Maranget@inria.fr.

C.3.2 Law

HEVEA can be freely used and redistributed without modifications. Modifying and redistributing HEVEA implies a few constraints. More precisely, HEVEA is distributed under the terms of the Q Public License, but HEVEA binaries include the Objective Caml runtime system, which is distributed under the Gnu Library General Public License (LGPL). See the LICENSE file for details.

The manual itself is distributed under the terms of the Free Document Dissemination Licence.

C.4 Installation

C.4.1 Requirements

The programs hevea and hacha are written in Objective Caml. Thus, you really need Objective Caml (the more recent version, the better) to compile them. However, some binary distributions exist, which are managed by people other than me (thanks to them). Links to some of these distributions appear in HEVEA home page.

HEVEA users may instruct the program not to process a part of the input (see section 6). Instead, this part is processed into a bitmap file and HEVEA outputs a link to the image file. LATEX source is changed into .png images by the imagen script, which basically calls, LATEX, dvips, ghostscript and the convert command from the image processing package ImageMagick.

To benefit from the full functionality of HEVEA, you need all this software. However, HEVEA runs without them, but then you will have to produce images by yourself.

C.4.2 Principles

The details are given in the README file from the distribution. Basically, HEVEA should be given a library directory. The installation procedure stores the hevea.hva and base style files in this directory. There are two compilation modes, the opt mode selects the native code OCaml compiler ocamlopt, while the byte mode selects the bytecode OCaml compiler ocamlc. In HEVEA case, ocamlopt produces code that is up to three times as fast as the one produced by ocamlc. Thus, default compilation mode is opt, however it may be the case on some systems that only ocamlc is available.

Note that, when installing HEVEA from the source distribution, the hevea.sty (and mathjax.sty) style files are simply copied to HEVEA library directory. It remains users (and package maintainers) responsibility to make those files accessible to LATEX.

C.5 Other LATEX to html translators

This short section gives pointers to a few other translators. I performed not extensive testing and make no thorough comparison.

LaTeX2html
LaTeX2html is a full system. It is written in perl and calls LATEX when in trouble. As a consequence, LaTeX2html is powerful but it may fail on large documents, for speed and memory reasons. More information on LaTeX2html can be found at
TTH
The principle behind TTH is the same as the one of HEVEA: write a fast translator as a lexer, use symbol fonts and tables. However, there are differences, TTH accepts both TEX and LATEX source, TTH is written in C and the full source is not available (only lex output is available). Additionally, TTH insist on not using any kind of LATEX generated information and will show proper cross-reference labels, even when no .aux file is present. TTH output is a single document, whereas HACHA can cut the output of HEVEA into several files. (however there exists a commercial version of TTH that provides this extra functionality). TTH can be found at
TeX4ht
TeX4ht is a highly configurable TeX-based authoring system dedicated mainly to produce hypertext. It interacts with TeX-based applications through style files and postprocessors, leaving the processing of the source files to the native TeX compiler. As a result, TeX4ht may be more powerful than HEVEA, but may also be more difficult to configure. More information on TeX4ht can be found at:
htmlgen
The htmlgen translator is specialized for producing the Caml manuals. This is HEVEA direct ancestor and I owe much to its author, X. Leroy. See [htmlgen] for a description of htmlgen and a (bit outdated) discussion on LATEX to html translation.

C.6 Acknowledgements

The following people contributed to HEVEA development:

  • Philip A.Viton, maintains a Windows (win32) port of HEVEA.
  • Tibault Suzanne authored the HTML 5 generator that now is the default generator of HEVEA.
  • Abhishek Thakur implemented most of the new features of version 1.08, including, translations of symbols to Unicode entities, the babel package, and style sheet support.
  • Christian Queinnec wrote an extra lexer to translate code snippets produced by its tool VideoC for writing pedagogical documents on programming. The very principle he introduced for interfacing the videoc lexer with HEVEA main lexer is now used extensively throughout HEVEA source code.
  • Andrew Seagar is at the origin of support for the Thai language. He is the author of the document “How to Use HEVEA with the Thai Character Set”.
  • Pierre Boulet, by using HEVEA as a stage in his tool MlDoc for documenting Objective Caml source code, forced me into debugging HEVEA implementation of the alltt environment.
  • Nicolas Tessaud implemented the -text and -info output modes (see section 11).
  • Georges Mariano asked for many feature, and argued a lot to have them implemented.
  • Many users contributed by sending bug reports.

References

[LATEX-bis]
M. Gooseens, F. Mittelbach, A. Samarin. The LATEX Companion Addison-Websley, 1994.
[LATEX]
L. Lamport. A Document Preparation System System, LATEX, User’s Guide and Reference Manual. Addison-Websley, 1994.
[htmlgen]
X. Leroy. Lessons learned from the translation of documentation from LATEX to html. ERCIM/W4G Int. Workshop on WWW Authoring and Integration Tools, 1995. Available on the web at http://cristal.inria.fr/~xleroy/w4g.html
[HTML-4.0]
D. Ragget, A. Le Hors and I. Jacobs. HTML 4.0 Reference Specification. Available on the web at http://www.w3.org/TR/REC-html40, 1997.
[HTML-5a]
W3C HTML Working groups. HTML5 A vocabulary and associated APIs for HTML and XHTML http://dev.w3.org/html5/spec/spec.html, 2012.
[HTML-5b]
HTML Living Standard http://www.whatwg.org/specs/web-apps/current-work/multipage/, 2012.
[CSS-2]
Bert Bos, Tantek Çelik, Ian Hickson and Håkon Wium Lie. Cascading Style Sheets, Level 2 Revision 2 Specification. Available on the web at http://www.w3.org/TR/REC-CSS2/, 2011.

Index


*
Inria Paris – CS 42112, 75589 Paris Cedex 12. Luc.Maranget@inria.fr

This document was translated from LATEX by HEVEA.
hevea-2.36-manual/manual024.html0000644004317100512160000001370114252364056016437 0ustar marangetcristal The Structure of the Document Previous Up Next

B.2 The Structure of the Document

Document structure is a bit simplified with respect to LATEX, since documents consist of only two parts. The preamble starts as soon as HEVEA starts to operate and ends with the \begin{document} construct. Then, any input occurring before \end{document} is translated to html. However, the preamble is processed and the preamble comprises the content of the files given as command-line arguments to HEVEA, see section C.1.1.1). As a consequence, command and environment definitions that occur before \begin{document} are performed. and they remain valid during all the processing.

In particular one can define a header and a footer, by using the \htmlhead and \htmlfoot commands in the preamble. Those commands register their argument as the header and the footer of the final html document. The header appears first while the footer appears last in (visible) html output. This is mostly useful when HEVEA output is later cut into pieces by HACHA, since both header and footer are replicated at the start and end of any file generated by HACHA. For instance, to append a copyright notice at the end of all the html pages, it suffices to invoke the \htmlfoot command as follows in the document preamble:

\htmlfoot{\copyright to me}

The \htmlhead command cannot be used for changing anything outside of the html document body, there are specific commands for doing this. Those command must be used in the document preamble. One can change HEVEA default (empty) attribute of the opening <body ...> tag by redefining \@bodyargs. For instance, you get black text on a white background, when the following declaration occurs before \begin{document}:

\renewcommand{\@bodyargs}{style="color:black;background:white"}

Since version 1.08, a recommended alternative is to use style sheets:

\newstyle{body}{color:black; background:white;}

One can also change the default (empty) attribute of the opening <html ...> tag by redefining \@htmlargs. For instance you can set the language attribute of the whole document by issuing the following redefinition in the document preamble:

\renewcommand{\@htmlargs}{lang=en}

Similarly, some elements can be inserted into the output file head element by redefining the \@meta command (Such elements typically are meta, link, etc.). As such text is pure html, it should be included in a rawhtml environment. For instance, you can specify author information as follows:

\let\oldmeta=\@meta
\renewcommand{\@meta}{%
\oldmeta
\begin{rawhtml}
<meta name="Author" content="Luc Maranget">
\end{rawhtml}}

Note how \@meta is first bound to \oldmeta before being redefined and how \oldmeta is invoked in the new definition of \@meta. Namely, simply overriding the old definition of \@meta would imply not outputting default meta-information.

The \@charset command holds the value of the (html) document character set. By default, this value is US-ASCII. In previous versions of HEVEA, one could change the value of the document character set by simply redefining \@charset. Then, it was users responsability to provide a (LATEX) document in the correspounding encoding. This is no longer so, and users should not redefine \@charset directly. Please, see Section 8.6 for details.


Previous Up Next hevea-2.36-manual/manual002.html0000644004317100512160000001165614252364056016442 0ustar marangetcristal Tutorial Up Next

Part A
Tutorial


Up Next hevea-2.36-manual/manual018.html0000644004317100512160000014132114252364056016442 0ustar marangetcristal Generating html constructs Previous Up Next

8 Generating html constructs

HEVEA output language being html, it is normal for users to insert hypertext constructs their documents, or to control colours.

8.1 High-Level Commands

HEVEA provides high-level commands for generating hypertext constructs. Users are advised to use these commands in the first place, because it is easy to write incorrect html and that writing html directly may interfere in nasty ways with HEVEA internals.

A few commands for hyperlink management and included images are provided, all these commands have appropriate equivalents defined by the hevea package (see section 5.2). Hence, a document that relies on these high-level commands still can be typeset by LATEX, provided it loads the hevea package.

MacroHEVEALATEX
\ahref{url}{text}  make text an hyperlink to url  echo text
\footahref{url}{text}  make text an hyperlink to url  make url a footnote to text, url is shown in typewriter font
\ahrefurl{url}  make url an hyperlink to url.  typeset url in typewriter font
\ahrefloc{label}{text}  make text an hyperlink to label inside the document  echo text
\aname{label}{text}  make text an hyperlink target with label label  echo text
\mailto{address}  make address a “mailto” link to address  typeset address in typewriter font
\imgsrc[attr]{url}  insert url as an image, attr are attributes in the html sense  do nothing
\home{text}  produce a home-dir url both for output and links, output aspect is: “~text

It is important to notice that all arguments are processed. For instance, to insert a link to my home page, (http://pauillac.inria.fr/~maranget/index.html), you should do something like this:

\ahref{http://pauillac.inria.fr/\home{maranget}/index.html}{his home page}

Given the frequency of ~, # etc. in urls, this is annoying. Moreover, the immediate solution, using \verb, \ahref{\verb" ... /~maranget/..."}{his home page} does not work, since LATEX forbids verbatim formatting inside command arguments.

Fortunately, the url package provides a very convenient \url command that acts like \verb and can appear in other command arguments (unfortunately, this is not the full story, see section B.17.12). Hence, provided the url package is loaded, a more convenient reformulation of the example above is:

\ahref{\url{http://pauillac.inria.fr/~maranget/index.html}}{his home page}

Or even better:

\urldef{\lucpage}{\url}{http://pauillac.inria.fr/~maranget/index.html}
\ahref{\lucpage}{his home page}

It may seem complicated, but this is a safe way to have a document processed both by LATEX and HEVEA. Drawing a line between url typesetting and hyperlinks is correct, because users may sometime want urls to be processed and some other times not. Moreover, HEVEA (optionally) depends on only one third party package: url, which is as correct as it can be and well-written.

In case the \url command is undefined at the time \begin{document} is processed, the commands \url, \oneurl and \footurl are defined as synonymous for \ahref, \ahrefurl and \footahref, thereby ensuring some compatibility with older versions of HEVEA. Note that this usage of \url is deprecated.

8.1.2 html style colours

Specifying colours both for LATEX and HEVEA should be done using the color package (see section B.14.2). However,one can also specify text color using special type style declarations. The hevea.sty style file define no equivalent for these declarations, which therefore are for HEVEA consumption only.

Those declarations follow html conventions for colours. There are sixteen predefined colours:

\black, \silver, \gray, \white, \maroon, \red, \fuchsia, \purple, \green, \lime, \olive, \yellow, \navy, \blue, \teal, \aqua

Additionally, the current text color can be changed by the declaration \htmlcolor{number}, where number is a six digit hexadecimal number specifying a color in the RGB space. For instance, the declaration \htmlcolor{404040} changes font color to dark gray,

8.2 More on included images

The \imgsrc command becomes handy when one has images both in Postscript and GIF (or PNG or JPG) format. As explained in section 6.3, Postscript images can be included in LATEX documents by using the \epsfbox command from the epsf package. For instance, if screenshot.ps is an encapsulated Postscript file, then a doc.tex document can include it by:

\epsfbox{screenshot.ps}

We may very well also have a GIF version of the screenshot image (or be able to produce one easily using image converting tools), let us store it in a screenshot.ps.gif file. Then, for HEVEA to include a link to the GIF image in its output, it suffices to define the \epsfbox command in the macro.hva file as follows:

\newcommand{\epsfbox}[1]{\imgsrc{#1.gif}}

Then HEVEA has to be run as:

# hevea macros.hva doc.tex

Since it has its own definition of \epsfbox, HEVEA will silently include a link the GIF image and not to the Postscript image.

If another naming scheme for image files is preferred, there are alternatives. For instance, assume that Postscript files are of the kind name.ps, while GIF files are of the kind name.gif. Then, images can be included using \includeimage{name}, where \includeimage is a specific user-defined command:

\newcommand{\includeimage}[1]{\ifhevea\imgsrc{#1.gif}\else\epsfbox{#1.ps}\fi}

Note that this method uses the hevea boolean register (see section 5.2.3). If one does not wish to load the hevea.sty file, one can adopt the slightly more verbose definition:

\newcommand{\includeimage}[1]{%
%HEVEA\imgsrc{#1.gif}%
%BEGIN LATEX
\epsfbox{#1.ps}
%END LATEX
}

When the Postscript file has been produced by translating a bitmap file, this simple method of making a bitmap image and using the \imgsrc command is the most adequate. It should be preferred over using the more automated image file mechanism (see section 6), which will translate the image back from Postscript to bitmap format and will thus degrade it.

8.3 Internal macros

In this section a few of HEVEA internal macros are described. Internal macros occur at the final expansion stage of HEVEA and invoke Objective Caml code.

Normally, user source code should not use them, since their behaviour may change from one version of HEVEA to another and because using them incorrectly easily crashes HEVEA. However:

  • Internal macros are almost mandatory for writing supplementary base style files.
  • Casual usage is a convenient (but dangerous) way to finely control output (cf. the examples in the next section).
  • Knowing a little about internal macros helps in understanding how HEVEA works.

The general principle of HEVEA is that LATEX environments \begin{env}\end{env} get translated into html block-level elements <block attributes></block>. More specifically, such block level elements are opened by the internal macro \@open and closed by the internal macro \@close. As a special case, LATEX groups {} get translated into html groups, which are shadow block-level elements with neither opening nor closing tag.

In the following few paragraphs, we sketch the interaction of \@open\@close with paragraphs. Doing so, we intend to warn users about the complexity of the task of producing correct html, and to encourage them to use internal macros, which, most of the time, take nasty details into account.

Paragraphs are rendered by p elements, which are opened and closed automatically. More specifically, a first p is opened after \begin{document}, then paragraph breaks close the active p and open a new one. The final \end{document} closes the last p. In any occasion, paragraphs consisting only of space characters are discarded silently.

Following html “normative reference [HTML-5a]”, block-level elements cannot occur inside p; more precisely, block-level opening tags implicitly close any active p. As a consequence, HEVEA closes the active p element when it processes \@open and opens a new p when it processes the matching \@close. Generally, no p element is opened by default inside block-level elements, that is, HEVEA does not immediately open p after having processed \@open. However, if a paragraph break occurs later, then a new p element is opened, and will be closed automatically when the current block is closed. Thus, the first “paragraph” inside block-level elements that include several paragraphs is not a p element. That alone probably prevents the consistent styling of paragraphs with style sheets.

Groups behave differently, opening or closing them does not close nor open p elements. However, processing paragraph breaks inside groups involves temporarily closing all groups up to the nearest enclosing p, closing it, opening a new p and finally re-opening all groups. Opening a block-level element inside a group, similarly involves closing the active p and opening a new p when the matching \@close is processed.

Finally, display mode (as introduced by $$) is also complicated. Displays basically are table elements with one row (tr), and HEVEA manages to introduce table cells (td) where appropriate. Processing \@open inside a display means closing the current cell, starting a new cell, opening the specified block, and then immediately opening a new display. Processing the matching \@close closes the internal display, then the specified block, then the cell and finally opens a new cell. In many occasions (in particular for groups), either cell break or the internal display may get cancelled.

It is important to notice that primitive arguments are processed (except for the \@print primitive, and for some of the basic style primitives). Thus, some characters cannot be given directly (e.g. # and % must be given as \# and \%).

\@print{text}
Echo text verbatim. As a consequence use only ASCII in text.
\@getprint{text}
Process text using a special output mode that strips off html tags. This macro is the one to use for processed attributes of html tags.
\@hr[attr]{width}{height}
Output an hr element, this is, a horizontal rule. Optional argument attr are attributes passed on directly (e.g. size=3 noshade), while width and height are length arguments given in LATEX style (e.g. 2pt or .5\linewidth).

Users can style the rules generated with \@hr by overriding class horizontal-rule.

\@print@u{n}
Output Unicode character “n” which can be given either as a decimal number or as a hexadecimal number prefixed with “X”.
\@open{block}{attributes}
Open html block-level element block with attributes attributes. The block name block must be lowercase.

As a special case, block may be the empty string, then an html group is opened. Argument block cannot be p; use \@open@par to open a paragraph element.

\@close{block}
Close html block-level element block. Note that \@open and \@close must be properly balanced.
\@open@par[attributes]
Open a paragraph block element, which optionally gets attributes attributes.
\@close@par
Close a paragraph block element. Note that \@open@par and \@close@par also must be properly balanced.
\@out@par{arg}
If occurring inside a p element, that is, if a <p> opening tag is active, \@out@par first closes it (by emitting </p>), formats arg, and then re-opens a p element. Otherwise, \@out@par simply formats arg. This command is adequate when formatting arg produces block-level elements.

Text-level elements are managed differently. They are not seen as blocks that must be closed explicitly. Instead they follow a “declaration” style, similar to the one of LATEX “text-style declarations” — namely, \itshape, \em etc. Block-level elements (and html groups) delimit the effect of such declarations.

\@span{attr}
Declare the text-level element span (with given attributes) as active. The text-level element span will get opened as soon as necessary and closed automatically, when the enclosing block-level elements get closed. Enclosed block-level elements are treated properly by closing span before them, and re-opening span (with given attributes) inside them. The following text-level constructs exhibit similar behaviour with respect to block-level elements.
\@style{shape}
Declare the text shape shape (which must be lowercase) as active. Text shapes are known as font style elements (i, tt, etc.; warning: most of font style elements are depreciated in html5, and some of them are no longer valid, prefer CSS in span tags) or phrase elements (em, etc.) in the html terminology.
\@styleattr{name}{attr}
This command generalises both \@span and \@style, as both a text-level element name name and attributes are specified. More specifically, \@span{attr} can be seen as a shorthand for \@styleattr{span}{attr}; while \@style{name} can be seen as a shorthand for \@styleattr{name}{}.
\@fontsize{int}
Declare the text-level element span with attribute style="font-size:font-size" as active. The argument int must be a small integer in the range 1,2, … , 7. hevea computes font-size, a CSS fontsize value, from int. More specifically, font-size will range from x-small to 120% included in a xx-large, 3 being the default size medium. Notice that \@fontsize is deprecated in favour of \@span with proper fontsize declarations: \@span{style="font-size=xx-small"}, \@span{style="font-size=x-small"}, \@span{style="font-size=small"}, etc.
\@fontcolor{color}
Declare the text-level element span with attribute "style=color" as active. The argument color must be a color attribute value in the html style. That is either one of the sixteen conventional colours black, silver etc, or a RGB hexadecimal color specification of the form #XXXXXX. Note that the argument color is processed, as a consequence numerical color arguments should be given as \#XXXXXX.
\@nostyle
Close active text-level declarations and ignore further text-level declarations. The effect stops when the enclosing block-level element is closed.
\@clearstyle
Simply close active text-level declarations.

Notice on font styling with CSS

The preferred way to style text in new versions of the html “standard” is using style-sheet specifications. Those can be given as argument to a “style” attributes of html elements, most noticeably of the span elements. For instance, to get italics in old versions of html one used the text-level “i” element as in <i></i>. Now, for the same results of getting italics one may write: <span style="font-style:italic"></span>. An indeed hevea styles text in that manner, starting from version 2.00. Such (verbose) declarations are then abstracted into style class declarations by HEVEA optimiser esponja, which is invoked by hevea when given option “-O”.

Notice that style attributes can be given to elements other than span. However, combining style attributes requires a little care as only one style attribute is allowed. Namely <cite style="font-weight:bold" style="color:red"> is illegal and should be written <cite style="font-weight:bold;color:red">. For instance: Das Kapital.

The command \@addtyle can be handy for adding style to already styled elements:

\@addstyle{name:val}{attrs}
Echo the space-separated attributes attrs of a tag with the name:val style declaration added to these attributes. The style attribute is added if necessary. Examples: \@addstyle{color:red}{href="#"} will produce href="#" style="color:red", and \@addstyle{color:red}{href="#" style="font-style:italic"} will produce href="#" style="font-style:italic;color:red". Note that an unnecessary extra space can be added in some cases.

As an example, consider the following definition of a command for typesetting citation in bold, written directly in html:

\newcommand{\styledcite}[2][]
{{\@styleattr{cite}{\@addstyle{#1}{style="font-weight:bold"}}#2}}

The purpose of the optional argument is to add style to specific citations, as in:

Two fundamental works: \styledcite{The Holy Bible} and
\styledcite[color:red]{Das Kapital}.

We get: Two fundamental works: The Holy Bible and Das Kapital.

Notice that the example is given for illustrating the usage of the \@addstyle macros, which is intended for package writers. A probably simpler way to proceed would be to use LATEX text-style declarations:

\newcommand{styledcite}[2][]{{\@style{cite}#1\bf{}#2}}
Two fundamental works: \styledcite{The Holy Bible} and
\styledcite[\color{red}]{Das Kapital}.

We get: Two fundamental works: The Holy Bible and Das Kapital.

8.4 The rawhtml environment

Any text enclosed between \begin{rawhtml} and \end{rawhtml} is echoed verbatim into the html output file. Similarly, \rawhtmlinput{file} echoes the contents of file file. In fact, rawhtml is the environment counterpart of the \@print command, but experience showed it to be much more error prone.

When HEVEA was less sophisticated then it is now, rawhtml was quite convenient. But, as time went by, numerous pitfalls around rawhtml showed up. Here are a few:

  • Verbatim means that no translation of any kind is performed. In particular, be aware that input encoding (see B.17.4) does not apply. Hence one should use ascii only, if needed non-ascii characters can be given as entity or numerical character references — e.g. &eacute; or &#XE9; for é.
  • The rawhtml environment should contain only html text that makes sense alone. For instance, writing \begin{rawhtml}<table>\end{rawhtml}\begin{rawhtml}</table>\end{rawhtml} is dangerous, because HEVEA is not informed about opening and closing the block-level element table. In that case, one should use the internal macros \@open and \@close.
  • \begin{rawhtml}text\end{rawhtml} fragments that contain block-level elements will almost certainly mix poorly with p elements (introduced by paragraph breaks) and with active style declaration (introduced by, for instance, \it). Safe usage will most of the time means using the internal macros \@nostyle and \@out@par.
  • When HEVEA is given the command-line option -O, checking and optimisation of text-level elements in the whole document takes place. As a consequence, incorrect html introduced by using the rawhtml environment may be detected at a later stage, but this is far from being certain.

As a conclusion, do not use the rawhtml environment! A much safer option is to use the htmlonly environment and to write LATEX code. For instance, in place of writing:

\begin{rawhtml}
A list of links:
<ul>
<li><a href="http://www.apple.com/">Apple</a>.
<li><a href="http://www.sun.com/">Sun</a>.
</ul>
\end{rawhtml}

One can write:

\begin{htmlonly}
A list of links:
\begin{itemize}
\item \ahref{http://www.apple.com/}{Apple}.
\item \ahref{http://www.sun.com/}{Sun}.
\end{itemize}
\end{htmlonly}

A list of links:

If HEVEA is targeted to text or info files (see Section 11). The text inside rawhtml environments is ignored. However there exists a rawtext environment (and a \rawtextinput command) to echo text verbatim in text or info output mode. Additionally, the raw environment and a \rawinput command echo their contents verbatim, regardless of HEVEA output mode. Of course, when HEVEA produces html, the latter environment and command suffer from the same drawbacks as rawhtml.

8.5 Examples

As a first example of using internal macros, consider the following excerpt from the hevea.hva file that defines the center environment:

\newenvironment{center}{\@open{div}{style="text-align:center"}}{\@close{div}}

Notice that the code above is no longer present and is given here for explanatory purpose only. Now HEVEA uses style-sheets and the actual definition of the center environment is as follows:

\newstyle{.center}{text-align:center;margin-left:auto;margin-right:auto;}%
\setenvclass{center}{center}%
\newenvironment{center}
  {\@open{div}{\@getprint{class="\getenvclass{center}"}}
  {\@close{div}}%

Basically environments \begin{center}\end{center} will, by default, be translated into blocks <div class="center"></div>. Additionally, the style class associated to center environments is managed through an indirection, using the commands \setenvclass and \getenvclass. See section 9.3 for more explanations.

Another example is the definition of the \purple color declaration (see section 8.1.2):

\newcommand{\purple}{\@fontcolor{purple}}

HEVEA does not feature all text-level elements by default. However one can easily use them with internal macros. For instance this is how you can make all emphasised text blink:

\renewcommand{\em}{\@styleattr{em}{style="text-decoration:blink"}}

Here is an example of this questionable blinking feature:

Hello!

Then, here is the definition of a simplified \imgsrc command (see section 8.1.1), without its optional argument:

\newcommand{\imgsrc}[1]
  {\@print{<img src="}\@getprint{#1}\@print{">}}

Here, \@print and \@getprint are used to output html text, depending upon whether this text requires processing or not. Note that \@open{img}{src="#1"} is not correct, because the element img consists in a single tag, without a closing tag.

Another interesting example is the definition of the command \@doaelement, which HEVEA uses internally to output A elements.

\newcommand{\@doaelement}[2]
  {{\@nostyle\@print{<a }\@getprint{#1}\@print{>}}{#2}{\@nostyle\@print{</a>}}

The command \@doaelement takes two arguments: the first argument contains the opening tag attributes; while the second element is the textual content of the A element. By contrast with the \imgsrc example above, tags are emitted inside groups where styles are cancelled by using the \@nostyle declaration. Such a complication is needed, so as to avoid breaking proper nesting of text-level elements.

Here is another example of direct block opening. The bgcolor environment from the color package locally changes background color (see section B.14.2.1). This environment is defined as follows:

\newenvironment{bgcolor}[2][style="padding:1em"]
{\@open{table}{}\@open{tr}{}%
\@open{td}{\@addstyle{background-color:\@getcolor{#2}}{#1}}}
{\@close{td}\@close{tr}\@close{table}}

The bgcolor environment operates by opening a html table (table) with only one row (tr) and cell (td) in its opening command, and closing all these elements in its closing command. In my opinion, such a style of opening block-level elements in environment opening commands and closing them in environment closing commands is good style. The one cell background color is forced with a background-color property in a style attribute. Note that the mandatory argument to \begin{bgcolor} is the background color expressed as a high-level color, which therefore needs to be translated into a low-level color by using the \@getcolor internal macro from the color package. Additionally, \begin{bgcolor} takes html attributes as an optional argument. These attributes are the ones of the table element.

If you wish to output a given Unicode character whose value you know, the recommended technique is to define an ad-hoc command that simply call the \@print@u command. For instance, “blackboard sigma” is Unicode U+02140 (hexa). Hence you can define the command \bbsigma as follows:

\newcommand{\bbsigma}{\@print@u{X2140}}

Then, “\bbsigma” will output “⅀”

8.6 The document charset

According to standards, as far as I understand them, html pages are made of Unicode (ISO 10646) characters. By contrast, a file in any operating system is usually considered as being made of bytes.

To account for that fact, html pages usually specify a document charset that defines a translation from a flow of bytes to a flow of characters. For instance, the byte 0xA4 means Unicode 0x00A4 (¤) in the ISO-8859-1 (or latin1) encoding, and 0x20AC (€) in the ISO-8859-15 (or latin9) encoding. Notice that HEVEA has no difficulty to output both symbols, in fact they are defined as Unicode characters:

\newcommand{\textcurrency}{\@print@u{XA4}}
\newcommand{\texteuro}{\@print@u{X20AC}}

But the \@print@u command may output the specified character as a byte, when possible, by the means of the output translator. If not possible, \@print@u outputs a numerical character references (for instance &#X20AC;).

Of course, the document charset and the output translator must be synchronised. The command \@def@charset takes a charset name as argument and performs the operation of specifying the document character set and the output translator. It should occur in the document preamble. Valid charset names are ISO-8859-n where n is a number in 115, KOI8-R, US-ASCII (the default), windows-n where n is 1250, 1251, 1252 or 1257, or macintosh, or UTF-8. In case those charsets do not suffice, you may ask the author for other document charsets. Notice however that document charset is not that important, the default US-ASCII works everywhere! Input encoding of source files is another, although related, issue — see Section B.17.4.

If wished so, the charset can be extracted from the current locale environment, provided this yields a valid (to HEVEA) charset name. This operation is performed by a companion script: xxcharset.exe. It thus suffices to launch HEVEA as:

# hevea -exec xxcharset.exe other arguments

Previous Up Next hevea-2.36-manual/manual037.html0000644004317100512160000001521414252364056016444 0ustar marangetcristal Font Selection Previous Up Next

B.15 Font Selection

B.15.1 Changing the Type Style

All LATEX 2є declarations and environments for changing type style are recognised. Aspect is rather like LATEX 2є output, but there is no guarantee.

As html does not provide the same variety of type styles as LATEX does. However css provide a wide variety of font properties. HEVEA uses generic properties, proper rendering will then depend upon user agent. For instance, it belongs to the user agent to make a difference between italics (rendered by the font style “italic”) and slanted (rendered by the font style “oblique”).

Here is how HEVEA implements text-style declarations by default:

\itshapefont-style:italic
\slshapefont-style:oblique
\scshapefont-variant:small-caps
\upshapeno style
\ttfamilyfont-family:monospace
\sffamilyfont-family:sans-serif
\rmfamilyno style
\bfseriesfont-weight:bold
\mdseriesno style

Text-style commands also exists, they are defined as \mbox{\decl}. For instance, \texttt is defined as a command with one argument whose body is \mbox{\ttfamily#1}. Finally, the \emph command for emphasised text also exists, it yields text-level em elements.

As in LATEX, type styles consists in three components: shape, series and family. HEVEA implements the three components by making one declaration to cancel the effect of other declarations of the same kind. For instance consider the following source, that exhibits shape changes:

{\itshape italic shape \slshape slanted shape
\scshape small caps shape \upshape upright shape}

Then, in the rendering below, “small caps shape” appears in small caps shape only and not in italics:

italic shape slanted shape small caps shape upright shape

Old style declarations are also recognised, they translate to text-level elements. However, no elements are cancelled when using old style declaration. Thus, the source “{\sl\sc slanted and small caps}” yields “slanted” small caps: “slanted and small caps”. Users need probably not worry about this. However this has an important practical consequence: to change the default rendering of type styles, one should redefine old style declaration in order to benefit from the cancellation mechanism. See section 10.2 for a more thorough description.

B.15.2 Changing the Type Size

All declarations, from \tiny to \Huge are recognised. Output is not satisfactory inside headers elements generated by sectioning commands.

B.15.3 Special Symbols

The \symbol{num} outputs character number num (decimal) from the Unicode character set. This departs from LATEX, which output symbol number num in the current font.


Previous Up Next hevea-2.36-manual/cutname.html0000644004317100512160000010647314252364056016401 0ustar marangetcristal Cutting your document into pieces with HACHA Previous Up Next

7 Cutting your document into pieces with HACHA

HEVEA outputs a single .html file. This file can be cut into pieces at various sectional units by HACHA

7.1 Simple usage

First generate your html document by applying HEVEA:

# hevea doc.tex

Then cut doc.html into pieces by the command:

# hacha doc.html

This will generate a simple root file index.html. This root file holds document title, abstract and a simple table of contents. Every item in the table of contents contains a link to or into a file that holds a “cutting” sectional unit. By default, the cutting sectional unit is section in the article style and chapter in the book style. The name of those files are doc001.html, doc002.html, etc.

Additionally, one level of sectioning below the cutting unit (i.e. subsections in the article style and sections in the book style) is shown as an entry in the table of contents. Sectional units above the cutting section (i.e. parts in both article and book styles) close the current table of contents and open a new one. Cross-references are properly handled, that is, the local links generated by HEVEA are changed into remote links.

The name of the root file can be changed using the -o option:

# hacha -o root.html doc.html

Some of HEVEA output get replicated in all the files generated by HACHA. Users can supply a header and a footer, which will appear at the begining and end of every page generated by HACHA. It suffices to include the following commands in the document preamble:

\htmlhead{header}
\htmlfoot{footer}

HACHA also makes every page it generates a clone of its input as regards attributes to the <body ...> opening tag and meta-information from the <head><\head> block. See section B.2 for examples of this replication feature.

By contrast, style information specified in the style elements from rom the <head><\head> block is not replicated. Instead, all style definitions are collected into an external style sheet file whose name is doc.css, and all generated html files adopt doc.css as an external style sheet. It is important to notice that, since version 1.08, HEVEA produces a style element by itself, even if users do not explicitely use styles. As a consequence, HACHA normally produces a file doc.css, which should not be forgotten while copying files to their final destination after a run of HACHA.

7.2 Advanced usage

HACHA behaviour can be altered from the document source, by using a counter and a few macros.

A document that explicitly includes cutting macros still can be typeset by LATEX, provided it loads the hevea.sty style file from the HEVEA distribution. (See section 5 for details on this style file). An alternative to loading the hevea package is to put all cutting instructions in comments starting with %HEVEA.

7.2.1 Principle

HACHA recognizes all sectional units, ordered as follows, from top to bottom: part, chapter, section, subsection, subsubsection, paragraph and subparagraph.

At any point between \begin{document} and \end{document}, there exist a current cutting sectional unit (cutting unit for short), a current cutting depth, a root file and an output file. Table of contents output goes to the root file, normal output goes to the output file. Cutting units start a new output file, whereas units comprised between the cutting unit and the cutting units plus the cutting depth add new entries in the table of contents.

At document start, the root file and the output file are HACHA output file (i.e. index.html). The cutting unit and the cutting depth are set to default values that depend on the document style.

7.2.2 Cutting macros

The following cutting instructions are for use in the document preamble. They command the cutting scheme of the whole document:

\cuttingunit
This is a macro that holds the document cutting unit. You can change the default (which is section in the article style and chapter in the book style) by doing:
\renewcommand{\cuttingunit}{secname}.
\tocnumber
Instruct HEVEA to put section numbers into table of content entries.
\notocnumber
Instruct HEVEA not to put section numbers into table of content entries. This is the default.
cuttingdepth
This is a counter that holds the document cutting depth. You can change the default value of 1 by doing \setcounter{cuttingdepth}{numvalue}. A cutting depth of zero means no other entries than the cutting units in the table of contents.

Other cutting instructions are to be used after \begin{document}. They all generate html comments in HEVEA output. These comments then act as instructions to HACHA.

\cuthere{secname}{itemtitle}
Attempt a cut.
  • If secname is the current cutting unit or the keyword now, then a new output file is started and an entry in the current table of contents is generated, with title itemtitle. This entry holds a link to the new output file.
  • If secname is above the cutting unit, then the current table of contents is closed. The output file is set to the current root file.
  • If secname is below the cutting unit and less than the cutting depth away from it, then an entry is added in the table of contents. This entry contains itemtitle and a link to the point where \cuthere appears.
  • Otherwise, no action is performed.
\cutdef[depth]{secname}
Open a new table of contents, with cutting depth depth and cutting unit secname. If the optional depth is absent, the cutting depth does not change. The output file becomes the root file. Result is unspecified if whatever secname expands to is a sectional unit name above the current cutting unit, is not a valid sectional unit name or if depth does not expand to a small positive number.
\cutend
End the current table of contents. This closes the scope of the previous \cutdef. The cutting unit and cutting depth are restored. Note that \cutdef and \cutend must be properly balanced.

Commands \cuthere and \cutend have starred variants, which behave identically except for footnotes (see 7.3.7).

Default settings work as follows: \begin{document} performs

\cutdef*[\value{cuttingdepth}]{\cuttingunit}

and \end{document} performs \cutend*. All sectioning commands perform \cuthere, with the sectional unit name as first argument and the (optional, if present) sectioning command argument (i.e. the section title) as second argument. Note that starred versions of the sectioning commands also perform cutting instructions.

7.2.3 Table of links organisation

A table of links generated by HACHA is a list of links to generated files. Additionally, some sublists may be present, up to a certain depth. The items in those sublists are links inside generated files, they point to sectional unit titles below the cutting unit, up to a certain depth.

More precisely, let A be a certain sectional unit (e.g. “part”), let B be just below A (e.g. “section”), and let C be just below C (e.g. “subsection”). Further assume that cutting is performed at level B with a depth of more than one. Then, every unit A holds a one or several tables of links to generated files, and each generated file normally holds a B unit. Sublists with links to C units inside B units normally appear in the tables of links of level A. The command-line options -tocbis and -tocter instruct hacha to put sublists at other places. With -tocbis sublists are duplicated at the beginning of the B level files; while with -tocter sublist only appear at the beginning of the B level files.

In my opinion, default style is appropriate for documents with short B units; while -tocbis style is appropriate for documents with long B units with a few sub-units; and -tocter style is appropriate for documents with long B units with a lot of sub-units. As you may have noticed, this manual is cut by following the -tocbis style.

Whatever the style is, if a B unit is cut (e.g. because its text is enclosed in \cutdef{C}\cutend), then every C unit goes into its own file and there is no sublist after the relevant B level entry in the A level table of links.

7.2.4 Examples

Consider, for instance, a book document with a long chapter that you want to cut at the section level, showing subsections:

\chapter{A long chapter}
.....

\chapter{The next chapter}

Then, you should insert a \cutdef at chapter start and a \cutend at chapter end:

\chapter{A long chapter}
%HEVEA\cutdef[1]{section}
.....
%HEVEA\cutend
\chapter{The next chapter}

Then, the file that would otherwise contain the long chapter now contains the chapter title and a table of sections. No other change is needed, since the command \section already performs the appropriate \cuthere{section}{...} commands, which were ignored by default. (Also note that cutting macros are placed inside %HEVEA comments, for LATEX not to be disturbed).

The \cuthere macro can be used to put some document parts into their own file. This may prove appropriate for long cover pages or abstracts that would otherwise go into the root file. Consider the following document:

\documentclass{article}

\begin{document}

\begin{abstract} A big abstract \end{abstract}
...

Then, you make the abstract go to its own file as it was a cutting unit by typing:

\documentclass{article}
\usepackage{hevea}

\begin{document}
\cuthere{\cuttingunit}{Abstract}
\begin{abstract} A big abstract \end{abstract}
...

(Note that, this time, cutting macros appear unprotected in the source. However, LATEX still can process the document, since the hevea package is loaded).

7.2.5 More and More Pages in Output

In some situations it may be appropriate to produce many pages from one source files. More specifically, loading the deepcut package will put all sectioning units of your document (from \part to \subsection in their own file.

Similarly, loading the figcut package will make all figures and tables go into their own file. The figcut package accepts two options, show and noshow. The former, which is the default, instructs HEVEA to repeat the caption into the main flow of text, with a link to the figure. The latter option disables the feature.

7.3 More Advanced Usage

In this section we show how to alter some details of HACHA behaviour. This includes controlling output file names and the title of generated web pages and introducing arbitrary cuts.

7.3.1 Controlling output file names

When invoked as hacha doc.html, HACHA produces a index.html table of links file that points into doc001.html, doc002.html, etc. content files. This is not very convenient when one wishes to point inside the document from outside. However, the \cutname{name} command sets the name of the current output file name as name.

Consider a document cut at the section level, which contains the following important section:

\section{Important\label{important} section}
...

To make the important section goes into file important.html, one writes:

\section{Important\label{important} section}\cutname{important.html}
...

Then, section “Important section” can be referenced from an HEVEA unaware html page by:

In this document, there is a very
<a href="important.html#important">important section</a>.

If you are reading the html version of this manual, you may check that you are now reading file cutname.html. This particular file name has been specified from the source using \cutname{cutname.html}.

7.3.2 Controlling page titles

When HACHA creates a web page from a given sectional unit, the title of this page normally is the name of the sectional unit. For instance, the title of this very page should be “Cutting your document into pieces with HACHA”. It is possible to insert some text at the beginning of all page titles, by using the \htmlprefix command. Hence, by writing \htmlprefix{\hevea{} Manual: } in the document, the title of this page would become: “HEVEA Manual: Cutting your document into pieces with HACHA” and the title of all other pages would show the same prefix.

7.3.3 Links for the root file

The command \toplinks{prev}{up}{next} instructs HACHA to put links to a “previous”, “up” and “next” page in the root file. The following points are worth noticing:

  • The \toplink command must appear in the document preamble (i.e. before \begin{document}).
  • The arguments prev, up and next should expand to urls, notice that these argument are processed (see section 8.1.1).
  • When one of the expected argument is left empty, the corresponding link is not generated.

This feature can prove useful to relate documents that are generated independently by HEVEA and HACHA.

7.3.4 Controlling link contents from the document

By default the links to the previous, up and next pages show a small icon (an appropriate arrow). This can be changed with the command \setlinkstext{prev}{up}{next}, where prev, up and next are some LATEX source. For instance the default behaviour is equivalent to:

\setlinkstext
  {\imgsrc[alt="Previous"]{previous_motif.svg}}
  {\imgsrc[alt="Up"]{contents_motif.svg}}
  {\imgsrc[alt="Next"]{next_motif.svg}}

Command \setlinkstext behaves as \toplinks does. That is, it must occur in document preamble, arguments are processed and empty arguments yield no effect (i.e. defaults apply).

7.3.5 Complete control over navigation links

The previous commands only impact the contents of the navigation links. It is possible, although reserved to avanced users, to achieve greater control by using the \formatlinks command. The \formatlinks command takes four arguments which are command themselves. The last three command format the “previous”, “up” and “next” links respectively, while the first argument formats the resulting group of links. For instance, one can avoid images and for arrows and typeset the full set of navivation links in a purple border (see Section 9 for styling techniques) as follows:

\newstyle{a.navarrow}{font-family:monospace;font-size:x-large;color:purple}
\newstyle{div.navarrows}{border:solid purple;display:inline-block;padding:1ex;}
\newcommand{\myprev}[1]{\ahref[class="navarrow" title="Previous" ]{#1}{$\rightarrow$}\quad}
\newcommand{\myup}[1]{\quad\ahref[class="navarrow" title="Up" ]{#1}{$\uparrow$}\quad}
\newcommand{\mynext}[1]{\quad\ahref[class="navarrow" title="Next" ]{#1}{$\writearrow$}}

\newcommand{\mylinks}[1]{\@open{div}{class="navarrows"}#1\@close{div}\end{center}}
\formatlinks{\mylinks}{\myprev}{\myup}{\mynext}

7.3.6 Cutting a document anywhere

Part of a document goes to a separate file when enclosed in a cutflow environment:

\begin{cutflow}{title}\end{cutflow}

The content “…” will go into a file of its own, while the argument title is used as the title of the introduced html page.

The html page introduced here does not belong to the normal flow of text. Consequently, one needs an explicit reference from the normal flow of text into the content of the cutflow environment. This will occur naturally when the content of the cutflow environment. contains a \label construct. This look natural in the following quiz example:

\paragraph{A small quiz}
\begin{enumerate}
\item What is black?
\item What is white?
\item What is Dylan?
\end{enumerate}
Answers in section~\ref{answers}.
\begin{cutflow}{Answers}
\paragraph{Quiz answers}\label{answers}
\begin{enumerate}
\item Black is black.
\item White is white.
\item Dylan is Dylan.
\end{enumerate}
\end{cutflow}

The example yields:

A small quiz

  1. What is black?
  2. What is white?
  3. What is Dylan?

Answers in section 7.3.6.

However,introducing html hyperlink targets and references with the \aname and \ahrefloc commands (see section 8.1.1) will be more practical most of the time.

The starred variant environment cutflow* is the same as cutflow, save for the html header and footer (see Section 7.1) which are not replicated in the introduced page.

7.3.7 Footnotes

Footnote texts (given as arguments either to \footnote or \footnotetext) do not go directly to output. Instead, footnote texts accumulate internally in a buffer, awaiting to be flushed. The flushing of notes is controlled by the means of a current flushing unit, which is a sectional unit name or document — a fictional unit above all units. At any point, the current flushing unit is the value of the command \@footnotelevel. In practice, the flushing of footnote texts is performed by two commands:

  • \flushdef{secname} simply sets the flushing unit to secname.
  • \footnoteflush{secname} acts as follows:
    • If argument secname is equal to or above the current flushing unit, then footnote texts are flushed (if any). In the output, the texts themselves are surrounded by special comments that tag them as footnote texts and record secname.
    • Otherwise, no action is performed.

The article style file performs \flushdef{document}, while the book style file performs \flushdef{chapter}. At the end of processing, \end{document} performs \footnoteflush{\@footnotelevel}, so as to flush any pending notes.

Cutting commands interact with footnote flushing as follows:

  • \cuthere{secname} executes \footnoteflush{secname}. Remember that all sectioning commands perform \cuthere with their sectional unit name as argument.
  • \cutdef{secname} saves the current flushing unit and buffer on some internal stack, starts a new buffer for footnote texts, and sets the current flushing unit to secname (by performing \flushdef{secname}).
  • \cutend first flushes any pending texts (by performing \footnoteflush with the current flushing unit as argument), and restores the flushing unit and footnote text buffer saved by the matching \cutdef.
  • The starred variants \cutdef* and \cutend* perform no operation that is related to footnotes.

Later, when running across footnote texts in its input file, HACHA sometimes put notes in a separate file. More precisely, HACHA has knowledge of the current cutting level, the current sectional unit where cuts occur — as given by the relevant \cutdef. Moreover, HACHA knows the current section level — that is, the last sectional command processed. Besides, HACHA extracts the note level from the comments that surround the notes (as given by the command \footnoteflush that produced the notes). Then, HACHA creates a separate file for notes when the cutting level and the note level differ, or when the current level is above the cutting level (e.g. the current level is document while the cutting level is chapter). As a result, notes should stay where they are when they occur at the end of HACHA output file and otherwise go to a separate file.

To make a complicated story even more complicated, footnotes in minipage environments or in the arguments to \title or \author have a different, I guess satisfactory, behaviour.

Given the above description, footnotes are managed by default as follows.

  • In style article, hevea puts all footnotes go at the end of the html file. A later run of hacha creates a separate footnote file.
  • In style book, footnotes are collected at the end of chapters. A later run of  hacha leaves them where they are. Footnotes in the title or author names are managed specially, they will normally appear at the end of the root file.

In case you wish to adopt a book-like behaviour for an article (footnotes at the end of sections), it suffices to insert \flushdef{section} in the document preamble.

We now give a few example of interaction between notes and cutting. We first consider normal behaviour. The page you are reading is a section page, since the current cutting unit is “section”. The current unit is “subsection”. The following two subsubsections are sent to their own files by the means of a \cutdef{subsubsection}/\cutend pair. As a result the text of footnotes appear at the end of the subsubsection pages.

The following two subsubsections are sent to their own files by the means of a \cutdef*{subsubsection}/\cutend* pair. As a result, the text of footnotes in the subsections appear at the end of the current section page.4

Finally, to send the footnotes in subsubsections to a separate web page, one should use a \cutdef{subsubsection}/\cutend pair (to create a proper buffer for subsubsection notes), redefine the flushing unit, and flush notes explicitly.

\cutdef{subsubsection}\flushdef{document}%
\subsubsection{...}
  ...
\footnoteflush{document}\cutend

4
Standard section footnote.
5
Sent at the end of cutname.html
6
Sent at the end of cutname.html

Previous Up Next hevea-2.36-manual/manual035.html0000644004317100512160000001142114252364056016436 0ustar marangetcristal Lengths, Spaces and Boxes Previous Up Next

B.13 Lengths, Spaces and Boxes

B.13.1 Length

All length commands are ignored, things go smoothly when LATEX syntax is used (using the \newlength, \setlength, etc. commands, which are null macros). Of course, if lengths are really important to the document, rendering will be poor.

Note that TEX length syntax is not at all recognised. As a consequence, writing things like \textwidth=10cm will clobber the output. Users can correct such misbehaviour by adopting LATEX syntax, here they should write \setlength{\textwidth}{10cm}.

B.13.2 Space

The \hspace, \vspace and \addvspace spacing commands and their starred versions recognise positive explicit length arguments. Such arguments get converted to a number of non-breaking spaces or line breaks. Basically, the value of 1em or 1ex is one space or one line-break. For other length units, a simple conversion based upon a 12pt font is used.

HEVEA cannot interpret more complicated length arguments or perform negative spacing. In these situations, a warning is issued and no output is done.

Spacing commands without arguments are recognised. The \enspace, \quad and \qquad commands output one, two and four non-breaking spaces, while the \smallskip, \medskip and \bigskip output one, one, and two line breaks.

Stretchable lengths do not exist, thus the \hfill and \vfill macros are undefined.

B.13.3 Boxes

Box contents is typeset in text mode (i.e. non-math, non-display mode). Both LATEX boxing commands \mbox and \makebox exist. The latter is associated with class makebox, which is empty by default and can be redefined by the user.

Similarly, the boxing-with-frame commands \fbox and \framebox are recognized. Here both, long and short forms refer to class framebox, which also can be redefined by the user.


Boxes can be saved for latter usage by storing them in bins. New bins are defined by \newsavebox{cmd}.

Then some text can be saved into cmd by \sbox{cmd}{text} or \begin{lrbox}{cmd} text \end{lrbox}. The text is translated to html, as if it was inside a \mbox and the resulting output is stored. It is retrieved (and outputted) by the command \usebox{cmd}. The \savebox command reduces to \sbox, ignoring its optional arguments.


No other box-related commands are implemented.


Previous Up Next