汉字旁注音/注音符号音调标记的新命令

汉字旁注音/注音符号音调标记的新命令

我想将注音放在一行文本中放大的字符旁边。我将其抽象为以下内容(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 进行编译。使用的字体可以找到这里

输出

相关内容