我有一个宏\myNumericString
,可以将其扩展为数字字符串,并可以将减号显示为第一个非空格字符。我该如何构造宏:
\isNegative{\myNumericString}{ true }{ false }
以便决定如何处理\myNumericString
连续的排版步骤?这里有一个简单的使用示例:
\[
4 \times \isNegative{\myNumericString}{
( \myNumericString ) }{ \myNumericString }
\]
答案1
如果你是当然这\myNumericString
就是 TeX 所期望的<number>
,那么
\makeatletter
\newcommand{\isNegative}[1]{%
\ifnum#1<0
\expandafter\@firstoftwo
\else
\expandafter\@secondoftwo
\fi}
\makeatother
如果\myNumericString
可能有小数部分,则可以使用
\ifdim#1pt<0pt
(整数部分不能超过16383)。
\myNumericString
一个更好的定义是只检查扩展中的第一个标记
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\isNegative}{m}
{
\exp_args:Nx \str_if_eq:nnTF { \tl_head:f { #1 } } { - }
}
\ExplSyntaxOff
以下是示例文档
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\isNegative}{m}
{
\exp_args:Nx \str_if_eq:nnTF { \tl_head:f { #1 } } { - }
}
\ExplSyntaxOff
\begin{document}
\def\myNumericString{123.456}
$4\times\isNegative{\myNumericString}{(\myNumericString)}{\myNumericString}$
\def\myNumericString{-123.456}
$4\times\isNegative{\myNumericString}{(\myNumericString)}{\myNumericString}$
\end{document}
答案2
如果所有参数都需要它:
\documentclass{article}
\makeatletter
\newcommand\isNegative[1]{\expandafter\is@Negative#1\@nil}
\def\is@Negative{\@ifnextchar-{\@negative}{\@positive}}
\def\@negative-#1\@nil{#1 starts with a minus}
\def\@positive#1\@nil{#1 starts not with a minus}
\makeatother
\begin{document}
\def\myNumericString{123.456}
\isNegative{\myNumericString}
\def\myNumericString{-123.456}
\isNegative{\myNumericString}
\isNegative{ -foo}
\end{document}