Specify dimension list at beginning of data.
[pspp] / spv-file-format.texi
index f6f8bb27dd116771c1df96cad66f7499867d60d6..bb615a2384333bd3fd4166b21a38f04dceffeefd 100644 (file)
@@ -517,18 +517,57 @@ for the first dimension, 1 for the second, and so on.  The latter is
 the case 98% of the time in the corpus.
 
 @example
-category := value[name]
-            01? 00? 00? 00?
-            (01 (i0 | i1 | i2) | i2)
-            int[index] int[n-subcategories] category*[n-subcategories]
+category := value[name] (terminal | group)
+terminal-category := 00 00 00 i2 int[index] i0
 @end example
 
+@code{name} is the name of the category (or group).
+
 @code{category} can represent a terminal category.  In that case,
-@code{name} is the name of the category, @code{index} is a nonnegative
-integer less than @code{n-categories} in the @code{dimension} in which
-the @code{category} is nested (directly or indirectly), and
-@code{n-subcategories} is 0.
-
-Alternatively, @code{category} can represent a group of nested
-categories.  In that case, @code{name} is the name of the group,
-@code{index} is -1, and @code{n-subcategories} is positive.
+@code{index} is a nonnegative integer less than @code{n-categories} in
+the @code{dimension} in which the @code{category} is nested (directly
+or indirectly).
+
+Alternatively, @code{category} can represent a @code{group} of nested
+categories:
+
+@example
+group := (00 | 01)[merge] 00 01 (i0 | i2)[data]
+         i-1 int[n-subcategories] category*[n-subcategories]
+@end example
+
+Ordinarily a group has some nested content, so that
+@code{n-subcategories} is positive, but a few instances of groups with
+@code{n-subcategories} 0 has been observed.
+
+If @code{merge} is 00, the most common value, then the group is really
+a distinct group that should be represented as such in the visual
+representation and user interface.  If @code{merge} is 01, however,
+the categories in this group should be shown and treated as if they
+were direct children of the group's parent group (or if it has no
+parent group, then direct children of the dimension), and this group's
+name is irrelevant and should not be displayed.  (Merged groups can be
+nested!)
+
+@code{data} appears to be i2 when all of the categories within a group
+are terminal categories that directly represent data values for a
+variable (e.g. in a frequency table or crosstabulation, a group of
+values in a variable being tabulated) and i0 otherwise, but this might
+be naive.
+
+@example
+data := int[layers] int[rows] int[columns] int*[n-dimensions]
+@end example
+
+The values of @code{layers}, @code{rows}, and @code{columns} each
+specifies the number of dimensions represented in layers or rows or
+columns, respectively, and their values sum to the number of
+dimensions.
+
+The @code{n-dimensions} integers are a permutation of the 0-based
+dimension numbers.  The first @code{layers} of them specify each of
+the dimensions represented by layers, the next @code{rows} of them
+specify the dimensions represented by rows, and the final
+@code{columns} of them specify the dimensions represented by columns.
+When there is more than one dimension of a given kind, the inner
+dimensions are given first.