dw_latex.pp 16 KB

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