如何在 Iwona 数学字体中使用 \lVert 和 \rVert 范数符号(‖x‖)?

如何在 Iwona 数学字体中使用 \lVert 和 \rVert 范数符号(‖x‖)?

我想用\lVert\rVert来表示向量范数。 CM 中的“测试 ||x||。”

使用 Computer Modern 时,效果很好。但当我尝试使用 Iwona 作为数学字体时,我遇到了麻烦:

\documentclass{standalone}
\usepackage[math]{iwona}
\usepackage{mathtools}
\DeclarePairedDelimiter\norm{\lVert}{\rVert}
\begin{document}
Testing $\norm{x}$.
\end{document}

伊沃纳语中的“测试 x”。

使用 Iwona 作为数学字体时,我从未遇到任何问题,即使使用更奇特的符号也是如此。我有点惊讶此时会发生这种情况,当然我想知道如何修复它。

答案1

"6B由于非常奇怪的原因,字体中的插槽sy-iwona是空的。\lVert\rVert命令指向该插槽,因此您看不到任何符号,因为它从一开始就不在那里。\lVert\rVert的定义amsmath

\DeclareMathDelimiter{\lVert}
  {\mathopen}{symbols}{"6B}{largesymbols}{"0D}
\DeclareMathDelimiter{\rVert}
  {\mathclose}{symbols}{"6B}{largesymbols}{"0D}

symbol意思是:正常大小时取字体插槽中的字符"6B,大尺寸时取largesymbols字体插槽中的字符"0D。两者的区别在于前者是给定\mathopen类型,后者是\mathclose

的确

$\norm[\big]{x}$

有效,因为找到了更大的分隔符。

在此处输入图片描述

除了从另一种字体中获取符号之外,没有太多事情可以做

\documentclass[border=4]{standalone}
\usepackage[math]{iwona}
\usepackage{mathtools}

\DeclareSymbolFont{extrasymbols}{OMS}{cmsy}{m}{n}
\DeclareMathDelimiter{\lVert}
  {\mathopen}{extrasymbols}{"6B}{largesymbols}{"0D}
\DeclareMathDelimiter{\rVert}
  {\mathclose}{extrasymbols}{"6B}{largesymbols}{"0D}

\DeclarePairedDelimiter\norm{\lVert}{\rVert}
\begin{document}
Testing $\norm{x}$.

Testing $\norm[\big]{x}$.
\end{document}

在此处输入图片描述

不幸的是,一个兼容的候选者是 Kurier,但它也没有这个符号。

另一种解决方案是模拟缺失大小的符号,这种方法不需要替代字体。

\documentclass[border=4]{standalone}
\usepackage[math]{iwona}
\usepackage{mathtools}
\usepackage{xparse}

\DeclarePairedDelimiter\xnorm{\lVert}{\rVert}
\NewDocumentCommand{\norm}{som}
 {\IfBooleanTF{#1}
   {\xnorm*{#3}}
   {\IfNoValueTF{#2}
     {\mathopen{|\mkern-.8mu|}#3\mathclose{|\mkern-.8mu|}}
     {\xnorm[#2]{#3}}%
   }
 }


\begin{document}
Testing $\norm{x}$.

Testing $\norm[\big]{x}$.
\end{document}

除非符号没有可选参数,否则它\norm会执行类似的操作,在这种情况下,两个条形图是由单个条形图生成的。xnorm

在此处输入图片描述

如果您想要一个在错误修复后不进行黑客攻击就能起作用的定义,您可以这样做:

\documentclass[border=4]{standalone}
\usepackage[math]{iwona}
\usepackage{mathtools}
\usepackage{xparse}

\makeatletter
\AtBeginDocument{%
  \check@mathfonts
  \iffontchar\textfont2 "6B
    \DeclarePairedDelimiter\norm{\lVert}{\rVert}
  \else
    \DeclarePairedDelimiter\xnorm{\lVert}{\rVert}
    \NewDocumentCommand{\norm}{som}
     {\IfBooleanTF{#1}
       {\xnorm*{#3}}
         {\IfNoValueTF{#2}
           {\mathopen{|\mkern-1mu|}#3\mathclose{|\mkern-1mu|}}
           {\xnorm[#2]{#3}}%
       }%
    }
  \fi
}
\makeatother

\begin{document}
Testing $\norm{x}$.

Testing $\norm[\big]{x}$.

\end{document}

它适用于所有字体,只要它们不使用奇怪的双竖线插槽即可。\norm如果字符存在,它将以更简单的方式定义,否则它将进行破解。

答案2

编辑左/右。虽然 David Carlisle 指出我的解决方案不适用于垂直缩放\left \right语法,但包\stretchleftright{}{}{}的语法scalerel可以解决这个问题。

\documentclass{standalone}
\usepackage[math]{iwona}
\usepackage{mathtools}
\usepackage{scalerel}
\DeclarePairedDelimiter\norm{\lVert}{\rVert}
\def\lVert{\mid\!\mid}
\def\rVert{\mid\!\mid}
\begin{document}
Testing $\norm{x}$.
Testing $\norm{\frac{x}{y}}$.
Testing $\stretchleftright{\lVert}{\frac{x}{y}}{\rVert}$.
\end{document}

在此处输入图片描述

相关内容