我想在文本模式下同时使用下标和上标。我发现这个宏可以解决这个问题
\def\textsubsuperscript#1#2{\rlap{\textsubscript{#1}}\textsuperscript{#2}}
但是当下标很长的时候,这种方法就不太适用了。下标会和后面的字符重叠。
在所有情况下,启用下标和上标的宏是什么?
答案1
我们需要为两个上标/下标中的最长者留出足够的空间。为此,我们可以计算两个上标/下标宽度的最大值,并制作一个与最大值一样宽的框:
\documentclass{article}
\usepackage{fixltx2e} % For \textsubscript
\makeatletter
\newcommand{\textsubsuperscript}[2]{%
\begingroup
\settowidth{\@tempdima}{\textsubscript{#1}}%
\settowidth{\@tempdimb}{\textsuperscript{#2}}%
\ifdim\@tempdima<\@tempdimb
\setlength{\@tempdima}{\@tempdimb}%
\fi
\makebox[\@tempdima][l]{%
\rlap{\textsubscript{#1}}\textsuperscript{#2}}%
\endgroup}
\makeatother
\begin{document}
A\textsubsuperscript{x}{yyy}B
A\textsubsuperscript{xxx}{y}B
\end{document}
我避免使用数学模式,\text
因为\textsuperscript
和的\textsubscript
实现可能比看起来更复杂(见realscripts
, 例如)。
答案2
\makeatletter
\DeclareRobustCommand*\textsubsuperscript[2]{%
\@textsubsuperscript{\selectfont#1}{\selectfont#2}}
\def\@textsubsuperscript#1#2{%
{\m@th\ensuremath{_{\mbox{\fontsize\sf@size\z@#1}}
^{\mbox{\fontsize\sf@size\z@#2}}}}}
\makeatother
\textsuperscript
它与 LaTeX 内核中的代码相同,但添加了下标。
结果和Andrey的一样。
答案3
版本expl3
:
\cs_new_protected:Nn \my_super_sub:nn
{
\group_begin:
\hbox_set:Nn \l_tmpa_box { \textsuperscript {#1} }
\hbox_set:Nn \l_tmpb_box { \textsubscript {#2} }
\hbox_to_wd:nn
{ \dim_max:nn { \box_wd:N \l_tmpa_box } { \box_wd:N \l_tmpb_box } }
{ \hbox_overlap_right:n { \box_use:N \l_tmpa_box } \box_use:N \l_tmpb_box }
\group_end:
}