我想在中文字符上显示拼音(罗马化形式)。但是,我知道的两种方法(使用stackrel
或tabular
两者)会改变字符之间的间距。这说明了问题:
\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}%
}%
}