顶部对齐字符

顶部对齐字符

我想知道是否有一个好的方法可以垂直对齐字符的顶部。

我正在尝试重现数字符号的特定样式,其中 N 旁边有一个 ọ(即 o 下方有一个点)。o 的顶部和 N 的顶部应该是齐平的。

在此处输入图片描述

我试过

\documentclass[12pt]{article}

\newlength{\nheigh}
\settoheight{\nheigh}{N}

\begin{document}

N\raisebox{\nheigh}{\d{o}}

\end{document}

但当然这会将 o 的底部与 N 的顶部对齐

答案1

让 TeX 进行计算;对于这样的工作,较低级别的原语更加灵活。

\documentclass{article}

\newcommand{\fancyno}{%
  \begingroup
  \sbox0{N}%
  N\vbox to\ht0{%
    \offinterlineskip
    \ialign{\hfil##\hfil\cr o\cr\noalign{\vfill}.\cr}%
  }%
  \endgroup
}

\begin{document}

\fancyno \quad {\LARGE\fancyno}

\end{document}

在此处输入图片描述

如果不想让句号位于基线上,则无需进行测量,假设\d{o}总垂直尺寸小于N

\documentclass{article}

\newcommand{\fancyno}{%
  \begingroup\tabskip 0pt % just for safety
  \valign{##\vfill\cr\hbox{N}\cr\hbox{\d{o}}\cr}%
  \endgroup
}

\begin{document}

\fancyno \quad {\LARGE\fancyno}

\end{document}

在此处输入图片描述

答案2

o好的开始。需要从的高度中减去的高度作为N提升量。的高度在内部o可用,可以使用 e-TeX 的进行计算:\height\raisebox\dimexpr

\documentclass[12pt]{article}

\newlength{\nheigh}
\settoheight{\nheigh}{N}

\begin{document}

N\raisebox{\dimexpr\nheigh-\height\relax}{\d{o}}

\end{document}

结果

可以定义一个宏,使用本地暂存寄存器来测量 的高度N。然后,该宏会自动适应当前大小:

\documentclass[11pt]{article}

\newcommand*{\No}{%
  \begingroup
    \settoheight{\dimen0}{N}%
    N\raisebox{\dimexpr\dimen0-\height\relax}{\d{o}}%
  \endgroup
}

\begin{document}

{\Huge\No}{\huge\No}{\LARGE\No}{\Large\No}{\large\No}{\No}%
{\small\No}{\footnotesize\No}{\scriptsize\No}{\tiny\No}

\end{document}

不同尺寸的结果

答案3

除了使用\raisebox,您还可以堆叠\vboxes。为此,\lineskip必须为零以避免不必要的空间,并且\lineskiplimit必须足够大,以便\lineskip首先使用 。然后,您可以\vtop为每个字符创建一个,该字符与字符上方的空框对齐,以使顶部对齐:

\documentclass[12pt]{article}

\newcommand\topalign[1]{%
  \leavevmode%
  \hbox{%
    \providecommand\tachar[1]{\vtop{\null\hbox{##1}}}%
    \vbox{%
      \lineskip0pt%
      \lineskiplimit\maxdimen%
      \hbox{%
        #1%
      }%
      \null%
    }%
  }%
}

\begin{document}
\topalign{\tachar{N}\tachar{\d{o}}}
\end{document}

输出

采用这种方法,您不必知道哪个字符最大。

相关内容