如何从 \def 返回 \count 值

如何从 \def 返回 \count 值

我编写了一个计算余数的宏:

\def\remainder#1#2 {%
    \newcount\dividendcount
    \dividendcount=#1
    \newcount\quotientcount
    \quotientcount=#1
    \divide\quotientcount #2
    \multiply\quotientcount #2
    \advance\dividendcount -\quotientcount
    \number\dividendcount
}

我想在其他宏中使用 \remainder 的值。例如,

\def\othermacro#1 {%
    \newcount\tempcount
    \tempcount=#1
    \divide\tempcount 2
    #1 / 2 = \number\tempcount
}

我想写一些类似的东西

\begin{document}
    \othermacro{\remainder{17}{3}}
\end{document}

并给出以下结果

2 / 2 = 1

我该怎么做?

答案1

\remainder和的定义中存在一些错误\othermacro\newcount声明不能放在它们里面,因为这会在每次调用时浪费一个计数器。后面的空格也#2很重要,这意味着 TeX 会在第二个参数后寻找空格,如果找不到,则会引发错误,并将第一个参数之后直到这个空格的所有内容作为第二个参数。

\newcount\dividendcount
\newcount\quotientcount
\def\remainder#1#2{%
  \dividendcount=#1
  \quotientcount=#1
  \divide\quotientcount #2
  \multiply\quotientcount #2
  \advance\dividendcount -\quotientcount
  \number\dividendcount
}

更正确。然而这是印刷其余部分,这在类似这样的作业中是不合法的

\tmpcount=\remainder{17}{3}

因为 TeX 想要<number>在 后面有一个=,而不是生成一个 的指令。

\remainder如果您打算在这样的作业上下文中使用,则需要使其可扩展,并且这需要\numexpr

使用起来相当容易expl3;我假设使用 LaTeX,但是使用 Plain TeX 也可以做到。

\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\DeclareExpandableDocumentCommand{\remainder}{mm}
 {
  \int_eval:n { \int_mod:nn { #1 } { #2 } }
 }
\NewDocumentCommand{\othermacro}{m}
 {
  $ % enter math mode
  #1/2=\int_eval:n { \int_div_truncate:nn { #1 } { 2 } }
  $ % exit math mode
 }
\ExplSyntaxOff

\begin{document}

\othermacro{\remainder{17}{3}}

\end{document}

在此处输入图片描述

这是 Plain TeX 版本

\input expl3-generic.tex

\ExplSyntaxOn
\cs_new:Npn \remainder #1 #2
 {
  \int_eval:n { \int_mod:nn { #1 } { #2 } }
 }

\cs_new_protected:Npn \othermacro #1
 {
  $ % enter math mode
  #1/2=\int_eval:n { \int_div_truncate:nn { #1 } { 2 } }
  $ % exit math mode
 }
\ExplSyntaxOff

\othermacro{\remainder{17}{3}}

\bye

没有expl3

\def\truncdiv#1#2{((#1-(#2-1)/2)/#2)}
\def\remainder#1#2{#1-\truncdiv{#1}{#2}*#2}
\def\eval#1{\number\numexpr#1\relax}

\def\othermacro#1{$\eval{#1}/2=\eval{\truncdiv{#1}{2}}$}

\othermacro{\remainder{17}{3}}

\bye

相关内容