在下面的程序中,我定义了一个函数\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}