![如何结合cgloss4e、颜色和拼音?](https://linux22.com/image/376836/%E5%A6%82%E4%BD%95%E7%BB%93%E5%90%88cgloss4e%E3%80%81%E9%A2%9C%E8%89%B2%E5%92%8C%E6%8B%BC%E9%9F%B3%EF%BC%9F.png)
这是这个问题。
在这个新问题中,我希望能够将上一个问题中提供的颜色改变命令与第二行文本的自动拼音编码结合起来。
例子。
在这个例子中,第 (1) 部分显示了着色命令如何破坏第二行文本的自动拼音翻译,当不使用着色时,该翻译可以正常工作,如第 (2) 部分所示。第 (3) 部分显示了所需的输出。
\documentclass{report}
\usepackage{xcolor}
\usepackage{polyglossia}
\usepackage[AutoFallBack=true]{xeCJK}[2018/02/27]
\setCJKmainfont[FallBack=NotoSansCJKtc-Regular]{NotoSerifCJKtc-Regular}
% NOTE: download NotoSerifCJKtc-Regular font from here
% https://www.google.com/get/noto/help/cjk/
\usepackage{xpinyin}
\usepackage{gb4e}
\let\eachwordtwo=\pinyin
\makeatletter
\newcommand*\glosscolor[1]{\gdef\@glcolor{#1}}
\glosscolor{red}
\AtBeginDocument{\colorlet{savedcol}{.}}
\def\@glosscolor{savedcol}
\newcommand{\clt}{\gdef\@glosscolor{\@glcolor}\color{\@glosscolor}}
\newcommand{\clf}{\gdef\@glosscolor{savedcol}\color{\@glosscolor}}
\gdef\getwords(#1,#2)#3 #4\\% #1=linebox, #2=\each, #3=1st word, #4=remainder
{\setbox#1=\vbox{\hbox{#2{\strut\color{\@glosscolor}#3} }% adds space
\unvbox#1%
}%
\def\more{#4}%
\ifx\more\empty\let\more=\donewords
\else\let\more=\getwords
\fi
\more(#1,#2)#4\\%
}
\gdef\donewords(#1,#2)\\{\gdef\@glosscolor{savedcol}}
\makeatother
\begin{document}
Present Situation:
\begin{exe}
\ex \glll
我 \clt {没有} \clf {问题} \\
wo3 \clt {mei2 you3} \clf {wen4 ti2} \\
I \clt {don't have} \clf questions \\
\ex \glll
我 {没有} {问题} \\
wo3 {mei2 you3} {wen4 ti2} \\
I {don't have} questions \\
\end{exe}
Desired Output:
\begin{exe}
\ex \glll
我 \clt {没有} \clf {问题} \\
\pinyin{wo3} \clt \pinyin{mei2 you3} \clf \pinyin{wen4 ti2} \\
I \clt {don't have} \clf questions \\
\end{exe}
\end{document}
输出:
目标。
理想情况下,我希望保持两全其美:
- 能够使用
\clt
/更改文本颜色\clf
- 不必明确地写出来
\pinyin{}
(正如我在第 (3) 部分中所做的那样,它显示了所需的输出)
有没有办法将pinyin
第二行文本的自动编码结合起来,现在使用以下命令执行:
\let\eachwordtwo=\pinyin
使用新的\clt
/\clf
命令,以便它们不会互相破坏?
答案1
该xpinyin
命令\pinyin
似乎带有一个参数(文档全是中文,我看不懂)。由于我添加颜色代码的方式是cgloss4e
解析宏,因此无法使用该代码来区分您处于三行注释中的哪一行。
因此,最好的解决方案是使用单独的命令来打开拼音行的颜色。所以我刚刚添加了 \plt
和\plf
命令来执行此操作。在注释的第二行中使用它们。
或者,正如您所发现的,您可以保留原始命令,但删除拼音元素中的所有空格。这同样有效,因为该\pinyin
命令带有一个参数,并且我假设它会根据声调数字进行解析。
\documentclass{report}
\usepackage{xcolor}
\usepackage{polyglossia}
\usepackage[AutoFallBack=true]{xeCJK}[2018/02/27]
\setCJKmainfont[FallBack=SimSun-ExtB]{SimSun}
% NOTE: download SimSum font from here
% http://www.fontpalace.com/font-download/SimSun/
% and place it into ~/.fonts directory on linux
\usepackage{xpinyin}
\usepackage{gb4e}
\newif\ifpy
\renewcommand{\eachwordtwo}{\pytrue\pinyin}
\makeatletter
\newcommand*\glosscolor[1]{\gdef\@glcolor{#1}}
\glosscolor{red}
\AtBeginDocument{\colorlet{savedcol}{.}}
\def\@glosscolor{savedcol}
\newcommand{\clt}{\gdef\@glosscolor{\@glcolor}\color{\@glosscolor}}
\newcommand{\plt}{\gdef\@glosscolor{\@glcolor}\color{\@glosscolor}\eachwordtwo}
\newcommand{\clf}{\gdef\@glosscolor{savedcol}\color{\@glosscolor}}
\newcommand{\plf}{\gdef\@glosscolor{savedcol}\color{\@glosscolor}\eachwordtwo}
\gdef\getwords(#1,#2)#3 #4\\% #1=linebox, #2=\each, #3=1st word, #4=remainder
{\setbox#1=\vbox{\hbox{#2{\strut\color{\@glosscolor}#3} }% adds space
\unvbox#1%
}%
\def\more{#4}%
\ifx\more\empty\let\more=\donewords
\else\let\more=\getwords
\fi
\more(#1,#2)#4\\%
}
\gdef\donewords(#1,#2)\\{\gdef\@glosscolor{savedcol}}
\makeatother
\begin{document}
Present Situation:
\begin{exe} % works if you remove spaces from pinyin
\ex \glll
我 \clt {没有} \clf {问题} \\
wo3 \clt mei2you3 \clf wen4ti2 \\
I \clt {don't have} \clf questions \\
% alternatively use a separate command for the second line colouring
\ex \glll
我 \clt{没有} \clf{问题} \\
wo3 \plt{mei2 you3} \plf{wen4 ti2} \\
I \clt{don't have} \clf questions \\
\end{exe}
Desired Output:
\begin{exe}
\ex \glll
我 \clt {没有} \clf {问题} \\
\pinyin{wo3} \clt \pinyin{mei2 you3} \clf \pinyin{wen4 ti2} \\
I \clt {don't have} \clf questions \\
\end{exe}
\end{document}