根据变量的大小写,以数学模式格式化变量

根据变量的大小写,以数学模式格式化变量

我的方程式中有一种特殊的变量,我想对其进行格式化取决于其情况(较低或较高)。

我已经尝试使用包字符串,但数学模式和括号分组似乎存在问题。在下面的例子中,它总是选择然后部分,忽略变量是否为小写。

\documentclass{article}
\usepackage{stringstrings}
\usepackage{amssymb}

\newcommand{\testStringstrings}[1]{\testlowercase{#1}\iflowercase{is lowercase}\else{is uppercase}\fi}

\newcommand{\specialvar}[1]{\testlowercase{#1}\iflowercase{\mathrm{#1}}\else{\mathbb{#1}}\fi} % always called within math-mode

\begin{document}

    % works fine
    t \testStringstrings{t} and T \testStringstrings{T}

    % does not work as expected (T should be formatted with \mathbb but is in \mathrm)
    \(\specialvar{t} \in \specialvar{T}\)

\end{document}

有没有一个好的解决方案来解决这个问题?

答案1

如果参数中有多个字母\specialvar或不是字母的东西,那么就会发生奇怪的事情,但是情况就是这样:

\documentclass{article}
\usepackage{amssymb}

\newcommand{\specialvar}[1]{%
  \ifnum\lccode`#1=`#1
    \mathrm{#1}%
  \else
    \mathbb{#1}%
  \fi
}

\begin{document}

\(\specialvar{t} \in \specialvar{T}\)

\end{document}

在此处输入图片描述

似乎有一个错误stringstrings,因为

\testlowercase{A}\iflowercase\LOWER\else\UPPER\fi
$\testlowercase{A}\iflowercase\LOWER\else\UPPER\fi$

LaTeX 停止

! Undefined control sequence.
l.12 ...tlowercase{A}\iflowercase\LOWER\else\UPPER
                                                  \fi

在第一种情况下,但

! Undefined control sequence.
l.13 $\testlowercase{A}\iflowercase\LOWER
                                         \else\UPPER\fi$

在第二种情况下。


一种解决方法是使用stringstrings,但它会在数学公式中添加一个空的普通原子(但不会产生任何副作用):

\documentclass{article}
\usepackage{stringstrings}
\usepackage{amssymb}

\newcommand{\specialvar}[1]{%
  \mbox{\testlowercase{#1}\expandafter}\iflowercase \mathrm{#1}\else\mathbb{#1}\fi
} % always called within math-mode

\begin{document}

\(\specialvar{t} \in \specialvar{T}\)

\end{document}

条件在空框完成之前被扩展,但真值是已知的。

不添加数学原子的另一种解决方法是使用临时框和\aftergroup

\documentclass{article}
\usepackage{stringstrings}
\usepackage{amssymb}

\newcommand\testmlowercase[1]{%
  \sbox0{%
    \testlowercase{#1}%
    \iflowercase
      \aftergroup\lowercasetrue
    \else
      \aftergroup\lowercasefalse
    \fi
  }%
}

\newcommand{\specialvar}[1]{%
  \testmlowercase{#1}\iflowercase \mathrm{#1}\else\mathbb{#1}\fi
} % always called within math-mode

\begin{document}

\(\specialvar{t} \in \specialvar{T}\)

\end{document}

答案2

更新:引起 OP 查询的软件包错误stringstrings已在 V1.23 中得到解决,并于 2015 年 2 月 2 日上传到 CTAN。以下答案(在 V1.23 之前开发)提供了与软件包早期版本一起使用的解决方法。


我看代码已经很久了,但似乎测试在数学模式下不起作用,所以为了修复这种情况,我把它塞进去\mbox并保存了一个中间标志。

如果有人想知道为什么我使用中间标志\tmp,那是为了保持实际输出外部,这\mbox将允许它采用当前的数学风格,如 EDITED MWE 中所示。

\documentclass{article}
\usepackage{stringstrings}
\usepackage{amssymb}

\newcommand{\testStringstrings}[1]{\testlowercase{#1}\iflowercase{is lowercase}\else{is uppercase}\fi}

\newcommand{\specialvar}[1]{%
  \mbox{\testlowercase{#1}\iflowercase{\gdef\tmp{T}}\else\gdef\tmp{F}\fi}%
  \if T\tmp\mathrm{#1}\else\mathbb{#1}\fi%
} % always called within math-mode

\begin{document}

    % works fine
    t \testStringstrings{t} and T \testStringstrings{T}

    % now works as expected (T should be formatted with \mathbb and it is)
    \(\specialvar{t} \in \specialvar{T}\)
    \(\scriptstyle\specialvar{t} \in \specialvar{T}\)
    \(\scriptscriptstyle\specialvar{t} \in \specialvar{T}\)

\end{document}

在此处输入图片描述

相关内容