我想用\lVert
和\rVert
来表示向量范数。
使用 Computer Modern 时,效果很好。但当我尝试使用 Iwona 作为数学字体时,我遇到了麻烦:
\documentclass{standalone}
\usepackage[math]{iwona}
\usepackage{mathtools}
\DeclarePairedDelimiter\norm{\lVert}{\rVert}
\begin{document}
Testing $\norm{x}$.
\end{document}
使用 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}