下列的有没有更宽的等号?和newcommand 中的“For 循环”,我想出了一个简单的命令:
\newcount\tmp
\newcommand{\eqlong}[1][2]{% need this to prevent extra vertical space
=
\tmp=0
\loop
% increment dummy counter
\advance\tmp by 1
\joinrel=
% repeat the loop provided the counter is within specified bound
\ifnum\tmp<#1
\repeat
}
据称,\eqlong3
例如应该产生=\joinrel=\joinrel=
一个等号,即一个长度约为普通等号 3 倍的等号。我写的命令不起作用,但我想知道是否有人可以修复它。
我知道我上面链接的一篇文章(还有可扩展等号) 提到了extarrows
包,但在这里我只想要一个我可以通过传递的参数控制其长度的符号。
答案1
您的命令定义了一个可选参数,如果给出,则必须用方括号分隔。如果我正确理解了您的请求,您还想\eqlong[n]
生成一个长度为 n 倍的符号=
。正如所给出的,它生成一个长度为 (n+1)倍的符号=
。只需将其更改\tmp=0
为即可解决这个问题\tmp=1
。
\documentclass{article}
\newcount\tmp
\newcommand{\eqlong}[1][2]{% need this to prevent extra vertical space
=
\tmp=1
\loop
% increment dummy counter
\advance\tmp by 1
\joinrel=
% repeat the loop provided the counter is within specified bound
\ifnum\tmp<#1
\repeat
}
\begin{document}
$a=b$
$a\eqlong b$ %default, twice as long
$a\eqlong[3] b$ %three times as long
\end{document}
答案2
您可以将命令设为单行命令:
\documentclass{article}
\ExplSyntaxOn
\NewDocumentCommand{\eqlong}{O{2}}
{
=\prg_replicate:nn { #1 - 1 } { \joinrel= }
}
\ExplSyntaxOff
\begin{document}
$a=b$
$a\eqlong[1] b$% the same as before
$a\eqlong b$% default, twice as long
$a\eqlong[3] b$% three times as long
\end{document}
当然,这假设您传递的参数是正整数。如果您传递其他值,则会出错。
现在让我们尝试解决一个更复杂的问题:我们想要\eqlong[3]
产生一个关系符号确切地等号的长度为三倍。
\documentclass{article}
\makeatletter
\NewDocumentCommand{\eqlong}{O{2}}{%
\mathrel{\mathpalette\eqlong@{#1}}%
}
\NewDocumentCommand{\eqlong@}{mm}{%
\begingroup
\sbox\z@{$\m@th#1=$}%
\ifnum#2>1
\makebox[#2\wd\z@][s]{%
\copy\z@
\kern-0.5\wd\z@
\cleaders\hbox{\kern-0.4\wd\z@\copy\z@\kern-0.4\wd\z@}\hfill
\kern-0.5\wd\z@
$\m@th#1\mkern-8mu$
\copy\z@
}%
\else
\copy\z@
\fi
\endgroup
}
\makeatother
\begin{document}
$a=b$
$a\eqlong[1] b$% the same as before
$a\eqlong b$% default, twice as long
$a\eqlong[3] b$% three times as long
$a\eqlong[9] b$
\sbox0{${=}{=}{=}{=}{=}$}\the\wd0
\sbox0{$\eqlong[5]$}\the\wd0
$\scriptstyle a=b$
$\scriptstyle a\eqlong[1] b$
$\scriptstyle a\eqlong b$
$\scriptstyle a\eqlong[2]b$
\end{document}
如你所见,复制五个等号的宽度与 相同\eqlong[5]
。
答案3
在 OpTeX 中,你可以将命令制作成一行:
\optdef\eqlong [2]{=\fornum 2..\the\opt \do{\joinrel=}}
$a=b$
$a\eqlong[1] b$% the same as before
$a\eqlong b$% default, twice as long
$a\eqlong[3] b$% three times as long
\bye
答案4
\documentclass{article}
\newcount\tmp
\newcommand{\eqlong}[1][2]{%
\tmp=0
\loop
\ifnum\tmp<\numexpr(#1)\relax
\ifnum\tmp>0 \joinrel\fi
\advance\tmp by 1
=
\repeat
}
\begin{document}
$a\eqlong[0] b$
$a=b$
$a\eqlong[1] b$
$a\eqlong[2] b$
$a\eqlong b$ %default=2
$a\eqlong[3] b$
\end{document}
\documentclass{article}
\newcommand{\eqlong}[1][2]{%
\ifnum#1>0 %
=\ifnum#1>1 \joinrel\fi
\expandafter\eqlong\expandafter[\the\numexpr(#1)-1\expandafter\relax\expandafter]%
\fi
}
\begin{document}
$a\eqlong[0] b$
$a=b$
$a\eqlong[1] b$
$a\eqlong[2] b$
$a\eqlong b$ %default=2
$a\eqlong[3] b$
\end{document}