使用unicode“组合上面的右箭头”生成矢量命令

使用unicode“组合上面的右箭头”生成矢量命令

这个问题源于一些 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 中,箭头会单独出现在 之前。xxx

答案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}

在此处输入图片描述

相关内容