dw_latex.pp 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747
  1. {
  2. $Id$
  3. FPDoc - Free Pascal Documentation Tool
  4. Copyright (C) 2000 - 2003 by
  5. Areca Systems GmbH / Sebastian Guenther, [email protected]
  6. * LaTeX output generator
  7. See the file COPYING, included in this distribution,
  8. for details about the copyright.
  9. This program is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  12. }
  13. {$mode objfpc}
  14. {$H+}
  15. unit dw_LaTeX;
  16. interface
  17. uses DOM, dGlobals, PasTree;
  18. const
  19. LateXHighLight : Boolean = False;
  20. TexExtension : String = '.tex';
  21. Procedure CreateLaTeXDocForPackage(APackage: TPasPackage; AEngine: TFPDocEngine);
  22. implementation
  23. uses SysUtils, Classes, dwLinear, dwriter;
  24. Type
  25. { TLaTeXWriter }
  26. TLaTeXWriter = class(TLinearWriter)
  27. protected
  28. FLink: String;
  29. FTableCount : Integer;
  30. FInVerbatim : Boolean;
  31. Inlist,
  32. TableRowStartFlag,
  33. TableCaptionWritten: Boolean;
  34. // Linear documentation methods overrides;
  35. procedure WriteLabel(Const S : String); override;
  36. procedure WriteIndex(Const S : String); override;
  37. Procedure WriteExampleFile(FN : String); override;
  38. Procedure StartProcedure; override;
  39. Procedure EndProcedure; override;
  40. Procedure StartProperty; override;
  41. Procedure EndProperty; override;
  42. Procedure StartSynopsis; override;
  43. Procedure StartDeclaration; override;
  44. Procedure StartVisibility; override;
  45. Procedure StartDescription; override;
  46. Procedure StartAccess; override;
  47. Procedure StartErrors; override;
  48. Procedure StartSeealso; override;
  49. Procedure EndSeealso; override;
  50. procedure StartUnitOverview(AModuleName,AModuleLabel : String);override;
  51. procedure WriteUnitEntry(UnitRef : TPasType); override;
  52. Procedure EndUnitOverview; override;
  53. function GetLabel(AElement: TPasElement): String; override;
  54. procedure StartListing(Frames: Boolean; const name: String); override;
  55. procedure EndListing; override;
  56. Function EscapeText(S : String) : String; override;
  57. Function StripText(S : String) : String; override;
  58. procedure WriteCommentLine; override;
  59. procedure WriteComment(Comment : String);override;
  60. procedure StartSection(SectionName : String);override;
  61. procedure StartSubSection(SubSectionName : String);override;
  62. procedure StartSubSubSection(SubSubSectionName : String);override;
  63. procedure StartChapter(ChapterName : String); override;
  64. procedure StartOverview(WithAccess : Boolean); override;
  65. procedure EndOverview; override;
  66. procedure WriteOverviewMember(ALabel,AName,Access,ADescr : String); override;
  67. procedure WriteOverviewMember(ALabel,AName,ADescr : String); override;
  68. Class Function FileNameExtension : String; override;
  69. // Description node conversion
  70. procedure DescrBeginBold; override;
  71. procedure DescrEndBold; override;
  72. procedure DescrBeginItalic; override;
  73. procedure DescrEndItalic; override;
  74. procedure DescrBeginEmph; override;
  75. procedure DescrEndEmph; override;
  76. procedure DescrWriteFileEl(const AText: DOMString); override;
  77. procedure DescrWriteKeywordEl(const AText: DOMString); override;
  78. procedure DescrWriteVarEl(const AText: DOMString); override;
  79. procedure DescrBeginLink(const AId: DOMString); override;
  80. procedure DescrEndLink; override;
  81. procedure DescrWriteLinebreak; override;
  82. procedure DescrBeginParagraph; override;
  83. procedure DescrBeginCode(HasBorder: Boolean; const AHighlighterName: String); override;
  84. procedure DescrWriteCodeLine(const ALine: String); override;
  85. procedure DescrEndCode; override;
  86. procedure DescrEndParagraph; override;
  87. procedure DescrBeginOrderedList; override;
  88. procedure DescrEndOrderedList; override;
  89. procedure DescrBeginUnorderedList; override;
  90. procedure DescrEndUnorderedList; override;
  91. procedure DescrBeginDefinitionList; override;
  92. procedure DescrEndDefinitionList; override;
  93. procedure DescrBeginListItem; override;
  94. procedure DescrEndListItem; override;
  95. procedure DescrBeginDefinitionTerm; override;
  96. procedure DescrEndDefinitionTerm; override;
  97. procedure DescrBeginDefinitionEntry; override;
  98. procedure DescrEndDefinitionEntry; override;
  99. procedure DescrBeginSectionTitle; override;
  100. procedure DescrBeginSectionBody; override;
  101. procedure DescrEndSection; override;
  102. procedure DescrBeginRemark; override;
  103. procedure DescrEndRemark; override;
  104. procedure DescrBeginTable(ColCount: Integer; HasBorder: Boolean); override;
  105. procedure DescrEndTable; override;
  106. procedure DescrBeginTableCaption; override;
  107. procedure DescrEndTableCaption; override;
  108. procedure DescrBeginTableHeadRow; override;
  109. procedure DescrEndTableHeadRow; override;
  110. procedure DescrBeginTableRow; override;
  111. procedure DescrEndTableRow; override;
  112. procedure DescrBeginTableCell; override;
  113. procedure DescrEndTableCell; override;
  114. // TFPDocWriter class methods
  115. Function InterPretOption(Const Cmd,Arg : String) : boolean; override;
  116. end;
  117. function TLaTeXWriter.GetLabel(AElement: TPasElement): String;
  118. var
  119. i: Integer;
  120. begin
  121. if AElement.ClassType = TPasUnresolvedTypeRef then
  122. Result := Engine.ResolveLink(Module, AElement.Name)
  123. else
  124. begin
  125. Result := AElement.PathName;
  126. Result := LowerCase(Copy(Result, 2, Length(Result) - 1));
  127. end;
  128. for i := 1 to Length(Result) do
  129. if Result[i] = '.' then
  130. Result[i] := ':';
  131. end;
  132. Function TLatexWriter.EscapeText(S : String) : String;
  133. var
  134. i: Integer;
  135. begin
  136. if FInVerBatim=True then
  137. Result:=S
  138. else
  139. begin
  140. SetLength(Result, 0);
  141. for i := 1 to Length(S) do
  142. case S[i] of
  143. '&','{','}','#','_','$','%': // Escape these characters
  144. Result := Result + '\' + S[i];
  145. '~','^':
  146. Result := Result + '\'+S[i]+' ';
  147. '\':
  148. Result:=Result+'$\backslash$'
  149. else
  150. Result := Result + S[i];
  151. end;
  152. end;
  153. end;
  154. Function TLatexWriter.StripText(S : String) : String;
  155. var
  156. I: Integer;
  157. begin
  158. SetLength(Result, 0);
  159. for i := 1 to Length(S) do
  160. If not (S[i] in ['&','{','}','#','_','$','%','''','~','^', '\']) then
  161. Result := Result + S[i];
  162. end;
  163. procedure TLaTeXWriter.DescrBeginBold;
  164. begin
  165. Write('\textbf{');
  166. end;
  167. procedure TLaTeXWriter.DescrEndBold;
  168. begin
  169. Write('}');
  170. end;
  171. procedure TLaTeXWriter.DescrBeginItalic;
  172. begin
  173. Write('\textit{');
  174. end;
  175. procedure TLaTeXWriter.DescrEndItalic;
  176. begin
  177. Write('}');
  178. end;
  179. procedure TLaTeXWriter.DescrBeginEmph;
  180. begin
  181. Write('\emph{');
  182. end;
  183. procedure TLaTeXWriter.DescrEndEmph;
  184. begin
  185. Write('}');
  186. end;
  187. procedure TLaTeXWriter.DescrWriteFileEl(const AText: DOMString);
  188. begin
  189. Write('\file{');
  190. DescrWriteText(AText);
  191. Write('}');
  192. end;
  193. procedure TLaTeXWriter.DescrWriteKeywordEl(const AText: DOMString);
  194. begin
  195. Write('\textbf{\\ttfamily ');
  196. DescrWriteText(AText);
  197. Write('}');
  198. end;
  199. procedure TLaTeXWriter.DescrWriteVarEl(const AText: DOMString);
  200. begin
  201. Write('\var{');
  202. DescrWriteText(AText);
  203. Write('}');
  204. end;
  205. procedure TLaTeXWriter.DescrBeginLink(const AId: DOMString);
  206. begin
  207. FLink := Engine.ResolveLink(Module, AId);
  208. // System.WriteLn('Link "', AId, '" => ', FLink);
  209. end;
  210. procedure TLaTeXWriter.DescrEndLink;
  211. begin
  212. WriteF(' (\pageref{%s})',[StripText(Flink)]);
  213. end;
  214. procedure TLaTeXWriter.DescrWriteLinebreak;
  215. begin
  216. WriteLn('\\');
  217. end;
  218. procedure TLaTeXWriter.DescrBeginParagraph;
  219. begin
  220. // Do nothing
  221. end;
  222. procedure TLaTeXWriter.DescrEndParagraph;
  223. begin
  224. WriteLn('');
  225. WriteLn('');
  226. end;
  227. procedure TLaTeXWriter.DescrBeginCode(HasBorder: Boolean;
  228. const AHighlighterName: String);
  229. begin
  230. StartListing(HasBorder,'');
  231. end;
  232. procedure TLaTeXWriter.DescrWriteCodeLine(const ALine: String);
  233. begin
  234. WriteLn(ALine);
  235. end;
  236. procedure TLaTeXWriter.DescrEndCode;
  237. begin
  238. EndListing
  239. end;
  240. procedure TLaTeXWriter.DescrBeginOrderedList;
  241. begin
  242. WriteLn('\begin{enumerate}');
  243. end;
  244. procedure TLaTeXWriter.DescrEndOrderedList;
  245. begin
  246. WriteLn('\end{enumerate}');
  247. end;
  248. procedure TLaTeXWriter.DescrBeginUnorderedList;
  249. begin
  250. WriteLn('\begin{itemize}');
  251. end;
  252. procedure TLaTeXWriter.DescrEndUnorderedList;
  253. begin
  254. WriteLn('\end{itemize}');
  255. end;
  256. procedure TLaTeXWriter.DescrBeginDefinitionList;
  257. begin
  258. WriteLn('\begin{description}');
  259. end;
  260. procedure TLaTeXWriter.DescrEndDefinitionList;
  261. begin
  262. WriteLn('\end{description}');
  263. end;
  264. procedure TLaTeXWriter.DescrBeginListItem;
  265. begin
  266. Write('\item ');
  267. end;
  268. procedure TLaTeXWriter.DescrEndListItem;
  269. begin
  270. WriteLn('');
  271. end;
  272. procedure TLaTeXWriter.DescrBeginDefinitionTerm;
  273. begin
  274. Write('\item[');
  275. end;
  276. procedure TLaTeXWriter.DescrEndDefinitionTerm;
  277. begin
  278. WriteLn(']');
  279. end;
  280. procedure TLaTeXWriter.DescrBeginDefinitionEntry;
  281. begin
  282. // Do nothing
  283. end;
  284. procedure TLaTeXWriter.DescrEndDefinitionEntry;
  285. begin
  286. WriteLn('');
  287. end;
  288. procedure TLaTeXWriter.DescrBeginSectionTitle;
  289. begin
  290. Write('\subsection{');
  291. end;
  292. procedure TLaTeXWriter.DescrBeginSectionBody;
  293. begin
  294. WriteLn('}');
  295. end;
  296. procedure TLaTeXWriter.DescrEndSection;
  297. begin
  298. // Do noting
  299. end;
  300. procedure TLaTeXWriter.DescrBeginRemark;
  301. begin
  302. WriteLn('\begin{remark}');
  303. end;
  304. procedure TLaTeXWriter.DescrEndRemark;
  305. begin
  306. WriteLn('\end{remark}');
  307. end;
  308. procedure TLaTeXWriter.DescrBeginTable(ColCount: Integer; HasBorder: Boolean);
  309. var
  310. i: Integer;
  311. begin
  312. // !!!: How do we set the border?
  313. Write('\begin{FPCltable}{');
  314. for i := 1 to ColCount do
  315. Write('l');
  316. write('}{');
  317. TableCaptionWritten:=False;
  318. end;
  319. procedure TLaTeXWriter.DescrEndTable;
  320. begin
  321. WriteLn('\end{FPCltable}');
  322. end;
  323. procedure TLaTeXWriter.DescrBeginTableCaption;
  324. begin
  325. // Do nothing.
  326. end;
  327. procedure TLaTeXWriter.DescrEndTableCaption;
  328. begin
  329. Write('}{table');
  330. Inc(FTableCount);
  331. Write(IntToStr(FTableCount));
  332. Writeln('}');
  333. TableCaptionWritten := True;
  334. end;
  335. procedure TLaTeXWriter.DescrBeginTableHeadRow;
  336. begin
  337. if not TableCaptionWritten then
  338. DescrEndTableCaption;
  339. TableRowStartFlag := True;
  340. end;
  341. procedure TLaTeXWriter.DescrEndTableHeadRow;
  342. begin
  343. WriteLn('\\ \hline');
  344. end;
  345. procedure TLaTeXWriter.DescrBeginTableRow;
  346. begin
  347. if not TableCaptionWritten then
  348. DescrEndTableCaption;
  349. TableRowStartFlag := True;
  350. end;
  351. procedure TLaTeXWriter.DescrEndTableRow;
  352. begin
  353. WriteLn('\\');
  354. end;
  355. procedure TLaTeXWriter.DescrBeginTableCell;
  356. begin
  357. if TableRowStartFlag then
  358. TableRowStartFlag := False
  359. else
  360. Write(' & ');
  361. end;
  362. procedure TLaTeXWriter.DescrEndTableCell;
  363. begin
  364. // Do nothing
  365. end;
  366. procedure TLaTeXWriter.WriteLabel(const s: String);
  367. begin
  368. WriteLnF('\label{%s}', [LowerCase(StripText(s))]);
  369. end;
  370. procedure TLaTeXWriter.WriteIndex(const s : String);
  371. begin
  372. Write('\index{');
  373. Write(EscapeText(s));
  374. Writeln('}');
  375. end;
  376. procedure TLaTeXWriter.StartListing(Frames: Boolean; const name: String);
  377. begin
  378. FInVerbatim:=True;
  379. if Not LaTexHighLight then
  380. begin
  381. Writeln('');
  382. Writeln('\begin{verbatim}');
  383. end
  384. else
  385. if Frames then
  386. Writelnf('\begin{lstlisting}{%s}',[StripText(Name)])
  387. else
  388. Writelnf('\begin{lstlisting}[frame=]{%s}',[StripText(Name)]);
  389. end;
  390. procedure TLaTeXWriter.EndListing;
  391. begin
  392. FInVerbatim:=False;
  393. If LaTexHighLight then
  394. Writeln('\end{lstlisting}')
  395. else
  396. Writeln('\end{verbatim}')
  397. end;
  398. procedure TLatexWriter.WriteCommentLine;
  399. const
  400. CommentLine =
  401. '%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%';
  402. begin
  403. Writeln(CommentLine);
  404. end;
  405. procedure TLatexWriter.WriteComment(Comment : String);
  406. begin
  407. Write('% ');
  408. Writeln(Comment);
  409. end;
  410. procedure TLatexWriter.StartChapter(ChapterName : String);
  411. begin
  412. WriteCommentLine;
  413. WriteComment(ChapterName);
  414. WriteCommentLine;
  415. Writeln('\chapter{'+EscapeText(ChapterName)+'}');
  416. end;
  417. procedure TLatexWriter.StartSection(SectionName : String);
  418. begin
  419. WriteCommentLine;
  420. WriteComment(SectionName);
  421. WriteComment('\section{'+EscapeText(SectionName)+'}');
  422. end;
  423. procedure TLatexWriter.StartSubSection(SubSectionName : String);
  424. begin
  425. WriteComment(SubSectionName);
  426. Write('\subsection{'+EscapeText(SubSectionName)+'}');
  427. end;
  428. procedure TLatexWriter.StartSubSubSection(SubSubSectionName : String);
  429. begin
  430. Write('\subsubsection{'+EscapeText(SubSubSectionName)+'}');
  431. end;
  432. procedure CreateLaTeXDocForPackage(APackage: TPasPackage; AEngine: TFPDocEngine);
  433. var
  434. Writer: TLaTeXWriter;
  435. begin
  436. Writer := TLaTeXWriter.Create(APackage, AEngine);
  437. try
  438. Writer.WriteDoc;
  439. finally
  440. Writer.Free;
  441. end;
  442. end;
  443. Procedure TLatexWriter.StartProcedure;
  444. begin
  445. Writeln('\begin{FPCList}');
  446. InList:=True;
  447. end;
  448. Procedure TLatexWriter.StartSynopsis;
  449. begin
  450. Writeln('\Synopsis');
  451. end;
  452. Procedure TLatexWriter.StartDeclaration;
  453. begin
  454. Writeln('\Declaration ');
  455. end;
  456. Procedure TLatexWriter.StartVisibility;
  457. begin
  458. Writeln('\Visibility');
  459. end;
  460. Procedure TLatexWriter.StartDescription;
  461. begin
  462. Writeln('\Description');
  463. end;
  464. Procedure TLatexWriter.StartErrors;
  465. begin
  466. Writeln('\Errors');
  467. end;
  468. Procedure TLatexWriter.StartAccess;
  469. begin
  470. Writeln('\Access')
  471. end;
  472. Procedure TLatexWriter.EndProcedure;
  473. begin
  474. InList:=False;
  475. Writeln('\end{FPCList}');
  476. end;
  477. Procedure TLatexWriter.StartProperty;
  478. begin
  479. Writeln('\begin{FPCList}');
  480. InList:=True;
  481. end;
  482. Procedure TLatexWriter.EndProperty;
  483. begin
  484. InList:=False;
  485. Writeln('\end{FPCList}');
  486. end;
  487. procedure TLateXWriter.WriteExampleFile(FN : String);
  488. begin
  489. If (FN<>'') then
  490. WritelnF('\FPCexample{%s}', [ChangeFileExt(FN,'')]);
  491. end;
  492. procedure TLatexWriter.StartOverview(WithAccess : Boolean);
  493. begin
  494. If WithAccess then
  495. begin
  496. WriteLn('\begin{tabularx}{\textwidth}{lllX}');
  497. WriteLnF('%s & %s & %s & %s \\ \hline',[EscapeText(SDocPage), EscapeText(SDocProperty), EscapeText(SDocAccess), EscapeText(SDocDescription)])
  498. end
  499. else
  500. begin
  501. WriteLn('\begin{tabularx}{\textwidth}{llX}');
  502. WriteLnF('%s & %s & %s \\ \hline',[EscapeText(SDocPage), EscapeText(SDocProperty), EscapeText(SDocDescription)])
  503. end;
  504. end;
  505. procedure TLatexWriter.EndOverview;
  506. begin
  507. WriteLn('\hline');
  508. WriteLn('\end{tabularx}');
  509. end;
  510. procedure TLatexWriter.WriteOverviewMember(ALabel,AName,Access,ADescr : String);
  511. begin
  512. WriteLnF('\pageref{%s} & %s & %s & %s \\',[ALabel,AName,Access,ADescr]);
  513. end;
  514. procedure TLatexWriter.WriteOverviewMember(ALabel,AName,ADescr : String);
  515. begin
  516. WriteLnF('\pageref{%s} & %s & %s \\',[ALabel,AName,ADescr]);
  517. end;
  518. function TLaTeXWriter.FileNameExtension: String;
  519. begin
  520. Result:=TexExtension;
  521. end;
  522. Procedure TLatexWriter.StartSeeAlso;
  523. begin
  524. If not InList then
  525. begin
  526. Writeln('');
  527. Writeln('\begin{FPCList}');
  528. end;
  529. Writeln('\SeeAlso');
  530. end;
  531. procedure TLaTeXWriter.EndSeealso;
  532. begin
  533. If Not InList then
  534. Writeln('\end{FPCList}');
  535. end;
  536. procedure TLatexWriter.StartUnitOverview(AModuleName,AModuleLabel : String);
  537. begin
  538. WriteLnF('\begin{FPCltable}{lr}{%s}{%s:0units}',
  539. [Format(SDocUsedUnitsByUnitXY, [AModuleName]), AModuleName]);
  540. WriteLn('Name & Page \\ \hline');
  541. end;
  542. procedure TLatexWriter.WriteUnitEntry(UnitRef : TPasType);
  543. begin
  544. WriteLnF('%s\index{unit!%s} & \pageref{%s} \\',
  545. [UnitRef.Name, UnitRef.Name, StripText(GetLabel(UnitRef))]);
  546. end;
  547. procedure TLatexWriter.EndUnitOverview;
  548. begin
  549. WriteLn('\end{FPCltable}');
  550. end;
  551. Function TLatexWriter.InterPretOption(Const Cmd,Arg : String) : boolean;
  552. begin
  553. Result:=True;
  554. if (cmd= '--latex-highlight') then
  555. LatexHighLight:=True
  556. else if Cmd = '--latex-extension' then
  557. TexExtension:=Arg
  558. else
  559. Result:=False;
  560. end;
  561. initialization
  562. // Do not localize.
  563. RegisterWriter(TLaTeXWriter,'latex','Latex output using fpc.sty class.');
  564. finalization
  565. UnRegisterWriter('latex');
  566. end.
  567. {
  568. $Log$
  569. Revision 1.9 2005-01-12 21:11:41 michael
  570. + New structure for writers. Implemented TXT writer
  571. Revision 1.8 2005/01/09 15:59:50 michael
  572. + Split out latex writer to linear and latex writer
  573. Revision 1.7 2004/11/15 18:01:16 michael
  574. + Example fixes, and more escape seqences
  575. Revision 1.6 2004/07/23 23:39:48 michael
  576. + Some fixes in verbatim writing
  577. Revision 1.5 2004/06/06 10:53:02 michael
  578. + Added Topic support
  579. Revision 1.4 2003/03/18 19:28:44 michael
  580. + Some changes to output handling, more suitable for tex output
  581. Revision 1.3 2003/03/18 19:12:29 michael
  582. + More EscapeText calls needed
  583. Revision 1.2 2003/03/18 01:11:51 michael
  584. + Some fixes to deal with illegal tex characters
  585. Revision 1.1 2003/03/17 23:03:20 michael
  586. + Initial import in CVS
  587. Revision 1.13 2003/03/13 22:02:13 sg
  588. * New version with many bugfixes and our own parser (now independent of the
  589. compiler source)
  590. Revision 1.12 2002/10/20 22:49:31 michael
  591. + Sorted all overviews. Added table with enumeration values for enumerated types.
  592. Revision 1.11 2002/05/24 00:13:22 sg
  593. * much improved new version, including many linking and output fixes
  594. Revision 1.10 2002/03/12 10:58:36 sg
  595. * reworked linking engine and internal structure
  596. Revision 1.9 2002/01/20 11:19:55 michael
  597. + Added link attribute and property to TFPElement
  598. Revision 1.8 2002/01/08 13:00:06 michael
  599. + Added correct array handling and syntax highlighting is now optional
  600. Revision 1.7 2002/01/08 08:22:40 michael
  601. + Implemented latex writer
  602. Revision 1.6 2001/12/17 14:41:42 michael
  603. + Split out of latex writer
  604. Revision 1.5 2001/12/17 13:41:18 jonas
  605. * OsPathSeparator -> PathDelim
  606. }