Figure out cell styling details.
[pspp] / spv-file-format.texi
index 192c1c3ea1384534518ece495cbbb3536463cf56..09e620e9ae31edba4eeb2066ab6dc8bcaddc7687 100644 (file)
@@ -572,7 +572,7 @@ concatenated together, terminated by a byte 01:
 LightMember @result{}
     Header Title
     Caption Footnotes
-    Fonts Formats Borders PrintSettings TableSettings
+    Fonts Borders PrintSettings TableSettings Formats
     Dimensions Data
     01
 @end format
@@ -583,7 +583,7 @@ The following sections go into more detail.
 @menu
 * SPV Light Member Header::
 * SPV Light Member Title::
-* PSV Light Member Caption::
+* SPV Light Member Caption::
 * SPV Light Member Footnotes::
 * SPV Light Member Fonts::
 * SPV Light Member Borders::
@@ -609,7 +609,7 @@ Header @result{}
     (i1 @math{|} i3)[@t{version}]
     01 bool*4 int
     int[@t{min-column-width}] int[@t{max-column-width}]
-    int[@t{min-row-height}] int[@t{max-row-height}]
+    int[@t{min-row-width}] int[@t{max-row-width}]
     int64[@t{table-id}]
 @end format
 @end cartouche
@@ -624,6 +624,13 @@ the structure member that refers to the detail member.  For example,
 if @code{tableId} is @code{-4122591256483201023}, then @code{table-id}
 would be 0xc6c99d183b300001.
 
+@code{min-column-width} is the minimum width that a column will be
+assigned automatically.  @code{max-column-width} is the maximum width
+that a column will be assigned to accommodate a long column label.
+@code{min-row-width} and @code{max-row-width} are a similar range for
+the width of row labels.  All of these measurements are in 1/96 inch
+units.
+
 The meaning of the other variable parts of the header is not known.
 
 @node SPV Light Member Title
@@ -648,7 +655,7 @@ appropriate for presentation, and localized to the user's language,
 well formatted.  For example, for a frequency table, @code{title1} and
 @code{title2} name the variable and @code{c} is simply ``Frequencies''.
 
-@node PSV Light Member Caption
+@node SPV Light Member Caption
 @subsection Caption
 
 @cartouche
@@ -727,6 +734,9 @@ background color, respectively.  In the corpus, these are always
 should be the same color.  When @code{alternate} is 01, @code{altfg}
 and @code{altbg} specify the colors for the alternate rows.
 
+@code{left-margin}, @code{right-margin}, @code{top-margin}, and
+@code{bottom-margin} are measured in multiples of 1/96 inch.
+
 @node SPV Light Member Borders
 @subsection Borders
 
@@ -753,8 +763,8 @@ endianness.
 @code{show-grid-lines} is 1 to draw grid lines, otherwise 0.
 
 Each Border describes one kind of border.  @code{n-borders} seems to
-always be 19.  Each @code{border-type} appears once in order, and they
-correspond to the following borders:
+always be 19.  Each @code{border-type} appears once (although in an
+unpredictable order) and correspond to the following borders:
 
 @table @asis
 @item 0
@@ -803,7 +813,7 @@ opaque color, therefore opaque black is 0xff000000.
 @format
 PrintSettings @result{}
     b1[@t{endian}]
-    bool[@t{layers}]
+    bool[@t{all-layers}]
     bool[@t{paginate-layers}]
     bool[@t{fit-width}]
     bool[@t{fit-length}]
@@ -817,11 +827,12 @@ PrintSettings @result{}
 The PrintSettings reflect settings for printing.  The fixed value of
 @code{endian} can be used to validate the endianness.
 
-@code{layers} is 1 to print all layers, 0 to print only the visible
-layers.
+@code{all-layers} is 1 to print all layers, 0 to print only the
+visible layers.
 
 @code{paginate-layers} is 1 to print each layer at the start of a new
-page, 0 otherwise.
+page, 0 otherwise.  (This setting is honored only @code{all-layers} is
+1, since otherwise only one layer is printed.)
 
 @code{fit-width} and @code{fit-length} control whether the table is
 shrunk to fit within a page's width or length, respectively.
@@ -850,7 +861,7 @@ TableSettings @result{}
     v3(
       byte
       be32[@t{n}] byte*[@t{n}]
-      bestring
+      bestring[@t{notes}]
       bestring[@t{table-look}]
       00...
     )
@@ -875,6 +886,10 @@ shown as numbers starting from 1.
 When @code{footnote-marker-position} is 1, footnote markers are shown
 as superscripts, otherwise as subscripts.
 
+@code{notes} is a text string that contains user-specified notes.  It
+is displayed when the user hovers the cursor over the table, like
+``alt text'' on a webpage.  It is not printed.  It is usually empty.
+
 @code{table-look} is the name of a SPSS ``TableLook'' table style,
 such as ``Default'' or ``Academic''; it is often empty.
 
@@ -886,32 +901,35 @@ TableSettings ends with an arbitrary number of null bytes.
 @cartouche
 @format
 Formats @result{}
-    int[@t{n4}] int*[@t{n4}]
+    int[@t{nwidths}] int*[@t{nwidths}]
     string[@t{encoding}]
-    (i0 @math{|} i-1) (00 @math{|} 01) 00 (00 @math{|} 01)
-    int
+    int (00 @math{|} 01) 00 (00 @math{|} 01)
+    int[@t{epoch}]
     byte[@t{decimal}] byte[@t{grouping}]
