dw_latex.pp 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803
  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. MaxVerbatimLength : Integer = 65;
  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. FImageDir: String;
  30. FTableCount : Integer;
  31. FInVerbatim : Boolean;
  32. Inlist,
  33. TableRowStartFlag,
  34. TableCaptionWritten: Boolean;
  35. // Linear documentation methods overrides;
  36. procedure WriteLabel(Const S : String); override;
  37. procedure WriteIndex(Const S : String); override;
  38. Procedure WriteExampleFile(FN : String); override;
  39. Procedure StartProcedure; override;
  40. Procedure EndProcedure; override;
  41. Procedure StartProperty; override;
  42. Procedure EndProperty; override;
  43. Procedure StartSynopsis; override;
  44. Procedure StartDeclaration; override;
  45. Procedure StartVisibility; override;
  46. Procedure StartDescription; override;
  47. Procedure StartAccess; override;
  48. Procedure StartErrors; override;
  49. Procedure StartVersion; override;
  50. Procedure StartSeealso; override;
  51. Procedure EndSeealso; override;
  52. procedure StartUnitOverview(AModuleName,AModuleLabel : String);override;
  53. procedure WriteUnitEntry(UnitRef : TPasType); override;
  54. Procedure EndUnitOverview; override;
  55. function GetLabel(AElement: TPasElement): String; override;
  56. procedure StartListing(Frames: Boolean; const name: String); override;
  57. procedure EndListing; override;
  58. Function EscapeText(S : String) : String; override;
  59. Function StripText(S : String) : String; override;
  60. procedure WriteCommentLine; override;
  61. procedure WriteComment(Comment : String);override;
  62. procedure StartSection(SectionName : String);override;
  63. procedure StartSubSection(SubSectionName : String);override;
  64. procedure StartSubSubSection(SubSubSectionName : String);override;
  65. procedure StartChapter(ChapterName : String); override;
  66. procedure StartOverview(Const What : String; WithAccess : Boolean); override;
  67. procedure EndOverview; override;
  68. procedure WriteOverviewMember(const ALabel,AName,Access,ADescr : String); override;
  69. procedure WriteOverviewMember(const ALabel,AName,ADescr : String); override;
  70. // Description node conversion
  71. procedure DescrBeginBold; override;
  72. procedure DescrEndBold; override;
  73. procedure DescrBeginItalic; override;
  74. procedure DescrEndItalic; override;
  75. procedure DescrBeginEmph; override;
  76. procedure DescrEndEmph; override;
  77. procedure DescrWriteImageEl(const AFileName, ACaption, ALinkName : DOMString); override;
  78. procedure DescrWriteFileEl(const AText: DOMString); override;
  79. procedure DescrWriteKeywordEl(const AText: DOMString); override;
  80. procedure DescrWriteVarEl(const AText: DOMString); override;
  81. procedure DescrBeginLink(const AId: DOMString); override;
  82. procedure DescrEndLink; override;
  83. procedure DescrBeginURL(const AURL: DOMString); override; // Provides a default implementation
  84. procedure DescrEndURL; override;
  85. procedure DescrWriteLinebreak; override;
  86. procedure DescrBeginParagraph; override;
  87. procedure DescrBeginCode(HasBorder: Boolean; const AHighlighterName: String); override;
  88. procedure DescrWriteCodeLine(const ALine: String); override;
  89. procedure DescrEndCode; override;
  90. procedure DescrEndParagraph; override;
  91. procedure DescrBeginOrderedList; override;
  92. procedure DescrEndOrderedList; override;
  93. procedure DescrBeginUnorderedList; override;
  94. procedure DescrEndUnorderedList; override;
  95. procedure DescrBeginDefinitionList; override;
  96. procedure DescrEndDefinitionList; override;
  97. procedure DescrBeginListItem; override;
  98. procedure DescrEndListItem; override;
  99. procedure DescrBeginDefinitionTerm; override;
  100. procedure DescrEndDefinitionTerm; override;
  101. procedure DescrBeginDefinitionEntry; override;
  102. procedure DescrEndDefinitionEntry; override;
  103. procedure DescrBeginSectionTitle; override;
  104. procedure DescrBeginSectionBody; override;
  105. procedure DescrEndSection; override;
  106. procedure DescrBeginRemark; override;
  107. procedure DescrEndRemark; override;
  108. procedure DescrBeginTable(ColCount: Integer; HasBorder: Boolean); override;
  109. procedure DescrEndTable; override;
  110. procedure DescrBeginTableCaption; override;
  111. procedure DescrEndTableCaption; override;
  112. procedure DescrBeginTableHeadRow; override;
  113. procedure DescrEndTableHeadRow; override;
  114. procedure DescrBeginTableRow; override;
  115. procedure DescrEndTableRow; override;
  116. procedure DescrBeginTableCell; override;
  117. procedure DescrEndTableCell; override;
  118. // TFPDocWriter class methods
  119. Property ImageDir : String Read FImageDir Write FImageDir;
  120. public
  121. Function SplitLine (ALine : String): String; virtual;
  122. Function InterPretOption(Const Cmd,Arg : String) : boolean; override;
  123. Class Function FileNameExtension : String; override;
  124. end;
  125. function TLaTeXWriter.GetLabel(AElement: TPasElement): String;
  126. var
  127. i: Integer;
  128. begin
  129. if AElement.ClassType = TPasUnresolvedTypeRef then
  130. Result := Engine.ResolveLink(Module, AElement.Name)
  131. else
  132. begin
  133. Result := AElement.PathName;
  134. Result := LowerCase(Copy(Result, 2, Length(Result) - 1));
  135. end;
  136. for i := 1 to Length(Result) do
  137. if Result[i] = '.' then
  138. Result[i] := ':';
  139. end;
  140. Function TLaTeXWriter.SplitLine (ALine : String): String;
  141. Function FindLastSplit(S : String) : Integer;
  142. Const
  143. NonSplit = ['a'..'z','A'..'Z','0'..'9','_'];
  144. Var
  145. L,I : integer;
  146. C : PChar;
  147. InString : Boolean;
  148. begin
  149. Result:=0;
  150. L:=Length(S);
  151. if (L>MaxVerbatimLength) then
  152. begin
  153. InString:=False;
  154. Result:=0;
  155. I:=1;
  156. C:=@S[1];
  157. While (I<=MaxVerbatimLength) do
  158. begin
  159. If C^='''' then
  160. InString:=Not Instring
  161. else if Not InString then
  162. begin
  163. if Not (C^ in NonSplit) then
  164. Result:=I;
  165. end;
  166. Inc(I);
  167. Inc(C);
  168. end;
  169. end;
  170. If Result=0 then
  171. Result:=L+1;
  172. end;
  173. Var
  174. SP : Integer;
  175. L : String;
  176. begin
  177. Result:='';
  178. While (Aline<>'') do
  179. begin
  180. SP:=FindLastSplit(Aline);
  181. L:=Copy(ALine,1,SP-1);
  182. Delete(ALine,1,SP-1);
  183. If (Result<>'') then
  184. Result:=Result+sLineBreak+' ';
  185. Result:=Result+Trim(L);
  186. end;
  187. end;
  188. function TLaTeXWriter.EscapeText(S: String): String;
  189. var
  190. i: Integer;
  191. begin
  192. if FInVerBatim=True then
  193. begin
  194. if (MaxVerbatimLength=0) or (length(S)<=MaxVerbatimLength) then
  195. Result:=S
  196. else
  197. Result:=SplitLine(S);
  198. end
  199. else
  200. begin
  201. SetLength(Result, 0);
  202. for i := 1 to Length(S) do
  203. case S[i] of
  204. '&','{','}','#','_','$','%': // Escape these characters
  205. Result := Result + '\' + S[i];
  206. '~','^':
  207. Result := Result + '\'+S[i]+' ';
  208. '\':
  209. Result:=Result+'$\backslash$'
  210. else
  211. Result := Result + S[i];
  212. end;
  213. end;
  214. end;
  215. function TLaTeXWriter.StripText(S: String): String;
  216. var
  217. I: Integer;
  218. begin
  219. SetLength(Result, 0);
  220. for i := 1 to Length(S) do
  221. If not (S[i] in ['&','{','}','#','_','$','%','''','~','^', '\']) then
  222. Result := Result + S[i]
  223. else
  224. Result:=result+'!'
  225. end;
  226. procedure TLaTeXWriter.DescrBeginBold;
  227. begin
  228. Write('\textbf{');
  229. end;
  230. procedure TLaTeXWriter.DescrEndBold;
  231. begin
  232. Write('}');
  233. end;
  234. procedure TLaTeXWriter.DescrBeginItalic;
  235. begin
  236. Write('\textit{');
  237. end;
  238. procedure TLaTeXWriter.DescrEndItalic;
  239. begin
  240. Write('}');
  241. end;
  242. procedure TLaTeXWriter.DescrBeginEmph;
  243. begin
  244. Write('\emph{');
  245. end;
  246. procedure TLaTeXWriter.DescrEndEmph;
  247. begin
  248. Write('}');
  249. end;
  250. procedure TLaTeXWriter.DescrWriteImageEl(const AFileName, ACaption, ALinkName : DOMString);
  251. Var
  252. FN : String;
  253. L : Integer;
  254. begin
  255. Writeln('\begin{figure}[ht]%');
  256. Writeln('\begin{center}');
  257. If (ACaption<>ACaption) then
  258. Writeln(Format('\caption{%s}',[EscapeText(ACaption)]));
  259. If (ALinkName<>'') then
  260. WriteLabel('fig:'+ALinkName);
  261. FN:=ImageDir;
  262. L:=Length(FN);
  263. If (L>0) and (FN[l]<>'/') then
  264. FN:=FN+'/';
  265. FN:=FN+AFileName;
  266. Writeln('\epsfig{file='+FN+'}');
  267. Writeln('\end{center}');
  268. Writeln('\end{figure}');
  269. end;
  270. procedure TLaTeXWriter.DescrWriteFileEl(const AText: DOMString);
  271. begin
  272. Write('\file{');
  273. DescrWriteText(AText);
  274. Write('}');
  275. end;
  276. procedure TLaTeXWriter.DescrWriteKeywordEl(const AText: DOMString);
  277. begin
  278. Write('\textbf{\\ttfamily ');
  279. DescrWriteText(AText);
  280. Write('}');
  281. end;
  282. procedure TLaTeXWriter.DescrWriteVarEl(const AText: DOMString);
  283. begin
  284. Write('\var{');
  285. DescrWriteText(AText);
  286. Write('}');
  287. end;
  288. procedure TLaTeXWriter.DescrBeginLink(const AId: DOMString);
  289. begin
  290. FLink := Engine.ResolveLink(Module, AId);
  291. // System.WriteLn('Link "', AId, '" => ', FLink);
  292. end;
  293. procedure TLaTeXWriter.DescrEndLink;
  294. begin
  295. WriteF(' (\pageref{%s})',[StripText(Flink)]);
  296. end;
  297. procedure TLaTeXWriter.DescrBeginURL(const AURL: DOMString);
  298. begin
  299. Inherited; // Save link
  300. Write('\htmladdnormallink{');
  301. end;
  302. procedure TLaTeXWriter.DescrEndURL;
  303. begin
  304. WriteF('}{%s}',[LastURL]);
  305. LastURL:='';
  306. end;
  307. procedure TLaTeXWriter.DescrWriteLinebreak;
  308. begin
  309. WriteLn('\\');
  310. end;
  311. procedure TLaTeXWriter.DescrBeginParagraph;
  312. begin
  313. // Do nothing
  314. end;
  315. procedure TLaTeXWriter.DescrEndParagraph;
  316. begin
  317. WriteLn('');
  318. WriteLn('');
  319. end;
  320. procedure TLaTeXWriter.DescrBeginCode(HasBorder: Boolean;
  321. const AHighlighterName: String);
  322. begin
  323. StartListing(HasBorder,'');
  324. end;
  325. procedure TLaTeXWriter.DescrWriteCodeLine(const ALine: String);
  326. begin
  327. WriteLn(ALine);
  328. end;
  329. procedure TLaTeXWriter.DescrEndCode;
  330. begin
  331. EndListing
  332. end;
  333. procedure TLaTeXWriter.DescrBeginOrderedList;
  334. begin
  335. WriteLn('\begin{enumerate}');
  336. end;
  337. procedure TLaTeXWriter.DescrEndOrderedList;
  338. begin
  339. WriteLn('\end{enumerate}');
  340. end;
  341. procedure TLaTeXWriter.DescrBeginUnorderedList;
  342. begin
  343. WriteLn('\begin{itemize}');
  344. end;
  345. procedure TLaTeXWriter.DescrEndUnorderedList;
  346. begin
  347. WriteLn('\end{itemize}');
  348. end;
  349. procedure TLaTeXWriter.DescrBeginDefinitionList;
  350. begin
  351. WriteLn('\begin{description}');
  352. end;
  353. procedure TLaTeXWriter.DescrEndDefinitionList;
  354. begin
  355. WriteLn('\end{description}');
  356. end;
  357. procedure TLaTeXWriter.DescrBeginListItem;
  358. begin
  359. Write('\item ');
  360. end;
  361. procedure TLaTeXWriter.DescrEndListItem;
  362. begin
  363. WriteLn('');
  364. end;
  365. procedure TLaTeXWriter.DescrBeginDefinitionTerm;
  366. begin
  367. Write('\item[');
  368. end;
  369. procedure TLaTeXWriter.DescrEndDefinitionTerm;
  370. begin
  371. WriteLn(']');
  372. end;
  373. procedure TLaTeXWriter.DescrBeginDefinitionEntry;
  374. begin
  375. // Do nothing
  376. end;
  377. procedure TLaTeXWriter.DescrEndDefinitionEntry;
  378. begin
  379. WriteLn('');
  380. end;
  381. procedure TLaTeXWriter.DescrBeginSectionTitle;
  382. begin
  383. Write('\subsection{');
  384. end;
  385. procedure TLaTeXWriter.DescrBeginSectionBody;
  386. begin
  387. WriteLn('}');
  388. end;
  389. procedure TLaTeXWriter.DescrEndSection;
  390. begin
  391. // Do noting
  392. end;
  393. procedure TLaTeXWriter.DescrBeginRemark;
  394. begin
  395. WriteLn('\begin{remark}');
  396. end;
  397. procedure TLaTeXWriter.DescrEndRemark;
  398. begin
  399. WriteLn('\end{remark}');
  400. end;
  401. procedure TLaTeXWriter.DescrBeginTable(ColCount: Integer; HasBorder: Boolean);
  402. var
  403. i: Integer;
  404. begin
  405. // !!!: How do we set the border?
  406. Write('\begin{FPCltable}{');
  407. for i := 1 to ColCount do
  408. Write('l');
  409. write('}{');
  410. TableCaptionWritten:=False;
  411. end;
  412. procedure TLaTeXWriter.DescrEndTable;
  413. begin
  414. WriteLn('\end{FPCltable}');
  415. end;
  416. procedure TLaTeXWriter.DescrBeginTableCaption;
  417. begin
  418. // Do nothing.
  419. end;
  420. procedure TLaTeXWriter.DescrEndTableCaption;
  421. begin
  422. Write('}{table');
  423. Inc(FTableCount);
  424. Write(IntToStr(FTableCount));
  425. Writeln('}');
  426. TableCaptionWritten := True;
  427. end;
  428. procedure TLaTeXWriter.DescrBeginTableHeadRow;
  429. begin
  430. if not TableCaptionWritten then
  431. DescrEndTableCaption;
  432. TableRowStartFlag := True;
  433. end;
  434. procedure TLaTeXWriter.DescrEndTableHeadRow;
  435. begin
  436. WriteLn('\\ \hline');
  437. end;
  438. procedure TLaTeXWriter.DescrBeginTableRow;
  439. begin
  440. if not TableCaptionWritten then
  441. DescrEndTableCaption;
  442. TableRowStartFlag := True;
  443. end;
  444. procedure TLaTeXWriter.DescrEndTableRow;
  445. begin
  446. WriteLn('\\');
  447. end;
  448. procedure TLaTeXWriter.DescrBeginTableCell;
  449. begin
  450. if TableRowStartFlag then
  451. TableRowStartFlag := False
  452. else
  453. Write(' & ');
  454. end;
  455. procedure TLaTeXWriter.DescrEndTableCell;
  456. begin
  457. // Do nothing
  458. end;
  459. procedure TLaTeXWriter.WriteLabel(const S: String);
  460. begin
  461. WriteLnF('\label{%s}', [LowerCase(StripText(s))]);
  462. end;
  463. procedure TLaTeXWriter.WriteIndex(const S: String);
  464. begin
  465. Write('\index{');
  466. Write(EscapeText(s));
  467. Writeln('}');
  468. end;
  469. procedure TLaTeXWriter.StartListing(Frames: Boolean; const name: String);
  470. begin
  471. FInVerbatim:=True;
  472. if Not LaTexHighLight then
  473. begin
  474. Writeln('');
  475. Writeln('\begin{verbatim}');
  476. end
  477. else
  478. if Frames then
  479. Writelnf('\begin{lstlisting}{%s}',[StripText(Name)])
  480. else
  481. Writelnf('\begin{lstlisting}[frame=]{%s}',[StripText(Name)]);
  482. end;
  483. procedure TLaTeXWriter.EndListing;
  484. begin
  485. FInVerbatim:=False;
  486. If LaTexHighLight then
  487. Writeln('\end{lstlisting}')
  488. else
  489. Writeln('\end{verbatim}')
  490. end;
  491. procedure TLaTeXWriter.WriteCommentLine;
  492. const
  493. CommentLine =
  494. '%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%';
  495. begin
  496. Writeln(CommentLine);
  497. end;
  498. procedure TLaTeXWriter.WriteComment(Comment: String);
  499. begin
  500. Write('% ');
  501. Writeln(Comment);
  502. end;
  503. procedure TLaTeXWriter.StartChapter(ChapterName: String);
  504. begin
  505. WriteCommentLine;
  506. WriteComment(ChapterName);
  507. WriteCommentLine;
  508. Writeln('\chapter{'+EscapeText(ChapterName)+'}');
  509. end;
  510. procedure TLaTeXWriter.StartSection(SectionName: String);
  511. begin
  512. WriteCommentLine;
  513. WriteComment(SectionName);
  514. Writeln('\section{'+EscapeText(SectionName)+'}');
  515. end;
  516. procedure TLaTeXWriter.StartSubSection(SubSectionName: String);
  517. begin
  518. WriteComment(SubSectionName);
  519. Writeln('\subsection{'+EscapeText(SubSectionName)+'}');
  520. end;
  521. procedure TLaTeXWriter.StartSubSubSection(SubSubSectionName: String);
  522. begin
  523. Writeln('\subsubsection{'+EscapeText(SubSubSectionName)+'}');
  524. end;
  525. procedure CreateLaTeXDocForPackage(APackage: TPasPackage; AEngine: TFPDocEngine);
  526. var
  527. Writer: TLaTeXWriter;
  528. begin
  529. Writer := TLaTeXWriter.Create(APackage, AEngine);
  530. try
  531. Writer.WriteDoc;
  532. finally
  533. Writer.Free;
  534. end;
  535. end;
  536. procedure TLaTeXWriter.StartProcedure;
  537. begin
  538. Writeln('\begin{FPCList}');
  539. InList:=True;
  540. end;
  541. procedure TLaTeXWriter.StartSynopsis;
  542. begin
  543. Writeln('\Synopsis');
  544. end;
  545. procedure TLaTeXWriter.StartDeclaration;
  546. begin
  547. Writeln('\Declaration ');
  548. end;
  549. procedure TLaTeXWriter.StartVisibility;
  550. begin
  551. Writeln('\Visibility');
  552. end;
  553. procedure TLaTeXWriter.StartDescription;
  554. begin
  555. Writeln('\Description');
  556. end;
  557. procedure TLaTeXWriter.StartErrors;
  558. begin
  559. Writeln('\Errors');
  560. end;
  561. procedure TLaTeXWriter.StartVersion;
  562. begin
  563. Writeln('\VersionInfo');
  564. end;
  565. procedure TLaTeXWriter.StartAccess;
  566. begin
  567. Writeln('\Access')
  568. end;
  569. procedure TLaTeXWriter.EndProcedure;
  570. begin
  571. InList:=False;
  572. Writeln('\end{FPCList}');
  573. end;
  574. procedure TLaTeXWriter.StartProperty;
  575. begin
  576. Writeln('\begin{FPCList}');
  577. InList:=True;
  578. end;
  579. procedure TLaTeXWriter.EndProperty;
  580. begin
  581. InList:=False;
  582. Writeln('\end{FPCList}');
  583. end;
  584. procedure TLaTeXWriter.WriteExampleFile(FN: String);
  585. begin
  586. If (FN<>'') then
  587. WritelnF('\FPCexample{%s}', [ChangeFileExt(FN,'')]);
  588. end;
  589. procedure TLaTeXWriter.StartOverview(const What: String; WithAccess: Boolean);
  590. begin
  591. If WithAccess then
  592. begin
  593. WriteLn('\begin{tabularx}{\textwidth}{lllX}');
  594. WriteLnF('%s & %s & %s & %s \\ \hline',[EscapeText(SDocPage), EscapeText(What), EscapeText(SDocAccess), EscapeText(SDocDescription)])
  595. end
  596. else
  597. begin
  598. WriteLn('\begin{tabularx}{\textwidth}{llX}');
  599. WriteLnF('%s & %s & %s \\ \hline',[EscapeText(SDocPage), EscapeText(What), EscapeText(SDocDescription)])
  600. end;
  601. end;
  602. procedure TLaTeXWriter.EndOverview;
  603. begin
  604. WriteLn('\hline');
  605. WriteLn('\end{tabularx}');
  606. end;
  607. procedure TLaTeXWriter.WriteOverviewMember(const ALabel, AName, Access,
  608. ADescr: String);
  609. begin
  610. WriteLnF('\pageref{%s} & %s & %s & %s \\',[ALabel,EscapeText(AName),Access,ADescr]);
  611. end;
  612. procedure TLaTeXWriter.WriteOverviewMember(const ALabel, AName, ADescr: String);
  613. begin
  614. WriteLnF('\pageref{%s} & %s & %s \\',[ALabel,EscapeText(AName),ADescr]);
  615. end;
  616. class function TLaTeXWriter.FileNameExtension: String;
  617. begin
  618. Result:=TexExtension;
  619. end;
  620. procedure TLaTeXWriter.StartSeealso;
  621. begin
  622. If not InList then
  623. begin
  624. Writeln('');
  625. Writeln('\begin{FPCList}');
  626. end;
  627. Writeln('\SeeAlso');
  628. end;
  629. procedure TLaTeXWriter.EndSeealso;
  630. begin
  631. If Not InList then
  632. Writeln('\end{FPCList}');
  633. end;
  634. procedure TLaTeXWriter.StartUnitOverview(AModuleName, AModuleLabel: String);
  635. begin
  636. WriteLnF('\begin{FPCltable}{lr}{%s}{%s:0units}',
  637. [Format(SDocUsedUnitsByUnitXY, [EscapeText(AModuleName)]), StripText(AModuleName)]);
  638. WriteLn('Name & Page \\ \hline');
  639. end;
  640. procedure TLaTeXWriter.WriteUnitEntry(UnitRef: TPasType);
  641. begin
  642. WriteLnF('%s\index{unit!%s} & \pageref{%s} \\',
  643. [EscapeText(UnitRef.Name), EscapeText(UnitRef.Name), StripText(GetLabel(UnitRef))]);
  644. end;
  645. procedure TLaTeXWriter.EndUnitOverview;
  646. begin
  647. WriteLn('\end{FPCltable}');
  648. end;
  649. function TLaTeXWriter.InterPretOption(const Cmd, Arg: String): boolean;
  650. begin
  651. Result:=True;
  652. if (cmd= '--latex-highlight') then
  653. LatexHighLight:=True
  654. else if Cmd = '--latex-extension' then
  655. TexExtension:=Arg
  656. else if Cmd = '--latex--verbatim-length' then
  657. MaxVerbatimLength:=StrToInt(Arg)
  658. else if Cmd = '--image-dir' then
  659. ImageDir:=Arg
  660. else
  661. Result:=False;
  662. end;
  663. initialization
  664. // Do not localize.
  665. RegisterWriter(TLaTeXWriter,'latex','Latex output using fpc.sty class.');
  666. finalization
  667. UnRegisterWriter('latex');
  668. end.