包含 CJK 字符的词汇表

包含 CJK 字符的词汇表

我正在尝试为我的文档中先前使用过的特定单词创建一本日语到英语的词典。

我使用词汇表包成功创建了英语到日语的版本,现在我想换一种方式。问题是,我无法在“名称”字段中输入日语字符,只能在“描述”字段中输入。如果可能的话,我想把它们放在名称字段中。

那是\newglossaryentry{aaa}{type=JtoE,name={},description={\begin{CJK}{UTF8}{min}あ\end{CJK}}}有效的,但是\newglossaryentry{aaa}{type=JtoE,name={\begin{CJK}{UTF8}{min}あ\end{CJK}}},description={a}不是有效的。

类似问题似乎有解决方案这里,但它在我的情况下不起作用;我在整个文档中都使用了 CJKutf8 包来处理日语字符,而且我不想回去彻底更改它。

当然,我希望名字中能够同时使用假名和汉字。

这是一个最小的工作示例。

\documentclass{article}


\usepackage{CJKutf8}
\usepackage[overlap, CJK]{ruby}
\renewcommand{\rubysep}{0.01ex}
\usepackage[nopostdot,nonumberlist]{glossaries}
\usepackage{glossary-mcols}
\setglossarystyle{mcolindex}

\newglossary*{EtoJ}{English to Japanese}
\newglossary*{JtoE}{Japanese to English}

\makenoidxglossaries

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%% English to Japanese Gloss %%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\newglossaryentry{squareroot}
{
type=EtoJ,
name={squareroot},
description={\begin{CJK}{UTF8}{min}ルート\end{CJK}}%
}

\newglossaryentry{monomial}
{
type=EtoJ,
name={monomial},
description={\begin{CJK}{UTF8}{min}\ruby{単}{たん}\ruby{項}{こう}\ruby{式}{し
き}\end{CJK}}%
}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%% Japanese to English Gloss %%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\newglossaryentry{aaa}
{
type=JtoE,
name={},
description={\begin{CJK}{UTF8}{min}あ\end{CJK}}
}

\begin{document}
\glsaddall

\printnoidxglossary[type=EtoJ]
\newpage
\printnoidxglossary[type=JtoE]

%\printnoidxglossaries


\end{document}

答案1

\makenoidxglossaries仅针对 ASCII 而设计。(请参阅切换到 \makenoidxglossaries 时没有打印的词汇表。) 评论推荐了xindy,它是与包一起使用的三种索引方法中具有最佳多语言支持的方法glossaries,但仍然存在一些问题。

如果我们首先不设置索引:

\documentclass{article}

\usepackage{CJKutf8}
\usepackage{glossaries}

\newglossaryentry{squareroot}{name={\begin{CJK}{UTF8}{min}ルート\end{CJK}},
  description={square root}}

\begin{document}

\begin{CJK}{UTF8}{min}ルート\end{CJK}% for comparison

\gls{squareroot}

\end{document}

那么这将导致错误:

! Undefined control sequence.
\in@ #1#2->\begingroup \def \in@@ 
                                  ##1#1{}\toks@ \expandafter {\in@@ #2{}{}#1...

如果此错误发生在 中,\newglossaryentry则问题通常是扩展问题。可以使用 关闭。如果字段需要格式化,\glsnoexpandfields最好使用一个只接受一个参数的包装器命令。该值是从 中复制的,并且 部分将干扰整理器。namesortname\begin{CJK}{UTF8}{min}

修改后的版本如下:

\documentclass{article}

\usepackage{CJKutf8}
\usepackage{glossaries}