-    int[@t{n-ccs}] string*[@t{n-ccs}]
+    CustomCurrency
     v1(i0)
     v3(count(count(X5) count(X6)))
 
+CustomCurrency @result{} int[@t{n-ccs}] string*[@t{n-ccs}]
+
 X5 @result{} byte*33 int[@t{n}] int*[@t{n}]
 X6 @result{}
     01 00 (03 @math{|} 04) 00 00 00
     string[@t{command}] string[@t{subcommand}]
     string[@t{language}] string[@t{charset}] string[@t{locale}]
-    (00 @math{|} 01) 00 (00 @math{|} 01) (00 @math{|} 01)
+    (00 @math{|} 01) 00 bool bool
     int[@t{epoch}]
     byte[@t{decimal}] byte[@t{grouping}]
-    byte*8 01
-    (string[@t{dataset}] string[@t{data file}] i0 int i0)?
-    int[@t{n-ccs}] string*[@t{n-ccs}]
-    2e (00 @math{|} 01) (i2000000 i0)?
+    double[@t{small}] 01
+    (string[@t{dataset}] string[@t{datafile}] i0 int[@t{date}] i0)?
+    CustomCurrency
+    byte[@t{missing}] bool (i2000000 i0)?
 @end format
 @end cartouche
 
-Observed values of @code{n4} vary from 0 to 17.  Out of 7,060 examples
-in the corpus, it is nonzero only 36 times.
+If @code{nwidths} is nonzero, then the accompanying integers are
+column widths as manually adjusted by the user.  (Row heights are
+computed automatically based on the widths.)
 
 @code{encoding} is a character encoding, usually a Windows code page
 such as @code{en_US.windows-1252} or @code{it_IT.windows-1252}.  The
@@ -921,7 +939,7 @@ encoding string is itself encoded in US-ASCII.
 @code{epoch} is the year that starts the epoch.  A 2-digit year is
 interpreted as belonging to the 100 years beginning at the epoch.  The
 default epoch year is 69 years prior to the current year; thus, in
-2017 this field by default contains 1948.  In the corpus, @t{epoch}
+2017 this field by default contains 1948.  In the corpus, @code{epoch}
 ranges from 1943 to 1948, plus some contain -1.
 
 @code{decimal} is the decimal point character.  The observed values
@@ -932,6 +950,22 @@ are @samp{.} and @samp{,}.
 @samp{'} (apostrophe), @samp{ } (space), and zero (presumably
 indicating that digits should not be grouped).
 
+@code{dataset} is the name of the dataset analyzed to produce the
+output, e.g.@: @code{DataSet1}, and @code{datafile} the name of the
+file it was read from, e.g.@: @file{C:\Users\foo\bar.sav}.  The latter
+is sometimes the empty string.
+
+@code{date} is a date, as seconds since the epoch, i.e.@: since
+January 1, 1970.  Pivot tables within an SPV files often have dates a
+few minutes apart, so this is probably a creation date for the tables
+rather than for the file.
+
+Sometimes @code{dataset}, @code{datafile}, and @code{date} are present
+and other times they are absent.  The reader can distinguish by
+assuming that they are present and then checking whether the
+presumptive @code{dataset} contains a null byte (a valid string never
+will).
+
 @code{n-ccs} is observed as either 0 or 5.  When it is 5, the
 following strings are CCA through CCE format strings.  @xref{Custom
 Currency Formats,,, pspp, PSPP}.  Most commonly these are all
@@ -1230,10 +1264,23 @@ ValueMod @result{}
     v3(count(FormatString Style ValueModUnknown))
   @math{|} 31 int[@t{n-refs}] int16*[@t{n-refs}] Format
   @math{|} 58
-Style @result{} 58 @math{|} 31 01? 00? 00? 00? 01 string[@t{fgcolor}] string[@t{bgcolor}] string[@t{typeface}] byte
+
+Style @result{}
+    58
+  @math{|} 31
+    bool[@t{bold}] bool[@t{italic}] bool[@t{underline}] bool
+    string[@t{fgcolor}] string[@t{bgcolor}]
+    string[@t{typeface}] byte[@t{size}]
+
 Format @result{} 00 00 count(FormatString Style 58)
+
 FormatString @result{} count((i0 (58 @math{|} 31 string))?)
-ValueModUnknown @result{} 58 @math{|} 31 i0 i0 i0 i0 01 00 (01 @math{|} 02 @math{|} 08) 00 08 00 0a 00)
+
+ValueModUnknown @result{}
+    58
+  @math{|} 31 int[@t{halign}] int[@t{valign}] double[@t{offset}]
+    int16[@t{left-margin}] int16[@t{right-margin}]
+    int16[@t{top-margin}] int16[@t{bottom-margin}]
 @end format
 @end cartouche
 
@@ -1254,6 +1301,18 @@ version of the localized format string in the Value in which the
 Format is nested.
 
 The Style, if present, changes the style for this individual Value.
+The @code{size} is a font size in units of 1/96 inch.
+
+@code{halign} is 0 for center, 2 for left, 4 for right, 6 for decimal,
+0xffffffad for mixed.  For decimal alignment, @code{offset} is the
+decimal point's offset from the right side of the cell, in units of
+1/72 inch.
+
+@code{valign} specifies vertical alignment: 0 for center, 1 for top, 3
+for bottom.
+
+@code{left-margin}, @code{right-margin}, @code{top-margin}, and
+@code{bottom-margin} are in units of 1/72 inch.
 
 @node SPV Legacy Detail Member Binary Format
 @section Legacy Detail Member Binary Format