如何确定命令参数中的字符数

如何确定命令参数中的字符数

我想定义一个命令,使它对单字符参数的行为与对长参数的行为不同。如何检索字符数,例如#1

我想到的具体应用是,如果变量名称是单个字母,则将其设置为斜体,否则将其设置为罗马字母。例如

\newcommand \mathvar [1] {
    \ifthenelse {\characters{#1} = 1}
    {\mathit{#1))
    {\mathrm{#1}}     
}

是的,我的意思确实是指非空白字符的数量,而不是呈现的文本的大小。

请注意,我希望能够提交给 arXiv.org,但他们不支持 LuaTeX、XeTeX 等。我目前正在通过 MIKTeX 使用 PDFlatex,不知道 arXiv 是否接受 e-TeX;他们当前的版本相当旧。

我尝试使用 xstring;由于它不支持#,所以我不得不采取一种黑客手段:

\documentclass{article}
\usepackage{amsfonts}
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{ifthen}
\usepackage{xstring}

\newcommand {\funcname} [1]
   {
     \edef\Parameter1{#1}
     \StrDel[0]{\Parameter1}{ }[\stripped]
     \ifthenelse {\StrLen{\stripped} > 1}
       {\mathrm{#1}}
       {#1}
   }

\begin{document}

Test StrDel \{ foo \} \{ \} = /\StrDel { foo } { }/

\edef\Parameter1{ foo }
\StrDel {\Parameter1} { }[\stripped]
Test StrLen StrDel \{ foo \} \{ \} = \StrLen{\stripped}

Test funcname T funcname Table = $\funcname{T} \funcname{Table}$

\end{document}

这给了我

! Argument of \@xs@StrDel has an extra }.
<inserted text>
                \par
l.25 ...funcname T funcname Table = $\funcname{T}
                                                   \funcname{Table}$

答案1

很简单,使用expl3

\documentclass{article}
\usepackage{xparse} % loads expl3

\ExplSyntaxOn

\NewDocumentCommand{\mathvar}{m}
 {
  \int_compare:nTF { \tl_count:n { #1 } > 1 }
   {
    \mathrm{#1}
   }
   {
    #1 % or \mathit{#1}, but I wouldn't do it
   }
 }

\ExplSyntaxOff

\begin{document}

$\mathvar{V}\ne\mathvar{Var}$

\end{document}

代码应该是不言自明的:\tl_count:n计算其参数中的项目数(但忽略空格)。

我不会将其\mathit用于单字母变量,因为普通数学斜体是专门为此目的定制的。

在此处输入图片描述

实现如下xstring

\documentclass{article}
\usepackage{xstring}

\newcommand{\mathvar}[1]{%
  \begingroup\noexpandarg
  \StrLen{#1}[\temp]%
  \ifnum\temp>1
    \mathrm{#1}%
  \else
    #1%
  \fi
  \endgroup
}

\begin{document}

$\mathvar{V}\ne\mathvar{Var}$

\end{document}

答案2

这是一个基于 LuaLaTeX 的解决方案。它定义了一个名为 的宏\numchars,该宏返回其参数中的字符数,以及 的实现\mathvar。注意不要计算 参数中的空格字符\mathvar

在此处输入图片描述

% !TEX TS-program = lualatex
\documentclass{article}    
\usepackage{luacode} %  for "\luastring" macro and "luacode" environment
\begin{luacode}
function numchars ( s )  -- disregard any whitespace characters
   return tex.sprint ( unicode.utf8.len ( unicode.utf8.gsub ( s , "%s", "")))
end 
\end{luacode}
\newcommand\numchars[1]{\directlua{numchars(\luastring{#1})}}
\newcommand\mathvar[1]{%
   \ifnum\numchars{#1}<2\mathit{#1}\else\mathrm{#1}\fi}

\begin{document}
$\mathvar{ V }$, $\mathvar{VaR}$
\end{document}

答案3

更简单的解决方案。

\documentclass{scrartcl}

\long\def\gobbleone#1{}
\newcommand*\var[1]{\if\relax\detokenize\expandafter{\gobbleone#1}\relax#1\else\mathrm{#1}\fi}

\begin{document}

$\var{A} = \var{B} = \var{Whatever}$

\end{document}

相关内容