Scaffolding for dot leaders in TOC

This commit is contained in:
John Whitington 2024-12-02 18:39:29 +00:00
parent d6c25a0969
commit 71adabd103
3 changed files with 18 additions and 7 deletions

View File

@ -571,7 +571,8 @@ type args =
mutable rast_jpeg_quality : int; mutable rast_jpeg_quality : int;
mutable rast_downsample : bool; mutable rast_downsample : bool;
mutable replace_stream_with : string; mutable replace_stream_with : string;
mutable output_unit : Pdfunits.t} mutable output_unit : Pdfunits.t;
mutable dot_leader : bool}
let args = let args =
{op = None; {op = None;
@ -720,7 +721,8 @@ let args =
rast_jpeg_quality = 75; rast_jpeg_quality = 75;
rast_downsample = false; rast_downsample = false;
replace_stream_with = ""; replace_stream_with = "";
output_unit = Pdfunits.PdfPoint} output_unit = Pdfunits.PdfPoint;
dot_leader = false}
(* Do not reset original_filename or cpdflin or was_encrypted or (* Do not reset original_filename or cpdflin or was_encrypted or
was_decrypted_with_owner or recrypt or producer or creator or path_to_* or was_decrypted_with_owner or recrypt or producer or creator or path_to_* or
@ -855,7 +857,8 @@ let reset_arguments () =
args.rast_jpeg_quality <- 75; args.rast_jpeg_quality <- 75;
args.rast_downsample <- false; args.rast_downsample <- false;
args.replace_stream_with <- ""; args.replace_stream_with <- "";
args.output_unit <- Pdfunits.PdfPoint args.output_unit <- Pdfunits.PdfPoint;
args.dot_leader <- false
(* Prefer a) the one given with -cpdflin b) a local cpdflin, c) otherwise assume (* Prefer a) the one given with -cpdflin b) a local cpdflin, c) otherwise assume
installed at a system place *) installed at a system place *)
@ -2919,6 +2922,9 @@ let specs =
("-toc-no-bookmark", ("-toc-no-bookmark",
Arg.Unit settocnobookmark, Arg.Unit settocnobookmark,
" Don't add the table of contents to the bookmarks"); " Don't add the table of contents to the bookmarks");
("-toc-dot-leader",
Arg.Unit (fun () -> args.dot_leader <- true),
" Add a dot leader to TOC entries");
("-typeset", ("-typeset",
Arg.String settypeset, Arg.String settypeset,
" Typeset a text file as a PDF"); " Typeset a text file as a PDF");
@ -4802,7 +4808,7 @@ let go () =
let cpdffont = embed_font () in let cpdffont = embed_font () in
let pdf = let pdf =
Cpdftoc.typeset_table_of_contents Cpdftoc.typeset_table_of_contents
~font:cpdffont ~fontsize:args.fontsize ~title:args.toc_title ~bookmark:args.toc_bookmark pdf ~font:cpdffont ~fontsize:args.fontsize ~title:args.toc_title ~bookmark:args.toc_bookmark ~dotleader:args.dot_leader pdf
in in
write_pdf false pdf write_pdf false pdf
| Some (Typeset filename) -> | Some (Typeset filename) ->

View File

@ -94,11 +94,16 @@ let used pdf fastrefnums labels title marks =
marks; marks;
codepoints codepoints
(* Fill the space with a small space, maybe some dots, then maybe a final tiny space *)
(* TODO Test to make sure a title shortened with dots does not gain any leader dots through this mechanism *)
let make_dots space =
[Cpdftype.HGlue space]
(* Typeset a table of contents with given font, font size and title. Mediabox (* Typeset a table of contents with given font, font size and title. Mediabox
(and CropBox) copied from first page of existing PDF. Margin of 10% inside (and CropBox) copied from first page of existing PDF. Margin of 10% inside
CropBox. Font size of title twice body font size. Null page labels added for CropBox. Font size of title twice body font size. Null page labels added for
TOC, others bumped up and so preserved. *) TOC, others bumped up and so preserved. *)
let typeset_table_of_contents ~font ~fontsize ~title ~bookmark pdf = let typeset_table_of_contents ~font ~fontsize ~title ~bookmark ~dotleader pdf =
Hashtbl.clear width_table_cache; Hashtbl.clear width_table_cache;
let marks = Pdfmarks.read_bookmarks pdf in let marks = Pdfmarks.read_bookmarks pdf in
if marks = [] then (Pdfe.log "No bookmarks, not making table of contents\n"; pdf) else if marks = [] then (Pdfe.log "No bookmarks, not making table of contents\n"; pdf) else
@ -150,7 +155,7 @@ let typeset_table_of_contents ~font ~fontsize ~title ~bookmark pdf =
[Cpdftype.BeginDest mark.Pdfmarks.target; [Cpdftype.BeginDest mark.Pdfmarks.target;
Cpdftype.HGlue indent] Cpdftype.HGlue indent]
@ textruns @ @ textruns @
[Cpdftype.HGlue space] (if dotleader then make_dots space else [Cpdftype.HGlue space])
@ labelruns @ @ labelruns @
[Cpdftype.EndDest; [Cpdftype.EndDest;
Cpdftype.NewLine]) Cpdftype.NewLine])

View File

@ -1,4 +1,4 @@
(** Table of contents *) (** Table of contents *)
(** Typeset a table of contents and prepend to the document. *) (** Typeset a table of contents and prepend to the document. *)
val typeset_table_of_contents : font:Cpdfembed.cpdffont -> fontsize:float -> title:string -> bookmark:bool -> Pdf.t -> Pdf.t val typeset_table_of_contents : font:Cpdfembed.cpdffont -> fontsize:float -> title:string -> bookmark:bool -> dotleader:bool -> Pdf.t -> Pdf.t