mirror of
https://github.com/Smaug123/KaTeX
synced 2025-10-09 04:58:40 +00:00
Implement \TextOrMath, \@secondoftwo (#1024)
* Implement \TextOrMath, \@secondoftwo * Parser now tells MacroExpander about mode switching. (This seems preferable to a circular reference between Parser and MacroExpander.) * Implement \TextOrMath * Improve when we switch modes so that this actually works, in all cases except single-symbol arguments. * Add \@secondoftwo to match \@firstoftwo. * Add comments documenting all the conditional macros * Define type for switchMode * Fix mode detection for ligatures * Switch mode before the call to parseSymbol() in parseGroup This fixes the Colorbox screenshot test.
This commit is contained in:
committed by
Kevin Barabash
parent
2d439f076a
commit
c30edaaf5b
@@ -52,11 +52,23 @@ function defineMacro(name: string, body: MacroDefinition) {
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// macro tools
|
||||
|
||||
// LaTeX's \@firstoftwo{#1}{#2} expands to #1, skipping #2
|
||||
// TeX source: \long\def\@firstoftwo#1#2{#1}
|
||||
defineMacro("\\@firstoftwo", function(context) {
|
||||
const args = context.consumeArgs(2);
|
||||
return {tokens: args[0], numArgs: 0};
|
||||
});
|
||||
|
||||
// LaTeX's \@secondoftwo{#1}{#2} expands to #2, skipping #1
|
||||
// TeX source: \long\def\@secondoftwo#1#2{#2}
|
||||
defineMacro("\\@secondoftwo", function(context) {
|
||||
const args = context.consumeArgs(2);
|
||||
return {tokens: args[1], numArgs: 0};
|
||||
});
|
||||
|
||||
// LaTeX's \@ifnextchar{#1}{#2}{#3} looks ahead to the next (unexpanded)
|
||||
// symbol. If it matches #1, then the macro expands to #2; otherwise, #3.
|
||||
// Note, however, that it does not consume the next symbol in either case.
|
||||
defineMacro("\\@ifnextchar", function(context) {
|
||||
const args = context.consumeArgs(3); // symbol, if, else
|
||||
const nextToken = context.future();
|
||||
@@ -67,9 +79,22 @@ defineMacro("\\@ifnextchar", function(context) {
|
||||
}
|
||||
});
|
||||
|
||||
// \def\@ifstar#1{\@ifnextchar *{\@firstoftwo{#1}}}
|
||||
// LaTeX's \@ifstar{#1}{#2} looks ahead to the next (unexpanded) symbol.
|
||||
// If it is `*`, then it consumes the symbol, and the macro expands to #1;
|
||||
// otherwise, the macro expands to #2 (without consuming the symbol).
|
||||
// TeX source: \def\@ifstar#1{\@ifnextchar *{\@firstoftwo{#1}}}
|
||||
defineMacro("\\@ifstar", "\\@ifnextchar *{\\@firstoftwo{#1}}");
|
||||
|
||||
// LaTeX's \TextOrMath{#1}{#2} expands to #1 in text mode, #2 in math mode
|
||||
defineMacro("\\TextOrMath", function(context) {
|
||||
const args = context.consumeArgs(2);
|
||||
if (context.mode === 'text') {
|
||||
return {tokens: args[0], numArgs: 0};
|
||||
} else {
|
||||
return {tokens: args[1], numArgs: 0};
|
||||
}
|
||||
});
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// basics
|
||||
defineMacro("\\bgroup", "{");
|
||||
|
Reference in New Issue
Block a user