【问题标题】:How to get a proper imathas link for a given mathematical expression string?如何为给定的数学表达式字符串获取正确的 imathas 链接?
【发布时间】:2011-11-24 02:36:39
【问题描述】:

例如对于一个字符串x + 1/y我想用表达式生成这个url:

http://www.imathas.com/cgi-bin/mimetex.cgi?\displaystyle\blue{x}%2B\frac{{1}}{{y}}

在 C# 中是否有任何工具可以完成这项工作?

【问题讨论】:

    标签: c# mathematical-expressions


    【解决方案1】:

    您可以使用NCalc 库来编译数学表达式 x + 1/y 变成了一个imathas表达式。 NCalc 库创建一个抽象语法树 (AST) 给定的数学表达式字符串。然后,您可以创建一个访问者 将 AST 转换为 imathas 表达式。有关更多信息 访客模式请看以下wikipedia文章。

    下面的(不完整的)示例应该为您提供一个起点:

    // Implement a visitor
    public class ImathasVisitor: LogicalExpressionVisitor
    {
      // Result contains the imathas expression
      // after the visit.
      public StringBuilder Result = new StringBuilder();
    
      public override void Visit(Function function)
      {                
      }
    
      public override void Visit(LogicalExpression expression)
      {                
      }
    
      public override void Visit(TernaryExpression expression)
      {                
      }
    
      public override void Visit(UnaryExpression expression)
      {                
      }
    
      public override void Visit(Identifier identifier)
      {
        Result.AppendFormat("{{{0}}}", identifier.Name);
      }           
    
      public override void Visit(ValueExpression expression)
      {
        Result.AppendFormat("{{{0}}}", expression.Value);
      }
    
      public override void Visit(BinaryExpression expression)
      {                                
        switch(expression.Type)
        {
          case BinaryExpressionType.Div:
            Result.Append("\\frac{");
            expression.LeftExpression.Accept(this);
            Result.Append("}{");
            expression.RightExpression.Accept(this);
            Result.Append("}");
            break;
          case BinaryExpressionType.Plus:
            expression.LeftExpression.Accept(this);               
            Result.Append(HttpUtility.UrlEncode("+"));
            expression.RightExpression.Accept(this);                
            break;
          case BinaryExpressionType.Minus:
            expression.LeftExpression.Accept(this);               
            Result.Append("-");
            expression.RightExpression.Accept(this);                
            break;
        }                                                
      }           
    }
    
    static void Main(string[] args)
    {
      // Create a NCalc expression.
      NCalc.Expression e = new NCalc.Expression("x + 1/y");
    
      // Check for syntax errors.
      if(e.HasErrors())
      {
        Console.Out.WriteLine("Syntax error.");
        return;
      }
    
      // Transform the parsed expression into
      // an imathas expression.
      ImathasVisitor iv = new ImathasVisitor();
      e.ParsedExpression.Accept(iv);
    
      Console.Out.WriteLine(iv.Result);
    }
    

    有关访问者的更详细示例,请访问 NCalc 库 带有SerializationVisitor 的构建,您绝对应该这样做 看看吧。

    希望,这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-21
      • 1970-01-01
      • 1970-01-01
      • 2011-12-01
      • 1970-01-01
      • 2011-03-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多