我想定义一个命令,使它对单字符参数的行为与对长参数的行为不同。如何检索字符数,例如#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}