Symbolics and substitution using broadcasting

You can’t broadcast over a Dict, but you can pass a Dict to substitute. You also can’t substitute strings for symbols. In this case, I think you’ll want to wrap the Dict in a Ref to prevent broadcasting:

julia> η, dη... = @variables η, η_xx, η_yy, η_xy
4-element Vector{Num}:
    η
 η_xx
 η_yy
 η_xy

julia> Symbolics.substitute.(J, Ref(Dict(etaf => η, (Symbolics.gradient(etaf, E) .=> dη)...)))
3×3 Matrix{Num}:
 2η + 2Exx*η_xx       2Exx*η_yy       2Exx*η_xy
      2Eyy*η_xx  2η + 2Eyy*η_yy       2Eyy*η_xy
      2Exy*η_xx       2Exy*η_yy  2η + 2Exy*η_xy

Note that with Latexify.jl (plus a few additional subscripts for E_xx, E_yy, E_xy) gives you a string that can be pasted into LaTeX:

julia> latexify(ans) |> clipboard
\begin{equation} \left[ \begin{array}{ccc}
 2 \eta + 2 E_{xx} \eta_{xx} & 2 E_{xx} \eta_{yy} & 2 E_{xx} \eta_{xy} \\
 2 E_{yy} \eta_{xx} & 2 \eta + 2 E_{yy} \eta_{yy} & 2 E_{yy} \eta_{xy} \\
 2 E_{xy} \eta_{xx} & 2 E_{xy} \eta_{yy} & 2 \eta + 2 E_{xy} \eta_{xy} \\
 \end{array} \right] \end{equation} 

image