dw_latex.pp 19 KB

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