我使用数千个“符号”,它们要么是变量,要么是常量。我希望x
将任何变量排版为\variable{x}
,将任何常量a
排版为\constant{a}
。
如果“符号”至少有两个字符长,则该符号为常量。如果符号长度为一个字符且在 [ah] 或 [AH] 范围内,则该符号为常量。否则该符号为变量。
假设符号仅由字母组成,以下 Expl3 代码就可以正确完成此操作:
\documentclass{article}
\usepackage{xparse}
\newcommand{\constant}[1]{\mathsf{#1}}
\newcommand{\variable}[1]{#1}
\ExplSyntaxOn
\NewDocumentCommand \symbol { m } {
\str_case_x:nnTF { #1 } {
{i}{}{j}{}{k}{}{r}{}{m}{}{n}{}{o}{}{p}{}{q}{}{r}{}{s}{}{t}{}{u}{}{v}{}{w}{}{x}{}{y}{}{z}{}
{I}{}{J}{}{K}{}{R}{}{M}{}{N}{}{O}{}{P}{}{Q}{}{R}{}{S}{}{T}{}{U}{}{V}{}{W}{}{X}{}{Y}{}{Z}{}
}{\variable{#1}}{\constant{#1}}
}
\ExplSyntaxOff
\begin{document}
$\symbol{lorem}, \symbol{ipsum}, \symbol{a}, \symbol{x}$
\end{document}
然而我希望得到一些改进,但我不知道该怎么做。
- 如果一个符号以一个或多个撇号结尾(例如
x''
),则这些撇号不需要在上述规则中考虑(即x''
是一个变量); - 如果符号使用下标(例如
x_2
),则下标不需要在上述规则中考虑(即为x_2
变量)
目前,我使用上述代码的一个丑陋改编,在测试中我将 i' 添加到 z'、i'' 添加到 z'' 以及将 i''' 添加到 z'''(大写符号也是如此)。但是,我没有下标的解决方案。我想我可以找到一个,如果我可以让以下代码工作,但字符串并没有像我预期的那样被拆分:
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand \bla { m } {
\seq_set_split:Nnn \test {\c_math_subscript_token} {#1}
\seq_use:Nn \test {,}
}
\ExplSyntaxOff
\begin{document}
$\bla{A_1}$
\end{document}
(这将生成以 1 作为下标的 A,而不是 A 后跟逗号再跟 1)。
为了让您理解这一点,我将这个\symbol
宏应用于逗号分隔的列表,这样我就可以编写类似a, x, y, z, b, a, g
而不是的内容\constant a, \variable x, \variable y, \variable z, \constant b, \constant a, \constant g
。我在整个文档中使用了数千个符号,这些快捷方式对我来说非常方便,使我的 LaTeX 源代码更具可读性。
答案1
这尖叫常用表达!
- 连续两个或多个字母
[A-Za-z]{2,}
,或 - 一个字母
a-h
或A-X
应该变成\constant{...}
。
\documentclass{article}
\usepackage{xparse,l3regex}
\newcommand{\constant}[1]{\mathsf{#1}}
\ExplSyntaxOn
\NewDocumentCommand{\sym}{m}
{
\tl_set:Nn \l_pijcke_symbol_tl { #1 }
\regex_replace_all:nnN { ([a-z]{2,}|[A-Ha-h]{1}) } { \c{constant}\cB\{\1\cE\} } \l_pijcke_symbol_tl
\tl_use:N \l_pijcke_symbol_tl
}
\tl_new:N \l_pijcke_symbol_tl
\ExplSyntaxOff
\begin{document}
$\sym{lorem}, \sym{ipsum}, \sym{a}, \sym{x}$
$\sym{a'}, \sym{B_1}, \sym{x''}, \sym{x_1}$
\end{document}