我有一个像这样的自定义宏来存储数据:
\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
。