pdftex[869] branches/stable: structure destination support from

commits+karl at tug.org commits+karl at tug.org
Thu Nov 4 22:46:36 CET 2021


Revision: 869
          http://tug.org/svn/pdftex?view=revision&revision=869
Author:   karl
Date:     2021-11-04 22:46:36 +0100 (Thu, 04 Nov 2021)
Log Message:
-----------
structure destination support from Marcel

Modified Paths:
--------------
    branches/stable/doc/manual/ChangeLog
    branches/stable/doc/manual/pdftex-t.tex
    branches/stable/source/src/texk/web2c/pdftexdir/ChangeLog
    branches/stable/source/src/texk/web2c/pdftexdir/NEWS
    branches/stable/source/src/texk/web2c/pdftexdir/pdftex.web

Added Paths:
-----------
    branches/stable/tests/21-structdest/
    branches/stable/tests/21-structdest/Makefile
    branches/stable/tests/21-structdest/test-structdest.tex

Modified: branches/stable/doc/manual/ChangeLog
===================================================================
--- branches/stable/doc/manual/ChangeLog	2021-11-04 17:23:17 UTC (rev 868)
+++ branches/stable/doc/manual/ChangeLog	2021-11-04 21:46:36 UTC (rev 869)
@@ -1,3 +1,14 @@
+2021-11-04  Karl Berry  <karl at freefriends.org>
+
+	* pdftex-t.tex: size GFDL for two pages, since it was spilling over.
+	Let first bodyfont size stand.
+	Rearrange some text for new font size.
+	
+2021-11-04  Marcel Kr\"uger  <tex at 2krueger.de>
+
+	* pdftex-t.tex: document structured destinations.
+	Also bump document font size to 11pt.
+
 2021-09-25  Karl Berry  <karl at freefriends.org>
 
 	* pdftex-t.tex (\pdfstartlink): organize into lists.

Modified: branches/stable/doc/manual/pdftex-t.tex
===================================================================
--- branches/stable/doc/manual/pdftex-t.tex	2021-11-04 17:23:17 UTC (rev 868)
+++ branches/stable/doc/manual/pdftex-t.tex	2021-11-04 21:46:36 UTC (rev 869)
@@ -141,9 +141,6 @@
 \useURL [thanh_truetype_tub] [https://tug.org/TUGboat/tb30-1/tb94thanh.pdf]
 \useURL [jbig2enc]           [https://github.com/agl/jbig2enc]
 
-%D The primitive definitions are specified a bit fuzzy using the next set of
-%D commands. Some day I'll write some proper macros to deal with this.
-
 % keep next 2 lines as temporary kludge for a while to make \type{} of
 % older ConTeXt versions handle these two new primitives; the original
 % problem with \type{} is already solved in ConTeXt as of 2006-02-14.
@@ -152,7 +149,8 @@
 
 \def\Syntax   #1{\strut\kern-.25em{#1}\kern-.25em\relax}
 \def\Next       {\crlf\hbox to 2em{}\nobreak}
-\def\Sugar    #1{\unskip\unskip\unskip\kern.25em{#1}\kern.25em\ignorespaces}
+\def\Sugar    #1{\unskip\unskip\unskip\kern.25em{#1}\kern.25em
+                 \penalty0 \ignorespaces} % allow break
 %
 \def\Lbrace     {\Sugar{\tttf\leftargument}}
 \def\Literal  #1{\Sugar{\type{#1}}}
@@ -346,7 +344,7 @@
   \usetypescript [palatino][\defaultencoding]
 
   \setupbodyfont
-    [palatino,10pt]
+    [palatino,11pt]
 
   \definefontsynonym[TitleFont][SerifBold]
 
@@ -873,15 +871,14 @@
 options can be specified with one or two dashes and unambiguously
 abbreviated.
 
+\begingroup
 \startnotmode[screen]
-  \switchtobodyfont[9pt] % squeeze everything on one page
+  \switchtobodyfont[10pt] % keep line lengths shorter
 \stopnotmode
 
 \typefile{pdftex-help.txt}
 
-\startnotmode[screen]
-  \switchtobodyfont[10pt] % squeeze everything on one page
-\stopnotmode
+\endgroup
 
 %***********************************************************************
 
@@ -1450,14 +1447,19 @@
   \Something{general text}
 }
 
