主意
所有字符,包括新定义的符号(这里是箭头),都应根据当前字体大小缩放,例如这里是 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) 在他的评论中指出的那样,您应该将所有固定测量单位(即 、 等中的测量单位)替换mm
为pt
字体相关测量单位:
em
,等于当前字体大小(即,如果当前字体排版为 10pt,则 1em = 10pt)。此长度最初与当前字体和点大小中大写字母“M”的宽度有关,因为大写字母“M”的宽度等于印刷机使用的方形“块”(“em-quads”)的整个宽度。en
,等于 的一半em
。这个名字en
指的是传统上小写字母“n”的宽度恰好是大写字母“M”的一半。ex
,等于当前字体和点大小中基线和中线之间的距离。这个名字指的是传统上小写字母“x”的高度正好是这个高度,因为它没有上突(也没有上升部或下降部)。
最后,请注意,在现代字体中,这些长度与其传统定义(某些字母的高度或宽度)之间的关系不再一定成立。