在新命令中使用循环来构建更长的等号

在新命令中使用循环来构建更长的等号

下列的有没有更宽的等号?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}

在此处输入图片描述

相关内容