如何在命令行界面打印下标/上标?

9
我正在编写一段处理数学变量和指数的代码,并且需要在CLI上打印下标和上标,是否有一种(可能是跨平台的)方法来实现这一点?我正在使用原始的C++。
注意:我希望这可以跨平台,但由于第一个答案似乎不可能,所以我正在MacOS和Ubuntu Linux下工作(因此使用bash)。
谢谢!
2个回答

15

由于大多数 CLI 实际上只是终端(主要是相当愚蠢但有时具有颜色),我曾经使用的唯一跨平台方法是为每个虚拟行分配多个物理行,例如:

        2
f(x) = x  + log x
               2

虽然不是理想的解决方案,但在没有图形界面的情况下这可能是最好的选择。

以下是关于你主要感兴趣的平台的额外信息:

至少在Ubuntu上,gnome-terminal默认以UTF-8模式运行,因此以下代码展示了如何生成上标和下标:

#include <stdio.h>

static char *super[] = {"\xe2\x81\xb0", "\xc2\xb9", "\xc2\xb2",
    "\xc2\xb3", "\xe2\x81\xb4", "\xe2\x81\xb5", "\xe2\x81\xb6",
    "\xe2\x81\xb7", "\xe2\x81\xb8", "\xe2\x81\xb9"};
static char *sub[] = {"\xe2\x82\x80", "\xe2\x82\x81", "\xe2\x82\x82",
    "\xe2\x82\x83", "\xe2\x82\x84", "\xe2\x82\x85", "\xe2\x82\x86",
    "\xe2\x82\x87", "\xe2\x82\x88", "\xe2\x82\x89"};

int main(void) {
    int i;
    printf ("f(x) = x%s + log%sx\n",super[2],sub[2]);
    for (i = 0; i < 10; i++) {
        printf ("x%s x%s ", super[i], sub[i]);
    }
    printf ("y%s%s%s z%s%s\n", super[9], super[9], super[9], sub[7], sub[5]);
    return 0;
}
supersub char*数组是Unicode数值上标和下标的UTF-8编码(请参见这里)。给定的程序将输出我的上述公式(一行而不是三行),然后是所有选择的另一条测试线,以及一个y-super-999和z-sub-75,以便您可以看到它们的样子。
在MacOS中,似乎并未使用gnome-terminal作为终端程序,但这里这里的引用似乎表明标准终端程序理解UTF-8(或者您可以作为最后的手段下载和安装gnome-terminal)。

非跨平台的方式呢? - tunnuz
这取决于平台 :-) 如果您能告诉我们您希望能够运行的平台,我们可能能够帮助您。 - paxdiablo

8

我需要在CLI上打印下标和上标,有没有跨平台的方法可以做到这一点?

只有当您拥有一个支持Unicode的终端时才能实现,但这并不是保证的。 Unicode定义了有限数量的下标和上标“兼容字符”,您肯定不能在任何旧字母上使用它:

₀₁₂₃₄₅₆₇₈₉₊₋₌₍₎ₐₑₒₓ
⁰¹²³⁴⁵⁶⁷⁸⁹⁺⁻⁼⁽⁾ⁿⁱ

即使如此,您仍然依赖于控制台字体中是否有该字符的字形,这也远非保证。上标2和3可能存在,因为它们在ISO-8859-1中存在;其他字符可能无法正常工作。


我只需要数字的下标和上标。 - tunnuz
那么,好的,但是如何从C++中打印它们呢? - tunnuz
wchar_t/wprintf/std::wstring,我猜。 - bobince

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接