在汉字上显示拼音,不影响字间距

在汉字上显示拼音,不影响字间距

我想在中文字符上显示拼音(罗马化形式)。但是,我知道的两种方法(使用stackreltabular两者)会改变字符之间的间距。这说明了问题:

\documentclass[a5paper]{article}
\usepackage{ctexcap}
\usepackage{stackrel}
\setCJKmainfont{Adobe Heiti Std}
\newcommand{\mymacroone}[1]{$\stackrel{a}{\textrm{#1}}$}
\newcommand{\mymacrotwo}[1]{\begin{tabular}{l}a\\#1\end{tabular}}
\begin{document}
    \Huge \noindent 床前明月光,疑是地上霜。举头望明月,低头思故乡。 \\
    \mymacroone{床}\mymacroone{前}\mymacroone{明}\mymacroone{月}\mymacroone{光},\mymacroone{疑}\mymacroone{是}\mymacroone{地}\mymacroone{上}\mymacroone{霜}。\mymacroone{举}\mymacroone{头}\mymacroone{望}\mymacroone{明}\mymacroone{月},\mymacroone{低}\mymacroone{头}\mymacroone{思}\mymacroone{故}\mymacroone{乡}。 \\
    \mymacrotwo{床}\mymacrotwo{前}\mymacrotwo{明}\mymacrotwo{月}\mymacrotwo{光},\mymacrotwo{疑}\mymacrotwo{是}\mymacrotwo{地}\mymacrotwo{上}\mymacrotwo{霜}。\mymacrotwo{举}\mymacrotwo{头}\mymacrotwo{望}\mymacrotwo{明}\mymacrotwo{月},\mymacrotwo{低}\mymacrotwo{头}\mymacrotwo{思}\mymacrotwo{故}\mymacrotwo{乡}。 \\
\end{document}

三行应当分别显示相同的内容。

  • 使用 时stackrel,单词间距太近。这个问题不是由 造成的stackrel。这是因为里面有 的数学模式textrm{}
  • 使用 时tabular,单词间距太大,行末无法正确换行,并且存在奇怪的垂直和水平对齐问题。使用stackrel会比较理想。

如何将拼音放在汉字上方而不改变字符之间的间距(至少在拼音短于字符的情况下)?

答案1

现在我使用李青的答案添加另一个答案xpinyin包裹。

它使用起来相当容易:

\documentclass{ctexart}

\usepackage{xpinyin}

\begin{document}
\Huge\sffamily

\begin{pinyinscope}
床前明月光,疑是地上霜。举头望明月,低头思故乡。
\end{pinyinscope}

\xpinyin*{床前明月光,疑是地上霜。举头望明月,低头思故乡。}

\end{document}

在此处输入图片描述

答案2

我认为这个ruby包(来自CJK包束)在这里会很有用:

\documentclass[a5paper]{article}
\usepackage{ctexcap}

\usepackage{ruby}
% Sets size of the `ruby' i.e. pinyin annotation; default is 0.4
\renewcommand\rubysize{0.3}

\setCJKmainfont{Adobe Heiti Std}
\setmainfont{Arial}
\begin{document}
    \Huge \noindent 床前明月光,疑是地上霜。举头望明月,低头思故乡。 \\    
\noindent\ruby{床}{chuáng}\ruby{前}{qián}\ruby{明}{míng}\ruby{月}{yuè}\ruby{光}{guāng},\ruby{疑}{yí}\ruby{是}{shì}\ruby{地}{dì}\ruby{上}{shàng}\ruby{霜}{shuāng}。
\ruby{举}{jǔ}\ruby{头}{tóu}\ruby{望}{wàng}\ruby{明}{míng}\ruby{月}{yuè},\ruby{低}{dī}\ruby{头}{tóu}\ruby{思}{sī}\ruby{故}{gù}\ruby{乡}{xiāng}。
\end{document}

输出:

拼音注解为红宝石

答案3

正如 LianTze Lim 指出的那样,ruby捆绑包中的包装CJK专为日本人设计红字以及汉语拼音或注音。但是,它有一些限制。

您可以\CJKglue在 的定义末尾添加\ruby,不仅可以确保汉字之间的间距合适,还可以确保换行正确。例如,

\documentclass{ctexart}

\usepackage{ruby}
\let\oldruby\ruby
\def\ruby#1#2{\oldruby{#1}{#2}\CJKglue}
\renewcommand\rubysize{0.3}

\begin{document}
\parindent=0pt
\Huge\sffamily

床前明月光,疑是地上霜。举头望明月,低头思故乡。 

\ruby{床}{chuáng}\ruby{前}{qián}\ruby{明}{míng}\ruby{月}{yuè}\ruby{光}{guāng},%
\ruby{疑}{yí}\ruby{是}{shì}\ruby{地}{dì}\ruby{上}{shàng}\ruby{霜}{shuāng}。%
\ruby{举}{jǔ}\ruby{头}{tóu}\ruby{望}{wàng}\ruby{明}{míng}\ruby{月}{yuè},%
\ruby{低}{dī}\ruby{头}{tóu}\ruby{思}{sī}\ruby{故}{gù}\ruby{乡}{xiāng}。
\end{document}

在此处输入图片描述

但是结果有时还是会出错:现在标点符号前可以换行了。当然那时我们没有标点间距转换功能。

虽然现在处理所有可能的情况相当困难,但如果我们使用一些 TeX 技巧(例如\futurelet),甚至侵入,我们就可以做更多xeCJK。至少我们可以防止标点符号前的换行:

\documentclass{ctexart}

\usepackage{ruby}
\renewcommand\rubysize{0.3}
\let\oldruby\ruby
\def\ruby#1#2{\oldruby{#1}{#2}\futurelet\next\addCJKglue}
\def\addCJKglue{\ifx\next\ruby \CJKglue \fi}

\begin{document}

\Huge\sffamily

床前明月光,疑是地上霜。

\ruby{床}{chuáng}\ruby{前}{qián}\ruby{明}{míng}\ruby{月}{yuè}\ruby{光}{guāng},%
\ruby{疑}{yí}\ruby{是}{shì}\ruby{地}{dì}\ruby{上}{shàng}\ruby{霜}{shuāng}。%

% Compare with old solution:
\def\ruby#1#2{\oldruby{#1}{#2}\CJKglue}
\ruby{床}{chuáng}\ruby{前}{qián}\ruby{明}{míng}\ruby{月}{yuè}\ruby{光}{guāng},%
\ruby{疑}{yí}\ruby{是}{shì}\ruby{地}{dì}\ruby{上}{shàng}\ruby{霜}{shuāng}。%

\end{document}

在此处输入图片描述

答案4

我会采用低级别的构造:

\newcommand{\mymacroone}[1]{%
  \leavevmode
  \vbox{\offinterlineskip
        \halign{\hfil##\hfil\cr
        a\cr
        \noalign{\vskip-0.3ex}%
        \strut#1\cr}%
       }%
}

在此处输入图片描述

相关内容