我想将注音放在一行文本中放大的字符旁边。我将其抽象为以下内容(X 代表汉字,A/AB/ABC 代表注音):
\documentclass{article}
\usepackage{tabularx}
\usepackage{graphicx}
\begin{document}
\renewcommand{\arraystretch}{0.5}
lorem ipsum \raisebox{-2mm}{\Huge X}
\hspace{-2mm}\scalebox{0.8}{
\begin{tabularx}{1em}{@{}l@{}}
\textit{A}\\ \textit{B}\\ \textit{C}
\end{tabularx}}
dolor sit \raisebox{-2mm}{\Huge X}
\hspace{-2mm}\scalebox{0.8}{
\begin{tabularx}{1em}{@{}l@{}}
\textit{A}\\
\end{tabularx}}
amet \raisebox{-2mm}{\Huge X}
\hspace{-2mm}\scalebox{0.8}{
\begin{tabularx}{1em}{@{}l@{}}
\textit{A}\\ \textit{B}
\end{tabularx}}
\end{document}
我想要实现的是替换这个:
\hspace{-2mm}\scalebox{0.8}{
\begin{tabularx}{1em}{@{}l@{}}
\textit{A}\\ \textit{B}\\ \textit{C}
\end{tabularx}}
这样:
\zhuyin{ABC}
值得注意的是,注音的长度永远是 1、2 或 3 个字符,我希望有一个可以处理的单一命令,\zhuyin{A}
而\zhuyin{AB}
不是根据字符长度是 1、2 还是 3 个而使用 3 个单独的命令。
它基本上归结为“如何根据参数的长度将 1 到 3 个字符的参数分成{1st char}
或{1st char}\\{2nd char}
或”。{1st char}\\{2nd char}\\{3rd char}
将其视为三个(或两个或一个)单独的参数是行不通的,因为据我所知,LaTeX 命令不能像许多编程语言中的函数那样被重载。
提前感谢您的想法!我真的很感激这个社区!
答案1
像这样吗?
如果字符右侧的列向量中的符号\Huge
太小,不符合您的口味,请随意替换\tiny
为\scriptsize
。
\documentclass{article}
\usepackage{array}
\newcommand\zhuyin[2]{\begingroup % localize scope of next instruction
\renewcommand{\arraystretch}{0.55}%
\begin{tabular}{@{}>{\Huge}l@{}} #1 \end{tabular}%
\begin{tabular}{@{}>{\tiny\itshape}l@{}} #2 \end{tabular}%
\endgroup}
\begin{document}
lorem ipsum \zhuyin{X}{A \\ B \\ C} dolor sit \zhuyin{X}{A} amet \zhuyin{X}{A \\ B}
\end{document}
答案2
您可以尝试激活 OpenType 竖写功能,但fontspec
实际上不支持竖写。它允许您选择 OpenTypevrt2
功能,理论上该功能可能会提供旋转的字形,并将它们放置在 中\rotatebox
。
但是,我测试的时候,下面的代码不能正常工作:
\documentclass{article}
\tracinglostchars=2
\usepackage[nil]{babel}
\usepackage{unicode-math}
\usepackage{graphicx}
\babelprovide[import=zh-hans, main]{chinese} % Or import=zh-hant for Traditional Chinese
\defaultfontfeatures{ Scale=MatchUppercase,
Ligatures=TeX,
Renderer=HarfBuzz }
\defaultfontfeatures[NotoSerifCJKsc]{
Ligatures={Common,Discretionary},
UprightFont = *-Regular ,
BoldFont = *-Bold ,
Extension = .otf}
\babelfont{rm}
[Scale=1.0]{Latin Modern Roman}
\babelfont[chinese]{rm}
{NotoSerifCJKsc}
\setmathfont{NewCMMath-Book}
\newcommand{\zhuyin}[1]{%
\rotatebox[origin=c]{-90}{%
\foreignlanguage{chinese}{%
\addfontfeature{Vertical={RotatedGlyphs,HalfMetrics,Kerning}}%
#1}}}
\begin{document}
瓶\zhuyin{ㄆㄧㄥ}子\zhuyin{ㄗ}
\end{document}
具体来说,尽管 Noto Serif CJK 支持垂直布局 OpenType 功能,但注音出现并以原始形式旋转,因此方向错误。如果您知道提供旋转 Unicode 的字体拼音符号,您可以尝试使用该字体来解决。
答案3
原来我刚刚找到了xstring
包使得它变得非常容易,所以除了 Mico 的答案之外,我还可以自己解决:
\documentclass{article}
\usepackage{tabularx}
\usepackage{graphicx}
\usepackage{xstring}
\renewcommand{\arraystretch}{0.5}
\newcommand{\zhuyin}[1]{%
\StrLen{#1}[\length]%
\hspace{-0.8mm}\scalebox{0.8}{
\begin{tabularx}{1em}{@{}>{\itshape}l@{}}
\ifnum\length=1
\StrChar{#1}{1}
\else
\ifnum\length=2
\StrChar{#1}{1}\\
\StrChar{#1}{2}
\else
\StrChar{#1}{1}\\
\StrChar{#1}{2}\\
\StrChar{#1}{3}
\fi
\fi
\end{tabularx}}
}
\begin{document}
lorem ipsum \raisebox{-2mm}{\Huge X}\zhuyin{ABC}
dolor sit \raisebox{-2mm}{\Huge X}\zhuyin{A}
amet \raisebox{-2mm}{\Huge X}\zhuyin{AB}
\end{document}
编辑:
@Mico:完全正确,tabular
完全足够,不需要tabularx
。我还为音调标记添加了另一个可选参数。结果如下:
\documentclass{article}
\usepackage{fontspec} % for Kaiti and Ming (Song)
\usepackage{graphicx} % for scalebox
\usepackage{xstring} % for string slicing in \zhuyin command
\newfontfamily\kaitiTW{TW-Kai-98_1.ttf}
\newcommand{\trad}[1]{{\kaitiTW \large #1}}
\newcommand{\zhuyin}[2][]{%
\smash{
\StrLen{#2}[\length]%
\hspace{-3mm}
\parbox[c][][c]{3mm}{%
\scalebox{0.45}{%
\renewcommand{\arraystretch}{0.8}
\begin{tabular}{@{}>{\kaitiTW}l@{}}
\ifnum\length=1
\StrChar{#2}{1}%
\else
\ifnum\length=2
\StrChar{#2}{1}\\
\StrChar{#2}{2}%
\else
\StrChar{#2}{1}\\
\StrChar{#2}{2}\\
\StrChar{#2}{3}%
\fi
\fi
\hspace{-0.7em} \smash{\raisebox{0.7em}{\scalebox{0.6}{\kaitiTW #1}}}
\end{tabular}}}}
\hspace{-2mm}
}
\begin{document}
\trad{黑}\zhuyin{ㄏㄟ}\textit{hēi},
\trad{狂}\zhuyin[ˊ]{ㄎㄨㄤ}\textit{kuáng},
\trad{短}\zhuyin[ˇ]{ㄉㄨㄢ}\textit{duǎn},
\trad{鬱}\zhuyin[ˋ]{ㄩ}\textit{yǜ}
\end{document}
显然必须使用 XeLaTeX 进行编译。使用的字体可以找到这里。