在数学模式中,我们有\cdots
,,\vdots
ETC。,表示重复模式或省略号。这些命令打印三个等距的点。
是否有一个命令可以实现相同的功能,仅适用于任意数量的否点?
答案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}
输出: