> Hans Hagen:
> mfunction will stay as it is also needed for tagged pdf and exporting
> (basically it's an apply math function thing) so if something else is
> needed another name/mechanism have to be made (with appropriate tagging)
> the label itself is a special case as it's optional (and is just there
> for cultural differences as not all countries use the english names)
> so, \rho_{\mathlabel{air}} is something different then, some kind of
> multi-character variable?
Actually no, it has nothing to do with ConTeXt label texts (that is why I
removed the word 'text' in it to avoid the confusion), \mathlabel was just
a name that I gave to encompass two different things that are usually
typeset the same way (upright): the names of functions (\mfunction) and the
names often used in the subscripts of variables. But after some thought and
your new suggestion (\mtext) for the latter case, I find that my
'mathlabel' is misleading and that it is better for the user to keep them
separate (with \mfunction AND \mtext), and it gives him more control.
> Hans Hagen:
>
\unexpanded\def\mtext#1{\text{\usemathematicsstyleandcolor\c!textstyle\c!textcolor#1}}
> which can be used as:
> $x^{\mtext{effe}}$
> and obeys
> \setupmathematics[textstyle=bold, textcolor=darkgreen]
Perfect! Not only \mtext is short but also very meaningful and symmetrical
with \mfunction, therefore easy to memorize. I totally agree with that new
definition.
QUESTION 1. — Did you include the \text command as well in the definition
of your new \mfunction (like below)?
1st DEFINITION of \mfunction.
———————————————————————
\unexpanded\def\mfunction#1{\text{\usemathematicsstyleandcolor\c!functionstyle\c!functioncolor#1}}
———————————————————————
Because like in \mtext, the \text command is ESSENTIAL (for the function
names to have the mathcodes, kerning and ligatures of the text mode instead
of the ones of the math mode).
> Hans Hagen:
> next beta: when one of the stylealternatives text mode else mathmode
> (default nothing == mathupright)
> Aditya Mahajan:
> The default should be \mathupright (as is the case in amstex
and latex, and probably also plaintex).
No, I strongly disagree. Yes it should be upright by default, but it should
always be in TEXT mode, even by default, that is why I used the \text
command in the definition of \mfunction. \mathupright in math mode doesn't
solve the problems of mathcodes, kerning and ligatures (if you want call
your function 'AVL' or 'low-frequency' for instance, the result is terrible
with \mathupright: the space between A and V is too large and the hyphen
between w and f becomes a minus sign binary operator—try
$\mathupright{AVL}$ and $\mathupright{low-frequency}$). \text{\rm\tf} does.
Consequently \rm\tf should be the default functionstyle and textstyle in
\setupmathematics. (And Aditya, don't forget that \mathupright is just a
macro for \rm\tf in math mode.)
So now, let us see what the user have to write to get a math function and a
math text (usually used as the subscript of a variable):
———————————————————————
\setupmathematics[functionstyle=bold, functioncolor=red, textstyle=bold,
textcolor=green]
\starttext
$\mathnolop{\mfunction{Arsinh}} x\ \text{and}\ n_{\mtext{air}}$.
\stoptext
———————————————————————
The syntax is okay but a bit complicated since the symmetry is not perfect
(\mtext vs \mathnolop{\mfunction}). Symmetry is important in a user
interface so I think the user expects simply \mtext and \mfunction (not
\mathnolop{\mfunction}). Therefore we need to wrap this \mathnolop in
\mfunction. And the possibility to choose \mathop (synonym: \mathlimop)
instead of \mathnolop—which should be the default—should be given to the
user with an optional argument. To keep it consistent with the ConTeXt
syntax, the optional argument should be [op] (synonym: [limop]). So let us
redefine our \mfunction.
2nd DEFINITION of \mfunction.
———————————————————————
\unexpanded\def\mfunction{\dosingleempty\domfunction}
\def\domfunction[#1]#2%
{\iffirstargument
\doifelse{#1}{op}{\normalmathop{\text{\usemathematicsstyleandcolor\c!functionstyle\c!functioncolor#2}}}{\doifelse{#1}{limop}{\normalmathop{\text{\usemathematicsstyleandcolor\c!functionstyle\c!functioncolor#2}}}{\normalmathop{\text{\usemathematicsstyleandcolor\c!functionstyle\c!functioncolor#2}}\nolimits}}
\else
\normalmathop{\text{\usemathematicsstyleandcolor\c!functionstyle\c!functioncolor#2}}\nolimits
\fi}
———————————————————————
Notice in that new definition that we use \normalmathop instead of \mathop
because the \mathop in ConTeXt uses a modified version of the normal
\mathop (the latter is renamed \normalmathop by ConTeXt) that converts the
serif font style command \rm to the math font style command \mf, which as a
result makes \rm without effect in \setupmathematics[functionstyle=\rm] as
I came to realize after some testing. Indeed, ConTeXt has currently the
following lines in math-ini.mkiv:
\let\normalmathop\mathop
\unexpanded\def\mathop
{\normalmathop
\bgroup
\let\rm\mf
\let\nexttoken=}
QUESTION 2. — By the way, why this conversion of \rm to \mf inside \mathop
atoms (\let\rm\mf)?
So with the new definition for \mfunction, the user can now simply and
elegantly write this:
———————————————————————
\setupmathematics[functionstyle=bold, functioncolor=red, textstyle=bold,
textcolor=green]
\starttext
$\mfunction{Arsinh} x\ \text{and}\ n_{\mtext{air}}$.
\stoptext
———————————————————————
With that new \mfunction, ConTeXt users now have an equivalent macro to the
LaTeX \operatorname macro of the amsopn package, which I think was very
missing.
Now, let us look at how the user can DEFINE his math function.
A. With the 1st definition of \mfunction (the one that doesn't include
\mathnolop or \mathop), the user can write this (notice again that we use
\normalmathop \nolimits instead of \mathnolop—or equivalently [nolop]—to
avoid the conversion of \rm to \mf that would make
\setupmathematics[functionstyle=\rm] without effect):
———————————————————————
\definemathcommand[arsinh]{\normalmathop{\mfunction{Arsinh}}\nolimits}
\setupmathematics[functionstyle=bold, functioncolor=red, textstyle=bold,
textcolor=green]
\starttext
$\arsinh x\ \text{and}\ n_{\mtext{air}}$.
\stoptext
———————————————————————
or, alternatively this (if the user wants also to define a label text for
his function):
———————————————————————
\setupmathlabeltext[arsinh=Arsinh]
\definemathcommand[arsinh]{\normalmathop{\mfunctionlabeltext{arsinh}}\nolimits}
\setupmathematics[functionstyle=bold, functioncolor=red, textstyle=bold,
textcolor=green]
\starttext
$\arsinh x\ \text{and}\ n_{\mtext{air}}$.
\stoptext
———————————————————————
assuming that \mfunctionlabeltext is defined the following way (which I
think is already the case in the last beta).
1st DEFINITION of \mfunctionlabeltext.
———————————————————————
\unexpanded\def\mfunctionlabeltext#1{\mfunction{\mathlabeltext{#1}}}
———————————————————————
Thus with the 1st definition of \mfunction (and \mfunctionlabeltext), the
definition of a math function for the user is a bit complicated (he has to
write \normalmathop \nolimits in addition to \mfunction or
\mfunctionlabeltext, unless Hans decides to remove \let\rm\mf from his
redefinition of \mathop in which case the user just has to add the optional
argument [nolop] instead of the verbose and hard to remember \normalmathop
\nolimits).
B. With the 2nd definition of \mfunction (the one that includes \mathnolop
or \mathop), the user can write this:
———————————————————————
\definemathcommand[arsinh]{\mfunction{Arsinh}}
\setupmathematics[functionstyle=bold, functioncolor=red, textstyle=bold,
textcolor=green]
\starttext
$\arsinh x\ \text{and}\ n_{\mtext{air}}$.
\stoptext
———————————————————————
or, alternatively this (if the user wants also to define a label text for
his function):
———————————————————————
\setupmathlabeltext[arsinh=Arsinh]
\definemathcommand[arsinh]{\mfunctionlabeltext{arsinh}}
\setupmathematics[functionstyle=bold, functioncolor=red, textstyle=bold,
textcolor=green]
\starttext
$\arsinh x\ \text{and}\ n_{\mtext{air}}$.
\stoptext
———————————————————————
assuming that \mfunctionlabeltext is defined the following way (the
additional optional argument is for that of \mfunction).
2nd DEFINITION of \mfunctionlabeltext.
———————————————————————
\unexpanded\def\mfunctionlabeltext{\dosingleempty\domfunctionlabeltext}
\def\domfunctionlabeltext[#1]#2%
{\iffirstargument
\mfunction[#1]{\mathlabeltext{#2}}
\else
\mfunction{\mathlabeltext{#2}}
\fi}
———————————————————————
Thus with the 2nd definition of \mfunction (and \mfunctionlabeltext), the
definition of a math function for the user is easier (no need to write
\normalmathop \nolimits since it is taken into account in \mfunction, and
Hans doesn't have to remove \let\rm\mf from his redefinition of \mathop).
It confirms that the 2nd definition of \mfunction (and \mfunctionlabeltext)
is the way to go.
However the command \mfunctionlabeltext is unnecessary and inconsistent
with the other ConTeXt command \labeltext since it has a style attached to
it, so may confuse the user. The direct command \mathlabeltext (the math
equivalent of \labeltext) should be preferred. Therefore I think Hans
should remove \mfunctionlabeltext from math-ini.mkiv and the user should
use \mfunction{\mathlabeltext } when needed:
———————————————————————
\setupmathlabeltext[arsinh=Arsinh]
\definemathcommand[arsinh]{\mfunction{\mathlabeltext{arsinh}}}
\setupmathematics[functionstyle=bold, functioncolor=red, textstyle=bold,
textcolor=green]
\starttext
$\arsinh x\ \text{and}\ n_{\mtext{air}}$.
\stoptext
———————————————————————
But we can go a little further in user friendliness by wrapping the
\mfunction in a new macro, that we should name \definemathfunction to be
consistent with the other macros (\definemathcommand, \definemathsymbol,
\definemathcharacter, etc.). The possibility to choose between \mathop
(synonym: \mathlimop) and \mathnolop—which should be the default—is once
more given to the user with the optional argument [op] (synonym: [limop])
to be consistent with the ConTeXt syntax. The macro is defined as follows.
DEFINITION of \definemathfunction.
———————————————————————
\unexpanded\def\definemathfunction{\dodoubleempty\dodefinemathfunction}
\def\dodefinemathfunction[#1][#2]#3%
{\ifsecondargument
\definemathcommand[#1]{\mfunction[#2]{#3}}
\else
\definemathcommand[#1]{\mfunction{#3}}
\fi}
———————————————————————
Notice that we use again \normalmathop for the same reasons as before. That
new \definemathfunction macro now allows the user to write this:
———————————————————————
\definemathfunction[arsinh]{arsinh}
\setupmathematics[functionstyle=bold, functioncolor=red, textstyle=bold,
textcolor=green]
\starttext
$\arsinh x\ \text{and}\ n_{\mtext{air}}$.
\stoptext
———————————————————————
or, alternatively this (if the user wants also to define a label text for
his function):
———————————————————————
\setupmathlabeltext[arsinh=Arsinh]
\definemathfunction[arsinh]{\mathlabeltext{arsinh}}
\setupmathematics[functionstyle=bold, functioncolor=red, textstyle=bold,
textcolor=green]
\starttext
$\arsinh x\ \text{and}\ n_{\mtext{air}}$.
\stoptext
———————————————————————
With that new \definemathfunction, ConTeXt users now have an equivalent
macro to the LaTeX \DeclareMathOperator macro of the amsopn package, which
I think was very missing as well.
The math functions defined in math-def.mkiv should of course use
\mfunction{\mathlabeltext } instead of the old \mfunctionlabeltext, or the
new macro \definemathfunction:
———————————————————————
\definemathcommand[cos]{\mfunction{\mathlabeltext{cos}}} % Or
\definemathcommand[cos]{\mfunction[nolop]{\mathlabeltext{cos}}}, it is the
same.
\definemathcommand[det]{\mfunction[limop]{\mathlabeltext{det}}}
\definemathcommand[diff]{\normalmathop{\text{\mathfunctionstyle
d}}\mathopen{}}
%etc.
———————————————————————
or
———————————————————————
\definemathfunction[cos]{\mathlabeltext{cos}} % Or
\definemathfunction[cos][nolop]{\mathlabeltext{cos}}, it is the same.
\definemathfunction[det][limop]{\mathlabeltext{det}}
\definemathcommand[diff]{\normalmathop{\text{\mathfunctionstyle
d}}\mathopen{}} % It is a special function so it should still be treated
with the more general \definemathcommand.
%etc.
———————————————————————
Notice the removal of [nolop] and [limop] which are already present in
\mfunction and \mfunction[limop] respectively (since we now use the 2nd
definition of \mfunction for all the reasons we gave above).
Now before concluding, here is a little example illustrating the new
mechanism of Hans (functionstyle, functioncolor, textstyle and textcolor
keys in \setupmathematics) of which I improved the consistency and
simplicity of the related macros (\mtext and \mfunction, and the new
\definemathfunction) in practical use. In this example as I still don't
have access to the last beta I didn't use the new keys of \setupmathematics
(functionstyle, textstyle) but local definitions. For Aditya, this time the
given example works correctly contrary to my last post where I realized
afterwards that \rm was not working in \setupmathematics because of the use
of \mathop which converts it to \mf (hence my use of \normalmathop in this
post as explained earlier).
EXAMPLE.
———————————————————————
\define\mathtextstyle{\rm\tf}
\define[1]\mtext{\text{\mathtextstyle #1}}
\define\mfunction{\dosingleempty\domfunction}
\def\domfunction[#1]#2{%
\iffirstargument
\doifelse{#1}{op}{\normalmathop{\text{\mathfunctionstyle
#2}}}{\doifelse{#1}{limop}{\normalmathop{\text{\mathfunctionstyle
#2}}}{\normalmathop{\text{\mathfunctionstyle #2}}\nolimits}}
\else
\normalmathop{\text{\mathfunctionstyle #2}}\nolimits
\fi}
\define\mathfunctionstyle{\rm\tf}
\define\definemathfunction{\dodoubleempty\dodefinemathfunction}
\def\dodefinemathfunction[#1][#2]#3{%
\ifsecondargument
\definemathcommand[#1]{\mfunction[#2]{#3}}
\else
\definemathcommand[#1]{\mfunction{#3}}
\fi}
\setupmathlabeltext[arsinh=Arsinh]
\definemathfunction[arsinh]{\mathlabeltext{arsinh}}
\starttext
\startbuffer
$\arsinh x\ \text{and}\ n_{\mtext{air}}$
\stopbuffer
\defineparagraphs[myparagraphs][n=5, rule=on]
\setupparagraphs[myparagraphs][1][width=\dimexpr 0.3\textwidth\relax]
\setupparagraphs[myparagraphs][2][width=\dimexpr 0.3\textwidth\relax]
\setupparagraphs[myparagraphs][3][width=\dimexpr 0.3\textwidth\relax]
\section{{\tt \backslash setupmathematics[functionstyle=\backslash
rm\backslash tf,textstyle=\backslash rm\backslash tf]} (default setup)}
\define\mathfunctionstyle{\rm\tf}
\define\mathtextstyle{\rm\tf}
\startmyparagraphs
\switchtobodyfont[rm]
{\tt \backslash switchtobodyfont[rm]}\crlf
{\tt \backslash tf}: {\tf \getbuffer}\par
{\tt \backslash it}: {\it \getbuffer}\par
{\tt \backslash sl}: {\sl \getbuffer}\par
{\tt \backslash bf}: {\bf \getbuffer}\par
{\tt \backslash bi}: {\bi \getbuffer}\par
{\tt \backslash bs}: {\bs \getbuffer}\par
\nextmyparagraphs
\switchtobodyfont[ss]
{\tt \backslash switchtobodyfont[ss]}\crlf
{\tt \backslash tf}: {\tf \getbuffer}\par
{\tt \backslash it}: {\it \getbuffer}\par
{\tt \backslash sl}: {\sl \getbuffer}\par
{\tt \backslash bf}: {\bf \getbuffer}\par
{\tt \backslash bi}: {\bi \getbuffer}\par
{\tt \backslash bs}: {\bs \getbuffer}\par
\nextmyparagraphs
\switchtobodyfont[tt]
{\tt \backslash switchtobodyfont[tt]}\crlf
{\tt \backslash tf}: {\tf \getbuffer}\par
{\tt \backslash it}: {\it \getbuffer}\par
{\tt \backslash sl}: {\sl \getbuffer}\par
{\tt \backslash bf}: {\bf \getbuffer}\par
{\tt \backslash bi}: {\bi \getbuffer}\par
{\tt \backslash bs}: {\bs \getbuffer}\par
\stopmyparagraphs
\section{{\tt \backslash setupmathematics[functionstyle=\backslash
tf,textstyle=\backslash tf]}}
\define\mathfunctionstyle{\tf}
\define\mathtextstyle{\tf}
\startmyparagraphs
\switchtobodyfont[rm]
{\tt \backslash switchtobodyfont[rm]}\crlf
{\tt \backslash tf}: {\tf \getbuffer}\par
{\tt \backslash it}: {\it \getbuffer}\par
{\tt \backslash sl}: {\sl \getbuffer}\par
{\tt \backslash bf}: {\bf \getbuffer}\par
{\tt \backslash bi}: {\bi \getbuffer}\par
{\tt \backslash bs}: {\bs \getbuffer}\par
\nextmyparagraphs
\switchtobodyfont[ss]
{\tt \backslash switchtobodyfont[ss]}\crlf
{\tt \backslash tf}: {\tf \getbuffer}\par
{\tt \backslash it}: {\it \getbuffer}\par
{\tt \backslash sl}: {\sl \getbuffer}\par
{\tt \backslash bf}: {\bf \getbuffer}\par
{\tt \backslash bi}: {\bi \getbuffer}\par
{\tt \backslash bs}: {\bs \getbuffer}\par
\nextmyparagraphs
\switchtobodyfont[tt]
{\tt \backslash switchtobodyfont[tt]}\crlf
{\tt \backslash tf}: {\tf \getbuffer}\par
{\tt \backslash it}: {\it \getbuffer}\par
{\tt \backslash sl}: {\sl \getbuffer}\par
{\tt \backslash bf}: {\bf \getbuffer}\par
{\tt \backslash bi}: {\bi \getbuffer}\par
{\tt \backslash bs}: {\bs \getbuffer}\par
\stopmyparagraphs
\section{{\tt \backslash setupmathematics[functionstyle=\backslash
bf,textstyle=\backslash bf]}}
\define\mathfunctionstyle{\bf}
\define\mathtextstyle{\bf}
\startmyparagraphs
\switchtobodyfont[rm]
{\tt \backslash switchtobodyfont[rm]}\crlf
{\tt \backslash tf}: {\tf \getbuffer}\par
{\tt \backslash it}: {\it \getbuffer}\par
{\tt \backslash sl}: {\sl \getbuffer}\par
{\tt \backslash bf}: {\bf \getbuffer}\par
{\tt \backslash bi}: {\bi \getbuffer}\par
{\tt \backslash bs}: {\bs \getbuffer}\par
\nextmyparagraphs
\switchtobodyfont[ss]
{\tt \backslash switchtobodyfont[ss]}\crlf
{\tt \backslash tf}: {\tf \getbuffer}\par
{\tt \backslash it}: {\it \getbuffer}\par
{\tt \backslash sl}: {\sl \getbuffer}\par
{\tt \backslash bf}: {\bf \getbuffer}\par
{\tt \backslash bi}: {\bi \getbuffer}\par
{\tt \backslash bs}: {\bs \getbuffer}\par
\nextmyparagraphs
\switchtobodyfont[tt]
{\tt \backslash switchtobodyfont[tt]}\crlf
{\tt \backslash tf}: {\tf \getbuffer}\par
{\tt \backslash it}: {\it \getbuffer}\par
{\tt \backslash sl}: {\sl \getbuffer}\par
{\tt \backslash bf}: {\bf \getbuffer}\par
{\tt \backslash bi}: {\bi \getbuffer}\par
{\tt \backslash bs}: {\bs \getbuffer}\par
\stopmyparagraphs
\stoptext
———————————————————————
CONCLUSION. — It all comes down to the choice of the best user interface
for math functions and math texts (usually used as subscripts of
variables). Their styles and colors is handled with \setupmathematics.
There are two choices of user interface:
1. $\normalmathop{\mfunction{Arsinh}}\nolimits x\ \text{and}\
n_{\mtext{air}}$.
2. $\mfunction{Arsinh} x\ \text{and}\ n_{\mtext{air}}$.
First, the default functionstyle and textstyle in \setupmathematics should
be \rm\tf (the text mode equivalent of \mathupright, as we are always in
text mode thanks to the \text hardcoded in \mfunction and \mtext).
Then, in the 1st solution \normalmathop is used instead of \mathop because
the latter is modified by ConTeXt to convert \rm to \mf, which makes
\setupmathematics[functionstyle=\rm] without effect.
The 2nd solution is obviously way cleaner, that is why I think it should be
preferred. The implementation is given in my '2nd DEFINITION of \mfunction'
for replacing the existing definition in math-ini.mkiv:
———————————————————————
\unexpanded\def\mfunction{\dosingleempty\domfunction}
\def\domfunction[#1]#2%
{\iffirstargument
\doifelse{#1}{op}{\normalmathop{\text{\usemathematicsstyleandcolor\c!functionstyle\c!functioncolor#2}}}{\doifelse{#1}{limop}{\normalmathop{\text{\usemathematicsstyleandcolor\c!functionstyle\c!functioncolor#2}}}{\normalmathop{\text{\usemathematicsstyleandcolor\c!functionstyle\c!functioncolor#2}}\nolimits}}
\else
\normalmathop{\text{\usemathematicsstyleandcolor\c!functionstyle\c!functioncolor#2}}\nolimits
\fi}
———————————————————————
We also saw that \mfunctionlabeltext is inconsistent with ConTeXt
\labeltext because the former has a style attached to it, so
\mfunctionlabeltext should be removed from math-ini.mkiv and
\mfunction{\mathlabeltext } should be used instead when needed.
To go even further in userfriendlyness, we the new macro \definemathcommand
should be added in math-ini.mkiv:
———————————————————————
\unexpanded\def\definemathfunction{\dodoubleempty\dodefinemathfunction}
\def\dodefinemathfunction[#1][#2]#3%
{\ifsecondargument
\definemathcommand[#1]{\mfunction[#2]{#3}}
\else
\definemathcommand[#1]{\mfunction{#3}}
\fi}
———————————————————————
Finally, with this new \mfunction definition and the removal of the
misleading \mfunctionlabeltext, the functions defined in math-def.mkiv
should be rewrite as:
———————————————————————
\definemathcommand[cos]{\mfunction{\mathlabeltext{cos}}} % Or
\definemathcommand[cos]{\mfunction[nolop]{\mathlabeltext{cos}}}, it is the
same.
\definemathcommand[det]{\mfunction[limop]{\mathlabeltext{det}}}
\definemathcommand[diff]{\normalmathop{\text{\mathfunctionstyle
d}}\mathopen{}}
%etc.
———————————————————————
or
———————————————————————
\definemathfunction[cos]{\mathlabeltext{cos}} % Or
\definemathfunction[cos][nolop]{\mathlabeltext{cos}}, it is the same.
\definemathfunction[det][limop]{\mathlabeltext{det}}
\definemathcommand[diff]{\normalmathop{\text{\mathfunctionstyle
d}}\mathopen{}} % It is a special function so it should still be treated
with the more general \definemathcommand.
%etc.
———————————————————————
ConTeXt users are now provided, if Hans agrees to implement the code given
in this conclusion, with three extremely useful macros:
— \mtext (that should be used for all math texts such as subscripts of
variables):
$n_{\mtext{air}}$;
— \mfunction (the equivalent of LaTeX \operatorname macro of the amsopn
package):
$\mfunction{Arsinh} x$
$\mfunction[op]{Arsinh} x$ or equivalently $\mfunction[limop]{Arsinh} x$;
— \definemathfunction (the equivalent of LaTeX \DeclareMathOperator macro
of the amsopn package):
\definemathfunction[arsinh]{Arsinh} $\arsinh x$
\definemathfunction[arsinh][op]{Arsinh} $\arsinh x$ or equivalently
\definemathfunction[arsinh][limop]{Arsinh} $\arsinh x$.
Maggyero