如何使用 \dot 以外的标记生成类似于“\ddot, \dddot”的重音符号?

如何使用 \dot 以外的标记生成类似于“\ddot, \dddot”的重音符号?

我想创建类似于 的数学模式重音符号\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

maccentX

上述示例适用于 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}

在此处输入图片描述

相关内容