-%HE Check:
 \Syntax{
+\Something{goto-action struct spec} \Means %
+  \Literal{struct} (\Something{numid} \Or \Literal{nameid} \Or \Something{general text})
+}
+
+% keep in sync with redundant copy below.
+\Syntax{
 \Something{goto-action spec} \Means %
-  \Something{numid}
-  \Or \Next \Optional{\Something{file spec}} \Something{nameid}
-  \Or \Next \Optional{\Something{file spec}} \Optional{\Something{page spec}} \Something{general text}
-  \Or \Next \Something{file spec} \Something{nameid} \Something{newwindow spec}
-  \Or \Next \Something{file spec} \Optional{\Something{page spec}} \Something{general text} \Something{newwindow spec}
+  \Optional{\Something{goto-action struct spec}} \Something{numid}
+  \Or \Next \Optional{\Something{file spec}} \Optional{\Something{goto-action struct spec}} \Something{nameid}
+  \Or \Next \Optional{\Something{file spec}} \Optional{\Something{goto-action struct spec}} \Optional{\Something{page spec}} \Something{general text}
+  \Or \Next \Something{file spec} \Optional{\Something{goto-action struct spec}} \Something{nameid} \Something{newwindow spec}
+  \Or \Next \Something{file spec} \Optional{\Something{goto-action struct spec}} \Optional{\Something{page spec}} \Something{general text} \Something{newwindow spec}
 }
 
 \Syntax{
@@ -1508,8 +1510,9 @@
 
 \Syntax{
 \Something{dest spec} \Means %
-  \Something{numid} \Something{dest type}
-  \Or \Something{nameid} \Something{dest type}
+  \Optional{\Literal{struct} \Something{number}} \\
+  (\Something{numid} \Or \Something{nameid})
+  \Something{dest type}
 }
 
 \Syntax{
@@ -3352,7 +3355,11 @@
 for links and bookmark outlines; the link is identified by either
 a number or a symbolic name, and the way the viewer is to display the
 page must be specified in \Something{dest type}\unkern, which must be
-one of those mentioned in \in{table}[appearance].
+one of those mentioned in \in{table}[appearance]. If \Literal{struct}
+\Something{number} is used, a structure destination is created instead of a
+regular destination, referring to the structure element defined in object
+\Something{number}. Structure destinations use a separate namespace and
+therefore may have the same identifiers as a regular destination.
 
 \startbuffer
 \starttabulate[|l|l|]
@@ -3436,11 +3443,11 @@
 
 \Syntax{
 \Something{goto-action spec} \Means %
-  \Something{numid}
-  \Or \Next \Optional{\Something{file spec}} \Something{nameid}
-  \Or \Next \Optional{\Something{file spec}} \Optional{\Something{page spec}} \Something{general text}
-  \Or \Next \Something{file spec} \Something{nameid} \Something{newwindow spec}
-  \Or \Next \Something{file spec} \Optional{\Something{page spec}} \Something{general text} \Something{newwindow spec}
+  \Optional{\Something{goto-action struct spec}} \Something{numid}
+  \Or \Next \Optional{\Something{file spec}} \Optional{\Something{goto-action struct spec}} \Something{nameid}
+  \Or \Next \Optional{\Something{file spec}} \Optional{\Something{goto-action struct spec}} \Optional{\Something{page spec}} \Something{general text}
+  \Or \Next \Something{file spec} \Optional{\Something{goto-action struct spec}} \Something{nameid} \Something{newwindow spec}
+  \Or \Next \Something{file spec} \Optional{\Something{goto-action struct spec}} \Optional{\Something{page spec}} \Something{general text} \Something{newwindow spec}
 }
 
 \startitemize
@@ -3452,6 +3459,9 @@
 destination. In this case, the zoom factor is given by
 \Something{general text}\unkern.
 
+\item The default behavior of the \Something{newwindow
+spec} depends on the browser setting.
+
 \item A destination in another \PDF\ file can be specified with
 \Something{file spec}\unkern, in which case \Something{newwindow spec}
 specifies whether the file should be opened in a new window. A
@@ -3458,8 +3468,15 @@
 \Something{file spec} can be either a \type{(string)} or a
 \type{<<}\type{dictionary}\type{>>}.
 
-\item The default behavior of the \Something{newwindow
-spec} depends on the browser setting.
+\item If a \Something{goto-action spec} contains a
+\Something{goto-action struct spec}, then a structure destination is
+referenced in addition to the regular destination. The form with
+\Something{general text} is used if and only if a \Something{file spec}
+is present; then the \Something{general text} should expand to a literal
+\PDF\ dictionary describing a structure destination. Otherwise, the
+\Something{numid} or \Something{nameid} directly after the
+\Literal{struct} keyword identify a destination which must have been
+created with \type{\pdfdest} \Literal{struct}\unskip.
 
 \stopitemize
 
@@ -4881,8 +4898,8 @@
 \startframedtext
 \starttyping
 % Thomas Esser, 1998. public domain.
-% This is used for pdftex and pdfetex, which are now identical: both
-% with e-TeX extensions, both with pdf output.
+% This is used for pdftex and pdfetex, which are now identical:
+% both with e-TeX extensions, both with pdf (and dvi) output.
 \input pdftexconfig.tex
 \input etex.src
 \input pdftexmagfix.tex
@@ -5115,9 +5132,6 @@
 \type{-}\type{-pages=odd} and \type{-}\type{-pages=even} options
 (which might require some disciplined shuffling of sheet).
 
-This also demonstrates that \PDFTEX\ can be used for page imposition
-purposes (given that \PDFTEX\ and the fonts are set up properly).
-
 %***********************************************************************
 
 \page
@@ -5132,7 +5146,7 @@
 \section{GNU Free Documentation License}
 
 \startnotmode[screen]
-    \switchtobodyfont[4.6pt] % squeeze everything on one page :-}
+    \switchtobodyfont[6.4pt] % squeeze everything onto two pages}
     \setuplayout[grid=yes]
     \setupcolumns[n=7]
 \stopnotmode

