这是我正在处理的代码示例:
\documentclass[10pt]{report}
\usepackage{xstring}
\usepackage{ifthen}
\begin{document}
\StrLen{123456}\\ %Prints 6
\ifthenelse{\equal{6}{6}}{TRUE}{FALSE}\\ %Prints True
%\ifthenelse{\equal{\StrLen{123456}}{6}}{TRUE}{FALSE} %Want to print true
\end{document}
我正在尝试将一个命令嵌套在另一个命令中。在这种情况下,\StrLen
命令位于命令内部\ifthenelse
。有没有办法解决我遇到的问题?
答案1
您的尝试所遇到的问题以及解决方案在xstring
文档中有说明:
此包中的宏并非纯粹可扩展的,即它们不能放入 \edef 的参数中。嵌套宏也是不可能的。
因此,所有返回结果的宏(即除测试之外的所有宏)在最后位置都有一个可选参数。语法是 [ name ],其中 name 是将接收宏结果的控制序列的名称:使用 \edef 进行赋值,使宏名称的结果完全可扩展。当然,如果存在可选参数,则宏不会显示任何内容。
因此,解决方案是使用可选参数将\StrLen
长度存储在命令中,然后在里面使用此命令ifthenelse
:
\documentclass{report}
\usepackage{xstring}
\usepackage{ifthen}
\newcommand\CompLen[1]{%
\StrLen{#1}[\MyStrLen]% we find the length of the string and store it in \MyStrLen
\ifthenelse{\equal{\MyStrLen}{6}}% we compare the length of the string with 6
{TRUE}{FALSE}}
\begin{document}
\CompLen{123456}
\CompLen{123}
\end{document}
答案2
因为你要测试数字,所以你想要
\ifthenelse{\StrLen{123456} = 6}{TRUE}{FALSE}