\newrobustcmd{\cjkname}[1]{\begin{CJK}{UTF8}{min}#1\end{CJK}}
\glsnoexpandfields

\newglossaryentry{squareroot}{name={\cjkname{ルート}},
  description={square root}}

\begin{document}

\begin{CJK}{UTF8}{min}ルート\end{CJK}

\gls{squareroot}

\end{document}

现在可以编译并生成:

ルート ルート

下一步是添加代码来生成索引。 的目录列表xindy显示modules/lang

albanian    finnish    icelandic      mongolian   spanish
belarusian  french     italian        norwegian   swedish
bulgarian   general    klingon        persian     turkish
croatian    georgian   korean         polish      ukrainian
czech       german     kurdish        portuguese  upper-sorbian
danish      greek      latin          romanian    vietnamese
dutch       gypsy      latvian        russian
english     hausa      lithuanian     serbian
esperanto   hebrew     lower-sorbian  slovak
estonian    hungarian  macedonian     slovenian

所以似乎不支持日语。最接近的是韩语。数字组需要关闭,因为它是为拉丁字母设计的:

\documentclass{article}

\usepackage{CJKutf8}
\usepackage[xindy={language={korean},glsnumbers=false}]{glossaries}

\makeglossaries

\newrobustcmd{\cjkname}[1]{\begin{CJK}{UTF8}{min}#1\end{CJK}}
\glsnoexpandfields

\newglossaryentry{squareroot}{name={\cjkname{ルート}},
  description={square root}}

\begin{document}

\begin{CJK}{UTF8}{min}ルート\end{CJK}

\gls{squareroot}

\printglossaries
\end{document}

如果该文件名为test.tex,则构建过程为:

pdflatex test
makeglossaries test
pdflatex test

makeglossaries-lite(对于没有安装 Perl 的用户,还有一个 Lua 版本,但由于xindy它也是一个 Perl 脚本,所以无论如何你都需要 Perl 解释器。)

或者你可以明确运行xindy

pdflatex test
xindy -L korean -C utf8 -I xindy -M test -t test.glg -o test.gls test.glo
pdflatex test

生成的文档如下所示:

文件图像

创建的文件xindy包含用于显示词汇表的代码:

\begin{theglossary}\glossaryheader
\glsgroupheading{default}\relax\glsresetentrylist
\glossentry{squareroot}{\glossaryentrynumbers{\relax
\glsXpageXglsnumberformat{}{1}}}%
\end{theglossary}\glossarypostamble

\glsgroupheading{default}部分显示xindy无法识别日文字符,并将条目放入默认字母组中。这意味着您无法使用任何字母组样式,例如indexgroup。它也可能表明它没有可以正确对ルート进行排序的规则。

还有第四个索引选项,那就是使用bib2gls需要扩展包glossaries-extra使用record选项。bib2gls是一个命令行应用程序(至少需要 Java 7)¹,可用于对条目进行排序和整理。此方法要求所有条目都在一个.bib文件中定义。例如,假设调用的文件testcjk.bib包含:

@entry{squareroot,
  name={\cjkname{ルート}},
  description={square root}
}

那么文档现在看起来像这样:

\documentclass{article}

\usepackage{CJKutf8}

\usepackage[record]{glossaries-extra}

\newrobustcmd{\cjkname}[1]{\begin{CJK}{UTF8}{min}#1\end{CJK}}
\glsnoexpandfields

\GlsXtrLoadResources[
  src=testcjk,% bib file
  sort={ja-JP}% locale
]

\begin{document}

\begin{CJK}{UTF8}{min}ルート\end{CJK}

\gls{squareroot}

\printunsrtglossaries
\end{document}

构建过程现在是:

pdflatex test
bib2gls test
pdflatex test

得出的结果为:

文件图像

如果您想要字母组,您需要使用开关--group

pdflatex test
bib2gls --group test
pdflatex test

以及设置支持字母组(如indexgroup)的词汇表样式。使用此--group开关,此示例将bib2gls以下代码写入由加载的文件中\GlsXtrLoadResources

\bibglssetlettergrouptitle{{ルー}{ルー}{9568256}{}}

这意味着bib2gls认为“ルート”属于“ルー”字母组。我不懂日语,所以我不知道这是否正确,但组标题需要封装在环境中CJK。扩展也是一个问题,因为日语字符在 中是有效的CJKutf8。以下是修改后的示例:

\documentclass{article}

\usepackage{CJKutf8}
\usepackage[record,style=indexgroup]{glossaries-extra}

\newrobustcmd{\cjkname}[1]{\begin{CJK}{UTF8}{min}#1\end{CJK}}
\glsnoexpandfields

\newcommand{\bibglslettergrouptitle}[4]{\unexpanded{\cjkname{#1}}}

\GlsXtrLoadResources[
  src=testcjk,% bib file
  sort={ja-JP}% locale
]

\begin{document}

\begin{CJK}{UTF8}{min}ルート\end{CJK}

\gls{squareroot}

\printunsrtglossaries
\end{document}

构建过程现在是:

pdflatex test
bib2gls --group test
pdflatex test

生成的文档如下所示:

ルート ルート 词汇表 ルー ルート 平方根 1

对于英语到日语的词汇表,如果直接交换namedescription您可以将.bib文件更改为

@dualentry{squareroot,
  name={\cjkname{ルート}},
  description={square root}
}

字母组标题仅应针对词汇表类型进行封装。这可以通过检查词汇表类型japanese来处理:\bibglslettergrouptitle

\newcommand*{\englishlettergroup}[1]{#1}% heading used for `type=english`
\newcommand*{\japaneselettergroup}[1]{\cjkname{#1}}% heading used for `type=japanese`

\newcommand{\bibglslettergrouptitle}[4]{% #4 = type
 \unexpanded{\csuse{#4lettergroup}{#1}}}

该文档文件现在是:

\documentclass{article}

\usepackage{CJKutf8}
\usepackage[record,style=indexgroup,nomain]{glossaries-extra}

\newglossary*{japanese}{Japanese to English}
\newglossary*{english}{English to Japanese}

\newrobustcmd{\cjkname}[1]{\begin{CJK}{UTF8}{min}#1\end{CJK}}
\glsnoexpandfields

\newcommand*{\englishlettergroup}[1]{#1}
\newcommand*{\japaneselettergroup}[1]{\cjkname{#1}}
\newcommand*{\bibglslettergrouptitle}[4]{\unexpanded{\csuse{#4lettergroup}{#1}}}

\GlsXtrLoadResources[
  src=testcjk,% bib file
  sort={ja-JP},% locale used to sort primary entries
  dual-sort={en-GB},% locale used to sort secondary entries
  type=japanese,% put the primary entries in the 'japanese' glossary
  dual-type=english% put the dual entries in the 'english' glossary
]

\begin{document}

Japanese: \gls{squareroot}

English: \gls{dual.squareroot}

\printunsrtglossaries
\end{document}

(您可以只使用语言代码,而不使用地区:sort=ja,dual-sort=en。)

得出的结果为:

文件图像

如果需要,您可以更改默认双前缀dual.。例如:

\documentclass{article}

\usepackage{CJKutf8}
\usepackage[record,style=indexgroup,nomain]{glossaries-extra}

\newglossary*{japanese}{Japanese to English}
\newglossary*{english}{English to Japanese}

\newrobustcmd{\cjkname}[1]{\begin{CJK}{UTF8}{min}#1\end{CJK}}
\glsnoexpandfields

\newcommand*{\englishlettergroup}[1]{#1}
\newcommand*{\japaneselettergroup}[1]{\cjkname{#1}}
\newcommand*{\bibglslettergrouptitle}[4]{\unexpanded{\csuse{#4lettergroup}{#1}}}

\GlsXtrLoadResources[
  src=testcjk,% bib file
  sort={ja-JP},% locale used to sort primary entries
  dual-sort={en-GB},% locale used to sort secondary entries
  type=japanese,% put the primary entries in the 'japanese' glossary
  dual-type=english,% put the dual entries in the 'english' glossary
  dual-prefix={en.}
]

\begin{document}

Japanese: \gls{squareroot}

English: \gls{en.squareroot}

\printunsrtglossaries
\end{document}

\cjkname您可以在文件中提供 的定义.bib,但需要保护它不受bib2gls的解释器影响,以防止它干扰排序值。例如,如果文件defs-nointerpret.bib包含:

@preamble{"\providerobustcmd{\cjkname}[1]{\begin{CJK}{UTF8}{min}#1\end{CJK}}
\providecommand*{\englishlettergroup}[1]{#1}
\providecommand*{\japaneselettergroup}[1]{\cjkname{#1}}
\providecommand*{\bibglslettergrouptitle}[4]{\unexpanded{\csuse{#4lettergroup}{#1}}}"}

那么文件现在是:

\documentclass{article}

\usepackage{CJKutf8}
\usepackage[record,style=indexgroup,nomain]{glossaries-extra}

\newglossary*{japanese}{Japanese to English}
\newglossary*{english}{English to Japanese}

\glsnoexpandfields

\GlsXtrLoadResources[
   src={defs-nointerpret}, % bib file containing @preamble
   interpret-preamble=false % write the @preamble contents but don't try to interpret
]

\GlsXtrLoadResources[
  src=testcjk,% bib file
  sort={ja-JP},% locale used to sort primary entries
  dual-sort={en-GB},% locale used to sort secondary entries
  type=japanese,% put the primary entries in the 'japanese' glossary
  dual-type=english,% put the dual entries in the 'english' glossary
  dual-prefix={en.}
]

\begin{document}

Japanese: \gls{squareroot}

English: \gls{en.squareroot}

\printunsrtglossaries
\end{document}

这会隐藏词汇表条目使用但未在文档中明确使用的命令。字母组标题的更通用方法是:

\newcommand*{\englishlettergroup}[1]{#1}
\newcommand*{\japaneselettergroup}{\cjklettergroup}
\newcommand*{\cjklettergroup}[1]{\cjkname{#1}}

\newcommand{\bibglslettergrouptitle}[4]{%
 \unexpanded{%
   \ifcsdef{#4lettergroup}%
   {\csuse{#4lettergroup}{#1}}%
   {\cjklettergroup{#1}}%
 }%
}

这将使用\englishlettergroupif type=english\japaneselettergroupif type=japanese,并且只会使用\cjklettergroupiftype是其他内容(例如 default main)。因此该文件defs-nointerpret.bib现在包含:

@preamble{"\providerobustcmd{\cjkname}[1]{\begin{CJK}{UTF8}{min}#1\end{CJK}}
\providecommand*{\englishlettergroup}[1]{#1}
\providecommand*{\japaneselettergroup}{\cjklettergroup}
\providecommand*{\cjklettergroup}[1]{\cjkname{#1}}    
\providecommand{\bibglslettergrouptitle}[4]{%
 \unexpanded{%
   \ifcsdef{#4lettergroup}%
   {\csuse{#4lettergroup}{#1}}%
   {\cjklettergroup{#1}}%
 }%
}"}

附录:迭代命令(例如)\glsaddall不适用于该record选项,因为在第一次运行 LaTeX 时没有定义任何条目,因此没有要迭代的内容。如果您想选择所有条目,无论它们是否已在文档中使用,请使用selection=all

\GlsXtrLoadResources[
  src={testcjk},% bib file list
  selection=all,% select all entries provided in this 'src' list
  sort={ja-JP},% locale used to sort primary entries
  dual-sort={en-GB},% locale used to sort secondary entries
  type=japanese,% put the primary entries in the 'japanese' glossary
  dual-type=english,% put the dual entries in the 'english' glossary
  dual-prefix={en.}
]

请注意,\glsaddall内部使用\glsadd(始终将位置添加到位置列表)。这意味着nonumberlist必须使用,否则词汇表中的每个条目中的位置都会相同。bib2gls如果通过选择条目,则只有使用或selection=all等命令在文档中对其进行索引时,它才会具有位置列表。\gls\glsadd


¹ 请注意,Java 7 现已终止使用并被弃用。Java 8 包含对通用区域设置数据存储库 (CLDR) 的支持,该存储库可提供更广泛的区域设置支持。

相关内容