private FlowToken readNextTokenTextMode() throws SnuggleParseException {
        /* Look at first character to decide what type of token we're going to read.
         * 
         * NB: If adding any trigger characters to the switch below, then you'll need to add
         * them to {@link #readNextSimpleTextParaMode()} as well to ensure that they terminate
         * regions of plain text as well.
         */
        int c = workingDocument.charAt(position);
        switch(c) {
            case -1:
                return null;
                
            case '\\':
                /* This is \command, \verb or an environment control */
                return readSlashToken();
                
            case '$':
                /* Math mode $ or $$ */
                return readDollarMath();
                
            case '{':
                /* Start of a region in braces */
                return readBraceRegion();
                
            case '%':
                /* Start of a comment. This should have been caught earlier */
                throw new SnuggleLogicException("Comment should be have been skipped before getting here!");
                
            case '&':
                /* 'Tab' character */
                return new SimpleToken(workingDocument.freezeSlice(position, position+1),
                        TokenType.TAB_CHARACTER, currentModeState.latexMode, null);
                
            case '_':
            case '^':
                /* Error: These are only allowed in MATH mode */
                return createError(CoreErrorCode.TTEM03, position, position+1);
                
            case '#':
                /* Error: This is only allowed inside command/environment definitions */
                return createError(CoreErrorCode.TTEG04, position, position+1);

            default:
                /* Plain text or some paragraph nonsense */
                return readNextSimpleTextParaMode();
        }
    }