Merge branch 'table_split' into develop
This commit is contained in:
commit
6bd5f74bdd
|
@ -8,7 +8,7 @@ msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: laview-latex-struct-0\n"
|
"Project-Id-Version: laview-latex-struct-0\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2014-07-18 18:10+0400\n"
|
"POT-Creation-Date: 2014-07-31 18:16+0400\n"
|
||||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||||
|
@ -41,6 +41,18 @@ msgstr ""
|
||||||
msgid "Incorrect longtable parameters doesn't match '%s' regexp."
|
msgid "Incorrect longtable parameters doesn't match '%s' regexp."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: /home/kolan/projects/LAview/LaTeX-Struct/src/Table.vala:298
|
||||||
|
msgid "2nd param (ATable) isn't a child of the 1st (Glob)."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: /home/kolan/projects/LAview/LaTeX-Struct/src/Table.vala:312
|
||||||
|
msgid "3rd param (limits) is incorrect. Read the manual."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: /home/kolan/projects/LAview/LaTeX-Struct/src/Table.vala:329
|
||||||
|
msgid "Cann't split the table. Read the manual."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: /home/kolan/projects/LAview/LaTeX-Struct/src/TableParser.vala:413
|
#: /home/kolan/projects/LAview/LaTeX-Struct/src/TableParser.vala:413
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Unexpected end external tag sequence '%s' without begin tag pair."
|
msgid "Unexpected end external tag sequence '%s' without begin tag pair."
|
||||||
|
|
|
@ -7,7 +7,7 @@ msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: laview-latex-struct-0\n"
|
"Project-Id-Version: laview-latex-struct-0\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2014-07-18 18:10+0400\n"
|
"POT-Creation-Date: 2014-07-31 18:16+0400\n"
|
||||||
"PO-Revision-Date: 2014-05-28 10:50+0400\n"
|
"PO-Revision-Date: 2014-05-28 10:50+0400\n"
|
||||||
"Last-Translator: <backbone@backbone.ws>\n"
|
"Last-Translator: <backbone@backbone.ws>\n"
|
||||||
"Language-Team: Russian\n"
|
"Language-Team: Russian\n"
|
||||||
|
@ -44,6 +44,18 @@ msgstr "Ошибка разбора поддокумента."
|
||||||
msgid "Incorrect longtable parameters doesn't match '%s' regexp."
|
msgid "Incorrect longtable parameters doesn't match '%s' regexp."
|
||||||
msgstr "Неверные параметры longtable не удовлетворяют рег. выражению '%s'."
|
msgstr "Неверные параметры longtable не удовлетворяют рег. выражению '%s'."
|
||||||
|
|
||||||
|
#: /home/kolan/projects/LAview/LaTeX-Struct/src/Table.vala:298
|
||||||
|
msgid "2nd param (ATable) isn't a child of the 1st (Glob)."
|
||||||
|
msgstr "2-ой параметр (ATable) не является дочерним узлом 1-ого (Glob)."
|
||||||
|
|
||||||
|
#: /home/kolan/projects/LAview/LaTeX-Struct/src/Table.vala:312
|
||||||
|
msgid "3rd param (limits) is incorrect. Read the manual."
|
||||||
|
msgstr "3-ий параметр (limits) не верный. Смотрите документацию."
|
||||||
|
|
||||||
|
#: /home/kolan/projects/LAview/LaTeX-Struct/src/Table.vala:329
|
||||||
|
msgid "Cann't split the table. Read the manual."
|
||||||
|
msgstr "Невозможно разбить таблицу. Смотрите документацию."
|
||||||
|
|
||||||
#: /home/kolan/projects/LAview/LaTeX-Struct/src/TableParser.vala:413
|
#: /home/kolan/projects/LAview/LaTeX-Struct/src/TableParser.vala:413
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Unexpected end external tag sequence '%s' without begin tag pair."
|
msgid "Unexpected end external tag sequence '%s' without begin tag pair."
|
||||||
|
|
156
src/Table.vala
156
src/Table.vala
|
@ -5,6 +5,27 @@ namespace LAview {
|
||||||
*/
|
*/
|
||||||
namespace Table {
|
namespace Table {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Any error at ``ATable`` splitting.
|
||||||
|
*/
|
||||||
|
public errordomain SplitError {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ``ATable`` isn't a child of the {@link Glob}.
|
||||||
|
*/
|
||||||
|
ISNT_CHILD,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Any errors in the split indexes.
|
||||||
|
*/
|
||||||
|
INDEX_ERROR,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Any other error.
|
||||||
|
*/
|
||||||
|
OTHER,
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Any Table in the LaTeX document.
|
* Any Table in the LaTeX document.
|
||||||
*/
|
*/
|
||||||
|
@ -58,7 +79,7 @@ namespace LAview {
|
||||||
* Gets a copy of the ``ATable``.
|
* Gets a copy of the ``ATable``.
|
||||||
*/
|
*/
|
||||||
public override IDoc copy () {
|
public override IDoc copy () {
|
||||||
var clone = Object.new (this.get_type ()) as ATable;
|
var clone = Object.new (get_type ()) as ATable;
|
||||||
|
|
||||||
clone.align = align;
|
clone.align = align;
|
||||||
clone.style = style;
|
clone.style = style;
|
||||||
|
@ -176,6 +197,139 @@ namespace LAview {
|
||||||
last_footer.clone_col (src_index, dest_index, multicol, line_style);
|
last_footer.clone_col (src_index, dest_index, multicol, line_style);
|
||||||
table.clone_col (src_index, dest_index, multicol, line_style);
|
table.clone_col (src_index, dest_index, multicol, line_style);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Bounds of the ``ATable`` to split.
|
||||||
|
*/
|
||||||
|
public struct SplitLimit {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* First column index [0; last].
|
||||||
|
*/
|
||||||
|
uint first;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Last column index [first; ncols - 1].
|
||||||
|
*/
|
||||||
|
uint last;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Maximum of columns per page [1; ncols].
|
||||||
|
*/
|
||||||
|
uint max_cols;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool check_limits (Array<SplitLimit?> sorted_limits) {
|
||||||
|
/* check nearby limits */
|
||||||
|
for (var i = 1; i < sorted_limits.length; ++i)
|
||||||
|
if (sorted_limits.index (i - 1).last >= sorted_limits.index (i).first
|
||||||
|
|| sorted_limits.index (i).first > sorted_limits.index (i).last)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
/* check limits of the first and last elements */
|
||||||
|
if (sorted_limits.index (0).first > sorted_limits.index (0).last
|
||||||
|
|| params.size <= sorted_limits.index (sorted_limits.length - 1).last)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint [] get_indexes (Array<SplitLimit?> sorted_limits) {
|
||||||
|
var lim_indexes = new uint[sorted_limits.length];
|
||||||
|
for (var i = 0; i < sorted_limits.length; ++i)
|
||||||
|
lim_indexes[i] = sorted_limits.index (i).first;
|
||||||
|
return lim_indexes;
|
||||||
|
}
|
||||||
|
|
||||||
|
ATable? split_table (Array<SplitLimit?> sorted_limits, uint [] lim_indexes,
|
||||||
|
Row.OpLineStyle line_style) {
|
||||||
|
|
||||||
|
var return_table = copy () as ATable;
|
||||||
|
bool split_finish = true;
|
||||||
|
|
||||||
|
/* removing spare columns */
|
||||||
|
for (uint i = sorted_limits.length - 1; i < sorted_limits.length; --i) { // group
|
||||||
|
for (uint j = sorted_limits.index (i).last;
|
||||||
|
j >= lim_indexes[i] + sorted_limits.index (i).max_cols
|
||||||
|
&& j <= sorted_limits.index (i).last; --j)
|
||||||
|
return_table.remove_col ((int)j, line_style);
|
||||||
|
|
||||||
|
for (uint j = lim_indexes[i] - 1; j >= sorted_limits.index (i).first && j < lim_indexes[i]; --j)
|
||||||
|
return_table.remove_col ((int)j, line_style);
|
||||||
|
|
||||||
|
/* count indexes */
|
||||||
|
if (lim_indexes[i] <= sorted_limits.index (i).last) {
|
||||||
|
split_finish = false;
|
||||||
|
lim_indexes[i] += sorted_limits.index (i).max_cols;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* did any indexes updated */
|
||||||
|
if (split_finish)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
return return_table;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Split an ``ATable`` into several ``ATable``s by columns according to the limits.
|
||||||
|
*
|
||||||
|
* For example: table<<BR>>
|
||||||
|
* ``[fix1 fix2 colA1 colA2 colA3 colA4 colA5 fix3 fix4 colB1 colB2 colB3 colB4 fix5 fix6]``<<BR>>
|
||||||
|
* with limits { {2, 6, 2}, {9, 12, 3} }<<BR>>
|
||||||
|
* will be splitted into 3 tables<<BR>>
|
||||||
|
* [fix1 fix2 colA1 colA2 fix3 fix4 colB1 colB2 colB3 fix5 fix6]<<BR>>
|
||||||
|
* [fix1 fix2 colA3 colA4 fix3 fix4 colB4 fix6]<<BR>>
|
||||||
|
* [fix1 fix2 colA5 fix3 fix4 fix6]<<BR>>
|
||||||
|
* 3rd param 'limits'. For all elements following conditions should be satisfied.
|
||||||
|
* last[i] < first[i+1], 0 <= first[i] <= last[i] <= ncols-1, 1 <= max_cols <= ncols.
|
||||||
|
*
|
||||||
|
* @param glob {@link Glob} document with a ``ATable``.
|
||||||
|
* @param limits array of {@link SplitLimit}s.
|
||||||
|
* @param line_style {@link Row.OpLineStyle} of the operation.
|
||||||
|
*
|
||||||
|
* @return number of ``ATable``s the table splitted to.
|
||||||
|
*/
|
||||||
|
public uint split (Glob glob, Array<SplitLimit?> limits,
|
||||||
|
Row.OpLineStyle line_style = Row.OpLineStyle.BORDER_DBLLINES) throws SplitError {
|
||||||
|
/* is table a child of glob */
|
||||||
|
var glob_index = glob.index_of (this);
|
||||||
|
if (glob_index == -1)
|
||||||
|
throw new SplitError.ISNT_CHILD (_("2nd param (ATable) isn't a child of the 1st (Glob)."));
|
||||||
|
|
||||||
|
/* sorting limits */
|
||||||
|
var sorted_limits = new Array<SplitLimit?>.sized (false, false, sizeof (SplitLimit), limits.length);
|
||||||
|
sorted_limits.append_vals (limits.data, limits.length);
|
||||||
|
|
||||||
|
sorted_limits.sort ((ref a, ref b) => {
|
||||||
|
if (a.first < b.first) return -1;
|
||||||
|
if (a.first > b.first) return 1;
|
||||||
|
return 0;
|
||||||
|
});
|
||||||
|
|
||||||
|
/* checking limits for intersections */
|
||||||
|
if (!check_limits (sorted_limits))
|
||||||
|
throw new SplitError.INDEX_ERROR (_("3rd param (limits) is incorrect. Read the manual."));
|
||||||
|
|
||||||
|
/* split the table on several longtables inserting them before glob_index + 1 */
|
||||||
|
var lim_indexes = get_indexes (sorted_limits);
|
||||||
|
|
||||||
|
ATable temp_table;
|
||||||
|
uint result = 0;
|
||||||
|
var part_idx = glob_index + 1;
|
||||||
|
while (null != (temp_table = split_table (sorted_limits, lim_indexes, line_style))) {
|
||||||
|
glob.insert (part_idx++, temp_table);
|
||||||
|
++result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* remove table from the doc */
|
||||||
|
if (result != 0)
|
||||||
|
glob.remove_at (glob_index);
|
||||||
|
else
|
||||||
|
throw new SplitError.OTHER (_("Cann't split the table. Read the manual."));
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,6 +33,18 @@ VALA_PRECOMPILE (LTableTest_C ${LTableTestSources}
|
||||||
ADD_EXECUTABLE (LTableTest ${LTableTest_C})
|
ADD_EXECUTABLE (LTableTest ${LTableTest_C})
|
||||||
TARGET_LINK_LIBRARIES (LTableTest ${PROJ_LCASE} ${GEE_LIBRARIES})
|
TARGET_LINK_LIBRARIES (LTableTest ${PROJ_LCASE} ${GEE_LIBRARIES})
|
||||||
|
|
||||||
|
# add split_test executable
|
||||||
|
FILE (GLOB_RECURSE LTableTestSources RELATIVE ${CMAKE_SOURCE_DIR}/test SplitTest.vala)
|
||||||
|
VALA_PRECOMPILE (SplitTest_C ${LTableTestSources}
|
||||||
|
PACKAGES gee-0.8 posix
|
||||||
|
OPTIONS --thread ${VALA_DEBUG}
|
||||||
|
CUSTOM_VAPIS ${PROJECT_BINARY_DIR}/src/${PROJ_LCASE}-${MAJOR}.vapi
|
||||||
|
GENERATE_VAPI
|
||||||
|
GENERATE_HEADER
|
||||||
|
)
|
||||||
|
ADD_EXECUTABLE (SplitTest ${SplitTest_C})
|
||||||
|
TARGET_LINK_LIBRARIES (SplitTest ${PROJ_LCASE} ${GEE_LIBRARIES})
|
||||||
|
|
||||||
# parsing test macro
|
# parsing test macro
|
||||||
MACRO (do_parse_test testname table_path etalon_path regexp)
|
MACRO (do_parse_test testname table_path etalon_path regexp)
|
||||||
IF ("${etalon_path}" STREQUAL "")
|
IF ("${etalon_path}" STREQUAL "")
|
||||||
|
@ -386,5 +398,19 @@ ltable_test (clone_1000_0 ${PROJECT_SOURCE_DIR}/test/tex/formular.tex ${PROJECT_
|
||||||
ltable_test (append_row0 ${PROJECT_SOURCE_DIR}/test/tex/table_rows.tex ${PROJECT_SOURCE_DIR}/test/tex/table_rows.etalon.tex append_row0
|
ltable_test (append_row0 ${PROJECT_SOURCE_DIR}/test/tex/table_rows.tex ${PROJECT_SOURCE_DIR}/test/tex/table_rows.etalon.tex append_row0
|
||||||
"Etalon and generated text are EQUAL .-.")
|
"Etalon and generated text are EQUAL .-.")
|
||||||
|
|
||||||
|
MACRO (do_split_test testname limits table etalon regexp)
|
||||||
|
ADD_TEST (split_test-${testname} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/SplitTest
|
||||||
|
--limits ${limits} --table ${table} --etalon ${etalon})
|
||||||
|
SET_TESTS_PROPERTIES (split_test-${testname}
|
||||||
|
PROPERTIES PASS_REGULAR_EXPRESSION ${regexp}
|
||||||
|
FAIL_REGULAR_EXPRESSION "CRITICAL;WARNING")
|
||||||
|
ENDMACRO (do_split_test)
|
||||||
|
|
||||||
|
# test TeXReport_splitLongtable () function
|
||||||
|
do_split_test (split_test ${PROJECT_SOURCE_DIR}/test/tex/limits1.in
|
||||||
|
${PROJECT_SOURCE_DIR}/test/tex/limits_table1.tex
|
||||||
|
${PROJECT_SOURCE_DIR}/test/tex/limits_table1.etalon.tex
|
||||||
|
"Etalon and generated text are EQUAL ...\n")
|
||||||
|
|
||||||
# enable testing
|
# enable testing
|
||||||
ENABLE_TESTING ()
|
ENABLE_TESTING ()
|
||||||
|
|
|
@ -0,0 +1,137 @@
|
||||||
|
using LAview;
|
||||||
|
|
||||||
|
public class Main : Object {
|
||||||
|
static string fname_limits = "";
|
||||||
|
static string fname_table = "";
|
||||||
|
static string fname_etalon = "";
|
||||||
|
static string fname_write = "";
|
||||||
|
|
||||||
|
const OptionEntry [] options = {
|
||||||
|
{ "limits", 'l', 0, OptionArg.FILENAME, ref fname_limits, "File with limits", null },
|
||||||
|
{ "table", 't', 0, OptionArg.FILENAME, ref fname_table, "File with a table", null },
|
||||||
|
{ "etalon", 'e', 0, OptionArg.FILENAME, ref fname_etalon, "File with etalon table", null },
|
||||||
|
{ "write", 'w', 0, OptionArg.FILENAME, ref fname_write, "File to write", null },
|
||||||
|
{ null }
|
||||||
|
};
|
||||||
|
|
||||||
|
public static int main (string [] args) {
|
||||||
|
|
||||||
|
Intl.setlocale (LocaleCategory.ALL, "");
|
||||||
|
|
||||||
|
/* commandline arguments processing */
|
||||||
|
try {
|
||||||
|
var opt_context = new OptionContext ("- tests LaTeX parser");
|
||||||
|
opt_context.set_help_enabled (true);
|
||||||
|
opt_context.add_main_entries (options, null);
|
||||||
|
opt_context.parse (ref args);
|
||||||
|
} catch (OptionError e) {
|
||||||
|
stderr.printf ("error: %s\n", e.message);
|
||||||
|
stderr.printf ("Run '%s --help' to see a full list of available command line options.\n", args[0]);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* read limits */
|
||||||
|
if (fname_limits == null) {
|
||||||
|
stderr.printf ("Specify file with limits\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
var stream = FileStream.open (fname_limits, "r");
|
||||||
|
if (stream == null) {
|
||||||
|
stdout.puts ("Cann't open limits file\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint lim[3] = { 0, 0, 0};
|
||||||
|
var limits = new Array<Table.ATable.SplitLimit?> ();
|
||||||
|
|
||||||
|
while (3 == stream.scanf ("%u %u %u", out lim[0], out lim[1], out lim[2])) {
|
||||||
|
var split_lim = Table.ATable.SplitLimit ();
|
||||||
|
split_lim.first = lim[0];
|
||||||
|
split_lim.last = lim[1];
|
||||||
|
split_lim.max_cols = lim[2];
|
||||||
|
limits.append_val (split_lim);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* read table */
|
||||||
|
if (fname_table == null) {
|
||||||
|
stderr.printf ("Specify file with a table or read help (%s --help)", args[0]);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* load file contents */
|
||||||
|
string contents;
|
||||||
|
try {
|
||||||
|
FileUtils.get_contents (fname_table, out contents);
|
||||||
|
} catch (FileError e) {
|
||||||
|
stderr.printf ("error: %s\n", e.message);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* parse TeX */
|
||||||
|
Glob doc;
|
||||||
|
try {
|
||||||
|
doc = LAview.parse (contents);
|
||||||
|
stdout.printf ("TeX document successfully parsed\n");
|
||||||
|
|
||||||
|
} catch (Parsers.ParseError e) {
|
||||||
|
stderr.printf ("Error parsing TeX document: %s\n", e.message);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* find a longtable object */
|
||||||
|
Table.Longtable table = null;
|
||||||
|
foreach (var subdoc in doc) {
|
||||||
|
if (subdoc is Table.Longtable) {
|
||||||
|
table = subdoc as Table.Longtable;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (table == null) {
|
||||||
|
stderr.puts ("longtable object not found\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* split the table */
|
||||||
|
try {
|
||||||
|
table.split (doc, limits);
|
||||||
|
} catch (Table.SplitError e) {
|
||||||
|
stderr.puts (e.message);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* load etalon file */
|
||||||
|
if (fname_etalon != null) {
|
||||||
|
try {
|
||||||
|
FileUtils.get_contents (fname_etalon, out contents);
|
||||||
|
} catch (FileError e) {
|
||||||
|
stderr.printf ("error: %s\n", e.message);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* generate */
|
||||||
|
var generated = doc.generate ();
|
||||||
|
|
||||||
|
/* compare with an etalon */
|
||||||
|
if (contents == generated)
|
||||||
|
stdout.puts ("Etalon and generated text are EQUAL ;-)\n");
|
||||||
|
else
|
||||||
|
stdout.puts ("Etalon and generated text are NOT EQUAL ;-(\n");
|
||||||
|
|
||||||
|
stdout.printf ("--- Generated plain-TeX (generated) ---\n%s", generated);
|
||||||
|
|
||||||
|
/* write to file */
|
||||||
|
if (fname_write != null )
|
||||||
|
try {
|
||||||
|
FileUtils.set_contents (fname_write, generated);
|
||||||
|
} catch (FileError e) {
|
||||||
|
stderr.printf ("error: %s\n", e.message);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,3 @@
|
||||||
|
9 11 3
|
||||||
|
2 6 2
|
||||||
|
13 16 1
|
|
@ -0,0 +1,127 @@
|
||||||
|
%% LyX 2.0.3 created this file. For more info, see http://www.lyx.org/.
|
||||||
|
%% Do not edit unless you really know what you are doing.
|
||||||
|
\documentclass[english]{article}
|
||||||
|
\usepackage[T1]{fontenc}
|
||||||
|
\usepackage[latin9]{inputenc}
|
||||||
|
\usepackage{longtable}
|
||||||
|
|
||||||
|
\makeatletter
|
||||||
|
|
||||||
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% LyX specific LaTeX commands.
|
||||||
|
%% Because html converters don't know tabularnewline
|
||||||
|
\providecommand{\tabularnewline}{\\}
|
||||||
|
|
||||||
|
\makeatother
|
||||||
|
|
||||||
|
\usepackage{babel}
|
||||||
|
\begin{document}
|
||||||
|
\begin{longtable}{|c|c|c|c|c|c|c|c|c|c|c|c|}
|
||||||
|
\hline
|
||||||
|
fh1 & fh2 & fh3 & fh4 & fh8 & fh9 & fh10 & fh11 & fh12 & fh13 & fh14 & fh18\tabularnewline
|
||||||
|
\endfirsthead
|
||||||
|
\hline
|
||||||
|
h1 & h2 & h3 & h4 & h8 & h9 & h10 & h11 & h12 & h13 & h14 & h18\tabularnewline
|
||||||
|
\endhead
|
||||||
|
\hline
|
||||||
|
f1 & f2 & f3 & f4 & f8 & f9 & f10 & f11 & f12 & f13 & f14 & f18\tabularnewline
|
||||||
|
\hline
|
||||||
|
a1 & a2 & a3 & a4 & a8 & a9 & a10 & a11 & a12 & a13 & a14 & a18\tabularnewline
|
||||||
|
\hline
|
||||||
|
\hline
|
||||||
|
b1 & b2 & \multicolumn{2}{c|}{b3} & b8 & b9 & b10 & b11 & b12 & b13 & b14 & \multicolumn{1}{c|}{b15}\tabularnewline
|
||||||
|
\hline
|
||||||
|
\multicolumn{4}{|c|}{c1} & c8 & c9 & \multicolumn{3}{c|}{c10} & c13 & c14 & c18\tabularnewline
|
||||||
|
\hline
|
||||||
|
d1 & d2 & d3 & \multicolumn{6}{c|}{d4} & d13 & d14 & \multicolumn{1}{c|}{d16}\tabularnewline
|
||||||
|
\hline
|
||||||
|
\multicolumn{4}{|c|}{e1} & e8 & e9 & e10 & e11 & \multicolumn{3}{c|}{e12} & e18\tabularnewline
|
||||||
|
\hline
|
||||||
|
g1 & g2 & \multicolumn{9}{c|}{g3} & g18\tabularnewline
|
||||||
|
\hline
|
||||||
|
\multicolumn{11}{|c|}{i1} & i3\tabularnewline
|
||||||
|
\hline
|
||||||
|
j1 & \multicolumn{11}{c|}{j2}\tabularnewline
|
||||||
|
\hline
|
||||||
|
\end{longtable}\begin{longtable}{|c|c|c|c|c|c|c|c|c|}
|
||||||
|
\hline
|
||||||
|
fh1 & fh2 & fh5 & fh6 & fh8 & fh9 & fh13 & fh15 & fh18\tabularnewline
|
||||||
|
\endfirsthead
|
||||||
|
\hline
|
||||||
|
h1 & h2 & h5 & h6 & h8 & h9 & h13 & h15 & h18\tabularnewline
|
||||||
|
\endhead
|
||||||
|
\hline
|
||||||
|
f1 & f2 & f5 & f6 & f8 & f9 & f13 & f15 & f18\tabularnewline
|
||||||
|
\hline
|
||||||
|
a1 & a2 & a5 & a6 & a8 & a9 & a13 & a15 & a18\tabularnewline
|
||||||
|
\hline
|
||||||
|
\hline
|
||||||
|
b1 & b2 & \multicolumn{2}{c|}{b3} & b8 & b9 & b13 & \multicolumn{2}{c|}{b15}\tabularnewline
|
||||||
|
\hline
|
||||||
|
\multicolumn{2}{|c|}{c1} & c5 & c6 & c8 & c9 & c13 & c15 & c18\tabularnewline
|
||||||
|
\hline
|
||||||
|
d1 & d2 & \multicolumn{4}{c|}{d4} & d13 & d15 & \multicolumn{1}{c|}{d16}\tabularnewline
|
||||||
|
\hline
|
||||||
|
\multicolumn{3}{|c|}{e1} & e6 & e8 & e9 & \multicolumn{2}{c|}{e12} & e18\tabularnewline
|
||||||
|
\hline
|
||||||
|
g1 & g2 & \multicolumn{6}{c|}{g3} & g18\tabularnewline
|
||||||
|
\hline
|
||||||
|
\multicolumn{8}{|c|}{i1} & i3\tabularnewline
|
||||||
|
\hline
|
||||||
|
j1 & \multicolumn{8}{c|}{j2}\tabularnewline
|
||||||
|
\hline
|
||||||
|
\end{longtable}\begin{longtable}{|c|c|c|c|c|c|c|c|}
|
||||||
|
\hline
|
||||||
|
fh1 & fh2 & fh7 & fh8 & fh9 & fh13 & fh16 & fh18\tabularnewline
|
||||||
|
\endfirsthead
|
||||||
|
\hline
|
||||||
|
h1 & h2 & h7 & h8 & h9 & h13 & h16 & h18\tabularnewline
|
||||||
|
\endhead
|
||||||
|
\hline
|
||||||
|
f1 & f2 & f7 & f8 & f9 & f13 & f16 & f18\tabularnewline
|
||||||
|
\hline
|
||||||
|
a1 & a2 & a7 & a8 & a9 & a13 & a16 & a18\tabularnewline
|
||||||
|
\hline
|
||||||
|
\hline
|
||||||
|
b1 & b2 & \multicolumn{1}{c|}{b3} & b8 & b9 & b13 & \multicolumn{2}{c|}{b15}\tabularnewline
|
||||||
|
\hline
|
||||||
|
\multicolumn{2}{|c|}{c1} & c7 & c8 & c9 & c13 & c16 & c18\tabularnewline
|
||||||
|
\hline
|
||||||
|
d1 & d2 & \multicolumn{3}{c|}{d4} & d13 & \multicolumn{2}{c|}{d16}\tabularnewline
|
||||||
|
\hline
|
||||||
|
\multicolumn{2}{|c|}{e1} & e7 & e8 & e9 & \multicolumn{1}{c|}{e12} & e16 & e18\tabularnewline
|
||||||
|
\hline
|
||||||
|
g1 & g2 & \multicolumn{5}{c|}{g3} & g18\tabularnewline
|
||||||
|
\hline
|
||||||
|
\multicolumn{7}{|c|}{i1} & i3\tabularnewline
|
||||||
|
\hline
|
||||||
|
j1 & \multicolumn{7}{c|}{j2}\tabularnewline
|
||||||
|
\hline
|
||||||
|
\end{longtable}\begin{longtable}{|c|c|c|c|c|c|}
|
||||||
|
\hline
|
||||||
|
fh1 & fh2 & fh9 & fh13 & fh17 & fh18\tabularnewline
|
||||||
|
\endfirsthead
|
||||||
|
\hline
|
||||||
|
h1 & h2 & h9 & h13 & h17 & h18\tabularnewline
|
||||||
|
\endhead
|
||||||
|
\hline
|
||||||
|
f1 & f2 & f9 & f13 & f17 & f18\tabularnewline
|
||||||
|
\hline
|
||||||
|
a1 & a2 & a9 & a13 & a17 & a18\tabularnewline
|
||||||
|
\hline
|
||||||
|
\hline
|
||||||
|
b1 & b2 & b9 & b13 & \multicolumn{2}{c|}{b15}\tabularnewline
|
||||||
|
\hline
|
||||||
|
\multicolumn{2}{|c|}{c1} & c9 & c13 & c17 & c18\tabularnewline
|
||||||
|
\hline
|
||||||
|
d1 & d2 & \multicolumn{1}{c|}{d4} & d13 & \multicolumn{2}{c|}{d16}\tabularnewline
|
||||||
|
\hline
|
||||||
|
\multicolumn{2}{|c|}{e1} & e9 & \multicolumn{1}{c|}{e12} & e17 & e18\tabularnewline
|
||||||
|
\hline
|
||||||
|
g1 & g2 & \multicolumn{2}{c|}{g3} & g17 & g18\tabularnewline
|
||||||
|
\hline
|
||||||
|
\multicolumn{4}{|c|}{i1} & i2 & i3\tabularnewline
|
||||||
|
\hline
|
||||||
|
j1 & \multicolumn{5}{c|}{j2}\tabularnewline
|
||||||
|
\hline
|
||||||
|
\end{longtable}
|
||||||
|
\end{document}
|
|
@ -0,0 +1,46 @@
|
||||||
|
%% LyX 2.0.3 created this file. For more info, see http://www.lyx.org/.
|
||||||
|
%% Do not edit unless you really know what you are doing.
|
||||||
|
\documentclass[english]{article}
|
||||||
|
\usepackage[T1]{fontenc}
|
||||||
|
\usepackage[latin9]{inputenc}
|
||||||
|
\usepackage{longtable}
|
||||||
|
|
||||||
|
\makeatletter
|
||||||
|
|
||||||
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% LyX specific LaTeX commands.
|
||||||
|
%% Because html converters don't know tabularnewline
|
||||||
|
\providecommand{\tabularnewline}{\\}
|
||||||
|
|
||||||
|
\makeatother
|
||||||
|
|
||||||
|
\usepackage{babel}
|
||||||
|
\begin{document}
|
||||||
|
\begin{longtable}{|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|}
|
||||||
|
\hline
|
||||||
|
fh1 & fh2 & fh3 & fh4 & fh5 & fh6 & fh7 & fh8 & fh9 & fh10 & fh11 & fh12 & fh13 & fh14 & fh15 & fh16 & fh17 & fh18\tabularnewline
|
||||||
|
\endfirsthead
|
||||||
|
\hline
|
||||||
|
h1 & h2 & h3 & h4 & h5 & h6 & h7 & h8 & h9 & h10 & h11 & h12 & h13 & h14 & h15 & h16 & h17 & h18\tabularnewline
|
||||||
|
\endhead
|
||||||
|
\hline
|
||||||
|
f1 & f2 & f3 & f4 & f5 & f6 & f7 & f8 & f9 & f10 & f11 & f12 & f13 & f14 & f15 & f16 & f17 & f18\tabularnewline
|
||||||
|
\hline
|
||||||
|
a1 & a2 & a3 & a4 & a5 & a6 & a7 & a8 & a9 & a10 & a11 & a12 & a13 & a14 & a15 & a16 & a17 & a18\tabularnewline
|
||||||
|
\hline
|
||||||
|
\hline
|
||||||
|
b1 & b2 & \multicolumn{5}{c|}{b3} & b8 & b9 & b10 & b11 & b12 & b13 & b14 & \multicolumn{4}{c|}{b15}\tabularnewline
|
||||||
|
\hline
|
||||||
|
\multicolumn{4}{|c|}{c1} & c5 & c6 & c7 & c8 & c9 & \multicolumn{3}{c|}{c10} & c13 & c14 & c15 & c16 & c17 & c18\tabularnewline
|
||||||
|
\hline
|
||||||
|
d1 & d2 & d3 & \multicolumn{9}{c|}{d4} & d13 & d14 & d15 & \multicolumn{3}{c|}{d16}\tabularnewline
|
||||||
|
\hline
|
||||||
|
\multicolumn{5}{|c|}{e1} & e6 & e7 & e8 & e9 & e10 & e11 & \multicolumn{4}{c|}{e12} & e16 & e17 & e18\tabularnewline
|
||||||
|
\hline
|
||||||
|
g1 & g2 & \multicolumn{14}{c|}{g3} & g17 & g18\tabularnewline
|
||||||
|
\hline
|
||||||
|
\multicolumn{16}{|c|}{i1} & i2 & i3\tabularnewline
|
||||||
|
\hline
|
||||||
|
j1 & \multicolumn{17}{c|}{j2}\tabularnewline
|
||||||
|
\hline
|
||||||
|
\end{longtable}
|
||||||
|
\end{document}
|
Loading…
Reference in New Issue