我编写了一个计算余数的宏:
\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