dw_latex.pp 19 KB

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