![如何扩展命令以将其本身用作参数](https://linux22.com/image/416236/%E5%A6%82%E4%BD%95%E6%89%A9%E5%B1%95%E5%91%BD%E4%BB%A4%E4%BB%A5%E5%B0%86%E5%85%B6%E6%9C%AC%E8%BA%AB%E7%94%A8%E4%BD%9C%E5%8F%82%E6%95%B0.png)
我尝试让这个宏工作了几天。我把问题简化为:
\documentclass[10pt,a4paper]{article}
\usepackage{xintgcd,xintfrac} % Simplify Script
\begin{document}
\newcommand*\simpFrac[2]
{\begingroup
\edef\gcd{\xintGCD{#1}{#2}}%
\ifnum \xintNum{\xintDiv{#2}{\gcd}}=1
\xintNum{\xintDiv{#1}{\gcd}}
\else
\frac{\xintNum{\xintDiv{#1}{\gcd}}}{\xintNum{\xintDiv{#2}{\gcd}}}%
\fi
\endgroup}
\def\surgefif{\edef\simpFrac{4}{2}}
$\simpFrac{10}{ \surgefif }$
\end{document}
该simpFrac
命令主要是“复制和粘贴”,但我添加了在分母为
我尝试使用\edef
,弄乱了\expandafter
,但什么也做不了,所以我放弃了。
预期行为:
- 简化 4/2 -> 2
- 简化 10/2 -> 5
答案1
使用 lualatex 的解决方案:
\documentclass[10pt,a4paper]{article}
\newcommand*\simpFrac[2]{%
\directlua{
if (#1/#2 - math.floor(#1/#2)) == 0
then tex.sprint(math.floor(#1/#2))
else tex.sprint("#1/#2")
end}
}
\begin{document}
\simpFrac{10}{3}
\def\surgefif{\simpFrac{4}{2}}
\simpFrac{10}{\surgefif}
\simpFrac{10}{\simpFrac{4}{2}}
\end{document}