如何检测字符串中第一个非空格/非制表符是否为“-”(减号)?

如何检测字符串中第一个非空格/非制表符是否为“-”(减号)?

我有一个宏\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}

相关内容