From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from scc-mailout-kit-01.scc.kit.edu (scc-mailout-kit-01.scc.kit.edu [129.13.231.81]) by fantadrom.bsd.lv (OpenSMTPD) with ESMTP id b914a357 for ; Wed, 21 Jun 2017 13:09:33 -0500 (EST) Received: from asta-nat.asta.uni-karlsruhe.de ([172.22.63.82] helo=hekate.usta.de) by scc-mailout-kit-01.scc.kit.edu with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (envelope-from ) id 1dNk4J-0006i8-BN; Wed, 21 Jun 2017 20:09:32 +0200 Received: from donnerwolke.usta.de ([172.24.96.3]) by hekate.usta.de with esmtp (Exim 4.77) (envelope-from ) id 1dNk4I-0005PL-Gv; Wed, 21 Jun 2017 20:09:30 +0200 Received: from athene.usta.de ([172.24.96.10]) by donnerwolke.usta.de with esmtp (Exim 4.84_2) (envelope-from ) id 1dNk4I-00027Q-Cp; Wed, 21 Jun 2017 20:09:30 +0200 Received: from localhost (athene.usta.de [local]) by athene.usta.de (OpenSMTPD) with ESMTPA id e3e6944e; Wed, 21 Jun 2017 20:09:30 +0200 (CEST) Date: Wed, 21 Jun 2017 20:09:30 +0200 From: Ingo Schwarze To: "Anthony J. Bentley" Cc: tech@mdocml.bsd.lv Subject: Re: eqn(7) doesn't distinguish mathematical words Message-ID: <20170621180930.GB51095@athene.usta.de> References: <52112.1497933403@cathet.us> X-Mailinglist: mdocml-tech Reply-To: tech@mdocml.bsd.lv MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <52112.1497933403@cathet.us> User-Agent: Mutt/1.6.2 (2016-07-01) Hi Anthony, Anthony J. Bentley wrote on Mon, Jun 19, 2017 at 10:36:43PM -0600: > From the Plan 9 eqn(1) manual: > "Mathematical words like sin, cos, log are made Roman automatically." Implemented with the commit appended below. > The exception proves the rule, which is that eqn(1) italicizes words > in general. That part is still open. Thanks for the report, Ingo Log Message: ----------- Recognize well-known functions names (the same that Heirloom recognizes, which includes those recognized by groff) and wrap them in a roman box unless they already are in roman context. 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.63 retrieving revision 1.64 diff -Leqn.c -Leqn.c -u -p -r1.63 -r1.64 --- eqn.c +++ eqn.c @@ -1,7 +1,7 @@ /* $Id$ */ /* * Copyright (c) 2011, 2014 Kristaps Dzonsons - * Copyright (c) 2014, 2015 Ingo Schwarze + * Copyright (c) 2014, 2015, 2017 Ingo Schwarze * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -80,9 +80,10 @@ enum eqn_tok { EQN_TOK_TDEFINE, EQN_TOK_NDEFINE, EQN_TOK_UNDEF, - EQN_TOK_EOF, EQN_TOK_ABOVE, - EQN_TOK__MAX + EQN_TOK__MAX, + EQN_TOK_FUNC, + EQN_TOK_EOF }; static const char *eqn_toks[EQN_TOK__MAX] = { @@ -130,10 +131,16 @@ static const char *eqn_toks[EQN_TOK__MAX "tdefine", /* EQN_TOK_TDEFINE */ "ndefine", /* EQN_TOK_NDEFINE */ "undef", /* EQN_TOK_UNDEF */ - NULL, /* EQN_TOK_EOF */ "above", /* EQN_TOK_ABOVE */ }; +static const char *const eqn_func[] = { + "acos", "acsc", "and", "arc", "asec", "asin", "atan", + "cos", "cosh", "coth", "csc", "det", "exp", "for", + "if", "lim", "ln", "log", "max", "min", + "sec", "sin", "sinh", "tan", "tanh", "Im", "Re", +}; + enum eqn_symt { EQNSYM_alpha, EQNSYM_beta, @@ -498,12 +505,12 @@ eqn_tok_parse(struct eqn_node *ep, char size_t i, sz; int quoted; - if (NULL != p) + if (p != NULL) *p = NULL; quoted = ep->data[ep->cur] == '"'; - if (NULL == (start = eqn_nexttok(ep, &sz))) + if ((start = eqn_nexttok(ep, &sz)) == NULL) return EQN_TOK_EOF; if (quoted) { @@ -512,17 +519,18 @@ eqn_tok_parse(struct eqn_node *ep, char return EQN_TOK__MAX; } - for (i = 0; i < EQN_TOK__MAX; i++) { - if (NULL == eqn_toks[i]) - continue; + for (i = 0; i < EQN_TOK__MAX; i++) if (STRNEQ(start, sz, eqn_toks[i], strlen(eqn_toks[i]))) - break; - } + return i; - if (i == EQN_TOK__MAX && NULL != p) + if (p != NULL) *p = mandoc_strndup(start, sz); - return i; + for (i = 0; i < sizeof(eqn_func)/sizeof(*eqn_func); i++) + if (STRNEQ(start, sz, eqn_func[i], strlen(eqn_func[i]))) + return EQN_TOK_FUNC; + + return EQN_TOK__MAX; } static void @@ -1067,15 +1075,26 @@ this_tok: * TODO: make sure we're not in an open subexpression. */ return ROFF_EQN; - default: - assert(tok == EQN_TOK__MAX); - assert(NULL != p); + case EQN_TOK_FUNC: + case EQN_TOK__MAX: + assert(p != NULL); /* * If we already have something in the stack and we're * in an expression, then rewind til we're not any more. */ 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; + } + } cur = eqn_box_alloc(ep, parent); cur->type = EQN_TEXT; for (i = 0; i < EQNSYM__MAX; i++) @@ -1096,6 +1115,8 @@ this_tok: parent->args == parent->expectargs) parent = parent->parent; break; + default: + abort(); } goto next_tok; } -- To unsubscribe send an email to tech+unsubscribe@mdocml.bsd.lv