Modified: branches/stable/source/src/texk/web2c/pdftexdir/ChangeLog
===================================================================
--- branches/stable/source/src/texk/web2c/pdftexdir/ChangeLog	2021-11-04 17:23:17 UTC (rev 868)
+++ branches/stable/source/src/texk/web2c/pdftexdir/ChangeLog	2021-11-04 21:46:36 UTC (rev 869)
@@ -1,3 +1,7 @@
+2021-11-04  Marcel Kr\"uger  <tex at 2krueger.de>
+
+	* pdftex.web: Implement support for PDF 2.0 structure destinations.
+
 2021-09-25  Karl Berry  <karl at freefriends.org>
 
 	* pdftex.web: always call pdf_warning with prepend_nl true,

Modified: branches/stable/source/src/texk/web2c/pdftexdir/NEWS
===================================================================
--- branches/stable/source/src/texk/web2c/pdftexdir/NEWS	2021-11-04 17:23:17 UTC (rev 868)
+++ branches/stable/source/src/texk/web2c/pdftexdir/NEWS	2021-11-04 21:46:36 UTC (rev 869)
@@ -1,3 +1,6 @@
+- changes:
+  - support structured destinations from PDF 2.0.
+
 pdfTeX 3.141592653-2.6-1.40.23 (TeX Live 2021 post-release) (June 28, 2021)
 - changes:
   - for letterspaced fonts, use explicit \fontdimen6 if specified.

Modified: branches/stable/source/src/texk/web2c/pdftexdir/pdftex.web
===================================================================
--- branches/stable/source/src/texk/web2c/pdftexdir/pdftex.web	2021-11-04 17:23:17 UTC (rev 868)
+++ branches/stable/source/src/texk/web2c/pdftexdir/pdftex.web	2021-11-04 21:46:36 UTC (rev 869)
@@ -16437,10 +16437,11 @@
 @d obj_type_font                == 3 {index of linked list of Fonts objects}
 @d obj_type_outline             == 4 {index of linked list of outline objects}
 @d obj_type_dest                == 5 {index of linked list of destination objects}
