我的方程式中有一种特殊的变量,我想对其进行格式化取决于其情况(较低或较高)。
我已经尝试使用包字符串,但数学模式和括号分组似乎存在问题。在下面的例子中,它总是选择然后部分,忽略变量是否为小写。
\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}