嗯,我喜欢问题中表达的想法使用 tex 的下标替代语法。但我希望它能以稍微不同的方式发挥作用。
我只想扩展通常的_
and ^
。怎么做?这样,如果有空格,代码就会从 sup/下标中跳出(请参阅底部的例外情况):
a_11 + b_123ijk + c_k\ell
应该与 相同a_{11} + b_{123ijk} + c_{k\ell}
。- 上标也是一样:
m^qwpoeriu
等于m^{qwpoeriu}
。
目前,我在序言中写了这段代码(如果你想写F_\mathrm{max}
你可以这样做,这会有所帮助F_|max|
),所以解决方案不应该破坏它
\makeatletter
\begingroup\catcode`\_=\active\protected\gdef_{\@ifnextchar|\subtextup\sb}\endgroup
\def\subtextup|#1|{\sb{\mathrm{#1}}}
\AtBeginDocument{\catcode`\_=12 \mathcode`\_=32768}
\makeatother
为什么?
我通常会在代码中留出空格\biggl( a_b \cdot \cos(x - c) = 1 \times \vec v
,而不是\biggl(a_b\cdot\cos(x-c)=1\times\vec v
,因为我发现这样更容易阅读。所以这对我来说很容易奏效,因为在很多时候我不需要写{}
。当然,有时我仍然需要这样做,即\alpha_k\ell + \alpha_{\ell k} = 1
。
编辑:a_b_c_d + e
还有更多。我对像a_{b_{c_d}} + e
(和一样)不是特别感兴趣^
,但我认为如果那样也能起作用那就太好了(这意味着空格应该避开所有的下标/上标)。
还有更多的事情,不仅空格应该逃避下标/上标,还有这个:
- 替代 sup/下标,即:
a_b^c + 1 = 0
应该像a_{b}^{c} + 1 = 0
和a^blk_ijk
一样工作a^{blk}_{ijk}
, - 数学的结局
$a_bcde$
应该是这样的$a_{bcde}$
, - 以及一个右括号:
\frac{1}{a_ijk}
等于\frac{1}{a_{ijk}}
。
答案1
我请求@barbarabeeton 的原谅。
我只是给你一个测试,抵制使用它的诱惑......
\documentclass{article}
\makeatletter
\catcode`\_\active
\catcode`\^\active
\def_{\sb\bgroup\xcollectsub}
\def^{\sp\bgroup\xcollectsub}
\def\xcollectsub{\afterassignment\collectsub\global\let\tmp= }
\def\collectsub{%
\def\next\tmp{\tmp\xcollectsub}%
\ifx\tmp\@sptoken\let\next\egroup\fi
\ifx\tmp$\let\next\egroup\fi
\ifx\tmp\egroup\let\next\egroup\fi
\ifx\tmp\bgroup\def\next{\global\let\tmp}\fi
\next\tmp}
\makeatother
\begin{document}
$\frac{1}{a_ijk}$
$a_11 + b_123ijk + c_k\ell$
should be the same as
$ a_{11} + b_{123ijk} + c_{k\ell}$.
And the same for superscripts:
$ m^qwpoeriu $ equal to $ m^{qwpoeriu}$
$\frac{1}{a_ijk}$ equal to $\frac{1}{a_{ijk}}$.
\end{document}
答案2
(以下答案最初是为了回答这个问题而发布的在 LaTeX 数学模式下使下划线持久(用于长下标)。该查询作为当前查询的重复项关闭后,它被移到这里。)
以下基于 LuaLaTeX 的解决方案假设与上标/下标相关的内容以空格或+
、-
、=
或$
符号结尾。它进一步假设上标/下标内容仅由大写和小写字母、数字和逗号组成。即上标/下标中没有+
或-
符号。(当然,下面使用的 Lua 代码可以根据您的需要进行更改。)请注意,该代码也适用于与\sum
和\int
表达式相关的上标和下标。
\documentclass{article}
\usepackage{luacode}
\begin{luacode}
function do_sub_super_grouping ( s )
return ( string.gsub ( s , "([_%^])([%w%,]+)([%s%$%-%+%=])", "%1{%2}%3" ) )
end
luatexbase.add_to_callback ( "process_input_buffer" ,
do_sub_super_grouping , "do_sub_super_grouping" )
\end{luacode}
\begin{document}
$\sum_i,j,k ^100 x_ijk y^ijk+a_12,34 ^56 b^7890- c^u,9,v d_v7,v7$
\end{document}