我想创建类似于 的数学模式重音符号\ddot{x}, \dddot{x}
,但使用除 之外的标记\dot
。具体来说,我对以下标记感兴趣:
\acute
\asteraccent
\grave
\ocirc
\times
例如,\aacute{x}
将在字母 上添加两个连续的尖音符x
,\ooocirc{y}
将在字母 上添加三个连续的圆圈y
。
有什么办法可以做到这一点?
答案1
@egreg 的回答没有解决两个问题:未提供\scriptstyle
和,不支持使用 进行字距调整。第二个是 TeX 内部的,用于更好地调整重音的水平位置。因此,我的建议(如下)解决了这两个问题。\scriptscriptstyle
\skewchar
通用\maccentX
宏已创建,并显示双重和三重尖音符。您可以类似地创建其他尖音符。
内部宏\maccentX
有四个参数:1 重音基数,2:重音,3:空或上移,4:空或比例因子。如果您使用的是经典重音,则第三和第四个参数必须为空。如果您使用特殊符号作为重音,则可以将这些参数设置为适当的值。例如,\aacute
是从(经典数学重音)派生而来的\acute
:第 3. 和第 4. 个参数为空。但从字符派生\astacc
而来\ast
,在我们的示例中,它被提升到 1.2ex 并按 0.6 比例因子缩放。
\newcount\mstylenum
\def\varstyle#1{\mathchoice{\mstylenum=0 #1}{\mstylenum=1 #1}{\mstylenum=2 #1}{\mstylenum=3 #1}}
\def\usestyle{\ifcase\mstylenum \displaystyle\or\textstyle\or\scriptstyle\or\scriptscriptstyle\fi}
\def\usemfont{\ifcase\mstylenum \textfont\or\textfont\or\scriptfont\or\scriptscriptfont\fi}
\def\aacute#1{\maccentX{#1}{\acute{}\mkern2.7mu\acute{}}{}{}}
\def\aaacute#1{\maccentX{#1}{\acute{}\mkern2.7mu\acute{}\mkern2.7mu\acute{}}{}{}}
\def\ggrave#1{\maccentX{#1}{\grave{}\mkern2.7mu\grave{}}{}{}}
\def\gggrave#1{\maccentX{#1}{\grave{}\mkern2.7mu\grave{}\mkern2.7mu\grave{}}{}{}}
\def\oocirc#1{\maccentX{#1}{\ocirc{}\mkern4.4mu\ocirc{}}{}{}}
\def\ooocirc#1{\maccentX{#1}{\ocirc{}\mkern4.4mu\ocirc{}\mkern4.4mu\ocirc{}}{}{}}
\def\astacc#1{\maccentX{#1}{\ast}{1.2}{.6}}
\def\aastacc#1{\maccentX{#1}{\ast\ast}{1.2}{.6}}
\def\aaastacc#1{\maccentX{#1}{\ast{\ast}\ast}{1.2}{.5}}
\def\bullacc#1{\maccentX{#1}{\bullet}{1.15}{.45}}
\def\bbullacc#1{\maccentX{#1}{\bullet\bullet}{1.2}{.45}}
\def\bbbullacc#1{\maccentX{#1}{\bullet{\bullet}\bullet}{1.2}{.45}}
\def\maccentX#1#2#3#4{
\varstyle{
\setbox0=\hbox{$\usestyle#1$}
\setbox1=\hbox{$\usestyle#1\Umathchar 0 1 \skewchar\usemfont1$}
\setbox2=\hbox{$\usestyle#1\kern0pt\Umathchar 0 1 \skewchar\usemfont1$}
\dimen0\ht0
\advance\dimen0 by -\fontdimen5\usemfont1
\ifx^#3^\else \advance\dimen0 by#3\fontdimen5\usemfont1 \fi
\dimen1=\wd1 \advance\dimen1 by-\wd2 % skewchar correction
\ifdim\dimen1=0pt \dimen1=.15\ht0 \fi % slant correction
\vbox{\baselineskip=0pt \lineskiplimit=-\maxdimen
\halign{##\cr
\hidewidth \kern2\dimen1 \maccentS{#2}{#4}\hidewidth\cr
\noalign{\kern\dimen0}
$\usestyle#1$\cr
}}
}}
\def\maccentS#1#2{\ifx^#2^$\usestyle#1$\else
\setbox0=\hbox{$\usestyle#1$}%
\dimen0=#2\wd0 \wd0=0pt \ht0=#2\ht0 \dp0=#2\dp0
\hbox{\pdfsave \pdfsetmatrix{#2 0 0 #2}\box0 \pdfrestore \kern\dimen0}%
\fi
}
\ifx\pdfsetmatrix\undefined
\ifx\pdfextension\undefined % XeTeX setting
\def\pdfsave{\special{pdf:literal q}}
\def\pdfrestore{\special{pdf:literal Q}}
\def\pdfsetmatrix#1{\special{pdf:literal #1 0 0 cm}}
\else % LuaTeX setting
\def\pdfsave {\pdfextension save\relax}
\def\pdfrestore {\pdfextension restore\relax}
\def\pdfsetmatrix {\pdfextension setmatrix}
\fi\fi
$\aacute b, \aacute d, \aacute x, \aaacute x, \quad
\scriptstyle \aacute b, \aacute d, \aacute x, \aaacute x$
\bye
上述示例适用于 XeTeX 或 LuaTeX,因为\Umathchar
使用了原语。如果您使用 pdftex,则必须声明
\newcount\tmpnum
并且您必须使用以下\setbox
几行:
\tmpnum=\skewchar\usemfont1 \advance\tmpnum by256
\setbox0=\hbox{$\usestyle#1$}
\setbox1=\hbox{$\usestyle#1\mathchar\tmpnum$}
\setbox2=\hbox{$\usestyle#1\kern0pt\mathchar\tmpnum$}
答案2
我把如何使下标和上标中的符号缩放留给读者去决定。
\documentclass{article}
\usepackage{accents}
\usepackage{unicode-math}
\newcommand{\astdot}[1]{\accentset{*}{#1}}
\newcommand{\astddot}[1]{\accentset{*\mkern-1mu*}{#1}}
\newcommand{\astdddot}[1]{\accentset{*\mkern-1mu*\mkern-1mu*}{#1}}
\newcommand{\circdot}[1]{\accentset{\circ}{#1}}
\newcommand{\circddot}[1]{\accentset{\circ\mkern-1mu\circ}{#1}}
\newcommand{\circdddot}[1]{\accentset{\circ\mkern-1mu\circ\mkern-1mu\circ}{#1}}
\newcommand{\genericmathaccenti}[2]{%
\genericmathaccent{#1{}}{#2}%
}
\newcommand{\genericmathaccentii}[2]{%
\genericmathaccent{#1{}\mkern3mu#1{}}{#2}%
}
\newcommand{\genericmathaccentiii}[2]{%
\genericmathaccent{#1{}\mkern3mu#1{}\mkern3mu#1{}}{#2}%
}
\newcommand{\genericmathaccent}[2]{%
\vbox{\offinterlineskip\ialign{%
##\cr
\hidewidth$\scriptstyle#1$\hidewidth\cr
\noalign{\kern-.5ex}
$#2$\cr}%
}%
}
\newcommand{\gravedot}[1]{\genericmathaccenti{\grave}{#1}}
\newcommand{\graveddot}[1]{\genericmathaccentii{\grave}{#1}}
\newcommand{\gravedddot}[1]{\genericmathaccentiii{\grave}{#1}}
\newcommand{\acutedot}[1]{\genericmathaccenti{\acute}{#1}}
\newcommand{\acuteddot}[1]{\genericmathaccentii{\acute}{#1}}
\newcommand{\acutedddot}[1]{\genericmathaccentiii{\acute}{#1}}
\begin{document}
$\astdot{x}+\astddot{x}+\astdddot{x}$
$\circdot{x}+\circddot{x}+\circdddot{x}$
$\gravedot{x}+\graveddot{x}+\gravedddot{x}$
$\acutedot{x}+\acuteddot{x}+\acutedddot{x}$
\end{document}