根据 J.Wright 的回答 我想计算操作的字符数。然而,下面代码的输出是
16 123212
我期望计算前一个字符的数量,而不是粗体数字12321
。我做错了什么?
\documentclass{standalone}
\usepackage{pgfplots}
\usetikzlibrary{calc}
\def\zCountDigits#1{%
\number\numexpr0\zCountDigitsAux#1\zCountDigitsEnd\relax
}
\def\zCountDigitsAux#1{%
\ifx\zCountDigitsEnd#1\else+1\expandafter\zCountDigitsAux\fi
}
\def\zCountDigitsEnd{\zCountDigitsEnd}
\begin{document}
\newcommand{\eval}[1]{\pgfmathparse{#1}\pgfmathresult}
% the result of the next is 16, as should
\zCountDigits{0123456789ABCDEF}
% the evaluation gives 12321
\eval{int(111*111)}
% but the counting the result gives 2, not five
\zCountDigits{\eval{int(111*111)}}
\end{document}
答案1
常见的问题:\eval
不可扩展。
这是一个更直接的实现expl3
。
\documentclass{article}
\usepackage{xparse,xfp}
\ExplSyntaxOn
\NewExpandableDocumentCommand{\CountDigits}{m}
{
\cp_count_digits:e { #1 }
}
\cs_new:Nn \cp_count_digits:n { \tl_count:n { #1 } }
\cs_generate_variant:Nn \cp_count_digits:n { e }
\ExplSyntaxOff
\begin{document}
% the result of the next is 16, as it should
\CountDigits{0123456789ABCDEF}
% the evaluation gives 12321
\inteval{111*111}
% the counting of digits in the result gives 5, as it should
\CountDigits{\inteval{111*111}}
\end{document}
答案2
@egreg 解释了你的方法失败的原因:你的宏不可扩展。有两种选择:要么换个方式,使用机器expl3
。这样做没有错。另一方面,如果你使用pgf
,tikz
和/或pgfplots
,最好将这些函数构建到 pgf 生态系统中。对于许多函数来说,这已经完成了,特别是digitsum 已经可用。所以你可以直接使用它。我实际上建议不要使用宏,而是建议使用解析和数字打印机,但我也添加了一个宏。
\documentclass{article}
\usepackage{pgf}
\makeatletter
\newcount\c@Digits
\newcount\c@Powers
\pgfmathdeclarefunction{digitcount}{1}{%
\begingroup%
\global\c@Digits=0%
\expandafter\DigitCount@i#1\@nil%
\pgfmathparse{int(\the\c@Digits)}%
\pgfmathsmuggle\pgfmathresult\endgroup}
\def\DigitCount@i#1#2\@nil{%
\advance\c@Digits by \@ne%
\ifx\relax#2\relax\else\DigitCount@i#2\@nil\fi%
}
\makeatother
\newcommand{\DigitCount}[1]{\pgfmathparse{digitcount(int(#1))}\pgfmathresult}
\begin{document}
If you really want a marco: \DigitCount{111*111}
Cross--check: \pgfmathparse{int(111*111)}\pgfmathprintnumber\pgfmathresult
I'd suggest parsing within the pgf system: \pgfmathparse{digitcount(int(111*111))}\pgfmathprintnumber\pgfmathresult
Works with strings, too: \pgfmathparse{digitcount("0123456789ABCDEF")}\pgfmathprintnumber\pgfmathresult
\end{document}