Here is a LuaLaTeX approach that discovers unary minuses automatically (but the \raisebox doesn't work for a reason I don't understand):
\documentclass{minimal}
\usepackage{luatextra}
\usepackage{xparse}
\makeatletter
\NewDocumentCommand{\raisedminus}{m}{%
\raisebox{0.2em}{$\m@th#1{-}$}%
}
\makeatother
\newsavebox{\scriptraisedminus}
\sbox{\scriptraisedminus}{\raisedminus{\scriptstyle}}
\newsavebox{\scriptscriptraisedminus}
\sbox{\scriptscriptraisedminus}{\raisedminus{\scriptscriptstyle}}
\begin{luacode}
local unary_minus = node.new(15)
unary_minus.display = node.new(16, 0)
unary_minus.display.nucleus = node.new(32)
unary_minus.display.nucleus.list = node.copy_list(tex.getbox(\number\scriptraisedminus))
unary_minus.text = node.new(16, 0)
unary_minus.text.nucleus = node.new(32)
unary_minus.text.nucleus.list = node.copy_list(tex.getbox(\number\scriptraisedminus))
unary_minus.script = node.new(16, 0)
unary_minus.script.nucleus = node.new(32)
unary_minus.script.nucleus.list = node.copy_list(tex.getbox(\number\scriptscriptraisedminus))
unary_minus.scriptscript = node.new(16, 0)
unary_minus.scriptscript.nucleus = node.new(32)
unary_minus.scriptscript.nucleus.list = node.copy_list(tex.getbox(\number\scriptscriptraisedminus))
function is_bin_conv_to_ord(v, p)
if not v or v.id \string~= 16 or v.subtype \string~= 4 then return false end
if not p then return true end
if p.id == 16 and ((p.subtype >= 1 and p.subtype <= 6) or p.subtype == 8) then return true end
local n = v.next
if q and q.id == 16 and (q.subtype == 5 or q.subtype == 7 or q.subtype == 8) then return true end
return false
end
function replace_unary_minus(head, displaytype, need_penalties)
local p = nil
local v = head
while v do
if is_bin_conv_to_ord(v, p) then
local n = v.nucleus
if n and n.id == 31 and n.fam == 2 and n.char == 0 then
node.insert_after(head, v, node.copy(unary_minus))
head, w = node.remove(head, v)
end
end
p = v
v = v.next
end
return node.mlist_to_hlist(head, displaytype, need_penalties)
end
luatexbase.add_to_callback("mlist_to_hlist", replace_unary_minus, "replace_unary_minus")
\end{luacode}
\begin{document}
$-3 - 4$
\end{document}
