定义相对于字体大小的数学符号

定义相对于字体大小的数学符号

主意

所有字符,包括新定义的符号(这里是箭头),都应根据当前字体大小缩放,例如这里是 12pt。

执行

我想定义一个类似这里。箭头应随字体大小缩放。我定义的当前 MWE 是:

\documentclass[12pt]{article}
\usepackage{amsmath}
\usepackage{tikz}
\usetikzlibrary{calc,decorations.pathmorphing,shapes}

\newcounter{sarrow}
\newcommand\xrsquigarrow[1]{%
\mathrel{\begin{tikzpicture}[baseline={($(current bounding box.south)+(0,-0.5ex)$)}]
\node[inner sep=.5ex] (\thesarrow) {$\scriptstyle #1$};
\draw[<-,decorate,decoration={snake,amplitude=0.7pt,segment length=1.2mm,pre=lineto,pre length=4pt}] (\thesarrow.south east) -- (\thesarrow.south west);
\end{tikzpicture}}%
}

\begin{document}

$A\xrsquigarrow{f}B$

\end{document}

为了依赖于字体大小(来自文档类),定义必须是什么样子?

答案1

按照前面的建议,用“相对单位”定义宏:

\documentclass[12pt]{article}
\usepackage{amsmath}
\usepackage{tikz}
\usetikzlibrary{calc,decorations.pathmorphing,shapes}

\newcounter{sarrow}
\newcommand\xrsquigarrow[1]{\mathrel{%
  \begin{tikzpicture}[baseline={($(current bounding box.south)+(0,-0.5ex)$)}]
    \node[inner sep=.5ex] (\thesarrow) {$\scriptstyle #1$};
    \draw[<-,decorate,
          decoration={snake,amplitude=0.135ex,segment length=0.34em,pre=lineto,pre length=0.4em}] 
         (\thesarrow.south east) -- (\thesarrow.south west);
  \end{tikzpicture}
}}

\begin{document}

$A\xrsquigarrow{f}B$

{\large$A\xrsquigarrow{f}B$\par}

{\Large$A\xrsquigarrow{f}B$\par}

{\LARGE$A\xrsquigarrow{f}B$\par}

{\small$A\xrsquigarrow{f}B$\par}

{\footnotesize$A\xrsquigarrow{f}B$\par}

\end{document}

在此处输入图片描述

为了实现下标和上标(或\scriptstyle声明)的自动缩放,我们必须付出更多努力:

\documentclass[12pt]{article}
\usepackage{amsmath}
\usepackage{tikz}
\usetikzlibrary{calc,decorations.pathmorphing,shapes}

\makeatletter
\newcommand\xrsquigarrow[1]{\mathrel{\mathchoice
  {\hbox{\fontsize{\tf@size}{\tf@size}\selectfont\@xrsquigarrow\scriptstyle{#1}}}
  {\hbox{\fontsize{\tf@size}{\tf@size}\selectfont\@xrsquigarrow\scriptstyle{#1}}}
  {\hbox{\fontsize{\sf@size}{\sf@size}\selectfont\@xrsquigarrow\scriptscriptstyle{#1}}}
  {\hbox{\fontsize{\ssf@size}{\ssf@size}\selectfont\@xrsquigarrow\scriptscriptstyle{#1}}}
}}
\newcommand\@xrsquigarrow[2]{%
  \begin{tikzpicture}[baseline={($(current bounding box.south)+(0,-0.5ex)$)}]
    \node[inner sep=.5ex] (A) {$#1#2$};
    \draw[<-,decorate,
          decoration={snake,amplitude=0.135ex,segment length=0.34em,pre=lineto,pre length=0.4em}] 
         (A.south east) -- (A.south west);
  \end{tikzpicture}%
}

\begin{document}

$A\xrsquigarrow{f}B_{A\xrsquigarrow{f}B}$

{\large$A\xrsquigarrow{f}B$\par}

{\Large$A\xrsquigarrow{f}B$\par}

{\LARGE$A\xrsquigarrow{f}B$\par}

{\small$A\xrsquigarrow{f}B$\par}

{\footnotesize$A\xrsquigarrow{f}B$\par}

\end{document}

在此处输入图片描述

请注意,这是慢的,因为每个实例的\xrsquigarrow所有四个变体都需要进行排版。

笔记。我已经删除了\thesarrow只提供节点名称的部分。


\mathchoice需要四个参数:分别在显示、文本、一级子/上标和二级子/上标样式中要排版的内容。所有四种文本都将被排版,然后 TeX 将决定使用哪一种。因此,我们设置了四个框,其中选择的字体大小适合\tf@size显示和文本样式,\sf@size以及\ssf@size其他两种样式(这些大小在排版公式时由 LaTeX 自动计算)。

然后,框包含\@xrsquigarrow两个参数:要应用于标签的样式和标签本身。\scriptstyle当箭头处于显示状态时,应采用此样式;\scriptscriptstyle在其他情况下,应采用文本样式。

的定义\@xrsquigarrow,除了附加参数外,与之前提出的定义完全相同。

答案2

正如杰克 (Jake) 在他的评论中指出的那样,您应该将所有固定测量单位(即 、 等中的测量单位)替换mmpt字体相关测量单位:

  • em,等于当前字体大小(即,如果当前字体排版为 10pt,则 1em = 10pt)。此长度最初与当前字体和点大小中大写字母“M”的宽度有关,因为大写字母“M”的宽度等于印刷机使用的方形“块”(“em-quads”)的整个宽度。

  • en,等于 的一半em。这个名字en指的是传统上小写字母“n”的宽度恰好是大写字母“M”的一半。

  • ex,等于当前字体和点大小中基线和中线之间的距离。这个名字指的是传统上小写字母“x”的高度正好是这个高度,因为它没有上突(也没有上升部或下降部)。

最后,请注意,在现代字体中,这些长度与其传统定义(某些字母的高度或宽度)之间的关系不再一定成立。

相关内容