从参数中提取字符串来调用另一个函数时出现问题

从参数中提取字符串来调用另一个函数时出现问题

在下面的程序中,我定义了一个函数\checklist,该函数接受两个可选参数和一个强制参数。该函数按预期运行。

然后,我想定义另一个\othercheck调用的函数\checklist

  • 例如,\othercheck[10]{blah}应该调用\checklist[1][0]{blah}
  • 例如,\othercheck[11]{blah}应该调用\checklist[1][1]{blah}

为什么会返回以下错误?我理解这可能是因为输入的是字符串而不是数字,但我无法使用某些转换策略(etoolbox等)来克服这个问题。

! 缺失数字,视为零。\let l.39 ...check[01]{应检查第二个方格}

  \documentclass{article}
  \usepackage{etoolbox}
  \usepackage{wasysym} 
  \usepackage{xparse}

  \usepackage{xargs}
  \newcommandx{\checklist}[3][1=0, 2=0]{
   \ifnumcomp{#1}{=}{0}{\Square}{\XBox}%
   \ifnumcomp{#2}{=}{0}{\Square}{\XBox}%
   #3%
   }%

  \usepackage{xstring}
  \newcommandx{\othercheck}[2][1=]{%
   % if no optional argument
   \ifstrempty{#1}{\checklist{#2}}%
   {%
    % if optional argument
    \def\varA{\StrMid{#1}{1}{1}}
    \def\varB{\StrMid{#1}{2}{2}}
    \checklist[\varA][\varB]{#2}
    }%
   }%
  
  \begin{document}
  \checklist{Check this} % OK
  \checklist[1][0]{Check that} % OK
  \othercheck{Default: nothing checked} % OK
  %\othercheck[01]{Second square should be checked} % <---- crashes
  \end{document}

答案1

我不会使用xargs:用ltcmd(以前xparse)这样更容易。

错误在于\def\varA{...}。请参阅下面的正确方法。

\documentclass{article}
\usepackage{etoolbox}
\usepackage{wasysym} 
\usepackage{xparse}
\usepackage{xstring}

\NewDocumentCommand{\checklist}{O{0}O{0}m}{%
  \ifnumcomp{#1}{=}{0}{\Square}{\XBox}%
  \ifnumcomp{#2}{=}{0}{\Square}{\XBox}%
  #3%
}

\NewDocumentCommand{\othercheck}{om}{%
 % if no optional argument
 \IfNoValueTF{#1}{\checklist{#2}}%
  {%
   % if optional argument
   \StrMid{#1}{1}{1}[\varA]%
   \StrMid{#1}{2}{2}[\varB]%
   \checklist[\varA][\varB]{#2}
  }%
}

\begin{document}

\checklist{Check this}

\checklist[1][0]{Check that}

\othercheck{Default: nothing checked}

\othercheck[01]{Second square should be checked}

\end{document}

在此处输入图片描述

但是你的\checklist命令太复杂了,\othercheck可以做得更好。

您似乎想要将一个两位字符串传递给命令,然后根据位值选中或取消选中。

\documentclass{article}
\usepackage{wasysym} 

\ExplSyntaxOn
\NewDocumentCommand{\newcheck}{O{00}m}
 {
  \str_map_function:nN { #1 } \anderstood_check:n
  \ #2
 }

\cs_new:Nn \anderstood_check:n
 {
  \str_case:nn { #1 }
   {
    {0}{\Square}
    {1}{\XBox}
   }
 }

\ExplSyntaxOff

\begin{document}

\newcheck{Default: nothing checked}

\newcheck[01]{Second square should be checked}

\newcheck[10]{First square should be checked}

\newcheck[11]{Both squares should be checked}

\end{document}

在此处输入图片描述

相关内容