![](https://secure.gravatar.com/avatar/c5ae4f9aa0d3a9bd5376e92b322c3e50.jpg?s=120&d=mm&r=g)
On Thu, 25 Jun 2020, Jairo A. del Rio wrote:
Hi, list! I've seen the following in Stack Exchange:
https://tex.stackexchange.com/questions/503208/define-macro-that-scans-ahead...
The answer is:
\documentclass{article}\usepackage{amsmath}\usepackage{xparse} \NewDocumentCommand{\mymathsym}{e{^_}}{% x^{\mathrm{foo}\IfValueT{#1}{,#1}}_{\mathrm{bar}\IfValueT{#2}{,#2}}%} \begin{document} \begin{gather}\mymathsym \\\mymathsym^{\mathrm{extrasup}} \\\mymathsym_{\mathrm{extrasub}} \\\mymathsym^{\mathrm{extrasup}}_{\mathrm{extrasub}} \\\mymathsym_{\mathrm{extrasub}}^{\mathrm{extrasup}} \end{gather} \end{document}
Such a macro contextually defines a behavior for a subscript and a superscript even if they aren't displayed in a specific order, so
\mymacro_{a}^{b}
\mymacro^{b}_{a}
have the same output, even if the intended behavior is not the typical one (I could redefine it so subscripts change colors, for instance). Although I could just port the macro using xparse-generic because it works in ConTeXt too, how to define a macro like that the ConTeXt way, i.e., using only ConTeXt macros?
Return of the dodo :-) % Must be outside \unprotect .. \protect so that _ has usual catcodes \def\capturemathoplimits#1% {\doifnextcharelse _% {\docapturemathoplimitsA{#1}} {\doifnextcharelse ^% {\docapturemathoplimitsB{#1}} {\redocapturemathoplimits{#1}}}} \def\docapturemathoplimitsA#1#2#3% {\doifnextcharelse ^% {\dodocapturemathoplimitsA{#1}{#2}{#3}} {\dodocapturemathoplimitsA{#1}{#2}{#3}\empty\empty}} \def\dodocapturemathoplimitsA#1#2#3#4#5{#1{#5}{#3}} \def\docapturemathoplimitsB#1#2#3% {\doifnextcharelse _% {\dodocapturemathoplimitsB{#1}{#2}{#3}} {\dodocapturemathoplimitsB{#1}{#2}{#3}\empty\empty}} \def\dodocapturemathoplimitsB#1#2#3#4#5{#1{#3}{#5}} \def\redocapturemathoplimits#1{#1\empty\empty\empty\empty\empty} % Usage: \define\mymacro{\capturemathoplimits\domymacro} \def\domymacro#1#2% % #1 is supscript, #2 is subscript {x^{\mathrm{foo}\doifsomething{#1}{,#1}}_{\mathrm{bar}\doifsomething{#2}{,#2}}} \starttext \startlines $\mymacro$ $\mymacro^{\mathrm{extrasup}}$ $\mymacro_{\mathrm{extrasub}}$ $\mymacro^{\mathrm{extrasup}}_{\mathrm{extrasub}}$ $\mymacro_{\mathrm{extrasub}}^{\mathrm{extrasup}}$ \stoplines \stoptext Aditya