LaTeX 如何打出细长的大写罗马数字？
查了一下，在 LaTeX 中大写的罗马数字使用以下命令：

    
    
    \uppercase\expandafter{\romannumeral 7}

我试了一下，下面这条命令也可以：

    
    
    \MakeUppercase{\romannumeral 7}

得到的效果应该是一样的，如下：

我想得到书上的效果，如下：

我尝试使用嵌套的下标，并输入下列代码：

    
    
    $D_{\MakeUppercase{\romannumeral 7}_7}$

生成出来的效果如下：

总之效果不太一样，主要是罗马数字有点太宽了，不知道怎么解决。

谢谢大家！
这问题很有意思。在以下内容里，TeX primitive 是经常出现的一个词，表示 TeX 引擎提供的不可展开的命令。首先，题主在互联网上找到的\uppercase\expandafter{\romannumeral 数字} 实际上是 plain TeX 的用法。后面的\MakeUppercase{\romannumeral 数字} 是 LaTeX 的用法。接下来详细讲讲。用于数字处理的 TeXprimitive——\romannumeralTeX 提供了一个 \romannumeral命令用于将其所在分组内的数字转换为小写罗马数字的形式，举个例子：{\romannumeral 9}得到字符串IX（注意这里的“字符串”，后面有用）。用于大小写转换的 TeX primitive——\uppercase 和 \lowercase\uppercase需要带一个用花括号括起来的参数，会将参数中所有肉眼可见的小写字母转换为大写字母。举个例子：\uppercase{ABCabc}得到ABCABC。\lowercase 命令同理，效果是将大写字母转换为小写字母。控制展开顺序刚才说到，\uppercase 和 \lowercase的效果是将参数中肉眼可见的字母进行大小写转换。那么，如果这些字母不是肉眼可见的呢？比如：\def\testtext{ABCabc} % 将 ABCabc定义为 \testtext 命令 \testtext \uppercase{\testtest}\lowercase{\testtext}你会发现，输出结果是这样的：这些字母的大小写根本没发生变化。问题出在宏展开的顺序上。TeX 在读取输入内容时，将\testtext 视为一个宏，先执行 \uppercase，然后将 \testtext 替换为 ABCabc。这样，\testtext的具体定义实际上并没有被 \uppercase 处理。那么，解决方案就是先将 \testtext 替换为 ABCabc，然后执行\uppercase。这样就要用到另一个 primitive 了——那就是 \expandafter。\expandafter 后面跟两个token，会将第二个 token 完全展开：\expandafter上面的 token2 被展开，token1被忽略。举个例子：\def\testtext{ABCabc} \expandafter\testtext\testtext上面的第 2 行被处理后得到\testtext ABCabc。所以，\uppercase\expandafter{\romannumeral 7} 经过处理后得到\uppercase{vii}（注意 { 也是一个 token）。 LaTeX 中的大小写转换命令——\MakeUppercase 和\MakeLowercase在 LaTeX 内核的（几乎是）最后提供了 \MakeUppercase 和 \MakeLowercase两个命令，用于“简单地”转换大小写。例如：\def\testtext{ABCabc}\MakeUppercase{\testtext}会直接得到因此，\MakeUppercase{\romannumeral 7} 无需包含任何\expandafter 即可得到字符串 VII。总结 1：LaTeX 内核中的罗马数字LaTeX 内核中的罗马数字（比如计数器的实现）本质上也是通过这些primitive 得到一个字符串。但是在绝大多数字体下，这种由英文字母组成的字符串都会比较宽。实际上，问题描述中的两种方法都相当于直接输入VII。直接在数学模式放到下标中的效果是比较宽的：\\[ D_{VII_7} \\]实际上呢，对于这种音乐记号，推荐全部使用直立罗马体。比如：\\[\mathrm{D_{VII_7}} \qquad \mathrm{D}_{\mathrm{VII}_7}\\]得到（几乎是）唯一的区别在于使用了缺省状态下的 unicode-math 包的时候，下标中的数字放在 \mathrm的参数中会发生一些变化，这里就不介绍原因了。Unicode 中的罗马数字问题描述中的最后给出了这样一张图片：不用多说，肯定是方正系的软件得到的结果（标志性的Bodoni Book 与 Times 组合起来并换了个名字得到的正文字体）。实际上呢，这里的 VII 可以认为是一个字符，对应 Unicode 字符U+2166（Ⅶ）。但是大多数英文字体不包含这些罗马数字（比如 Latin Modern 和 TeX Gyre系列字体），中文字体有一些则包含了罗马数字，比如方正书宋：在 LaTeX 中使用这种看起来比较细的罗马数字也不难，用 XeLaTeX/LuaLaTeX 下的fontspec 包就是了：% 导言区 \usepackage{fontspec} % 编译方式使用 xelatex 或 lualatex\fontspec{FZSSK.ttf}ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩ嗯哼哼啊啊啊啊啊啊啊得到这样的效果：然后你就惊喜的发现，这都是全角（每个罗马数字跟汉字一样宽）。也就是说，很多中文字体（包括SimSun）中的这些这些罗马数字用来排版得到的效果非常不均匀：Ⅰ旁边太宽，Ⅷ旁边太窄，效果实在是不行。总结 2：在 LaTeX中健康地使用罗马数字如果你没有安装一款令人满意的字体，不要刻意模仿方正的字体效果，老老实实用字符串就可以。对于问题中的需求，建议使用：$\mathrm{D}_{\mathrm{VII}_7}$（用了amsmath 包也可以考虑用 \text 命令）