在数学模式中获取 N 个等距点的命令

在数学模式中获取 N 个等距点的命令

在数学模式中,我们有\cdots,,\vdotsETC。,表示重复模式或省略号。这些命令打印三个等距的点。

是否有一个命令可以实现相同的功能,仅适用于任意数量的点?

答案1

该示例重新定义\cdots为采用可选参数来指定点的数量,默认值为 3:

\documentclass{article}

\makeatletter
\renewcommand*{\cdots}[1][3]{%
  \mathinner{%
    \expandafter\roman@repeat
    \expandafter\cdotp
    \romannumeral\numexpr(#1)\relax
    000z%
  }%
}
\newcommand*{\roman@repeat}[2]{%
  \csname roman@repeat@#2\endcsname{#1}%
}
\newcommand*{\roman@repeat@m}[1]{%
  #1%
  \roman@repeat{#1}%
}
\newcommand*{\roman@repeat@z}[1]{}%
\makeatother

\begin{document}
\[
  A \cdots[0] B \cdots[1] C \cdots[2] D \cdots D \cdots[4] E
  \cdots[5] F \cdots[6] G \cdots[7] H
\]
\end{document}

结果

笔记:

  • amsmath重新定义了\cdots。它检查以下标点符号。然后,使用与\cdots带有点数参数的宏不同的命令会更可靠。

变体\cleaders

只是为了好玩,下面是一个使用 的变体\cleaders。那么 TeX 宏代码就不需要循环了。

\documentclass{article}

\makeatletter
\newcommand*{\cdotsx}[1]{%
  \mathinner{%
    \mathpalette{\math@leaders@repeat{\cdotp}{\mathpunct{}\cdotp}}{#1}%
  }%
}
% \math@leaders@repeat
% #1: box contents if repeat count = 1
% #2: box contents of boxes after the first box
% #3: math style
% #4: repeat count
\newcommand*{\math@leaders@repeat}[4]{%
  \ifnum\numexpr(#4)>\z@
    \hbox{$#3#1\m@th$}%
    \ifnum\numexpr(#4)>\@ne
      \sbox0{$#3#2\m@th$}%
      \cleaders\copy0\hskip\numexpr(#4)-1\relax\wd0\relax
    \fi
  \fi
}
\makeatother

\begin{document}
\[
  A \cdotsx{0} B \cdotsx{1} C \cdotsx{2} D \cdotsx{3} D
  \cdotsx{4} E \cdotsx{5} F \cdotsx{6} G \cdotsx{7} H
\]
\end{document}

结果

答案2

我真的不知道你要这些做什么,但它们在这里:

\documentclass{article}
\newcommand{\dodotx}[2]{%
  \mathinner{%
    \mathcode`m=#1
    \romannumeral\number#2 000
  }%
}
\newcommand{\ldotx}[1]{\dodotx{\ldotp}{#1}}
\newcommand{\cdotx}[1]{\dodotx{\cdotp}{#1}}

\makeatletter
\newcommand{\vdotx}[1]{%
  \vbox{
    \baselineskip 4\p@
    \lineskiplimit \z@
    \kern 6\p@
    \expandafter\dovdotx\romannumeral\number#1 000@
  }%
}
\newcommand{\dovdotx}[1]{%
  \if #1@\else\hbox{.}\expandafter\dovdotx\fi
}

\begin{document}
$\ldotx{2}\quad\cdotx{2}$

$\ldotx{3}\quad\cdotx{3}$

$\ldotx{4}\quad\cdotx{4}$

$\ldotx{5}\quad\cdotx{5}$

$\ldotx{6}\quad\cdotx{6}$

$\vdotx{3}\vdotx{4}\vdotx{5}$
\end{document}

在此处输入图片描述

这是 LaTeX3 版本;我还添加了\ddotx;与的比较\ddots显示了一些差异,但对角点总体上是相当有问题的。

\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand{\ldotx}{ m }
 {
  \ingo_dots_horizontal:Nn \ldotp { #1 }
 }
\NewDocumentCommand{\cdotx}{ m }
 {
  \ingo_dots_horizontal:Nn \cdotp { #1 }
 }
\NewDocumentCommand{\vdotx}{ m }
 {
  \ingo_dots_vertical:nn { 0 } { #1 }
 }
\NewDocumentCommand{\ddotx}{ m }
 {
  \ingo_dots_vertical:nn { 4 } { #1 }
 }

\cs_new:Npn \ingo_dots_horizontal:Nn #1 #2
 {
  \mathinner{ \prg_replicate:nn { #2 } { #1 } }
 }

\int_new:N \l_ingo_reps_int
\cs_new_protected:Npn \ingo_dots_vertical:nn #1 #2
 {
  \vbox:n
   {
    \baselineskip 4pt
    \lineskiplimit 0pt
    \kern 6pt
    \int_compare:nTF { #1 == 0 }
     {
      \prg_replicate:nn { #2 } { \hbox:n {.} }
     }
     {
      \int_zero:N \l_ingo_reps_int
      \prg_replicate:nn { #2 } { \ingo_shifted_dot:n { #1 } }
     }
   }
 }

\cs_new_protected:Npn \ingo_shifted_dot:n #1
 {
  \hbox:n { \kern\dim_eval:n { #1pt * \l_ingo_reps_int } . }
  \int_incr:N \l_ingo_reps_int
 }

\ExplSyntaxOff

\begin{document}
$\ldotx{2}\quad\cdotx{2}$

$\ldotx{3}\quad\cdotx{3}$

$\ldotx{4}\quad\cdotx{4}$

$\ldotx{5}\quad\cdotx{5}$

$\ldotx{6}\quad\cdotx{6}$

$\vdotx{3}\vdotx{4}\vdotx{5}\ddotx{5}$

$\ddotx{3}\ddots$
\end{document}

在此处输入图片描述

答案3

\cdots使用和的定义并\vdots对其fontmath.ltx进行一些修改(需要pgffor),我定义了三个命令\nldots\ncdots和,\nvdots它们采用可选参数,默认值为 3。

\documentclass[a4paper,12pt]{book}
\usepackage{pgffor}

\makeatletter
\DeclareRobustCommand
  \nldots[1][3]{\mathinner{\foreach \x in {1,...,#1}{\ldotp}}}
\DeclareRobustCommand
  \ncdots[1][3]{\mathinner{\foreach \x in {1,...,#1}{\cdotp}}}
\DeclareRobustCommand
  \nvdots[1][3]{\vbox{\baselineskip4\p@ \lineskiplimit\z@
    \kern6\p@\foreach \x in {1,...,#1}{\hbox{.}}}}
\makeatother

\begin{document}

\[A\nldots[5] B\ldots C\]
\[A\ncdots[5] B\cdots C\]
\[\nvdots[5] \nvdots \vdots\]

\end{document} 

输出:

在此处输入图片描述

相关内容