private FlowToken readCommandOrEnvironmentOrVerb() throws SnuggleParseException {
        /* We are handling either:
         * 
         * 1. \command[opt]{arg}{...}
         * 2. \verb(*)...
         * 3. \begin{env}[opt]{arg}{...}...\end{env}
         * 
         * Get the first character after '\' - which the caller has already checked existence of -
         * and turn this into a command name. The name 'begin' indicates that this is the
         * start of an environment.
         */
        int startCommandNameIndex = position+1;
        String commandName = readCommandOrEnvironmentName(startCommandNameIndex);
        if (commandName==null) {
            /* The calling method should have picked this up */
            throw new SnuggleLogicException("Expected caller to have picked the commandName==null case up");
        }
        
        /* Advance over the command name */
        position += 1 + commandName.length();
        
        /* Convert whitespace-only command name to ' ', which allows a trailing '\' on a line
         * to be equivalent to '\ ' 
         */
        boolean isWhitespaceCommand = true;
        for (int i=0; i<commandName.length(); i++) {
            if (!Character.isWhitespace(commandName.charAt(i))) {
                isWhitespaceCommand = false;
                break;
            }
        }
        if (isWhitespaceCommand) {
            commandName = " ";
        }
        
        /* Now see if we're doing a command or an environment */
        FlowToken result = null;
        if (commandName.equals("begin")) {
            /* It's the start of a built-in or user-defined environment. */
            result = finishBeginEnvironment();
        }
        else if (commandName.equals("end")) {
            /* It's the end of a built-in or user-defined environment */
            result = finishEndEnvironment();
        }
        else if (commandName.equals(UDE_POST_BEGIN)) {
            /* Internal only! */
            result = handleUserDefinedEnvironmentControl();
        }
        else if (commandName.equals(CorePackageDefinitions.CMD_VERB.getTeXName())) {
            /* It's \\verb... which needs special parsing */
            result = finishVerbToken(CorePackageDefinitions.CMD_VERB);
        }
        else if (commandName.equals(CorePackageDefinitions.CMD_VERBSTAR.getTeXName())) {
            /* Same with \\verb* */
            result = finishVerbToken(CorePackageDefinitions.CMD_VERBSTAR);
        }
        else {
            /* It's a built-in or user-defined command. */
            result = finishCommand(commandName);
        }
        return result;
    }