- at d obj_type_obj                 == 6 {index of linked list of raw objects}
- at d obj_type_xform               == 7 {index of linked list of XObject forms}
- at d obj_type_ximage              == 8 {index of linked list of XObject image}
- at d obj_type_thread              == 9 {index of linked list of num article threads}
+ at d obj_type_struct_dest         == 6 {index of linked list of structure destination objects}
+ at d obj_type_obj                 == 7 {index of linked list of raw objects}
+ at d obj_type_xform               == 8 {index of linked list of XObject forms}
+ at d obj_type_ximage              == 9 {index of linked list of XObject image}
+ at d obj_type_thread              == 10 {index of linked list of num article threads}
 @d head_tab_max                 == obj_type_thread {max index of |head_tab|}
 
 @# {max number of kids for balanced trees}
@@ -16558,7 +16559,7 @@
 @d pdf_action_user         == 3 {user-defined action}
 
 @# {data structure of actions}
- at d pdf_action_size         == 3 {size of action structure in |mem|}
+ at d pdf_action_size         == 4 {size of action structure in |mem|}
 @d pdf_action_type         == type {action type}
 @d pdf_action_named_id     == subtype {identifier is type of name}
 @d pdf_action_id           == link {destination/thread name identifier}
@@ -16567,6 +16568,7 @@
 @d pdf_action_page_tokens(#) == info(# + 2) {specification of GoTo page action}
 @d pdf_action_user_tokens(#) == info(# + 2) {user-defined action string}
 @d pdf_action_refcount(#)  == link(# + 2) {counter of references to this action}
+ at d pdf_action_struct_id(#) == link(# + 3) {structure destination identifier}
 
 @# {data structure of outlines; it's not able to write out outline entries
 before all outline entries are defined, so memory allocated for outline
@@ -16597,7 +16599,7 @@
 @d pdf_dest_fitbv           == 6
 @d pdf_dest_fitr            == 7
 
-@# {data structure of destinations}
+@# {data structure of structure and regular destinations}
 @d obj_dest_ptr             == obj_aux {pointer to |pdf_dest_node|}
 @d pdf_dest_node_size       == 7 {size of whatsit node for destination;
 words |1..4| hold dest dimensions, word |6| identifier type, subtype
@@ -19518,13 +19520,18 @@
                 "destination has been already written (this shouldn't happen)")
         else begin
             i := obj_dest_ptr(info(k));
-            if pdf_dest_named_id(i) > 0 then begin
+            if (pdf_dest_named_id(i) > 0) and (pdf_dest_objnum(i) = null) then begin
                 pdf_begin_dict(info(k), 1);
                 pdf_print("/D ");
             end
             else
                 pdf_begin_obj(info(k), 1);
-            pdf_out("["); pdf_print_int(pdf_last_page); pdf_print(" 0 R ");
+            pdf_out("[");
+            if pdf_dest_objnum(i) = null then
+              pdf_print_int(pdf_last_page)
+            else
+              pdf_print_int(pdf_dest_objnum(i));
+            pdf_print(" 0 R ");
             case pdf_dest_type(i) of
             pdf_dest_xyz: begin
                 pdf_print("/XYZ ");
@@ -19565,7 +19572,7 @@
             othercases pdf_error("ext5", "unknown dest type");
             endcases;
             pdf_print_ln("]");
-            if pdf_dest_named_id(i) > 0 then
+            if (pdf_dest_named_id(i) > 0) and (pdf_dest_objnum(i) = null) then
                 pdf_end_dict
             else
                 pdf_end_obj;
@@ -19838,6 +19845,7 @@
         @<Check for non-existing pages@>;
         @<Reverse the linked list of Page and Pages objects@>;
         @<Check for non-existing destinations@>;
+        @<Check for non-existing structure destinations@>;
         @<Output fonts definition@>;
         @<Output pages tree@>;
         @<Output outlines@>;
@@ -19902,6 +19910,39 @@
     k := obj_link(k);
 end
 
+@ The same for structure destinations, except that there is no sensible default
+object to point to.
+
+ at p procedure pdf_fix_struct_dest(k: integer);
+begin
+    if obj_dest_ptr(k) <> null then
+        return;
+    pdf_warning("structure dest", "", false, false);
+    if obj_info(k) < 0 then begin
+        print("name{");
+        print(-obj_info(k));
+        print("}");
+    end
+    else begin
+        print("num");
+        print_int(obj_info(k));
+    end;
+    print(" has been referenced but does not exist");
+    print_ln; print_ln;
+    {pdf_begin_obj(k, 1);
+    pdf_out("[");
+    pdf_print_int(head_tab[obj_type_page]);
+    pdf_print_ln(" 0 R /Fit]");
+    pdf_end_obj;}
+end;
+
+@ @<Check for non-existing structure destinations@>=
+k := head_tab[obj_type_struct_dest];
+while k <> 0 do begin
+    pdf_fix_struct_dest(k);
+    k := obj_link(k);
+end
+
 @ @<Check for non-existing pages@>=
 k := head_tab[obj_type_page];
 while obj_aux(k) = 0 do begin
@@ -33931,8 +33972,10 @@
                 delete_token_ref(pdf_action_file(#));
             if pdf_action_type(#) = pdf_action_page then
                 delete_token_ref(pdf_action_page_tokens(#))
-            else if pdf_action_named_id(#) > 0 then
+            else if (pdf_action_named_id(#) and 1) = 1 then
                 delete_token_ref(pdf_action_id(#));
+            if (pdf_action_named_id(#) and 2) = 2 then
+                delete_token_ref(pdf_action_struct_id(#));
         end;
         free_node(#, pdf_action_size);
     end
@@ -34528,7 +34571,7 @@
         else
             pdf_create_obj(t, i);
         r := obj_ptr;
-        if t = obj_type_dest then
+        if (t = obj_type_dest) or (t = obj_type_struct_dest) then
             obj_dest_ptr(r) := null;
     end;
     if s <> 0 then
@@ -34570,10 +34613,35 @@
         pdf_action_user_tokens(p) := def_ref;
         return;
     end;
+    pdf_action_named_id(p) := 0;
     if scan_keyword("file") then begin
         scan_pdf_ext_toks;
         pdf_action_file(p) := def_ref;
     end;
+    if scan_keyword("struct") then begin
+        if pdf_action_type(p) <> pdf_action_goto then
+            pdf_error("ext1", "only GoTo action can be used with `struct'");
+        if pdf_action_file(p) <> null then begin
+            scan_pdf_ext_toks;
+            pdf_action_named_id(p) := pdf_action_named_id(p) + 2;
+            pdf_action_struct_id(p) := def_ref;
+        end
+        else if scan_keyword("name") then begin
+            scan_pdf_ext_toks;
+            pdf_action_named_id(p) := pdf_action_named_id(p) + 2;
+            pdf_action_struct_id(p) := def_ref;
+        end
+        else if scan_keyword("num") then begin
+            scan_int;
+            if cur_val <= 0 then
+                pdf_error("ext1", "num identifier must be positive");
+            pdf_action_struct_id(p) := cur_val;
+        end
+        else
+            pdf_error("ext1", "identifier type missing");
+    end
+    else
+        pdf_action_struct_id(p) := null;
     if scan_keyword("page") then begin
         if pdf_action_type(p) <> pdf_action_goto then
             pdf_error("ext1", "only GoTo action can be used with `page'");
@@ -34582,13 +34650,12 @@
         if cur_val <= 0 then
             pdf_error("ext1", "page number must be positive");
         pdf_action_id(p) := cur_val;
-        pdf_action_named_id(p) := 0;
         scan_pdf_ext_toks;
         pdf_action_page_tokens(p) := def_ref;
     end
     else if scan_keyword("name") then begin
         scan_pdf_ext_toks;
-        pdf_action_named_id(p) := 1;
+        pdf_action_named_id(p) := pdf_action_named_id(p) + 1;
         pdf_action_id(p) := def_ref;
     end
     else if scan_keyword("num") then begin
@@ -34599,7 +34666,6 @@
         scan_int;
         if cur_val <= 0 then
             pdf_error("ext1", "num identifier must be positive");
-        pdf_action_named_id(p) := 0;
         pdf_action_id(p) := cur_val;
     end
     else
@@ -34819,6 +34885,16 @@
     check_pdfoutput("\pdfdest", true);
     q := tail;
     new_whatsit(pdf_dest_node, pdf_dest_node_size);
+    if scan_keyword("struct") then begin
+        scan_int;
+        if cur_val <= 0 then
+            pdf_error("ext1", "struct identifier must be positive");
+        pdf_dest_objnum(tail) := cur_val;
+        j := obj_type_struct_dest;
+    end else begin
+        pdf_dest_objnum(tail) := null;
+        j := obj_type_dest;
+    end;
     if scan_keyword("num") then begin
         scan_int;
         if cur_val <= 0 then
@@ -34871,11 +34947,11 @@
     end;
     if pdf_dest_named_id(tail) <> 0 then begin
         i := tokens_to_string(pdf_dest_id(tail));
-        k := find_obj(obj_type_dest, i, true);
+        k := find_obj(j, i, true);
         flush_str(i);
     end
     else
-        k := find_obj(obj_type_dest, pdf_dest_id(tail), false);
+        k := find_obj(j, pdf_dest_id(tail), false);
     if (k <> 0) and (obj_dest_ptr(k) <> null) then begin
         warn_dest_dup(pdf_dest_id(tail), pdf_dest_named_id(tail),
                       "ext4", "has been already used, duplicate ignored");
@@ -35410,7 +35486,7 @@
         end;
         case pdf_action_type(pdf_link_action(p)) of
         pdf_action_goto: begin
-            if pdf_action_named_id(pdf_link_action(p)) > 0 then begin
+            if (pdf_action_named_id(pdf_link_action(p)) mod 2) = 1 then begin
                 print(" goto name");
                 print_mark(pdf_action_id(pdf_link_action(p)));
             end
@@ -35425,7 +35501,7 @@
             print_mark(pdf_action_page_tokens(pdf_link_action(p)));
         end;
         pdf_action_thread: begin
-            if pdf_action_named_id(pdf_link_action(p)) > 0 then begin
+            if (pdf_action_named_id(pdf_link_action(p)) mod 2) = 1 then begin
                 print(" thread name");
                 print_mark(pdf_action_id(pdf_link_action(p)));
             end
@@ -36102,11 +36178,11 @@
         if pdf_action_file(p) = null then begin
             pdf_print("/S /GoTo ");
             d := get_obj(obj_type_dest, pdf_action_id(p),
-                         pdf_action_named_id(p));
+                         pdf_action_named_id(p) mod 2);
         end
         else
             pdf_print("/S /GoToR ");
-        if pdf_action_named_id(p) > 0 then begin
+        if (pdf_action_named_id(p) mod 2) = 1 then begin
             pdf_str_entry("D", tokens_to_string(pdf_action_id(p)));
             flush_str(last_tokens_string);
         end
@@ -36119,8 +36195,8 @@
         pdf_print("/S /Thread ");
         if pdf_action_file(p) = null then
             d := get_obj(obj_type_thread, pdf_action_id(p),
-                         pdf_action_named_id(p));
-        if pdf_action_named_id(p) > 0 then begin
+                         pdf_action_named_id(p) mod 2);
+        if (pdf_action_named_id(p) mod 2) = 1 then begin
             pdf_str_entry("D", tokens_to_string(pdf_action_id(p)));
             flush_str(last_tokens_string);
         end
@@ -36130,6 +36206,18 @@
             pdf_int_entry("D", pdf_action_id(p));
     end;
     endcases;
+    if pdf_action_struct_id(p) <> null then begin
+        pdf_out(" ");
+        if pdf_action_file(p) = null then
+            pdf_indirect("SD", get_obj(obj_type_struct_dest,
+                                       pdf_action_struct_id(p),
+                                       (pdf_action_named_id(p) div 2) mod 2))
+        else begin
+            pdf_print("/SD ");
+            pdf_print(tokens_to_string(pdf_action_struct_id(p)));
+            flush_str(last_tokens_string);
+        end;
+    end;
     pdf_print_ln(" >>");
 end;
 
@@ -36410,7 +36498,10 @@
         pdf_error("ext4", "destinations cannot be inside an XForm");
     if doing_leaders then
         return;
-    k := get_obj(obj_type_dest, pdf_dest_id(p), pdf_dest_named_id(p));
+    if pdf_dest_objnum(p) = null then
+        k := get_obj(obj_type_dest, pdf_dest_id(p), pdf_dest_named_id(p))
+    else
+        k := get_obj(obj_type_struct_dest, pdf_dest_id(p), pdf_dest_named_id(p));
     if obj_dest_ptr(k) <> null then begin
         warn_dest_dup(pdf_dest_id(p), pdf_dest_named_id(p),
                       "ext4", "has been already used, duplicate ignored");

Index: branches/stable/tests/21-structdest
===================================================================
--- branches/stable/tests/21-structdest	2021-11-04 17:23:17 UTC (rev 868)
+++ branches/stable/tests/21-structdest	2021-11-04 21:46:36 UTC (rev 869)

Property changes on: branches/stable/tests/21-structdest
___________________________________________________________________
Added: svn:ignore
## -0,0 +1 ##
+test-structdest.pdf
Added: branches/stable/tests/21-structdest/Makefile
===================================================================
--- branches/stable/tests/21-structdest/Makefile	                        (rev 0)
+++ branches/stable/tests/21-structdest/Makefile	2021-11-04 21:46:36 UTC (rev 869)
@@ -0,0 +1,13 @@
+# $Id$
+# Public domain.
+# Test structure destinations.
+
+include ../Common.mak
+
+default: test-struct
+
+test-struct: test-structdest.tex
+	$(prog) $<
+
+clean:
+	$(clean)


Property changes on: branches/stable/tests/21-structdest/Makefile
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:keywords
## -0,0 +1 ##
+Date Author Id Revision
\ No newline at end of property
Added: branches/stable/tests/21-structdest/test-structdest.tex
===================================================================
--- branches/stable/tests/21-structdest/test-structdest.tex	                        (rev 0)
+++ branches/stable/tests/21-structdest/test-structdest.tex	2021-11-04 21:46:36 UTC (rev 869)
@@ -0,0 +1,39 @@
+% $Id$
+% Public domain. Originally by Marcel Kr\"uger, 2021.
+% Make some structured destinations with various syntax combinations.
+% Output is just checked by hand.
+
+\pdfcompresslevel=0 \pdfobjcompresslevel=0
+\pdfoutput=1
+\catcode`\{=1 \catcode`\}=2
+\output={\global\advance\count0 by 1 \shipout\box255 }
+
+\def\eject{\par\penalty-10000 }
+\def\space{ }
+
+\pdfdest num 42 fit
+% Assuming that 12345 0 R is a valid reference to the non-existing
+% structure element at this location...
+\pdfdest struct 12345 num 42 fit 
+Hello
+
+\hfill\eject
+\pdfdest name {earth} fit
+\pdfdest struct 1337 name {earth} fit 
+World
+
+\vfill\eject
+\noindent
+\pdfstartlink goto struct num 42 num 42 First\pdfendlink
+\space
+\pdfstartlink goto struct name {earth} num 42 Combination 1\pdfendlink
+\space
+\pdfstartlink goto struct num 42 name {earth} Combination 1\pdfendlink
+\space
+\pdfstartlink goto struct name {earth} name {earth} Second\pdfendlink
+\space
+\pdfstartlink goto struct name {i_dont_exists} name {me neither} Third\pdfendlink
+\space
+\pdfstartlink goto file {f.pdf} struct {[(external_element_id) /Fit]}
+                   name {marcel} Forth\pdfendlink
+\end


Property changes on: branches/stable/tests/21-structdest/test-structdest.tex
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:keywords
## -0,0 +1 ##
+Date Author Id Revision
\ No newline at end of property


More information about the pdftex-commits mailing list.