From: Ingo Schwarze <schwarze@usta.de>
To: "Anthony J. Bentley" <anthony@anjbe.name>
Cc: tech@mdocml.bsd.lv
Subject: Re: MathML and <mo>, <mi>, <mn>
Date: Wed, 21 Jun 2017 22:59:53 +0200 [thread overview]
Message-ID: <20170621205953.GC51095@athene.usta.de> (raw)
In-Reply-To: <45090.1497945869@cathet.us>
Hi Anthony,
Anthony J. Bentley wrote on Tue, Jun 20, 2017 at 02:04:29AM -0600:
> - mandoc only uses <mi>, not <mo> or <mn>.
> - mandoc will transform a '-' into U+2212, but only when it's not
> directly adjacent to a digit.
These are still open.
> - In Firefox, <mi> only seems to italicize single letters.
>
> It looks like adjacent variables, numbers, and operators should be split:
> - 'x=' should become <mi>x</mi><mo>=</mo>
> - '-b' should become <mo>−</mo><mi>b</mi>
> - '-4ac' should become <mo>−</mo><mn>4</mn><mi>a</mi><mi>c</mi>
>
> The MathML standard says (MathML 3.0 2e # 3.2.33) that "sin" is
> appropriately marked up with <mi>. So <mi>sin</mi> should be enough to
> correctly render eqn's mathematical words. It seems that for
> non-mathematical words to be rendered with italics by default, they
> should be rendered with a <mi> per letter?
The following commit implements the parser side parts needed to fix
that. Some formatter parts are still open.
Thanks for the analysis,
Ingo
Log Message:
-----------
Outside explicit font context, give every letter its own box.
The formatters need this to correctly select fonts.
Missing feature reported by bentley@.
Modified Files:
--------------
mdocml:
eqn.c
Revision Data
-------------
Index: eqn.c
===================================================================
RCS file: /home/cvs/mdocml/mdocml/eqn.c,v
retrieving revision 1.65
retrieving revision 1.66
diff -Leqn.c -Leqn.c -u -p -r1.65 -r1.66
--- eqn.c
+++ eqn.c
@@ -20,6 +20,7 @@
#include <sys/types.h>
#include <assert.h>
+#include <ctype.h>
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
@@ -718,8 +719,8 @@ static enum rofferr
eqn_parse(struct eqn_node *ep, struct eqn_box *parent)
{
char sym[64];
- struct eqn_box *cur;
- const char *start;
+ struct eqn_box *cur, *fontp, *nbox;
+ const char *cp, *cpn, *start;
char *p;
size_t sz;
enum eqn_tok tok, subtok;
@@ -1092,21 +1093,51 @@ this_tok:
*/
while (parent->args == parent->expectargs)
parent = parent->parent;
- if (tok == EQN_TOK_FUNC) {
- for (cur = parent; cur != NULL; cur = cur->parent)
- if (cur->font != EQNFONT_NONE)
- break;
- if (cur == NULL || cur->font != EQNFONT_ROMAN) {
- parent = eqn_box_alloc(ep, parent);
- parent->type = EQN_LISTONE;
- parent->font = EQNFONT_ROMAN;
- parent->expectargs = 1;
- }
+ /*
+ * Wrap well-known function names in a roman box,
+ * unless they already are in roman context.
+ */
+ for (fontp = parent; fontp != NULL; fontp = fontp->parent)
+ if (fontp->font != EQNFONT_NONE)
+ break;
+ if (tok == EQN_TOK_FUNC &&
+ (fontp == NULL || fontp->font != EQNFONT_ROMAN)) {
+ parent = fontp = eqn_box_alloc(ep, parent);
+ parent->type = EQN_LISTONE;
+ parent->font = EQNFONT_ROMAN;
+ parent->expectargs = 1;
}
cur = eqn_box_alloc(ep, parent);
cur->type = EQN_TEXT;
cur->text = p;
-
+ /*
+ * If not inside any explicit font context,
+ * give every letter its own box.
+ */
+ if (fontp == NULL && *p != '\0') {
+ cp = p;
+ for (;;) {
+ cpn = cp + 1;
+ if (*cp == '\\')
+ mandoc_escape(&cpn, NULL, NULL);
+ if (*cpn == '\0')
+ break;
+ if (isalpha((unsigned char)*cp) == 0 &&
+ isalpha((unsigned char)*cpn) == 0) {
+ cp = cpn;
+ continue;
+ }
+ nbox = eqn_box_alloc(ep, parent);
+ nbox->type = EQN_TEXT;
+ nbox->text = mandoc_strdup(cpn);
+ p = mandoc_strndup(cur->text,
+ cpn - cur->text);
+ free(cur->text);
+ cur->text = p;
+ cur = nbox;
+ cp = nbox->text;
+ }
+ }
/*
* Post-process list status.
*/
--
To unsubscribe send an email to tech+unsubscribe@mdocml.bsd.lv
next prev parent reply other threads:[~2017-06-21 20:59 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-06-20 8:04 Anthony J. Bentley
2017-06-21 20:59 ` Ingo Schwarze [this message]
2017-06-23 2:57 ` Ingo Schwarze
2017-06-23 3:22 ` Anthony J. Bentley
2017-06-23 21:24 ` Ingo Schwarze
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20170621205953.GC51095@athene.usta.de \
--to=schwarze@usta.de \
--cc=anthony@anjbe.name \
--cc=tech@mdocml.bsd.lv \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).