To solve the given optimization problem, we first need to translate the natural language description into a symbolic representation. This involves defining variables for the quantities of regular desks and standing desks to be made, formulating the objective function that represents the total profit, and listing all the constraints based on the available resources (wood and packaging time).

Let's define:
- $x_1$ as the number of regular desks to be made,
- $x_2$ as the number of standing desks to be made.

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

Now, let's formulate the constraints:
1. **Wood Constraint:** Regular desks require 20 units of wood, and standing desks require 15 units of wood. The company has 4000 units of wood available.
\[ 20x_1 + 15x_2 \leq 4000 \]
2. **Packaging Time Constraint:** Regular desks take 10 minutes to package, and standing desks take 20 minutes to package. The company has 1500 minutes of packaging time available.
\[ 10x_1 + 20x_2 \leq 1500 \]
3. **Non-Negativity Constraints:** Since the number of desks cannot be negative, we have:
\[ x_1 \geq 0 \]
\[ x_2 \geq 0 \]

Given this symbolic representation, the problem can be summarized as:

```json
{
  'sym_variables': [('x1', 'number of regular desks'), ('x2', 'number of standing desks')],
  'objective_function': '200*x1 + 300*x2',
  'constraints': ['20*x1 + 15*x2 <= 4000', '10*x1 + 20*x2 <= 1500', 'x1 >= 0', 'x2 >= 0']
}
```

To solve this linear programming problem using Gurobi in Python, we can use the following code:

```python
from gurobipy import *

# Create a new model
m = Model("Desk_Production")

# Define variables
x1 = m.addVar(lb=0, name="regular_desks")
x2 = m.addVar(lb=0, name="standing_desks")

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

# Add constraints
m.addConstr(20*x1 + 15*x2 <= 4000, "wood_constraint")
m.addConstr(10*x1 + 20*x2 <= 1500, "packaging_time_constraint")

# Optimize the model
m.optimize()

# Print the results
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Number of regular desks: {x1.x}")
    print(f"Number of standing desks: {x2.x}")
    print(f"Maximum profit: ${200*x1.x + 300*x2.x}")
else:
    print("No optimal solution found")
```