if (c != left) {
putback();
return make_pair(false, string());
- } else
+ } else {
+ // a single '\' is only allowed within \verb, no matter what the delimiter is,
+ // for example "\verb+\+" (reported as bug #4468)
+ // To support this, we allow single '\' if it is the only character
+ // within equal delimiters
+ if (next_token().cat() == catEscape)
+ if (next_token().character() == right && right == left)
+ result += '\\';
while ((c = getChar()) != right && good()) {
// Ignore comments
if (curr_token().cat() == catComment) {
else
result += curr_token().asInput();
}
-
+ }
return make_pair(true, result);
}
}
+string const Parser::plainEnvironment(string const & name)
+{
+ if (!good())
+ return string();
+
+ ostringstream os;
+ for (Token t = get_token(); good(); t = get_token()) {
+ if (t.asInput() == "\\end") {
+ string const end = getArg('{', '}');
+ if (end == name)
+ return os.str();
+ else
+ os << "\\end{" << end << '}';
+ } else
+ os << t.asInput();
+ }
+ cerr << "unexpected end of input" << endl;
+ return os.str();
+}
+
+
+string const Parser::plainCommand(char left, char right, string const & name)
+{
+ if (!good())
+ return string();
+ // check if first token is really the start character
+ Token tok = get_token();
+ if (tok.character() != left) {
+ cerr << "first character does not match start character of command \\" << name << endl;
+ return string();
+ }
+ ostringstream os;
+ for (Token t = get_token(); good(); t = get_token()) {
+ if (t.character() == right) {
+ return os.str();
+ } else
+ os << t.asInput();
+ }
+ cerr << "unexpected end of input" << endl;
+ return os.str();
+}
+
+
void Parser::tokenize_one()
{
catInit();