这个问题源于一些 Linux 系统造成的混淆,对于某些软件(编辑器和浏览器),组合 unicode 字符似乎适用于右侧(而不是像记录的惯例那样适用于左侧)。所以这可能是一个“本地化”问题(好吧,本地化到所有 Linux 系统)。事实上,这个错误看起来像是一个有用的功能,因为它允许排版命令直接转换。仍然非常感谢有关带重音符号的 unicode 数学的答案和说明。
这unicode-math
符号列表描述“组合上面的右箭头”(⃗
或⃗x
),如第 7 节中翻译的那样\vec
。
应该如何使用这个功能unicode-math
?
在此示例中,我没有得到上方的箭头$x$
:
\documentclass{article}
\usepackage{unicode-math}
\begin{document}
$ ⃗x$ %this line contains the unicode arrow and the x character (in case your browser doesn't show it).
\end{document}
lualatex
(与和的汇编xelatex
简单地显示了X无箭头)
这很奇怪,因为unicode-math
它适用于其他东西,如超级索引等。
编辑:对于那些无法看清 Unicode 字符的人,这是我的编辑器的屏幕截图(gedit
),我的浏览器显示的内容基本相同:
编辑2:这就是@Jukka 答案在我的浏览器中的样子:
截屏:
编辑3:我意识到(文本/代码的)渲染非常依赖于系统,因此如果您回答了这个问题,请添加您在编辑器或浏览器中看到的屏幕截图。可能已经有人提交了关于此问题的错误报告:https://bugs.launchpad.net/ubuntu/+source/firefox/+bug/51554。
例如,到目前为止,我发现在 Gedit 3.10 和 Firefox 28.0 中,<arrow>x
箭头会显示在 上方,而在 TeXworks 和 Google Chrome 中,箭头会显示在 之前。在更高版本的 gedit 3.34 中,箭头会单独出现在 之前。x
x
x
答案1
在 Unicode 中,组合标记与字符相关联,先于它,所以你应该使用$x⃗$
(美元符号之间的内容是字母x
,后跟 U+20D7 组合上面的右箭头)。并且你应该声明一个包含该字符的数学字体。
但它仍然无法工作,大概是由于 unicode-math、字体或您使用的 LaTeX 解释器的限制。组合标记在字体中(其度量标准错误,导致标记放错位置)和渲染软件中通常实现得不好(正如我们在这里看到的:x⃗ 看起来根本不对劲)。
结论是,您应该使用类似的方法,\vec{x}
或者,如果您可以选择使用的符号,则使用粗体表示矢量,而不是上面的箭头。粗体是 ISO 80000-2 标准的主要符号,也是美国标准 (ANSI/IEEE Std 260.3-1993) 中描述的唯一符号。它在印刷上也更加稳健。
答案2
就像另一个答案已经说过的那样,在 Unicode 中,组合字符位于基本字符之后。 也不支持这一点unicode-math
。
但至少对于 LuaLaTeX,你可以添加对 U+20D7 作为组合字符的支持:
\documentclass{article}
\usepackage{unicode-math}
\mathcode"20D7="8000
\directlua{
local func = luatexbase.new_luafunction'aftervec'
token.set_lua('aftervec', func, 'protected')
local nest = tex.nest
local noad_id = node.id'noad'
local accent_id = node.id'accent'
local math_char_id = node.id'math_char'
lua.get_functions_table()[func] = function()
local level = nest.top
local last = level.tail
if not (last and last.id == noad_id) then
tex.error'I can only put accents on simple noads.'
return
end
if last.sub or last.sup then
tex.error'If you want accents on a superscript or subscript, please use braces.'
return
end
local acc = node.new(accent_id, 1)
acc.nucleus = last.nucleus
last.nucleus = nil
acc.accent = node.new(math_char_id)
acc.accent.fam, acc.accent.char = 0, 0x20D7
level.tail = last.prev
level.head = node.remove(level.head, last)
node.flush_node(last)
node.write(acc)
end
}
\letcharcode"20D7=\aftervec
\begin{document}
$x⃗y$
\end{document}
编辑:如果您想要支持所有 Unicode 数学符号,则可以使用以下符号表自动执行此操作unicode-math
:
\documentclass{article}
\usepackage{unicode-math}
\directlua{
local func = luatexbase.new_luafunction'afteracc'
token.set_lua('afteracc', func, 'protected')
local nest = tex.nest
local noad_id = node.id'noad'
local accent_id = node.id'accent'
local math_char_id = node.id'math_char'
lua.get_functions_table()[func] = function()
local level = nest.top
local last = level.tail
if not (last and last.id == noad_id) then
tex.error'I can only put accents on simple noads.'
return
end
if last.sub or last.sup then
tex.error'If you want accents on a superscript or subscript, please use braces.'
return
end
local acc = node.new(accent_id, 1)
acc.nucleus = last.nucleus
last.nucleus = nil
acc.accent = node.new(math_char_id)
acc.accent.fam, acc.accent.char = 0, token.scan_int()
level.tail = last.prev
level.head = node.remove(level.head, last)
node.flush_node(last)
node.write(acc)
end
}
\AtBeginDocument{
\begingroup
\def\UnicodeMathSymbol#1#2#3#4{%
\ifx#3\mathaccent
\def\mytmpmacro{\afteracc#1 }%
\global\letcharcode#1=\mytmpmacro
\global\mathcode#1="8000
\fi
}
\input{unicode-math-table}
\endgroup
}
\begin{document}
$x̃ŷz̄x⃗y$
\end{document}