2
0

dw_latex.pp 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344
  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. unit dw_LaTeX;
  14. {$MODE objfpc}
  15. {$H+}
  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, dWriter;
  24. type
  25. TLabelType = (ltConst,ltVar,ltType,ltFunction,ltProcedure,ltClass,
  26. ltChapter,ltSection,ltSubsection,
  27. ltTable,ltFigure);
  28. TLaTeXWriter = class(TFPDocWriter)
  29. protected
  30. f: Text;
  31. FLink: String;
  32. Package: TPasPackage;
  33. PackageName: String;
  34. Module: TPasModule;
  35. ModuleName: String;
  36. FTableCount : Integer;
  37. TableRowStartFlag, TableCaptionWritten: Boolean;
  38. function GetLabel(AElement: TPasElement): String;
  39. procedure Write(const s: String);
  40. procedure WriteF(const s: String; const Args: array of const);
  41. procedure WriteLn(const s: String);
  42. procedure WriteLnF(const s: String; const Args: array of const);
  43. // Tex functions
  44. procedure WriteLabel(El: TPasElement);
  45. procedure WriteLabel(const s: String);
  46. procedure WriteIndex(El: TPasElement);
  47. procedure WriteIndex(const s: String);
  48. procedure StartListing(Frames: Boolean; const name: String);
  49. procedure StartListing(Frames: Boolean);
  50. procedure EndListing;
  51. Function EscapeTex(S : String) : String;
  52. Function StripTex(S : String) : String;
  53. procedure WriteCommentLine;
  54. procedure WriteComment(Comment : String);
  55. procedure StartSection(SectionName : String; SectionLabel : String);
  56. procedure StartSection(SectionName : String);
  57. procedure StartSubSection(SubSectionName : String; SubSectionLabel : String);
  58. procedure StartSubSection(SubSectionName : String);
  59. procedure StartChapter(ChapterName : String; ChapterLabel : String);
  60. procedure StartChapter(ChapterName : String);
  61. // Description node conversion
  62. procedure DescrWriteText(const AText: DOMString); override;
  63. procedure DescrBeginBold; override;
  64. procedure DescrEndBold; override;
  65. procedure DescrBeginItalic; override;
  66. procedure DescrEndItalic; override;
  67. procedure DescrBeginEmph; override;
  68. procedure DescrEndEmph; override;
  69. procedure DescrWriteFileEl(const AText: DOMString); override;
  70. procedure DescrWriteKeywordEl(const AText: DOMString); override;
  71. procedure DescrWriteVarEl(const AText: DOMString); override;
  72. procedure DescrBeginLink(const AId: DOMString); override;
  73. procedure DescrEndLink; override;
  74. procedure DescrWriteLinebreak; override;
  75. procedure DescrBeginParagraph; override;
  76. procedure DescrBeginCode(HasBorder: Boolean; const AHighlighterName: String); override;
  77. procedure DescrWriteCodeLine(const ALine: String); override;
  78. procedure DescrEndCode; override;
  79. procedure DescrEndParagraph; override;
  80. procedure DescrBeginOrderedList; override;
  81. procedure DescrEndOrderedList; override;
  82. procedure DescrBeginUnorderedList; override;
  83. procedure DescrEndUnorderedList; override;
  84. procedure DescrBeginDefinitionList; override;
  85. procedure DescrEndDefinitionList; override;
  86. procedure DescrBeginListItem; override;
  87. procedure DescrEndListItem; override;
  88. procedure DescrBeginDefinitionTerm; override;
  89. procedure DescrEndDefinitionTerm; override;
  90. procedure DescrBeginDefinitionEntry; override;
  91. procedure DescrEndDefinitionEntry; override;
  92. procedure DescrBeginSectionTitle; override;
  93. procedure DescrBeginSectionBody; override;
  94. procedure DescrEndSection; override;
  95. procedure DescrBeginRemark; override;
  96. procedure DescrEndRemark; override;
  97. procedure DescrBeginTable(ColCount: Integer; HasBorder: Boolean); override;
  98. procedure DescrEndTable; override;
  99. procedure DescrBeginTableCaption; override;
  100. procedure DescrEndTableCaption; override;
  101. procedure DescrBeginTableHeadRow; override;
  102. procedure DescrEndTableHeadRow; override;
  103. procedure DescrBeginTableRow; override;
  104. procedure DescrEndTableRow; override;
  105. procedure DescrBeginTableCell; override;
  106. procedure DescrEndTableCell; override;
  107. procedure WriteDescr(Element: TPasElement);
  108. procedure WriteDescr(AContext: TPasElement; DescrNode: TDOMElement);
  109. function ConstValue(ConstDecl: TPasConst): String;
  110. procedure ProcessSection(ASection: TPasSection);
  111. // Documentation writing methods.
  112. procedure WriteResourceStrings(ASection: TPasSection);
  113. procedure WriteUnitOverview(ASection: TPasSection);
  114. procedure WriteVarsConstsTypes(ASection: TPasSection);
  115. procedure WriteConsts(ASection: TPasSection);
  116. procedure WriteTypes(ASection: TPasSection);
  117. procedure WriteEnumElements(TypeDecl : TPasEnumType);
  118. procedure WriteVars(ASection: TPasSection);
  119. procedure WriteFunctionsAndProcedures(ASection: TPasSection);
  120. procedure WriteProcedure(ProcDecl: TPasProcedureBase);
  121. procedure WriteClasses(ASection: TPasSection);
  122. procedure WriteClassDecl(ClassDecl: TPasClassType);
  123. procedure WriteClassMethodOverview(ClassDecl: TPasClassType);
  124. procedure WriteClassPropertyOverview(ClassDecl: TPasClassType);
  125. procedure WriteProperty(PropDecl: TPasProperty);
  126. procedure WriteExample(ADocNode: TDocNode);
  127. procedure WriteSeeAlso(ADocNode: TDocNode);
  128. procedure SortElementList(List : TList);
  129. Function ShowMember(M : TPasElement) : boolean;
  130. public
  131. constructor Create(APackage: TPasPackage; AEngine: TFPDocEngine);
  132. procedure WriteDoc;
  133. end;
  134. constructor TLaTeXWriter.Create(APackage: TPasPackage; AEngine: TFPDocEngine);
  135. procedure AddLabel(AElement: TPasElement);
  136. begin
  137. Engine.AddLink(AElement.PathName, GetLabel(AElement));
  138. end;
  139. procedure AddList(AElement: TPasElement; AList: TList);
  140. var
  141. i: Integer;
  142. begin
  143. for i := 0 to AList.Count - 1 do
  144. AddLabel(TPasElement(AList[i]));
  145. end;
  146. procedure ScanModule(AModule: TPasModule);
  147. var
  148. i, j, k: Integer;
  149. s: String;
  150. ClassEl: TPasClassType;
  151. FPEl, AncestorMemberEl: TPasElement;
  152. DocNode: TDocNode;
  153. DidAutolink: Boolean;
  154. begin
  155. AddLabel(AModule);
  156. with AModule do
  157. begin
  158. AddList(AModule, InterfaceSection.ResStrings);
  159. AddList(AModule, InterfaceSection.Consts);
  160. AddList(AModule, InterfaceSection.Types);
  161. if InterfaceSection.Classes.Count > 0 then
  162. begin
  163. for i := 0 to InterfaceSection.Classes.Count - 1 do
  164. begin
  165. ClassEl := TPasClassType(InterfaceSection.Classes[i]);
  166. AddLabel(ClassEl);
  167. for j := 0 to ClassEl.Members.Count - 1 do
  168. begin
  169. FPEl := TPasElement(ClassEl.Members[j]);
  170. if ((FPEl.Visibility = visPrivate) and Engine.HidePrivate) or
  171. ((FPEl.Visibility = visProtected) and Engine.HideProtected) then
  172. continue;
  173. DocNode := Engine.FindDocNode(FPEl);
  174. if not Assigned(DocNode) then
  175. begin
  176. DidAutolink := False;
  177. if Assigned(ClassEl.AncestorType) and
  178. (ClassEl.AncestorType.ClassType = TPasClassType) then
  179. begin
  180. for k := 0 to TPasClassType(ClassEl.AncestorType).Members.Count - 1 do
  181. begin
  182. AncestorMemberEl :=
  183. TPasElement(TPasClassType(ClassEl.AncestorType).Members[k]);
  184. if AncestorMemberEl.Name = FPEl.Name then
  185. begin
  186. DocNode := Engine.FindDocNode(AncestorMemberEl);
  187. if Assigned(DocNode) then
  188. begin
  189. DidAutolink := True;
  190. Engine.AddLink(FPEl.PathName,
  191. Engine.FindAbsoluteLink(AncestorMemberEl.PathName));
  192. break;
  193. end;
  194. end;
  195. end;
  196. end;
  197. if not DidAutolink then
  198. AddLabel(FPEl);
  199. end else
  200. AddLabel(FPEl);
  201. end;
  202. end;
  203. end;
  204. AddList(AModule, InterfaceSection.Functions);
  205. AddList(AModule, InterfaceSection.Variables);
  206. end;
  207. end;
  208. var
  209. i: Integer;
  210. begin
  211. inherited Create(AEngine);
  212. Package := APackage;
  213. { Allocate labels for all elements for which we are going to create
  214. documentation. This is needed for links to work correctly. }
  215. // Allocate label for the package itself, if a name is given (i.e. <> '#')
  216. if Length(Package.Name) > 1 then
  217. AddLabel(Package);
  218. for i := 0 to Package.Modules.Count - 1 do
  219. ScanModule(TPasModule(Package.Modules[i]));
  220. end;
  221. procedure TLaTeXWriter.WriteDoc;
  222. var
  223. i : Integer;
  224. begin
  225. PackageName := LowerCase(Copy(Package.Name, 2, 255));
  226. If (Engine.OutPut='') then
  227. Engine.Output:=PackageName+TexExtension;
  228. Assign(f, Engine.Output);
  229. Rewrite(f);
  230. try
  231. WriteLn('% This file has been created automatically by FPDoc,');
  232. WriteLn('% (c) 2000-2003 by Areca Systems GmbH / Sebastian Guenther ([email protected])');
  233. for i := 0 to Package.Modules.Count - 1 do
  234. begin
  235. Module := TPasModule(Package.Modules[i]);
  236. ModuleName := LowerCase(Module.Name);
  237. WriteLn('');
  238. WriteLnF('\chapter{%s}', [EscapeTex(Format(SDocUnitTitle, [Module.Name]))]);
  239. WriteLabel(Module);
  240. ProcessSection(Module.InterfaceSection);
  241. end;
  242. finally
  243. Close(f);
  244. end;
  245. end;
  246. function TLaTeXWriter.GetLabel(AElement: TPasElement): String;
  247. var
  248. i: Integer;
  249. begin
  250. if AElement.ClassType = TPasUnresolvedTypeRef then
  251. Result := Engine.ResolveLink(Module, AElement.Name)
  252. else
  253. begin
  254. Result := AElement.PathName;
  255. Result := LowerCase(Copy(Result, 2, Length(Result) - 1));
  256. end;
  257. for i := 1 to Length(Result) do
  258. if Result[i] = '.' then
  259. Result[i] := ':';
  260. end;
  261. procedure TLaTeXWriter.Write(const s: String);
  262. begin
  263. System.Write(f, s);
  264. end;
  265. procedure TLaTeXWriter.WriteF(const s: String; const Args: array of const);
  266. begin
  267. System.Write(f, Format(s, Args));
  268. end;
  269. procedure TLaTeXWriter.WriteLn(const s: String);
  270. begin
  271. System.WriteLn(f, s);
  272. end;
  273. procedure TLaTeXWriter.WriteLnF(const s: String; const Args: array of const);
  274. begin
  275. System.WriteLn(f, Format(s, Args));
  276. end;
  277. Function TLatexWriter.EscapeTex(S : String) : String;
  278. var
  279. i: Integer;
  280. begin
  281. SetLength(Result, 0);
  282. for i := 1 to Length(S) do
  283. case S[i] of
  284. '&','{','}','#','_','$','%': // Escape these characters
  285. Result := Result + '\' + S[i];
  286. '~','^':
  287. Result := Result + '\'+S[i]+' ';
  288. '\':
  289. Result:=Result+'$\backslash$'
  290. else
  291. Result := Result + S[i];
  292. end;
  293. end;
  294. Function TLatexWriter.StripTex(S : String) : String;
  295. var
  296. I,L: Integer;
  297. begin
  298. SetLength(Result, 0);
  299. for i := 1 to Length(S) do
  300. If not (S[i] in ['&','{','}','#','_','$','%','''','~','^', '\']) then
  301. Result := Result + S[i];
  302. end;
  303. procedure TLaTeXWriter.DescrWriteText(const AText: DOMString);
  304. begin
  305. Write(EscapeTex(AText));
  306. end;
  307. procedure TLaTeXWriter.DescrBeginBold;
  308. begin
  309. Write('\textbf{');
  310. end;
  311. procedure TLaTeXWriter.DescrEndBold;
  312. begin
  313. Write('}');
  314. end;
  315. procedure TLaTeXWriter.DescrBeginItalic;
  316. begin
  317. Write('\textit{');
  318. end;
  319. procedure TLaTeXWriter.DescrEndItalic;
  320. begin
  321. Write('}');
  322. end;
  323. procedure TLaTeXWriter.DescrBeginEmph;
  324. begin
  325. Write('\emph{');
  326. end;
  327. procedure TLaTeXWriter.DescrEndEmph;
  328. begin
  329. Write('}');
  330. end;
  331. procedure TLaTeXWriter.DescrWriteFileEl(const AText: DOMString);
  332. begin
  333. Write('\file{');
  334. DescrWriteText(AText);
  335. Write('}');
  336. end;
  337. procedure TLaTeXWriter.DescrWriteKeywordEl(const AText: DOMString);
  338. begin
  339. Write('\textbf{\\ttfamily ');
  340. DescrWriteText(AText);
  341. Write('}');
  342. end;
  343. procedure TLaTeXWriter.DescrWriteVarEl(const AText: DOMString);
  344. begin
  345. Write('\var{');
  346. DescrWriteText(AText);
  347. Write('}');
  348. end;
  349. procedure TLaTeXWriter.DescrBeginLink(const AId: DOMString);
  350. var
  351. i: Integer;
  352. begin
  353. FLink := Engine.ResolveLink(Module, AId);
  354. // System.WriteLn('Link "', AId, '" => ', FLink);
  355. end;
  356. procedure TLaTeXWriter.DescrEndLink;
  357. begin
  358. WriteF(' (\pageref{%s})',[StripTex(Flink)]);
  359. end;
  360. procedure TLaTeXWriter.DescrWriteLinebreak;
  361. begin
  362. WriteLn('\\');
  363. end;
  364. procedure TLaTeXWriter.DescrBeginParagraph;
  365. begin
  366. // Do nothing
  367. end;
  368. procedure TLaTeXWriter.DescrEndParagraph;
  369. begin
  370. WriteLn('');
  371. WriteLn('');
  372. end;
  373. procedure TLaTeXWriter.DescrBeginCode(HasBorder: Boolean;
  374. const AHighlighterName: String);
  375. begin
  376. StartListing(HasBorder);
  377. end;
  378. procedure TLaTeXWriter.DescrWriteCodeLine(const ALine: String);
  379. begin
  380. WriteLn(ALine);
  381. end;
  382. procedure TLaTeXWriter.DescrEndCode;
  383. begin
  384. EndListing
  385. end;
  386. procedure TLaTeXWriter.DescrBeginOrderedList;
  387. begin
  388. WriteLn('\begin{enumerate}');
  389. end;
  390. procedure TLaTeXWriter.DescrEndOrderedList;
  391. begin
  392. WriteLn('\end{enumerate}');
  393. end;
  394. procedure TLaTeXWriter.DescrBeginUnorderedList;
  395. begin
  396. WriteLn('\begin{itemize}');
  397. end;
  398. procedure TLaTeXWriter.DescrEndUnorderedList;
  399. begin
  400. WriteLn('\end{itemize}');
  401. end;
  402. procedure TLaTeXWriter.DescrBeginDefinitionList;
  403. begin
  404. WriteLn('\begin{description');
  405. end;
  406. procedure TLaTeXWriter.DescrEndDefinitionList;
  407. begin
  408. WriteLn('\end{description}');
  409. end;
  410. procedure TLaTeXWriter.DescrBeginListItem;
  411. begin
  412. Write('\item ');
  413. end;
  414. procedure TLaTeXWriter.DescrEndListItem;
  415. begin
  416. WriteLn('');
  417. end;
  418. procedure TLaTeXWriter.DescrBeginDefinitionTerm;
  419. begin
  420. Write('\item[');
  421. end;
  422. procedure TLaTeXWriter.DescrEndDefinitionTerm;
  423. begin
  424. WriteLn(']');
  425. end;
  426. procedure TLaTeXWriter.DescrBeginDefinitionEntry;
  427. begin
  428. // Do nothing
  429. end;
  430. procedure TLaTeXWriter.DescrEndDefinitionEntry;
  431. begin
  432. WriteLn('');
  433. end;
  434. procedure TLaTeXWriter.DescrBeginSectionTitle;
  435. begin
  436. Write('\subsection{');
  437. end;
  438. procedure TLaTeXWriter.DescrBeginSectionBody;
  439. begin
  440. WriteLn('}');
  441. end;
  442. procedure TLaTeXWriter.DescrEndSection;
  443. begin
  444. // Do noting
  445. end;
  446. procedure TLaTeXWriter.DescrBeginRemark;
  447. begin
  448. WriteLn('\begin{remark}');
  449. end;
  450. procedure TLaTeXWriter.DescrEndRemark;
  451. begin
  452. WriteLn('\end{remark}');
  453. end;
  454. procedure TLaTeXWriter.DescrBeginTable(ColCount: Integer; HasBorder: Boolean);
  455. var
  456. i: Integer;
  457. begin
  458. // !!!: How do we set the border?
  459. Write('\begin{FPCltable}{');
  460. for i := 1 to ColCount do
  461. Write('l');
  462. write('}{');
  463. TableCaptionWritten:=False;
  464. end;
  465. procedure TLaTeXWriter.DescrEndTable;
  466. begin
  467. WriteLn('\end{FPCltable}');
  468. end;
  469. procedure TLaTeXWriter.DescrBeginTableCaption;
  470. begin
  471. // Do nothing.
  472. end;
  473. procedure TLaTeXWriter.DescrEndTableCaption;
  474. begin
  475. Write('}{table');
  476. Inc(FTableCount);
  477. Write(IntToStr(FTableCount));
  478. Writeln('}');
  479. TableCaptionWritten := True;
  480. end;
  481. procedure TLaTeXWriter.DescrBeginTableHeadRow;
  482. begin
  483. if not TableCaptionWritten then
  484. DescrEndTableCaption;
  485. TableRowStartFlag := True;
  486. end;
  487. procedure TLaTeXWriter.DescrEndTableHeadRow;
  488. begin
  489. WriteLn('\\ \hline');
  490. end;
  491. procedure TLaTeXWriter.DescrBeginTableRow;
  492. begin
  493. if not TableCaptionWritten then
  494. DescrEndTableCaption;
  495. TableRowStartFlag := True;
  496. end;
  497. procedure TLaTeXWriter.DescrEndTableRow;
  498. begin
  499. WriteLn('\\');
  500. end;
  501. procedure TLaTeXWriter.DescrBeginTableCell;
  502. begin
  503. if TableRowStartFlag then
  504. TableRowStartFlag := False
  505. else
  506. Write(' & ');
  507. end;
  508. procedure TLaTeXWriter.DescrEndTableCell;
  509. begin
  510. // Do nothing
  511. end;
  512. procedure TLaTeXWriter.WriteDescr(Element: TPasElement);
  513. var
  514. DocNode: TDocNode;
  515. begin
  516. DocNode := Engine.FindDocNode(Element);
  517. if Assigned(DocNode) then
  518. begin
  519. if not IsDescrNodeEmpty(DocNode.Descr) then
  520. WriteDescr(Element, DocNode.Descr)
  521. else if not IsDescrNodeEmpty(DocNode.ShortDescr) then
  522. WriteDescr(Element, DocNode.ShortDescr);
  523. end;
  524. end;
  525. procedure TLaTeXWriter.WriteDescr(AContext: TPasElement; DescrNode: TDOMElement);
  526. begin
  527. if Assigned(DescrNode) then
  528. ConvertDescr(AContext, DescrNode, False);
  529. end;
  530. function TLaTeXWriter.ConstValue(ConstDecl: TPasConst): String;
  531. begin
  532. if Assigned(ConstDecl) then
  533. Result := ConstDecl.ClassName
  534. else
  535. Result := '<nil>';
  536. end;
  537. procedure TLaTexWriter.WriteUnitOverview(ASection: TPasSection);
  538. var
  539. i: Integer;
  540. UnitRef: TPasType;
  541. DocNode: TDocNode;
  542. begin
  543. if ASection.UsesList.Count > 0 then
  544. begin
  545. WriteLnF('\section{%s}', [SDocUsedUnits]);
  546. WriteLnF('\begin{FPCltable}{lr}{%s}{%s:0units}',
  547. [Format(SDocUsedUnitsByUnitXY, [Module.Name]), ModuleName]);
  548. WriteLn('Name & Page \\ \hline');
  549. for i := 0 to ASection.UsesList.Count - 1 do
  550. begin
  551. UnitRef := TPasType(ASection.UsesList[i]);
  552. WriteLnF('%s\index{unit!%s} & \pageref{%s} \\',
  553. [UnitRef.Name, UnitRef.Name, StripTex(GetLabel(UnitRef))]);
  554. end;
  555. WriteLn('\end{FPCltable}');
  556. end;
  557. DocNode := Engine.FindDocNode(ASection.Parent);
  558. if Assigned(DocNode) and not IsDescrNodeEmpty(DocNode.Descr) then
  559. begin
  560. WriteLnF('\section{%s}', [EscapeTex(SDocOverview)]);
  561. WriteDescr(ASection.Parent, DocNode.Descr);
  562. Writeln('');
  563. end;
  564. end;
  565. procedure TLaTeXWriter.WriteResourceStrings(ASection: TPasSection);
  566. var
  567. ResStrDecl: TPasResString;
  568. i: Integer;
  569. begin
  570. if ASection.ResStrings.Count > 0 then
  571. begin
  572. StartSubSection(SDocResStrings,ModuleName+'ResStrings');
  573. for i := 0 to ASection.ResStrings.Count - 1 do
  574. begin
  575. ResStrDecl := TPasResString(ASection.ResStrings[i]);
  576. StartListing(false, '');
  577. Writeln(ResStrDecl.GetDeclaration(True));
  578. EndListing;
  579. WriteLabel(ResStrDecl);
  580. WriteIndex(ResStrDecl);
  581. WriteDescr(ResStrDecl);
  582. Writeln('');
  583. end;
  584. end;
  585. end;
  586. procedure TLaTeXWriter.WriteConsts(ASection: TPasSection);
  587. var
  588. i: Integer;
  589. ConstDecl: TPasConst;
  590. begin
  591. if ASection.Consts.Count > 0 then
  592. begin
  593. WriteLnF('\subsection{%s}\label{suse:%sConstants}',
  594. [EscapeTex(SDocConstants), EscapeTex(ModuleName)]);
  595. for i := 0 to ASection.Consts.Count - 1 do
  596. begin
  597. ConstDecl := TPasConst(ASection.Consts[i]);
  598. StartListing(False);
  599. WriteLn(EscapeTex(ConstDecl.GetDeclaration(True)));
  600. EndListing;
  601. WriteLabel(ConstDecl);
  602. WriteIndex(ConstDecl);
  603. WriteDescr(ConstDecl);
  604. end;
  605. end;
  606. end;
  607. procedure TLaTeXWriter.WriteEnumElements(TypeDecl : TPasEnumType);
  608. Var
  609. EV : TPasEnumValue;
  610. I : Integer;
  611. DocNode : TDocNode;
  612. begin
  613. With TypeDecl do
  614. begin
  615. SortElementList(Values);
  616. DescrBeginTable(2,True);
  617. DescrBeginTableCaption;
  618. Writeln(EscapeTex(Format(SDocValuesForEnum,[TypeDecl.Name])));
  619. DescrEndTableCaption;
  620. DescrBeginTableHeadRow;
  621. DescrBeginTableCell;
  622. Writeln(EscapeTex(SDocValue));
  623. DescrEndTableCell;
  624. DescrBeginTableCell;
  625. Writeln(EscapeTex(SDocExplanation));
  626. DescrEndTableCell;
  627. DescrEndTableHeadRow;
  628. For I:=0 to Values.Count-1 do
  629. begin
  630. EV:=TPasEnumValue(Values[i]);
  631. DescrBeginTableRow;
  632. DescrBeginTableCell;
  633. Writeln(EscapeTex(EV.Name));
  634. DescrEndTableCell;
  635. DescrBeginTableCell;
  636. DocNode := Engine.FindDocNode(EV);
  637. if Assigned(DocNode) and (not IsDescrNodeEmpty(DocNode.ShortDescr)) then
  638. WriteDescr(EV,DocNode.ShortDescr);
  639. DescrEndTableCell;
  640. DescrEndTableRow;
  641. end;
  642. DescrEndTable;
  643. end;
  644. end;
  645. procedure TLaTeXWriter.WriteTypes(ASection: TPasSection);
  646. var
  647. i: Integer;
  648. TypeDecl: TPasType;
  649. begin
  650. if ASection.Types.Count > 0 then
  651. begin
  652. StartSubSection(SDocTypes,ModuleName+'Types');
  653. for i := 0 to ASection.Types.Count - 1 do
  654. begin
  655. TypeDecl := TPasType(ASection.Types[i]);
  656. StartListing(False);
  657. Writeln(EscapeTex(TypeDecl.GetDeclaration(True)));
  658. EndListing;
  659. WriteLabel(TypeDecl);
  660. WriteIndex(TypeDecl);
  661. If TypeDecl is TPasEnumType then
  662. begin
  663. WriteENumElements(TypeDecl as TPasEnumType);
  664. end;
  665. WriteDescr(TypeDecl);
  666. end;
  667. end;
  668. end;
  669. procedure TLaTeXWriter.WriteVars(ASection: TPasSection);
  670. var
  671. VarDecl: TPasVariable;
  672. i: Integer;
  673. begin
  674. if ASection.Variables.Count > 0 then
  675. begin
  676. StartSubsection(SDocVariables,ModuleName+'Variables');
  677. for i := 0 to ASection.Variables.Count - 1 do
  678. begin
  679. VarDecl := TPasVariable(ASection.Variables[i]);
  680. StartListing(False);
  681. WriteLn(EscapeTex(VarDecl.GetDeclaration(True)));
  682. EndListing;
  683. WriteLabel(VarDecl);
  684. WriteIndex(VarDecl);
  685. WriteDescr(VarDecl);
  686. end;
  687. end;
  688. end;
  689. procedure TLaTeXWriter.WriteVarsConstsTypes(ASection: TPasSection);
  690. begin
  691. With Asection do
  692. if (Consts.Count > 0) or
  693. (Types.Count > 0) or
  694. (Variables.Count > 0) or
  695. (ResStrings.Count>0) then
  696. begin
  697. StartSection(SDocConstsTypesVars, ModuleName+'ConstsTypesVars');
  698. WriteResourceStrings(ASection);
  699. WriteConsts(ASection);
  700. WriteTypes(ASection);
  701. WriteVars(ASection);
  702. end;
  703. end;
  704. const
  705. SVisibility: array[TPasMemberVisibility] of string =
  706. ('Default', 'Private', 'Protected', 'Public',
  707. 'Published', 'Automated');
  708. procedure TLatexWriter.WriteProcedure(ProcDecl : TPasProcedureBase);
  709. var
  710. DocNode: TDocNode;
  711. OP : TPasOverloadedProc;
  712. i : integer;
  713. begin
  714. With ProcDecl do
  715. begin
  716. if Not (Assigned(Parent) and Parent.InheritsFrom(TPasClassType)) then
  717. begin
  718. StartSubSection(Name);
  719. WriteLabel(ProcDecl);
  720. WriteIndex(ProcDecl);
  721. end
  722. else
  723. begin // Parent assigned and hence method.
  724. StartSubSection(Parent.Name+'.'+Name);
  725. WriteLabel(ProcDecl);
  726. WriteIndex(Parent.Name+'.'+Name);
  727. end;
  728. Writeln('\begin{FPCList}');
  729. DocNode := Engine.FindDocNode(ProcDecl);
  730. if Assigned(DocNode) and Assigned(DocNode.ShortDescr) then
  731. begin
  732. Writeln('\Synopsis');
  733. WriteDescr(ProcDecl, DocNode.ShortDescr);
  734. end;
  735. Writeln('\Declaration ');
  736. StartListing(False);
  737. if ClassType = TPasOverloadedProc then
  738. begin
  739. OP:=TPasOverloadedProc(ProcDecl);
  740. for i := 0 to OP.Overloads.Count - 1 do
  741. begin
  742. WriteLn(TPasProcedure(OP.Overloads[i]).GetDeclaration(True));
  743. end;
  744. end
  745. else
  746. WriteLn(GetDeclaration(True));
  747. EndListing;
  748. If Assigned(Parent) then
  749. begin
  750. Writeln('\Visibility');
  751. Writeln(VisibilityNames[Visibility])
  752. end;
  753. if Assigned(DocNode) and Assigned(DocNode.Descr) then
  754. begin
  755. Writeln('\Description');
  756. WriteDescr(ProcDecl);
  757. end;
  758. if Assigned(DocNode) and Assigned(DocNode.ErrorsDoc) then
  759. begin
  760. Writeln('\Errors');
  761. WriteDescr(ProcDecl, DocNode.ErrorsDoc);
  762. end;
  763. WriteSeeAlso(DocNode);
  764. Writeln('\end{FPCList}');
  765. WriteExample(DocNode);
  766. end;
  767. end;
  768. procedure TLaTeXWriter.WriteFunctionsAndProcedures(ASection: TPasSection);
  769. var
  770. i: Integer;
  771. begin
  772. if ASection.Functions.Count > 0 then
  773. begin
  774. StartSection(SDocProceduresAndFunctions,ModuleName+'Functions');
  775. for i := 0 to ASection.Functions.Count - 1 do
  776. WriteProcedure(TPasProcedureBase(ASection.Functions[i]));
  777. end;
  778. end;
  779. procedure TlatexWriter.WriteExample(ADocNode: TDocNode);
  780. var
  781. Example: TDOMElement;
  782. begin
  783. if Assigned(ADocNode) then
  784. begin
  785. Example := ADocNode.FirstExample;
  786. while Assigned(Example) do
  787. begin
  788. WritelnF('\FPCexample{%s}', [Engine.GetExampleFileName(Example)]);
  789. if Assigned(Example.NextSibling) then
  790. WriteLn('');
  791. Example := TDomElement(Example.NextSibling);
  792. end;
  793. end;
  794. end;
  795. procedure TLateXWriter.WriteSeeAlso(ADocNode: TDocNode);
  796. var
  797. Node: TDOMNode;
  798. s: String;
  799. begin
  800. if Assigned(ADocNode) and Assigned(ADocNode.SeeAlso) and
  801. Assigned(ADocNode.SeeAlso.FirstChild) then
  802. begin
  803. Writeln('\SeeAlso');
  804. Node := ADocNode.SeeAlso.FirstChild;
  805. while Assigned(Node) do
  806. begin
  807. if (Node.NodeType = ELEMENT_NODE) and
  808. (Node.NodeName = 'link') then
  809. begin
  810. S:=TDomElement(Node)['id'];
  811. DescrBeginLink(S);
  812. Writeln(S);
  813. DescrEndLink();
  814. if Assigned(Node.NextSibling) Then
  815. Writeln(',');
  816. end;
  817. Node:=Node.NextSibling;
  818. end;
  819. end;
  820. end;
  821. procedure TLaTeXWriter.WriteClasses(ASection: TPasSection);
  822. var
  823. i: Integer;
  824. begin
  825. if (ASection.Classes.Count > 0) then
  826. begin
  827. for i := 0 to ASection.Classes.Count - 1 do
  828. WriteClassDecl(TPasClassType(ASection.Classes[i]));
  829. end;
  830. end;
  831. procedure TLaTeXWriter.ProcessSection(ASection: TPasSection);
  832. begin
  833. With ASection do
  834. begin
  835. SortElementList(UsesList);
  836. SortElementList(Declarations);
  837. SortElementList(ResStrings);
  838. SortElementList(Types);
  839. SortElementList(Consts);
  840. SortElementList(Classes);
  841. SortElementList(Functions);
  842. SortElementList(Variables);
  843. end;
  844. WriteUnitOverView(ASection);
  845. WriteVarsConstsTypes(ASection);
  846. WriteFunctionsAndProcedures(ASection);
  847. WriteClasses(ASection);
  848. end;
  849. Function TLatexWriter.ShowMember(M : TPasElement) : boolean;
  850. begin
  851. Result:=not ((M.Visibility=visPrivate) and Engine.HidePrivate);
  852. If Result then
  853. Result:=Not ((M.Visibility=visProtected) and Engine.HideProtected)
  854. end;
  855. procedure TLatexWriter.WriteClassMethodOverview(ClassDecl : TPasClassType);
  856. var
  857. Member: TPasElement;
  858. i, j: Integer;
  859. s: String;
  860. Arg: TPasArgument;
  861. DocNode: TDocNode;
  862. List : TStringList;
  863. begin
  864. List:=TStringList.Create;
  865. Try
  866. List.Sorted:=True;
  867. for i := 0 to ClassDecl.Members.Count - 1 do
  868. begin
  869. Member := TPasElement(ClassDecl.Members[i]);
  870. With Member do
  871. if InheritsFrom(TPasProcedureBase) and ShowMember(Member) then
  872. List.AddObject(Member.Name,Member);
  873. end;
  874. If List.Count>0 then
  875. begin
  876. StartSubSection(SDocMethodOverview);
  877. WriteLabel(GetLabel(ClassDecl) + ':Methods');
  878. WriteLn('\begin{tabularx}{\textwidth}{llX}');
  879. WriteLnF('%s & %s & %s \\ \hline', [EscapeTex(SDocPage), EscapeTex(SDocMethod), EscapeTex(SDocDescription)]);
  880. For I:=0 to List.Count-1 do
  881. begin
  882. Member:=TPasElement(List.Objects[i]);
  883. DocNode := Engine.FindDocNode(Member);
  884. WriteF('\pageref{%s} & %s & ',[StripTex(GetLabel(Member)), EscapeTex(Member.Name)]);
  885. if Assigned(DocNode) and Assigned(DocNode.ShortDescr) then
  886. WriteDescr(Member, DocNode.ShortDescr);
  887. WriteLn('\\');
  888. end;
  889. WriteLn('\hline');
  890. WriteLn('\end{tabularx}');
  891. end;
  892. Finally
  893. List.Free;
  894. end;
  895. end;
  896. procedure TLatexWriter.WriteClassPropertyOverview(ClassDecl : TPasClassType);
  897. var
  898. Member: TPasElement;
  899. i, j: Integer;
  900. s: String;
  901. Arg: TPasArgument;
  902. DocNode: TDocNode;
  903. List : TStringList;
  904. begin
  905. // Write property overview
  906. List:=TStringList.Create;
  907. Try
  908. List.Sorted:=True;
  909. for i := 0 to ClassDecl.Members.Count - 1 do
  910. begin
  911. Member := TPasElement(ClassDecl.Members[i]);
  912. With Member do
  913. if InheritsFrom(TPasProperty) and SHowMember(Member) then
  914. List.AddObject(Member.Name,Member)
  915. end;
  916. If (List.Count>0) then
  917. begin
  918. StartSubSection(SDocPropertyOverview);
  919. WriteLabel(GetLabel(ClassDecl) + ':Properties');
  920. WriteLn('\begin{tabularx}{\textwidth}{lllX}');
  921. WriteLnF('%s & %s & %s & %s \\ \hline',
  922. [EscapeTex(SDocPage), EscapeTex(SDocProperty), EscapeTex(SDocAccess), EscapeTex(SDocDescription)]);
  923. For I:=0 to List.Count-1 do
  924. begin
  925. Member:=TPasElement(List.objects[i]);
  926. WriteF('\pageref{%s} & %s & ', [StripTex(GetLabel(Member)), EscapeTex(Member.Name)]);
  927. setlength(S,0);
  928. if Length(TPasProperty(Member).ReadAccessorName) > 0 then
  929. s := s + 'r';
  930. if Length(TPasProperty(Member).WriteAccessorName) > 0 then
  931. s := s + 'w';
  932. if Length(TPasProperty(Member).StoredAccessorName) > 0 then
  933. s := s + 's';
  934. Write(s + ' & ');
  935. DocNode := Engine.FindDocNode(Member);
  936. if Assigned(DocNode) and Assigned(DocNode.ShortDescr) then
  937. WriteDescr(Member, DocNode.ShortDescr);
  938. WriteLn('\\');
  939. end;
  940. WriteLn('\hline');
  941. WriteLn('\end{tabularx}');
  942. end;
  943. Finally
  944. List.Free;
  945. end;
  946. end;
  947. procedure TLaTeXWriter.WriteClassDecl(ClassDecl: TPasClassType);
  948. var
  949. DocNode: TDocNode;
  950. Vis: TPasMemberVisibilities;
  951. Member: TPasElement;
  952. i: Integer;
  953. begin
  954. StartSection(ClassDecl.Name);
  955. WriteLabel(ClassDecl);
  956. WriteIndex(ClassDecl);
  957. DocNode := Engine.FindDocNode(ClassDecl);
  958. if Assigned(DocNode) and ((not IsDescrNodeEmpty(DocNode.Descr)) or
  959. (not IsDescrNodeEmpty(DocNode.ShortDescr))) then
  960. begin
  961. StartSubSection(SDocDescription);
  962. WriteDescr(ClassDecl);
  963. end;
  964. // Write method overview
  965. WriteClassMethodOverView(ClassDecl);
  966. // Write Property Overview;
  967. WriteClassPropertyOverView(ClassDecl);
  968. // Write method & property descriptions
  969. // Determine visibilities
  970. Vis := AllVisibilities;
  971. if Engine.HidePrivate then
  972. Exclude(Vis,visPrivate);
  973. if Engine.HideProtected then
  974. Exclude(Vis,visProtected);
  975. for i := 0 to ClassDecl.Members.Count - 1 do
  976. begin
  977. Member := TPasElement(ClassDecl.Members[i]);
  978. if ((Member.InheritsFrom(TPasProcedureBase)) and
  979. (Member.Visibility in Vis)) then
  980. WriteProcedure(TPasProcedureBase(Member));
  981. end;
  982. // properties.
  983. for i := 0 to ClassDecl.Members.Count - 1 do
  984. begin
  985. Member := TPasElement(ClassDecl.Members[i]);
  986. if ((Member.InheritsFrom(TPasProperty)) and
  987. (Member.Visibility in Vis)) then
  988. WriteProperty(TPasProperty(Member));
  989. end;
  990. end;
  991. procedure TLaTexWriter.WriteProperty(PropDecl : TPasProperty);
  992. var
  993. DocNode: TDocNode;
  994. S: String;
  995. begin
  996. With PropDecl do
  997. begin
  998. StartSubSection(Parent.Name+'.'+Name);
  999. WriteLabel(PropDecl);
  1000. WriteIndex(Parent.Name+'.'+Name);
  1001. Writeln('\begin{FPCList}');
  1002. DocNode := Engine.FindDocNode(PropDecl);
  1003. if Assigned(DocNode) and Assigned(DocNode.ShortDescr) then
  1004. begin
  1005. Writeln('\Synopsis');
  1006. WriteDescr(PropDecl, DocNode.ShortDescr);
  1007. end;
  1008. Writeln('\Declaration ');
  1009. StartListing(False);
  1010. WriteLn('Property '+GetDeclaration(True));
  1011. EndListing;
  1012. If Assigned(Parent) then
  1013. begin
  1014. Writeln('\Visibility');
  1015. Writeln(VisibilityNames[Visibility])
  1016. end;
  1017. Writeln('\Access');
  1018. Setlength(S,0);
  1019. If Length(ReadAccessorName) > 0 then
  1020. S:='Read';
  1021. if Length(WriteAccessorName) > 0 then
  1022. begin
  1023. If S<>'' then
  1024. S:=S+',';
  1025. S:=S+'Write';
  1026. end;
  1027. Writeln(S);
  1028. if Assigned(DocNode) and Assigned(DocNode.Descr) then
  1029. begin
  1030. Writeln('\Description');
  1031. WriteDescr(PropDecl);
  1032. end;
  1033. if Assigned(DocNode) and Assigned(DocNode.ErrorsDoc) then
  1034. begin
  1035. Writeln('\Errors');
  1036. WriteDescr(PropDecl, DocNode.ErrorsDoc);
  1037. end;
  1038. WriteSeeAlso(DocNode);
  1039. Writeln('\end{FPCList}');
  1040. WriteExample(DocNode);
  1041. end;
  1042. end;
  1043. Function CompareElements(P1,P2 : Pointer) : Integer;
  1044. begin
  1045. Result:=CompareText(TPasElement(P1).Name,TPasElement(P2).Name);
  1046. end;
  1047. procedure TLaTeXWriter.SortElementList(List : TList);
  1048. begin
  1049. List.Sort(@CompareElements)
  1050. end;
  1051. procedure TLaTeXWriter.WriteLabel(El: TPasElement);
  1052. begin
  1053. WriteLabel(GetLabel(El));
  1054. end;
  1055. procedure TLaTeXWriter.WriteLabel(const s: String);
  1056. begin
  1057. WriteLnF('\label{%s}', [LowerCase(StripTex(s))]);
  1058. end;
  1059. procedure TLaTeXWriter.WriteIndex(El : TPasElement);
  1060. begin
  1061. WriteIndex(El.Name);
  1062. end;
  1063. procedure TLaTeXWriter.WriteIndex(const s : String);
  1064. begin
  1065. Write('\index{');
  1066. Write(EscapeTex(s));
  1067. Writeln('}');
  1068. end;
  1069. procedure TLaTeXWriter.StartListing(Frames: Boolean; const name: String);
  1070. begin
  1071. if Not LaTexHighLight then
  1072. Writeln('\begin{verbatim}')
  1073. else
  1074. if Frames then
  1075. Writelnf('\begin{lstlisting}{%s}',[StripTex(Name)])
  1076. else
  1077. Writelnf('\begin{lstlisting}[frame=]{%s}',[StripTex(Name)]);
  1078. end;
  1079. procedure TLaTeXWriter.StartListing(Frames : Boolean);
  1080. begin
  1081. StartListing(Frames,'');
  1082. end;
  1083. procedure TLaTeXWriter.EndListing;
  1084. begin
  1085. If LaTexHighLight then
  1086. Writeln('\end{lstlisting}')
  1087. else
  1088. Writeln('\end{verbatim}')
  1089. end;
  1090. procedure TLatexWriter.WriteCommentLine;
  1091. const
  1092. CommentLine =
  1093. '%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%';
  1094. begin
  1095. Writeln(CommentLine);
  1096. end;
  1097. procedure TLatexWriter.WriteComment(Comment : String);
  1098. begin
  1099. Write('% ');
  1100. Writeln(Comment);
  1101. end;
  1102. procedure TLatexWriter.StartSection(SectionName : String; SectionLabel : String);
  1103. begin
  1104. StartSection(SectionName);
  1105. WriteLabel(SectionLabel);
  1106. end;
  1107. procedure TLatexWriter.StartSection(SectionName : String);
  1108. begin
  1109. Writeln('');
  1110. WriteCommentLine;
  1111. WriteComment(SectionName);
  1112. Writeln('\section{'+EscapeTex(SectionName)+'}');
  1113. end;
  1114. procedure TLatexWriter.StartSubSection(SubSectionName : String; SubSectionLabel : String);
  1115. begin
  1116. StartSubSection(SubSectionName);
  1117. WriteLabel(SubsectionLabel);
  1118. end;
  1119. procedure TLatexWriter.StartSubSection(SubSectionName : String);
  1120. begin
  1121. Writeln('');
  1122. WriteComment(SubsectionName);
  1123. Writeln('\subsection{'+EscapeTex(SubSectionName)+'}');
  1124. end;
  1125. procedure TLatexWriter.StartChapter(ChapterName : String; ChapterLabel : String);
  1126. begin
  1127. StartChapter(ChapterName);
  1128. WriteLabel(ChapterLabel);
  1129. end;
  1130. procedure TLatexWriter.StartChapter(ChapterName : String);
  1131. begin
  1132. Writeln('');
  1133. WriteCommentLine;
  1134. WriteComment(ChapterName);
  1135. WriteCommentLine;
  1136. Writeln('\chapter{'+EscapeTex(ChapterName)+'}');
  1137. end;
  1138. procedure CreateLaTeXDocForPackage(APackage: TPasPackage; AEngine: TFPDocEngine);
  1139. var
  1140. Writer: TLaTeXWriter;
  1141. begin
  1142. Writer := TLaTeXWriter.Create(APackage, AEngine);
  1143. try
  1144. Writer.WriteDoc;
  1145. finally
  1146. Writer.Free;
  1147. end;
  1148. end;
  1149. end.
  1150. {
  1151. $Log$
  1152. Revision 1.4 2003-03-18 19:28:44 michael
  1153. + Some changes to output handling, more suitable for tex output
  1154. Revision 1.3 2003/03/18 19:12:29 michael
  1155. + More EscapeTex calls needed
  1156. Revision 1.2 2003/03/18 01:11:51 michael
  1157. + Some fixes to deal with illegal tex characters
  1158. Revision 1.1 2003/03/17 23:03:20 michael
  1159. + Initial import in CVS
  1160. Revision 1.13 2003/03/13 22:02:13 sg
  1161. * New version with many bugfixes and our own parser (now independent of the
  1162. compiler source)
  1163. Revision 1.12 2002/10/20 22:49:31 michael
  1164. + Sorted all overviews. Added table with enumeration values for enumerated types.
  1165. Revision 1.11 2002/05/24 00:13:22 sg
  1166. * much improved new version, including many linking and output fixes
  1167. Revision 1.10 2002/03/12 10:58:36 sg
  1168. * reworked linking engine and internal structure
  1169. Revision 1.9 2002/01/20 11:19:55 michael
  1170. + Added link attribute and property to TFPElement
  1171. Revision 1.8 2002/01/08 13:00:06 michael
  1172. + Added correct array handling and syntax highlighting is now optional
  1173. Revision 1.7 2002/01/08 08:22:40 michael
  1174. + Implemented latex writer
  1175. Revision 1.6 2001/12/17 14:41:42 michael
  1176. + Split out of latex writer
  1177. Revision 1.5 2001/12/17 13:41:18 jonas
  1178. * OsPathSeparator -> PathDelim
  1179. }