dw_latex.pp 19 KB

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