To solve the optimization problem described, we first need to translate the natural language description into a symbolic representation. This involves defining variables for the quantities of interest (number of regular laptops and touchscreen laptops), formulating the objective function based on these variables, and specifying the constraints that limit the possible solutions.

Let's denote:
- \(x_1\) as the number of regular laptops to be made.
- \(x_2\) as the number of touchscreen laptops to be made.

The objective is to maximize profit. Given that each regular laptop brings a profit of $200 and each touchscreen laptop brings a profit of $300, the objective function can be written as:
\[ \text{Maximize:} \quad 200x_1 + 300x_2 \]

The constraints are based on the available manual labor and calibration time. Each regular laptop requires 20 minutes of manual labor and 10 minutes of calibration, while each touchscreen laptop requires 25 minutes of manual labor and 20 minutes of calibration. The company has 3000 minutes for manual labor and 2000 minutes for calibration. Thus, the constraints can be formulated as:
\[ 20x_1 + 25x_2 \leq 3000 \] (manual labor constraint)
\[ 10x_1 + 20x_2 \leq 2000 \] (calibration constraint)

Additionally, \(x_1\) and \(x_2\) must be non-negative since they represent the number of laptops.

The symbolic representation in JSON format is:
```json
{
    'sym_variables': [('x1', 'number of regular laptops'), ('x2', 'number of touchscreen laptops')],
    'objective_function': '200*x1 + 300*x2',
    'constraints': ['20*x1 + 25*x2 <= 3000', '10*x1 + 20*x2 <= 2000', 'x1 >= 0', 'x2 >= 0']
}
```

To solve this problem using Gurobi in Python, we use the following code:
```python
from gurobipy import *

# Create a new model
model = Model("Laptop_Production")

# Create variables
x1 = model.addVar(vtype=GRB.INTEGER, name="regular_laptops")
x2 = model.addVar(vtype=GRB.INTEGER, name="touchscreen_laptops")

# Set the objective function
model.setObjective(200*x1 + 300*x2, GRB.MAXIMIZE)

# Add constraints
model.addConstr(20*x1 + 25*x2 <= 3000, "manual_labor")
model.addConstr(10*x1 + 20*x2 <= 2000, "calibration")

# Optimize the model
model.optimize()

# Print the solution
if model.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Regular Laptops: {x1.x}")
    print(f"Touchscreen Laptops: {x2.x}")
    print(f"Maximum Profit: ${model.objVal:.2f}")
else:
    print("No optimal solution found")
```