获取变量中数字的第一位数字

获取变量中数字的第一位数字

我有一个像这样的自定义宏来存储数据:

\somecommand{some text}{234}

newcommand此里面,我可以使用访问第二列数据#2

  • 我如何才能获得该数字的第一位数字?例如:

\somecommand{some text}{3012}给出3

\somecommand{some text}{21231}给出2

\somecommand{some text}{9}给出9

答案1

您可以\StrLeft使用字符串包裹:

\documentclass{article}
\usepackage{xstring}

\newcommand\somecommand[2]{%
  \StrLeft{#2}{1}}
\begin{document}

\somecommand{some text}{3012}

\somecommand{some text}{21231}

\somecommand{some text}{9}

\end{document}

答案2

使用 TeX 编程的通常方法是

\makeatletter
\newcommand{\somecommand}[2]{%
  \ifx\relax#2\relax
    \expandafter\@gobble
  \else
    \expandafter\@firstofone
  \fi
    {\GetFirstDigit#2\stop}%
}
\makeatother
\def\GetFirstDigit#1#2\stop{#1}

\stop‘不会出现的东西’在哪里#2

答案3

一个通用的解决方案xstring(但是比较棘手):

\def\helper#1{\let\temp#1\iffalse}
\newcommand\somecommand[2]{%
  \helper#2\fi
  \temp}

Joseph Wright 指出,如果#2是空的,它可能会失败。但是,它确实有效。

当我们使用时\somecommand{foo}{},我们有

#1->foo
#2->(empty)

然后\somecommand{foo}{}扩展为

\helper\fi
\temp

然后\helper\fi扩展到

\let\temp\fi\iffalse

因此我们有

\let\temp\fi\iffalse
\temp

因此

\iffalse\fi

无论如何,Joseph 的解决方案更好。我的解决\somecommand方案不可扩展,可能会失败\edef

答案4

如果您愿意,可以简化使用带有分隔参数的宏\def

\def\somecommand #1|#2#3|{%
  #2
}
\somecommand Plenty of text|1234567|

我使用|作为标记,但您可以使用任何您喜欢的符号。如果文本中没有分号,我会使用分号。这种类型的宏定义是 Knuth 的最爱,TeXbook 中有很多示例。如果文本长度超过一个段落,请使用\long\def

相关内容