summaryrefslogtreecommitdiff
path: root/Build
diff options
context:
space:
mode:
Diffstat (limited to 'Build')
-rw-r--r--Build/source/texk/web2c/luatexdir/font/texfont.w91
-rw-r--r--Build/source/texk/web2c/luatexdir/lua/lcallbacklib.c1
-rw-r--r--Build/source/texk/web2c/luatexdir/lua/lpdflib.c13
-rw-r--r--Build/source/texk/web2c/luatexdir/lua/luanode.w3
-rw-r--r--Build/source/texk/web2c/luatexdir/luatex.c12
-rw-r--r--Build/source/texk/web2c/luatexdir/luatexcallbackids.h1
-rw-r--r--Build/source/texk/web2c/luatexdir/pdf/pdfgen.h12
-rw-r--r--Build/source/texk/web2c/luatexdir/pdf/pdfliteral.w9
-rw-r--r--Build/source/texk/web2c/luatexdir/pdf/pdfrule.w16
-rw-r--r--Build/source/texk/web2c/luatexdir/tex/commands.w2
-rw-r--r--Build/source/texk/web2c/luatexdir/tex/dumpdata.w2
-rw-r--r--Build/source/texk/web2c/luatexdir/tex/equivalents.h24
-rw-r--r--Build/source/texk/web2c/luatexdir/tex/errors.w173
-rw-r--r--Build/source/texk/web2c/luatexdir/tex/extensions.w2
-rw-r--r--Build/source/texk/web2c/luatexdir/tex/mlist.w50
-rw-r--r--Build/source/texk/web2c/luatexdir/tex/texfileio.w6
-rw-r--r--Build/source/texk/web2c/luatexdir/tex/texnodes.h8
-rw-r--r--Build/source/texk/web2c/luatexdir/tex/texnodes.w2
-rw-r--r--Build/source/texk/web2c/luatexdir/tex/textoken.w2
19 files changed, 314 insertions, 115 deletions
diff --git a/Build/source/texk/web2c/luatexdir/font/texfont.w b/Build/source/texk/web2c/luatexdir/font/texfont.w
index e68deac84ad..9b6c0cd6bfe 100644
--- a/Build/source/texk/web2c/luatexdir/font/texfont.w
+++ b/Build/source/texk/web2c/luatexdir/font/texfont.w
@@ -267,18 +267,25 @@ charinfo *copy_charinfo(charinfo * ci)
x = ci->top_left_math_kerns;
co->top_left_math_kerns = x;
if (x > 0) {
- co->top_left_math_kern_array =
- xmalloc((unsigned) (2 * (int) sizeof(scaled) * x));
+ co->top_left_math_kern_array = xmalloc((unsigned) (2 * (int) sizeof(scaled) * x));
for (k = 0; k < co->top_left_math_kerns; k++) {
co->top_left_math_kern_array[(2 * k)] = ci->top_left_math_kern_array[(2 * k)];
co->top_left_math_kern_array[(2 * k) + 1] = ci->top_left_math_kern_array[(2 * k) + 1];
}
}
+ x = ci->bottom_left_math_kerns;
+ co->bottom_left_math_kerns = x;
+ if (x > 0) {
+ co->bottom_left_math_kern_array = xmalloc((unsigned) (2 * (int) sizeof(scaled) * x));
+ for (k = 0; k < co->bottom_left_math_kerns; k++) {
+ co->bottom_left_math_kern_array[(2 * k)] = ci->bottom_left_math_kern_array[(2 * k)];
+ co->bottom_left_math_kern_array[(2 * k) + 1] = ci->bottom_left_math_kern_array[(2 * k) + 1];
+ }
+ }
x = ci->top_right_math_kerns;
co->top_right_math_kerns = x;
if (x > 0) {
- co->top_right_math_kern_array =
- xmalloc((unsigned) (2 * (int) sizeof(scaled) * x));
+ co->top_right_math_kern_array = xmalloc((unsigned) (2 * (int) sizeof(scaled) * x));
for (k = 0; k < co->top_right_math_kerns; k++) {
co->top_right_math_kern_array[(2 * k)] = ci->top_right_math_kern_array[(2 * k)];
co->top_right_math_kern_array[(2 * k) + 1] = ci->top_right_math_kern_array[(2 * k) + 1];
@@ -287,23 +294,12 @@ charinfo *copy_charinfo(charinfo * ci)
x = ci->bottom_right_math_kerns;
co->bottom_right_math_kerns = x;
if (x > 0) {
- co->bottom_right_math_kern_array =
- xmalloc((unsigned) (2 * (int) sizeof(scaled) * x));
+ co->bottom_right_math_kern_array = xmalloc((unsigned) (2 * (int) sizeof(scaled) * x));
for (k = 0; k < co->bottom_right_math_kerns; k++) {
co->bottom_right_math_kern_array[(2 * k)] = ci->bottom_right_math_kern_array[(2 * k)];
co->bottom_right_math_kern_array[(2 * k) + 1] = ci->bottom_right_math_kern_array[(2 * k) + 1];
}
}
- x = ci->bottom_left_math_kerns;
- co->bottom_left_math_kerns = x;
- if (x > 0) {
- co->bottom_left_math_kern_array =
- xmalloc((unsigned) (2 * (int) sizeof(scaled) * x));
- for (k = 0; k < co->bottom_left_math_kerns; k++) {
- co->bottom_left_math_kern_array[(2 * k)] = ci->bottom_left_math_kern_array[(2 * k)];
- co->bottom_left_math_kern_array[(2 * k) + 1] = ci->bottom_left_math_kern_array[(2 * k) + 1];
- }
- }
return co;
}
@@ -652,10 +648,10 @@ int get_charinfo_math_kerns(charinfo * ci, int id)
k = ci->top_left_math_kerns;
} else if (id == bottom_left_kern) {
k = ci->bottom_left_math_kerns;
- } else if (id == bottom_right_kern) {
- k = ci->bottom_right_math_kerns;
} else if (id == top_right_kern) {
k = ci->top_right_math_kerns;
+ } else if (id == bottom_right_kern) {
+ k = ci->bottom_right_math_kerns;
} else {
confusion("get_charinfo_math_kerns");
}
@@ -674,25 +670,22 @@ void add_charinfo_math_kern(charinfo * ci, int id, scaled ht, scaled krn)
ci->top_left_math_kerns++;
} else if (id == bottom_left_kern) {
k = ci->bottom_left_math_kerns;
- do_realloc(ci->bottom_left_math_kern_array, ((k + 1) * 2),
- sizeof(scaled));
+ do_realloc(ci->bottom_left_math_kern_array, ((k + 1) * 2), sizeof(scaled));
ci->bottom_left_math_kern_array[(2 * (k))] = ht;
ci->bottom_left_math_kern_array[(2 * (k)) + 1] = krn;
ci->bottom_left_math_kerns++;
- } else if (id == bottom_right_kern) {
- k = ci->bottom_right_math_kerns;
- do_realloc(ci->bottom_right_math_kern_array, ((k + 1) * 2),
- sizeof(scaled));
- ci->bottom_right_math_kern_array[(2 * (k))] = ht;
- ci->bottom_right_math_kern_array[(2 * (k)) + 1] = krn;
- ci->bottom_right_math_kerns++;
} else if (id == top_right_kern) {
k = ci->top_right_math_kerns;
- do_realloc(ci->top_right_math_kern_array, ((k + 1) * 2),
- sizeof(scaled));
+ do_realloc(ci->top_right_math_kern_array, ((k + 1) * 2), sizeof(scaled));
ci->top_right_math_kern_array[(2 * (k))] = ht;
ci->top_right_math_kern_array[(2 * (k)) + 1] = krn;
ci->top_right_math_kerns++;
+ } else if (id == bottom_right_kern) {
+ k = ci->bottom_right_math_kerns;
+ do_realloc(ci->bottom_right_math_kern_array, ((k + 1) * 2), sizeof(scaled));
+ ci->bottom_right_math_kern_array[(2 * (k))] = ht;
+ ci->bottom_right_math_kern_array[(2 * (k)) + 1] = krn;
+ ci->bottom_right_math_kerns++;
} else {
confusion("add_charinfo_math_kern");
}
@@ -715,17 +708,17 @@ static void dump_math_kerns(charinfo * ci)
dump_int(ci->bottom_left_math_kern_array[(2 * k)]);
dump_int(ci->bottom_left_math_kern_array[(2 * k) + 1]);
}
- l = ci->bottom_right_math_kerns;
+ l = ci->top_right_math_kerns;
dump_int(l);
for (k = 0; k < l; k++) {
- dump_int(ci->bottom_right_math_kern_array[(2 * k)]);
- dump_int(ci->bottom_right_math_kern_array[(2 * k) + 1]);
+ dump_int(ci->top_right_math_kern_array[(2 * k)]);
+ dump_int(ci->top_right_math_kern_array[(2 * k) + 1]);
}
- l = ci->top_right_math_kerns;
+ l = ci->bottom_right_math_kerns;
dump_int(l);
for (k = 0; k < l; k++) {
- dump_int(ci->bottom_left_math_kern_array[(2 * k)]);
- dump_int(ci->bottom_left_math_kern_array[(2 * k) + 1]);
+ dump_int(ci->bottom_right_math_kern_array[(2 * k)]);
+ dump_int(ci->bottom_right_math_kern_array[(2 * k) + 1]);
}
}
@@ -737,8 +730,7 @@ static void undump_math_kerns(charinfo * ci)
undump_int(x);
ci->top_left_math_kerns = x;
if (x > 0)
- ci->top_left_math_kern_array =
- xmalloc((unsigned) (2 * (int) sizeof(scaled) * x));
+ ci->top_left_math_kern_array = xmalloc((unsigned) (2 * (int) sizeof(scaled) * x));
for (k = 0; k < ci->top_left_math_kerns; k++) {
undump_int(x);
ci->top_left_math_kern_array[(2 * k)] = (scaled) x;
@@ -748,8 +740,7 @@ static void undump_math_kerns(charinfo * ci)
undump_int(x);
ci->bottom_left_math_kerns = x;
if (x > 0)
- ci->bottom_left_math_kern_array =
- xmalloc((unsigned) (2 * (int) sizeof(scaled) * x));
+ ci->bottom_left_math_kern_array = xmalloc((unsigned) (2 * (int) sizeof(scaled) * x));
for (k = 0; k < ci->bottom_left_math_kerns; k++) {
undump_int(x);
ci->bottom_left_math_kern_array[(2 * k)] = (scaled) x;
@@ -757,26 +748,24 @@ static void undump_math_kerns(charinfo * ci)
ci->bottom_left_math_kern_array[(2 * k) + 1] = (scaled) x;
}
undump_int(x);
- ci->bottom_right_math_kerns = x;
+ ci->top_right_math_kerns = x;
if (x > 0)
- ci->bottom_right_math_kern_array =
- xmalloc((unsigned) (2 * (int) sizeof(scaled) * x));
- for (k = 0; k < ci->bottom_right_math_kerns; k++) {
+ ci->top_right_math_kern_array = xmalloc((unsigned) (2 * (int) sizeof(scaled) * x));
+ for (k = 0; k < ci->top_right_math_kerns; k++) {
undump_int(x);
- ci->bottom_right_math_kern_array[(2 * k)] = (scaled) x;
+ ci->top_right_math_kern_array[(2 * k)] = (scaled) x;
undump_int(x);
- ci->bottom_right_math_kern_array[(2 * k) + 1] = (scaled) x;
+ ci->top_right_math_kern_array[(2 * k) + 1] = (scaled) x;
}
undump_int(x);
- ci->top_right_math_kerns = x;
+ ci->bottom_right_math_kerns = x;
if (x > 0)
- ci->top_right_math_kern_array =
- xmalloc((unsigned) (2 * (int) sizeof(scaled) * x));
- for (k = 0; k < ci->top_right_math_kerns; k++) {
+ ci->bottom_right_math_kern_array = xmalloc((unsigned) (2 * (int) sizeof(scaled) * x));
+ for (k = 0; k < ci->bottom_right_math_kerns; k++) {
undump_int(x);
- ci->top_right_math_kern_array[(2 * k)] = (scaled) x;
+ ci->bottom_right_math_kern_array[(2 * k)] = (scaled) x;
undump_int(x);
- ci->top_right_math_kern_array[(2 * k) + 1] = (scaled) x;
+ ci->bottom_right_math_kern_array[(2 * k) + 1] = (scaled) x;
}
}
diff --git a/Build/source/texk/web2c/luatexdir/lua/lcallbacklib.c b/Build/source/texk/web2c/luatexdir/lua/lcallbacklib.c
index 6bdaca016fd..812ad437b1a 100644
--- a/Build/source/texk/web2c/luatexdir/lua/lcallbacklib.c
+++ b/Build/source/texk/web2c/luatexdir/lua/lcallbacklib.c
@@ -72,6 +72,7 @@ static const char *const callbacknames[] = {
"process_rule",
"insert_local_par",
"contribute_filter",
+ "call_edit",
NULL
};
diff --git a/Build/source/texk/web2c/luatexdir/lua/lpdflib.c b/Build/source/texk/web2c/luatexdir/lua/lpdflib.c
index 3b9846c0ed2..82508a2a9e2 100644
--- a/Build/source/texk/web2c/luatexdir/lua/lpdflib.c
+++ b/Build/source/texk/web2c/luatexdir/lua/lpdflib.c
@@ -43,6 +43,8 @@ static int luapdfprint(lua_State * L)
literal_mode = direct_always;
else if (lua_key_eq(modestr_s,page))
literal_mode = direct_page;
+ else if (lua_key_eq(modestr_s,raw))
+ literal_mode = direct_raw;
else {
luaL_error(L, "invalid first argument for print literal mode");
}
@@ -64,6 +66,9 @@ static int luapdfprint(lua_State * L)
case (direct_always):
pdf_end_string_nl(static_pdf);
break;
+ case (direct_raw):
+ pdf_end_string_nl(static_pdf);
+ break;
default:
assert(0);
}
@@ -1069,11 +1074,13 @@ static int newpdfcolorstack(lua_State * L)
if (lua_type(L,2) == LUA_TSTRING) {
l = lua_tostring(L, 2);
if (lua_key_eq(l,origin)) {
- literal_mode = 0;
+ literal_mode = set_origin;
} else if (lua_key_eq(l,page)) {
- literal_mode = 1; /* direct_page */
+ literal_mode = direct_page;
} else if (lua_key_eq(l,direct)) {
- literal_mode = 2; /* direct_always */
+ literal_mode = direct_always;
+ } else if (lua_key_eq(l,raw)) {
+ literal_mode = direct_raw;
} else {
luaL_error(L, "invalid literal mode in pdf.newcolorstack()");
}
diff --git a/Build/source/texk/web2c/luatexdir/lua/luanode.w b/Build/source/texk/web2c/luatexdir/lua/luanode.w
index f901eddbfa9..af15748bacd 100644
--- a/Build/source/texk/web2c/luatexdir/lua/luanode.w
+++ b/Build/source/texk/web2c/luatexdir/lua/luanode.w
@@ -420,6 +420,9 @@ void show_pdf_literal(pointer p)
case direct_always:
tprint(" direct");
break;
+ case direct_raw:
+ tprint(" raw");
+ break;
default:
confusion("literal2");
break;
diff --git a/Build/source/texk/web2c/luatexdir/luatex.c b/Build/source/texk/web2c/luatexdir/luatex.c
index 7e06c938885..d2cf856d468 100644
--- a/Build/source/texk/web2c/luatexdir/luatex.c
+++ b/Build/source/texk/web2c/luatexdir/luatex.c
@@ -28,10 +28,10 @@
#define TeX
-int luatex_version = 98; /* \.{\\luatexversion} */
-int luatex_revision = '4'; /* \.{\\luatexrevision} */
-int luatex_date_info = 2016090500; /* the compile date is now hardwired */
-const char *luatex_version_string = "0.98.4";
+int luatex_version = 99; /* \.{\\luatexversion} */
+int luatex_revision = '5'; /* \.{\\luatexrevision} */
+int luatex_date_info = 2016092300; /* the compile date is now hardwired */
+const char *luatex_version_string = "0.99.5";
const char *engine_name = my_name; /* the name of this engine */
#include <kpathsea/c-ctype.h>
@@ -61,10 +61,6 @@ const char *engine_name = my_name; /* the name of this engine */
#include <signal.h> /* Catch interrupts. */
-/* {tex,mf}d.h defines TeX, MF, INI, and other such symbols.
- Unfortunately there's no way to get the banner into this code, so
- just repeat the text. */
-#define edit_var "TEXEDIT"
/* Shell escape.
diff --git a/Build/source/texk/web2c/luatexdir/luatexcallbackids.h b/Build/source/texk/web2c/luatexdir/luatexcallbackids.h
index 4a02f05d058..cfd865b896a 100644
--- a/Build/source/texk/web2c/luatexdir/luatexcallbackids.h
+++ b/Build/source/texk/web2c/luatexdir/luatexcallbackids.h
@@ -66,6 +66,7 @@ typedef enum {
process_rule_callback,
insert_local_par_callback,
contribute_filter_callback,
+ call_edit_callback,
total_callbacks
} callback_callback_types;
diff --git a/Build/source/texk/web2c/luatexdir/pdf/pdfgen.h b/Build/source/texk/web2c/luatexdir/pdf/pdfgen.h
index 551f686e6fe..f2086663c70 100644
--- a/Build/source/texk/web2c/luatexdir/pdf/pdfgen.h
+++ b/Build/source/texk/web2c/luatexdir/pdf/pdfgen.h
@@ -27,8 +27,8 @@
# define PROCSET_IMAGE_C (1 << 3)
# define PROCSET_IMAGE_I (1 << 4)
-# define inf_pdf_mem_size 10000 /* min size of the |mem| array */
-# define sup_pdf_mem_size 10000000 /* max size of the |mem| array */
+# define inf_pdf_mem_size 10000 /* min size of the |mem| array */
+# define sup_pdf_mem_size 100000000 /* max size of the |mem| array */
extern PDF static_pdf;
@@ -43,10 +43,10 @@ be the first written bytes.
*/
-# define inf_pdfout_buf_size 16384 /* initial value of |pdf->buf| size */
-# define sup_pdfout_buf_size 16384 /* arbitrary upper hard limit of |pdf->buf| size */
-# define inf_objstm_buf_size 1 /* initial value of |os->buf[OBJSTM_BUF]| size */
-# define sup_objstm_buf_size 5000000 /* arbitrary upper hard limit of |os->buf[OBJSTM_BUF]| size */
+# define inf_pdfout_buf_size 16384 /* initial value of |pdf->buf| size */
+# define sup_pdfout_buf_size 8*16384 /* arbitrary upper hard limit of |pdf->buf| size */
+# define inf_objstm_buf_size 1 /* initial value of |os->buf[OBJSTM_BUF]| size */
+# define sup_objstm_buf_size 5000000 /* arbitrary upper hard limit of |os->buf[OBJSTM_BUF]| size */
# define PDF_OS_MAX_OBJS 100 /* maximum number of objects in object stream */
diff --git a/Build/source/texk/web2c/luatexdir/pdf/pdfliteral.w b/Build/source/texk/web2c/luatexdir/pdf/pdfliteral.w
index 3c6b6f6efbf..64a36dc67bf 100644
--- a/Build/source/texk/web2c/luatexdir/pdf/pdfliteral.w
+++ b/Build/source/texk/web2c/luatexdir/pdf/pdfliteral.w
@@ -66,6 +66,9 @@ void pdf_out_literal(PDF pdf, halfword p)
pdf_end_string_nl(pdf);
ps->need_tm = true;
break;
+ case direct_raw:
+ pdf_end_string_nl(pdf);
+ break;
default:
normal_error("pdf backend","bad literal mode");
break;
@@ -114,6 +117,9 @@ void pdf_literal(PDF pdf, str_number s, int literal_mode, boolean warn)
} else if (str_in_cstr(s, "page:", strlen("PDF:"))) {
j = j + (pool_pointer) strlen("page:");
literal_mode = direct_page;
+ } else if (str_in_cstr(s, "raw:", strlen("PDF:"))) {
+ j = j + (pool_pointer) strlen("raw:");
+ literal_mode = direct_raw;
} else {
literal_mode = set_origin;
}
@@ -131,6 +137,9 @@ void pdf_literal(PDF pdf, str_number s, int literal_mode, boolean warn)
pdf_end_string_nl(pdf);
p->need_tm = true;
break;
+ case direct_raw:
+ pdf_end_string_nl(pdf);
+ break;
default:
normal_error("pdf backend","bad literal mode");
break;
diff --git a/Build/source/texk/web2c/luatexdir/pdf/pdfrule.w b/Build/source/texk/web2c/luatexdir/pdf/pdfrule.w
index 2f75b4c761e..df4979088c8 100644
--- a/Build/source/texk/web2c/luatexdir/pdf/pdfrule.w
+++ b/Build/source/texk/web2c/luatexdir/pdf/pdfrule.w
@@ -30,14 +30,22 @@ void pdf_place_rule(PDF pdf, halfword q, scaledpos size, int callback_id)
pdfpos dim;
pdfstructure *p = pdf->pstruct;
scaledpos pos = pdf->posstruct->pos;
+ halfword s = subtype(q);
/* (void) q; */
- if (subtype(q) == box_rule) {
+ if (s >= math_over_rule && s <= math_radical_rule) {
+ if (callback_id == 0) {
+ s = normal_rule;
+ } else {
+ s = user_rule;
+ }
+ }
+ if (s == box_rule) {
pdf_place_form(pdf,q);
- } else if (subtype(q) == image_rule) {
+ } else if (s == image_rule) {
pdf_place_image(pdf,q);
- } else if (subtype(q) == empty_rule) {
+ } else if (s == empty_rule) {
/* place nothing, only take space */
- } else if (subtype(q) == user_rule) {
+ } else if (s == user_rule) {
if (callback_id != 0) {
pdf_goto_pagemode(pdf);
pdf_puts(pdf, "q\n");
diff --git a/Build/source/texk/web2c/luatexdir/tex/commands.w b/Build/source/texk/web2c/luatexdir/tex/commands.w
index e4a269d93d0..b89dadffd1f 100644
--- a/Build/source/texk/web2c/luatexdir/tex/commands.w
+++ b/Build/source/texk/web2c/luatexdir/tex/commands.w
@@ -754,6 +754,8 @@ void initialize_etex_commands(void)
primitive_luatex("mathdisplayskipmode", assign_int_cmd, int_base + math_display_skip_mode_code, int_base);
primitive_luatex("mathscriptsmode", assign_int_cmd, int_base + math_scripts_mode_code, int_base);
primitive_luatex("mathnolimitsmode", assign_int_cmd, int_base + math_nolimits_mode_code, int_base);
+ primitive_luatex("mathrulesmode", assign_int_cmd, int_base + math_rules_mode_code, int_base);
+ primitive_luatex("mathrulesfam", assign_int_cmd, int_base + math_rules_fam_code, int_base);
primitive_luatex("synctex", assign_int_cmd, int_base + synctex_code, int_base);
primitive_etex("currentgrouplevel", last_item_cmd, current_group_level_code, 0);
diff --git a/Build/source/texk/web2c/luatexdir/tex/dumpdata.w b/Build/source/texk/web2c/luatexdir/tex/dumpdata.w
index 85ff55f4e09..c7bb4c2e87d 100644
--- a/Build/source/texk/web2c/luatexdir/tex/dumpdata.w
+++ b/Build/source/texk/web2c/luatexdir/tex/dumpdata.w
@@ -23,7 +23,7 @@
/* we start with 907: the sum of the values of the bytes of "don knuth" */
-#define FORMAT_ID (907+18)
+#define FORMAT_ID (907+20)
#if ((FORMAT_ID>=0) && (FORMAT_ID<=256))
#error Wrong value for FORMAT_ID.
#endif
diff --git a/Build/source/texk/web2c/luatexdir/tex/equivalents.h b/Build/source/texk/web2c/luatexdir/tex/equivalents.h
index b2bda5f605b..27a4f96401b 100644
--- a/Build/source/texk/web2c/luatexdir/tex/equivalents.h
+++ b/Build/source/texk/web2c/luatexdir/tex/equivalents.h
@@ -279,20 +279,22 @@ the |number_regs| \.{\\dimen} registers.
# define math_display_skip_mode_code 88
# define math_scripts_mode_code 89
# define math_nolimits_mode_code 90
-# define synctex_code 91 /* is synctex file generation enabled ? */
-# define shape_mode_code 92
-# define first_valid_language_code 93
-# define hyphenation_bounds_code 94
+# define math_rules_mode_code 91
+# define math_rules_fam_code 92
+# define synctex_code 93 /* is synctex file generation enabled ? */
+# define shape_mode_code 94
+# define first_valid_language_code 95
+# define hyphenation_bounds_code 96
-# define math_option_code 95
+# define math_option_code 97
-# define mathoption_int_base (int_base+96) /* one reserve */
-# define mathoption_int_last (int_base+104)
+# define mathoption_int_base (int_base+98) /* one reserve */
+# define mathoption_int_last (int_base+106)
-# define backend_int_base (int_base+105)
-# define backend_int_last (int_base+129)
+# define backend_int_base (int_base+107)
+# define backend_int_last (int_base+131)
-# define tex_int_pars (130) /* total number of integer parameters */
+# define tex_int_pars (132) /* total number of integer parameters */
# define page_direction_code (tex_int_pars)
# define body_direction_code (tex_int_pars+1)
@@ -639,6 +641,8 @@ extern halfword last_cs_name;
#define disable_space_par int_par(disable_space_code)
#define scripts_mode_par int_par(math_scripts_mode_code)
#define nolimits_mode_par int_par(math_nolimits_mode_code)
+#define math_rules_mode_par int_par(math_rules_mode_code)
+#define math_rules_fam_par int_par(math_rules_fam_code)
#define thin_mu_skip_par glue_par(thin_mu_skip_code)
#define med_mu_skip_par glue_par(med_mu_skip_code)
diff --git a/Build/source/texk/web2c/luatexdir/tex/errors.w b/Build/source/texk/web2c/luatexdir/tex/errors.w
index 1af16ec58ef..cec9a144f1c 100644
--- a/Build/source/texk/web2c/luatexdir/tex/errors.w
+++ b/Build/source/texk/web2c/luatexdir/tex/errors.w
@@ -24,6 +24,7 @@ luafflib.c
@ @c
#include "ptexlib.h"
+#define edit_var "TEXEDIT"
@ When something anomalous is detected, \TeX\ typically does something like this:
$$\vbox{\halign{#\hfil\cr
@@ -232,6 +233,155 @@ void jump_out(void)
close_files_and_terminate();
do_final_end();
}
+@ Here is the function that calls the editor, if one is defined. This
+is loosely based on a similar function in kpathsea, but the calling
+convention is quite different.
+
+@c
+static const_string edit_value = EDITOR;
+
+#if defined(WIN32)
+static int
+Isspace (char c)
+{
+ return (c == ' ' || c == '\t');
+}
+#endif /* WIN32 */
+
+__attribute__ ((noreturn))
+static void luatex_calledit (int baseptr, int linenumber)
+{
+ char *temp, *command, *fullcmd;
+ char c;
+ int sdone, ddone, i;
+ char *filename = makecstring(input_stack[base_ptr].name_field);
+ int fnlength = strlen(filename);
+
+#ifdef WIN32
+ char *fp, *ffp, *env, editorname[256], buffer[256];
+ int cnt = 0;
+ int dontchange = 0;
+#endif
+
+ sdone = ddone = 0;
+
+ /* Close any open input files, since we're going to kill the job. */
+ close_files_and_terminate();
+
+ /* Replace the default with the value of the appropriate environment
+ variable or config file value, if it's set. */
+ temp = kpse_var_value (edit_var);
+ if (temp != NULL)
+ edit_value = temp;
+
+ /* Construct the command string. The `11' is the maximum length an
+ integer might be. */
+ command = xmalloc (strlen (edit_value) + fnlength + 11);
+
+ /* So we can construct it as we go. */
+ temp = command;
+
+#ifdef WIN32
+ fp = editorname;
+ if ((isalpha(*edit_value) && *(edit_value + 1) == ':'
+ && IS_DIR_SEP (*(edit_value + 2)))
+ || (*edit_value == '"' && isalpha(*(edit_value + 1))
+ && *(edit_value + 2) == ':'
+ && IS_DIR_SEP (*(edit_value + 3)))
+ )
+ dontchange = 1;
+#endif
+
+ while ((c = *edit_value++) != 0)
+ {
+ if (c == '%')
+ {
+ switch (c = *edit_value++)
+ {
+ case 'd':
+ if (ddone)
+ FATAL1 ("call_edit: `%%d' appears twice in editor command: `%s'", edit_value);
+ sprintf (temp, "%ld", (long int)linenumber);
+ while (*temp != '\0')
+ temp++;
+ ddone = 1;
+ break;
+
+ case 's':
+ if (sdone)
+ FATAL1 ("call_edit: `%%s' appears twice in editor command: `%s'", edit_value);
+ for (i =0; i < fnlength; i++)
+ *temp++ = filename[i];
+ sdone = 1;
+ break;
+
+ case '\0':
+ *temp++ = '%';
+ /* Back up to the null to force termination. */
+ edit_value--;
+ break;
+
+ default:
+ *temp++ = '%';
+ *temp++ = c;
+ break;
+ }
+ }
+ else {
+#ifdef WIN32
+ if (dontchange)
+ *temp++ = c;
+ else { if(Isspace(c) && cnt == 0) {
+ cnt++;
+ temp = command;
+ *temp++ = c;
+ *fp = '\0';
+ } else if(!Isspace(c) && cnt == 0) {
+ *fp++ = c;
+ } else {
+ *temp++ = c;
+ }
+ }
+#else
+ *temp++ = c;
+#endif
+ }
+ }
+
+ *temp = 0;
+
+#ifdef WIN32
+ if (dontchange == 0) {
+ if(editorname[0] == '.' ||
+ editorname[0] == '/' ||
+ editorname[0] == '\\') {
+ fprintf(stderr, "%s is not allowed to execute.\n", editorname);
+ do_final_end();
+ }
+ env = (char *)getenv("PATH");
+ if(SearchPath(env, editorname, ".exe", 256, buffer, &ffp)==0) {
+ if(SearchPath(env, editorname, ".bat", 256, buffer, &ffp)==0) {
+ fprintf(stderr, "I cannot find %s in the PATH.\n", editorname);
+ do_final_end();
+ }
+ }
+ fullcmd = (char *)xmalloc(strlen(buffer)+strlen(command)+5);
+ strcpy(fullcmd, "\"");
+ strcat(fullcmd, buffer);
+ strcat(fullcmd, "\"");
+ strcat(fullcmd, command);
+ } else
+#endif
+ fullcmd = command;
+
+ /* Execute the command. */
+ if (system (fullcmd) != 0)
+ fprintf (stderr, "! Trouble executing `%s'.\n", command);
+
+ /* Quit, since we found an error. */
+ do_final_end ();
+}
+
@ @c
void error(void)
@@ -325,12 +475,23 @@ void error(void)
#endif
case 'E':
if (base_ptr > 0) {
- tprint_nl("You want to edit file ");
- print(input_stack[base_ptr].name_field);
- tprint(" at line ");
- print_int(line);
- interaction = scroll_mode;
- jump_out();
+ int callback_id = callback_defined(call_edit_callback);
+ if (callback_id>0) {
+ (void)run_callback(callback_id, "Sd->", makecstring(input_stack[base_ptr].name_field), line);
+ jump_out(); /* should not be reached */
+ } else {
+ tprint_nl("You want to edit file ");
+ print(input_stack[base_ptr].name_field);
+ tprint(" at line ");
+ print_int(line);
+ interaction = scroll_mode;
+ if (kpse_init) {
+ luatex_calledit(base_ptr, line);
+ } else {
+ tprint_nl("There is no valid callback defined.");
+ jump_out(); /* should not be reached */
+ }
+ }
}
break;
case 'H':
diff --git a/Build/source/texk/web2c/luatexdir/tex/extensions.w b/Build/source/texk/web2c/luatexdir/tex/extensions.w
index 838c6edcead..f3c66d32ed2 100644
--- a/Build/source/texk/web2c/luatexdir/tex/extensions.w
+++ b/Build/source/texk/web2c/luatexdir/tex/extensions.w
@@ -142,6 +142,8 @@ static void do_extension_pdf(int immediate)
set_pdf_literal_mode(tail, direct_always);
else if (scan_keyword("page"))
set_pdf_literal_mode(tail, direct_page);
+ else if (scan_keyword("raw"))
+ set_pdf_literal_mode(tail, direct_raw);
else
set_pdf_literal_mode(tail, set_origin);
scan_toks(false, true);
diff --git a/Build/source/texk/web2c/luatexdir/tex/mlist.w b/Build/source/texk/web2c/luatexdir/tex/mlist.w
index 753ce840cbc..909128e93c6 100644
--- a/Build/source/texk/web2c/luatexdir/tex/mlist.w
+++ b/Build/source/texk/web2c/luatexdir/tex/mlist.w
@@ -271,7 +271,7 @@ static scaled minimum_operator_size(int var)
the backward compatibility code, and it means that we can't raise an error here.
@c
-static scaled radical_rule(int var)
+static scaled radical_rule_par(int var)
{
scaled a = get_math_param(math_param_radical_rule, var);
return a;
@@ -978,10 +978,16 @@ static pointer math_clone(pointer q)
that eventually contains it.
@c
-static pointer do_fraction_rule(scaled t, pointer att)
+static pointer do_fraction_rule(scaled t, pointer att, halfword some_rule, halfword cur_size, halfword cur_fam)
{
pointer p; /* the new node */
- p = new_rule(normal_rule);
+ if (math_rules_mode_par) {
+ p = new_rule(some_rule);
+ rule_math_size(p) = cur_size;
+ rule_math_font(p) = fam_fnt(cur_fam, cur_size);
+ } else {
+ p = new_rule(normal_rule);
+ }
rule_dir(p) = math_direction_par;
height(p) = t;
depth(p) = 0;
@@ -994,13 +1000,13 @@ static pointer do_fraction_rule(scaled t, pointer att)
fraction rule of thickness |t| under additional space of height |ht|.
@c
-static pointer overbar(pointer b, scaled k, scaled t, scaled ht, pointer att)
+static pointer overbar(pointer b, scaled k, scaled t, scaled ht, pointer att, halfword index, halfword cur_size, halfword cur_fam)
{
pointer p, q; /* nodes being constructed */
p = new_kern(k);
reset_attributes(p, att);
couple_nodes(p,b);
- q = do_fraction_rule(t, att);
+ q = do_fraction_rule(t, att, index, cur_size, cur_fam);
couple_nodes(q,p);
p = new_kern(ht);
reset_attributes(p, att);
@@ -1796,17 +1802,17 @@ illustrate the general setup of such procedures, let's begin with a
couple of simple ones.
@c
-static void make_over(pointer q, int cur_style)
+static void make_over(pointer q, int cur_style, int cur_size, int cur_fam)
{
pointer p;
p = overbar(clean_box(nucleus(q), cramped_style(cur_style), cur_style),
overbar_vgap(cur_style), overbar_rule(cur_style),
- overbar_kern(cur_style), node_attr(nucleus(q)));
+ overbar_kern(cur_style), node_attr(nucleus(q)), math_over_rule, cur_size, cur_fam);
math_list(nucleus(q)) = p;
type(nucleus(q)) = sub_box_node;
}
-static void make_under(pointer q, int cur_style)
+static void make_under(pointer q, int cur_style, int cur_size, int cur_fam)
{
pointer p, x, y, r; /* temporary registers for box construction */
scaled delta; /* overall height plus depth */
@@ -1814,7 +1820,7 @@ static void make_under(pointer q, int cur_style)
p = new_kern(underbar_vgap(cur_style));
reset_attributes(p, node_attr(q));
couple_nodes(x,p);
- r = do_fraction_rule(underbar_rule(cur_style), node_attr(q));
+ r = do_fraction_rule(underbar_rule(cur_style), node_attr(q), math_under_rule, cur_size, cur_fam);
couple_nodes(p,r);
y = vpackage(x, 0, additional, max_dimen, math_direction_par);
reset_attributes(y, node_attr(q));
@@ -1878,7 +1884,7 @@ static void make_radical(pointer q, int cur_style)
scaled delta, clr, theta, h; /* dimensions involved in the calculation */
x = clean_box(nucleus(q), cramped_style(cur_style), cur_style);
clr = radical_vgap(cur_style);
- theta = radical_rule(cur_style);
+ theta = radical_rule_par(cur_style);
if (theta == undefined_math_parameter) {
/* a real radical */
theta = fraction_rule(cur_style);
@@ -1912,7 +1918,7 @@ static void make_radical(pointer q, int cur_style)
}
shift_amount(y) = (height(y) - theta) - (height(x) + clr);
h = depth(y) + height(y);
- p = overbar(x, clr, theta, radical_kern(cur_style), node_attr(y));
+ p = overbar(x, clr, theta, radical_kern(cur_style), node_attr(y), math_radical_rule, cur_size, small_fam(left_delimiter(q)));
couple_nodes(y,p);
if (degree(q) != null) {
scaled wr, br, ar;
@@ -2559,7 +2565,7 @@ static void make_fraction(pointer q, int cur_style)
p = new_kern((shift_up - depth(x)) - (height(z) - shift_down));
couple_nodes(p,z);
} else {
- y = do_fraction_rule(thickness(q), node_attr(q));
+ y = do_fraction_rule(thickness(q), node_attr(q), math_fraction_rule, cur_size, math_rules_fam_par);
p = new_kern((math_axis_size(cur_size) - delta) - (height(z) - shift_down));
reset_attributes(p, node_attr(q));
couple_nodes(y,p);
@@ -2656,8 +2662,9 @@ static scaled make_op(pointer q, int cur_style)
math_character(nucleus(q)) = c;
}
delta = char_italic(cur_f, cur_c);
+printf("delta %i\n",delta);
x = clean_box(nucleus(q), cur_style, cur_style);
- if (delta != null) {
+ if (delta != 0) {
if (do_new_math(cur_f)) {
/* we never added italic correction */
} else if ((subscr(q) != null) && (subtype(q) != op_noad_type_limits)) {
@@ -2712,8 +2719,8 @@ static scaled make_op(pointer q, int cur_style)
*/
switch (mode) {
case 0 :
- /* as with limits */
- make_scripts(q, p, 0, cur_style, half(delta), -half(delta));
+ /* full bottom correction */
+ make_scripts(q, p, 0, cur_style, 0, -delta);
break;
case 1 :
/* MathConstants driven */
@@ -2723,22 +2730,21 @@ static scaled make_op(pointer q, int cur_style)
case 2 :
/* no correction */
make_scripts(q, p, 0, cur_style, 0, 0);
- break;
+ break ;
case 3 :
/* half bottom correction */
make_scripts(q, p, 0, cur_style, 0, -half(delta));
break;
case 4 :
- /* full bottom correction */
- make_scripts(q, p, 0, cur_style, 0, -delta);
+ /* half bottom and top correction */
+ make_scripts(q, p, 0, cur_style, half(delta), -half(delta));
break;
default :
- /* half bottom and top correction */
if (mode > 15) {
/* for quickly testing values */
make_scripts(q, p, 0, cur_style, 0, -round_xn_over_d(delta, mode, 1000));
} else {
- make_scripts(q, p, 0, cur_style, half(delta), -half(delta));
+ make_scripts(q, p, 0, cur_style, 0, 0);
}
break;
}
@@ -3913,10 +3919,10 @@ void mlist_to_hlist(pointer mlist, boolean penalties, int cur_style)
}
break;
case over_noad_type:
- make_over(q, cur_style);
+ make_over(q, cur_style, cur_size, math_rules_fam_par);
break;
case under_noad_type:
- make_under(q, cur_style);
+ make_under(q, cur_style, cur_size, math_rules_fam_par);
break;
case vcenter_noad_type:
make_vcenter(q);
diff --git a/Build/source/texk/web2c/luatexdir/tex/texfileio.w b/Build/source/texk/web2c/luatexdir/tex/texfileio.w
index c222eef975b..2281de12c4c 100644
--- a/Build/source/texk/web2c/luatexdir/tex/texfileio.w
+++ b/Build/source/texk/web2c/luatexdir/tex/texfileio.w
@@ -170,12 +170,12 @@ char *luatex_find_file(const char *s, int callback_index)
case find_data_file_callback:
ftemp = find_in_output_directory(s);
if (!ftemp)
- ftemp = kpse_find_file(s, kpse_tex_format, 0);
+ ftemp = kpse_find_file(s, kpse_tex_format, 1);
break;
case find_font_file_callback:
- ftemp = kpse_find_file(s, kpse_ofm_format, 0);
+ ftemp = kpse_find_file(s, kpse_ofm_format, 1);
if (ftemp == NULL)
- ftemp = kpse_find_file(s, kpse_tfm_format, 0);
+ ftemp = kpse_find_file(s, kpse_tfm_format, 1);
break;
case find_vf_file_callback:
ftemp = kpse_find_file(s, kpse_ovf_format, 0);
diff --git a/Build/source/texk/web2c/luatexdir/tex/texnodes.h b/Build/source/texk/web2c/luatexdir/tex/texnodes.h
index 6650d17f410..943a347554d 100644
--- a/Build/source/texk/web2c/luatexdir/tex/texnodes.h
+++ b/Build/source/texk/web2c/luatexdir/tex/texnodes.h
@@ -261,6 +261,10 @@ typedef enum {
image_rule,
empty_rule,
user_rule,
+ math_over_rule,
+ math_under_rule,
+ math_fraction_rule,
+ math_radical_rule,
} rule_subtypes;
# define rule_node_size 8
@@ -270,6 +274,9 @@ typedef enum {
# define synctex_tag_rule(a) vinfo((a)+7)
# define synctex_line_rule(a) vlink((a)+7)
+# define rule_math_size rule_index
+# define rule_math_font rule_transform
+
# define mark_node_size 3
# define mark_ptr(a) vlink((a)+2)
# define mark_class(a) vinfo((a)+2)
@@ -716,6 +723,7 @@ typedef enum {
set_origin = 0,
direct_page,
direct_always,
+ direct_raw,
scan_special,
} ctm_transform_modes;
diff --git a/Build/source/texk/web2c/luatexdir/tex/texnodes.w b/Build/source/texk/web2c/luatexdir/tex/texnodes.w
index c242577404f..3a368c82336 100644
--- a/Build/source/texk/web2c/luatexdir/tex/texnodes.w
+++ b/Build/source/texk/web2c/luatexdir/tex/texnodes.w
@@ -268,7 +268,7 @@ const char *node_subtypes_kern[] = {
"fontkern", "userkern", "accentkern", "italiccorrection", NULL
};
const char *node_subtypes_rule[] = {
- "normal", "box", "image", "empty", "user", NULL
+ "normal", "box", "image", "empty", "user", "over", "under", "fraction", "radical", NULL
};
const char *node_subtypes_glyph[] = {
"character", "glyph", "ligature", "ghost", "left", "right", NULL
diff --git a/Build/source/texk/web2c/luatexdir/tex/textoken.w b/Build/source/texk/web2c/luatexdir/tex/textoken.w
index 8f44f686641..7b781fc082b 100644
--- a/Build/source/texk/web2c/luatexdir/tex/textoken.w
+++ b/Build/source/texk/web2c/luatexdir/tex/textoken.w
@@ -2437,6 +2437,8 @@ static int do_feedback_pdf(halfword c)
cur_val = direct_always;
else if (scan_keyword("page"))
cur_val = direct_page;
+ else if (scan_keyword("raw"))
+ cur_val = direct_raw;
else
cur_val = set_origin;
save_scanner_status = scanner_status;